βŒˆβŒ‹ βŽ‡ branch:  Bitrhythm


Check-in [12a9bb700d]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Import from git Added a changelog
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 12a9bb700d4b739db49e2fa58a18c1cfb05ac8fff948b509b44d785cfb8e1466
User & Date: dev 2021-08-11 18:56:04
Context
2021-10-12
03:29
Added cue Changed Support link Working example for p5 check-in: 414174737a user: dev tags: trunk
2021-08-11
18:56
Import from git Added a changelog check-in: 12a9bb700d user: dev tags: trunk
2021-08-05
10:59
initial empty check-in check-in: c81c94891b user: fossil tags: trunk
Changes

Added LICENSE-by-nc-sa.















































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
Copyright (C) 2021 Xyzzy Apps, <https://xyzzyapps.link/>

Attribution-NonCommercial-ShareAlike 4.0 International
=======================================================

Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.

Using Creative Commons Public Licenses

Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.

     Considerations for licensors: Our public licenses are
     intended for use by those authorized to give the public
     permission to use material in ways otherwise restricted by
     copyright and certain other rights. Our licenses are
     irrevocable. Licensors should read and understand the terms
     and conditions of the license they choose before applying it.
     Licensors should also secure all rights necessary before
     applying our licenses so that the public can reuse the
     material as expected. Licensors should clearly mark any
     material not subject to the license. This includes other CC-
     licensed material, or material used under an exception or
     limitation to copyright. More considerations for licensors:
    wiki.creativecommons.org/Considerations_for_licensors

     Considerations for the public: By using one of our public
     licenses, a licensor grants the public permission to use the
     licensed material under specified terms and conditions. If
     the licensor's permission is not necessary for any reason--for
     example, because of any applicable exception or limitation to
     copyright--then that use is not regulated by the license. Our
     licenses grant only permissions under copyright and certain
     other rights that a licensor has authority to grant. Use of
     the licensed material may still be restricted for other
     reasons, including because others have copyright or other
     rights in the material. A licensor may make special requests,
     such as asking that all changes be marked or described.
     Although not required by our licenses, you are encouraged to
     respect those requests where reasonable. More considerations
     for the public:
    wiki.creativecommons.org/Considerations_for_licensees

=======================================================================

Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
Public License

By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International Public License
("Public License"). To the extent this Public License may be
interpreted as a contract, You are granted the Licensed Rights in
consideration of Your acceptance of these terms and conditions, and the
Licensor grants You such rights in consideration of benefits the
Licensor receives from making the Licensed Material available under
these terms and conditions.


Section 1 -- Definitions.

  a. Adapted Material means material subject to Copyright and Similar
     Rights that is derived from or based upon the Licensed Material
     and in which the Licensed Material is translated, altered,
     arranged, transformed, or otherwise modified in a manner requiring
     permission under the Copyright and Similar Rights held by the
     Licensor. For purposes of this Public License, where the Licensed
     Material is a musical work, performance, or sound recording,
     Adapted Material is always produced where the Licensed Material is
     synched in timed relation with a moving image.

  b. Adapter's License means the license You apply to Your Copyright
     and Similar Rights in Your contributions to Adapted Material in
     accordance with the terms and conditions of this Public License.

  c. BY-NC-SA Compatible License means a license listed at
     creativecommons.org/compatiblelicenses, approved by Creative
     Commons as essentially the equivalent of this Public License.

  d. Copyright and Similar Rights means copyright and/or similar rights
     closely related to copyright including, without limitation,
     performance, broadcast, sound recording, and Sui Generis Database
     Rights, without regard to how the rights are labeled or
     categorized. For purposes of this Public License, the rights
     specified in Section 2(b)(1)-(2) are not Copyright and Similar
     Rights.

  e. Effective Technological Measures means those measures that, in the
     absence of proper authority, may not be circumvented under laws
     fulfilling obligations under Article 11 of the WIPO Copyright
     Treaty adopted on December 20, 1996, and/or similar international
     agreements.

  f. Exceptions and Limitations means fair use, fair dealing, and/or
     any other exception or limitation to Copyright and Similar Rights
     that applies to Your use of the Licensed Material.

  g. License Elements means the license attributes listed in the name
     of a Creative Commons Public License. The License Elements of this
     Public License are Attribution, NonCommercial, and ShareAlike.

  h. Licensed Material means the artistic or literary work, database,
     or other material to which the Licensor applied this Public
     License.

  i. Licensed Rights means the rights granted to You subject to the
     terms and conditions of this Public License, which are limited to
     all Copyright and Similar Rights that apply to Your use of the
     Licensed Material and that the Licensor has authority to license.

  j. Licensor means the individual(s) or entity(ies) granting rights
     under this Public License.

  k. NonCommercial means not primarily intended for or directed towards
     commercial advantage or monetary compensation. For purposes of
     this Public License, the exchange of the Licensed Material for
     other material subject to Copyright and Similar Rights by digital
     file-sharing or similar means is NonCommercial provided there is
     no payment of monetary compensation in connection with the
     exchange.

  l. Share means to provide material to the public by any means or
     process that requires permission under the Licensed Rights, such
     as reproduction, public display, public performance, distribution,
     dissemination, communication, or importation, and to make material
     available to the public including in ways that members of the
     public may access the material from a place and at a time
     individually chosen by them.

  m. Sui Generis Database Rights means rights other than copyright
     resulting from Directive 96/9/EC of the European Parliament and of
     the Council of 11 March 1996 on the legal protection of databases,
     as amended and/or succeeded, as well as other essentially
     equivalent rights anywhere in the world.

  n. You means the individual or entity exercising the Licensed Rights
     under this Public License. Your has a corresponding meaning.


Section 2 -- Scope.

  a. License grant.

       1. Subject to the terms and conditions of this Public License,
          the Licensor hereby grants You a worldwide, royalty-free,
          non-sublicensable, non-exclusive, irrevocable license to
          exercise the Licensed Rights in the Licensed Material to:

            a. reproduce and Share the Licensed Material, in whole or
               in part, for NonCommercial purposes only; and

            b. produce, reproduce, and Share Adapted Material for
               NonCommercial purposes only.

       2. Exceptions and Limitations. For the avoidance of doubt, where
          Exceptions and Limitations apply to Your use, this Public
          License does not apply, and You do not need to comply with
          its terms and conditions.

       3. Term. The term of this Public License is specified in Section
          6(a).

       4. Media and formats; technical modifications allowed. The
          Licensor authorizes You to exercise the Licensed Rights in
          all media and formats whether now known or hereafter created,
          and to make technical modifications necessary to do so. The
          Licensor waives and/or agrees not to assert any right or
          authority to forbid You from making technical modifications
          necessary to exercise the Licensed Rights, including
          technical modifications necessary to circumvent Effective
          Technological Measures. For purposes of this Public License,
          simply making modifications authorized by this Section 2(a)
          (4) never produces Adapted Material.

       5. Downstream recipients.

            a. Offer from the Licensor -- Licensed Material. Every
               recipient of the Licensed Material automatically
               receives an offer from the Licensor to exercise the
               Licensed Rights under the terms and conditions of this
               Public License.

            b. Additional offer from the Licensor -- Adapted Material.
               Every recipient of Adapted Material from You
               automatically receives an offer from the Licensor to
               exercise the Licensed Rights in the Adapted Material
               under the conditions of the Adapter's License You apply.

            c. No downstream restrictions. You may not offer or impose
               any additional or different terms or conditions on, or
               apply any Effective Technological Measures to, the
               Licensed Material if doing so restricts exercise of the
               Licensed Rights by any recipient of the Licensed
               Material.

       6. No endorsement. Nothing in this Public License constitutes or
          may be construed as permission to assert or imply that You
          are, or that Your use of the Licensed Material is, connected
          with, or sponsored, endorsed, or granted official status by,
          the Licensor or others designated to receive attribution as
          provided in Section 3(a)(1)(A)(i).

  b. Other rights.

       1. Moral rights, such as the right of integrity, are not
          licensed under this Public License, nor are publicity,
          privacy, and/or other similar personality rights; however, to
          the extent possible, the Licensor waives and/or agrees not to
          assert any such rights held by the Licensor to the limited
          extent necessary to allow You to exercise the Licensed
          Rights, but not otherwise.

       2. Patent and trademark rights are not licensed under this
          Public License.

       3. To the extent possible, the Licensor waives any right to
          collect royalties from You for the exercise of the Licensed
          Rights, whether directly or through a collecting society
          under any voluntary or waivable statutory or compulsory
          licensing scheme. In all other cases the Licensor expressly
          reserves any right to collect such royalties, including when
          the Licensed Material is used other than for NonCommercial
          purposes.


Section 3 -- License Conditions.

Your exercise of the Licensed Rights is expressly made subject to the
following conditions.

  a. Attribution.

       1. If You Share the Licensed Material (including in modified
          form), You must:

            a. retain the following if it is supplied by the Licensor
               with the Licensed Material:

                 i. identification of the creator(s) of the Licensed
                    Material and any others designated to receive
                    attribution, in any reasonable manner requested by
                    the Licensor (including by pseudonym if
                    designated);

                ii. a copyright notice;

               iii. a notice that refers to this Public License;

                iv. a notice that refers to the disclaimer of
                    warranties;

                 v. a URI or hyperlink to the Licensed Material to the
                    extent reasonably practicable;

            b. indicate if You modified the Licensed Material and
               retain an indication of any previous modifications; and

            c. indicate the Licensed Material is licensed under this
               Public License, and include the text of, or the URI or
               hyperlink to, this Public License.

       2. You may satisfy the conditions in Section 3(a)(1) in any
          reasonable manner based on the medium, means, and context in
          which You Share the Licensed Material. For example, it may be
          reasonable to satisfy the conditions by providing a URI or
          hyperlink to a resource that includes the required
          information.
       3. If requested by the Licensor, You must remove any of the
          information required by Section 3(a)(1)(A) to the extent
          reasonably practicable.

  b. ShareAlike.

     In addition to the conditions in Section 3(a), if You Share
     Adapted Material You produce, the following conditions also apply.

       1. The Adapter's License You apply must be a Creative Commons
          license with the same License Elements, this version or
          later, or a BY-NC-SA Compatible License.

       2. You must include the text of, or the URI or hyperlink to, the
          Adapter's License You apply. You may satisfy this condition
          in any reasonable manner based on the medium, means, and
          context in which You Share Adapted Material.

       3. You may not offer or impose any additional or different terms
          or conditions on, or apply any Effective Technological
          Measures to, Adapted Material that restrict exercise of the
          rights granted under the Adapter's License You apply.


Section 4 -- Sui Generis Database Rights.

Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:

  a. for the avoidance of doubt, Section 2(a)(1) grants You the right
     to extract, reuse, reproduce, and Share all or a substantial
     portion of the contents of the database for NonCommercial purposes
     only;

  b. if You include all or a substantial portion of the database
     contents in a database in which You have Sui Generis Database
     Rights, then the database in which You have Sui Generis Database
     Rights (but not its individual contents) is Adapted Material,
     including for purposes of Section 3(b); and

  c. You must comply with the conditions in Section 3(a) if You Share
     all or a substantial portion of the contents of the database.

For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.


Section 5 -- Disclaimer of Warranties and Limitation of Liability.

  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.

  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.

  c. The disclaimer of warranties and limitation of liability provided
     above shall be interpreted in a manner that, to the extent
     possible, most closely approximates an absolute disclaimer and
     waiver of all liability.


Section 6 -- Term and Termination.

  a. This Public License applies for the term of the Copyright and
     Similar Rights licensed here. However, if You fail to comply with
     this Public License, then Your rights under this Public License
     terminate automatically.

  b. Where Your right to use the Licensed Material has terminated under
     Section 6(a), it reinstates:

       1. automatically as of the date the violation is cured, provided
          it is cured within 30 days of Your discovery of the
          violation; or

       2. upon express reinstatement by the Licensor.

     For the avoidance of doubt, this Section 6(b) does not affect any
     right the Licensor may have to seek remedies for Your violations
     of this Public License.

  c. For the avoidance of doubt, the Licensor may also offer the
     Licensed Material under separate terms or conditions or stop
     distributing the Licensed Material at any time; however, doing so
     will not terminate this Public License.

  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
     License.


Section 7 -- Other Terms and Conditions.

  a. The Licensor shall not be bound by any additional or different
     terms or conditions communicated by You unless expressly agreed.

  b. Any arrangements, understandings, or agreements regarding the
     Licensed Material not stated herein are separate from and
     independent of the terms and conditions of this Public License.


Section 8 -- Interpretation.

  a. For the avoidance of doubt, this Public License does not, and
     shall not be interpreted to, reduce, limit, restrict, or impose
     conditions on any use of the Licensed Material that could lawfully
     be made without permission under this Public License.

  b. To the extent possible, if any provision of this Public License is
     deemed unenforceable, it shall be automatically reformed to the
     minimum extent necessary to make it enforceable. If the provision
     cannot be reformed, it shall be severed from this Public License
     without affecting the enforceability of the remaining terms and
     conditions.

  c. No term or condition of this Public License will be waived and no
     failure to comply consented to unless expressly agreed to by the
     Licensor.

  d. Nothing in this Public License constitutes or may be interpreted
     as a limitation upon, or waiver of, any privileges and immunities
     that apply to the Licensor or You, including from the legal
     processes of any jurisdiction or authority.

=======================================================================

Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the β€œLicensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.

Creative Commons may be contacted at creativecommons.org.

Added Makefile.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS    ?=
SPHINXBUILD   ?= sphinx-build
SOURCEDIR     = source
BUILDDIR      = build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

Added bitrhythm.hy.

















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

(import [sanic [Sanic response]])
(import [sanic.response [json text]])
(import [sanic.exceptions [NotFound abort]])
(import [jinja2 [Environment FileSystemLoader]])
(import re)
(import ipdb)
(import sys)
(import traceback)
(import json)
(import datetime)
(import [email.utils [format_datetime]])
(import [urllib.parse [urlparse]])
(import base64)

(setv file-loader (FileSystemLoader "templates"))
(setv env (Environment :loader file-loader))

(setv app (Sanic "Bitrhythm"))

(with-decorator
  (app.exception NotFound)
  (defn/a ignore_404s [request exception]
    (return (text (+ "Yep, I totally found the page " request.url)))
  )
)

(with-decorator
  (app.route "/song/<name>")
  (defn/a get-index [request name]
    (setv template (env.get_template "index.html"))
    (return (response.html (template.render {"data" name})))
  )
)

(with-decorator
  (app.route "/")
  (defn/a get-index [request]
    (setv template (env.get_template "index.html"))
    (return (response.html (template.render {"data" ""})))
  )
)

(with-decorator
  (app.route "/issue")
  (defn/a get-index [request]
    (setv template (env.get_template "page.html"))
    (return (response.html (template.render)))
  )
)

(app.static "/" "./public")

(defmain [&rest args]
    (app.run :host "0.0.0.0" :port 8015)
)

Added build/html/_static/analytics.js.







>
>
>
1
2
3
window.goatcounter = {
    path: function(p) { return location.host + p }
}

Added build/html/_static/basic.css.



























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
/*
 * basic.css
 * ~~~~~~~~~
 *
 * Sphinx stylesheet -- basic theme.
 *
 * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
 * :license: BSD, see LICENSE for details.
 *
 */

/* -- main layout ----------------------------------------------------------- */

div.clearer {
    clear: both;
}

div.section::after {
    display: block;
    content: '';
    clear: left;
}

/* -- relbar ---------------------------------------------------------------- */

div.related {
    width: 100%;
    font-size: 90%;
}

div.related h3 {
    display: none;
}

div.related ul {
    margin: 0;
    padding: 0 0 0 10px;
    list-style: none;
}

div.related li {
    display: inline;
}

div.related li.right {
    float: right;
    margin-right: 5px;
}

/* -- sidebar --------------------------------------------------------------- */

div.sphinxsidebarwrapper {
    padding: 10px 5px 0 10px;
}

div.sphinxsidebar {
    float: left;
    width: 270px;
    margin-left: -100%;
    font-size: 90%;
    word-wrap: break-word;
    overflow-wrap : break-word;
}

div.sphinxsidebar ul {
    list-style: none;
}

div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
    margin-left: 20px;
    list-style: square;
}

div.sphinxsidebar ul ul {
    margin-top: 0;
    margin-bottom: 0;
}

div.sphinxsidebar form {
    margin-top: 10px;
}

div.sphinxsidebar input {
    border: 1px solid #98dbcc;
    font-family: sans-serif;
    font-size: 1em;
}

div.sphinxsidebar #searchbox form.search {
    overflow: hidden;
}

div.sphinxsidebar #searchbox input[type="text"] {
    float: left;
    width: 80%;
    padding: 0.25em;
    box-sizing: border-box;
}

div.sphinxsidebar #searchbox input[type="submit"] {
    float: left;
    width: 20%;
    border-left: none;
    padding: 0.25em;
    box-sizing: border-box;
}


img {
    border: 0;
    max-width: 100%;
}

/* -- search page ----------------------------------------------------------- */

ul.search {
    margin: 10px 0 0 20px;
    padding: 0;
}

ul.search li {
    padding: 5px 0 5px 20px;
    background-image: url(file.png);
    background-repeat: no-repeat;
    background-position: 0 7px;
}

ul.search li a {
    font-weight: bold;
}

ul.search li div.context {
    color: #888;
    margin: 2px 0 0 30px;
    text-align: left;
}

ul.keywordmatches li.goodmatch a {
    font-weight: bold;
}

/* -- index page ------------------------------------------------------------ */

table.contentstable {
    width: 90%;
    margin-left: auto;
    margin-right: auto;
}

table.contentstable p.biglink {
    line-height: 150%;
}

a.biglink {
    font-size: 1.3em;
}

span.linkdescr {
    font-style: italic;
    padding-top: 5px;
    font-size: 90%;
}

/* -- general index --------------------------------------------------------- */

table.indextable {
    width: 100%;
}

table.indextable td {
    text-align: left;
    vertical-align: top;
}

table.indextable ul {
    margin-top: 0;
    margin-bottom: 0;
    list-style-type: none;
}

table.indextable > tbody > tr > td > ul {
    padding-left: 0em;
}

table.indextable tr.pcap {
    height: 10px;
}

table.indextable tr.cap {
    margin-top: 10px;
    background-color: #f2f2f2;
}

img.toggler {
    margin-right: 3px;
    margin-top: 3px;
    cursor: pointer;
}

div.modindex-jumpbox {
    border-top: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
    margin: 1em 0 1em 0;
    padding: 0.4em;
}

div.genindex-jumpbox {
    border-top: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
    margin: 1em 0 1em 0;
    padding: 0.4em;
}

/* -- domain module index --------------------------------------------------- */

table.modindextable td {
    padding: 2px;
    border-collapse: collapse;
}

/* -- general body styles --------------------------------------------------- */

div.body {
    min-width: 450px;
    max-width: 800px;
}

div.body p, div.body dd, div.body li, div.body blockquote {
    -moz-hyphens: auto;
    -ms-hyphens: auto;
    -webkit-hyphens: auto;
    hyphens: auto;
}

a.headerlink {
    visibility: hidden;
}

a.brackets:before,
span.brackets > a:before{
    content: "[";
}

a.brackets:after,
span.brackets > a:after {
    content: "]";
}

h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
    visibility: visible;
}

div.body p.caption {
    text-align: inherit;
}

div.body td {
    text-align: left;
}

.first {
    margin-top: 0 !important;
}

p.rubric {
    margin-top: 30px;
    font-weight: bold;
}

img.align-left, figure.align-left, .figure.align-left, object.align-left {
    clear: left;
    float: left;
    margin-right: 1em;
}

img.align-right, figure.align-right, .figure.align-right, object.align-right {
    clear: right;
    float: right;
    margin-left: 1em;
}

img.align-center, figure.align-center, .figure.align-center, object.align-center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

img.align-default, figure.align-default, .figure.align-default {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.align-left {
    text-align: left;
}

.align-center {
    text-align: center;
}

.align-default {
    text-align: center;
}

.align-right {
    text-align: right;
}

/* -- sidebars -------------------------------------------------------------- */

div.sidebar,
aside.sidebar {
    margin: 0 0 0.5em 1em;
    border: 1px solid #ddb;
    padding: 7px;
    background-color: #ffe;
    width: 40%;
    float: right;
    clear: right;
    overflow-x: auto;
}

p.sidebar-title {
    font-weight: bold;
}

div.admonition, div.topic, blockquote {
    clear: left;
}

/* -- topics ---------------------------------------------------------------- */

div.topic {
    border: 1px solid #ccc;
    padding: 7px;
    margin: 10px 0 10px 0;
}

p.topic-title {
    font-size: 1.1em;
    font-weight: bold;
    margin-top: 10px;
}

/* -- admonitions ----------------------------------------------------------- */

div.admonition {
    margin-top: 10px;
    margin-bottom: 10px;
    padding: 7px;
}

div.admonition dt {
    font-weight: bold;
}

p.admonition-title {
    margin: 0px 10px 5px 0px;
    font-weight: bold;
}

div.body p.centered {
    text-align: center;
    margin-top: 25px;
}

/* -- content of sidebars/topics/admonitions -------------------------------- */

div.sidebar > :last-child,
aside.sidebar > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
    margin-bottom: 0;
}

div.sidebar::after,
aside.sidebar::after,
div.topic::after,
div.admonition::after,
blockquote::after {
    display: block;
    content: '';
    clear: both;
}

/* -- tables ---------------------------------------------------------------- */

table.docutils {
    margin-top: 10px;
    margin-bottom: 10px;
    border: 0;
    border-collapse: collapse;
}

table.align-center {
    margin-left: auto;
    margin-right: auto;
}

table.align-default {
    margin-left: auto;
    margin-right: auto;
}

table caption span.caption-number {
    font-style: italic;
}

table caption span.caption-text {
}

table.docutils td, table.docutils th {
    padding: 1px 8px 1px 5px;
    border-top: 0;
    border-left: 0;
    border-right: 0;
    border-bottom: 1px solid #aaa;
}

table.footnote td, table.footnote th {
    border: 0 !important;
}

th {
    text-align: left;
    padding-right: 5px;
}

table.citation {
    border-left: solid 1px gray;
    margin-left: 1px;
}

table.citation td {
    border-bottom: none;
}

th > :first-child,
td > :first-child {
    margin-top: 0px;
}

th > :last-child,
td > :last-child {
    margin-bottom: 0px;
}

/* -- figures --------------------------------------------------------------- */

div.figure, figure {
    margin: 0.5em;
    padding: 0.5em;
}

div.figure p.caption, figcaption {
    padding: 0.3em;
}

div.figure p.caption span.caption-number,
figcaption span.caption-number {
    font-style: italic;
}

div.figure p.caption span.caption-text,
figcaption span.caption-text {
}

/* -- field list styles ----------------------------------------------------- */

table.field-list td, table.field-list th {
    border: 0 !important;
}

.field-list ul {
    margin: 0;
    padding-left: 1em;
}

.field-list p {
    margin: 0;
}

.field-name {
    -moz-hyphens: manual;
    -ms-hyphens: manual;
    -webkit-hyphens: manual;
    hyphens: manual;
}

/* -- hlist styles ---------------------------------------------------------- */

table.hlist {
    margin: 1em 0;
}

table.hlist td {
    vertical-align: top;
}


/* -- other body styles ----------------------------------------------------- */

ol.arabic {
    list-style: decimal;
}

ol.loweralpha {
    list-style: lower-alpha;
}

ol.upperalpha {
    list-style: upper-alpha;
}

ol.lowerroman {
    list-style: lower-roman;
}

ol.upperroman {
    list-style: upper-roman;
}

:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
    margin-top: 0px;
}

:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
    margin-bottom: 0px;
}

ol.simple ol p,
ol.simple ul p,
ul.simple ol p,
ul.simple ul p {
    margin-top: 0;
}

ol.simple > li:not(:first-child) > p,
ul.simple > li:not(:first-child) > p {
    margin-top: 0;
}

ol.simple p,
ul.simple p {
    margin-bottom: 0;
}

dl.footnote > dt,
dl.citation > dt {
    float: left;
    margin-right: 0.5em;
}

dl.footnote > dd,
dl.citation > dd {
    margin-bottom: 0em;
}

dl.footnote > dd:after,
dl.citation > dd:after {
    content: "";
    clear: both;
}

dl.field-list {
    display: grid;
    grid-template-columns: fit-content(30%) auto;
}

dl.field-list > dt {
    font-weight: bold;
    word-break: break-word;
    padding-left: 0.5em;
    padding-right: 5px;
}

dl.field-list > dt:after {
    content: ":";
}

dl.field-list > dd {
    padding-left: 0.5em;
    margin-top: 0em;
    margin-left: 0em;
    margin-bottom: 0em;
}

dl {
    margin-bottom: 15px;
}

dd > :first-child {
    margin-top: 0px;
}

dd ul, dd table {
    margin-bottom: 10px;
}

dd {
    margin-top: 3px;
    margin-bottom: 10px;
    margin-left: 30px;
}

dl > dd:last-child,
dl > dd:last-child > :last-child {
    margin-bottom: 0;
}

dt:target, span.highlighted {
    background-color: #fbe54e;
}

rect.highlighted {
    fill: #fbe54e;
}

dl.glossary dt {
    font-weight: bold;
    font-size: 1.1em;
}

.optional {
    font-size: 1.3em;
}

.sig-paren {
    font-size: larger;
}

.versionmodified {
    font-style: italic;
}

.system-message {
    background-color: #fda;
    padding: 5px;
    border: 3px solid red;
}

.footnote:target  {
    background-color: #ffa;
}

.line-block {
    display: block;
    margin-top: 1em;
    margin-bottom: 1em;
}

.line-block .line-block {
    margin-top: 0;
    margin-bottom: 0;
    margin-left: 1.5em;
}

.guilabel, .menuselection {
    font-family: sans-serif;
}

.accelerator {
    text-decoration: underline;
}

.classifier {
    font-style: oblique;
}

.classifier:before {
    font-style: normal;
    margin: 0.5em;
    content: ":";
}

abbr, acronym {
    border-bottom: dotted 1px;
    cursor: help;
}

/* -- code displays --------------------------------------------------------- */

pre {
    overflow: auto;
    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
}

pre, div[class*="highlight-"] {
    clear: both;
}

span.pre {
    -moz-hyphens: none;
    -ms-hyphens: none;
    -webkit-hyphens: none;
    hyphens: none;
}

div[class*="highlight-"] {
    margin: 1em 0;
}

td.linenos pre {
    border: 0;
    background-color: transparent;
    color: #aaa;
}

table.highlighttable {
    display: block;
}

table.highlighttable tbody {
    display: block;
}

table.highlighttable tr {
    display: flex;
}

table.highlighttable td {
    margin: 0;
    padding: 0;
}

table.highlighttable td.linenos {
    padding-right: 0.5em;
}

table.highlighttable td.code {
    flex: 1;
    overflow: hidden;
}

.highlight .hll {
    display: block;
}

div.highlight pre,
table.highlighttable pre {
    margin: 0;
}

div.code-block-caption + div {
    margin-top: 0;
}

div.code-block-caption {
    margin-top: 1em;
    padding: 2px 5px;
    font-size: small;
}

div.code-block-caption code {
    background-color: transparent;
}

table.highlighttable td.linenos,
span.linenos,
div.doctest > div.highlight span.gp {  /* gp: Generic.Prompt */
    user-select: none;
}

div.code-block-caption span.caption-number {
    padding: 0.1em 0.3em;
    font-style: italic;
}

div.code-block-caption span.caption-text {
}

div.literal-block-wrapper {
    margin: 1em 0;
}

code.descname {
    background-color: transparent;
    font-weight: bold;
    font-size: 1.2em;
}

code.descclassname {
    background-color: transparent;
}

code.xref, a code {
    background-color: transparent;
    font-weight: bold;
}

h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
    background-color: transparent;
}

.viewcode-link {
    float: right;
}

.viewcode-back {
    float: right;
    font-family: sans-serif;
}

div.viewcode-block:target {
    margin: -1px -10px;
    padding: 0 10px;
}

/* -- math display ---------------------------------------------------------- */

img.math {
    vertical-align: middle;
}

div.body div.math p {
    text-align: center;
}

span.eqno {
    float: right;
}

span.eqno a.headerlink {
    position: absolute;
    z-index: 1;
}

div.math:hover a.headerlink {
    visibility: visible;
}

/* -- printout stylesheet --------------------------------------------------- */

@media print {
    div.document,
    div.documentwrapper,
    div.bodywrapper {
        margin: 0 !important;
        width: 100%;
    }

    div.sphinxsidebar,
    div.related,
    div.footer,
    #top-link {
        display: none;
    }
}

Added build/html/_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css.

cannot compute difference between binary files

Added build/html/_static/css/theme.css.











































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
:root {
  /*****************************************************************************
  * Theme config
  **/
  --pst-header-height: 60px;

  /*****************************************************************************
  * Font size
  **/
  --pst-font-size-base: 15px; /* base font size - applied at body / html level */

  /* heading font sizes */
  --pst-font-size-h1: 36px;
  --pst-font-size-h2: 32px;
  --pst-font-size-h3: 26px;
  --pst-font-size-h4: 21px;
  --pst-font-size-h5: 18px;
  --pst-font-size-h6: 16px;

  /* smaller then heading font sizes*/
  --pst-font-size-milli: 12px;

  --pst-sidebar-font-size: .9em;
  --pst-sidebar-caption-font-size: .9em;

  /*****************************************************************************
  * Font family
  **/
  /* These are adapted from https://systemfontstack.com/ */
  --pst-font-family-base-system: -apple-system, BlinkMacSystemFont, Segoe UI, "Helvetica Neue",
    Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;
  --pst-font-family-monospace-system: "SFMono-Regular", Menlo, Consolas, Monaco,
    Liberation Mono, Lucida Console, monospace;

  --pst-font-family-base: var(--pst-font-family-base-system);
  --pst-font-family-heading: var(--pst-font-family-base);
  --pst-font-family-monospace: var(--pst-font-family-monospace-system);

  /*****************************************************************************
  * Color
  * 
  * Colors are defined in rgb string way, "red, green, blue"
  **/
  --pst-color-primary: 19, 6, 84;
  --pst-color-success: 40, 167, 69;
  --pst-color-info: 0, 123, 255;  /*23, 162, 184;*/
  --pst-color-warning: 255, 193, 7;
  --pst-color-danger: 220, 53, 69;
  --pst-color-text-base: 51, 51, 51;

  --pst-color-h1: var(--pst-color-primary);
  --pst-color-h2: var(--pst-color-primary);
  --pst-color-h3: var(--pst-color-text-base);
  --pst-color-h4: var(--pst-color-text-base);
  --pst-color-h5: var(--pst-color-text-base);
  --pst-color-h6: var(--pst-color-text-base);
  --pst-color-paragraph: var(--pst-color-text-base);
  --pst-color-link: 0, 91, 129;
  --pst-color-link-hover: 227, 46, 0;
  --pst-color-headerlink: 198, 15, 15;
  --pst-color-headerlink-hover: 255, 255, 255;
  --pst-color-preformatted-text: 34, 34, 34;
  --pst-color-preformatted-background: 250, 250, 250;
  --pst-color-inline-code: 232, 62, 140;

  --pst-color-active-navigation: 19, 6, 84;
  --pst-color-navbar-link: 77, 77, 77;
  --pst-color-navbar-link-hover: var(--pst-color-active-navigation);
  --pst-color-navbar-link-active: var(--pst-color-active-navigation);
  --pst-color-sidebar-link: 77, 77, 77;
  --pst-color-sidebar-link-hover: var(--pst-color-active-navigation);
  --pst-color-sidebar-link-active: var(--pst-color-active-navigation);
  --pst-color-sidebar-expander-background-hover: 244, 244, 244;
  --pst-color-sidebar-caption: 77, 77, 77;
  --pst-color-toc-link: 119, 117, 122;
  --pst-color-toc-link-hover: var(--pst-color-active-navigation);
  --pst-color-toc-link-active: var(--pst-color-active-navigation);

  /*****************************************************************************
  * Icon
  **/

  /* font awesome icons*/
  --pst-icon-check-circle: '\f058';
  --pst-icon-info-circle: '\f05a';
  --pst-icon-exclamation-triangle: '\f071';
  --pst-icon-exclamation-circle: '\f06a';
  --pst-icon-times-circle: '\f057';
  --pst-icon-lightbulb: '\f0eb';

  /*****************************************************************************
  * Admonitions
  **/

  --pst-color-admonition-default: var(--pst-color-info);
  --pst-color-admonition-note: var(--pst-color-info);
  --pst-color-admonition-attention: var(--pst-color-warning);
  --pst-color-admonition-caution: var(--pst-color-warning);
  --pst-color-admonition-warning: var(--pst-color-warning);
  --pst-color-admonition-danger: var(--pst-color-danger);
  --pst-color-admonition-error: var(--pst-color-danger);
  --pst-color-admonition-hint: var(--pst-color-success);
  --pst-color-admonition-tip: var(--pst-color-success);
  --pst-color-admonition-important: var(--pst-color-success);

  --pst-icon-admonition-default: var(--pst-icon-info-circle);
  --pst-icon-admonition-note: var(--pst-icon-info-circle);
  --pst-icon-admonition-attention: var(--pst-icon-exclamation-circle);
  --pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle);
  --pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle);
  --pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle);
  --pst-icon-admonition-error: var(--pst-icon-times-circle);
  --pst-icon-admonition-hint: var(--pst-icon-lightbulb);
  --pst-icon-admonition-tip: var(--pst-icon-lightbulb);
  --pst-icon-admonition-important: var(--pst-icon-exclamation-circle);

}

Added build/html/_static/custom.css.







>
>
>
1
2
3
.custom-nav-footer {
    margin-top: 8em;
}

Added build/html/_static/doctools.js.



































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
/*
 * doctools.js
 * ~~~~~~~~~~~
 *
 * Sphinx JavaScript utilities for all documentation.
 *
 * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
 * :license: BSD, see LICENSE for details.
 *
 */

/**
 * select a different prefix for underscore
 */
$u = _.noConflict();

/**
 * make the code below compatible with browsers without
 * an installed firebug like debugger
if (!window.console || !console.firebug) {
  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
    "profile", "profileEnd"];
  window.console = {};
  for (var i = 0; i < names.length; ++i)
    window.console[names[i]] = function() {};
}
 */

/**
 * small helper function to urldecode strings
 *
 * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
 */
jQuery.urldecode = function(x) {
  if (!x) {
    return x
  }
  return decodeURIComponent(x.replace(/\+/g, ' '));
};

/**
 * small helper function to urlencode strings
 */
jQuery.urlencode = encodeURIComponent;

/**
 * This function returns the parsed url parameters of the
 * current request. Multiple values per key are supported,
 * it will always return arrays of strings for the value parts.
 */
jQuery.getQueryParameters = function(s) {
  if (typeof s === 'undefined')
    s = document.location.search;
  var parts = s.substr(s.indexOf('?') + 1).split('&');
  var result = {};
  for (var i = 0; i < parts.length; i++) {
    var tmp = parts[i].split('=', 2);
    var key = jQuery.urldecode(tmp[0]);
    var value = jQuery.urldecode(tmp[1]);
    if (key in result)
      result[key].push(value);
    else
      result[key] = [value];
  }
  return result;
};

/**
 * highlight a given string on a jquery object by wrapping it in
 * span elements with the given class name.
 */
jQuery.fn.highlightText = function(text, className) {
  function highlight(node, addItems) {
    if (node.nodeType === 3) {
      var val = node.nodeValue;
      var pos = val.toLowerCase().indexOf(text);
      if (pos >= 0 &&
          !jQuery(node.parentNode).hasClass(className) &&
          !jQuery(node.parentNode).hasClass("nohighlight")) {
        var span;
        var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
        if (isInSVG) {
          span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
        } else {
          span = document.createElement("span");
          span.className = className;
        }
        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
          document.createTextNode(val.substr(pos + text.length)),
          node.nextSibling));
        node.nodeValue = val.substr(0, pos);
        if (isInSVG) {
          var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
          var bbox = node.parentElement.getBBox();
          rect.x.baseVal.value = bbox.x;
          rect.y.baseVal.value = bbox.y;
          rect.width.baseVal.value = bbox.width;
          rect.height.baseVal.value = bbox.height;
          rect.setAttribute('class', className);
          addItems.push({
              "parent": node.parentNode,
              "target": rect});
        }
      }
    }
    else if (!jQuery(node).is("button, select, textarea")) {
      jQuery.each(node.childNodes, function() {
        highlight(this, addItems);
      });
    }
  }
  var addItems = [];
  var result = this.each(function() {
    highlight(this, addItems);
  });
  for (var i = 0; i < addItems.length; ++i) {
    jQuery(addItems[i].parent).before(addItems[i].target);
  }
  return result;
};

/*
 * backward compatibility for jQuery.browser
 * This will be supported until firefox bug is fixed.
 */
if (!jQuery.browser) {
  jQuery.uaMatch = function(ua) {
    ua = ua.toLowerCase();

    var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
      /(webkit)[ \/]([\w.]+)/.exec(ua) ||
      /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
      /(msie) ([\w.]+)/.exec(ua) ||
      ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
      [];

    return {
      browser: match[ 1 ] || "",
      version: match[ 2 ] || "0"
    };
  };
  jQuery.browser = {};
  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}

/**
 * Small JavaScript module for the documentation.
 */
var Documentation = {

  init : function() {
    this.fixFirefoxAnchorBug();
    this.highlightSearchWords();
    this.initIndexTable();
    if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
      this.initOnKeyListeners();
    }
  },

  /**
   * i18n support
   */
  TRANSLATIONS : {},
  PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
  LOCALE : 'unknown',

  // gettext and ngettext don't access this so that the functions
  // can safely bound to a different name (_ = Documentation.gettext)
  gettext : function(string) {
    var translated = Documentation.TRANSLATIONS[string];
    if (typeof translated === 'undefined')
      return string;
    return (typeof translated === 'string') ? translated : translated[0];
  },

  ngettext : function(singular, plural, n) {
    var translated = Documentation.TRANSLATIONS[singular];
    if (typeof translated === 'undefined')
      return (n == 1) ? singular : plural;
    return translated[Documentation.PLURALEXPR(n)];
  },

  addTranslations : function(catalog) {
    for (var key in catalog.messages)
      this.TRANSLATIONS[key] = catalog.messages[key];
    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
    this.LOCALE = catalog.locale;
  },

  /**
   * add context elements like header anchor links
   */
  addContextElements : function() {
    $('div[id] > :header:first').each(function() {
      $('<a class="headerlink">\u00B6</a>').
      attr('href', '#' + this.id).
      attr('title', _('Permalink to this headline')).
      appendTo(this);
    });
    $('dt[id]').each(function() {
      $('<a class="headerlink">\u00B6</a>').
      attr('href', '#' + this.id).
      attr('title', _('Permalink to this definition')).
      appendTo(this);
    });
  },

  /**
   * workaround a firefox stupidity
   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
   */
  fixFirefoxAnchorBug : function() {
    if (document.location.hash && $.browser.mozilla)
      window.setTimeout(function() {
        document.location.href += '';
      }, 10);
  },

  /**
   * highlight the search words provided in the url in the text
   */
  highlightSearchWords : function() {
    var params = $.getQueryParameters();
    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
    if (terms.length) {
      var body = $('div.body');
      if (!body.length) {
        body = $('body');
      }
      window.setTimeout(function() {
        $.each(terms, function() {
          body.highlightText(this.toLowerCase(), 'highlighted');
        });
      }, 10);
      $('<p class="highlight-link"><a href="javascript:Documentation.' +
        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
          .appendTo($('#searchbox'));
    }
  },

  /**
   * init the domain index toggle buttons
   */
  initIndexTable : function() {
    var togglers = $('img.toggler').click(function() {
      var src = $(this).attr('src');
      var idnum = $(this).attr('id').substr(7);
      $('tr.cg-' + idnum).toggle();
      if (src.substr(-9) === 'minus.png')
        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
      else
        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
    }).css('display', '');
    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
        togglers.click();
    }
  },

  /**
   * helper function to hide the search marks again
   */
  hideSearchWords : function() {
    $('#searchbox .highlight-link').fadeOut(300);
    $('span.highlighted').removeClass('highlighted');
  },

  /**
   * make the url absolute
   */
  makeURL : function(relativeURL) {
    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
  },

  /**
   * get the current relative url
   */
  getCurrentURL : function() {
    var path = document.location.pathname;
    var parts = path.split(/\//);
    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
      if (this === '..')
        parts.pop();
    });
    var url = parts.join('/');
    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
  },

  initOnKeyListeners: function() {
    $(document).keydown(function(event) {
      var activeElementType = document.activeElement.tagName;
      // don't navigate when in search box, textarea, dropdown or button
      if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
          && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey
          && !event.shiftKey) {
        switch (event.keyCode) {
          case 37: // left
            var prevHref = $('link[rel="prev"]').prop('href');
            if (prevHref) {
              window.location.href = prevHref;
              return false;
            }
          case 39: // right
            var nextHref = $('link[rel="next"]').prop('href');
            if (nextHref) {
              window.location.href = nextHref;
              return false;
            }
        }
      }
    });
  }
};

// quick alias for translations
_ = Documentation.gettext;

$(document).ready(function() {
  Documentation.init();
});

Added build/html/_static/documentation_options.js.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
var DOCUMENTATION_OPTIONS = {
    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
    VERSION: '',
    LANGUAGE: 'None',
    COLLAPSE_INDEX: false,
    BUILDER: 'html',
    FILE_SUFFIX: '.html',
    LINK_SUFFIX: '.html',
    HAS_SOURCE: true,
    SOURCELINK_SUFFIX: '.txt',
    NAVIGATION_WITH_KEYS: true
};

Added build/html/_static/file.png.

cannot compute difference between binary files

Added build/html/_static/images/logo_binder.svg.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 44.4 44.4" style="enable-background:new 0 0 44.4 44.4;" xml:space="preserve">
<style type="text/css">
	.st0{fill:none;stroke:#F5A252;stroke-width:5;stroke-miterlimit:10;}
	.st1{fill:none;stroke:#579ACA;stroke-width:5;stroke-miterlimit:10;}
	.st2{fill:none;stroke:#E66581;stroke-width:5;stroke-miterlimit:10;}
</style>
<title>logo</title>
<g>
	<path class="st0" d="M33.9,6.4c3.6,3.9,3.4,9.9-0.5,13.5s-9.9,3.4-13.5-0.5s-3.4-9.9,0.5-13.5l0,0C24.2,2.4,30.2,2.6,33.9,6.4z"/>
	<path class="st1" d="M35.1,27.3c2.6,4.6,1.1,10.4-3.5,13c-4.6,2.6-10.4,1.1-13-3.5s-1.1-10.4,3.5-13l0,0
		C26.6,21.2,32.4,22.7,35.1,27.3z"/>
	<path class="st2" d="M25.9,17.8c2.6,4.6,1.1,10.4-3.5,13s-10.4,1.1-13-3.5s-1.1-10.4,3.5-13l0,0C17.5,11.7,23.3,13.2,25.9,17.8z"/>
	<path class="st1" d="M19.2,26.4c3.1-4.3,9.1-5.2,13.3-2.1c1.1,0.8,2,1.8,2.7,3"/>
	<path class="st0" d="M19.9,19.4c-3.6-3.9-3.4-9.9,0.5-13.5s9.9-3.4,13.5,0.5"/>
</g>
</svg>

Added build/html/_static/images/logo_colab.png.

cannot compute difference between binary files

Added build/html/_static/images/logo_jupyterhub.svg.



>
1
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="38.73" height="50" viewBox="0 0 38.73 50"><defs><style>.cls-1{fill:#767677;}.cls-2{fill:#f37726;}.cls-3{fill:#9e9e9e;}.cls-4{fill:#616262;}.cls-5{font-size:17.07px;fill:#fff;font-family:Roboto-Regular, Roboto;}</style></defs><title>logo_jupyterhub</title><g id="Canvas"><path id="path7_fill" data-name="path7 fill" class="cls-1" d="M39.51,3.53a3,3,0,0,1-1.7,2.9A3,3,0,0,1,34.48,6a3,3,0,0,1-.82-3.26,3,3,0,0,1,1.05-1.41A3,3,0,0,1,37.52.86a2.88,2.88,0,0,1,1,.6,3,3,0,0,1,.7.93,3.18,3.18,0,0,1,.28,1.14Z" transform="translate(-1.87 -0.69)"/><path id="path8_fill" data-name="path8 fill" class="cls-2" d="M21.91,38.39c-8,0-15.06-2.87-18.7-7.12a19.93,19.93,0,0,0,37.39,0C37,35.52,30,38.39,21.91,38.39Z" transform="translate(-1.87 -0.69)"/><path id="path9_fill" data-name="path9 fill" class="cls-2" d="M21.91,10.78c8,0,15.05,2.87,18.69,7.12a19.93,19.93,0,0,0-37.39,0C6.85,13.64,13.86,10.78,21.91,10.78Z" transform="translate(-1.87 -0.69)"/><path id="path10_fill" data-name="path10 fill" class="cls-3" d="M10.88,46.66a3.86,3.86,0,0,1-.52,2.15,3.81,3.81,0,0,1-1.62,1.51,3.93,3.93,0,0,1-2.19.34,3.79,3.79,0,0,1-2-.94,3.73,3.73,0,0,1-1.14-1.9,3.79,3.79,0,0,1,.1-2.21,3.86,3.86,0,0,1,1.33-1.78,3.92,3.92,0,0,1,3.54-.53,3.85,3.85,0,0,1,2.14,1.93,3.74,3.74,0,0,1,.37,1.43Z" transform="translate(-1.87 -0.69)"/><path id="path11_fill" data-name="path11 fill" class="cls-4" d="M4.12,9.81A2.18,2.18,0,0,1,2.9,9.48a2.23,2.23,0,0,1-.84-1A2.26,2.26,0,0,1,1.9,7.26a2.13,2.13,0,0,1,.56-1.13,2.18,2.18,0,0,1,2.36-.56,2.13,2.13,0,0,1,1,.76,2.18,2.18,0,0,1,.42,1.2A2.22,2.22,0,0,1,4.12,9.81Z" transform="translate(-1.87 -0.69)"/></g><text class="cls-5" transform="translate(5.24 30.01)">Hub</text></svg>

Added build/html/_static/jquery-3.5.1.js.

more than 10,000 changes

Added build/html/_static/jquery.js.

cannot compute difference between binary files

Added build/html/_static/js/index.1c5a1a01449ed65a7b51.js.

cannot compute difference between binary files

Added build/html/_static/language_data.js.



















































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
/*
 * language_data.js
 * ~~~~~~~~~~~~~~~~
 *
 * This script contains the language-specific data used by searchtools.js,
 * namely the list of stopwords, stemmer, scorer and splitter.
 *
 * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
 * :license: BSD, see LICENSE for details.
 *
 */

var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];


/* Non-minified version is copied as a separate JS file, is available */

/**
 * Porter Stemmer
 */
var Stemmer = function() {

  var step2list = {
    ational: 'ate',
    tional: 'tion',
    enci: 'ence',
    anci: 'ance',
    izer: 'ize',
    bli: 'ble',
    alli: 'al',
    entli: 'ent',
    eli: 'e',
    ousli: 'ous',
    ization: 'ize',
    ation: 'ate',
    ator: 'ate',
    alism: 'al',
    iveness: 'ive',
    fulness: 'ful',
    ousness: 'ous',
    aliti: 'al',
    iviti: 'ive',
    biliti: 'ble',
    logi: 'log'
  };

  var step3list = {
    icate: 'ic',
    ative: '',
    alize: 'al',
    iciti: 'ic',
    ical: 'ic',
    ful: '',
    ness: ''
  };

  var c = "[^aeiou]";          // consonant
  var v = "[aeiouy]";          // vowel
  var C = c + "[^aeiouy]*";    // consonant sequence
  var V = v + "[aeiou]*";      // vowel sequence

  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem

  this.stemWord = function (w) {
    var stem;
    var suffix;
    var firstch;
    var origword = w;

    if (w.length < 3)
      return w;

    var re;
    var re2;
    var re3;
    var re4;

    firstch = w.substr(0,1);
    if (firstch == "y")
      w = firstch.toUpperCase() + w.substr(1);

    // Step 1a
    re = /^(.+?)(ss|i)es$/;
    re2 = /^(.+?)([^s])s$/;

    if (re.test(w))
      w = w.replace(re,"$1$2");
    else if (re2.test(w))
      w = w.replace(re2,"$1$2");

    // Step 1b
    re = /^(.+?)eed$/;
    re2 = /^(.+?)(ed|ing)$/;
    if (re.test(w)) {
      var fp = re.exec(w);
      re = new RegExp(mgr0);
      if (re.test(fp[1])) {
        re = /.$/;
        w = w.replace(re,"");
      }
    }
    else if (re2.test(w)) {
      var fp = re2.exec(w);
      stem = fp[1];
      re2 = new RegExp(s_v);
      if (re2.test(stem)) {
        w = stem;
        re2 = /(at|bl|iz)$/;
        re3 = new RegExp("([^aeiouylsz])\\1$");
        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
        if (re2.test(w))
          w = w + "e";
        else if (re3.test(w)) {
          re = /.$/;
          w = w.replace(re,"");
        }
        else if (re4.test(w))
          w = w + "e";
      }
    }

    // Step 1c
    re = /^(.+?)y$/;
    if (re.test(w)) {
      var fp = re.exec(w);
      stem = fp[1];
      re = new RegExp(s_v);
      if (re.test(stem))
        w = stem + "i";
    }

    // Step 2
    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
    if (re.test(w)) {
      var fp = re.exec(w);
      stem = fp[1];
      suffix = fp[2];
      re = new RegExp(mgr0);
      if (re.test(stem))
        w = stem + step2list[suffix];
    }

    // Step 3
    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
    if (re.test(w)) {
      var fp = re.exec(w);
      stem = fp[1];
      suffix = fp[2];
      re = new RegExp(mgr0);
      if (re.test(stem))
        w = stem + step3list[suffix];
    }

    // Step 4
    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
    re2 = /^(.+?)(s|t)(ion)$/;
    if (re.test(w)) {
      var fp = re.exec(w);
      stem = fp[1];
      re = new RegExp(mgr1);
      if (re.test(stem))
        w = stem;
    }
    else if (re2.test(w)) {
      var fp = re2.exec(w);
      stem = fp[1] + fp[2];
      re2 = new RegExp(mgr1);
      if (re2.test(stem))
        w = stem;
    }

    // Step 5
    re = /^(.+?)e$/;
    if (re.test(w)) {
      var fp = re.exec(w);
      stem = fp[1];
      re = new RegExp(mgr1);
      re2 = new RegExp(meq1);
      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
        w = stem;
    }
    re = /ll$/;
    re2 = new RegExp(mgr1);
    if (re.test(w) && re2.test(w)) {
      re = /.$/;
      w = w.replace(re,"");
    }

    // and turn initial Y back to y
    if (firstch == "y")
      w = firstch.toLowerCase() + w.substr(1);
    return w;
  }
}




var splitChars = (function() {
    var result = {};
    var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
         1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
         2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
         2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
         3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
         3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
         4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
         8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
         11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
         43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
    var i, j, start, end;
    for (i = 0; i < singles.length; i++) {
        result[singles[i]] = true;
    }
    var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
         [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
         [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
         [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
         [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
         [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
         [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
         [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
         [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
         [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
         [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
         [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
         [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
         [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
         [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
         [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
         [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
         [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
         [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
         [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
         [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
         [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
         [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
         [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
         [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
         [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
         [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
         [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
         [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
         [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
         [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
         [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
         [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
         [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
         [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
         [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
         [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
         [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
         [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
         [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
         [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
         [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
         [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
         [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
         [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
         [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
         [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
         [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
         [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
    for (i = 0; i < ranges.length; i++) {
        start = ranges[i][0];
        end = ranges[i][1];
        for (j = start; j <= end; j++) {
            result[j] = true;
        }
    }
    return result;
})();

function splitQuery(query) {
    var result = [];
    var start = -1;
    for (var i = 0; i < query.length; i++) {
        if (splitChars[query.charCodeAt(i)]) {
            if (start !== -1) {
                result.push(query.slice(start, i));
                start = -1;
            }
        } else if (start === -1) {
            start = i;
        }
    }
    if (start !== -1) {
        result.push(query.slice(start));
    }
    return result;
}


Added build/html/_static/minus.png.

cannot compute difference between binary files

Added build/html/_static/plus.png.

cannot compute difference between binary files

Added build/html/_static/pygments.css.





































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #8f5902; font-style: italic } /* Comment */
.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
.highlight .g { color: #000000 } /* Generic */
.highlight .k { color: #204a87; font-weight: bold } /* Keyword */
.highlight .l { color: #000000 } /* Literal */
.highlight .n { color: #000000 } /* Name */
.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */
.highlight .x { color: #000000 } /* Other */
.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */
.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
.highlight .gd { color: #a40000 } /* Generic.Deleted */
.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #ef2929 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #000000; font-style: italic } /* Generic.Output */
.highlight .gp { color: #8f5902 } /* Generic.Prompt */
.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */
.highlight .ld { color: #000000 } /* Literal.Date */
.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */
.highlight .s { color: #4e9a06 } /* Literal.String */
.highlight .na { color: #c4a000 } /* Name.Attribute */
.highlight .nb { color: #204a87 } /* Name.Builtin */
.highlight .nc { color: #000000 } /* Name.Class */
.highlight .no { color: #000000 } /* Name.Constant */
.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #ce5c00 } /* Name.Entity */
.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #000000 } /* Name.Function */
.highlight .nl { color: #f57900 } /* Name.Label */
.highlight .nn { color: #000000 } /* Name.Namespace */
.highlight .nx { color: #000000 } /* Name.Other */
.highlight .py { color: #000000 } /* Name.Property */
.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #000000 } /* Name.Variable */
.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */
.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */
.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */
.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */
.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #000000 } /* Name.Function.Magic */
.highlight .vc { color: #000000 } /* Name.Variable.Class */
.highlight .vg { color: #000000 } /* Name.Variable.Global */
.highlight .vi { color: #000000 } /* Name.Variable.Instance */
.highlight .vm { color: #000000 } /* Name.Variable.Magic */
.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */

Added build/html/_static/searchtools.js.





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
/*
 * searchtools.js
 * ~~~~~~~~~~~~~~~~
 *
 * Sphinx JavaScript utilities for the full-text search.
 *
 * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
 * :license: BSD, see LICENSE for details.
 *
 */

if (!Scorer) {
  /**
   * Simple result scoring code.
   */
  var Scorer = {
    // Implement the following function to further tweak the score for each result
    // The function takes a result array [filename, title, anchor, descr, score]
    // and returns the new score.
    /*
    score: function(result) {
      return result[4];
    },
    */

    // query matches the full name of an object
    objNameMatch: 11,
    // or matches in the last dotted part of the object name
    objPartialMatch: 6,
    // Additive scores depending on the priority of the object
    objPrio: {0:  15,   // used to be importantResults
              1:  5,   // used to be objectResults
              2: -5},  // used to be unimportantResults
    //  Used when the priority is not in the mapping.
    objPrioDefault: 0,

    // query found in title
    title: 15,
    partialTitle: 7,
    // query found in terms
    term: 5,
    partialTerm: 2
  };
}

if (!splitQuery) {
  function splitQuery(query) {
    return query.split(/\s+/);
  }
}

/**
 * Search Module
 */
var Search = {

  _index : null,
  _queued_query : null,
  _pulse_status : -1,

  htmlToText : function(htmlString) {
      var virtualDocument = document.implementation.createHTMLDocument('virtual');
      var htmlElement = $(htmlString, virtualDocument);
      htmlElement.find('.headerlink').remove();
      docContent = htmlElement.find('[role=main]')[0];
      if(docContent === undefined) {
          console.warn("Content block not found. Sphinx search tries to obtain it " +
                       "via '[role=main]'. Could you check your theme or template.");
          return "";
      }
      return docContent.textContent || docContent.innerText;
  },

  init : function() {
      var params = $.getQueryParameters();
      if (params.q) {
          var query = params.q[0];
          $('input[name="q"]')[0].value = query;
          this.performSearch(query);
      }
  },

  loadIndex : function(url) {
    $.ajax({type: "GET", url: url, data: null,
            dataType: "script", cache: true,
            complete: function(jqxhr, textstatus) {
              if (textstatus != "success") {
                document.getElementById("searchindexloader").src = url;
              }
            }});
  },

  setIndex : function(index) {
    var q;
    this._index = index;
    if ((q = this._queued_query) !== null) {
      this._queued_query = null;
      Search.query(q);
    }
  },

  hasIndex : function() {
      return this._index !== null;
  },

  deferQuery : function(query) {
      this._queued_query = query;
  },

  stopPulse : function() {
      this._pulse_status = 0;
  },

  startPulse : function() {
    if (this._pulse_status >= 0)
        return;
    function pulse() {
      var i;
      Search._pulse_status = (Search._pulse_status + 1) % 4;
      var dotString = '';
      for (i = 0; i < Search._pulse_status; i++)
        dotString += '.';
      Search.dots.text(dotString);
      if (Search._pulse_status > -1)
        window.setTimeout(pulse, 500);
    }
    pulse();
  },

  /**
   * perform a search for something (or wait until index is loaded)
   */
  performSearch : function(query) {
    // create the required interface elements
    this.out = $('#search-results');
    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
    this.dots = $('<span></span>').appendTo(this.title);
    this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out);
    this.output = $('<ul class="search"/>').appendTo(this.out);

    $('#search-progress').text(_('Preparing search...'));
    this.startPulse();

    // index already loaded, the browser was quick!
    if (this.hasIndex())
      this.query(query);
    else
      this.deferQuery(query);
  },

  /**
   * execute search (requires search index to be loaded)
   */
  query : function(query) {
    var i;

    // stem the searchterms and add them to the correct list
    var stemmer = new Stemmer();
    var searchterms = [];
    var excluded = [];
    var hlterms = [];
    var tmp = splitQuery(query);
    var objectterms = [];
    for (i = 0; i < tmp.length; i++) {
      if (tmp[i] !== "") {
          objectterms.push(tmp[i].toLowerCase());
      }

      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
        // skip this "word"
        continue;
      }
      // stem the word
      var word = stemmer.stemWord(tmp[i].toLowerCase());
      // prevent stemmer from cutting word smaller than two chars
      if(word.length < 3 && tmp[i].length >= 3) {
        word = tmp[i];
      }
      var toAppend;
      // select the correct list
      if (word[0] == '-') {
        toAppend = excluded;
        word = word.substr(1);
      }
      else {
        toAppend = searchterms;
        hlterms.push(tmp[i].toLowerCase());
      }
      // only add if not already in the list
      if (!$u.contains(toAppend, word))
        toAppend.push(word);
    }
    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));

    // console.debug('SEARCH: searching for:');
    // console.info('required: ', searchterms);
    // console.info('excluded: ', excluded);

    // prepare search
    var terms = this._index.terms;
    var titleterms = this._index.titleterms;

    // array of [filename, title, anchor, descr, score]
    var results = [];
    $('#search-progress').empty();

    // lookup as object
    for (i = 0; i < objectterms.length; i++) {
      var others = [].concat(objectterms.slice(0, i),
                             objectterms.slice(i+1, objectterms.length));
      results = results.concat(this.performObjectSearch(objectterms[i], others));
    }

    // lookup as search terms in fulltext
    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));

    // let the scorer override scores with a custom scoring function
    if (Scorer.score) {
      for (i = 0; i < results.length; i++)
        results[i][4] = Scorer.score(results[i]);
    }

    // now sort the results by score (in opposite order of appearance, since the
    // display function below uses pop() to retrieve items) and then
    // alphabetically
    results.sort(function(a, b) {
      var left = a[4];
      var right = b[4];
      if (left > right) {
        return 1;
      } else if (left < right) {
        return -1;
      } else {
        // same score: sort alphabetically
        left = a[1].toLowerCase();
        right = b[1].toLowerCase();
        return (left > right) ? -1 : ((left < right) ? 1 : 0);
      }
    });

    // for debugging
    //Search.lastresults = results.slice();  // a copy
    //console.info('search results:', Search.lastresults);

    // print the results
    var resultCount = results.length;
    function displayNextItem() {
      // results left, load the summary and display it
      if (results.length) {
        var item = results.pop();
        var listItem = $('<li></li>');
        var requestUrl = "";
        var linkUrl = "";
        if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
          // dirhtml builder
          var dirname = item[0] + '/';
          if (dirname.match(/\/index\/$/)) {
            dirname = dirname.substring(0, dirname.length-6);
          } else if (dirname == 'index/') {
            dirname = '';
          }
          requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
          linkUrl = requestUrl;

        } else {
          // normal html builders
          requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
          linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
        }
        listItem.append($('<a/>').attr('href',
            linkUrl +
            highlightstring + item[2]).html(item[1]));
        if (item[3]) {
          listItem.append($('<span> (' + item[3] + ')</span>'));
          Search.output.append(listItem);
          setTimeout(function() {
            displayNextItem();
          }, 5);
        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
          $.ajax({url: requestUrl,
                  dataType: "text",
                  complete: function(jqxhr, textstatus) {
                    var data = jqxhr.responseText;
                    if (data !== '' && data !== undefined) {
                      listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
                    }
                    Search.output.append(listItem);
                    setTimeout(function() {
                      displayNextItem();
                    }, 5);
                  }});
        } else {
          // no source available, just display title
          Search.output.append(listItem);
          setTimeout(function() {
            displayNextItem();
          }, 5);
        }
      }
      // search finished, update title and status message
      else {
        Search.stopPulse();
        Search.title.text(_('Search Results'));
        if (!resultCount)
          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
        else
            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
        Search.status.fadeIn(500);
      }
    }
    displayNextItem();
  },

  /**
   * search for object names
   */
  performObjectSearch : function(object, otherterms) {
    var filenames = this._index.filenames;
    var docnames = this._index.docnames;
    var objects = this._index.objects;
    var objnames = this._index.objnames;
    var titles = this._index.titles;

    var i;
    var results = [];

    for (var prefix in objects) {
      for (var name in objects[prefix]) {
        var fullname = (prefix ? prefix + '.' : '') + name;
        var fullnameLower = fullname.toLowerCase()
        if (fullnameLower.indexOf(object) > -1) {
          var score = 0;
          var parts = fullnameLower.split('.');
          // check for different match types: exact matches of full name or
          // "last name" (i.e. last dotted part)
          if (fullnameLower == object || parts[parts.length - 1] == object) {
            score += Scorer.objNameMatch;
          // matches in last name
          } else if (parts[parts.length - 1].indexOf(object) > -1) {
            score += Scorer.objPartialMatch;
          }
          var match = objects[prefix][name];
          var objname = objnames[match[1]][2];
          var title = titles[match[0]];
          // If more than one term searched for, we require other words to be
          // found in the name/title/description
          if (otherterms.length > 0) {
            var haystack = (prefix + ' ' + name + ' ' +
                            objname + ' ' + title).toLowerCase();
            var allfound = true;
            for (i = 0; i < otherterms.length; i++) {
              if (haystack.indexOf(otherterms[i]) == -1) {
                allfound = false;
                break;
              }
            }
            if (!allfound) {
              continue;
            }
          }
          var descr = objname + _(', in ') + title;

          var anchor = match[3];
          if (anchor === '')
            anchor = fullname;
          else if (anchor == '-')
            anchor = objnames[match[1]][1] + '-' + fullname;
          // add custom score for some objects according to scorer
          if (Scorer.objPrio.hasOwnProperty(match[2])) {
            score += Scorer.objPrio[match[2]];
          } else {
            score += Scorer.objPrioDefault;
          }
          results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
        }
      }
    }

    return results;
  },

  /**
   * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
   */
  escapeRegExp : function(string) {
    return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
  },

  /**
   * search for full-text terms in the index
   */
  performTermsSearch : function(searchterms, excluded, terms, titleterms) {
    var docnames = this._index.docnames;
    var filenames = this._index.filenames;
    var titles = this._index.titles;

    var i, j, file;
    var fileMap = {};
    var scoreMap = {};
    var results = [];

    // perform the search on the required terms
    for (i = 0; i < searchterms.length; i++) {
      var word = searchterms[i];
      var files = [];
      var _o = [
        {files: terms[word], score: Scorer.term},
        {files: titleterms[word], score: Scorer.title}
      ];
      // add support for partial matches
      if (word.length > 2) {
        var word_regex = this.escapeRegExp(word);
        for (var w in terms) {
          if (w.match(word_regex) && !terms[word]) {
            _o.push({files: terms[w], score: Scorer.partialTerm})
          }
        }
        for (var w in titleterms) {
          if (w.match(word_regex) && !titleterms[word]) {
              _o.push({files: titleterms[w], score: Scorer.partialTitle})
          }
        }
      }

      // no match but word was a required one
      if ($u.every(_o, function(o){return o.files === undefined;})) {
        break;
      }
      // found search word in contents
      $u.each(_o, function(o) {
        var _files = o.files;
        if (_files === undefined)
          return

        if (_files.length === undefined)
          _files = [_files];
        files = files.concat(_files);

        // set score for the word in each file to Scorer.term
        for (j = 0; j < _files.length; j++) {
          file = _files[j];
          if (!(file in scoreMap))
            scoreMap[file] = {};
          scoreMap[file][word] = o.score;
        }
      });

      // create the mapping
      for (j = 0; j < files.length; j++) {
        file = files[j];
        if (file in fileMap && fileMap[file].indexOf(word) === -1)
          fileMap[file].push(word);
        else
          fileMap[file] = [word];
      }
    }

    // now check if the files don't contain excluded terms
    for (file in fileMap) {
      var valid = true;

      // check if all requirements are matched
      var filteredTermCount = // as search terms with length < 3 are discarded: ignore
        searchterms.filter(function(term){return term.length > 2}).length
      if (
        fileMap[file].length != searchterms.length &&
        fileMap[file].length != filteredTermCount
      ) continue;

      // ensure that none of the excluded terms is in the search result
      for (i = 0; i < excluded.length; i++) {
        if (terms[excluded[i]] == file ||
            titleterms[excluded[i]] == file ||
            $u.contains(terms[excluded[i]] || [], file) ||
            $u.contains(titleterms[excluded[i]] || [], file)) {
          valid = false;
          break;
        }
      }

      // if we have still a valid result we can add it to the result list
      if (valid) {
        // select one (max) score for the file.
        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
        results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
      }
    }
    return results;
  },

  /**
   * helper function to return a node containing the
   * search summary for a given text. keywords is a list
   * of stemmed words, hlwords is the list of normal, unstemmed
   * words. the first one is used to find the occurrence, the
   * latter for highlighting it.
   */
  makeSearchSummary : function(htmlText, keywords, hlwords) {
    var text = Search.htmlToText(htmlText);
    var textLower = text.toLowerCase();
    var start = 0;
    $.each(keywords, function() {
      var i = textLower.indexOf(this.toLowerCase());
      if (i > -1)
        start = i;
    });
    start = Math.max(start - 120, 0);
    var excerpt = ((start > 0) ? '...' : '') +
      $.trim(text.substr(start, 240)) +
      ((start + 240 - text.length) ? '...' : '');
    var rv = $('<div class="context"></div>').text(excerpt);
    $.each(hlwords, function() {
      rv = rv.highlightText(this, 'highlighted');
    });
    return rv;
  }
};

$(document).ready(function() {
  Search.init();
});

Added build/html/_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var initTriggerNavBar=()=>{if($(window).width()<768){$("#navbar-toggler").trigger("click")}}
var scrollToActive=()=>{var navbar=document.getElementById('site-navigation')
var active_pages=navbar.querySelectorAll(".active")
var active_page=active_pages[active_pages.length-1]
if(active_page!==undefined&&active_page.offsetTop>($(window).height()*.5)){navbar.scrollTop=active_page.offsetTop-($(window).height()*.2)}}
var sbRunWhenDOMLoaded=cb=>{if(document.readyState!='loading'){cb()}else if(document.addEventListener){document.addEventListener('DOMContentLoaded',cb)}else{document.attachEvent('onreadystatechange',function(){if(document.readyState=='complete')cb()})}}
function toggleFullScreen(){var navToggler=$("#navbar-toggler");if(!document.fullscreenElement){document.documentElement.requestFullscreen();if(!navToggler.hasClass("collapsed")){navToggler.click();}}else{if(document.exitFullscreen){document.exitFullscreen();if(navToggler.hasClass("collapsed")){navToggler.click();}}}}
var initTooltips=()=>{$(document).ready(function(){$('[data-toggle="tooltip"]').tooltip();});}
var initTocHide=()=>{var scrollTimeout;var throttle=200;var tocHeight=$("#bd-toc-nav").outerHeight(true)+$(".bd-toc").outerHeight(true);var hideTocAfter=tocHeight+200;var checkTocScroll=function(){var margin_content=$(".margin, .tag_margin, .full-width, .full_width, .tag_full-width, .tag_full_width, .sidebar, .tag_sidebar, .popout, .tag_popout");margin_content.each((index,item)=>{var topOffset=$(item).offset().top-$(window).scrollTop();var bottomOffset=topOffset+$(item).outerHeight(true);var topOverlaps=((topOffset>=0)&&(topOffset<hideTocAfter));var bottomOverlaps=((bottomOffset>=0)&&(bottomOffset<hideTocAfter));var removeToc=(topOverlaps||bottomOverlaps);if(removeToc&&window.pageYOffset>20){$("div.bd-toc").removeClass("show")
return false}else{$("div.bd-toc").addClass("show")};})};var manageScrolledClassOnBody=function(){if(window.scrollY>0){document.body.classList.add("scrolled");}else{document.body.classList.remove("scrolled");}}
$(window).on('scroll',function(){if(!scrollTimeout){scrollTimeout=setTimeout(function(){checkTocScroll();manageScrolledClassOnBody();scrollTimeout=null;},throttle);}});}
var initThebeSBT=()=>{var title=$("div.section h1")[0]
if(!$(title).next().hasClass("thebe-launch-button")){$("<button class='thebe-launch-button'></button>").insertAfter($(title))}
initThebe();}
sbRunWhenDOMLoaded(initTooltips)
sbRunWhenDOMLoaded(initTriggerNavBar)
sbRunWhenDOMLoaded(scrollToActive)
sbRunWhenDOMLoaded(initTocHide)

Added build/html/_static/sphinx-book-theme.css.

cannot compute difference between binary files

Added build/html/_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css.

cannot compute difference between binary files

Added build/html/_static/underscore-1.12.0.js.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define('underscore', factory) :
  (global = global || self, (function () {
    var current = global._;
    var exports = global._ = factory();
    exports.noConflict = function () { global._ = current; return exports; };
  }()));
}(this, (function () {
  //     Underscore.js 1.12.0
  //     https://underscorejs.org
  //     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  //     Underscore may be freely distributed under the MIT license.

  // Current version.
  var VERSION = '1.12.0';

  // Establish the root object, `window` (`self`) in the browser, `global`
  // on the server, or `this` in some virtual machines. We use `self`
  // instead of `window` for `WebWorker` support.
  var root = typeof self == 'object' && self.self === self && self ||
            typeof global == 'object' && global.global === global && global ||
            Function('return this')() ||
            {};

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

  // Create quick reference variables for speed access to core prototypes.
  var push = ArrayProto.push,
      slice = ArrayProto.slice,
      toString = ObjProto.toString,
      hasOwnProperty = ObjProto.hasOwnProperty;

  // Modern feature detection.
  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
      supportsDataView = typeof DataView !== 'undefined';

  // All **ECMAScript 5+** native function implementations that we hope to use
  // are declared here.
  var nativeIsArray = Array.isArray,
      nativeKeys = Object.keys,
      nativeCreate = Object.create,
      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;

  // Create references to these builtin functions because we override them.
  var _isNaN = isNaN,
      _isFinite = isFinite;

  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

  // The largest integer that can be represented exactly.
  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;

  // Some functions take a variable number of arguments, or a few expected
  // arguments at the beginning and then a variable number of values to operate
  // on. This helper accumulates all remaining arguments past the function’s
  // argument length (or an explicit `startIndex`), into an array that becomes
  // the last argument. Similar to ES6’s "rest parameter".
  function restArguments(func, startIndex) {
    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    return function() {
      var length = Math.max(arguments.length - startIndex, 0),
          rest = Array(length),
          index = 0;
      for (; index < length; index++) {
        rest[index] = arguments[index + startIndex];
      }
      switch (startIndex) {
        case 0: return func.call(this, rest);
        case 1: return func.call(this, arguments[0], rest);
        case 2: return func.call(this, arguments[0], arguments[1], rest);
      }
      var args = Array(startIndex + 1);
      for (index = 0; index < startIndex; index++) {
        args[index] = arguments[index];
      }
      args[startIndex] = rest;
      return func.apply(this, args);
    };
  }

  // Is a given variable an object?
  function isObject(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  }

  // Is a given value equal to null?
  function isNull(obj) {
    return obj === null;
  }

  // Is a given variable undefined?
  function isUndefined(obj) {
    return obj === void 0;
  }

  // Is a given value a boolean?
  function isBoolean(obj) {
    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  }

  // Is a given value a DOM element?
  function isElement(obj) {
    return !!(obj && obj.nodeType === 1);
  }

  // Internal function for creating a `toString`-based type tester.
  function tagTester(name) {
    var tag = '[object ' + name + ']';
    return function(obj) {
      return toString.call(obj) === tag;
    };
  }

  var isString = tagTester('String');

  var isNumber = tagTester('Number');

  var isDate = tagTester('Date');

  var isRegExp = tagTester('RegExp');

  var isError = tagTester('Error');

  var isSymbol = tagTester('Symbol');

  var isArrayBuffer = tagTester('ArrayBuffer');

  var isFunction = tagTester('Function');

  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
  var nodelist = root.document && root.document.childNodes;
  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    isFunction = function(obj) {
      return typeof obj == 'function' || false;
    };
  }

  var isFunction$1 = isFunction;

  var hasObjectTag = tagTester('Object');

  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
  // In IE 11, the most common among them, this problem also applies to
  // `Map`, `WeakMap` and `Set`.
  var hasStringTagBug = (
        supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
      ),
      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));

  var isDataView = tagTester('DataView');

  // In IE 10 - Edge 13, we need a different heuristic
  // to determine whether an object is a `DataView`.
  function ie10IsDataView(obj) {
    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
  }

  var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);

  // Is a given value an array?
  // Delegates to ECMA5's native `Array.isArray`.
  var isArray = nativeIsArray || tagTester('Array');

  // Internal function to check whether `key` is an own property name of `obj`.
  function has(obj, key) {
    return obj != null && hasOwnProperty.call(obj, key);
  }

  var isArguments = tagTester('Arguments');

  // Define a fallback version of the method in browsers (ahem, IE < 9), where
  // there isn't any inspectable "Arguments" type.
  (function() {
    if (!isArguments(arguments)) {
      isArguments = function(obj) {
        return has(obj, 'callee');
      };
    }
  }());

  var isArguments$1 = isArguments;

  // Is a given object a finite number?
  function isFinite$1(obj) {
    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
  }

  // Is the given value `NaN`?
  function isNaN$1(obj) {
    return isNumber(obj) && _isNaN(obj);
  }

  // Predicate-generating function. Often useful outside of Underscore.
  function constant(value) {
    return function() {
      return value;
    };
  }

  // Common internal logic for `isArrayLike` and `isBufferLike`.
  function createSizePropertyCheck(getSizeProperty) {
    return function(collection) {
      var sizeProperty = getSizeProperty(collection);
      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
    }
  }

  // Internal helper to generate a function to obtain property `key` from `obj`.
  function shallowProperty(key) {
    return function(obj) {
      return obj == null ? void 0 : obj[key];
    };
  }

  // Internal helper to obtain the `byteLength` property of an object.
  var getByteLength = shallowProperty('byteLength');

  // Internal helper to determine whether we should spend extensive checks against
  // `ArrayBuffer` et al.
  var isBufferLike = createSizePropertyCheck(getByteLength);

  // Is a given value a typed array?
  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
  function isTypedArray(obj) {
    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
    // Otherwise, fall back on the above regular expression.
    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
  }

  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);

  // Internal helper to obtain the `length` property of an object.
  var getLength = shallowProperty('length');

  // Internal helper to create a simple lookup structure.
  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
  // circular imports. `emulatedSet` is a one-off solution that only works for
  // arrays of strings.
  function emulatedSet(keys) {
    var hash = {};
    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
    return {
      contains: function(key) { return hash[key]; },
      push: function(key) {
        hash[key] = true;
        return keys.push(key);
      }
    };
  }

  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
  // needed.
  function collectNonEnumProps(obj, keys) {
    keys = emulatedSet(keys);
    var nonEnumIdx = nonEnumerableProps.length;
    var constructor = obj.constructor;
    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;

    // Constructor is a special case.
    var prop = 'constructor';
    if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);

    while (nonEnumIdx--) {
      prop = nonEnumerableProps[nonEnumIdx];
      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
        keys.push(prop);
      }
    }
  }

  // Retrieve the names of an object's own properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`.
  function keys(obj) {
    if (!isObject(obj)) return [];
    if (nativeKeys) return nativeKeys(obj);
    var keys = [];
    for (var key in obj) if (has(obj, key)) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  }

  // Is a given array, string, or object empty?
  // An "empty" object has no enumerable own-properties.
  function isEmpty(obj) {
    if (obj == null) return true;
    // Skip the more expensive `toString`-based type checks if `obj` has no
    // `.length`.
    var length = getLength(obj);
    if (typeof length == 'number' && (
      isArray(obj) || isString(obj) || isArguments$1(obj)
    )) return length === 0;
    return getLength(keys(obj)) === 0;
  }

  // Returns whether an object has a given set of `key:value` pairs.
  function isMatch(object, attrs) {
    var _keys = keys(attrs), length = _keys.length;
    if (object == null) return !length;
    var obj = Object(object);
    for (var i = 0; i < length; i++) {
      var key = _keys[i];
      if (attrs[key] !== obj[key] || !(key in obj)) return false;
    }
    return true;
  }

  // If Underscore is called as a function, it returns a wrapped object that can
  // be used OO-style. This wrapper holds altered versions of all functions added
  // through `_.mixin`. Wrapped objects may be chained.
  function _(obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  }

  _.VERSION = VERSION;

  // Extracts the result from a wrapped and chained object.
  _.prototype.value = function() {
    return this._wrapped;
  };

  // Provide unwrapping proxies for some methods used in engine operations
  // such as arithmetic and JSON stringification.
  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

  _.prototype.toString = function() {
    return String(this._wrapped);
  };

  // Internal function to wrap or shallow-copy an ArrayBuffer,
  // typed array or DataView to a new view, reusing the buffer.
  function toBufferView(bufferSource) {
    return new Uint8Array(
      bufferSource.buffer || bufferSource,
      bufferSource.byteOffset || 0,
      getByteLength(bufferSource)
    );
  }

  // We use this string twice, so give it a name for minification.
  var tagDataView = '[object DataView]';

  // Internal recursive comparison function for `_.isEqual`.
  function eq(a, b, aStack, bStack) {
    // Identical objects are equal. `0 === -0`, but they aren't identical.
    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
    if (a === b) return a !== 0 || 1 / a === 1 / b;
    // `null` or `undefined` only equal to itself (strict comparison).
    if (a == null || b == null) return false;
    // `NaN`s are equivalent, but non-reflexive.
    if (a !== a) return b !== b;
    // Exhaust primitive checks
    var type = typeof a;
    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    return deepEq(a, b, aStack, bStack);
  }

  // Internal recursive comparison function for `_.isEqual`.
  function deepEq(a, b, aStack, bStack) {
    // Unwrap any wrapped objects.
    if (a instanceof _) a = a._wrapped;
    if (b instanceof _) b = b._wrapped;
    // Compare `[[Class]]` names.
    var className = toString.call(a);
    if (className !== toString.call(b)) return false;
    // Work around a bug in IE 10 - Edge 13.
    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
      if (!isDataView$1(b)) return false;
      className = tagDataView;
    }
    switch (className) {
      // These types are compared by value.
      case '[object RegExp]':
        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
      case '[object String]':
        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
        // equivalent to `new String("5")`.
        return '' + a === '' + b;
      case '[object Number]':
        // `NaN`s are equivalent, but non-reflexive.
        // Object(NaN) is equivalent to NaN.
        if (+a !== +a) return +b !== +b;
        // An `egal` comparison is performed for other numeric values.
        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
      case '[object Date]':
      case '[object Boolean]':
        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
        // millisecond representations. Note that invalid dates with millisecond representations
        // of `NaN` are not equivalent.
        return +a === +b;
      case '[object Symbol]':
        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
      case '[object ArrayBuffer]':
      case tagDataView:
        // Coerce to typed array so we can fall through.
        return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
    }

    var areArrays = className === '[object Array]';
    if (!areArrays && isTypedArray$1(a)) {
        var byteLength = getByteLength(a);
        if (byteLength !== getByteLength(b)) return false;
        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
        areArrays = true;
    }
    if (!areArrays) {
      if (typeof a != 'object' || typeof b != 'object') return false;

      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
      // from different frames are.
      var aCtor = a.constructor, bCtor = b.constructor;
      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
                               isFunction$1(bCtor) && bCtor instanceof bCtor)
                          && ('constructor' in a && 'constructor' in b)) {
        return false;
      }
    }
    // Assume equality for cyclic structures. The algorithm for detecting cyclic
    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

    // Initializing stack of traversed objects.
    // It's done here since we only need them for objects and arrays comparison.
    aStack = aStack || [];
    bStack = bStack || [];
    var length = aStack.length;
    while (length--) {
      // Linear search. Performance is inversely proportional to the number of
      // unique nested structures.
      if (aStack[length] === a) return bStack[length] === b;
    }

    // Add the first object to the stack of traversed objects.
    aStack.push(a);
    bStack.push(b);

    // Recursively compare objects and arrays.
    if (areArrays) {
      // Compare array lengths to determine if a deep comparison is necessary.
      length = a.length;
      if (length !== b.length) return false;
      // Deep compare the contents, ignoring non-numeric properties.
      while (length--) {
        if (!eq(a[length], b[length], aStack, bStack)) return false;
      }
    } else {
      // Deep compare objects.
      var _keys = keys(a), key;
      length = _keys.length;
      // Ensure that both objects contain the same number of properties before comparing deep equality.
      if (keys(b).length !== length) return false;
      while (length--) {
        // Deep compare each member
        key = _keys[length];
        if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
      }
    }
    // Remove the first object from the stack of traversed objects.
    aStack.pop();
    bStack.pop();
    return true;
  }

  // Perform a deep comparison to check if two objects are equal.
  function isEqual(a, b) {
    return eq(a, b);
  }

  // Retrieve all the enumerable property names of an object.
  function allKeys(obj) {
    if (!isObject(obj)) return [];
    var keys = [];
    for (var key in obj) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  }

  // Since the regular `Object.prototype.toString` type tests don't work for
  // some types in IE 11, we use a fingerprinting heuristic instead, based
  // on the methods. It's not great, but it's the best we got.
  // The fingerprint method lists are defined below.
  function ie11fingerprint(methods) {
    var length = getLength(methods);
    return function(obj) {
      if (obj == null) return false;
      // `Map`, `WeakMap` and `Set` have no enumerable keys.
      var keys = allKeys(obj);
      if (getLength(keys)) return false;
      for (var i = 0; i < length; i++) {
        if (!isFunction$1(obj[methods[i]])) return false;
      }
      // If we are testing against `WeakMap`, we need to ensure that
      // `obj` doesn't have a `forEach` method in order to distinguish
      // it from a regular `Map`.
      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
    };
  }

  // In the interest of compact minification, we write
  // each string in the fingerprints only once.
  var forEachName = 'forEach',
      hasName = 'has',
      commonInit = ['clear', 'delete'],
      mapTail = ['get', hasName, 'set'];

  // `Map`, `WeakMap` and `Set` each have slightly different
  // combinations of the above sublists.
  var mapMethods = commonInit.concat(forEachName, mapTail),
      weakMapMethods = commonInit.concat(mapTail),
      setMethods = ['add'].concat(commonInit, forEachName, hasName);

  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');

  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');

  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');

  var isWeakSet = tagTester('WeakSet');

  // Retrieve the values of an object's properties.
  function values(obj) {
    var _keys = keys(obj);
    var length = _keys.length;
    var values = Array(length);
    for (var i = 0; i < length; i++) {
      values[i] = obj[_keys[i]];
    }
    return values;
  }

  // Convert an object into a list of `[key, value]` pairs.
  // The opposite of `_.object` with one argument.
  function pairs(obj) {
    var _keys = keys(obj);
    var length = _keys.length;
    var pairs = Array(length);
    for (var i = 0; i < length; i++) {
      pairs[i] = [_keys[i], obj[_keys[i]]];
    }
    return pairs;
  }

  // Invert the keys and values of an object. The values must be serializable.
  function invert(obj) {
    var result = {};
    var _keys = keys(obj);
    for (var i = 0, length = _keys.length; i < length; i++) {
      result[obj[_keys[i]]] = _keys[i];
    }
    return result;
  }

  // Return a sorted list of the function names available on the object.
  function functions(obj) {
    var names = [];
    for (var key in obj) {
      if (isFunction$1(obj[key])) names.push(key);
    }
    return names.sort();
  }

  // An internal function for creating assigner functions.
  function createAssigner(keysFunc, defaults) {
    return function(obj) {
      var length = arguments.length;
      if (defaults) obj = Object(obj);
      if (length < 2 || obj == null) return obj;
      for (var index = 1; index < length; index++) {
        var source = arguments[index],
            keys = keysFunc(source),
            l = keys.length;
        for (var i = 0; i < l; i++) {
          var key = keys[i];
          if (!defaults || obj[key] === void 0) obj[key] = source[key];
        }
      }
      return obj;
    };
  }

  // Extend a given object with all the properties in passed-in object(s).
  var extend = createAssigner(allKeys);

  // Assigns a given object with all the own properties in the passed-in
  // object(s).
  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
  var extendOwn = createAssigner(keys);

  // Fill in a given object with default properties.
  var defaults = createAssigner(allKeys, true);

  // Create a naked function reference for surrogate-prototype-swapping.
  function ctor() {
    return function(){};
  }

  // An internal function for creating a new object that inherits from another.
  function baseCreate(prototype) {
    if (!isObject(prototype)) return {};
    if (nativeCreate) return nativeCreate(prototype);
    var Ctor = ctor();
    Ctor.prototype = prototype;
    var result = new Ctor;
    Ctor.prototype = null;
    return result;
  }

  // Creates an object that inherits from the given prototype object.
  // If additional properties are provided then they will be added to the
  // created object.
  function create(prototype, props) {
    var result = baseCreate(prototype);
    if (props) extendOwn(result, props);
    return result;
  }

  // Create a (shallow-cloned) duplicate of an object.
  function clone(obj) {
    if (!isObject(obj)) return obj;
    return isArray(obj) ? obj.slice() : extend({}, obj);
  }

  // Invokes `interceptor` with the `obj` and then returns `obj`.
  // The primary purpose of this method is to "tap into" a method chain, in
  // order to perform operations on intermediate results within the chain.
  function tap(obj, interceptor) {
    interceptor(obj);
    return obj;
  }

  // Normalize a (deep) property `path` to array.
  // Like `_.iteratee`, this function can be customized.
  function toPath(path) {
    return isArray(path) ? path : [path];
  }
  _.toPath = toPath;

  // Internal wrapper for `_.toPath` to enable minification.
  // Similar to `cb` for `_.iteratee`.
  function toPath$1(path) {
    return _.toPath(path);
  }

  // Internal function to obtain a nested property in `obj` along `path`.
  function deepGet(obj, path) {
    var length = path.length;
    for (var i = 0; i < length; i++) {
      if (obj == null) return void 0;
      obj = obj[path[i]];
    }
    return length ? obj : void 0;
  }

  // Get the value of the (deep) property on `path` from `object`.
  // If any property in `path` does not exist or if the value is
  // `undefined`, return `defaultValue` instead.
  // The `path` is normalized through `_.toPath`.
  function get(object, path, defaultValue) {
    var value = deepGet(object, toPath$1(path));
    return isUndefined(value) ? defaultValue : value;
  }

  // Shortcut function for checking if an object has a given property directly on
  // itself (in other words, not on a prototype). Unlike the internal `has`
  // function, this public version can also traverse nested properties.
  function has$1(obj, path) {
    path = toPath$1(path);
    var length = path.length;
    for (var i = 0; i < length; i++) {
      var key = path[i];
      if (!has(obj, key)) return false;
      obj = obj[key];
    }
    return !!length;
  }

  // Keep the identity function around for default iteratees.
  function identity(value) {
    return value;
  }

  // Returns a predicate for checking whether an object has a given set of
  // `key:value` pairs.
  function matcher(attrs) {
    attrs = extendOwn({}, attrs);
    return function(obj) {
      return isMatch(obj, attrs);
    };
  }

  // Creates a function that, when passed an object, will traverse that object’s
  // properties down the given `path`, specified as an array of keys or indices.
  function property(path) {
    path = toPath$1(path);
    return function(obj) {
      return deepGet(obj, path);
    };
  }

  // Internal function that returns an efficient (for current engines) version
  // of the passed-in callback, to be repeatedly applied in other Underscore
  // functions.
  function optimizeCb(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      // The 2-argument case is omitted because we’re not using it.
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  }

  // An internal function to generate callbacks that can be applied to each
  // element in a collection, returning the desired result β€” either `_.identity`,
  // an arbitrary callback, a property matcher, or a property accessor.
  function baseIteratee(value, context, argCount) {
    if (value == null) return identity;
    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
    if (isObject(value) && !isArray(value)) return matcher(value);
    return property(value);
  }

  // External wrapper for our callback generator. Users may customize
  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
  // This abstraction hides the internal-only `argCount` argument.
  function iteratee(value, context) {
    return baseIteratee(value, context, Infinity);
  }
  _.iteratee = iteratee;

  // The function we call internally to generate a callback. It invokes
  // `_.iteratee` if overridden, otherwise `baseIteratee`.
  function cb(value, context, argCount) {
    if (_.iteratee !== iteratee) return _.iteratee(value, context);
    return baseIteratee(value, context, argCount);
  }

  // Returns the results of applying the `iteratee` to each element of `obj`.
  // In contrast to `_.map` it returns an object.
  function mapObject(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var _keys = keys(obj),
        length = _keys.length,
        results = {};
    for (var index = 0; index < length; index++) {
      var currentKey = _keys[index];
      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  }

  // Predicate-generating function. Often useful outside of Underscore.
  function noop(){}

  // Generates a function for a given object that returns a given property.
  function propertyOf(obj) {
    if (obj == null) return noop;
    return function(path) {
      return get(obj, path);
    };
  }

  // Run a function **n** times.
  function times(n, iteratee, context) {
    var accum = Array(Math.max(0, n));
    iteratee = optimizeCb(iteratee, context, 1);
    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    return accum;
  }

  // Return a random integer between `min` and `max` (inclusive).
  function random(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  }

  // A (possibly faster) way to get the current timestamp as an integer.
  var now = Date.now || function() {
    return new Date().getTime();
  };

  // Internal helper to generate functions for escaping and unescaping strings
  // to/from HTML interpolation.
  function createEscaper(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped.
    var source = '(?:' + keys(map).join('|') + ')';
    var testRegexp = RegExp(source);
    var replaceRegexp = RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  }

  // Internal list of HTML entities for escaping.
  var escapeMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;',
    '`': '&#x60;'
  };

  // Function for escaping strings to HTML interpolation.
  var _escape = createEscaper(escapeMap);

  // Internal list of HTML entities for unescaping.
  var unescapeMap = invert(escapeMap);

  // Function for unescaping strings from HTML interpolation.
  var _unescape = createEscaper(unescapeMap);

  // By default, Underscore uses ERB-style template delimiters. Change the
  // following template settings to use alternative delimiters.
  var templateSettings = _.templateSettings = {
    evaluate: /<%([\s\S]+?)%>/g,
    interpolate: /<%=([\s\S]+?)%>/g,
    escape: /<%-([\s\S]+?)%>/g
  };

  // When customizing `_.templateSettings`, if you don't want to define an
  // interpolation, evaluation or escaping regex, we need one that is
  // guaranteed not to match.
  var noMatch = /(.)^/;

  // Certain characters need to be escaped so that they can be put into a
  // string literal.
  var escapes = {
    "'": "'",
    '\\': '\\',
    '\r': 'r',
    '\n': 'n',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

  function escapeChar(match) {
    return '\\' + escapes[match];
  }

  // JavaScript micro-templating, similar to John Resig's implementation.
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
  // and correctly escapes quotes within interpolated code.
  // NB: `oldSettings` only exists for backwards compatibility.
  function template(text, settings, oldSettings) {
    if (!settings && oldSettings) settings = oldSettings;
    settings = defaults({}, settings, _.templateSettings);

    // Combine delimiters into one regular expression via alternation.
    var matcher = RegExp([
      (settings.escape || noMatch).source,
      (settings.interpolate || noMatch).source,
      (settings.evaluate || noMatch).source
    ].join('|') + '|$', 'g');

    // Compile the template source, escaping string literals appropriately.
    var index = 0;
    var source = "__p+='";
    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
      index = offset + match.length;

      if (escape) {
        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
      } else if (interpolate) {
        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
      } else if (evaluate) {
        source += "';\n" + evaluate + "\n__p+='";
      }

      // Adobe VMs need the match returned to produce the correct offset.
      return match;
    });
    source += "';\n";

    // If a variable is not specified, place data values in local scope.
    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

    source = "var __t,__p='',__j=Array.prototype.join," +
      "print=function(){__p+=__j.call(arguments,'');};\n" +
      source + 'return __p;\n';

    var render;
    try {
      render = new Function(settings.variable || 'obj', '_', source);
    } catch (e) {
      e.source = source;
      throw e;
    }

    var template = function(data) {
      return render.call(this, data, _);
    };

    // Provide the compiled source as a convenience for precompilation.
    var argument = settings.variable || 'obj';
    template.source = 'function(' + argument + '){\n' + source + '}';

    return template;
  }

  // Traverses the children of `obj` along `path`. If a child is a function, it
  // is invoked with its parent as context. Returns the value of the final
  // child, or `fallback` if any child is undefined.
  function result(obj, path, fallback) {
    path = toPath$1(path);
    var length = path.length;
    if (!length) {
      return isFunction$1(fallback) ? fallback.call(obj) : fallback;
    }
    for (var i = 0; i < length; i++) {
      var prop = obj == null ? void 0 : obj[path[i]];
      if (prop === void 0) {
        prop = fallback;
        i = length; // Ensure we don't continue iterating.
      }
      obj = isFunction$1(prop) ? prop.call(obj) : prop;
    }
    return obj;
  }

  // Generate a unique integer id (unique within the entire client session).
  // Useful for temporary DOM ids.
  var idCounter = 0;
  function uniqueId(prefix) {
    var id = ++idCounter + '';
    return prefix ? prefix + id : id;
  }

  // Start chaining a wrapped Underscore object.
  function chain(obj) {
    var instance = _(obj);
    instance._chain = true;
    return instance;
  }

  // Internal function to execute `sourceFunc` bound to `context` with optional
  // `args`. Determines whether to execute a function as a constructor or as a
  // normal function.
  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
    var self = baseCreate(sourceFunc.prototype);
    var result = sourceFunc.apply(self, args);
    if (isObject(result)) return result;
    return self;
  }

  // Partially apply a function by creating a version that has had some of its
  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
  // as a placeholder by default, allowing any combination of arguments to be
  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
  var partial = restArguments(function(func, boundArgs) {
    var placeholder = partial.placeholder;
    var bound = function() {
      var position = 0, length = boundArgs.length;
      var args = Array(length);
      for (var i = 0; i < length; i++) {
        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
      }
      while (position < arguments.length) args.push(arguments[position++]);
      return executeBound(func, bound, this, this, args);
    };
    return bound;
  });

  partial.placeholder = _;

  // Create a function bound to a given object (assigning `this`, and arguments,
  // optionally).
  var bind = restArguments(function(func, context, args) {
    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
    var bound = restArguments(function(callArgs) {
      return executeBound(func, bound, context, this, args.concat(callArgs));
    });
    return bound;
  });

  // Internal helper for collection methods to determine whether a collection
  // should be iterated as an array or as an object.
  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
  var isArrayLike = createSizePropertyCheck(getLength);

  // Internal implementation of a recursive `flatten` function.
  function flatten(input, depth, strict, output) {
    output = output || [];
    if (!depth && depth !== 0) {
      depth = Infinity;
    } else if (depth <= 0) {
      return output.concat(input);
    }
    var idx = output.length;
    for (var i = 0, length = getLength(input); i < length; i++) {
      var value = input[i];
      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
        // Flatten current level of array or arguments object.
        if (depth > 1) {
          flatten(value, depth - 1, strict, output);
          idx = output.length;
        } else {
          var j = 0, len = value.length;
          while (j < len) output[idx++] = value[j++];
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
  }

  // Bind a number of an object's methods to that object. Remaining arguments
  // are the method names to be bound. Useful for ensuring that all callbacks
  // defined on an object belong to it.
  var bindAll = restArguments(function(obj, keys) {
    keys = flatten(keys, false, false);
    var index = keys.length;
    if (index < 1) throw new Error('bindAll must be passed function names');
    while (index--) {
      var key = keys[index];
      obj[key] = bind(obj[key], obj);
    }
    return obj;
  });

  // Memoize an expensive function by storing its results.
  function memoize(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
      if (!has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[address];
    };
    memoize.cache = {};
    return memoize;
  }

  // Delays a function for the given number of milliseconds, and then calls
  // it with the arguments supplied.
  var delay = restArguments(function(func, wait, args) {
    return setTimeout(function() {
      return func.apply(null, args);
    }, wait);
  });

  // Defers a function, scheduling it to run after the current call stack has
  // cleared.
  var defer = partial(delay, _, 1);

  // Returns a function, that, when invoked, will only be triggered at most once
  // during a given window of time. Normally, the throttled function will run
  // as much as it can, without ever going more than once per `wait` duration;
  // but if you'd like to disable the execution on the leading edge, pass
  // `{leading: false}`. To disable execution on the trailing edge, ditto.
  function throttle(func, wait, options) {
    var timeout, context, args, result;
    var previous = 0;
    if (!options) options = {};

    var later = function() {
      previous = options.leading === false ? 0 : now();
      timeout = null;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    };

    var throttled = function() {
      var _now = now();
      if (!previous && options.leading === false) previous = _now;
      var remaining = wait - (_now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0 || remaining > wait) {
        if (timeout) {
          clearTimeout(timeout);
          timeout = null;
        }
        previous = _now;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      } else if (!timeout && options.trailing !== false) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };

    throttled.cancel = function() {
      clearTimeout(timeout);
      previous = 0;
      timeout = context = args = null;
    };

    return throttled;
  }

  // When a sequence of calls of the returned function ends, the argument
  // function is triggered. The end of a sequence is defined by the `wait`
  // parameter. If `immediate` is passed, the argument function will be
  // triggered at the beginning of the sequence instead of at the end.
  function debounce(func, wait, immediate) {
    var timeout, previous, args, result, context;

    var later = function() {
      var passed = now() - previous;
      if (wait > passed) {
        timeout = setTimeout(later, wait - passed);
      } else {
        timeout = null;
        if (!immediate) result = func.apply(context, args);
        // This check is needed because `func` can recursively invoke `debounced`.
        if (!timeout) args = context = null;
      }
    };

    var debounced = restArguments(function(_args) {
      context = this;
      args = _args;
      previous = now();
      if (!timeout) {
        timeout = setTimeout(later, wait);
        if (immediate) result = func.apply(context, args);
      }
      return result;
    });

    debounced.cancel = function() {
      clearTimeout(timeout);
      timeout = args = context = null;
    };

    return debounced;
  }

  // Returns the first function passed as an argument to the second,
  // allowing you to adjust arguments, run code before and after, and
  // conditionally execute the original function.
  function wrap(func, wrapper) {
    return partial(wrapper, func);
  }

  // Returns a negated version of the passed-in predicate.
  function negate(predicate) {
    return function() {
      return !predicate.apply(this, arguments);
    };
  }

  // Returns a function that is the composition of a list of functions, each
  // consuming the return value of the function that follows.
  function compose() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
      var i = start;
      var result = args[start].apply(this, arguments);
      while (i--) result = args[i].call(this, result);
      return result;
    };
  }

  // Returns a function that will only be executed on and after the Nth call.
  function after(times, func) {
    return function() {
      if (--times < 1) {
        return func.apply(this, arguments);
      }
    };
  }

  // Returns a function that will only be executed up to (but not including) the
  // Nth call.
  function before(times, func) {
    var memo;
    return function() {
      if (--times > 0) {
        memo = func.apply(this, arguments);
      }
      if (times <= 1) func = null;
      return memo;
    };
  }

  // Returns a function that will be executed at most one time, no matter how
  // often you call it. Useful for lazy initialization.
  var once = partial(before, 2);

  // Returns the first key on an object that passes a truth test.
  function findKey(obj, predicate, context) {
    predicate = cb(predicate, context);
    var _keys = keys(obj), key;
    for (var i = 0, length = _keys.length; i < length; i++) {
      key = _keys[i];
      if (predicate(obj[key], key, obj)) return key;
    }
  }

  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
  function createPredicateIndexFinder(dir) {
    return function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  }

  // Returns the first index on an array-like that passes a truth test.
  var findIndex = createPredicateIndexFinder(1);

  // Returns the last index on an array-like that passes a truth test.
  var findLastIndex = createPredicateIndexFinder(-1);

  // Use a comparator function to figure out the smallest index at which
  // an object should be inserted so as to maintain order. Uses binary search.
  function sortedIndex(array, obj, iteratee, context) {
    iteratee = cb(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = getLength(array);
    while (low < high) {
      var mid = Math.floor((low + high) / 2);
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
  }

  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
  function createIndexFinder(dir, predicateFind, sortedIndex) {
    return function(array, item, idx) {
      var i = 0, length = getLength(array);
      if (typeof idx == 'number') {
        if (dir > 0) {
          i = idx >= 0 ? idx : Math.max(idx + length, i);
        } else {
          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
        }
      } else if (sortedIndex && idx && length) {
        idx = sortedIndex(array, item);
        return array[idx] === item ? idx : -1;
      }
      if (item !== item) {
        idx = predicateFind(slice.call(array, i, length), isNaN$1);
        return idx >= 0 ? idx + i : -1;
      }
      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
        if (array[idx] === item) return idx;
      }
      return -1;
    };
  }

  // Return the position of the first occurrence of an item in an array,
  // or -1 if the item is not included in the array.
  // If the array is large and already in sort order, pass `true`
  // for **isSorted** to use binary search.
  var indexOf = createIndexFinder(1, findIndex, sortedIndex);

  // Return the position of the last occurrence of an item in an array,
  // or -1 if the item is not included in the array.
  var lastIndexOf = createIndexFinder(-1, findLastIndex);

  // Return the first value which passes a truth test.
  function find(obj, predicate, context) {
    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
    var key = keyFinder(obj, predicate, context);
    if (key !== void 0 && key !== -1) return obj[key];
  }

  // Convenience version of a common use case of `_.find`: getting the first
  // object containing specific `key:value` pairs.
  function findWhere(obj, attrs) {
    return find(obj, matcher(attrs));
  }

  // The cornerstone for collection functions, an `each`
  // implementation, aka `forEach`.
  // Handles raw objects in addition to array-likes. Treats all
  // sparse array-likes as if they were dense.
  function each(obj, iteratee, context) {
    iteratee = optimizeCb(iteratee, context);
    var i, length;
    if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var _keys = keys(obj);
      for (i = 0, length = _keys.length; i < length; i++) {
        iteratee(obj[_keys[i]], _keys[i], obj);
      }
    }
    return obj;
  }

  // Return the results of applying the iteratee to each element.
  function map(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var _keys = !isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length,
        results = Array(length);
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  }

  // Internal helper to create a reducing function, iterating left or right.
  function createReduce(dir) {
    // Wrap code that reassigns argument variables in a separate function than
    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
    var reducer = function(obj, iteratee, memo, initial) {
      var _keys = !isArrayLike(obj) && keys(obj),
          length = (_keys || obj).length,
          index = dir > 0 ? 0 : length - 1;
      if (!initial) {
        memo = obj[_keys ? _keys[index] : index];
        index += dir;
      }
      for (; index >= 0 && index < length; index += dir) {
        var currentKey = _keys ? _keys[index] : index;
        memo = iteratee(memo, obj[currentKey], currentKey, obj);
      }
      return memo;
    };

    return function(obj, iteratee, memo, context) {
      var initial = arguments.length >= 3;
      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
    };
  }

  // **Reduce** builds up a single result from a list of values, aka `inject`,
  // or `foldl`.
  var reduce = createReduce(1);

  // The right-associative version of reduce, also known as `foldr`.
  var reduceRight = createReduce(-1);

  // Return all the elements that pass a truth test.
  function filter(obj, predicate, context) {
    var results = [];
    predicate = cb(predicate, context);
    each(obj, function(value, index, list) {
      if (predicate(value, index, list)) results.push(value);
    });
    return results;
  }

  // Return all the elements for which a truth test fails.
  function reject(obj, predicate, context) {
    return filter(obj, negate(cb(predicate)), context);
  }

  // Determine whether all of the elements pass a truth test.
  function every(obj, predicate, context) {
    predicate = cb(predicate, context);
    var _keys = !isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      if (!predicate(obj[currentKey], currentKey, obj)) return false;
    }
    return true;
  }

  // Determine if at least one element in the object passes a truth test.
  function some(obj, predicate, context) {
    predicate = cb(predicate, context);
    var _keys = !isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      if (predicate(obj[currentKey], currentKey, obj)) return true;
    }
    return false;
  }

  // Determine if the array or object contains a given item (using `===`).
  function contains(obj, item, fromIndex, guard) {
    if (!isArrayLike(obj)) obj = values(obj);
    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    return indexOf(obj, item, fromIndex) >= 0;
  }

  // Invoke a method (with arguments) on every item in a collection.
  var invoke = restArguments(function(obj, path, args) {
    var contextPath, func;
    if (isFunction$1(path)) {
      func = path;
    } else {
      path = toPath$1(path);
      contextPath = path.slice(0, -1);
      path = path[path.length - 1];
    }
    return map(obj, function(context) {
      var method = func;
      if (!method) {
        if (contextPath && contextPath.length) {
          context = deepGet(context, contextPath);
        }
        if (context == null) return void 0;
        method = context[path];
      }
      return method == null ? method : method.apply(context, args);
    });
  });

  // Convenience version of a common use case of `_.map`: fetching a property.
  function pluck(obj, key) {
    return map(obj, property(key));
  }

  // Convenience version of a common use case of `_.filter`: selecting only
  // objects containing specific `key:value` pairs.
  function where(obj, attrs) {
    return filter(obj, matcher(attrs));
  }

  // Return the maximum element (or element-based computation).
  function max(obj, iteratee, context) {
    var result = -Infinity, lastComputed = -Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value > result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  }

  // Return the minimum element (or element-based computation).
  function min(obj, iteratee, context) {
    var result = Infinity, lastComputed = Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value < result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed < lastComputed || computed === Infinity && result === Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  }

  // Sample **n** random values from a collection using the modern version of the
  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
  // If **n** is not specified, returns a single random element.
  // The internal `guard` argument allows it to work with `_.map`.
  function sample(obj, n, guard) {
    if (n == null || guard) {
      if (!isArrayLike(obj)) obj = values(obj);
      return obj[random(obj.length - 1)];
    }
    var sample = isArrayLike(obj) ? clone(obj) : values(obj);
    var length = getLength(sample);
    n = Math.max(Math.min(n, length), 0);
    var last = length - 1;
    for (var index = 0; index < n; index++) {
      var rand = random(index, last);
      var temp = sample[index];
      sample[index] = sample[rand];
      sample[rand] = temp;
    }
    return sample.slice(0, n);
  }

  // Shuffle a collection.
  function shuffle(obj) {
    return sample(obj, Infinity);
  }

  // Sort the object's values by a criterion produced by an iteratee.
  function sortBy(obj, iteratee, context) {
    var index = 0;
    iteratee = cb(iteratee, context);
    return pluck(map(obj, function(value, key, list) {
      return {
        value: value,
        index: index++,
        criteria: iteratee(value, key, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  }

  // An internal function used for aggregate "group by" operations.
  function group(behavior, partition) {
    return function(obj, iteratee, context) {
      var result = partition ? [[], []] : {};
      iteratee = cb(iteratee, context);
      each(obj, function(value, index) {
        var key = iteratee(value, index, obj);
        behavior(result, value, key);
      });
      return result;
    };
  }

  // Groups the object's values by a criterion. Pass either a string attribute
  // to group by, or a function that returns the criterion.
  var groupBy = group(function(result, value, key) {
    if (has(result, key)) result[key].push(value); else result[key] = [value];
  });

  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
  // when you know that your index values will be unique.
  var indexBy = group(function(result, value, key) {
    result[key] = value;
  });

  // Counts instances of an object that group by a certain criterion. Pass
  // either a string attribute to count by, or a function that returns the
  // criterion.
  var countBy = group(function(result, value, key) {
    if (has(result, key)) result[key]++; else result[key] = 1;
  });

  // Split a collection into two arrays: one whose elements all pass the given
  // truth test, and one whose elements all do not pass the truth test.
  var partition = group(function(result, value, pass) {
    result[pass ? 0 : 1].push(value);
  }, true);

  // Safely create a real, live array from anything iterable.
  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
  function toArray(obj) {
    if (!obj) return [];
    if (isArray(obj)) return slice.call(obj);
    if (isString(obj)) {
      // Keep surrogate pair characters together.
      return obj.match(reStrSymbol);
    }
    if (isArrayLike(obj)) return map(obj, identity);
    return values(obj);
  }

  // Return the number of elements in a collection.
  function size(obj) {
    if (obj == null) return 0;
    return isArrayLike(obj) ? obj.length : keys(obj).length;
  }

  // Internal `_.pick` helper function to determine whether `key` is an enumerable
  // property name of `obj`.
  function keyInObj(value, key, obj) {
    return key in obj;
  }

  // Return a copy of the object only containing the allowed properties.
  var pick = restArguments(function(obj, keys) {
    var result = {}, iteratee = keys[0];
    if (obj == null) return result;
    if (isFunction$1(iteratee)) {
      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
      keys = allKeys(obj);
    } else {
      iteratee = keyInObj;
      keys = flatten(keys, false, false);
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  });

  // Return a copy of the object without the disallowed properties.
  var omit = restArguments(function(obj, keys) {
    var iteratee = keys[0], context;
    if (isFunction$1(iteratee)) {
      iteratee = negate(iteratee);
      if (keys.length > 1) context = keys[1];
    } else {
      keys = map(flatten(keys, false, false), String);
      iteratee = function(value, key) {
        return !contains(keys, key);
      };
    }
    return pick(obj, iteratee, context);
  });

  // Returns everything but the last entry of the array. Especially useful on
  // the arguments object. Passing **n** will return all the values in
  // the array, excluding the last N.
  function initial(array, n, guard) {
    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
  }

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. The **guard** check allows it to work with `_.map`.
  function first(array, n, guard) {
    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    if (n == null || guard) return array[0];
    return initial(array, array.length - n);
  }

  // Returns everything but the first entry of the `array`. Especially useful on
  // the `arguments` object. Passing an **n** will return the rest N values in the
  // `array`.
  function rest(array, n, guard) {
    return slice.call(array, n == null || guard ? 1 : n);
  }

  // Get the last element of an array. Passing **n** will return the last N
  // values in the array.
  function last(array, n, guard) {
    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    if (n == null || guard) return array[array.length - 1];
    return rest(array, Math.max(0, array.length - n));
  }

  // Trim out all falsy values from an array.
  function compact(array) {
    return filter(array, Boolean);
  }

  // Flatten out an array, either recursively (by default), or up to `depth`.
  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
  function flatten$1(array, depth) {
    return flatten(array, depth, false);
  }

  // Take the difference between one array and a number of other arrays.
  // Only the elements present in just the first array will remain.
  var difference = restArguments(function(array, rest) {
    rest = flatten(rest, true, true);
    return filter(array, function(value){
      return !contains(rest, value);
    });
  });

  // Return a version of the array that does not contain the specified value(s).
  var without = restArguments(function(array, otherArrays) {
    return difference(array, otherArrays);
  });

  // Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // The faster algorithm will not work with an iteratee if the iteratee
  // is not a one-to-one function, so providing an iteratee will disable
  // the faster algorithm.
  function uniq(array, isSorted, iteratee, context) {
    if (!isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted && !iteratee) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  }

  // Produce an array that contains the union: each distinct element from all of
  // the passed-in arrays.
  var union = restArguments(function(arrays) {
    return uniq(flatten(arrays, true, true));
  });

  // Produce an array that contains every item shared between all the
  // passed-in arrays.
  function intersection(array) {
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = getLength(array); i < length; i++) {
      var item = array[i];
      if (contains(result, item)) continue;
      var j;
      for (j = 1; j < argsLength; j++) {
        if (!contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  }

  // Complement of zip. Unzip accepts an array of arrays and groups
  // each array's elements on shared indices.
  function unzip(array) {
    var length = array && max(array, getLength).length || 0;
    var result = Array(length);

    for (var index = 0; index < length; index++) {
      result[index] = pluck(array, index);
    }
    return result;
  }

  // Zip together multiple lists into a single array -- elements that share
  // an index go together.
  var zip = restArguments(unzip);

  // Converts lists into objects. Pass either a single array of `[key, value]`
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
  function object(list, values) {
    var result = {};
    for (var i = 0, length = getLength(list); i < length; i++) {
      if (values) {
        result[list[i]] = values[i];
      } else {
        result[list[i][0]] = list[i][1];
      }
    }
    return result;
  }

  // Generate an integer Array containing an arithmetic progression. A port of
  // the native Python `range()` function. See
  // [the Python documentation](https://docs.python.org/library/functions.html#range).
  function range(start, stop, step) {
    if (stop == null) {
      stop = start || 0;
      start = 0;
    }
    if (!step) {
      step = stop < start ? -1 : 1;
    }

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  }

  // Chunk a single array into multiple arrays, each containing `count` or fewer
  // items.
  function chunk(array, count) {
    if (count == null || count < 1) return [];
    var result = [];
    var i = 0, length = array.length;
    while (i < length) {
      result.push(slice.call(array, i, i += count));
    }
    return result;
  }

  // Helper function to continue chaining intermediate results.
  function chainResult(instance, obj) {
    return instance._chain ? _(obj).chain() : obj;
  }

  // Add your own custom functions to the Underscore object.
  function mixin(obj) {
    each(functions(obj), function(name) {
      var func = _[name] = obj[name];
      _.prototype[name] = function() {
        var args = [this._wrapped];
        push.apply(args, arguments);
        return chainResult(this, func.apply(_, args));
      };
    });
    return _;
  }

  // Add all mutator `Array` functions to the wrapper.
  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      var obj = this._wrapped;
      if (obj != null) {
        method.apply(obj, arguments);
        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
          delete obj[0];
        }
      }
      return chainResult(this, obj);
    };
  });

  // Add all accessor `Array` functions to the wrapper.
  each(['concat', 'join', 'slice'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      var obj = this._wrapped;
      if (obj != null) obj = method.apply(obj, arguments);
      return chainResult(this, obj);
    };
  });

  // Named Exports

  var allExports = {
    __proto__: null,
    VERSION: VERSION,
    restArguments: restArguments,
    isObject: isObject,
    isNull: isNull,
    isUndefined: isUndefined,
    isBoolean: isBoolean,
    isElement: isElement,
    isString: isString,
    isNumber: isNumber,
    isDate: isDate,
    isRegExp: isRegExp,
    isError: isError,
    isSymbol: isSymbol,
    isArrayBuffer: isArrayBuffer,
    isDataView: isDataView$1,
    isArray: isArray,
    isFunction: isFunction$1,
    isArguments: isArguments$1,
    isFinite: isFinite$1,
    isNaN: isNaN$1,
    isTypedArray: isTypedArray$1,
    isEmpty: isEmpty,
    isMatch: isMatch,
    isEqual: isEqual,
    isMap: isMap,
    isWeakMap: isWeakMap,
    isSet: isSet,
    isWeakSet: isWeakSet,
    keys: keys,
    allKeys: allKeys,
    values: values,
    pairs: pairs,
    invert: invert,
    functions: functions,
    methods: functions,
    extend: extend,
    extendOwn: extendOwn,
    assign: extendOwn,
    defaults: defaults,
    create: create,
    clone: clone,
    tap: tap,
    get: get,
    has: has$1,
    mapObject: mapObject,
    identity: identity,
    constant: constant,
    noop: noop,
    toPath: toPath,
    property: property,
    propertyOf: propertyOf,
    matcher: matcher,
    matches: matcher,
    times: times,
    random: random,
    now: now,
    escape: _escape,
    unescape: _unescape,
    templateSettings: templateSettings,
    template: template,
    result: result,
    uniqueId: uniqueId,
    chain: chain,
    iteratee: iteratee,
    partial: partial,
    bind: bind,
    bindAll: bindAll,
    memoize: memoize,
    delay: delay,
    defer: defer,
    throttle: throttle,
    debounce: debounce,
    wrap: wrap,
    negate: negate,
    compose: compose,
    after: after,
    before: before,
    once: once,
    findKey: findKey,
    findIndex: findIndex,
    findLastIndex: findLastIndex,
    sortedIndex: sortedIndex,
    indexOf: indexOf,
    lastIndexOf: lastIndexOf,
    find: find,
    detect: find,
    findWhere: findWhere,
    each: each,
    forEach: each,
    map: map,
    collect: map,
    reduce: reduce,
    foldl: reduce,
    inject: reduce,
    reduceRight: reduceRight,
    foldr: reduceRight,
    filter: filter,
    select: filter,
    reject: reject,
    every: every,
    all: every,
    some: some,
    any: some,
    contains: contains,
    includes: contains,
    include: contains,
    invoke: invoke,
    pluck: pluck,
    where: where,
    max: max,
    min: min,
    shuffle: shuffle,
    sample: sample,
    sortBy: sortBy,
    groupBy: groupBy,
    indexBy: indexBy,
    countBy: countBy,
    partition: partition,
    toArray: toArray,
    size: size,
    pick: pick,
    omit: omit,
    first: first,
    head: first,
    take: first,
    initial: initial,
    last: last,
    rest: rest,
    tail: rest,
    drop: rest,
    compact: compact,
    flatten: flatten$1,
    without: without,
    uniq: uniq,
    unique: uniq,
    union: union,
    intersection: intersection,
    difference: difference,
    unzip: unzip,
    transpose: unzip,
    zip: zip,
    object: object,
    range: range,
    chunk: chunk,
    mixin: mixin,
    'default': _
  };

  // Default Export

  // Add all of the Underscore functions to the wrapper object.
  var _$1 = mixin(allExports);
  // Legacy Node.js API.
  _$1._ = _$1;

  return _$1;

})));
//# sourceMappingURL=underscore.js.map

Added build/html/_static/underscore.js.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/LICENSE.txt.





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Font Awesome Free License
-------------------------

Font Awesome Free is free, open source, and GPL friendly. You can use it for
commercial projects, open source projects, or really almost whatever you want.
Full Font Awesome Free license: https://fontawesome.com/license/free.

# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
In the Font Awesome Free download, the CC BY 4.0 license applies to all icons
packaged as SVG and JS file types.

# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)
In the Font Awesome Free download, the SIL OFL license applies to all icons
packaged as web and desktop font files.

# Code: MIT License (https://opensource.org/licenses/MIT)
In the Font Awesome Free download, the MIT license applies to all non-font and
non-icon files.

# Attribution
Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
Awesome Free files already contain embedded comments with sufficient
attribution, so you shouldn't need to do anything additional when using these
files normally.

We've kept attribution comments terse, so we ask that you do not actively work
to remove them from files, especially code. They're a great way for folks to
learn about Font Awesome.

# Brand Icons
All brand icons are trademarks of their respective owners. The use of these
trademarks does not indicate endorsement of the trademark holder by Font
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
to represent the company, product, or service to which they refer.**

Added build/html/_static/vendor/fontawesome/5.13.0/css/all.min.css.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.eot.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.svg.





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
<?xml version="1.0" standalone="no"?>
<!--
Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
-->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata>
Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020
 By Robert Madole
Copyright (c) Font Awesome
</metadata>
<defs>
<font id="FontAwesome5Brands-Regular" horiz-adv-x="448" >
  <font-face 
    font-family="Font Awesome 5 Brands Regular"
    font-weight="400"
    font-stretch="normal"
    units-per-em="512"
    panose-1="2 0 5 3 0 0 0 0 0 0"
    ascent="448"
    descent="-64"
    bbox="-0.200195 -66.9505 641.5 448.3"
    underline-thickness="25"
    underline-position="-50"
    unicode-range="U+0020-F957"
  />
    <missing-glyph />
    <glyph glyph-name="twitter-square" unicode="&#xf081;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM351.1 257.2c12.8008 9.2998 24 20.8994 32.9004 34c-11.7998 -5.10059 -24.5996 -8.7998 -37.7998 -10.2002
c13.5996 8.09961 23.8994 20.9004 28.7998 36.0996c-12.5996 -7.5 -26.7998 -13 -41.5996 -15.7998c-12 12.7998 -29 20.7002 -47.9004 20.7002c-40 0 -73.2998 -36.0996 -64 -80.5996c-54.4004 2.7998 -102.9 28.7998 -135.2 68.5996
c-5.7002 -9.7002 -8.89941 -20.9004 -8.89941 -33.0996v-0.107422c0 -19.3584 13.0811 -43.7715 29.1992 -54.4932c-10.6992 0.400391 -20.8994 3.40039 -29.5996 8.2998v-0.799805c0 -31.8994 22.5 -58.2998 52.5 -64.3994
c-10.4004 -2.7002 -19.5 -2.7002 -29.5996 -1.2002c8.2998 -26 32.5 -44.9004 61.2998 -45.5c-22.5 -17.6006 -50.7002 -28 -81.4004 -28c-5.39941 0 -10.5 0.200195 -15.7998 0.799805c29 -18.5996 63.5 -29.4004 100.7 -29.4004c120.6 0 186.6 99.9004 186.6 186.601
c0 2.7998 0 5.7002 -0.200195 8.5z" />
    <glyph glyph-name="facebook-square" unicode="&#xf082;" 
d="M400 416c26.4961 0 48 -21.5039 48 -48v-352c0 -26.4961 -21.5039 -48 -48 -48h-137.25v152.31h57.7803l11 71.6904h-68.7803v46.5498c0 19.6104 9.61035 38.7305 40.4199 38.7305h31.2705v61s-28.3809 4.83984 -55.5205 4.83984
c-56.6699 0 -93.6699 -34.3301 -93.6699 -96.4805v-54.6396h-63v-71.6904h63v-152.31h-137.25c-26.4961 0 -48 21.5039 -48 48v352c0 26.4961 21.5039 48 48 48h352z" />
    <glyph glyph-name="linkedin" unicode="&#xf08c;" 
d="M416 416c17.5996 0 32 -14.5 32 -32.2998v-383.4c0 -17.7998 -14.4004 -32.2998 -32 -32.2998h-384.1c-17.6006 0 -31.9004 14.5 -31.9004 32.2998v383.4c0 17.7998 14.2998 32.2998 31.9004 32.2998h384.1zM135.4 32h0.0996094v213.8h-66.5v-213.8h66.4004zM102.2 275
c21.2998 0 38.5 17.2002 38.5 38.5c0 21.2002 -17.2998 38.5 -38.5 38.5c-21.2998 0 -38.5 -17.2998 -38.5 -38.5s17.2002 -38.5 38.5 -38.5zM384.3 32v117.2c0 57.5996 -12.5 101.899 -79.7002 101.899c-32.2998 0 -54 -17.6992 -62.8994 -34.5h-0.900391v29.2002h-63.7002
v-213.8h66.4004v105.8c0 27.9004 5.2998 54.9004 39.9004 54.9004c34 0 34.5 -31.9004 34.5 -56.7002v-104h66.3994z" />
    <glyph glyph-name="github-square" unicode="&#xf092;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM277.3 32.2998c66 22 110.8 84.9004 110.7 158.3c0 91.8008 -74.4004 161.5 -166.2 161.5s-162 -69.6992 -162 -161.5
c0 -73.3994 46.2002 -136.199 112.2 -158.3c8.5 -1.5 11.5 3.7002 11.5 8c0 4.10059 -0.200195 26.7002 -0.200195 40.6006c0 0 -46.3994 -10 -56.0996 19.6992c0 0 -7.60059 19.2002 -18.4004 24.2002c0 0 -15.0996 10.4004 1.10059 10.2002
c0 0 16.3994 -1.2998 25.5 -17.0996c14.5 -25.6006 38.7998 -18.2002 48.2998 -13.9004c1.5 10.5996 5.7998 18 10.5996 22.2998c-37 4.10059 -74.2998 9.5 -74.2998 73.1006c0 18.1992 5 27.2998 15.5996 39c-1.7998 4.39941 -7.39941 22.0996 1.7002 45
c13.9004 4.2998 45.7002 -17.9004 45.7002 -17.9004c13.2002 3.7002 27.5 5.59961 41.5996 5.59961c14.1006 0 28.4004 -1.89941 41.6006 -5.59961c0 0 31.7998 22.2002 45.7002 17.9004c9.09961 -23 3.39941 -40.7002 1.69922 -45
c10.6006 -11.7002 17.1006 -20.8008 17.1006 -39c0 -63.9004 -39 -69 -76 -73.1006c6.09961 -5.2002 11.2998 -15.0996 11.2998 -30.7002c0 -22.2998 -0.200195 -49.8994 -0.200195 -55.2998c0 -4.2998 3.10059 -9.5 11.5 -8zM179.2 93.4004
c-1.90039 -0.400391 -3.7002 0.399414 -3.90039 1.69922c-0.200195 1.5 1.10059 2.80078 3 3.2002c1.90039 0.200195 3.7002 -0.599609 3.90039 -1.89941c0.299805 -1.30078 -1 -2.60059 -3 -3zM169.7 94.2998c0 1.5 -1.7998 2.60059 -3.7002 2.40039
c-2 0 -3.5 -1.10059 -3.5 -2.40039c0 -1.5 1.5 -2.59961 3.7002 -2.39941c2 0 3.5 1.09961 3.5 2.39941zM156 95.4004c-0.400391 -1.30078 -2.40039 -1.90039 -4.09961 -1.30078c-1.90039 0.400391 -3.2002 1.90039 -2.80078 3.2002
c0.400391 1.2998 2.40039 1.90039 4.10059 1.5c2 -0.599609 3.2998 -2.09961 2.7998 -3.39941zM143.7 100.8c0.899414 0.799805 0.399414 2.7998 -0.900391 4.10059c-1.5 1.5 -3.39941 1.69922 -4.2998 0.599609c-1 -0.900391 -0.599609 -2.7998 0.900391 -4.09961
c1.5 -1.5 3.39941 -1.7002 4.2998 -0.600586zM134.6 109.9c1.10059 0.799805 1.10059 2.59961 0 4.09961c-0.899414 1.5 -2.59961 2.2002 -3.69922 1.2998c-1.10059 -0.700195 -1.10059 -2.39941 0 -3.89941c1.09961 -1.5 2.7998 -2.10059 3.69922 -1.5zM128.1 119.6
c0.900391 0.700195 0.700195 2.2002 -0.399414 3.5c-1.10059 1 -2.60059 1.5 -3.5 0.600586c-0.900391 -0.700195 -0.700195 -2.2002 0.399414 -3.5c1.10059 -1 2.60059 -1.5 3.5 -0.600586zM121.4 127c0.399414 0.799805 -0.200195 1.90039 -1.5 2.59961
c-1.30078 0.5 -2.40039 0.200195 -2.80078 -0.399414c-0.399414 -0.900391 0.200195 -2 1.5 -2.60059c1.10059 -0.699219 2.40039 -0.5 2.80078 0.400391z" />
    <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="512" 
d="M459.37 296.284c0.325195 -4.54785 0.325195 -9.09766 0.325195 -13.6455c0 -138.72 -105.583 -298.558 -298.559 -298.558c-59.4521 0 -114.68 17.2188 -161.137 47.1055c8.44727 -0.973633 16.5684 -1.29883 25.3398 -1.29883
c49.0547 0 94.2129 16.5684 130.274 44.832c-46.1318 0.975586 -84.792 31.1885 -98.1123 72.7725c6.49805 -0.974609 12.9951 -1.62402 19.8184 -1.62402c9.4209 0 18.8428 1.2998 27.6133 3.57324c-48.0811 9.74707 -84.1426 51.9795 -84.1426 102.984v1.29883
c13.9688 -7.79688 30.2139 -12.6699 47.4307 -13.3184c-28.2637 18.8428 -46.7803 51.0049 -46.7803 87.3906c0 19.4922 5.19629 37.3604 14.2939 52.9541c51.6543 -63.6748 129.3 -105.258 216.364 -109.807c-1.62402 7.79688 -2.59863 15.918 -2.59863 24.04
c0 57.8271 46.7822 104.934 104.934 104.934c30.2139 0 57.502 -12.6699 76.6709 -33.1367c23.7148 4.54785 46.4551 13.3193 66.5986 25.3398c-7.79785 -24.3662 -24.3662 -44.833 -46.1318 -57.8271c21.1172 2.27344 41.584 8.12207 60.4258 16.2432
c-14.292 -20.791 -32.1611 -39.3086 -52.6279 -54.2529z" />
    <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="512" 
d="M504 192c0 -123.78 -90.6904 -226.38 -209.25 -245v173.31h57.7803l11 71.6904h-68.7803v46.5498c0 19.6104 9.61035 38.7305 40.4102 38.7305h31.2803v61s-28.3809 4.83984 -55.5205 4.83984c-56.6699 0 -93.6699 -34.3301 -93.6699 -96.4805v-54.6396h-63v-71.6904h63
v-173.31c-118.56 18.6201 -209.25 121.22 -209.25 245c0 137 111 248 248 248s248 -111 248 -248z" />
    <glyph glyph-name="github" unicode="&#xf09b;" horiz-adv-x="496" 
d="M165.9 50.5996c0 -2 -2.30078 -3.59961 -5.2002 -3.59961c-3.2998 -0.299805 -5.60059 1.2998 -5.60059 3.59961c0 2 2.30078 3.60059 5.2002 3.60059c3 0.299805 5.60059 -1.2998 5.60059 -3.60059zM134.8 55.0996c0.700195 2 3.60059 3 6.2002 2.30078
c3 -0.900391 4.90039 -3.2002 4.2998 -5.2002c-0.599609 -2 -3.59961 -3 -6.2002 -2c-3 0.599609 -5 2.89941 -4.2998 4.89941zM179 56.7998c2.90039 0.299805 5.59961 -1 5.90039 -2.89941c0.299805 -2 -1.7002 -3.90039 -4.60059 -4.60059
c-3 -0.700195 -5.59961 0.600586 -5.89941 2.60059c-0.300781 2.2998 1.69922 4.19922 4.59961 4.89941zM244.8 440c138.7 0 251.2 -105.3 251.2 -244c0 -110.9 -67.7998 -205.8 -167.8 -239c-12.7002 -2.2998 -17.2998 5.59961 -17.2998 12.0996
c0 8.2002 0.299805 49.9004 0.299805 83.6006c0 23.5 -7.7998 38.5 -17 46.3994c55.8994 6.30078 114.8 14 114.8 110.5c0 27.4004 -9.7998 41.2002 -25.7998 58.9004c2.59961 6.5 11.0996 33.2002 -2.60059 67.9004c-20.8994 6.59961 -69 -27 -69 -27
c-20 5.59961 -41.5 8.5 -62.7998 8.5s-42.7998 -2.90039 -62.7998 -8.5c0 0 -48.0996 33.5 -69 27c-13.7002 -34.6006 -5.2002 -61.4004 -2.59961 -67.9004c-16 -17.5996 -23.6006 -31.4004 -23.6006 -58.9004c0 -96.1992 56.4004 -104.3 112.3 -110.5
c-7.19922 -6.59961 -13.6992 -17.6992 -16 -33.6992c-14.2998 -6.60059 -51 -17.7002 -72.8994 20.8994c-13.7002 23.7998 -38.6006 25.7998 -38.6006 25.7998c-24.5 0.300781 -1.59961 -15.3994 -1.59961 -15.3994c16.4004 -7.5 27.7998 -36.6006 27.7998 -36.6006
c14.7002 -44.7998 84.7002 -29.7998 84.7002 -29.7998c0 -21 0.299805 -55.2002 0.299805 -61.3994c0 -6.5 -4.5 -14.4004 -17.2998 -12.1006c-99.7002 33.4004 -169.5 128.3 -169.5 239.2c0 138.7 106.1 244 244.8 244zM97.2002 95.0996
c1.2998 1.30078 3.59961 0.600586 5.2002 -1c1.69922 -1.89941 2 -4.19922 0.699219 -5.19922c-1.2998 -1.30078 -3.59961 -0.600586 -5.19922 1c-1.7002 1.89941 -2 4.19922 -0.700195 5.19922zM86.4004 103.2c0.699219 1 2.2998 1.2998 4.2998 0.700195
c2 -1 3 -2.60059 2.2998 -3.90039c-0.700195 -1.40039 -2.7002 -1.7002 -4.2998 -0.700195c-2 1 -3 2.60059 -2.2998 3.90039zM118.8 67.5996c1.2998 1.60059 4.2998 1.30078 6.5 -1c2 -1.89941 2.60059 -4.89941 1.2998 -6.19922
c-1.2998 -1.60059 -4.19922 -1.30078 -6.5 1c-2.2998 1.89941 -2.89941 4.89941 -1.2998 6.19922zM107.4 82.2998c1.59961 1.2998 4.19922 0.299805 5.59961 -2c1.59961 -2.2998 1.59961 -4.89941 0 -6.2002c-1.2998 -1 -4 0 -5.59961 2.30078
c-1.60059 2.2998 -1.60059 4.89941 0 5.89941z" />
    <glyph glyph-name="pinterest" unicode="&#xf0d2;" horiz-adv-x="496" 
d="M496 192c0 -137 -111 -248 -248 -248c-25.5996 0 -50.2002 3.90039 -73.4004 11.0996c10.1006 16.5 25.2002 43.5 30.8008 65c3 11.6006 15.3994 59 15.3994 59c8.10059 -15.3994 31.7002 -28.5 56.7998 -28.5c74.8008 0 128.7 68.8008 128.7 154.301
c0 81.8994 -66.8994 143.199 -152.899 143.199c-107 0 -163.9 -71.7998 -163.9 -150.1c0 -36.4004 19.4004 -81.7002 50.2998 -96.0996c4.7002 -2.2002 7.2002 -1.2002 8.2998 3.2998c0.800781 3.39941 5 20.2998 6.90039 28.0996
c0.599609 2.5 0.299805 4.7002 -1.7002 7.10059c-10.0996 12.5 -18.2998 35.2998 -18.2998 56.5996c0 54.7002 41.4004 107.6 112 107.6c60.9004 0 103.6 -41.5 103.6 -100.899c0 -67.1006 -33.8994 -113.601 -78 -113.601c-24.2998 0 -42.5996 20.1006 -36.6992 44.8008
c7 29.5 20.5 61.2998 20.5 82.5996c0 19 -10.2002 34.9004 -31.4004 34.9004c-24.9004 0 -44.9004 -25.7002 -44.9004 -60.2002c0 -22 7.40039 -36.7998 7.40039 -36.7998s-24.5 -103.801 -29 -123.2c-5 -21.4004 -3 -51.6006 -0.900391 -71.2002
c-92.1992 36.0996 -157.6 125.9 -157.6 231c0 137 111 248 248 248s248 -111 248 -248z" />
    <glyph glyph-name="pinterest-square" unicode="&#xf0d3;" 
d="M448 368v-352c0 -26.5 -21.5 -48 -48 -48h-245.6c9.7998 16.4004 22.3994 40 27.3994 59.2998c3 11.5 15.2998 58.4004 15.2998 58.4004c8 -15.2998 31.4004 -28.2002 56.3008 -28.2002c74.0996 0 127.399 68.0996 127.399 152.7
c0 81.0996 -66.2002 141.8 -151.399 141.8c-106 0 -162.2 -71.0996 -162.2 -148.6c0 -36 19.2002 -80.8008 49.7998 -95.1006c4.7002 -2.2002 7.09961 -1.2002 8.2002 3.2998c0.799805 3.40039 5 20.1006 6.7998 27.8008c0.599609 2.5 0.299805 4.59961 -1.7002 7
c-10.0996 12.2998 -18.2998 34.8994 -18.2998 56c0 54.1992 41 106.6 110.9 106.6c60.2998 0 102.6 -41.0996 102.6 -99.9004c0 -66.3994 -33.5 -112.399 -77.2002 -112.399c-24.0996 0 -42.0996 19.8994 -36.3994 44.3994c6.89941 29.2002 20.2998 60.7002 20.2998 81.8008
c0 53 -75.5 45.6992 -75.5 -25c0 -21.7002 7.2998 -36.5 7.2998 -36.5c-31.4004 -132.801 -36.0996 -134.5 -29.5996 -192.601l2.19922 -0.799805h-88.5996c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48z" />
    <glyph glyph-name="google-plus-square" unicode="&#xf0d4;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM164 92c57.7002 0 96 40.5 96 97.5996c0 6.5 -0.599609 11.6006 -1.59961 16.6006h-94.4004v-34.4004h56.9004
c-2.40039 -14.5996 -17.2002 -43.0996 -56.8008 -43.0996c-34.0996 0 -61.8994 28.2998 -61.8994 63.2002c0 35 27.7998 63.1992 61.8994 63.1992c19.5 0 32.4004 -8.2998 39.8008 -15.3994l27.0996 26.0996c-17.5 16.4004 -40 26.2002 -67 26.2002
c-55.2998 0 -100 -44.7002 -100 -100s44.7002 -100 100 -100zM384 173.8v29.2002h-29v29h-29.2002v-29h-29v-29.2002h29v-29h29.2002v29h29z" />
    <glyph glyph-name="google-plus-g" unicode="&#xf0d5;" horiz-adv-x="640" 
d="M386.061 219.504c1.83398 -9.69238 3.14355 -19.3838 3.14355 -31.9561c0 -109.753 -73.6055 -187.548 -184.404 -187.548c-106.084 0 -192 85.915 -192 192s85.916 192 192 192c51.8643 0 95.083 -18.8594 128.611 -50.292l-52.126 -50.0303
c-14.1455 13.6211 -39.0283 29.5996 -76.4854 29.5996c-65.4834 0 -118.92 -54.2217 -118.92 -121.277s53.4365 -121.277 118.92 -121.277c75.9609 0 104.514 54.7451 108.965 82.7734h-108.965v66.0088h181.261v-0.000976562zM571.467 213.067h55.7334v-56.001h-55.7334
v-55.7334h-56.001v55.7334h-55.7324v56.001h55.7324v55.7324h56.001v-55.7324z" />
    <glyph glyph-name="linkedin-in" unicode="&#xf0e1;" 
d="M100.28 0h-92.8799v299.1h92.8799v-299.1zM53.79 339.9c-29.7002 0 -53.79 24.5996 -53.79 54.2998c0 29.6914 24.0977 53.79 53.79 53.79s53.79 -24.0986 53.79 -53.79c0 -29.7002 -24.0996 -54.2998 -53.79 -54.2998zM447.9 0h-92.6807v145.6
c0 34.7002 -0.700195 79.2002 -48.29 79.2002c-48.29 0 -55.6895 -37.7002 -55.6895 -76.7002v-148.1h-92.7803v299.1h89.0801v-40.7998h1.2998c12.4004 23.5 42.6904 48.2998 87.8799 48.2998c94 0 111.28 -61.8994 111.28 -142.3v-164.3h-0.0996094z" />
    <glyph glyph-name="github-alt" unicode="&#xf113;" horiz-adv-x="480" 
d="M186.1 119.3c0 -20.8994 -10.8994 -55.0996 -36.6992 -55.0996c-25.8008 0 -36.7002 34.2002 -36.7002 55.0996c0 20.9004 10.8994 55.1006 36.7002 55.1006c25.7998 0 36.6992 -34.2002 36.6992 -55.1006zM480 169.8c0 -31.8994 -3.2002 -65.7002 -17.5 -95
c-37.9004 -76.5996 -142.1 -74.7998 -216.7 -74.7998c-75.7998 0 -186.2 -2.7002 -225.6 74.7998c-14.6006 29 -20.2002 63.1006 -20.2002 95c0 41.9004 13.9004 81.5 41.5 113.601c-5.2002 15.7998 -7.7002 32.3994 -7.7002 48.7998
c0 21.5 4.90039 32.2998 14.6006 51.7998c45.2998 0 74.2998 -9 108.8 -36c29 6.90039 58.7998 10 88.7002 10c27 0 54.1992 -2.90039 80.3994 -9.2002c34 26.7002 63 35.2002 107.8 35.2002c9.80078 -19.5 14.6006 -30.2998 14.6006 -51.7998
c0 -16.4004 -2.60059 -32.7002 -7.7002 -48.2002c27.5 -32.4004 39 -72.2998 39 -114.2zM415.7 119.3c0 43.9004 -26.7002 82.6006 -73.5 82.6006c-18.9004 0 -37 -3.40039 -56 -6c-14.9004 -2.30078 -29.7998 -3.2002 -45.1006 -3.2002
c-15.1992 0 -30.0996 0.899414 -45.0996 3.2002c-18.7002 2.59961 -37 6 -56 6c-46.7998 0 -73.5 -38.7002 -73.5 -82.6006c0 -87.7998 80.4004 -101.3 150.4 -101.3h48.1992c70.3008 0 150.601 13.4004 150.601 101.3zM333.1 174.4
c25.8008 0 36.7002 -34.2002 36.7002 -55.1006c0 -20.8994 -10.8994 -55.0996 -36.7002 -55.0996c-25.7998 0 -36.6992 34.2002 -36.6992 55.0996c0 20.9004 10.8994 55.1006 36.6992 55.1006z" />
    <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="512" 
d="M461.1 5.2998h-97.3994l51.8994 242.7c2.30078 10.2002 0.900391 19.5 -4.39941 25.7002c-5 6.09961 -13.7002 9.59961 -24.2002 9.59961h-49.2998l-59.5 -278h-97.4004l59.5 278h-83.3994l-59.5 -278h-97.4004l59.5 278l-44.5996 95.4004h372.1
c39.4004 0 75.2998 -16.2998 98.2998 -44.9004c23.2998 -28.5996 31.7998 -67.3994 23.6006 -105.899z" />
    <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="384" 
d="M0 416h384l-34.9004 -395.8l-157.6 -52.2002l-156.6 52.2002zM308.2 288.1l4.39941 47.7002h-241.1l12.7998 -145.6h166.9l-6 -62.2002l-53.7002 -14.5l-53.5 14.5l-3.5 38.0996h-47.7002l6 -75.7998l98.7002 -27.2998h1.09961v0.299805l97.9004 27l13.5996 148.4h-175.6
l-4.09961 49.3994h183.8z" />
    <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="512" 
d="M480 416l-64 -368l-223.3 -80l-192.7 80l19.5996 94.7998h82l-8 -40.5996l116.4 -44.4004l134.1 44.4004l18.8008 97.0996h-333.4l16 82h333.7l10.5 52.7002h-333.4l16.2998 82h407.4z" />
    <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="384" 
d="M310.204 205.362c46.0059 -11.0283 74.9971 -38.4443 69.3262 -99.8906c-7.24805 -76.5723 -61.5967 -97.0547 -142.896 -101.467v-68.0049h-48.5273v66.7451c-12.29 0 -25.21 0 -38.4443 0.314453v-67.0596h-48.5283v68.0049s-8.88867 0.31543 -97.3701 0.31543
l9.76758 57.666c34.7305 -0.614258 50.3301 -3.4209 53.2549 16.0703v217.43c-4.60645 24.5664 -24.709 22.1045 -63.0234 21.4268v51.6777c58.748 -0.275391 79.5283 -0.539062 97.3701 0v79.4092h48.5283v-77.833c12.9189 0.31543 25.8389 0.629883 38.4443 0.629883
v77.2031h48.5273v-79.4092c62.3926 -5.35547 109.492 -24.5781 114.851 -81.9287c4.09668 -41.9102 -13.5508 -67.1201 -41.2803 -81.2998zM150.608 313.447v-96.7402c27.416 0 113.126 -6.30273 113.126 48.2119c0 57.0352 -85.7109 48.5283 -113.126 48.5283z
M150.608 61.6709c32.7715 0 133.126 -6.93262 133.127 53.2529c0 62.3936 -100.355 53.2549 -133.127 53.2549v-106.508z" />
    <glyph glyph-name="youtube" unicode="&#xf167;" horiz-adv-x="576" 
d="M549.655 323.917c11.4121 -42.8672 11.4121 -132.305 11.4121 -132.305s0 -89.4385 -11.4121 -132.306c-6.28125 -23.6494 -24.7871 -41.5 -48.2842 -47.8203c-42.5908 -11.4863 -213.371 -11.4863 -213.371 -11.4863s-170.78 0 -213.371 11.4863
c-23.4971 6.32031 -42.0029 24.1709 -48.2842 47.8203c-11.4121 42.8672 -11.4121 132.306 -11.4121 132.306s0 89.4375 11.4121 132.305c6.28125 23.6504 24.7871 42.2754 48.2842 48.5967c42.5908 11.4863 213.371 11.4863 213.371 11.4863s170.781 0 213.371 -11.4863
c23.4971 -6.32031 42.0029 -24.9463 48.2842 -48.5967zM232.145 110.409l142.739 81.2012l-142.739 81.2051v-162.406z" />
    <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="384" 
d="M162.7 238c-1.7998 -3.2998 -25.2002 -44.4004 -70.1006 -123.5c-4.89941 -8.2998 -10.7998 -12.5 -17.6992 -12.5h-65.1006c-7.7002 0 -12.0996 7.5 -8.5 14.4004l69 121.3c0.200195 0 0.200195 0.0996094 0 0.299805l-43.8994 75.5996
c-4.30078 7.80078 0.299805 14.1006 8.5 14.1006h65.0996c7.2998 0 13.2998 -4.10059 18 -12.2002zM382.6 401.9l-144 -253v-0.300781l91.6006 -166.6c3.89941 -7.09961 0.200195 -14.0996 -8.5 -14.0996h-65.2002c-7.59961 0 -13.5996 4 -18 12.1992l-92.4004 168.5
c3.30078 5.80078 51.5 90.8008 144.801 255.2c4.59961 8.10059 10.3994 12.2002 17.5 12.2002h65.6992c8 0 12.3008 -6.7002 8.5 -14.0996z" />
    <glyph glyph-name="xing-square" unicode="&#xf169;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM140.4 127.8c4.89941 0 9.09961 2.90039 12.5996 9.10059c32.0996 56.5 48.7998 85.8994 50.0996 88.1992l-31.8994 55.3008
c-3.40039 5.7998 -7.7002 8.69922 -12.9004 8.69922h-46.5996c-5.7998 0 -9 -4.5 -6 -10.0996l31.3994 -54c0.100586 -0.0996094 0.100586 -0.200195 0 -0.200195l-49.2998 -86.7002c-2.7002 -5 0.5 -10.2998 6 -10.2998h46.6006zM360.1 341.9
c2.80078 5.2998 -0.299805 10.0996 -6 10h-46.8994c-5.10059 0 -9.2002 -2.90039 -12.5 -8.7002c-66.6006 -117.4 -101.101 -178.2 -103.4 -182.3l66 -120.301c3.2002 -5.7998 7.40039 -8.69922 12.9004 -8.69922h46.5996c6.10059 0 8.7998 5 6 10.0996l-65.5 119v0.200195z
" />
    <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="528" 
d="M264.4 331.7l-132 -84.2998l132 -84.3008l-132 -84.2998l-132.4 85.1006l132.3 84.2998l-132.3 83.5l132.3 84.2998zM131.6 52.2998l132 84.2998l132 -84.2998l-132 -84.2998zM264.4 163.9l132 84.2998l-132 83.5996l131.3 84.2002l132.3 -84.2998l-132.3 -84.2998
l132.3 -84.2002l-132.3 -84.2998z" />
    <glyph glyph-name="stack-overflow" unicode="&#xf16c;" horiz-adv-x="384" 
d="M290.7 137l-8.2002 -39l-195.7 41l8.2002 39.2998zM341.7 224l-25.5 -30.7998l-153.5 128.3l25.5 30.7998zM310.5 184.3l-16.7998 -36.2998l-181.2 84.5l16.7002 36.5zM262 416l119.3 -160.3l-32 -24l-119.3 160.3zM282.5 88v-39.7002h-200v39.7002h200zM322.2 8v120h40
v-160h-359.5v160h40v-120h279.5z" />
    <glyph glyph-name="instagram" unicode="&#xf16d;" 
d="M224.1 307c63.6006 0 114.9 -51.2998 114.9 -114.9c0 -63.5996 -51.2998 -114.899 -114.9 -114.899c-63.5996 0 -114.899 51.2998 -114.899 114.899c0 63.6006 51.2998 114.9 114.899 114.9zM224.1 117.4c41.1006 0 74.7002 33.5 74.7002 74.6992
c0 41.2002 -33.5 74.7002 -74.7002 74.7002c-41.1992 0 -74.6992 -33.5 -74.6992 -74.7002c0 -41.1992 33.5996 -74.6992 74.6992 -74.6992zM370.5 311.7c0 -14.9004 -12 -26.7998 -26.7998 -26.7998c-14.9004 0 -26.7998 12 -26.7998 26.7998s12 26.7998 26.7998 26.7998
s26.7998 -12 26.7998 -26.7998zM446.6 284.5c2.10059 -37 2.10059 -147.8 0 -184.8c-1.7998 -35.9004 -10 -67.7002 -36.1992 -93.9004c-26.2002 -26.2998 -58 -34.5 -93.9004 -36.2002c-37 -2.09961 -147.9 -2.09961 -184.9 0
c-35.8994 1.80078 -67.5996 10 -93.8994 36.2002s-34.5 58 -36.2002 93.9004c-2.09961 37 -2.09961 147.899 0 184.899c1.7998 35.9004 9.90039 67.7002 36.2002 93.9004s58.0996 34.4004 93.8994 36.0996c37 2.10059 147.9 2.10059 184.9 0
c35.9004 -1.7998 67.7002 -10 93.9004 -36.1992c26.2998 -26.2002 34.5 -58 36.1992 -93.9004zM398.8 60c11.7002 29.4004 9 99.5 9 132.1c0 32.6006 2.7002 102.601 -9 132.101c-7.89941 19.7002 -23 34.7998 -42.5996 42.5996c-29.4004 11.6006 -99.5 9 -132.101 9
c-32.5996 0 -102.6 2.7002 -132.1 -9c-19.7002 -7.89941 -34.7998 -23 -42.5996 -42.5996c-11.6006 -29.4004 -9 -99.5 -9 -132.101c0 -32.5996 -2.7002 -102.6 9 -132.1c7.89941 -19.7002 23 -34.7998 42.5996 -42.5996c29.4004 -11.6006 99.5 -9 132.1 -9
c32.6006 0 102.601 -2.7002 132.101 9c19.7002 7.89941 34.7998 23 42.5996 42.5996z" />
    <glyph glyph-name="flickr" unicode="&#xf16e;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM144.5 129c35.0996 0 63.5 28.4004 63.5 63.5s-28.4004 63.5 -63.5 63.5s-63.5 -28.4004 -63.5 -63.5s28.4004 -63.5 63.5 -63.5z
M303.5 129c35.0996 0 63.5 28.4004 63.5 63.5s-28.4004 63.5 -63.5 63.5s-63.5 -28.4004 -63.5 -63.5s28.4004 -63.5 63.5 -63.5z" />
    <glyph glyph-name="adn" unicode="&#xf170;" horiz-adv-x="496" 
d="M248 280.5l64.9004 -98.7998h-129.801zM496 192c0 -136.9 -111.1 -248 -248 -248s-248 111.1 -248 248s111.1 248 248 248s248 -111.1 248 -248zM396.2 109.3l-148.2 223.2l-148.2 -223.2h30.4004l33.5996 51.7002h168.601l33.5996 -51.7002h30.2002z" />
    <glyph glyph-name="bitbucket" unicode="&#xf171;" horiz-adv-x="512" 
d="M22.2002 416l466.8 -0.200195c0.776367 -0.0107422 2.03027 -0.100586 2.7998 -0.200195c7.39648 -1.21875 13.3984 -8.29102 13.3984 -15.7871c0 -0.697266 -0.0888672 -1.82324 -0.198242 -2.5127l-67.9004 -416.8
c-1.2168 -7.39746 -8.29004 -13.4014 -15.7871 -13.4014c-0.0585938 0 -0.154297 0.000976562 -0.212891 0.000976562h-325.699c-10.1016 0.0820312 -19.6445 8.23535 -21.3008 18.2002l-67.8994 412.101c-0.0966797 0.769531 -0.186523 2.02344 -0.200195 2.7998
c0.108398 8.72168 7.27539 15.8008 15.999 15.8008c0.0556641 0 0.145508 0 0.201172 -0.000976562zM308.1 118.2l25.2002 147h-157.3l28.0996 -147h104z" />
    <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="320" 
d="M309.8 -32.2998c-13.5996 -14.5 -50 -31.7002 -97.3994 -31.7002c-120.801 0 -147 88.7998 -147 140.6v144h-47.5c-5.5 0 -10 4.5 -10 10v68c0 7.2002 4.5 13.6006 11.2998 16c62 21.8008 81.5 76 84.2998 117.101c0.799805 11 6.5 16.2998 16.0996 16.2998h70.9004
c5.5 0 10 -4.5 10 -10v-115.2h83c5.5 0 10 -4.39941 10 -9.89941v-81.7002c0 -5.5 -4.5 -10 -10 -10h-83.4004v-133.2c0 -34.2002 23.7002 -53.5996 68 -35.7998c4.80078 1.89941 9 3.2002 12.7002 2.2002c3.5 -0.900391 5.7998 -3.40039 7.40039 -7.90039l22 -64.2998
c1.7998 -5 3.2998 -10.6006 -0.400391 -14.5z" />
    <glyph glyph-name="tumblr-square" unicode="&#xf174;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM317.7 51.7998c2.2998 2.40039 1.2998 5.90039 0.299805 9.10059l-13.7998 40.1992c-1 2.80078 -2.40039 4.40039 -4.60059 4.90039
c-2.39941 0.599609 -5 -0.200195 -8 -1.40039c-27.6992 -11.0996 -42.5 1 -42.5 22.4004v83.2998h52.1006c3.39941 0 6.2002 2.7998 6.2002 6.2002v51.0996c0 3.40039 -2.80078 6.2002 -6.2002 6.2002h-51.9004v72c0 3.40039 -2.7998 6.2002 -6.2002 6.2002h-44.2998
c-5.89941 0 -9.5 -3.2998 -10 -10.2002c-1.7998 -25.7002 -13.8994 -59.5 -52.7002 -73.2002c-4.2998 -1.5 -7.09961 -5.5 -7.09961 -10v-42.5c0 -3.39941 2.7998 -6.19922 6.2002 -6.19922h29.7002v-90c0 -32.4004 16.3994 -87.9004 91.8994 -87.9004
c29.7002 0 52.4004 10.7002 60.9004 19.7998z" />
    <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="384" 
d="M318.7 179.3c0 -1.89941 -3.5 -61.2002 61.7002 -91.8994c-12.2002 -36.8008 -54 -118.601 -102.601 -119.301c-28.0996 0 -44.5996 17.9004 -76.3994 17.9004c-32.8008 0 -50.6006 -17.2998 -75.8008 -17.9004c-48.1992 -1.5 -94.3994 88.5 -107.199 125.2
c-9.60059 27.9336 -14.4004 55 -14.4004 81.2002c0 88.7002 59.2998 132.3 115.1 133.2c27 0 61.4004 -19.7002 76.4004 -19.7002c14.2002 0 53 23.5 88.5 20.7002c37.5 -2.90039 65.9004 -17.7002 84.7002 -44.6006c-33.6006 -20.3994 -50.2002 -48.0996 -50 -84.7998z
M262.1 343.5c-19.5996 -22.9004 -43.3994 -36.2998 -69.5 -34.2998c-2.19922 27.5996 8.10059 52.0996 25.6006 71.8994c15.8994 18.5 43.7998 33.5 67.8994 34.9004c0.800781 -10.5996 3.30078 -40.0996 -24 -72.5z" />
    <glyph glyph-name="windows" unicode="&#xf17a;" 
d="M0 354.3l183.6 25.2998v-177.399h-183.6v152.1zM0 29.7002v149.899h183.6v-175.199zM203.8 1.7002v177.899h244.2v-211.6zM203.8 382.3l244.2 33.7002v-213.8h-244.2v180.1z" />
    <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="576" 
d="M420.55 146.07c-13.248 0 -24 10.752 -24 24s10.752 24 24 24s24 -10.752 24 -24s-10.752 -24 -24 -24zM155.45 146.07c-13.248 0 -24 10.752 -24 24s10.752 24 24 24s24 -10.752 24 -24s-10.752 -24 -24 -24zM429.15 290.55l47.9395 83
c0.936523 1.39551 1.69629 3.8916 1.69629 5.57227c0 5.51953 -4.47949 10 -10 10c-3.43066 0 -7.44727 -2.49609 -8.96582 -5.57227v0l-48.54 -84.0693c-32.4678 14.5615 -87.6973 26.3789 -123.28 26.3789s-90.8125 -11.8174 -123.28 -26.3789l-48.54 84.0693
c-1.51855 3.07617 -5.53516 5.57227 -8.96582 5.57227c-5.52051 0 -10 -4.48047 -10 -10c0 -1.68066 0.759766 -4.17676 1.69629 -5.57227v0l47.9395 -83c-82.3193 -44.7695 -138.609 -128.1 -146.85 -226.55h576c-8.24023 98.4502 -64.54 181.78 -146.85 226.55z" />
    <glyph glyph-name="linux" unicode="&#xf17c;" 
d="M220.8 324.7c-1.09961 0.599609 -3.09961 0.399414 -3.39941 1.7002c-0.200195 0.399414 0.199219 0.899414 0.599609 1.09961c1.59961 0.900391 3.7998 0.599609 5.5 -0.0996094c1.2998 -0.600586 3.40039 -1.5 3.2002 -2.90039
c-0.100586 -1.09961 -1.7998 -1.5 -2.90039 -1.5c-1.2002 0 -2 1.2002 -3 1.7002zM198.9 323c-1 -0.0996094 -2.7002 0.400391 -2.80078 1.40039c-0.199219 1.39941 1.90039 2.2998 3.2002 2.89941c1.7002 0.700195 3.90039 1 5.5 0.100586
c0.400391 -0.200195 0.799805 -0.700195 0.600586 -1.10059c-0.400391 -1.2002 -2.40039 -1 -3.5 -1.59961c-1 -0.5 -1.80078 -1.7002 -3 -1.7002zM420 44.2002c11.0996 -12.4004 15.9004 -21.5 15.5 -29.7002c-0.5 -8.2002 -6.5 -13.7998 -13.9004 -18.2998
c-14.8994 -9 -37.2998 -15.7998 -50.8994 -32.2002c-14.2002 -16.9004 -31.7002 -26.5996 -48.2998 -27.9004c-16.5 -1.2998 -32 6.30078 -40.3008 23v0.100586c-1.09961 2.09961 -1.89941 4.39941 -2.5 6.7002c-21.5 -1.2002 -40.1992 5.2998 -55.0996 4.09961
c-22 -1.2002 -35.7998 -6.5 -48.2998 -6.59961c-4.7998 -10.6006 -14.2998 -17.6006 -25.9004 -20.2002c-16 -3.7002 -36.0996 0 -55.8994 10.3994c-18.5 9.80078 -42 8.90039 -59.3008 12.5c-8.69922 1.80078 -16.2998 5 -20.0996 12.3008
c-3.7002 7.2998 -3 17.2998 2.2002 31.6992c1.7002 5.10059 0.399414 12.7002 -0.799805 20.8008c-0.600586 3.89941 -1.2002 7.89941 -1.2002 11.7998c0 4.2998 0.700195 8.5 2.7998 12.3994c4.5 8.5 11.7998 12.1006 18.5 14.5c6.7002 2.40039 12.7998 4 17 8.30078
c5.2002 5.5 10.0996 14.3994 16.5996 20.1992c-2.59961 17.2002 0.200195 35.4004 6.2002 53.3008c12.6006 37.8994 39.2002 74.1992 58.1006 96.6992c16.0996 22.9004 20.7998 41.3008 22.5 64.7002c1.09961 31.7998 -24.5 135.4 77.8994 135.2
c80.9004 -0.0996094 76.2998 -85.4004 75.7998 -131.3c-0.299805 -30.1006 16.3008 -50.5 33.4004 -72c15.2002 -18 35.0996 -44.2998 46.5 -74.4004c9.2998 -24.5996 12.9004 -51.7998 3.7002 -79.0996c1.39941 -0.5 2.7998 -1.2002 4.09961 -2
c1.40039 -0.799805 2.7002 -1.7998 4 -2.90039c6.60059 -5.59961 8.7002 -14.2998 10.5 -22.3994c1.90039 -8.10059 3.60059 -15.7002 7.2002 -19.7002zM223.7 360.7c-3.2002 -7.2002 -3.90039 -14.9004 -2.90039 -21.7998c3.60059 -0.900391 8.90039 -2.40039 13 -4.40039
c-2.09961 12.2002 4.5 23.5 11.7998 23c8.90039 -0.299805 13.9004 -15.5 9.10059 -27.2998c-0.799805 -1.90039 -2.7998 -3.40039 -3.90039 -4.60059c6.7002 -2.2998 11 -4.09961 12.6006 -4.89941c7.89941 9.5 10.7998 26.2002 4.2998 40.3994
c-9.7998 21.4004 -34.2002 21.8008 -44 -0.399414zM183 372.2c-18.9004 0 -24 -37.5 -8.40039 -52.1006c7.80078 5.7002 6.90039 4.7002 5.90039 5.5c-8 6.90039 -6.59961 27.4004 1.7998 28.1006c6.2998 0.5 10.7998 -10.7002 9.60059 -19.6006
c3.09961 2.10059 6.69922 3.60059 10.1992 4.60059c1.7002 19.2998 -9 33.5 -19.0996 33.5zM169.4 311.5c-4.2002 -3.2998 -5.60059 -7.40039 -4.2002 -12.2998c1.5 -4.90039 6.09961 -10.5 14.7002 -15.2998c7.7998 -4.60059 12 -11.5 20 -15
c2.59961 -1.10059 5.69922 -1.90039 9.59961 -2.10059c18.4004 -1.09961 27.0996 11.2998 38.2002 14.9004c11.7002 3.7002 20.0996 11 22.7002 18.0996c3.19922 8.5 -2.10059 14.7002 -10.5 18.2002c-11.3008 4.90039 -16.3008 5.2002 -22.6006 9.2998
c-10.2998 6.60059 -18.7998 8.90039 -25.8994 8.90039c-14.4004 0 -23.2002 -9.7998 -27.9004 -14.2002c-0.5 -0.5 -7.90039 -5.90039 -14.0996 -10.5zM172.7 -22.5c2.09961 20.5 -31.5 49 -41 68.9004l-19.6006 35.5996c-6.7998 9.2002 -13.7998 14.7998 -21.8994 16
c-7.7002 1.2002 -12.6006 -1.40039 -17.7002 -6.90039c-4.7998 -5.09961 -8.7998 -12.2998 -14.2998 -18c-7.7998 -6.5 -9.2998 -6.19922 -19.6006 -9.89941c-6.2998 -2.2002 -11.2998 -4.60059 -14.7998 -11.2998c-2.7002 -5 -2.09961 -12.2002 -0.899414 -20
c1.19922 -7.90039 3 -16.3008 0.599609 -23.9004v-0.200195c-5 -13.7002 -5 -21.7002 -2.59961 -26.3994c7.89941 -15.4004 46.5996 -6.10059 76.5 -21.9004c31.3994 -16.4004 72.5996 -17.0996 75.2998 18zM171.3 3.40039c37.6006 -25.7002 82.2002 -15.7002 114.3 7.19922
c3.2002 11 6.30078 21.3008 6.80078 29c0.799805 15.2002 1.59961 28.7002 4.39941 39.9004c3.10059 12.5996 9.2998 23.0996 21.4004 27.2998c2.2998 21.1006 18.7002 21.1006 38.2998 12.5c18.9004 -8.5 26 -16 22.7998 -26.0996c1 0 2 0.0996094 4.2002 0
c5.2002 16.8994 -14.2998 28 -30.7002 34.7998c2.90039 12 2.40039 24.0996 -0.399414 35.7002c-6 25.2998 -22.6006 47.7998 -35.2002 59c-2.2998 0.0996094 -2.10059 -1.90039 2.59961 -6.5c11.6006 -10.7002 37.1006 -49.2002 23.2998 -84.9004
c-3.89941 1 -7.59961 1.5 -10.8994 1.40039c-5.2998 29.0996 -17.5 53.2002 -23.6006 64.5996c-11.5 21.4004 -29.5 65.2998 -37.1992 95.7002c-4.5 -6.40039 -12.4004 -11.9004 -22.3008 -15c-4.69922 -1.5 -9.69922 -5.5 -15.8994 -9
c-13.9004 -8 -30 -8.7998 -42.4004 1.2002c-4.5 3.59961 -8 7.59961 -12.5996 10.2998c-1.60059 0.900391 -5.10059 3.2998 -6.2002 4.09961c-2 -37.7998 -27.2998 -85.2998 -39.2998 -112.699c-8.2998 -19.7002 -13.2002 -40.8008 -13.7998 -61.5
c-21.8008 29.0996 -5.90039 66.2998 2.59961 82.3994c9.5 17.6006 11 22.5 8.7002 20.7998c-8.60059 -14 -22 -36.2998 -27.2002 -59.1992c-2.7002 -11.9004 -3.2002 -24 0.299805 -35.2002s11.1006 -21.5 24.6006 -29.9004c0 0 24.7998 -14.2998 38.2998 -32.5
c7.39941 -10 9.7002 -18.7002 7.39941 -24.8994c-2.5 -6.7002 -9.59961 -8.90039 -16.6992 -8.90039c4.7998 -6 10.2998 -13 14.3994 -19.5996zM428.7 14.9004c0.299805 5.09961 -3.10059 13 -13.7002 24.5996c-10 11.2998 -7.2002 33.0996 -17.0996 41.5996
c-6.90039 6 -13.6006 5.40039 -22.6006 5.10059c-7.7002 -8.7998 -25.7998 -19.6006 -38.3994 -16.2998c-11.5 2.89941 -18 16.2998 -18.8008 29.5c-0.299805 -0.200195 -0.699219 -0.300781 -1 -0.5c-7.09961 -3.90039 -11.0996 -10.8008 -13.6992 -21.1006
c-2.5 -10.2002 -3.40039 -23.5 -4.2002 -38.7002c-0.700195 -11.7998 -6.2002 -26.3994 -9.90039 -40.5996c-3.5 -13.2002 -5.7998 -25.2002 -1.09961 -36.2998c7.2002 -14.5 19.5 -20.4004 33.7002 -19.2998c14.1992 1.09961 30.3994 9.7998 43.5996 25.5
c22 26.5996 62.2998 29.6992 63.2002 46.5zM173.3 299.3c-3.5 2.7998 -3.09961 6.60059 -1.7002 6.5c2.40039 -0.299805 2.80078 -3.5 4.30078 -4.89941c2 -1.90039 4.59961 -4.40039 7.69922 -6.90039c6.2002 -4.90039 14.5 -9.7002 24.9004 -9.7002
s22.5 6 29.9004 10.2002c4.19922 2.40039 9.5 6.59961 13.8994 9.7998c3.40039 2.5 3.2002 5.40039 6 5.10059c2.7998 -0.300781 0.799805 -3.2002 -3.09961 -6.60059c-3.90039 -3.39941 -9.90039 -7.7998 -14.7998 -10.3994
c-9.30078 -4.90039 -20.2002 -10.8008 -31.8008 -10.8008c-11.5 0 -20.6992 5.40039 -27.2998 10.6006c-3.2998 2.59961 -6 5.2002 -8 7.09961z" />
    <glyph glyph-name="dribbble" unicode="&#xf17d;" horiz-adv-x="512" 
d="M256 440c136.748 0 248 -111.252 248 -248s-111.252 -248 -248 -248s-248 111.252 -248 248s111.252 248 248 248zM419.97 325.634c-4.46582 -6.04102 -39.9629 -51.5459 -118.284 -83.5225c7.43652 -15.2217 12.8652 -27.5732 18.6172 -41.6143
c70.4844 8.86426 140.519 -5.34082 147.502 -6.81836c-0.46582 49.998 -18.332 95.9092 -47.835 131.955zM396.421 350.13c-52.0947 46.2188 -122.885 63.6816 -190.061 47.4893c5.85449 -7.83984 44.3281 -60.2324 79.04 -124.008
c75.3232 28.2324 107.211 71.0918 111.021 76.5186zM165.941 383.38c-59.2637 -27.9531 -103.562 -82.585 -117.298 -148.318c9.47461 -0.125 96.7471 -0.503906 195.834 25.8096c-35.0986 62.3926 -72.9512 114.85 -78.5361 122.509zM44.1699 191.677
c0 -54.4072 20.624 -104.082 54.457 -141.636c34.3369 58.7793 103.932 120.731 180.531 142.306c-5.31738 12.0342 -11.1104 24.0811 -17.1738 35.9492c-105.786 -31.6592 -208.438 -30.3359 -217.706 -30.1455c-0.0654297 -2.15137 -0.108398 -4.30762 -0.108398 -6.47363
zM125.977 24.5645c62.7539 -48.9355 144.656 -56.8955 212.769 -27.8828c-3.15039 18.585 -15.4492 83.3555 -45.1895 160.639c-85.4004 -29.1348 -145.452 -87.5234 -167.579 -132.756zM374.357 16.0752c47.5215 32.1338 81.3525 83.0371 90.7949 141.978
c-7.24707 2.28711 -65.5674 19.6816 -131.947 9.05566c27.7061 -76.1367 38.9805 -138.147 41.1523 -151.033z" />
    <glyph glyph-name="skype" unicode="&#xf17e;" 
d="M424.7 148.2c14.5996 -18.9004 23.2998 -42.5 23.2002 -68.1006c0 -61.7998 -50.2002 -112 -112 -112c-25.6006 0 -49.2002 8.7002 -68.2002 23.3008c-14.1006 -3 -28.9004 -4.7002 -43.7998 -4.7002c-113.4 0 -205.301 91.7998 -205.301 205.3
c0 14.9004 1.80078 29.7998 4.7002 43.7998c-14.5996 18.9004 -23.2998 42.5 -23.2998 68.2002c0 61.7998 50.2002 112 112 112c25.7002 0 49.2998 -8.7002 68.2998 -23.4004c14.1006 3 28.9004 4.7002 43.7998 4.7002c113.4 0 205.301 -91.7998 205.301 -205.3
c0 -14.9004 -1.80078 -29.7998 -4.7002 -43.7998zM230.1 56.7002c54.9004 0 112 27.3994 112 86.5c0 50.7998 -49.2998 68.2998 -90.6992 77.5996c-48.3008 11.2002 -69.1006 13.2002 -69.1006 33c0 15.5 16.2998 22.5 42 22.5c45.7998 0 46.7002 -33.5 75 -33.5
c18.9004 0 30.2998 14.9004 30.2998 31.7998c0 33.5 -55.6992 55.4004 -110.8 55.4004c-50.5 0 -109.1 -21.9004 -109.1 -81.0996c0 -65.2002 55.2998 -71.8008 117.8 -87.2002c26 -6.40039 42 -9.2998 42 -28c0 -14.9004 -16.5996 -26.2998 -42.2998 -26.2998
c-54 0 -56.9004 44.8994 -88.1006 44.8994c-20.5 0 -29.5 -14.5996 -29.5 -30.5996c0 -35.7998 54.9004 -65 120.5 -65z" />
    <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="368" 
d="M323.1 445c40 0 50.7002 -22.7998 42.2002 -65.2002l-48.5996 -243c-3.7002 -14.5 -9.2002 -39.7002 -44.2998 -39.7002h-83.4004c-3.40039 0 -3.7002 0.300781 -6.7998 -3.09961c0 0 -2.2002 -2.5 -131.101 -151.9
c-10.0996 -11.6992 -26.6992 -9.59961 -32.8994 -7.09961c-6.10059 2.40039 -18.2002 9.7998 -18.2002 30.0996v433.801c0 17.7998 12.4004 46.0996 49.9004 46.0996h273.199zM306.8 371.2c2.10059 9.7998 -5.2998 17.5 -13.5 17.5h-219
c-9.7998 0 -16.5996 -8.90039 -16.5996 -16.6006v-338.8c0 -0.899414 0.899414 -1.2002 1.7998 -0.299805c80.5996 96.9004 89.5 108.3 89.5 108.3c9.2998 10.7998 13 12.6006 26.5 12.6006h73.5c10.0996 0 16 8.59961 16.9004 13.5
c0.899414 5 9.59961 49.8994 11.3994 58.7998c1.7998 9 -6.5 18.2002 -14.7998 18.2002h-90.4004c-12 0 -20.5996 8.59961 -20.5996 20.5996v13c0 12 8.59961 20.2998 20.5996 20.2998h106.4c7.40039 0 15.7002 6.7002 16.9004 13.2002z" />
    <glyph glyph-name="trello" unicode="&#xf181;" 
d="M392.3 416c30.7998 -0.200195 55.7002 -25.2002 55.6006 -56v-336c0 -30.7998 -24.9004 -55.7998 -55.7002 -56h-336.2c-30.9004 0 -56 25.0996 -56 56c0 340 -0.0996094 336 0 336c0 30.9004 25.0996 56 56.0996 56h336.2zM197 76.7002h0.0996094v254.2
c0 14.8994 -12.0996 26.8994 -26.8994 26.8994h-82.9004c-14.8994 0 -26.8994 -12.0996 -26.8994 -26.8994v-254.2c0.0996094 -14.7998 12.1992 -26.7002 27 -26.6006h82.6992c14.8008 0 26.7002 11.9004 26.9004 26.6006zM390.1 188.7v142.1
c0 14.9004 -12.0996 26.9004 -26.8994 26.9004h-81.1006c-14.7998 0 -26.7998 -12.1006 -26.7998 -26.9004v-142.1c0 -14.9004 12.1006 -26.9004 26.9004 -26.9004h81c14.8994 0 26.8994 12.1006 26.8994 26.9004z" />
    <glyph glyph-name="gratipay" unicode="&#xf184;" horiz-adv-x="496" 
d="M248 440c136.9 0 248 -111.1 248 -248s-111.1 -248 -248 -248s-248 111.1 -248 248s111.1 248 248 248zM362.6 213.6c8.80078 12 19.1006 50.4004 -13.7998 72c-27.7002 18.1006 -54.2002 4.2002 -68.0996 -11.8994c-15.1006 -16.9004 -45.7998 -17.9004 -61.7002 0
c-13.9004 16.0996 -40.4004 30 -68.5 11.8994c-32.7002 -21.5996 -22.2998 -60.0996 -13.5996 -72l112.699 -152.699z" />
    <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="576" 
d="M545 330.3c-7.40039 -34.2998 -79.2998 -135.5 -79.4004 -135.6c-6.19922 -10 -8.69922 -15 0 -26.2002c3.40039 -4.7998 79.1006 -76.5996 90.3008 -111.5c4.89941 -16.5996 -3.60059 -25 -20.4004 -25h-58.9004c-22.3994 0 -29 17.9004 -69 57.9004
c-35 33.6992 -50 38.0996 -58.6992 38.0996c-18.8008 0 -15.4004 -6.2998 -15.4004 -73.0996c0 -14.5 -4.59961 -22.9004 -42.0996 -22.9004c-62.4004 0 -131 37.9004 -179.7 107.8c-73.1006 102.4 -93.1006 179.9 -93.1006 195.5c0 8.7998 3.40039 16.7002 20.2002 16.7002
h58.9004c15.0996 0 20.7998 -6.59961 26.5996 -22.9004c28.7998 -84 77.4004 -157.399 97.4004 -157.399c7.5 0 10.8994 3.5 10.8994 22.5v86.7998c-2.19922 40 -23.3994 43.2998 -23.3994 57.5c0 6.5 5.59961 13.5 15 13.5h92.5996
c12.4004 0 16.6006 -6.7002 16.6006 -21.7002v-116.7c0 -12.5 5.69922 -16.8994 9.39941 -16.8994c7.5 0 13.7998 4.39941 27.5 18.0996c42.4004 47.4004 72.4004 120.5 72.4004 120.5c3.7002 8.7998 10.5996 16.7002 25.5996 16.7002h58.9004
c17.7998 0 21.5 -9.2002 17.7998 -21.7002z" />
    <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="512" 
d="M407 270.4c7.59961 24 -13.4004 46.7998 -37.4004 41.6992c-22 -4.7998 -28.7998 28.1006 -7.09961 32.8008c50.0996 10.8994 92.2998 -37.1006 76.5 -84.8008c-6.7998 -21.1992 -38.7998 -10.7998 -32 10.3008zM214.8 1.2998c-106.3 0 -214.8 51.4004 -214.8 136.3
c0 44.3008 28 95.4004 76.2998 143.7c99.7002 99.7002 203.2 100.9 173.601 5.7002c-4 -13.0996 12.2998 -5.7002 12.2998 -6c79.5 33.5996 140.5 16.7998 114 -51.4004c-3.7002 -9.39941 1.09961 -10.8994 8.2998 -13.0996c135.7 -42.2998 34.7998 -215.2 -169.7 -215.2z
M358.5 147.6c-5.40039 55.7002 -78.5 94 -163.4 85.7002c-84.7998 -8.59961 -148.8 -60.2998 -143.399 -116c5.39941 -55.7002 78.5 -94 163.399 -85.7002c84.8008 8.60059 148.801 60.3008 143.4 116zM347.9 412.9c102.3 21.5996 189.3 -74.5 157.399 -174.301
c-8.2998 -25 -44.7998 -12.1992 -37.3994 12c23.0996 71.2002 -39.4004 139.2 -111.7 124c-25.1006 -5.39941 -34.2002 32.7002 -8.2998 38.3008zM269.4 101.9c-17.1006 -38.8008 -66.8008 -60 -109.101 -46.3008c-40.7998 13.1006 -58 53.4004 -40.2998 89.7002
c17.7002 35.4004 63.0996 55.4004 103.4 45.1006c42 -10.8008 63.0996 -50.2002 46 -88.5zM183.1 131.9c-12.8994 5.39941 -30 -0.300781 -38 -12.9004c-8.2998 -12.9004 -4.2998 -28 8.60059 -34c13.0996 -6 30.7998 -0.299805 39.0996 12.9004
c8 13.0996 3.7002 28.2998 -9.7002 34zM215.7 145.3c-5.10059 1.7002 -11.4004 -0.599609 -14.2998 -5.39941c-2.90039 -5.10059 -1.40039 -10.6006 3.69922 -12.9004c5.10059 -2 11.7002 0.299805 14.6006 5.40039c2.7998 5.19922 1.09961 10.8994 -4 12.8994z" />
    <glyph glyph-name="renren" unicode="&#xf18b;" horiz-adv-x="512" 
d="M214 278.9c0 -110.4 -61 -205.4 -147.6 -247.4c-36.4004 43.2998 -58.4004 98.7998 -58.4004 159.9c0 122.699 89.0996 224.399 206 244.1v-156.6zM255 -56c-42.9004 0 -83.2998 11 -118.5 30.4004c57.2002 36.0996 103.4 90.6992 118.5 154.6
c15.5 -63.9004 61.7002 -118.5 118.8 -154.7c-35.0996 -19.2998 -75.5 -30.2998 -118.8 -30.2998zM445.6 31.5c-86.5996 42 -147.6 136.9 -147.6 247.4v156.6c116.9 -19.7002 206 -121.4 206 -244.1c0 -61.1006 -22 -116.601 -58.4004 -159.9z" />
    <glyph glyph-name="pagelines" unicode="&#xf18c;" horiz-adv-x="384" 
d="M384 135.3c-55.0996 -136.7 -187.1 -54 -187.1 -54c-40.5 -81.7998 -107.4 -134.399 -184.601 -134.7c-16.0996 0 -16.5996 24.4004 0 24.4004c64.4004 0.299805 120.5 42.7002 157.2 110.1c-41.0996 -15.8994 -118.6 -27.8994 -161.6 82.2002
c109 44.9004 159.1 -11.2002 178.3 -45.5c9.89941 24.4004 17 50.9004 21.5996 79.7002c0 0 -139.7 -21.9004 -149.5 98.0996c119.101 47.9004 152.601 -76.6992 152.601 -76.6992c1.59961 16.6992 3.2998 52.5996 3.2998 53.3994c0 0 -106.3 73.7002 -38.1006 165.2
c124.601 -43 61.4004 -162.4 61.4004 -162.4c0.5 -1.59961 0.5 -23.7998 0 -33.3994c0 0 45.2002 89 136.4 57.5c-4.2002 -134 -141.9 -106.4 -141.9 -106.4c-4.40039 -27.3994 -11.2002 -53.3994 -20 -77.5c0 0 83 91.7998 172 20z" />
    <glyph glyph-name="stack-exchange" unicode="&#xf18d;" 
d="M17.7002 115.7h412.7v-22c0 -37.7002 -29.3008 -68 -65.3008 -68h-19l-86.7998 -89.7002v89.7002h-176.3c-36 0 -65.2998 30.2998 -65.2998 68v22zM17.7002 139.3v85h412.7v-85h-412.7zM17.7002 248.7v85h412.7v-85h-412.7zM365 448
c36 0 65.2998 -30.2998 65.4004 -67.7002v-22.2998h-412.7v22.2998c0 37.4004 29.2998 67.7002 65.2998 67.7002h282z" />
    <glyph glyph-name="vimeo-square" unicode="&#xf194;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM383.8 266.4c1.90039 41.5996 -13.5996 63 -46.5 64c-44.2998 1.39941 -74.3994 -23.6006 -90.0996 -75.1006
c19.5996 8.40039 48.5996 10.6006 45.2002 -22.2002c-0.900391 -11.0996 -8.10059 -27.0996 -21.5 -48.2998c-37.2002 -58.7002 -46.3008 -39.0996 -66.8008 90.5c-5.7998 36.5 -21.0996 53.5 -46 51.1006c-22 -2 -57.1992 -38 -94.0996 -70.4004l15 -19.4004
c14.2998 10.1006 22.7002 15.1006 25.0996 15.1006c20.8008 0 31.5 -54.1006 56.7002 -146.4c12.9004 -34.3994 28.6006 -51.5996 47.2998 -51.5996c30.1006 0 66.9004 28.2998 110.4 84.7998c42.0996 54.0996 63.9004 96.7998 65.2998 127.9z" />
    <glyph glyph-name="slack" unicode="&#xf198;" 
d="M94.1201 132.9c0 -25.9004 -21.1602 -47.0605 -47.0605 -47.0605c-25.8994 0 -47.0596 21.1602 -47.0596 47.0605c0 25.8994 21.1602 47.0596 47.0596 47.0596h47.0605v-47.0596zM117.84 132.9c0 25.8994 21.1602 47.0596 47.0605 47.0596
c25.8994 0 47.0596 -21.1602 47.0596 -47.0596v-117.841c0 -25.8994 -21.1602 -47.0596 -47.0596 -47.0596c-25.9004 0 -47.0605 21.1602 -47.0605 47.0596v117.841zM164.9 321.88c-25.9004 0 -47.0605 21.1602 -47.0605 47.0605c0 25.8994 21.1602 47.0596 47.0605 47.0596
c25.8994 0 47.0596 -21.1602 47.0596 -47.0596v-47.0605h-47.0596zM164.9 298.16c25.8994 0 47.0596 -21.1602 47.0596 -47.0605c0 -25.8994 -21.1602 -47.0596 -47.0596 -47.0596h-117.841c-25.8994 0 -47.0596 21.1602 -47.0596 47.0596
c0 25.9004 21.1602 47.0605 47.0596 47.0605h117.841zM353.88 251.1c0 25.9004 21.1602 47.0605 47.0605 47.0605c25.8994 0 47.0596 -21.1602 47.0596 -47.0605c0 -25.8994 -21.1602 -47.0596 -47.0596 -47.0596h-47.0605v47.0596zM330.16 251.1
c0 -25.8994 -21.1602 -47.0596 -47.0605 -47.0596c-25.8994 0 -47.0596 21.1602 -47.0596 47.0596v117.841c0 25.8994 21.1602 47.0596 47.0596 47.0596c25.9004 0 47.0605 -21.1602 47.0605 -47.0596v-117.841zM283.1 62.1201c25.9004 0 47.0605 -21.1602 47.0605 -47.0605
c0 -25.8994 -21.1602 -47.0596 -47.0605 -47.0596c-25.8994 0 -47.0596 21.1602 -47.0596 47.0596v47.0605h47.0596zM283.1 85.8398c-25.8994 0 -47.0596 21.1602 -47.0596 47.0605c0 25.8994 21.1602 47.0596 47.0596 47.0596h117.841
c25.8994 0 47.0596 -21.1602 47.0596 -47.0596c0 -25.9004 -21.1602 -47.0605 -47.0596 -47.0605h-117.841z" />
    <glyph glyph-name="wordpress" unicode="&#xf19a;" horiz-adv-x="512" 
d="M61.7002 278.6l101.5 -278c-71 34.4004 -119.9 107.2 -119.9 191.4c0 30.9004 6.60059 60.0996 18.4004 86.5996zM399.6 202.7c0 -18.2002 -7 -39.2998 -16 -68.7002l-21.1992 -70.9004l-76.9004 228.7c12.7998 0.700195 24.2998 2 24.2998 2
c11.4004 1.2998 10.1006 18.2002 -1.39941 17.5c0 0 -34.5 -2.7002 -56.7002 -2.7002c-20.9004 0 -56 2.7002 -56 2.7002c-11.4004 0.700195 -12.7998 -16.7998 -1.2998 -17.5c0 0 10.7998 -1.2998 22.2998 -2l33.0996 -90.7998l-46.5996 -139.6l-77.5 230.399
c12.7998 0.700195 24.2998 2 24.2998 2c11.4004 1.2998 10.0996 18.2002 -1.40039 17.5c0 0 -34.5 -2.7002 -56.6992 -2.7002c-4 0 -8.7002 0.100586 -13.7002 0.300781c38.0996 57.7998 103.5 95.8994 177.8 95.8994c55.4004 0 105.8 -21.2002 143.7 -55.8994
c-1 0.0996094 -1.90039 0.199219 -2.7998 0.199219c-20.9004 0 -35.7002 -18.1992 -35.7002 -37.7998c0 -17.5 10.0996 -32.3994 20.8994 -49.8994c8.10059 -14.2002 17.5 -32.4004 17.5 -58.7002zM259.7 173.4l65.3994 -179.2c0.400391 -1 0.900391 -2 1.5 -2.90039
c-22.0996 -7.7998 -45.7998 -12.0996 -70.5996 -12.0996c-20.9004 0 -41 3.09961 -60.0996 8.7002zM442.7 294.1c16.5996 -30.2998 26 -65.0996 26 -102.1c0 -78.5 -42.5 -147 -105.8 -183.9l65 187.9c12.1992 30.4004 16.1992 54.5996 16.1992 76.2002
c0 7.89941 -0.5 15.0996 -1.39941 21.8994zM504 192c0 -136.8 -111.3 -248 -248 -248c-136.8 0 -248 111.3 -248 248c0 136.8 111.2 248 248 248c136.7 0 248 -111.2 248 -248zM492.6 192c0 130.5 -106.199 236.6 -236.6 236.6c-130.5 0 -236.6 -106.1 -236.6 -236.6
s106.199 -236.6 236.6 -236.6c130.5 0 236.6 106.1 236.6 236.6z" />
    <glyph glyph-name="openid" unicode="&#xf19b;" 
d="M271.5 16l-68 -32c-115 10.2998 -203.5 71.5 -203.5 145.8c0 71.5 82.5 131 191.7 144.3v-43c-71.5 -12.5 -124 -53 -124 -101.3c0 -51 58.5 -93.2998 135.7 -103v340l68 33.2002v-384h0.0996094zM448 157l-131.3 28.5l36.7998 20.7002c-19.5 11.5 -43.5 20 -70 24.7998
v43c46.2002 -5.5 87.7002 -19.5 120.3 -39.2998l35 19.7998z" />
    <glyph glyph-name="yahoo" unicode="&#xf19e;" 
d="M252 156l4 -220c-12.7002 2.2002 -23.5 3.90039 -32.2998 3.90039c-8.40039 0 -19.2002 -1.7002 -32.2998 -3.90039l4 220c-55 94.7998 -110.4 196.8 -174 292c11.8994 -3.09961 23 -3.90039 33.1992 -3.90039c9 0 20.4004 0.800781 34.1006 3.90039
c40.8994 -72.2002 82.0996 -138.7 135 -225.5c37.2998 61.5996 91.0996 144.1 134.899 225.5c11.1006 -2.90039 22 -3.90039 32.9004 -3.90039c11.5 0 23.2002 1 35 3.90039c-34.4004 -47.9004 -131.6 -216.9 -174.5 -292z" />
    <glyph glyph-name="google" unicode="&#xf1a0;" horiz-adv-x="488" 
d="M488 186.2c0 -141.5 -96.9004 -242.2 -240 -242.2c-137.2 0 -248 110.8 -248 248s110.8 248 248 248c66.7998 0 123 -24.5 166.3 -64.9004l-67.5 -64.8994c-88.2998 85.2002 -252.5 21.2002 -252.5 -118.2c0 -86.5 69.1006 -156.6 153.7 -156.6
c98.2002 0 135 70.3994 140.8 106.899h-140.8v85.2998h236.1c2.30078 -12.6992 3.90039 -24.8994 3.90039 -41.3994z" />
    <glyph glyph-name="reddit" unicode="&#xf1a1;" horiz-adv-x="512" 
d="M201.5 142.5c-13.7998 0 -24.9004 11.0996 -24.9004 24.5996c0 13.8008 11.1006 24.9004 24.9004 24.9004c13.5996 0 24.5996 -11.0996 24.5996 -24.9004c0 -13.5996 -11.0996 -24.5996 -24.5996 -24.5996zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248
s111 248 248 248s248 -111 248 -248zM371.7 233.2c-9.40039 0 -17.7002 -3.90039 -23.7998 -10c-22.4004 15.5 -52.6006 25.5 -86.1006 26.5996l17.4004 78.2998l55.3994 -12.5c0 -13.5996 11.1006 -24.5996 24.6006 -24.5996c13.7998 0 24.8994 11.2998 24.8994 24.9004
c0 13.5996 -11.0996 24.8994 -24.8994 24.8994c-9.7002 0 -18 -5.7998 -22.1006 -13.7998l-61.1992 13.5996c-3 0.800781 -6.10059 -1.39941 -6.90039 -4.39941l-19.0996 -86.4004c-33.2002 -1.39941 -63.1006 -11.2998 -85.5 -26.7998
c-6.10059 6.40039 -14.7002 10.2002 -24.1006 10.2002c-34.8994 0 -46.2998 -46.9004 -14.3994 -62.7998c-1.10059 -5 -1.7002 -10.2002 -1.7002 -15.5c0 -52.6006 59.2002 -95.2002 132 -95.2002c73.0996 0 132.3 42.5996 132.3 95.2002
c0 5.2998 -0.599609 10.7998 -1.90039 15.7998c31.3008 16 19.8008 62.5 -14.8994 62.5zM302.8 117c2.2002 2.2002 6.10059 2.2002 8.2998 0c2.5 -2.5 2.5 -6.40039 0 -8.59961c-22.8994 -22.8008 -87.3994 -22.8008 -110.199 0c-2.5 2.19922 -2.5 6.09961 0 8.59961
c2.19922 2.2002 6.09961 2.2002 8.2998 0c17.5 -17.9004 75.3994 -18.2002 93.5996 0zM310.5 192c13.9004 0 24.9004 -11.0996 24.9004 -24.9004c0 -13.5 -11.1006 -24.5996 -24.9004 -24.5996c-13.5 0 -24.5996 11 -24.5996 24.5996c0 13.8008 11 24.9004 24.5996 24.9004z
" />
    <glyph glyph-name="reddit-square" unicode="&#xf1a2;" 
d="M283.2 102.5c2.7002 -2.7002 2.7002 -6.7998 0 -9.2002c-24.5 -24.5 -93.7998 -24.5996 -118.4 0c-2.7002 2.40039 -2.7002 6.5 0 9.2002c2.40039 2.40039 6.5 2.40039 8.90039 0c18.7002 -19.2002 81 -19.5996 100.5 0c2.39941 2.2998 6.59961 2.2998 9 0zM191.9 156.3
c0 -14.5996 -11.9004 -26.5 -26.5 -26.5c-14.9004 0 -26.8008 11.9004 -26.8008 26.5c0 14.9004 11.9004 26.7998 26.8008 26.7998c14.5996 0 26.5 -11.8994 26.5 -26.7998zM282.6 183.1c14.9004 0 26.8008 -11.8994 26.8008 -26.7998
c0 -14.5996 -11.9004 -26.5 -26.8008 -26.5c-14.5996 0 -26.5 11.9004 -26.5 26.5c0 14.9004 11.9004 26.7998 26.5 26.7998zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM348.3 227.4
c-10.0996 0 -19 -4.2002 -25.5996 -10.7002c-24.1006 16.7002 -56.5 27.3994 -92.5 28.5996l18.7002 84.2002l59.5 -13.4004c0 -14.5996 11.8994 -26.5 26.5 -26.5c14.8994 0 26.7998 12.2002 26.7998 26.8008c0 14.5996 -11.9004 26.7998 -26.7998 26.7998
c-10.4004 0 -19.3008 -6.2002 -23.8008 -14.9004l-65.6992 14.6006c-3.30078 0.899414 -6.5 -1.5 -7.40039 -4.80078l-20.5 -92.7998c-35.7002 -1.5 -67.7998 -12.2002 -91.9004 -28.8994c-6.5 6.7998 -15.7998 11 -25.8994 11c-37.5 0 -49.7998 -50.4004 -15.5 -67.5
c-1.2002 -5.40039 -1.7998 -11 -1.7998 -16.7002c0 -56.5 63.6992 -102.3 141.899 -102.3c78.5 0 142.2 45.7998 142.2 102.3c0 5.7002 -0.599609 11.5996 -2.09961 17c33.5996 17.2002 21.1992 67.2002 -16.1006 67.2002z" />
    <glyph glyph-name="stumbleupon-circle" unicode="&#xf1a3;" horiz-adv-x="496" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 262.5c9.7998 0 17.7998 -8 17.7002 -17.5996v-20.6006l22.8994 -10.7002l34.1006 10.1006v23.7002c0 40.2998 -34 72.5996 -74.7002 72.5996
c-40.5 0 -74.7002 -32.0996 -74.7002 -72.0996v-108.4c0 -9.90039 -8 -17.7998 -17.7998 -17.7998s-17.7998 7.7998 -17.7998 17.7998v45.7998h-57.2998v-46.5c0 -41.3994 33.5 -74.8994 74.8994 -74.8994c41 0 74.9004 33 74.9004 73.8994v106.9
c0 9.7998 8 17.7998 17.7998 17.7998zM423.6 138.9c0 0 0 0.5 0.100586 46.3994h-57.2998v-48c0 -9.7002 -8 -17.5996 -17.8008 -17.5996c-9.7998 0 -17.7998 7.7998 -17.7998 17.5996v47.1006l-34.0996 -10.1006l-22.9004 10.7002v-46.7998
c0 -41 33.7002 -74.2002 74.9004 -74.2002c41.3994 0 74.8994 33.5 74.8994 74.9004z" />
    <glyph glyph-name="stumbleupon" unicode="&#xf1a4;" horiz-adv-x="512" 
d="M502.9 182v-69.7002c0 -62.0996 -50.3008 -112.399 -112.4 -112.399c-61.7998 0 -112.4 49.7998 -112.4 111.3v70.2002l34.3008 -16l51.0996 15.1992v-70.5996c0 -14.7002 12 -26.5 26.7002 -26.5s26.7998 11.7998 26.7998 26.5v72h85.9004zM278.2 240.2v30.8994
c0 14.7002 -12 26.7002 -26.7002 26.7002s-26.7002 -12 -26.7002 -26.7002v-160.3c0 -61.2998 -50.7998 -110.8 -112.399 -110.8c-62.1006 0 -112.4 50.2998 -112.4 112.3v69.7002h86v-68.5996c0 -14.9004 12 -26.7002 26.7002 -26.7002s26.7002 11.7998 26.7002 26.7002
v162.399c0 60 51.2998 108.2 112.1 108.2c61 0 112.1 -48.5 112.1 -109v-35.5996l-51.0996 -15.2002z" />
    <glyph glyph-name="delicious" unicode="&#xf1a5;" 
d="M446.5 380c1 -3.7998 1.5 -7.90039 1.59961 -12v-352.1c0 -26.5 -21.5 -48 -48 -48h-352c-4.09961 0 -8.19922 0.5 -12 1.5c-7.69922 2 -14.5996 5.7998 -20.2998 11c-1.2002 1.09961 -2.2998 2.19922 -3.2998 3.2998c-5.2002 5.7002 -9 12.5996 -11 20.2998
c-1 3.7998 -1.5 7.90039 -1.5 12v352c0 26.5 21.5 48 48 47.9004h352c4.09961 0 8.2002 -0.5 12 -1.5c1.90039 -0.400391 3.7002 -1 5.40039 -1.7002c1.89941 -0.700195 3.69922 -1.5 5.5 -2.5c1.39941 -0.700195 2.69922 -1.5 4 -2.40039
c1.09961 -0.799805 2.19922 -1.59961 3.2998 -2.5c2.5 -2 4.7998 -4.2998 6.89941 -6.7998c1.7002 -2.09961 3.30078 -4.5 4.7002 -6.90039c1.2998 -2.2998 2.40039 -4.59961 3.2998 -7.09961c0.5 -1.5 1 -3 1.40039 -4.5zM416 16v176h-192v192h-176
c-8.7998 0 -16 -7.2002 -16 -16v-176h192v-192h176c8.7998 0 16 7.2002 16 16z" />
    <glyph glyph-name="digg" unicode="&#xf1a6;" horiz-adv-x="512" 
d="M81.7002 275.7v76.2998h51v-250.7h-132.7v174.4h81.7002zM81.7002 142.3v92.2998h-30.7998v-92.2998h30.7998zM378.9 275.7h133.1v-243.7h-133.1v40.7998h81.7998v28.5h-81.7998v174.4zM460.7 142.3v92.2998h-30.7998v-92.2998h30.7998zM225.1 101.3v174.4h133.301
v-243.7h-133.301v40.7998h82.1006v28.5h-82.1006zM276.3 234.6v-92.2998h30.7998v92.2998h-30.7998zM153.3 352h51.2998v-51h-51.2998v51zM153.3 275.7h51.2998v-174.4h-51.2998v174.4z" />
    <glyph glyph-name="pied-piper-pp" unicode="&#xf1a7;" 
d="M205.3 273.4c0 -21.1006 -14.2002 -38.1006 -31.7002 -38.1006c-7.09961 0 -12.7998 1.2002 -17.1992 3.7002v68c4.39941 2.7002 10.0996 4.2002 17.1992 4.2002c17.5 0 31.7002 -16.9004 31.7002 -37.7998zM257.9 206.4c17.3994 0 31.6992 -17 31.6992 -38.1006
c0 -20.8994 -14.2998 -37.7998 -31.6992 -37.7998c-7.10059 0 -12.8008 1.2002 -17.2002 3.7002v68c4.39941 2.7002 10.0996 4.2002 17.2002 4.2002zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352
c26.5 0 48 -21.5 48 -48zM185 192.9c41 0 74.2002 35.5996 74.2002 79.5996s-33.2002 79.5996 -74.2002 79.5996c-12 0 -24.0996 -3.19922 -34.5996 -8.7998h-45.7002v-206.3l51.7998 10.0996v50.6006c8.59961 -3.10059 18.0996 -4.7998 28.5 -4.7998zM343.4 167.6
c0 44 -33.2002 79.6006 -73.9004 79.6006c-3.2002 0 -6.40039 -0.200195 -9.59961 -0.700195c-3.7002 -12.5 -10.1006 -23.7998 -19.2002 -33.4004c-13.7998 -15 -32.2002 -23.7998 -51.7998 -24.7998v-156.3l51.7998 10.0996v50.6006
c8.59961 -3.2002 18.2002 -4.7002 28.7002 -4.7002c40.7998 0 74 35.5996 74 79.5996z" />
    <glyph glyph-name="pied-piper-alt" unicode="&#xf1a8;" horiz-adv-x="576" 
d="M244 202l-27.7002 -5.7002l-1.7002 4.90039c6.7002 0.5 12.7002 3.7002 19.3008 3.7002c3.7998 0 6.89941 -0.900391 10.0996 -2.90039zM379.9 4.09961c9.5 0 28.1992 -45.0996 33 -55.0996c-35.9004 -13.4004 -70.3008 -15.9004 -106 -9.7998l-6.90039 45.0996
c15.7998 10.2998 60.9004 19.7998 79.9004 19.7998zM340.8 271c-7.59961 3.5 -63.8994 6.40039 -98.7998 -10c6.2998 11.7998 13.2002 17 25.9004 21.7998c27.2998 10.2998 40.1992 30.5 58.8994 51.1006c11.9004 -8.40039 12 -24.6006 31.6006 -23v-21.8008
l6.2998 -0.299805c37.3994 14.4004 74.7002 30.2002 106.6 54.6006c48.2998 36.7998 52.9004 50 81.2998 100l2 2.59961c-0.599609 -14.0996 -6.2998 -27.2998 -12.3994 -39.9004c-30.5 -63.7998 -78.7002 -100.3 -146.8 -116.699
c-12.4004 -2.90039 -26.4004 -3.2002 -37.6006 -8.90039c1.40039 -9.7998 13.2002 -18.0996 13.2002 -23c0 -3.40039 -5.5 -7.2002 -7.5 -8.59961c-11.2002 12.8994 -16.0996 19.2998 -22.7002 22.0996zM555.5 448l-0.299805 -1.40039l-0.600586 -0.599609
l0.300781 0.900391zM496.3 65.9004c20.1006 -34.2002 43.7002 -54.3008 72.7002 -79.9004c-31 -19.2998 -70.4004 -32.2002 -103.5 -47.2002c-55.2002 46.2998 -23 229.9 -111.5 229.9c-3.5 -0.700195 -2.40039 -0.299805 -4.59961 -1.7002
c1.09961 -1.40039 2.59961 -2.90039 3.69922 -4c23.9004 -20.0996 33.4004 -24.4004 34.8008 -58.5996l0.299805 -9.5c0.799805 -21.6006 -5.5 -42.5 -9.7998 -63.5c-25.9004 0.699219 -51.2002 -11 -77.9004 -2.90039c-0.700195 5.90039 -1.09961 30.9004 0.299805 41.0996
c1.40039 9.5 33.6006 29.9004 33 43.7002c-5.5 0.600586 -9.2002 -2.59961 -12.3994 -6.89941c-13.3008 -19.5 -47.2002 -41.9004 -71.3008 -41.9004c-16.5996 0 -56.2998 71.5 -76.3994 85.9004c-3.2002 2.2998 -5.2002 5.39941 -7.7998 8.59961
c-16.1006 -3.7998 -139.4 -32.2002 -147.4 -32.2002c-6 0 -11.5 4.90039 -11.5 10.9004c0 5.5 3.40039 10.7002 8.90039 11.7998l139.6 30.4004c-9.5 17.1992 12.2998 17.5 21.5 20.0996c3.2002 0.799805 6.2998 4 9.5 4c6.2998 0 11.7998 -8.90039 13.7998 -14.0996
c6.2998 1.39941 45.7002 10.5996 49.4004 10.5996c15.2002 0 15.8994 -20.0996 2.89941 -22.7002l-52.2998 -11.5l-0.299805 -4.59961c-0.299805 -10.1006 45.4004 -60.1006 53.4004 -60.1006c18.0996 0 54.8994 41.7002 54.8994 60.1006
c0 30.7002 -42.7998 12.5996 -42.7998 33.5996c0 3.5 1.2002 6.60059 2.90039 9.7998l-19.5 5.5c13.0996 13.6006 13.7998 31.7002 10.8994 50.3008c14.7002 2.89941 26.7002 4.59961 41.4004 4.59961c56.8994 0 45.7002 -8.59961 65.5 -54.2998l14.3994 7.2002
c-2.2998 -34.2002 -36.1992 -17.5 -35.0996 -31l0.299805 -6c74.7002 2.89941 116.101 -58.6006 150 -115.5zM300.1 19.7998h8.90039l2.90039 -23.7998l-11.8008 -3.40039v27.2002zM231.4 170.2l13.7998 3.5l31.2998 -50.9004l-21 -13.7998zM315.8 15.2998
c22.6006 2.5 32.7002 6.2998 59.5 6.2998c0.299805 -1.39941 0.900391 -3.19922 0.900391 -4.59961c0 -7.5 -49.4004 -12.5996 -58.4004 -14.0996z" />
    <glyph glyph-name="drupal" unicode="&#xf1a9;" 
d="M319.5 333.3c13.5 -8.2998 96.5 -67 96.5 -179.3c0 -112 -88.5 -186 -190.2 -186c-102 0 -193.8 80.2998 -193.8 189.5c0 109 85 167.5 100.8 175.8c18.7002 10.1006 32.2002 15.2998 53.5 32.2998c10.5 8.30078 19.2998 20.2002 22 49.5
c15.2002 -18.2998 33.5 -39.5 46.5 -48.2998c21.2002 -14 42.5 -19.5 64.7002 -33.5zM322 7.7002c4.2002 4.2002 1.90039 13.0996 -4.2002 8.5c-8.5 -6.2998 -27.5 -14 -54.5 -14c-34.5 0 -51.5 13.2998 -51.5 13.2998c-6.2002 0 -11.2998 -7.2002 -6.5 -12
c26.6006 -24.5 96.6006 -15.9004 116.7 4.2002zM267.5 60.2998c-6.5 -2.7002 -28.4004 -16.7998 -22.4004 -25c2.40039 -3.2998 5.2002 -1.2998 12.2002 4.7002c7.2002 5.7998 12 11 26.7002 11c25.2998 0 18.0996 -19.9004 26.5 -15.7002
c9.90039 4.90039 -2.09961 20.9004 -6.2002 23.7002c-7.7998 5.09961 -28.0996 4.90039 -36.7998 1.2998zM360 43c39.0996 -3.2998 64.5 106 15.7998 106c-20 0 -60.5 -41.5 -81.7998 -41.7998c-24.7002 -0.5 -59 49 -108.5 48.5
c-66.4004 -0.400391 -90.5996 -78.6006 -51.7998 -105.2c57.2002 -38.7002 130.399 42.9004 161.3 42c19.5 -0.700195 49.7998 -48.5 65 -49.5z" />
    <glyph glyph-name="joomla" unicode="&#xf1aa;" 
d="M0.599609 355.9c0 33.2998 26.8008 60.0996 59.8008 60.0996c30 0 54.5 -21.9004 59.1992 -50.2002c32.6006 7.60059 67.1006 -0.599609 96.5 -30l-44.2998 -44.2998c-20.5 20.5 -42.5996 16.2998 -55.3994 3.5c-14.3008 -14.2998 -14.3008 -37.9004 0 -52.2002
l99.5 -99.5l-44 -44.2998c-87.7002 87.2002 -49.7002 49.7002 -99.8008 99.7002c-26.7998 26.5 -35 64.7998 -24.7998 98.8994c-26.8994 5.80078 -46.7002 29.7002 -46.7002 58.3008zM130.1 239.5c28.5 28.4004 81.3008 80.7998 99.6006 99.9004
c26.5996 26.5996 64.5 35 98.2998 25.0996c4.09961 29.0996 29.2002 51.5996 59.5 51.5996c33 0 59.7998 -26.8994 59.7998 -60.0996c0 -30.2998 -22.7002 -55.4004 -51.8994 -59.5c9.59961 -33.5996 2.2998 -70 -28.9004 -101.2l-44 44.2998
c20.5 20.4004 16.2998 42.6006 3.5 55.4004c-14.2998 14.2998 -37.5996 14.2998 -51.9004 0c-10 -10.0996 -89.6992 -89.7998 -99.6992 -99.7998zM396.4 87.2998c29.0996 -4.09961 51.5996 -28.8994 51.5996 -59.0996c0 -33.2998 -26.7998 -60.1006 -59.7998 -60.1006
c-29.2002 0 -53.4004 20.7002 -58.9004 48.1006c-34.7002 -10.7998 -75.0996 -2.2002 -102.7 28l44 44.2998c20.4004 -20.5 42.6006 -16.2998 55.4004 -3.5c14.2998 14.2998 14.2998 37.5996 0 51.9004l-99.7002 99.6992l44.2998 44.3008
c104.5 -104.4 87.7002 -87.5 99.5 -99.7002c25.4004 -25.4004 34.5 -61.2002 26.3008 -93.9004zM312.1 140.4c-87.2998 -87.3008 -67.3994 -67.7002 -99.5 -99.7002c-25.6992 -25.4004 -61.5 -34.2002 -94.1992 -26c-6.10059 -26.9004 -30 -46.7002 -58.6006 -46.7002
c-33 0 -59.7998 26.7998 -59.7998 60.0996c0 28.3008 19.5 52.2002 46.2002 58.2002c-8.5 33.1006 -0.700195 68.1006 29.5 98.2998l44 -44.2998c-20.1006 -20.0996 -16.2998 -42 -3.2002 -55.3994c14.2998 -14.3008 37.5996 -14.3008 51.9004 0
c49.2998 49.3994 12.6992 13.3994 99.6992 99.7998z" />
    <glyph glyph-name="behance" unicode="&#xf1b4;" horiz-adv-x="576" 
d="M232 210.8c43.5996 -12.2998 64.7002 -45.2002 64.7002 -89.7002c0 -72 -60.5 -102.899 -124.9 -102.899h-171.8v354.399h167.1c60.7002 0 113.301 -17.1992 113.301 -87.7998c0 -35.7998 -16.6006 -58.7998 -48.4004 -74zM77.9004 312.1v-82.6992h79
c27.7998 0 47.5 12.0996 47.5 42.1992c0 32.6006 -25.3008 40.5 -53.4004 40.5h-73.0996zM161.2 78.4004c31.7002 0 57.5996 11.1992 57.5996 47c0 36.2998 -21.7002 50.5996 -56 50.5996h-84.8994v-97.5996h83.2998zM519.7 319.1h-143.7v34.9004h143.7v-34.9004zM576 142.8
c0 -4.5 -0.299805 -9 -0.599609 -13.2002h-185.101c0 -41.0996 21.7002 -65.2998 63 -65.2998c21.4004 0 49 11.6006 55.7002 33.5h62.2002c-19.1006 -58.7002 -58.7998 -86.2998 -120.101 -86.2998c-81 0 -131.3 54.7998 -131.3 134.7c0 77 53.1006 135.8 131.3 135.8
c80.5 0 124.9 -63.2998 124.9 -139.2zM390.4 174h114.699c-3 34 -20.7998 54.7998 -56.1992 54.7998c-33.8008 0 -56.2002 -21.0996 -58.5 -54.7998z" />
    <glyph glyph-name="behance-square" unicode="&#xf1b5;" 
d="M186.5 155c0 -19.2998 -14 -25.4004 -31.2002 -25.4004h-45.0996v52.9004h46c18.5996 -0.0996094 30.2998 -7.7998 30.2998 -27.5zM178.8 237.3c0 -16.2998 -10.7002 -22.8994 -25.7998 -22.8994h-42.7002v44.7998h39.6006c15.1992 0 28.8994 -4.2002 28.8994 -21.9004z
M311.1 214.1c19.2002 0 28.8008 -11.1992 30.5 -29.6992h-62.1992c1.19922 18.2998 13.3994 29.6992 31.6992 29.6992zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM271.7 263h77.7998
v18.9004h-77.7998v-18.9004zM228.7 152.7c0 24.0996 -11.4004 44.8994 -35 51.5996c17.2002 8.2002 26.2002 17.7002 26.2002 37c0 38.2002 -28.5 47.5 -61.4004 47.5h-90.5v-192h93.0996c34.9004 0.200195 67.6006 16.9004 67.6006 55.9004zM380 167.5
c0 41.0996 -24.0996 75.4004 -67.5996 75.4004c-42.4004 0 -71.1006 -31.8008 -71.1006 -73.6006c0 -43.2998 27.2998 -73 71.1006 -73c33.1992 0 54.6992 14.9004 65.0996 46.7998h-33.7002c-3.7002 -11.8994 -18.5996 -18.0996 -30.2002 -18.0996
c-22.3994 0 -34.0996 13.0996 -34.0996 35.2998h100.2c0.0996094 2.2998 0.299805 4.7998 0.299805 7.2002z" />
    <glyph glyph-name="steam" unicode="&#xf1b6;" horiz-adv-x="496" 
d="M496 192c0 -137 -111.2 -248 -248.4 -248c-113.8 0 -209.6 76.2998 -239 180.4l95.2002 -39.3008c6.40039 -32.0996 34.9004 -56.3994 68.9004 -56.3994c39.2002 0 71.8994 32.3994 70.2002 73.5l84.5 60.2002c52.0996 -1.30078 95.7998 40.8994 95.7998 93.5
c0 51.5996 -42 93.5 -93.7002 93.5s-93.7002 -42 -93.7002 -93.5v-1.2002l-59.2002 -85.7002c-15.5 0.900391 -30.6992 -3.40039 -43.5 -12.0996l-133.1 55c10.2002 127.699 117.1 228.1 247.6 228.1c137.2 0 248.4 -111 248.4 -248zM155.7 63.7002
c19.7998 -8.2002 42.5 1.09961 50.7998 21c8.2998 19.7998 -1.09961 42.5 -20.9004 50.7002l-31.5 13c12.2002 4.59961 26 4.7998 38.9004 -0.600586c13 -5.39941 23.0996 -15.5996 28.5 -28.5996s5.2998 -27.2998 -0.0996094 -40.2998
c-11.2002 -26.8008 -42.1006 -39.6006 -69 -28.4004c-10.2119 4.26953 -22.3975 15.8281 -27.2002 25.7998zM329.5 193.6c-34.4004 0 -62.4004 28 -62.4004 62.3008c0 34.2998 28 62.2998 62.4004 62.2998s62.4004 -28 62.4004 -62.2998
c0 -34.3008 -27.9004 -62.3008 -62.4004 -62.3008zM329.6 209.2c25.9004 0 46.9004 21 46.9004 46.7998c0 25.9004 -21 46.7998 -46.9004 46.7998c-25.8994 0 -46.8994 -21 -46.8994 -46.7998c0.0996094 -25.7998 21.0996 -46.7998 46.8994 -46.7998z" />
    <glyph glyph-name="steam-square" unicode="&#xf1b7;" 
d="M185.2 91.5c7.7002 18.5 -1 39.7002 -19.6006 47.4004l-29.5 12.1992c11.4004 4.30078 24.3008 4.5 36.4004 -0.5c12.2002 -5.09961 21.5996 -14.5996 26.7002 -26.6992c5 -12.2002 5 -25.6006 -0.100586 -37.7002c-10.5 -25.1006 -39.3994 -37 -64.5996 -26.5
c-11.5996 4.7998 -20.4004 13.5996 -25.4004 24.2002l28.5 -11.8008c18.6006 -7.7998 39.9004 0.900391 47.6006 19.4004zM400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v112.8l89.0996 -36.8994
c6 -30 32.7002 -52.7002 64.5 -52.7002c36.6006 0 67.3008 30.2998 65.7002 68.7998l79 56.2998c48.7002 -1.2002 89.6006 38.2998 89.6006 87.5c0 48.2002 -39.3008 87.5 -87.6006 87.5s-87.5996 -39.2998 -87.5996 -87.5v-1.09961l-55.4004 -80.2002
c-14.5 0.799805 -28.7002 -3.09961 -40.7002 -11.2998l-116.6 48.0996v160.7c0 26.5 21.5 48 48 48h352zM300.3 193.5c-32.2002 0 -58.3994 26.0996 -58.3994 58.2998s26.1992 58.2998 58.3994 58.2998s58.4004 -26.1992 58.4004 -58.2998
c0 -32.0996 -26.2002 -58.2998 -58.4004 -58.2998zM300.4 208.1c24.1992 0 43.8994 19.6006 43.8994 43.8008c0 24.1992 -19.5996 43.7998 -43.8994 43.7998c-24.2002 0 -43.9004 -19.6006 -43.9004 -43.7998c0 -24.2002 19.7002 -43.8008 43.9004 -43.8008z" />
    <glyph glyph-name="spotify" unicode="&#xf1bc;" horiz-adv-x="496" 
d="M248 440c136.9 0 248 -111.1 248 -248s-111.1 -248 -248 -248s-248 111.1 -248 248s111.1 248 248 248zM348.7 75.0996c8.09961 0 15.2002 6.30078 15.2002 15.4004s-3.60059 12.5996 -9.7002 16.5c-71.4004 42.7002 -155.101 44.2998 -237 26.2002
c-7.5 -1.60059 -13.6006 -6.5 -13.6006 -16.7998c0 -8.10059 6.10059 -15.8008 15.8008 -15.8008c2.89941 0 8 1.60059 11.8994 2.60059c71.7002 14.7002 144.3 13.0996 206.7 -24.5c3.90039 -2.2998 6.5 -3.60059 10.7002 -3.60059zM375.6 140.7
c10.9004 0 19.3008 8.7002 19.4004 19.5c0 8.7002 -3.2002 14.8994 -11.2998 19.7002c-49.4004 29.3994 -112.101 45.5 -177 45.5c-41.6006 0 -70 -5.80078 -97.7998 -13.6006c-10.3008 -2.89941 -15.5 -10 -15.5 -20.7002c0 -10.6992 8.69922 -19.3994 19.3994 -19.3994
c4.5 0 7.10059 1.2998 11.9004 2.59961c82.8994 22.5 176.1 7.60059 238.6 -29.3994c3.60059 -1.90039 7.10059 -4.2002 12.2998 -4.2002zM406.6 216.9c12.2002 0 23.2002 9.69922 23.2002 23.2998c0 11.8994 -5.09961 18.0996 -12.8994 22.5996
c-55.9004 32.6006 -132.4 47.7998 -205.4 47.7998c-42.9004 0 -82.2998 -4.89941 -117.5 -15.1992c-9 -2.60059 -17.4004 -10.3008 -17.4004 -23.9004c0 -13.2998 10.1006 -23.5996 23.3008 -23.5996c4.7998 0 9.2998 1.59961 12.8994 2.59961
c82.4004 23 209.7 12.7998 280.9 -29.7002c4.5 -2.59961 7.7002 -3.89941 12.8994 -3.89941z" />
    <glyph glyph-name="deviantart" unicode="&#xf1bd;" horiz-adv-x="320" 
d="M320 354.8l-98.2002 -179.1l7.40039 -9.5h90.7998v-127.7h-160.9l-13.5 -9.2002l-43.6992 -84c-0.300781 0 -8.60059 -8.59961 -9.2002 -9.2002h-92.7002v93.2002l93.2002 179.4l-7.40039 9.2002h-85.7998v127.6h156l13.5 9.2002l43.7002 84
c0.299805 0 8.59961 8.59961 9.2002 9.2002h97.5996v-93.1006z" />
    <glyph glyph-name="soundcloud" unicode="&#xf1be;" horiz-adv-x="640" 
d="M111.4 191.7l5.7998 -65l-5.7998 -68.2998c-0.300781 -2.5 -2.2002 -4.40039 -4.40039 -4.40039s-4.2002 1.90039 -4.2002 4.40039l-5.59961 68.2998l5.59961 65c0 2.2002 1.90039 4.2002 4.2002 4.2002c2.2002 0 4.09961 -2 4.40039 -4.2002zM132.8 237.3
c2.5 0 4.7002 -2.2002 4.7002 -5l5.7998 -105.6l-5.7998 -68.2998c0 -2.80078 -2.2002 -5 -4.7002 -5c-2.7998 0 -4.7002 2.19922 -5 5l-5 68.2998l5 105.6c0.299805 2.7998 2.2002 5 5 5zM158.3 261.4c2.7998 0 5.2998 -2.2002 5.2998 -5.30078l5.30078 -130
l-5.30078 -67.7998c0 -3.09961 -2.5 -5.2998 -5.2998 -5.2998c-3.09961 0 -5.2998 2.2002 -5.59961 5.2998l-4.40039 67.7998l4.40039 130c0.299805 3.10059 2.5 5.30078 5.59961 5.30078zM7.2002 164.8c1.39941 0 2.2002 -1.09961 2.5 -2.5l5.59961 -35.5996l-5.59961 -35
c-0.299805 -1.40039 -1.10059 -2.5 -2.5 -2.5c-1.40039 0 -2.2002 1.09961 -2.5 2.5l-4.7002 35l4.7002 35.5996c0.299805 1.40039 1.09961 2.5 2.5 2.5zM30.7998 186.7c1.40039 0 2.5 -1.10059 2.7998 -2.5l7.2002 -57.5l-7.2002 -56.4004
c-0.299805 -1.39941 -1.39941 -2.5 -2.7998 -2.5c-1.39941 0 -2.5 1.10059 -2.5 2.7998l-6.39941 56.1006l6.39941 57.5c0 1.39941 1.10059 2.5 2.5 2.5zM56.0996 198.1c1.7002 0 3.10059 -1.39941 3.10059 -3.2998l6.89941 -68.0996l-6.89941 -65.7998
c0 -1.7002 -1.40039 -3.10059 -3.10059 -3.10059c-1.59961 0 -3 1.40039 -3.2998 3.10059l-5.7998 65.7998l5.7998 68.0996c0.200195 1.90039 1.60059 3.2998 3.2998 3.2998zM81.4004 200.3c1.89941 0 3.59961 -1.39941 3.89941 -3.59961l6.40039 -70l-6.40039 -67.7998
c-0.299805 -2.2002 -2 -3.60059 -3.89941 -3.60059c-1.90039 0 -3.60059 1.40039 -3.60059 3.60059l-5.7998 67.7998l5.7998 70c0 2.2002 1.7002 3.59961 3.60059 3.59961zM322.8 311.2c2.5 -1.40039 4.10059 -4.2002 4.5 -7.2002l3.90039 -177.5l-3.90039 -64.2002
c0 -4.7002 -3.89941 -8.59961 -8.59961 -8.59961s-8.60059 3.89941 -8.90039 8.59961l-1.7002 31.7002l-1.69922 32.5l3.2998 176.7v0.799805c0.200195 2.5 1.39941 5 3.2998 6.7002c1.40039 1.09961 3.40039 1.89941 5.59961 1.89941
c1.40039 0 3.10059 -0.599609 4.2002 -1.39941zM296.1 295.9c2.2002 -1.40039 3.60059 -3.90039 3.90039 -6.7002l3.2998 -162.8l-3.09961 -58.6006l-0.299805 -6.7002c0 -2.2998 -0.800781 -4.19922 -2.5 -5.59961c-1.40039 -1.40039 -3.40039 -2.5 -5.60059 -2.5
c-2.5 0 -4.7002 1.2002 -6.39941 3.09961c-1.10059 1.40039 -1.7002 3 -1.7002 4.7002v0.299805c-3.10059 65.3008 -3.10059 65.6006 -3.10059 65.6006l2.80078 160.8l0.299805 1.7002c0 2.7998 1.39941 5.2998 3.59961 6.7002
c1.2998 0.799805 2.7998 1.39941 4.40039 1.39941c1.59961 0 3 -0.599609 4.39941 -1.39941zM184.7 273.4c3.39941 0 5.89941 -2.80078 6.09961 -6.10059l5 -140.6l-5 -67.2002c-0.299805 -3.2998 -2.7998 -5.7998 -6.09961 -5.7998c-3 0 -5.5 2.5 -5.7998 5.7998
l-4.40039 67.2002l4.40039 140.6c0 3.2998 2.69922 6.10059 5.7998 6.10059zM561.4 210.6c43.2998 0 78.5996 -35.2998 78.5 -78.8994c0 -43.2998 -35.3008 -78.2998 -78.6006 -78.2998h-218.3c-4.7002 0.599609 -8.59961 4.19922 -8.59961 9.19922v249.7
c0 4.7998 1.69922 7 7.7998 9.2002c15.2998 6.09961 32.5 9.40039 50.2998 9.40039c72.5 0 131.9 -55.6006 138.3 -126.4c9.5 3.90039 19.7998 6.09961 30.6006 6.09961zM264.7 270.9c4.2002 0 7.2002 -3.30078 7.5 -7.80078l3.89941 -136.699l-3.89941 -65.6006
c0 -4.2002 -3.2998 -7.5 -7.5 -7.5s-7.5 3.2998 -7.7998 7.5l-3.30078 65.6006l3.30078 136.699c0.299805 4.5 3.59961 7.80078 7.7998 7.80078zM211.1 278.7c3.60059 0 6.40039 -3.10059 6.7002 -6.7002l4.40039 -145.3l-4.40039 -66.9004
c-0.299805 -3.59961 -3.09961 -6.39941 -6.7002 -6.39941c-3.2998 0 -6.09961 2.7998 -6.39941 6.39941l-3.90039 66.9004l3.90039 145.3c0 3.59961 3.09961 6.7002 6.39941 6.7002zM237.8 275.3c3.90039 0 6.90039 -3 6.90039 -6.89941l4.2002 -141.7l-4.2002 -66.4004
c0 -3.7998 -3.10059 -6.89941 -6.90039 -6.89941s-6.59961 3 -6.89941 6.89941l-3.90039 66.4004l3.90039 141.7c0 3.7998 3 6.89941 6.89941 6.89941z" />
    <glyph glyph-name="vine" unicode="&#xf1ca;" horiz-adv-x="384" 
d="M384 193.3v-52.0996c-18.4004 -4.2002 -36.9004 -6.10059 -52.0996 -6.10059c-36.9004 -77.3994 -103 -143.8 -125.101 -156.199c-14 -7.90039 -27.0996 -8.40039 -42.7002 0.799805c-27.0996 16.2998 -129.899 100.6 -164.1 365.6h74.5
c18.7002 -159.1 64.5 -240.7 114.8 -301.8c27.9004 27.9004 54.7998 65.0996 75.6006 106.9c-49.8008 25.2998 -80.1006 80.8994 -80.1006 145.6c0 65.5996 37.7002 115.1 102.2 115.1c114.9 0 106.2 -127.899 81.5996 -181.5c0 0 -46.3994 -9.19922 -63.5 20.5
c3.40039 11.3008 8.2002 30.8008 8.2002 48.5c0 31.3008 -11.2998 46.6006 -28.3994 46.6006c-18.2002 0 -30.8008 -17.1006 -30.8008 -50c0.100586 -79.2002 59.4004 -118.7 129.9 -101.9z" />
    <glyph glyph-name="codepen" unicode="&#xf1cb;" horiz-adv-x="512" 
d="M502.285 288.296c6.00098 -3.99902 9.71484 -11.1426 9.71582 -18.2852v-155.999c0 -7.14258 -3.71484 -14.2871 -9.71484 -18.2861l-234 -156.021c-8.06055 -4.95996 -16.584 -4.91504 -24.5713 0l-234 156.021c-6.00098 4 -9.71484 11.1436 -9.71484 18.2861v155.999
c0 7.14258 3.71387 14.2861 9.71387 18.2852l234 156c8.06055 4.95996 16.584 4.91504 24.5713 0zM278 384.869v-102.572l95.4287 -63.7148l76.8574 51.4287zM234 384.869l-172.286 -114.858l76.8574 -51.4287l95.4287 63.7148v102.572zM44 228.868v-73.7139
l55.1426 36.8564zM234 -0.84668v102.571l-95.4287 63.7158l-76.8574 -51.4297zM256 140.011l77.7148 52l-77.7148 52l-77.7148 -52zM278 -0.84668l172.286 114.857l-76.8574 51.4297l-95.4287 -63.7158v-102.571zM468 155.154v73.7139l-55.1426 -36.8574z" />
    <glyph glyph-name="jsfiddle" unicode="&#xf1cc;" horiz-adv-x="576" 
d="M510.634 210.538c45.6885 -25.334 68.3721 -74.5605 56.832 -122.634c-12.1035 -50.4199 -55.5479 -86.6592 -108.212 -87.293c-84.0303 -1.01172 -168.079 -0.458984 -252.12 -0.480469c-30.3223 -0.00683594 -60.668 -0.492188 -90.959 0.539062
c-48.0938 1.63672 -91.7764 35.8643 -105.607 81.4326c-14.1289 46.5508 2.18945 94.623 41.9014 124.615c2.54688 1.92383 4.86914 6.52051 4.51465 9.54492c-3.74609 31.8604 7.14453 57.6709 32.6758 76.4082c26.2822 19.2881 55.2285 21.5879 85.3311 9.16699
c2.36621 -0.975586 4.63965 -2.17773 7.82422 -3.68555c16.5215 27.5332 38.1221 48.6523 65.4922 63.9023c92.8594 51.7402 210.954 8.31152 246.85 -91.6455c5.55762 -15.4766 6.74512 -32.6074 9.09668 -49.0947c0.716797 -5.02832 1.6543 -8.15527 6.38086 -10.7764z
M531.741 53.6582c39.3135 48.375 22.418 117.668 -35.1426 144.497c-7.43555 3.46582 -9.72559 7.74414 -9.84766 15.8936c-1.87012 125.129 -132.78 187.063 -230.24 132.697c-26.1133 -14.5674 -46.4492 -34.8955 -60.6709 -61.2939
c-7.59082 -14.0908 -11.9287 -7.97754 -22.1982 -2.52734c-24.6113 13.0635 -49.0469 12.6406 -72.0332 -3.08301c-21.9678 -15.0244 -31.9102 -36.6201 -26.4199 -62.9805c2.4082 -11.5703 -0.914062 -17.0635 -10.0967 -23.1367
c-38.1895 -25.2578 -53.0879 -74.8604 -34.1855 -116.105c18.4355 -40.2295 51.3135 -59.6631 95.1748 -59.9951c0.700195 -0.00488281 163.728 -0.545898 163.728 0.154297c56.8857 0 113.778 -0.551758 170.652 0.229492
c28.9375 0.397461 53.0498 13.2178 71.2803 35.6504zM443.952 134.157c-5.84863 -31.1572 -34.6221 -55.0967 -66.666 -55.0957c-16.9531 0.00195312 -32.0586 6.5459 -44.0791 17.7051c-27.6973 25.7139 -71.1406 74.9805 -95.9375 93.3877
c-20.0557 14.8877 -41.9893 12.333 -60.2715 -3.78223c-49.9961 -44.0713 15.8594 -121.775 67.0625 -77.1885c4.54883 3.95996 7.84082 9.54297 12.7441 12.8447c8.18457 5.50879 20.7666 0.883789 13.168 -10.6221c-17.3574 -26.2842 -49.3301 -38.1973 -78.8623 -29.3008
c-28.8975 8.70312 -48.8408 35.9678 -48.626 70.1787c1.22461 22.4844 12.3633 43.0596 35.4141 55.9648c22.5742 12.6377 46.3682 13.1455 66.9902 -2.47363c50.791 -38.4756 75.5781 -81.7451 107.296 -101.245c24.5586 -15.0996 54.2549 -7.36328 68.8232 17.5059
c28.8301 49.209 -34.5918 105.016 -78.8682 63.46c-3.98828 -3.74414 -6.91699 -8.93164 -11.4092 -11.7197c-10.9756 -6.81152 -17.333 4.1123 -12.8096 10.3525c20.7031 28.5537 50.4639 40.4404 83.2715 28.2139c31.4287 -11.7139 49.1074 -44.3662 42.7598 -78.1855z
" />
    <glyph glyph-name="rebel" unicode="&#xf1d0;" horiz-adv-x="512" 
d="M256.5 -56c-139.3 0 -247.5 116.2 -243.3 254.1c2.7998 79.2002 43.2002 152.2 116.5 200.4c0.299805 0 1.89941 0.599609 1.09961 -0.799805c-5.7998 -5.5 -111.3 -129.8 -14.0996 -226.4c49.7998 -49.5 90 -2.5 90 -2.5c38.5 50.1006 -0.600586 125.9 -0.600586 125.9
c-10 24.8994 -45.6992 40.0996 -45.6992 40.0996l28.7998 31.7998c24.3994 -10.5 43.2002 -38.6992 43.2002 -38.6992c0.799805 29.5996 -21.9004 61.3994 -21.9004 61.3994l44.5996 50.7002l44.3008 -50.0996c-20.5 -28.8008 -21.9004 -62.6006 -21.9004 -62.6006
c13.7998 23 43.5 39.2998 43.5 39.2998l28.5 -31.7998c-27.4004 -8.89941 -45.4004 -39.8994 -45.4004 -39.8994c-15.7998 -28.5 -27.0996 -89.4004 0.600586 -127.301c32.3994 -44.5996 87.7002 2.80078 87.7002 2.80078c102.699 91.8994 -10.5 225 -10.5 225
c-6.10059 5.5 0.799805 2.7998 0.799805 2.7998c50.0996 -36.5 114.6 -84.4004 116.2 -204.8c2 -145.601 -99.9004 -249.4 -242.4 -249.4z" />
    <glyph glyph-name="empire" unicode="&#xf1d1;" horiz-adv-x="496" 
d="M287.6 393.8c-10.7998 2.2002 -22.0996 3.2998 -33.5 3.60059v18.1992c78.1006 -2.19922 146.101 -44 184.601 -106.6l-15.7998 -9.09961c-6.10059 9.69922 -12.7002 18.7998 -20.2002 27.0996l-18 -15.5c-26 29.5996 -61.4004 50.7002 -101.9 58.4004zM53.4004 125.6
c3.89941 -10.7998 8.2998 -21.0996 13.5996 -31.0996l-15.7998 -9.09961c-17.1006 31.5996 -27.1006 68.0996 -27.1006 106.6s9.90039 75 27.1006 106.5l15.7998 -9.09961c-5.2998 -9.7002 -10 -20.2002 -13.5996 -31l22.6992 -7.7002
c-6.39941 -18.2998 -9.69922 -38.2002 -9.69922 -58.7002s3.59961 -40.4004 10 -58.7002zM213.1 14l-4.69922 -23.7998c10.7998 -1.90039 22.1992 -3.2998 33.5 -3.60059v-18.2998c-78.1006 2.2998 -146.4 44.2998 -184.9 106.601l16 9.39941
c5.7998 -9.7002 12.7002 -18.7998 20.2002 -27.3994l18 15.7998c26.0996 -29.6006 61.5 -50.7002 101.899 -58.7002zM93.2998 327.1c-7.5 -8.2998 -14.0996 -17.5 -20.0996 -27.1992l-15.7998 9.09961c38.5 62.5996 106.5 104.4 184.6 106.6v-18.1992
c-11.4004 -0.300781 -22.7002 -1.40039 -33.5 -3.60059l4.7002 -23.7998c-40.5 -7.7002 -75.9004 -28.7998 -101.9 -58.4004zM402.7 56.9004c7.5 8.59961 14.3994 17.6992 20.0996 27.3994l16.1006 -9.39941c-38.5 -62.3008 -106.801 -104.4 -184.9 -106.601v18.2998
c11.4004 0.300781 22.7002 1.7002 33.5 3.60059l-4.7002 23.7998c40.5 8 75.9004 29.0996 101.9 58.7002zM496 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM483.8 192c0 130.1 -105.7 235.8 -235.8 235.8
s-235.8 -105.7 -235.8 -235.8s105.7 -235.8 235.8 -235.8s235.8 105.7 235.8 235.8zM444.8 298.6c17.2002 -31.5996 27.1006 -68.0996 27.1006 -106.6s-9.90039 -75 -27.1006 -106.4l-15.7998 9.10059c5.2998 10 9.7002 20.2002 13.5996 31l-23 7.7002
c6.40039 18.2998 10 38.1992 10 58.6992s-3.2998 40.4004 -9.69922 58.7002l22.6992 7.7002c-3.59961 10.7998 -8.2998 21.2998 -13.5996 31zM261.8 120.9l13.2998 -66.7002c-8.59961 -1.7002 -17.6992 -2.7998 -27.0996 -2.7998s-18.5 1.09961 -27.0996 2.7998
l13.2998 66.7002c-16.2998 3.2998 -30.5 11.5996 -40.7002 23.5l-51.2002 -44.8008c-11.8994 13.6006 -21.2998 29.4004 -27.0996 46.8008l64.2002 22.0996c-2.5 7.40039 -3.90039 15.2002 -3.90039 23.5s1.40039 16 3.90039 23.5l-64.5 22.0996
c6.09961 17.5 15.5 33.2002 27.3994 46.8008l51.2002 -44.8008c10.2998 11.9004 24.4004 20.5 40.7002 23.8008l-13.2998 66.3994c8.59961 2 17.6992 2.7998 27.0996 2.7998s18.5 -0.899414 27.0996 -2.7998l-13.2998 -66.3994
c16.2998 -3.30078 30.5 -11.9004 40.7002 -23.8008l51.2002 44.8008c11.8994 -13.6006 21.2998 -29.4004 27.3994 -46.8008l-64.5 -22.0996c2.5 -7.40039 3.90039 -15.2002 3.90039 -23.5s-1.40039 -16 -3.90039 -23.5l64.2002 -22.0996
c-5.7998 -17.5 -15.2002 -33.2002 -27.0996 -46.8008l-51.2002 44.8008c-10.2998 -11.9004 -24.4004 -20.2002 -40.7002 -23.5z" />
    <glyph glyph-name="git-square" unicode="&#xf1d2;" 
d="M100.59 113.76c48.5703 -3.30957 58.9502 -2.10938 58.9502 -11.9395c0 -20 -65.5498 -20.0605 -65.5498 -1.52051c0.00976562 5.08984 3.29004 9.40039 6.59961 13.46zM128.54 230.4c30.96 0 31.7598 -44.4707 -0.75 -44.4707c-33 0 -31.54 44.4707 0.75 44.4707z
M448 368v-352c0 -26.4961 -21.5039 -48 -48 -48h-352c-26.4961 0 -48 21.5039 -48 48v352c0 26.4961 21.5039 48 48 48h352c26.4961 0 48 -21.5039 48 -48zM221 298.69c0 -14.4902 8.37988 -22.8809 22.8604 -22.8809c14.7393 0 23.1299 8.39062 23.1299 22.8809
c0 14.4893 -8.37012 22.3096 -23.1104 22.3096c-14.4795 0 -22.8799 -7.83984 -22.8799 -22.3096zM199.18 253h-49.5498c-25 6.5498 -81.5596 4.84961 -81.5596 -46.75c0 -18.7998 9.39941 -32 21.8496 -38.1104c-15.6895 -14.3701 -23.1201 -21.1396 -23.1201 -30.7393
c0 -6.87012 2.79004 -13.2207 11.1807 -16.7607c-8.90039 -8.39941 -14 -14.4795 -14 -25.9199c0.0195312 -20.0693 17.5498 -31.7197 63.5391 -31.7197c44.2207 0 69.8701 16.5098 69.8701 45.7305c0 36.6699 -28.2295 35.3193 -94.7695 39.3799l8.37988 13.4297
c17 -4.74023 74.1904 -6.23047 74.1904 42.4297c0 11.6904 -4.83008 19.8203 -9.40039 25.6699l23.3799 1.78027zM283.52 143.16l-13 1.78027c-3.81934 0.509766 -4.06934 1 -4.06934 5.08984v105.45h-52.6006l-2.79004 -20.5703c15.75 -5.5498 17 -4.86035 17 -10.1699
v-74.7402c0 -5.62012 -0.30957 -4.58008 -17 -6.87012v-20.0596h72.4209zM384 133l-6.87012 22.3701c-40.9297 -15.3701 -37.8496 12.4102 -37.8496 16.7295v60.7207h37.8496v25.4102h-35.8203c-2.86914 0 -2 -2.52051 -2 38.6299h-24.1797
c-2.79004 -27.7002 -11.6797 -38.8799 -34 -41.4199v-22.6201c20.4697 0 19.8203 0.849609 19.8203 -2.54004v-66.5703c0 -28.7197 11.4297 -40.9102 41.6699 -40.9102c14.4502 0 30.4502 4.83008 41.3799 10.2002z" />
    <glyph glyph-name="git" unicode="&#xf1d3;" horiz-adv-x="512" 
d="M216.29 289.61l0.0400391 -34.5508l-37.4102 -2.83984c7.27051 -9.35938 15 -22.3701 15 -41.0693c0 -77.8906 -91.4297 -75.4707 -118.7 -67.8906l-13.4297 -21.5498c106.47 -6.5 151.63 -4.33984 151.63 -63c0 -46.7598 -41.04 -73.1797 -111.79 -73.1797
c-73.5801 0 -101.63 18.71 -101.63 50.8193c0 18.3008 8.12988 28.04 22.4004 41.4502c-13.4199 5.66992 -17.8906 15.8105 -17.8906 26.8105c0 15.3594 11.9004 26.21 37 49.21c-20 9.76953 -35 30.9102 -35 61c0 82.5498 90.4902 85.2793 130.49 74.79h79.29z
M152.87 47.71c0 15.7402 -16.6104 13.8096 -94.3203 19.1104c-5.2998 -6.54004 -10.5693 -13.4004 -10.5693 -21.54c0 -29.6699 104.89 -29.6299 104.89 2.42969zM102.06 182.29c52.0205 0 50.7402 71.1602 1.2002 71.1602c-51.6602 0 -54 -71.1602 -1.2002 -71.1602z
M235.36 81.7803v32.0996c26.75 3.66016 27.2393 2 27.2393 11v119.51c0 8.5 -2.0498 7.37988 -27.2393 16.2607l4.46973 32.9199h84.1699v-168.71c0 -6.51074 0.400391 -7.32031 6.50977 -8.14062l20.7305 -2.83984v-32.0996h-115.88zM287.81 326.09
c-23.1699 0 -36.5898 13.4297 -36.5898 36.6104c0 23.1797 13.4199 35.7695 36.5898 35.7695c23.5801 0 37 -12.6201 37 -35.7695c0 -23.1504 -13.4199 -36.6104 -37 -36.6104zM512 97.54c-17.4902 -8.53027 -43.0996 -16.2598 -66.2803 -16.2598
c-48.3799 0 -66.6699 19.5 -66.6699 65.46v106.51c0 5.41992 1.0498 4.05957 -31.71 4.05957v36.1904c35.7803 4.07031 50 22 54.4697 66.2695h38.6309c0 -65.8291 -1.34082 -61.8096 3.25977 -61.8096h57.2998v-40.6504h-60.5596v-97.1494
c0 -6.91992 -4.9209 -51.4102 60.5693 -26.8398z" />
    <glyph glyph-name="hacker-news" unicode="&#xf1d4;" 
d="M0 416h448v-448h-448v448zM21.2002 218.8h-0.200195c0.0996094 0.100586 0.200195 0.299805 0.299805 0.400391c0 -0.100586 0 -0.299805 -0.0996094 -0.400391zM239.2 164.9l80.7998 155.1h-34.7998c-54.7998 -101.2 -48.2998 -98.5996 -60.6006 -125.6
c-10.0996 24.3994 -6.7998 27.2998 -59.2998 125.6h-37.2998l79.7998 -153.3v-102.7h31.4004v100.9z" />
    <glyph glyph-name="tencent-weibo" unicode="&#xf1d5;" horiz-adv-x="384" 
d="M72.2998 -47.7998c1.40039 -19.9004 -27.5996 -22.2002 -29.7002 -2.90039c-11.5996 129.9 31.1006 239.5 101.4 313.2c-15.5996 34 9.2002 77.0996 50.5996 77.0996c30.3008 0 55.1006 -24.5996 55.1006 -55.0996c0 -44 -49.5 -70.7998 -86.9004 -45.0996
c-65.7002 -71.3008 -101.399 -169.801 -90.5 -287.2zM192 447.9c92 0 166.6 -74.6006 166.6 -166.5c0 -102.301 -93.2998 -185.5 -204 -162.301c-19 4.7002 -12.5 33.2002 6.60059 29.1006c80.7998 -20.7998 167.7 42.2998 167.7 133.1c0 75.5 -61.5 136.9 -136.9 136.9
c-101 0 -168.3 -106.601 -122 -199.2c9 -17.9004 -17.5996 -30.7998 -26.2998 -13.4004c-56 108.101 22.3994 242.301 148.3 242.301z" />
    <glyph glyph-name="qq" unicode="&#xf1d6;" 
d="M433.754 27.5547c-11.5264 -1.39258 -44.8604 52.7412 -44.8604 52.7412c0 -31.3447 -16.1357 -72.2471 -51.0508 -101.786c16.8418 -5.19141 54.8428 -19.167 45.8037 -34.4209c-7.31641 -12.3428 -125.511 -7.88086 -159.633 -4.03711
c-34.1221 -3.84375 -152.315 -8.30566 -159.632 4.03711c-9.04492 15.25 28.918 29.2139 45.7832 34.415c-34.9199 29.5391 -51.0586 70.4453 -51.0586 101.792c0 0 -33.334 -54.1338 -44.8594 -52.7412c-5.37012 0.650391 -12.4238 29.6445 9.34668 99.7041
c10.2617 33.0244 21.9951 60.4785 40.1445 105.779c-3.05566 116.898 45.2441 214.956 160.262 214.962c113.737 -0.00585938 163.156 -96.1328 160.264 -214.963c18.1182 -45.2227 29.9121 -72.8506 40.1445 -105.778c21.7676 -70.0596 14.7158 -99.0527 9.3457 -99.7041z
" />
    <glyph glyph-name="weixin" unicode="&#xf1d7;" horiz-adv-x="576" 
d="M385.2 280.4c-92.4004 0 -165.4 -69.1006 -165.3 -154c0 -14.2002 2.19922 -27.9004 6.19922 -40.8008c-6.19922 -0.5 -12.0996 -0.799805 -18.2998 -0.799805c-24.3994 0 -43.7998 4.90039 -68.2002 9.7002l-68 -34.0996l19.3008 58.5996
c-48.6006 34.0996 -77.9004 78.2002 -77.9004 131.6c0 92.6006 87.5 165.4 194.7 165.4c95.5996 0 179.7 -58.2998 196.3 -136.7c-6.2002 0.799805 -12.4004 1.10059 -18.7998 1.10059zM280.7 333.3c-14.7002 0 -29.2002 -9.7002 -29.2998 -24.3994
c0 -14.5 14.5 -24.2002 29.2998 -24.2002c14.5 0 24.2002 9.7002 24.2002 24.2002c0 14.6992 -9.7002 24.3994 -24.2002 24.3994zM144.3 284.7c14.7998 0 24.4004 9.59961 24.4004 24.2002c0 14.6992 -9.60059 24.3994 -24.4004 24.3994
c-14.5 0 -29.2998 -9.59961 -29.2998 -24.3994c0 -14.5 14.7998 -24.2002 29.2998 -24.2002zM563 128.6c0 -43.7998 -29 -82.6992 -68.2002 -112.1l14.7998 -48.5996l-53.3994 29.2998c-19.7002 -4.7998 -39.2998 -9.90039 -58.6006 -9.90039
c-92.5996 0 -165.399 63.4004 -165.399 141.3c0 77.9004 72.7002 141.301 165.399 141.301c87.5 0 165.4 -63.4004 165.4 -141.301zM343.9 153.1c14.6992 0 24.3994 9.60059 24.3994 19.6006c0 9.59961 -9.59961 19.2998 -24.3994 19.2998
c-9.60059 0 -19.3008 -9.59961 -19.3008 -19.2998c0 -9.90039 9.60059 -19.6006 19.3008 -19.6006zM451 153.1c14.5 0 24.5 9.60059 24.4004 19.6006c0 9.59961 -9.90039 19.2998 -24.4004 19.2998c-9.59961 0 -19.2998 -9.59961 -19.2998 -19.2998
c0 -9.90039 9.59961 -19.6006 19.2998 -19.6006z" />
    <glyph glyph-name="slideshare" unicode="&#xf1e7;" horiz-adv-x="512" 
d="M187.7 294.3c34 0 61.7002 -25.7002 61.7002 -57.7002c0 -31.6992 -27.7002 -57.6992 -61.7002 -57.6992s-61.7002 26 -61.7002 57.6992c0 32 27.7002 57.7002 61.7002 57.7002zM331.1 294.3c34.3008 0 61.8008 -25.7002 61.7002 -57.7002
c0 -31.6992 -27.3994 -57.6992 -61.7002 -57.6992c-34 0 -61.6992 26 -61.6992 57.6992c0 32 27.6992 57.7002 61.6992 57.7002zM487.7 204.3c15.2002 10.5 25.2002 -4 16.0996 -17.7998c-18.2998 -22.5996 -53.2002 -50.2998 -106.3 -72
c56.2998 -191.7 -137.4 -222.3 -134.3 -124c0 0.700195 -0.299805 53.7998 -0.299805 93.5c-4.30078 0.799805 -8.60059 2 -13.7002 3.09961c0 -40 -0.299805 -95.8994 -0.299805 -96.5996c3.09961 -98.2002 -190.601 -67.5996 -134.301 124.1
c-53.1992 21.7002 -88 49.4004 -106.3 72c-9.09961 13.7002 0.900391 28.3008 16 17.7002c2 -1.39941 4.2998 -2.89941 6.2998 -4.2998v198.3c0 27.4004 20.6006 49.7002 46 49.7002h359.101c25.3994 0 46 -22.2998 46 -49.7002v-198.3zM457.2 185.1h0.0996094v190.601
c0 32.7998 -10.5996 45.7002 -40.8994 45.7002h-317.7c-31.7002 0 -40.6006 -10.8008 -40.6006 -45.7002v-192.4c67.7002 -35.3994 125.7 -29.0996 157.4 -28c13.4004 0.299805 22 -2.2998 27.0996 -7.7002c1.7002 -1.59961 10 -9.39941 20.3008 -17.0996
c1.09961 15.7998 10 25.7998 33.6992 24.9004c32.3008 -1.40039 91.7002 -7.7002 160.601 29.6992z" />
    <glyph glyph-name="twitch" unicode="&#xf1e8;" horiz-adv-x="512" 
d="M391.17 344.53v-109.7h-38.6299v109.7h38.6299zM285 345v-109.75h-38.6299v109.75h38.6299zM120.83 448h366.86v-256l-173.771 -164.58h-77.25l-96.5303 -91.4199v91.4199h-115.83v329.16zM449.07 210.25v201.17h-308.931v-274.29h86.8701v-64l67.6006 64h77.2393z" />
    <glyph glyph-name="yelp" unicode="&#xf1e9;" horiz-adv-x="384" 
d="M42.9004 207.68l99.6191 -48.6094c19.2002 -9.40039 16.2002 -37.5107 -4.5 -42.71l-107.52 -26.8105c-1.51074 -0.379883 -4 -0.6875 -5.55762 -0.6875c-11.2676 0 -21.415 9.08887 -22.6523 20.2881c-0.708984 6.18164 -1.28516 16.25 -1.28516 22.4727
c0 17.8105 4.60742 45.9658 10.2852 62.8467c2.88574 8.56836 12.5664 15.5215 21.6074 15.5215c2.9082 0 7.38867 -1.03516 10.0029 -2.31152zM86.9004 -31.5703c-5.48535 3.75195 -9.92773 12.1904 -9.92773 18.8359c0 4.8291 2.61914 11.6631 5.84766 15.2539
l74.21 82.4004c14.3096 15.8105 40.5098 5.2002 39.8096 -16.0996l-3.89941 -110.82c-0.412109 -12.1484 -10.6123 -22.0078 -22.7676 -22.0078c-1.07129 0 -2.79688 0.146484 -3.85254 0.328125c-23.8691 4.04199 -59.4492 18.4277 -79.4199 32.1094zM232.24 78.3496
c-11.2998 18.1104 6.2002 40.4102 26.5098 33.9102l105.42 -34.2598c8.69043 -2.88965 15.7422 -12.667 15.7422 -21.8252c0 -2.8125 -0.963867 -7.16504 -2.15234 -9.71484c-10.418 -21.8799 -34.0322 -52.1689 -52.71 -67.6104
c-3.50586 -2.88867 -10.0391 -5.2334 -14.582 -5.2334c-6.99707 0 -15.6963 4.80859 -19.418 10.7334zM380.57 210.58c1.04688 -2.41602 1.93652 -6.5127 1.93652 -9.14551c0 -9.49805 -7.39551 -19.3828 -16.5068 -22.0645l-106.64 -30.5098
c-20.5 -5.90039 -37.1006 17.0098 -25.2002 34.71l62 91.9199c3.75 5.55664 12.2354 10.0654 18.9385 10.0654c4.74512 0 11.4932 -2.53809 15.0615 -5.66602c18.166 -16.0361 40.75 -47.0869 50.4102 -69.3096zM62.1104 417.82
c29.4697 14.0293 79.793 27.5137 112.33 30.0996c0.503906 0.0410156 1.32422 0.0742188 1.83008 0.0742188c12.5146 0 22.6709 -10.1562 22.6709 -22.6699c0 -0.0566406 -0.000976562 -0.147461 -0.000976562 -0.204102v-208.34
c0 -23.2998 -30.9102 -31.6006 -42.6104 -11.4004l-104.12 180.44c-1.68164 2.92188 -3.0459 8.0293 -3.0459 11.4014c0 7.93066 5.7998 17.1592 12.9463 20.5986z" />
    <glyph glyph-name="paypal" unicode="&#xf1ed;" horiz-adv-x="384" 
d="M111.4 152.1c-3.5 -19.1992 -17.4004 -108.699 -21.5 -134c-0.300781 -1.7998 -1 -2.5 -3 -2.5h-74.6006c-7.59961 0 -13.0996 6.60059 -12.0996 13.9004l58.5996 371.9c1.5 9.59961 10.1006 16.8994 20 16.8994c152.3 0 165.101 3.7002 204 -11.3994
c60.1006 -23.3008 65.6006 -79.5 44 -140.301c-21.5 -62.5996 -72.5 -89.5 -140.1 -90.2998c-43.4004 -0.700195 -69.5 7 -75.2998 -24.2002zM357.1 296c28.4004 -21.2002 30.3008 -57.7998 23.8008 -92.5996c-16.5 -83.5 -71.9004 -112.301 -142.9 -112.301
c-15 0 -24.7002 2.30078 -29.2998 -19.6992c-15.5 -97.4004 -13.7002 -85.9004 -14.4004 -91.3008c-1.7002 -8.59961 -8.7998 -14.8994 -17.3994 -14.8994h-63.5c-7.10059 0 -11.6006 5.7998 -10.6006 12.8994c0 0 4.5 29.3008 27.1006 169.7
c0.799805 6.10059 4.7998 9.40039 10.8994 9.40039c54 0 164.601 -9.90039 204.5 103.899c3.7002 11.1006 6.7998 22.2002 8.7998 33.6006c0.5 3.09961 1.2002 2.59961 3 1.2998z" />
    <glyph glyph-name="google-wallet" unicode="&#xf1ee;" 
d="M156.8 321.2c37.6006 -60.6006 64.2002 -113.101 84.2998 -162.5c-8.2998 -33.7998 -18.7998 -66.5 -31.2998 -98.2998c-13.2002 52.2998 -26.5 101.3 -56 148.5c6.5 36.3994 2.2998 73.5996 3 112.3zM109.3 248c5 0 10 -2.5 13 -6.5
c43.7998 -59.7998 66.2998 -123.8 82.5 -193.5h-103.5c-20 69.5 -49.5 133 -91.7002 187.3c-4 5.2002 0 12.7002 6.5 12.7002h93.2002zM157.1 336h108.7c74.7998 -103 131.2 -230 143.2 -368h-113.7c-8.2002 133.5 -69.7002 260 -138.2 368zM408.9 404.5
c19 -67.5 31.0996 -139 31.0996 -212.6c0 -69.5 -9.5 -142.5 -25.2998 -203c-10.9004 92.5 -42.4004 184.6 -90.6006 270.8c-4.19922 50.5 -13.2998 99.5 -26.5 146c-1.19922 5.2998 2.5 10.2998 7.80078 10.2998h88.2998c7 0 13.3994 -4.7002 15.2002 -11.5z" />
    <glyph glyph-name="cc-visa" unicode="&#xf1f0;" horiz-adv-x="576" 
d="M470.1 216.7c0 0 7.60059 -37.2002 9.30078 -45h-33.4004c3.2998 8.89941 16 43.5 16 43.5c-0.200195 -0.299805 3.2998 9.09961 5.2998 14.8994zM576 368v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480
c26.5 0 48 -21.5 48 -48zM152.5 116.8l63.2002 155.2h-42.5l-39.2998 -106l-4.30078 21.5l-14 71.4004c-2.2998 9.89941 -9.39941 12.6992 -18.1992 13.0996h-64.7002l-0.700195 -3.09961c15.7998 -4 29.9004 -9.80078 42.2002 -17.1006l35.7998 -135h42.5zM246.9 116.6
l25.1992 155.4h-40.1992l-25.1006 -155.4h40.1006zM386.8 167.4c0.200195 17.6992 -10.5996 31.1992 -33.7002 42.2998c-14.0996 7.09961 -22.6992 11.8994 -22.6992 19.2002c0.199219 6.59961 7.2998 13.3994 23.0996 13.3994
c13.0996 0.299805 22.7002 -2.7998 29.9004 -5.89941l3.59961 -1.7002l5.5 33.5996c-7.90039 3.10059 -20.5 6.60059 -36 6.60059c-39.7002 0 -67.5996 -21.2002 -67.7998 -51.4004c-0.299805 -22.2998 20 -34.7002 35.2002 -42.2002
c15.5 -7.59961 20.7998 -12.5996 20.7998 -19.2998c-0.200195 -10.4004 -12.6006 -15.2002 -24.1006 -15.2002c-16 0 -24.5996 2.5 -37.6992 8.2998l-5.30078 2.5l-5.59961 -34.8994c9.40039 -4.2998 26.7998 -8.10059 44.7998 -8.2998
c42.2002 -0.100586 69.7002 20.7998 70 53zM528 116.6l-32.4004 155.4h-31.0996c-9.59961 0 -16.9004 -2.7998 -21 -12.9004l-59.7002 -142.5h42.2002s6.90039 19.2002 8.40039 23.3008h51.5996c1.2002 -5.5 4.7998 -23.3008 4.7998 -23.3008h37.2002z" />
    <glyph glyph-name="cc-mastercard" unicode="&#xf1f1;" horiz-adv-x="576" 
d="M482.9 37.7002c0 -6.7998 -4.60059 -11.7002 -11.2002 -11.7002c-6.7998 0 -11.2002 5.2002 -11.2002 11.7002s4.40039 11.7002 11.2002 11.7002c6.59961 0 11.2002 -5.2002 11.2002 -11.7002zM172.1 49.4004c6.5 0 10.8008 -5.2002 10.9004 -11.7002
c0 -6.7998 -4.40039 -11.7002 -10.9004 -11.7002c-7.09961 0 -11.1992 5.2002 -11.1992 11.7002s4.09961 11.7002 11.1992 11.7002zM289.6 49.7002c5.2002 0 8.7002 -3 9.60059 -8.7002h-19.1006c0.800781 5.2002 4.10059 8.7002 9.5 8.7002zM397.4 49.4004
c6.7998 0 11.1992 -5.2002 11.1992 -11.7002c0 -6.7998 -4.39941 -11.7002 -11.1992 -11.7002c-6.80078 0 -10.9004 5.2002 -10.9004 11.7002s4.09961 11.7002 10.9004 11.7002zM503.3 23.2998c0 -0.299805 0.299805 -0.5 0.299805 -1.09961
c0 -0.299805 -0.299805 -0.5 -0.299805 -1.10059c-0.299805 -0.299805 -0.299805 -0.5 -0.5 -0.799805c-0.299805 -0.299805 -0.5 -0.5 -1.09961 -0.5c-0.299805 -0.299805 -0.5 -0.299805 -1.10059 -0.299805c-0.299805 0 -0.5 0 -1.09961 0.299805
c-0.299805 0 -0.5 0.299805 -0.799805 0.5c-0.299805 0.299805 -0.5 0.5 -0.5 0.799805c-0.299805 0.5 -0.299805 0.800781 -0.299805 1.10059c0 0.5 0 0.799805 0.299805 1.09961c0 0.5 0.299805 0.799805 0.5 1.10059c0.299805 0.299805 0.5 0.299805 0.799805 0.5
c0.5 0.299805 0.799805 0.299805 1.09961 0.299805c0.5 0 0.800781 0 1.10059 -0.299805c0.5 -0.300781 0.799805 -0.300781 1.09961 -0.5c0.299805 -0.200195 0.200195 -0.600586 0.5 -1.10059zM501.1 21.9004c0.5 0 0.5 0.299805 0.800781 0.299805
c0.299805 0.299805 0.299805 0.5 0.299805 0.799805s0 0.5 -0.299805 0.799805c-0.300781 0 -0.5 0.299805 -1.10059 0.299805h-1.59961v-3.5h0.799805v1.40039h0.299805l1.10059 -1.40039h0.799805zM576 367v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48
v352c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48zM64 227.4c0 -76.5 62.0996 -138.5 138.5 -138.5c27.2002 0 53.9004 8.19922 76.5 23.0996c-72.9004 59.2998 -72.4004 171.2 0 230.5c-22.5996 15 -49.2998 23.0996 -76.5 23.0996
c-76.4004 0.100586 -138.5 -62 -138.5 -138.199zM288 118.6c70.5 55 70.2002 162.2 0 217.5c-70.2002 -55.2998 -70.5 -162.6 0 -217.5zM145.7 42.2998c0 8.7002 -5.7002 14.4004 -14.7002 14.7002c-4.59961 0 -9.5 -1.40039 -12.7998 -6.5
c-2.40039 4.09961 -6.5 6.5 -12.2002 6.5c-3.7998 0 -7.59961 -1.40039 -10.5996 -5.40039v4.40039h-8.2002v-36.7002h8.2002c0 18.9004 -2.5 30.2002 9 30.2002c10.1992 0 8.19922 -10.2002 8.19922 -30.2002h7.90039c0 18.2998 -2.5 30.2002 9 30.2002
c10.2002 0 8.2002 -10 8.2002 -30.2002h8.2002v23h-0.200195zM190.6 56h-7.89941v-4.40039c-2.7002 3.30078 -6.5 5.40039 -11.7002 5.40039c-10.2998 0 -18.2002 -8.2002 -18.2002 -19.2998c0 -11.2002 7.90039 -19.2998 18.2002 -19.2998
c5.2002 0 9 1.89941 11.7002 5.39941v-4.59961h7.89941v36.7998zM231.1 30.4004c0 15 -22.8994 8.19922 -22.8994 15.1992c0 5.7002 11.8994 4.80078 18.5 1.10059l3.2998 6.5c-9.40039 6.09961 -30.2002 6 -30.2002 -8.2002c0 -14.2998 22.9004 -8.2998 22.9004 -15
c0 -6.2998 -13.5 -5.7998 -20.7002 -0.799805l-3.5 -6.2998c11.2002 -7.60059 32.5996 -6 32.5996 7.5zM266.5 21.0996l-2.2002 6.80078c-3.7998 -2.10059 -12.2002 -4.40039 -12.2002 4.09961v16.5996h13.1006v7.40039h-13.1006v11.2002h-8.19922v-11.2002h-7.60059
v-7.2998h7.60059v-16.7002c0 -17.5996 17.2998 -14.4004 22.5996 -10.9004zM279.8 34.5h27.5c0 16.2002 -7.39941 22.5996 -17.3994 22.5996c-10.6006 0 -18.2002 -7.89941 -18.2002 -19.2998c0 -20.5 22.5996 -23.8994 33.7998 -14.2002l-3.7998 6
c-7.7998 -6.39941 -19.6006 -5.7998 -21.9004 4.90039zM338.9 56c-4.60059 2 -11.6006 1.7998 -15.2002 -4.40039v4.40039h-8.2002v-36.7002h8.2002v20.7002c0 11.5996 9.5 10.0996 12.7998 8.40039zM349.5 37.7002c0 11.3994 11.5996 15.0996 20.7002 8.39941l3.7998 6.5
c-11.5996 9.10059 -32.7002 4.10059 -32.7002 -15c0 -19.7998 22.4004 -23.7998 32.7002 -15l-3.7998 6.5c-9.2002 -6.5 -20.7002 -2.59961 -20.7002 8.60059zM416.2 56h-8.2002v-4.40039c-8.2998 11 -29.9004 4.80078 -29.9004 -13.8994
c0 -19.2002 22.4004 -24.7002 29.9004 -13.9004v-4.59961h8.2002v36.7998zM449.9 56c-2.40039 1.2002 -11 2.90039 -15.2002 -4.40039v4.40039h-7.90039v-36.7002h7.90039v20.7002c0 11 9 10.2998 12.7998 8.40039zM490.2 70.9004h-7.90039v-19.3008
c-8.2002 10.9004 -29.8994 5.10059 -29.8994 -13.8994c0 -19.4004 22.5 -24.6006 29.8994 -13.9004v-4.59961h7.90039v51.7002zM497.8 146v-4.59961h0.799805v4.59961h1.90039v0.799805h-4.59961v-0.799805h1.89941zM504.4 22.2002c0 0.5 0 1.09961 -0.300781 1.59961
c-0.299805 0.299805 -0.5 0.799805 -0.799805 1.10059c-0.299805 0.299805 -0.799805 0.5 -1.09961 0.799805c-0.5 0 -1.10059 0.299805 -1.60059 0.299805c-0.299805 0 -0.799805 -0.299805 -1.39941 -0.299805c-0.5 -0.299805 -0.799805 -0.5 -1.10059 -0.799805
c-0.5 -0.300781 -0.799805 -0.800781 -0.799805 -1.10059c-0.299805 -0.5 -0.299805 -1.09961 -0.299805 -1.59961c0 -0.299805 0 -0.799805 0.299805 -1.40039c0 -0.299805 0.299805 -0.799805 0.799805 -1.09961c0.300781 -0.299805 0.5 -0.5 1.10059 -0.799805
c0.5 -0.300781 1.09961 -0.300781 1.39941 -0.300781c0.5 0 1.10059 0 1.60059 0.300781c0.299805 0.299805 0.799805 0.5 1.09961 0.799805s0.5 0.799805 0.799805 1.09961c0.300781 0.600586 0.300781 1.10059 0.300781 1.40039zM507.6 146.9h-1.39941l-1.60059 -3.5
l-1.59961 3.5h-1.40039v-5.40039h0.800781v4.09961l1.59961 -3.5h1.09961l1.40039 3.5v-4.09961h1.09961v5.40039zM512 227.4c0 76.1992 -62.0996 138.3 -138.5 138.3c-27.2002 0 -53.9004 -8.2002 -76.5 -23.1006c72.0996 -59.2998 73.2002 -171.5 0 -230.5
c22.5996 -15 49.5 -23.0996 76.5 -23.0996c76.4004 -0.0996094 138.5 61.9004 138.5 138.4z" />
    <glyph glyph-name="cc-discover" unicode="&#xf1f2;" horiz-adv-x="576" 
d="M520.4 251.9c0 -8.40039 -5.5 -12.8008 -15.8008 -12.8008h-4.69922v24.9004h4.89941c10.1006 0 15.6006 -4.2002 15.6006 -12.0996zM528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480z
M483.9 277.1v-82h16v32.8008h2.19922l22.2002 -32.8008h19.6006l-25.8008 34.4004c12.1006 2.5 18.7002 10.5996 18.7002 23.2002c0 28.5 -30.2998 24.3994 -52.8994 24.3994zM428 277v-82h45.2998v13.7998h-29.2998v22.2002h28.2998v13.7998h-28.2998v18.2002h29.2998v14
h-45.2998zM359.3 277h-17.5l35 -84.2002h8.60059l35.5 84.2002h-17.5l-22.2002 -55.2002zM303.4 280c-24.6006 0 -44.6006 -19.9004 -44.6006 -44.5996c0 -24.6006 19.9004 -44.6006 44.6006 -44.6006c24.5996 0 44.5996 19.9004 44.5996 44.6006
c0 24.5996 -19.9004 44.5996 -44.5996 44.5996zM254.1 273.9c-30.1992 15 -63.2998 -6.80078 -63.2998 -38c0 -32.5 33.6006 -52.5 63.2998 -38.2002v19c-19.2998 -19.2998 -46.7998 -5.7998 -46.7998 19.2002c0 23.6992 26.7002 39.0996 46.7998 19v19zM156.9 207.6
c-7.60059 0 -13.8008 3.7002 -17.5 10.8008l-10.3008 -9.90039c17.8008 -26.0996 56.6006 -18.2002 56.6006 11.2998c0 13.1006 -5.40039 19 -23.6006 25.6006c-9.59961 3.39941 -12.2998 5.89941 -12.2998 10.2998c0 8.7002 14.5 14.0996 24.9004 2.5l8.39941 10.7998
c-19.0996 17.0996 -49.6992 8.90039 -49.6992 -14.2998c0 -11.2998 5.19922 -17.2002 20.1992 -22.7002c25.7002 -9.09961 14.7002 -24.4004 3.30078 -24.4004zM55.4004 195c30.8994 0 44.0996 22.4004 44.0996 40.9004c0 24.0996 -18 41.0996 -44.0996 41.0996h-23.4004
v-82h23.4004zM122.9 195v82h-16v-82h16zM544 15v145c-33.2998 -20.7998 -226.4 -124.4 -416 -160h401c8.2002 0 15 6.7998 15 15zM74.0996 256.4c5.7002 -5 8.90039 -12.6006 8.90039 -20.5c0 -7.90039 -3.2002 -15.5 -8.90039 -20.7002
c-4.89941 -4.40039 -11.5996 -6.40039 -21.8994 -6.40039h-4.2002v54.2002h4.2002c10.2998 0 16.7002 -1.7002 21.8994 -6.59961z" />
    <glyph glyph-name="cc-amex" unicode="&#xf1f3;" horiz-adv-x="576" 
d="M325.1 280.2c0.100586 -8 -4.2998 -15.7002 -11.6992 -18.7002c9.5 -3.2998 11 -9.2002 11 -18.4004v-13.5h-16.6006c-0.299805 14.8008 3.60059 25.1006 -14.7998 25.1006h-18v-25.1006h-16.4004v69.3008l39.1006 -0.300781c13.2998 0 27.3994 -2 27.3994 -18.3994z
M295.7 268.9c5.7002 0 11 1.2998 11 7.89941c0 6.40039 -5.60059 7.40039 -10.7002 7.40039h-21v-15.2998h20.7002zM279 179.4c15.5996 0 27.9004 -5.40039 27.9004 -22.7002c0 -27.9004 -30.4004 -23.2998 -49.3008 -23.2998l-0.0996094 -23.3008h-32.2002l-20.3994 23
l-21.3008 -23h-65.3994l0.0996094 69.3008h66.5l20.5 -22.8008l21 22.8008h52.7002zM175.2 124.7l19 20.2002l-17.9004 20.1992h-41.7002v-12.5h36.3008v-14.0996h-36.3008v-13.7998h40.6006zM241 116.5v55.5l-25.2998 -27.4004zM278.8 147.5
c5.90039 0 10.5 2.7998 10.5 9.2002c0 6.09961 -4.59961 8.39941 -10.2002 8.39941h-21.5v-17.5996h21.2002zM247.2 284.2h-38.9004v-12.5h37.7998v-14.1006h-37.7998v-13.7998h38.9004v-14.2998h-55.5v69.2998h55.5v-14.5996zM576 192.6h-0.200195h0.200195zM381.4 160.7
c-0.100586 -7.60059 -4.2002 -15.2998 -11.9004 -18.4004c9.2002 -3.2998 11 -9.5 11 -18.3994l-0.0996094 -13.8008h-16.6006l0.100586 11.5c0 11.8008 -3.80078 13.8008 -14.8008 13.8008h-17.5996l-0.0996094 -25.3008h-16.6006l0.100586 69.3008h39.3994
c13 0 27.1006 -2.30078 27.1006 -18.7002zM352.2 149.5c5.59961 0 11 1.2998 11 8.2002c0 6.39941 -5.60059 7.39941 -10.7002 7.39941h-21v-15.5996h20.7002zM179.4 229.5h-16.8008v54.2002l-24 -54.2002h-14.5996l-24 54.2002v-54.2002h-33.7998l-6.40039 15.2998h-34.5
l-6.39941 -15.2998h-17.9004l29.7002 69.2998h24.5l28.0996 -65.7002v65.7002h27.1006l21.6992 -47l19.7002 47h27.6006v-69.2998zM31.2002 259.2h22.7002l-11.5 27.5996zM508.6 100.3c34.8008 0 54.8008 -2.2002 67.5 6.10059v-90.4004c0 -26.5 -21.5 -48 -48 -48h-480.1
c-26.5 0 -48 21.5 -48 48v203.7h26.5996c4.2002 10.0996 2.2002 5.2998 6.40039 15.2998h19.2002c4.2002 -10 2.2002 -5.2002 6.39941 -15.2998h52.9004v11.3994c2.2002 -5 1.09961 -2.5 5.09961 -11.3994h29.5c2.40039 5.5 2.60059 5.7998 5.10059 11.3994v-11.3994h135.5
v25.0996c6.39941 0 8 0.100586 9.7998 -0.200195c0 0 -0.200195 -10.8994 0.0996094 -24.7998h66.5v8.90039c7.40039 -5.90039 17.4004 -8.90039 29.7002 -8.90039h26.7998c4.2002 10.1006 2.2002 5.2998 6.40039 15.2998h19c6.5 -15 0.200195 -0.5 6.59961 -15.2998
h52.8008v21.9004c11.7998 -19.7002 7.7998 -12.9004 13.1992 -21.9004h41.6006v92h-39.9004v-18.3994c-12.2002 20.1992 -6.2998 10.3994 -11.2002 18.3994h-43.2998v-20.5996c-6.2002 14.5996 -4.59961 10.7998 -8.7998 20.5996h-32.4004
c-0.399414 0 -2.2998 -0.200195 -2.2998 0.299805h-27.5996c-12.7998 0 -23.1006 -3.19922 -30.7002 -9.2998v9.2998h-39.9004v-5.2998c-10.7998 6.10059 -20.6992 5.10059 -64.3994 5.2998c-0.100586 0 -11.6006 0.100586 -11.6006 0h-103
c-2.5 -6.09961 -6.7998 -16.3994 -12.5996 -30c-2.7998 6 -11 23.8008 -13.9004 30h-46v-21.0996c-7.39941 17.4004 -4.69922 11 -9 21.0996h-39.6992c-3.40039 -7.89941 -13.7002 -32 -23.1006 -53.8994v109.8c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48v-175.4
c-37.7002 0.200195 -44 0.900391 -54.2998 -5v5c-45.2998 0 -53.5 1.7002 -64.9004 -5.19922v5.19922h-78.1992v-5.09961c-11.4004 6.5 -21.4004 5.09961 -75.7002 5.09961v-5.59961c-6.2998 3.7002 -14.5 5.59961 -24.2998 5.59961h-58
c-3.5 -3.7998 -12.5 -13.6992 -15.7002 -17.1992c-12.7002 14.0996 -10.5 11.5996 -15.5 17.1992h-83.1006v-92.2998h82c3.30078 3.5 12.9004 13.9004 16.1006 17.4004c12.7002 -14.2998 10.2998 -11.7002 15.3994 -17.4004h48.9004
c0 14.7002 0.0996094 8.2998 0.0996094 23c11.5 -0.200195 24.3008 0.200195 34.3008 6.2002c0 -13.9004 -0.100586 -17.0996 -0.100586 -29.2002h39.6006c0 18.5 0.0996094 7.40039 0.0996094 25.2998c6.2002 0 7.7002 0 9.40039 -0.0996094
c0.0996094 -1.2998 0 0 0 -25.2002c152.8 0 145.899 -1.09961 156.699 4.5v-4.5zM544.9 164.8c-4.60059 0 -9.2002 -0.700195 -9.2002 -6.5c0 -12.2002 28.7998 0.299805 39.2998 -13.5v-25.7998c-4.90039 -7.09961 -14.0996 -8.90039 -22.5 -8.90039h-32l0.0996094 14.8008
h32c4.10059 0 8.40039 1.2998 8.40039 6.39941c0 14.6006 -42.7002 -5.59961 -42.7002 27.4004c0 14.0996 11 20.7002 23.7998 20.7002h32.9004v-14.6006h-30.0996zM487.9 125c4.09961 0 8.69922 1 8.7998 6.40039c0 14.8994 -42.7002 -5.60059 -42.7002 27.3994
c0 14.1006 10.7002 20.7002 23.5 20.7002h33.2002v-14.5996h-30.4004c-4.2998 0 -9.2002 -0.800781 -9.2002 -6.40039c0 -15.0996 42.9004 6.90039 42.9004 -26.2998c0 -16.4004 -11.4004 -22 -26.2002 -22h-32.2002l0.100586 14.7998h32.2002zM445.7 165.1h-38.5v-12.5
h37.7998v-14.0996h-37.9004v-13.7998l38.6006 -0.299805l-0.100586 -14.3008h-55.1992l0.0996094 69.3008h55.2002v-14.3008zM389.4 273.2c0.299805 0.299805 1.69922 1 7.2998 1c1 0 2 -0.100586 3.09961 -0.100586l-7.2998 -16.8994
c-2.2998 0 -3.2002 0.399414 -3.40039 0.5c-0.199219 0.200195 -1.09961 1.89941 -1.09961 7.89941c0 5.40039 1.09961 7.40039 1.40039 7.60059zM409.8 283.7h-0.0996094h0.0996094zM393.6 298.9h16.1006v-15.2002c-17.4004 0.299805 -33.1006 4.09961 -33.1006 -19.7002
c0 -11.7998 2.80078 -19.9004 16.1006 -19.9004h7.39941l23.5 54.5h24.8008l27.8994 -65.3994v65.3994h25.2998l29.1006 -48.0996v48.0996h16.8994v-69h-23.5996l-31.2002 51.9004v-51.9004h-33.7002l-6.59961 15.3008h-34.2998l-6.40039 -15.3008h-19.2002
c-22.7998 0 -33 11.8008 -33 34c0 23.3008 10.5 35.3008 34 35.3008zM435.7 286.8l-11.6006 -27.5996h22.8008zM334.6 298.8h16.9004v-69.2998h-16.9004v69.2998z" />
    <glyph glyph-name="cc-paypal" unicode="&#xf1f4;" horiz-adv-x="576" 
d="M186.3 189.8c0 -12.2002 -9.7002 -21.5 -22 -21.5c-9.2002 0 -16 5.2002 -16 15c0 12.2002 9.5 22 21.7002 22c9.2998 0 16.2998 -5.7002 16.2998 -15.5zM80.5 238.3c11.2998 0 19.7998 -1.5 17.5 -14.8994c-2 -12.7002 -10.5 -14.2002 -21.5 -14.2002l-8.2002 -0.299805
l4.2998 26.6992c0.200195 1.7002 1.7002 2.7002 3.2002 2.7002h4.7002zM364.5 238.3c8.5 0 18 -0.5 18.0996 -11.0996c0 -15 -9 -18 -22 -18l-8 -0.299805l4.2002 26.6992c0.200195 1.7002 1.40039 2.7002 3.2002 2.7002h4.5zM576 368v-352c0 -26.5 -21.5 -48 -48 -48h-480
c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48zM128.3 232.6c0 21 -16.2002 28 -34.7002 28h-40c-2.5 0 -5 -2 -5.19922 -4.69922l-16.4004 -102.101c-0.299805 -2 1.2002 -4 3.2002 -4h19c2.7002 0 5.2002 2.90039 5.5 5.7002l4.5 26.5996
c1 7.2002 13.2002 4.7002 18 4.7002c28.5996 0 46.0996 17 46.0996 45.7998zM212.5 223.8h-19c-3.7998 0 -4 -5.5 -4.2002 -8.2002c-5.7998 8.5 -14.2002 10 -23.7002 10c-24.5 0 -43.1992 -21.5 -43.1992 -45.1992c0 -19.5 12.1992 -32.2002 31.6992 -32.2002
c9 0 20.2002 4.89941 26.5 11.8994c-0.5 -1.5 -1 -4.69922 -1 -6.19922c0 -2.30078 1 -4 3.2002 -4h17.2002c2.7002 0 5 2.89941 5.5 5.69922l10.2002 64.3008c0.299805 1.89941 -1.2002 3.89941 -3.2002 3.89941zM253 125.9l63.7002 92.5996c0.5 0.5 0.5 1 0.5 1.7002
c0 1.7002 -1.5 3.5 -3.2002 3.5h-19.2002c-1.7002 0 -3.5 -1 -4.5 -2.5l-26.5 -39l-11 37.5c-0.799805 2.2002 -3 4 -5.5 4h-18.7002c-1.69922 0 -3.19922 -1.7998 -3.19922 -3.5c0 -1.2002 19.5 -56.7998 21.1992 -62.1006c-2.69922 -3.7998 -20.5 -28.5996 -20.5 -31.5996
c0 -1.7998 1.5 -3.2002 3.2002 -3.2002h19.2002c1.7998 0.100586 3.5 1.10059 4.5 2.60059zM412.3 232.6c0 21 -16.2002 28 -34.7002 28h-39.6992c-2.7002 0 -5.2002 -2 -5.5 -4.69922l-16.2002 -102c-0.200195 -2 1.2998 -4 3.2002 -4h20.5c2 0 3.5 1.5 4 3.19922l4.5 29
c1 7.2002 13.1992 4.7002 18 4.7002c28.3994 0 45.8994 17 45.8994 45.7998zM496.5 223.8h-19c-3.7998 0 -4 -5.5 -4.2998 -8.2002c-5.5 8.5 -14 10 -23.7002 10c-24.5 0 -43.2002 -21.5 -43.2002 -45.1992c0 -19.5 12.2002 -32.2002 31.7002 -32.2002
c9.2998 0 20.5 4.89941 26.5 11.8994c-0.299805 -1.5 -1 -4.69922 -1 -6.19922c0 -2.30078 1 -4 3.2002 -4h17.2998c2.7002 0 5 2.89941 5.5 5.69922l10.2002 64.3008c0.299805 1.89941 -1.2002 3.89941 -3.2002 3.89941zM544 257.1c0 2 -1.5 3.5 -3.2002 3.5h-18.5
c-1.5 0 -3 -1.19922 -3.2002 -2.69922l-16.1992 -104l-0.300781 -0.5c0 -1.80078 1.5 -3.5 3.5 -3.5h16.5c2.5 0 5 2.89941 5.2002 5.69922l16.2002 101.2v0.299805zM454 205.3c9.2998 0 16.2998 -5.7002 16.2002 -15.5c0 -12.2998 -9.7002 -21.5 -21.7002 -21.5
c-9.2002 0 -16.2002 5.2998 -16.2002 15c0 12.2998 9.5 22 21.7002 22z" />
    <glyph glyph-name="cc-stripe" unicode="&#xf1f5;" horiz-adv-x="576" 
d="M492.4 227.2c8.69922 0 18 -6.7002 18 -22.7002h-36.7002c0 16 9.7998 22.7002 18.7002 22.7002zM375 224.6c12.9004 0.100586 21.9004 -14.5 21.9004 -33.0996c0 -19.0996 -8.80078 -33.4004 -21.9004 -33.4004c-8.2998 0 -13.2998 3 -16.7998 6.7002l-0.200195 52.7998
c3.7002 4.10059 8.7998 7 17 7zM528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM122.2 166.9c0 42.2998 -54.2998 34.6992 -54.2998 50.6992c0 5.5 4.59961 7.7002 12.0996 7.7002
c10.7998 0 24.5 -3.2998 35.2998 -9.09961v33.3994c-11.7998 4.7002 -23.5 6.5 -35.2998 6.5c-28.7998 0 -48 -15 -48 -40.1992c0 -39.3008 54 -32.9004 54 -49.9004c0 -6.59961 -5.7002 -8.7002 -13.5996 -8.7002c-11.8008 0 -26.9004 4.90039 -38.9004 11.2998v-33.8994
c13.2002 -5.7002 26.5996 -8.10059 38.7998 -8.10059c29.6006 0.200195 49.9004 14.7002 49.9004 40.3008zM191 223.5v30.2998h-26.9004v30.7998l-34.6992 -7.39941l-0.200195 -113.9c0 -21 15.7998 -36.5 36.8994 -36.5c11.6006 0 20.2002 2.10059 24.9004 4.7002v28.9004
c-4.5 -1.80078 -27 -8.30078 -27 12.5996v50.5h27zM265 221.1v32.7002h-0.0996094c-4.7002 1.7002 -21.3008 4.7998 -29.6006 -10.5l-2.2002 10.5h-30.6992v-124.5h35.5v84.4004c8.39941 11 22.5996 8.89941 27.0996 7.39941zM309.1 129.3v124.5h-35.6992v-124.5h35.6992z
M309.1 272.2v28.8994l-35.6992 -7.59961v-28.9004zM383.2 126.7c25.3994 0.0996094 48.5996 20.5 48.5996 65.5996c0 41.2998 -23.5 63.7998 -48.3994 63.7998c-13.9004 0 -22.9004 -6.59961 -27.8008 -11.0996l-1.7998 8.7998h-31.2998v-165.8l35.5 7.5l0.0996094 40.2002
c5.10059 -3.7002 12.7002 -9 25.1006 -9zM543.6 178.2c0.100586 2 0.400391 9.39941 0.400391 12.8994c0 36.4004 -17.5996 65.1006 -51.2998 65.1006c-33.7998 0 -54.2998 -28.7002 -54.2998 -64.9004c0 -42.7998 24.1992 -64.5 58.7998 -64.5
c17 0 29.7002 3.90039 39.3994 9.2002v28.5996c-9.69922 -4.89941 -20.7998 -7.89941 -34.8994 -7.89941c-13.7998 0 -26 4.89941 -27.6006 21.5h69.5z" />
    <glyph glyph-name="lastfm" unicode="&#xf202;" horiz-adv-x="512" 
d="M225.8 80.9004c0 0 -31.7002 -31.1006 -97.8994 -31.1006c-82.2002 0 -127.9 48.1006 -127.9 137.2c0 92.7002 45.7002 147.2 131.8 147.2c117.7 0 129.3 -66.2002 161.3 -163c14 -42.7998 38.7002 -73.9004 97.9004 -73.9004c39.9004 0 61 8.7998 61 30.5
c0 31.9004 -34.9004 35.1006 -79.7998 45.7002c-48.6006 11.7002 -68 36.9004 -68 76.7998c0 64 51.5996 83.9004 104.399 83.9004c59.8008 0 96.2002 -21.7002 100.9 -74.5l-58.5996 -7c-2.30078 25.2002 -17.5 35.7998 -45.7002 35.7998
c-25.7998 0 -41.6006 -11.7998 -41.6006 -31.7002c0 -17.5996 7.60059 -28.0996 33.4004 -34c52.2998 -11.5 115 -19.2002 115 -92.0996c0 -58.6006 -49.2998 -80.9004 -122 -80.9004c-101.4 0 -136.6 45.7002 -155.4 102.601
c-26.0996 81.5996 -34.3994 134.899 -100.899 134.899c-35.7002 0 -72.1006 -25.7998 -72.1006 -97.8994c0 -56.3008 28.7002 -91.5 69.2002 -91.5c45.7002 0 76.2002 34 76.2002 34z" />
    <glyph glyph-name="lastfm-square" unicode="&#xf203;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM307.8 103.1c45.4004 0 76.2002 13.9004 76.1006 50.6006c0 45.5 -39.1006 50.3994 -71.8008 57.5
c-16.0996 3.7002 -20.8994 10.2998 -20.8994 21.2998c0 12.5 9.89941 19.7998 26 19.7998c17.5996 0 27.0996 -6.59961 28.5996 -22.3994l36.7002 4.39941c-2.90039 33 -25.5996 46.6006 -63 46.6006c-32.9004 0 -65.2002 -12.4004 -65.2002 -52.4004
c0 -24.9004 12.1006 -40.7002 42.5 -48c28.1006 -6.59961 49.9004 -8.7002 49.9004 -28.5996c0 -13.6006 -13.2002 -19.1006 -38.1006 -19.1006c-37 0 -52.3994 19.4004 -61.1992 46.2002c-20 60.5 -27.3008 101.9 -100.801 101.9c-53.8994 0 -82.5 -34.1006 -82.5 -92
c0 -55.7002 28.6006 -85.8008 79.9004 -85.8008c41.4004 0 61.2002 19.4004 61.2002 19.4004l-11.7002 31.9004s-19 -21.3008 -47.5996 -21.3008c-25.3008 0 -43.3008 22 -43.3008 57.2002c0 45.1006 22.7002 61.2002 45.1006 61.2002c41.5 0 46.7002 -33.2998 63 -84.2998
c11.7002 -35.5 33.7002 -64.1006 97.0996 -64.1006z" />
    <glyph glyph-name="ioxhost" unicode="&#xf208;" horiz-adv-x="640" 
d="M616 288c13.2998 0 24 -10.7002 24 -24c0 -13.2002 -10.7002 -24 -24 -24h-52.7002c3.10059 -15.5 4.7002 -31.5996 4.7002 -48c0 -137 -111 -248 -248 -248c-102.9 0 -191.2 62.7002 -228.7 152h-67.2998c-13.2998 0 -24 10.7002 -24 24c0 13.2002 10.7002 24 24 24
h52.7002c-3.10059 15.5 -4.7002 31.5996 -4.7002 48c0 137 111 248 248 248c102.9 0 191.2 -62.7002 228.7 -152h67.2998zM520 192c0 16.5996 -2 32.5996 -5.7998 48h-298.2c-13.2998 0 -24 10.7002 -24 24c0 13.2002 10.7002 24 24 24h279.5
c-33.9004 62 -99.7998 104 -175.5 104c-110.5 0 -200 -89.5 -200 -200c0 -16.5996 2 -32.5996 5.7998 -48h298.2c13.2998 0 24 -10.7002 24 -24c0 -13.2002 -10.7002 -24 -24 -24h-279.5c33.9004 -62 99.7998 -104 175.5 -104c110.5 0 200 89.5 200 200zM216 216h208
c13.2998 0 24 -10.7002 24 -24c0 -13.2002 -10.7002 -24 -24 -24h-208c-13.2998 0 -24 10.7002 -24 24c0 13.2002 10.7002 24 24 24z" />
    <glyph glyph-name="angellist" unicode="&#xf209;" 
d="M347.1 232.6c48 -11.6992 54.9004 -50.5996 54.9004 -93.6992c0 -114.301 -73.4004 -202.9 -191.4 -202.9c-96.1992 0 -164.6 76.4004 -164.5 148.6c0 37.1006 14.2002 61.7002 51.1006 71.7002c-3.10059 8.2998 -8 20.7998 -8 29.7002
c0 23.5 24.8994 52.5996 48.2998 52.5996c6.90039 0 13.7002 -2 20 -4.2998c-12.4004 35.2002 -46.5996 126.7 -46.5996 162c0 28.7998 14.5996 51.7002 45.6992 51.7002c40 0 85.4004 -144 95.1006 -172.5c12.5 31.4004 52.5 163.1 97.0996 163.1
c28 0 43.7002 -22.2998 43.7002 -48.8994c0 -30.2002 -33.7002 -124.5 -45.4004 -157.101zM311.7 340l-33.1006 -93.7002l34 -6c8.5 23.4004 47.1006 128.9 47.1006 148c0 7.10059 -2.2998 16 -10.9004 16c-16 0 -33.0996 -52 -37.0996 -64.2998zM142.3 399.7
c0 -29.1006 34.6006 -120 45.5 -148.8c7.7002 4.39941 19.7998 2.69922 35.4004 1.39941l-34.6006 100.3c-31.7998 92.8008 -46.2998 59 -46.2998 47.1006zM140 204c-7.7002 0 -20.2998 -13.4004 -20.4004 -21.0996c0 -20.8008 56 -97.7002 76.9004 -97.7002
c5.7002 0 10.5996 6.2998 10.5996 11.3994c0 12.8008 -37.7998 107.4 -67.0996 107.4zM324.3 17.7002c55.2998 61.5 49.1006 158.6 31 174.7c-24 21.0996 -106 29.0996 -138.3 29.0996c-17.2998 0 -17.4004 -6.40039 -17.4004 -13.0996
c0 -43.7002 92.9004 -39.7002 120.601 -39.7002c11.2002 0 15.7998 -9.90039 16.8994 -21.1006c-7.39941 -7.39941 -17.6992 -11.6992 -27.3994 -15.3994c-9.40039 -3.40039 -19.1006 -7.10059 -27.1006 -13.1006c-22 -16 -43.6992 -43.3994 -43.6992 -71.6992
c0 -17.7002 10.5996 -32.9004 10.5996 -50.3008c0 -0.299805 -2 -6.5 -2 -7.39941c-32.5996 2.2998 -40.5996 34.5996 -41.7002 61.7002c-3.39941 -0.900391 -8 -0.600586 -11.7002 -0.600586c5.10059 -17.7998 -11.8994 -42 -38 -42
c-37.7998 0 -88 57.2002 -58.2998 86.9004c28.7002 -35.9004 35 -51.4004 51.1006 -51.4004c4 0 11.6992 3.40039 11.6992 8.2998c0 12.8008 -42.8994 73.1006 -54.2998 73.1006c-16.7998 0 -37.7002 -24.9004 -20.5996 -68.2998
c22.5996 -55.7002 69.5 -88.3008 128.899 -88.3008c43.4004 0 80.6006 16.6006 109.7 48.6006zM225.7 143.7c3.2002 -8.2998 6.59961 -16.6006 9.39941 -25.1006c6.30078 7.10059 12.9004 13.7002 20.3008 19.1006c-10 2 -20 2.89941 -29.7002 6z" />
    <glyph glyph-name="buysellads" unicode="&#xf20d;" 
d="M224 297.3l42.9004 -160.7h-85.8008zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM382.7 42.7002l-94.5 298.7h-128.4l-94.5 -298.7h90.7002l111.7 91.5996l24.2002 -91.5996h90.7998z
" />
    <glyph glyph-name="connectdevelop" unicode="&#xf20e;" horiz-adv-x="576" 
d="M550.5 207c6.69629 -1.33887 11.7861 -7.5 11.7881 -14.7324c0 -7.5 -5.3584 -13.6602 -12.3223 -15l-54.9111 -95.3574c0.536133 -1.60742 0.804688 -3.21387 0.804688 -4.82129c0 -7.23145 -5.09082 -13.3926 -12.0547 -14.7314l-51.6963 -90.2686
c0.535156 -1.33887 0.802734 -2.67773 0.802734 -4.28516c0 -8.30371 -6.69727 -15.2676 -15.2686 -15.2676c-4.28516 0 -8.30371 1.875 -10.9814 4.82129h-107.144c-2.67871 -3.21484 -6.96484 -5.35742 -11.5176 -5.35742s-8.83887 2.14258 -11.5166 5.35645h-106.875
c-2.67969 -3.21484 -6.69727 -5.35742 -11.5186 -5.35742c-8.30371 0 -15.2676 6.69727 -15.2676 15.2676c0 1.875 0.535156 3.75 1.07031 5.35742l-51.6963 89.7324c-6.96484 1.33887 -12.0547 7.5 -12.0547 14.7314c0 1.875 0.268555 3.21387 0.804688 4.82129
l-55.1797 95.3574c-6.96484 1.60742 -12.0537 7.76855 -12.0537 15c0 7.5 5.3584 13.6611 12.5898 15l53.3047 92.1436c0 0.536133 -0.268555 1.07227 -0.268555 1.60645c0 6.16113 3.75098 11.251 9.10742 13.6611l55.9824 97.2334
c-0.536133 1.33887 -1.07129 3.21387 -1.07129 4.82129c0 8.57129 6.96484 15.2676 15.2676 15.2676c4.82227 0 8.83887 -2.14258 11.7861 -5.625h106.071c2.67871 3.48242 6.69629 5.625 11.5176 5.625s8.83887 -2.14258 11.5176 -5.62402h106.606
c2.94727 3.48242 6.96484 5.625 11.7861 5.625c8.30371 0 15.2676 -6.69727 15.2676 -15.2676c0 -1.60742 -0.535156 -3.21484 -1.07031 -4.82129l55.4463 -95.8936c8.03613 -0.267578 14.7324 -6.96484 14.7324 -15.001c0 -2.67871 -0.803711 -5.08984 -1.875 -7.23145z
M153.535 -2.73242v75.8037h-43.6602zM153.535 81.1074v50.624l-44.999 -47.4102c0.535156 -1.07227 1.07129 -2.14355 1.33887 -3.21387h43.6602zM153.535 143.518l0.000976562 92.9463l-50.0889 51.9648c-2.41113 -1.60645 -5.08887 -2.41113 -7.76855 -2.67871
l-51.9648 -90c0.268555 -1.07227 0.268555 -2.14258 0.268555 -3.48242c0 -1.33887 0 -2.67871 -0.535156 -4.01758l55.7129 -96.4287c1.33887 -0.267578 2.67871 -1.07129 4.01758 -1.60742zM153.535 245.84v72.0527l-43.9277 -15.8037
c0 -0.267578 0.267578 -0.803711 0.267578 -1.07227c0 -2.94531 -0.803711 -5.62402 -2.14258 -7.7666zM153.535 326.465v59.7324l-43.6602 -75.5361zM480.054 287.357l-0.267578 0.267578l-98.0361 -101.518l63.75 -67.2324l35.3584 167.143zM291.75 92.8926
l-11.25 -11.7852h22.7676zM291.482 104.143l79.2852 82.2324l-83.0352 87.5889l-79.5537 -84.375zM296.839 98.25l16.875 -17.1426h124.02l5.8916 28.125l-67.5 71.25zM410.411 403.607l-117.053 -124.019l83.0342 -87.5889l97.5 101.25
c-1.33984 2.14258 -2.14258 4.82129 -2.14258 7.7666v0.536133l-57.8574 100.714c-1.33984 0.268555 -2.41016 0.804688 -3.48145 1.34082zM401.304 405.75h-4.28711l-166.339 -60l57.0547 -60.2676zM277.821 405.75h-103.929l50.8936 -53.5713l148.393 53.5713h-75
c-2.67871 -2.67773 -6.16016 -4.28516 -10.1787 -4.28516s-7.50098 1.60742 -10.1787 4.28516zM161.572 400.125v-70.7148l54.9111 19.8213l-51.1611 53.8398c-0.730469 -0.25293 -1.93066 -0.613281 -2.67969 -0.804688zM161.572 320.839v-83.3037l40.9814 -42.0527
l79.5537 84.1064l-59.7324 63.2139zM161.572 228.161v-76.0723l36.4277 38.3037zM161.572 140.303v-59.1953h107.678l17.1426 17.6777l-82.7676 85.9814zM168.536 -21.75h1.33887l91.6074 94.8213h-99.9102v-89.7324l1.07031 -1.60645
c2.41113 -0.804688 4.28613 -1.875 5.89355 -3.48242zM298.447 -21.75h104.194l-91.6064 94.8213h-38.3037l-91.6074 -94.8213h96.4287c2.68066 2.41016 6.42871 4.28516 10.4473 4.28516s7.76758 -1.875 10.4473 -4.28516zM418.447 -9.96387l17.4121 83.0361h-114.376
l89.1953 -91.875c1.07227 0.536133 2.14355 1.07031 3.48242 1.33887zM431.303 12.2676l34.8223 60.8037h-21.9639zM466.125 81.1074c0.267578 1.07129 0.803711 2.14258 1.33887 2.94531l-17.1426 18.2139l-4.55371 -21.1592h20.3574zM532.286 188.518
c-0.268555 1.33984 -0.536133 2.41113 -0.536133 3.75c0 1.60742 0.536133 2.94629 0.802734 4.28516l-45.8027 79.2861l-34.5537 -163.928l20.625 -21.9639c1.33887 0.802734 2.67871 1.33887 4.01758 1.87402z" />
    <glyph glyph-name="dashcube" unicode="&#xf210;" 
d="M326.6 344l102.2 104v-427c0 -50.5 -40.0996 -85 -91.2002 -85h-227.199c-51.1006 0 -91.2002 34.5 -91.2002 85v229.5c0 50.2002 40.0996 93.5 91.2002 93.5h216.199zM153.9 31.5v-0.0996094h223.8l-51.1006 52.2998v123.5c0 17.7002 -14.2998 32.5 -32 32.5h-140.699
c-17.7002 0 -32.4004 -14.7998 -32.4004 -32.5v-142.9c0 -17.7002 14.7002 -32.7998 32.4004 -32.7998z" />
    <glyph glyph-name="forumbee" unicode="&#xf211;" 
d="M5.7998 138.3c-3.7998 17 -5.7998 34.2002 -5.7998 51.4004c0 123.3 99.7998 223.3 223.1 223.3c16.6006 0 33.3008 -2 49.3008 -5.5c-123.4 -47 -220.5 -145.5 -266.601 -269.2zM398.7 327.5c-151.101 -44 -269.2 -164.4 -312.3 -315.7
c-17.2002 13.4004 -32.7002 30.9004 -45.2002 49c43.3994 149.9 160.1 267.7 309.7 312c18.0996 -12.5996 34.0996 -27.7998 47.7998 -45.2998zM414.5 74.7998c13.0996 -35.2998 24.2002 -73.2998 33.5 -109.8c-36.0996 9.2998 -72 20.5 -107 33.5996
c-25.7002 -16 -54.5996 -26.8994 -84.5996 -31.2998c42.5996 79.7002 108.199 147.4 187.6 190.3c-4.09961 -29.0996 -14.2998 -57.6992 -29.5 -82.7998zM444.2 220.3c-113.7 -46.7002 -204.2 -139.399 -250.5 -253.5c-19.6006 2.7002 -38.5 7.60059 -56.6006 15.2002
c44.9004 138.5 153.4 249.3 291.301 295.1c7.89941 -18.0996 13.1992 -37.2998 15.7998 -56.7998z" />
    <glyph glyph-name="leanpub" unicode="&#xf212;" horiz-adv-x="576" 
d="M386.539 336.515l15.0957 -248.955l-10.9785 0.275391c-36.2324 0.824219 -71.6406 -8.7832 -102.657 -27.9971c-31.0156 19.2139 -66.4238 27.9971 -102.657 27.9971c-45.5635 0 -82.0693 -10.7051 -123.516 -27.7227l31.291 258.288
c28.5459 11.8027 61.4834 18.1143 92.2256 18.1143c41.1729 0 73.8359 -13.1748 102.657 -42.5439c27.7227 28.2715 59.0127 41.7217 98.5391 42.5439zM569.07 0c-25.5264 0 -47.4854 5.21484 -70.542 15.6445c-34.3105 15.6455 -69.9932 24.9785 -107.871 24.9785
c-38.9775 0 -74.9346 -12.9014 -102.657 -40.623c-27.7227 27.7227 -63.6797 40.623 -102.657 40.623c-37.8779 0 -73.5605 -9.33301 -107.871 -24.9785c-22.2324 -9.88086 -44.7402 -15.6445 -69.1689 -15.6445h-1.37305l42.5449 349.141
c39.251 22.2334 87.0117 34.8594 132.301 34.8594c37.0547 0 75.209 -7.68457 106.225 -29.0947c31.0156 21.4102 69.1699 29.0947 106.225 29.0947c45.2891 0 93.0498 -12.626 132.301 -34.8594zM525.702 44.7412l-34.0361 280.246
c-30.7422 13.999 -67.248 21.4102 -101.009 21.4102c-38.4287 0 -74.3848 -12.0771 -102.657 -38.7021c-28.2725 26.625 -64.2275 38.7021 -102.657 38.7021c-33.7607 0 -70.2666 -7.41113 -101.009 -21.4102l-34.0361 -280.246
c47.2109 19.4863 82.8945 33.4854 135.045 33.4854c37.6045 0 70.8174 -9.60547 102.657 -29.6436c31.8398 20.0381 65.0518 29.6436 102.657 29.6436c52.1504 0 87.834 -13.999 135.045 -33.4854z" />
    <glyph glyph-name="sellsy" unicode="&#xf213;" horiz-adv-x="640" 
d="M539.71 210.692c55.1572 -13.4834 94.0742 -63.124 94.0732 -119.509c0 -68.0264 -55.4639 -123.184 -123.185 -123.184h-381.197c-67.7217 0 -123.186 55.1572 -123.185 123.185c0 47.4961 27.8848 91.0098 70.7852 111.234
c-2.14453 7.35449 -3.06543 15.0146 -3.06543 22.3691c0 46.2705 37.6914 83.9609 83.9629 83.9609c20.2227 0 39.835 -7.35449 55.1562 -20.5303c18.3867 74.7695 85.8008 127.781 163.021 127.781c92.542 0 167.924 -75.3818 167.924 -167.924
c0 -12.5635 -1.22559 -25.127 -4.29004 -37.3838zM199.88 46.4463v110.928c0 8.27344 -7.04688 15.3213 -15.3213 15.3213h-30.9482c-8.27344 0 -15.3213 -7.04785 -15.3213 -15.3213v-110.928c0 -8.27344 7.04688 -15.3213 15.3213 -15.3213h30.9482
c8.27344 0 15.3213 7.04688 15.3213 15.3213zM289.357 46.4463v131.458c0 8.27246 -7.04883 15.3203 -15.3223 15.3203h-30.9492c-8.27246 0 -15.3213 -7.04688 -15.3213 -15.3203v-131.458c0 -8.27344 7.04688 -15.3213 15.3213 -15.3213h30.9492
c8.27344 0 15.3223 7.04688 15.3223 15.3213zM378.834 46.4463v162.714c0 8.27246 -7.04688 15.3213 -15.3213 15.3213h-30.9482c-8.27441 0 -15.3223 -7.04785 -15.3223 -15.3213v-162.714c0 -8.27344 7.04785 -15.3213 15.3223 -15.3213h30.9482
c8.27441 0 15.3213 7.04688 15.3213 15.3213zM465.861 46.4463v224.612c0 8.58008 -7.04785 15.6279 -15.3223 15.6279h-28.4971c-8.27441 0 -15.3213 -7.04883 -15.3213 -15.6279v-224.612c0 -8.27344 7.04688 -15.3213 15.3213 -15.3213h28.4971
c8.27441 0 15.3223 7.04688 15.3223 15.3213z" />
    <glyph glyph-name="shirtsinbulk" unicode="&#xf214;" 
d="M100 37.7002l4.40039 9.89941l30.5996 -13.3994l-4.40039 -9.90039zM139.4 20.2002l4.39941 9.89941l30.6006 -13.3994l-4.40039 -9.90039zM311.5 34.2002l30.5996 13.3994l4.40039 -9.89941l-30.5996 -13.4004zM179.1 3l4.40039 9.59961l30.2998 -13.3994
l-4.39941 -9.90039zM60.4004 55.2002l4.39941 9.89941l30.6006 -13.6992l-4.40039 -9.60059zM271.8 16.7002l30.6006 13.3994l4.39941 -9.89941l-30.5996 -13.4004zM232.5 -0.799805l30.5996 13.3994l4.40039 -9.59961l-30.5996 -13.7002zM350.9 51.4004l30.5996 13.6992
l4.40039 -9.89941l-30.6006 -13.4004zM170 401.4v-10.5h-33.5v10.5h33.5zM122.8 401.4l-0.0996094 -10.5h-33.5v10.5h33.5996zM75.5 401.4l0.0996094 -10.5h-33.2998v10.5h33.2002zM217 401.4v-10.5h-33.2002v10.5h33.2002zM311.5 401.4v-10.5h-33.5v10.5h33.5zM358.8 401.4
v-10.5h-33.5v10.5h33.5zM264.2 401.4v-10.5h-33.2002v10.5h33.2002zM405.7 401.4v-10.5h-33.2998v10.5h33.2998zM52.7998 96.9004v-33.5h-10.7998v33.5h10.7998zM122.8 312.8l-0.0996094 -10.5h-33.5v10.5h33.5996zM52.7998 302.2v-23h-10.7998v33.5h33.5996v-10.5h-22.7998
zM221.7 73.5996c-50.2002 0 -91.2998 40.8008 -91.2998 91.3008c0 50.1992 41.0996 91.2998 91.2998 91.2998c50.5 0 91.2998 -41.1006 91.2998 -91.2998c0 -50.5 -40.7998 -91.3008 -91.2998 -91.3008zM173.5 184.7c0 -44.2998 77.5996 -11.9004 77.5996 -38
c0 -13.1006 -24 -14.2998 -32.6992 -14.2998c-12.3008 0 -29.8008 2.69922 -35.9004 14.8994h-0.900391l-9 -18.3994c14.8008 -9.30078 29.1006 -12.2002 47.2002 -12.2002c19.5 0 51 5.7998 51 31.2002c0 48.0996 -78.5 16.2998 -78.5 37.8994
c0 13.1006 20.7998 14.9004 29.7998 14.9004c10.8008 0 29.2002 -3.2002 35.6006 -13.1006h0.899414l8.80078 16.9004c-15.1006 6.2002 -27.4004 12 -44.3008 12c-20.0996 0 -49.5996 -6.40039 -49.5996 -31.7998zM52.7998 269.6v-33.5996h-10.7998v33.5996h10.7998z
M395.2 63.4004v33.5h10.7998v-33.5h-10.7998zM52.7998 140.1v-33.5h-10.7998v33.5h10.7998zM0 444.3h448v-406l-226.3 -98.5996l-221.7 98.5996v406zM418.8 57.2002h0.100586v270.1h-389.7v-270.1l192.8 -85.7002zM418.8 356.5h0.100586v58.5996h-389.7v-58.5996h389.6z
M52.7998 226.4v-33.5h-10.7998v33.5h10.7998zM52.7998 183.2v-33.5h-10.7998v33.5h10.7998zM170 312.8v-10.5h-33.5v10.5h33.5zM395.2 149.7v33.5h10.7998v-33.5h-10.7998zM395.2 192.9v33.5h10.7998v-33.5h-10.7998zM217 312.8v-10.5h-33.2002v10.5h33.2002zM395.2 236
v33.5h10.7998v-33.5h-10.7998zM395.2 106.5v33.5h10.7998v-33.5h-10.7998zM264.2 312.8v-10.5h-33.2002v10.5h33.2002zM311.5 312.8v-10.5h-33.5v10.5h33.5zM395.2 279.2l0.0996094 23h-22.7998v10.5h33.5v-33.5h-10.7998zM358.8 312.8v-10.5h-33.5v10.5h33.5z" />
    <glyph glyph-name="simplybuilt" unicode="&#xf215;" horiz-adv-x="512" 
d="M481.2 384c14.7002 0 26.5 -11.7998 26.7002 -26.2998v-331.4c0 -14.5 -11.8008 -26.2998 -26.6006 -26.2998h-450.399c-14.8008 0 -26.6006 11.7998 -26.6006 26.2998v331.4c0 14.5 11.7998 26.2998 26.4004 26.2998h106c14.5996 0 26.5996 -11.7998 26.5996 -26.2998
v-39.6006h185.3v39.6006c0 14.5 12.1006 26.2998 26.6006 26.2998h106zM149.8 92.2002c36.9004 0 66.6006 29.7002 66.6006 66.3994c0 36.9004 -29.7002 66.6006 -66.6006 66.6006c-36.7002 0 -66.3994 -29.7002 -66.3994 -66.6006
c0 -36.6992 29.7998 -66.3994 66.3994 -66.3994zM362.2 92.2002c36.5996 0 66.3994 29.7002 66.3994 66.5996c0 36.7002 -29.7998 66.4004 -66.3994 66.4004c-36.9004 0 -66.6006 -29.7998 -66.6006 -66.4004c0 -36.8994 29.7002 -66.5996 66.6006 -66.5996z" />
    <glyph glyph-name="skyatlas" unicode="&#xf216;" horiz-adv-x="640" 
d="M640 118.7c0 -65.9004 -52.5 -114.4 -117.5 -114.4c-165.9 0 -196.6 249.7 -359.7 249.7c-146.899 0 -147.1 -212.2 5.60059 -212.2c42.5 0 90.8994 17.7998 125.3 42.5c5.59961 4.10059 16.8994 16.2998 22.7998 16.2998s10.9004 -5 10.9004 -10.8994
c0 -7.7998 -13.1006 -19.1006 -18.7002 -24.1006c-40.9004 -35.5996 -100.3 -61.1992 -154.7 -61.1992c-83.4004 -0.100586 -154 59 -154 144.899c0 85.9004 67.5 149.101 152.8 149.101c185.3 0 222.5 -245.9 361.9 -245.9c99.8994 0 94.7998 139.7 3.39941 139.7
c-17.5 0 -35 -11.6006 -46.8994 -11.6006c-8.40039 0 -15.9004 7.2002 -15.9004 15.6006c0 11.5996 5.2998 23.7002 5.2998 36.2998c0 66.5996 -50.8994 114.7 -116.899 114.7c-53.1006 0 -80 -36.9004 -88.7998 -36.9004c-6.2002 0 -11.2002 5 -11.2002 11.2002
c0 5.59961 4.09961 10.2998 7.7998 14.4004c25.2998 28.7998 64.7002 43.6992 102.8 43.6992c79.4004 0 139.101 -58.3994 139.101 -137.8c0 -6.89941 -0.300781 -13.7002 -1.2002 -20.5996c11.8994 3.09961 24.0996 4.7002 35.8994 4.7002
c60.7002 0 111.9 -45.3008 111.9 -107.2z" />
    <glyph glyph-name="pinterest-p" unicode="&#xf231;" horiz-adv-x="384" 
d="M204 441.5c94.2002 0 180 -64.7998 180 -164.1c0 -93.3008 -47.7002 -196.801 -153.9 -196.801c-25.1992 0 -57 12.6006 -69.2998 36c-22.7998 -90.2998 -21 -103.8 -71.3994 -172.8c-5.2002 -1.89941 -3.5 -2.2998 -6.90039 1.5c-1.7998 18.9004 -4.5 37.5 -4.5 56.4004
c0 61.2002 28.2002 149.7 42 209.1c-7.5 15.2998 -9.59961 33.9004 -9.59961 50.7002c0 80 93.8994 92 93.8994 25.7998c0 -39 -26.3994 -75.5996 -26.3994 -113.399c0 -25.8008 21.2998 -43.8008 46.1992 -43.8008c69 0 90.3008 99.6006 90.3008 152.7
c0 71.1006 -50.4004 109.8 -118.5 109.8c-79.2002 0 -140.4 -57 -140.4 -137.399c0 -38.7002 23.7002 -58.5 23.7002 -67.7998c0 -7.80078 -5.7002 -35.4004 -15.6006 -35.4004c-24 0 -63.5996 40 -63.5996 110.4c0 110.699 101.4 179.1 204 179.1z" />
    <glyph glyph-name="whatsapp" unicode="&#xf232;" 
d="M380.9 350.9c41.8994 -42 67.0996 -97.7002 67.0996 -157c0 -122.4 -101.8 -222 -224.1 -222h-0.100586c-37.2002 0 -73.7002 9.2998 -106.1 27l-117.7 -30.9004l31.5 115c-19.4004 33.7002 -29.5996 71.9004 -29.5996 111c0 122.4 99.5996 222 222 222
c59.2998 0 115.1 -23.0996 157 -65.0996zM223.9 9.2998c101.699 0 186.6 82.7998 186.6 184.601c0.0996094 49.2998 -21.2998 95.5996 -56.0996 130.5c-34.8008 34.8994 -81.1006 54.0996 -130.4 54.0996c-101.8 0 -184.6 -82.7998 -184.6 -184.5
c0 -34.9004 9.69922 -68.7998 28.1992 -98.2002l4.40039 -7l-18.5996 -68.0996l69.7998 18.2998l6.7002 -4c28.2998 -16.7998 60.7998 -25.7002 94 -25.7002zM325.1 147.5c5.5 -2.7002 9.2002 -4.09961 10.5 -6.59961c1.40039 -2.30078 1.40039 -13.4004 -3.19922 -26.4004
c-4.60059 -13 -26.7002 -24.7998 -37.4004 -26.4004c-17.5996 -2.59961 -31.4004 -1.2998 -66.5996 13.9004c-55.7002 24.0996 -92 80.0996 -94.8008 83.7998c-2.69922 3.7002 -22.5996 30.1006 -22.5996 57.4004s14.2998 40.7002 19.4004 46.2998
c5.09961 5.5 11.0996 6.90039 14.7998 6.90039s7.39941 0 10.5996 -0.200195c3.40039 -0.200195 8 1.2998 12.5 -9.5c4.60059 -11.1006 15.7002 -38.4004 17.1006 -41.2002c1.39941 -2.7998 2.2998 -6 0.5 -9.7002c-10.6006 -21.2002 -22 -20.5 -16.3008 -30.2998
c21.5 -36.9004 42.9004 -49.7002 75.5 -66c5.5 -2.7998 8.80078 -2.2998 12 1.40039c3.30078 3.7998 13.9004 16.1992 17.6006 21.7998c3.7002 5.59961 7.39941 4.7002 12.5 2.7998c5.09961 -1.7998 32.3994 -15.2002 37.8994 -18z" />
    <glyph glyph-name="viacoin" unicode="&#xf237;" horiz-adv-x="384" 
d="M384 416l-48 -112h48v-48h-68.5l-13.7998 -32h82.2998v-48h-102.8l-89.2002 -208l-89.2002 208h-102.8v48h82.2998l-13.7998 32h-68.5v48h48l-48 112h64l80.7998 -192h94.5l80.7002 192h64zM192 112l27 64h-54z" />
    <glyph glyph-name="medium" unicode="&#xf23a;" 
d="M0 416h448v-448h-448v448zM372.2 309.9v5h-83.2002l-59.2998 -147.9l-67.4004 148h-87.2998v-5.09961l28.0996 -33.9004c2.80078 -2.5 4.2002 -6.09961 3.80078 -9.7998v-133c0.799805 -4.7998 -0.700195 -9.7002 -4.10059 -13.2002l-31.5996 -38.2998v-5.10059h89.7998
v5.10059l-31.5996 38.2998c-3.40039 3.5 -5.10059 8.40039 -4.40039 13.2002v115l78.7002 -171.601h9.09961l67.6006 171.601v-136.9c0 -3.59961 0 -4.2998 -2.40039 -6.7002l-24.2998 -23.5996v-4.90039h118v5.10059l-23.5 23
c-2.10059 1.5 -3.10059 4.09961 -2.7002 6.7002v169.3c-0.400391 2.5 0.599609 5.09961 2.7002 6.7002z" />
    <glyph glyph-name="y-combinator" unicode="&#xf23b;" 
d="M448 416v-448h-448v448h448zM236 160.5l77.5 145.5h-32.7002l-45.7998 -91c-4.7002 -9.2998 -9 -18.2998 -12.7998 -26.7998l-12.2002 26.7998l-45.2002 91h-35l76.7002 -143.8v-94.5h29.5v92.7998z" />
    <glyph glyph-name="optin-monster" unicode="&#xf23c;" horiz-adv-x="576" 
d="M572.6 26.5996c1 -3.5 1.90039 -7 1.7002 -10.6992c0.799805 -31.6006 -44.2998 -64 -73.5 -65.1006c-17.2998 -0.799805 -34.5996 8.40039 -42.7002 23.5c-113.5 -4.09961 -227 -4.89941 -340.199 0c-8.40039 -15.0996 -25.7002 -24 -43 -23.5
c-28.9004 1.10059 -74 33.5 -73.5 65.1006c0.299805 3.7998 0.799805 7.2998 1.89941 10.7998c-5.59961 9.39941 -4.7998 15.2998 5.40039 11.5996c3.2998 5.2002 7 9.5 11.0996 13.7998c-2.5 10.9004 1.2998 14.1006 11.1006 9.2002c4.5 3.2998 10 6.5 15.8994 9.2002
c0 15.7998 11.7998 11.2002 17.2998 5.7002c12.5 1.7998 20.2002 -0.700195 26.8008 -5.7002v19.7002c-12.9004 0 -40.6006 11.3994 -45.9004 36.2002c-5 20.7998 2.59961 38.0996 25.0996 47.5996c0.800781 5.90039 8.10059 14 14.9004 15.9004
c7.59961 1.89941 12.5 -4.60059 14.0996 -10.3008c7.40039 0 17.8008 -1.5 21.1006 -8.09961c5.39941 0.5 11.0996 1.40039 16.5 1.90039c-2.40039 1.89941 -5.10059 3.5 -8.10059 4.59961c-5.09961 8.90039 -13.7998 11.0996 -24.5996 11.5996
c0 0.800781 0 1.60059 0.299805 2.7002c-19.7998 0.5 -44.0996 5.60059 -54.8994 17.7998c-21.3008 23.6006 -15.9004 83.6006 12.1992 103.5c8.40039 5.7002 21.6006 0.800781 22.7002 -9.69922c2.40039 -20.6006 0.400391 -26.8008 26.2002 -25.9004
c8.09961 7.7998 16.7998 14.5996 26.5 20c-14.9004 1.2998 -28.9004 -1.59961 -43.7998 -3.7998c12.7002 12.5 23.8994 25.3994 56.7002 42.3994c23.5 11.9004 50 20.8008 76.1992 23.2002c-18.5996 7.90039 -40 11.9004 -59.6992 16.5
c76.5 16.2002 174.6 22.1006 244.199 -37.5996c18.1006 -15.4004 32.4004 -36.2002 42.7002 -60c39.7998 -4.90039 36.4004 5.5 38.6006 25.0996c1.09961 10.2998 14.2998 15.4004 22.6992 9.5c14.9004 -10.5 22.2002 -30.7998 24.6006 -48.0996
c2.2002 -17.7998 0.299805 -41.2998 -12.4004 -55.1006c-10.7998 -12.1992 -34.2998 -17.5996 -53.7998 -18.0996v-2.7998c-11.0996 -0.200195 -20.2998 -2.40039 -25.7002 -11.6006c-3 -1.09961 -5.7002 -2.69922 -8.39941 -4.59961
c5.69922 -0.5 11.3994 -1.40039 16.7998 -1.90039c1.89941 5.60059 12.5996 8.40039 21.0996 8.40039c1.7002 5.40039 6.7998 11.9004 14.1006 10.2998c7.2998 -1.59961 14.0996 -10 14.8994 -15.8994c10.7998 -4.40039 22.1006 -12.2002 25.1006 -25.7002
c1.89941 -8.10059 1.69922 -15.1006 0.299805 -21.9004c-5.7002 -25.2002 -33.2998 -36.2002 -45.9004 -36.2002c0 -6.69922 0 -13.1992 -0.299805 -19.6992c8.09961 6 16.4004 7.19922 26.7998 5.69922c6 5.90039 17.6006 9.40039 17.6006 -5.69922
c5.59961 -2.7002 11.2998 -6 15.8994 -9.2002c10.1006 5 13.7002 0.5 10.7998 -9.2002c4.10059 -4.2998 8.10059 -8.90039 11.1006 -13.7998c10.0996 3.59961 11 -2.10059 5.39941 -11.6006zM498.8 280.6c17.2998 -6.69922 26.2002 -22.0996 30.2998 -35.6992
c1.10059 10.5996 -2.69922 39.5 -13.7998 51.0996c-7.2998 7.2998 -14.0996 5.09961 -14.0996 -0.799805c0 -6.2002 -1.2998 -11.6006 -2.40039 -14.6006zM494.2 273.9c-3.2002 -3.30078 -9.2002 -4.90039 -14.1006 -5.7002c13 -15.7002 17 -41.7002 12.7002 -63
c10.7998 2.2002 20.5 6.2998 26.2002 12.2002c1.90039 2.19922 3.7998 4.89941 4.90039 7.59961c-1.10059 21.2998 -10.2002 42.7002 -29.7002 48.9004zM470.1 267.1c-3.69922 0 -8.09961 0 -11.7998 0.300781c7.5 -20.6006 12.4004 -42.7002 14.2998 -64.6006
c3.5 0 7.5 0.299805 11.6006 0.799805c5.89941 24.3008 -0.299805 51.6006 -14.1006 63.5zM47.5 245c4.09961 13.5 13 28.9004 30.2998 35.7002c-1 3 -2.39941 8.39941 -2.39941 14.5996c0 5.90039 -7.10059 8.10059 -14.1006 0.799805
c-11.3994 -11.5996 -14.8994 -40.5996 -13.7998 -51.0996zM57.2002 217.4c5.7002 -6.2002 15.3994 -10 26.2002 -12.2002c-4.30078 21.3994 -0.300781 47.2998 12.6992 63c-4.89941 0.799805 -10.8994 2.5 -14.0996 5.7002
c-19.4004 -6.2002 -28.2998 -27.6006 -29.7002 -48.9004c1.40039 -2.7002 3 -5.40039 4.90039 -7.59961zM105.1 202.8c2.40039 22.2002 9.10059 43.7998 19.8008 63.5c-5.2002 -1.09961 -10 -3 -14.9004 -4.89941l-12.2002 -5.10059v0.299805
c-7.2998 -14.0996 -10 -34.3994 -5.39941 -53c4.59961 -0.5 8.59961 -0.799805 12.6992 -0.799805zM289.1 365.5c-41.8994 0 -76.1992 -34.0996 -76.1992 -75.9004c0 -42.1992 34.2998 -76.1992 76.1992 -76.1992c41.9004 0 76.2002 34 76.2002 76.1992
c0 41.9004 -34.2998 75.9004 -76.2002 75.9004zM404.7 191.2c-12.9004 0.799805 -26.2002 0.799805 -39.5 1.09961c10 -50.5996 3.2998 -64.7002 16.5 -58.0996c16 8.09961 22.7002 39.2002 23 57zM350.7 192.8c-18.9004 0.299805 -38.1006 0.299805 -57 0v0.299805
c-0.299805 -5.19922 0.200195 -38.0996 4.2998 -41.0996c11.0996 -5.40039 39.5 -4.59961 51.0996 -1.09961c5.40039 1.59961 2.40039 37 1.60059 41.8994zM278.3 139c4.60059 2.5 2.40039 45.4004 1.2998 53.7002v0.299805
c-19.3994 -0.299805 -38.5996 -0.299805 -57.7998 -0.799805c-1.89941 -9.2002 -4.59961 -48.9004 1.90039 -51.6006c13 -5.69922 41.5996 -5.09961 54.5996 -1.59961zM171.8 190.1c-5.39941 -19.6992 0.299805 -45.0996 22.2002 -54.8994
c5.40039 -2.5 8.59961 -2.5 9.7002 4.2998c1.89941 8.7002 2.5 36.7998 4.89941 52.2002c-12.1992 -0.200195 -24.5996 -0.799805 -36.7998 -1.60059zM136.4 158.8c2.39941 -3.7002 1.59961 -9.09961 -8 -12.5c43.7998 -47 92.6992 -85.7002 155.899 -106.5
c67.5 19.2002 115.601 60 163.2 107c-11.0996 4.2998 -7.7002 10.2998 -7.2998 11.6006c-8.90039 0.799805 -17.9004 1.89941 -26.5 2.69922c-9.5 -33 -36 -52.8994 -46.7998 -31.5996c-2.7002 5.2002 -3.5 11.7002 -4.60059 16.7998
c-3.7998 -8.39941 -13.2998 -8.09961 -24.5996 -8.89941c-13.2002 -1.10059 -31.6006 -1.30078 -44 3c-3 -12.9004 -11.1006 -12.9004 -26.7998 -14.3008c-14.1006 -1.39941 -48.7002 -4.09961 -54.9004 10.8008c-1.09961 -28.7002 -35.0996 -10 -45.0996 7
c-3.2002 5.69922 -5.40039 11.3994 -7 17.5996c-7.80078 -0.799805 -15.7002 -1.59961 -23.5 -2.7002zM114.8 -13.7002c0.5 2.5 0.799805 5.2002 0.799805 8.2002c-5.69922 23.2002 -18.5996 49.7002 -33.5 54c-22.3994 6.7002 -68.8994 -23.5 -66.1992 -54.5996
c12.6992 -19.5 40 -35.7002 59.1992 -36.5c17.8008 -0.800781 35.9004 11.0996 39.7002 28.8994zM106.1 52.2998c9 -16 15.5 -33.2998 16.7002 -51.8994c33.5 19.3994 69.1006 35.6992 105.9 47c-38.7002 20.5 -68.1006 47.7998 -97.2998 77
c-2.10059 -1.30078 -5.10059 -2.40039 -7.80078 -3.5c-1.59961 -4.90039 8.7002 -5.30078 5.40039 -12.4004c-2.09961 -4.09961 -8.59961 -7.59961 -15.0996 -9.2002c-2.10059 -2.7002 -5.10059 -4.89941 -7.80078 -6.5h-0.299805
c-0.200195 -13.5 -0.200195 -27 0.299805 -40.5zM443.7 -12.2998c-36.7998 21.2998 -74.1006 41.2998 -115.601 53c-13.7998 -6.2002 -27.8994 -11.2998 -42.1992 -15.4004c-2.10059 -0.799805 -2.10059 -0.799805 -4.30078 0
c-11.8994 3.7002 -23.2998 8.10059 -34.8994 13.2002c-40.2002 -11.5996 -77.2998 -29.2002 -112.4 -50.7998h-0.299805v-0.299805c0.299805 0 0.299805 0 0.299805 0.299805c103.2 -4.10059 206.4 -3.5 309.4 0zM454.2 0.0996094c1 14.7002 7.2002 35.8008 16.5 51.7002
l-0.299805 -0.299805c0.5 13.7002 0.799805 27.5 0.799805 41.2998c-3 1.7002 -5.7002 4.10059 -8.10059 6.7998c-6.5 1.30078 -12.8994 5.10059 -15.0996 8.90039c-1.90039 4.09961 1.2998 7.59961 5.90039 10.2998c-0.200195 0.5 -0.5 1.60059 -0.5 2.40039
c-3 0.799805 -5.40039 1.7998 -7.60059 3.2002c-31.5996 -29.4004 -65.3994 -56.7002 -103.5 -76.7002c38.9004 -11.7002 76 -28.1006 111.9 -47.6006zM560.1 -6.09961c3 31.0996 -43.5 61.3994 -66.1992 54.5c-14.6006 -4.30078 -27.8008 -30.8008 -33.5 -54
c0 -23.8008 21.1992 -37.9004 40.5 -37c19.1992 0.799805 46.5 17 59.1992 36.5zM372.9 372.8c-35.7002 39.2002 -81.4004 47.7998 -126 23.5c25.1992 56.2002 122.199 48.6006 126 -23.5zM74.7998 40.9004c14.9004 1.89941 24.6006 -19.2002 18.6006 -30.8008
c-4.80078 -9.69922 -23.7002 -24.0996 -35.9004 -27.2998c-16.5 -4.59961 -32.2002 3.2998 -32.2002 14.9004c0 17.7998 33.7998 41.5996 49.5 43.2002zM290.7 217.1c-30.9004 0 -57.6006 25.7002 -50.2998 59.8008c13.1992 -20.7002 46.5 -12 46.5 11.2998
c0 10 -7 18.5996 -16.5 21.5996c31.6992 13.7998 72.1992 -8.2002 72.1992 -44.2998c0 -26.7998 -23.2998 -48.4004 -51.8994 -48.4004zM68 -26.0996c-0.5 8.39941 20.2998 23.5 29.2002 25.0996c8.59961 1.59961 12.7002 -11.4004 9.7002 -18.4004
c-2.7002 -5.69922 -10.5 -13.5 -17.3008 -16.1992c-9.39941 -3.2002 -21.0996 3 -21.5996 9.5zM501.2 40.9004c15.7002 -1.60059 49.5 -25.4004 49.5 -43.2002c0 -11.7002 -15.7002 -19.5 -32.2002 -14.9004c-12.0996 3.2002 -31.2998 17.6006 -36.2002 27.2998
c-5.7002 11.6006 4 32.7002 18.9004 30.8008zM478.8 -1c8.90039 -1.59961 30 -16.7002 29.1006 -25.0996c-0.200195 -6.5 -12.1006 -12.7002 -21.3008 -9.5c-7 2.69922 -14.8994 10.5 -17.2998 16.1992c-2.89941 7.10059 1.10059 20 9.5 18.4004z" />
    <glyph glyph-name="opencart" unicode="&#xf23d;" horiz-adv-x="640" 
d="M423.3 7.2998c0 -25.2998 -20.2998 -45.5996 -45.5996 -45.5996s-45.7998 20.2998 -45.7998 45.5996s20.5996 45.7998 45.7998 45.7998c25.3994 0 45.5996 -20.5 45.5996 -45.7998zM169.4 53.0996c25.2998 0 45.7998 -20.5 45.7998 -45.7998
s-20.5 -45.5996 -45.7998 -45.5996c-25.3008 0 -45.6006 20.3994 -45.6006 45.5996s20.2998 45.7998 45.6006 45.7998zM461.1 323.1c302.2 0 169.5 -67.1992 -17.1992 -233.899c59.1992 102.8 262.5 193.899 -70.8008 188.899c-319.8 -4.69922 -338.699 92.5 -373.1 144.2
c81.9004 -86.3994 158.9 -99.2002 461.1 -99.2002z" />
    <glyph glyph-name="expeditedssl" unicode="&#xf23e;" horiz-adv-x="496" 
d="M248 404.6c117.4 0 212.6 -95.1992 212.6 -212.6s-95.1992 -212.6 -212.6 -212.6s-212.6 95.1992 -212.6 212.6s95.1992 212.6 212.6 212.6zM150.6 271.7h-0.199219v-26.6006c0 -5 3.89941 -8.89941 8.89941 -8.89941h17.7002c5 0 8.90039 3.89941 8.90039 8.89941
v26.6006c0 82.0996 124 82.0996 124 0v-26.6006c0 -5 3.89941 -8.89941 8.89941 -8.89941h17.7002c5 0 8.90039 3.89941 8.90039 8.89941v26.6006c0 53.7002 -43.7002 97.3994 -97.4004 97.3994s-97.4004 -43.6992 -97.4004 -97.3994zM389.7 68v141.7
c0 9.7002 -8 17.7002 -17.7002 17.7002h-248c-9.7002 0 -17.7002 -8 -17.7002 -17.7002v-141.7c0 -9.7002 8 -17.7002 17.7002 -17.7002h248c9.7002 0 17.7002 8 17.7002 17.7002zM141.7 205.3v-132.899c0 -2.5 -1.90039 -4.40039 -4.40039 -4.40039h-8.89941
c-2.5 0 -4.40039 1.90039 -4.40039 4.40039v132.899c0 2.5 1.90039 4.40039 4.40039 4.40039h8.89941c2.5 0 4.40039 -1.90039 4.40039 -4.40039zM283.4 156.6c0 -13 -7.2002 -24.3994 -17.7002 -30.3994v-31.6006c0 -5 -3.90039 -8.89941 -8.90039 -8.89941h-17.7002
c-5 0 -8.89941 3.89941 -8.89941 8.89941v31.6006c-10.5 6.09961 -17.7002 17.3994 -17.7002 30.3994c0 19.7002 15.7998 35.4004 35.4004 35.4004c19.5996 0 35.5 -15.7998 35.5 -35.4004zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248
s111 248 248 248zM248 -38.2998c127 0 230.3 103.3 230.3 230.3s-103.3 230.3 -230.3 230.3s-230.3 -103.3 -230.3 -230.3s103.3 -230.3 230.3 -230.3z" />
    <glyph glyph-name="cc-jcb" unicode="&#xf24b;" horiz-adv-x="576" 
d="M431.5 203.7v32.2998c41.2002 0 38.5 -0.200195 38.5 -0.200195c7.2998 -1.2998 13.2998 -7.2998 13.2998 -16c0 -8.7998 -6 -14.5 -13.2998 -15.7998c-1.2002 -0.400391 -3.2998 -0.299805 -38.5 -0.299805zM474.3 183.5c7.5 -1.5 13.5 -8.2998 13.5 -17
c0 -9 -6 -15.5 -13.5 -17c-2.7998 -0.700195 -3.2002 -0.5 -42.7998 -0.5v35c39.5 0 40 0.200195 42.7998 -0.5zM576 368v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48zM182 255.7h-57
c0 -67.1006 10.7002 -109.7 -35.7998 -109.7c-19.5 0 -38.7998 5.7002 -57.2002 14.7998v-28c30 -8.2998 68 -8.2998 68 -8.2998c97.9004 0 82 47.7002 82 131.2zM360.5 251.2c-63.4004 16 -165 14.8994 -165 -59.2998c0 -77.1006 108.2 -73.6006 165 -59.2002v28.2998
c-47.5996 -24.7002 -107.5 -22 -107.5 31s59.7998 55.5996 107.5 31.2002v28zM544 161.5c0 18.5 -16.5 30.5 -38 32v0.799805c19.5 2.7002 30.2998 15.5 30.2998 30.2002c0 19 -15.7002 30 -37 31c0 0 6.2998 0.299805 -120.3 0.299805v-127.5h122.7
c24.2998 -0.0996094 42.2998 12.9004 42.2998 33.2002z" />
    <glyph glyph-name="cc-diners-club" unicode="&#xf24c;" horiz-adv-x="576" 
d="M239.7 368.1c97.2002 0 175.8 -78.5996 175.8 -175.8c0 -96.8994 -78.5996 -175.8 -175.8 -175.8c-96.9004 0 -175.8 78.9004 -175.8 175.8c0 97.2002 78.8994 175.8 175.8 175.8zM199.8 88.5v207.9c-41.7002 -16.2002 -71.3994 -56.7002 -71.3994 -104.101
c0 -47.3994 29.6992 -87.8994 71.3994 -103.8zM279.6 88.2002c41.7002 16.2002 71.4004 56.7002 71.4004 104.1c0 47.4004 -29.7002 87.9004 -71.4004 104.101v-208.2zM528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352
c0 26.5 21.5 48 48 48h480zM329.7 0c105 0 200.7 85.5 200.7 190.2c0 114.6 -95.7002 193.8 -200.7 193.8h-90.2998c-106.2 0 -193.801 -79.2002 -193.801 -193.8c0 -104.7 87.6006 -190.2 193.801 -190.2h90.2998z" />
    <glyph glyph-name="creative-commons" unicode="&#xf25e;" horiz-adv-x="496" 
d="M245.83 233.13l-33.2197 -17.2803c-9.43066 19.5801 -25.2402 19.9307 -27.46 19.9307c-22.1309 0 -33.2207 -14.6104 -33.2207 -43.8398c0 -23.5703 9.20996 -43.8408 33.2207 -43.8408c14.4697 0 24.6494 7.09082 30.5693 21.2607l30.5498 -15.5
c-6.16992 -11.5107 -25.6895 -38.9805 -65.0996 -38.9805c-22.5996 0 -73.96 10.3203 -73.96 77.0498c0 58.6904 43 77.0605 72.6299 77.0605c30.7197 0.00976562 52.7002 -11.9502 65.9902 -35.8604zM388.88 233.13l-32.7803 -17.2803
c-9.5 19.7705 -25.7197 19.9307 -27.8994 19.9307c-22.1406 0 -33.2197 -14.6104 -33.2197 -43.8398c0 -23.5508 9.22949 -43.8408 33.2197 -43.8408c14.4502 0 24.6494 7.09082 30.54 21.2607l31 -15.5c-2.10059 -3.75 -21.3906 -38.9805 -65.0898 -38.9805
c-22.6904 0 -73.96 9.87012 -73.96 77.0498c0 58.6699 42.9697 77.0605 72.6299 77.0605c30.71 0.00976562 52.5801 -11.9502 65.5596 -35.8604zM247.56 439.95c141.82 0 248.44 -110.13 248.44 -248c0 -147.13 -118.51 -248 -248.44 -248
c-133.96 0 -247.56 109.51 -247.56 248c0 132.939 104.74 248 247.56 248zM248.43 -10.8604c103.16 0 202.83 81.1299 202.84 202.82c0 113.8 -90.2891 203.26 -202.819 203.26c-118.29 0 -203.72 -97.8496 -203.72 -203.27c0 -109.771 91.1592 -202.811 203.699 -202.811z
" />
    <glyph glyph-name="gg" unicode="&#xf260;" horiz-adv-x="512" 
d="M179.2 217.6l102.399 -102.399l-102.399 -102.4l-179.2 179.2l179.2 179.2l44.7998 -44.7998l-25.5996 -25.6006l-19.2002 19.2002l-128 -128l128 -128l51.5 51.5l-77.1006 76.5zM332.8 371.2l179.2 -179.2l-179.2 -179.2l-44.7998 44.7998l25.5996 25.6006
l19.2002 -19.2002l128 128l-128 128l-51.5 -51.5l77.1006 -76.5l-25.6006 -25.5996l-102.399 102.399z" />
    <glyph glyph-name="gg-circle" unicode="&#xf261;" horiz-adv-x="512" 
d="M257 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM207.5 65.2002l75 75.2002l-77.2002 77.1992l-24.3994 -24.3994l53.0996 -52.9004l-26.5996 -26.5996l-77.2002 77.2002l77.2002 77.1992l11.0996 -11.0996l24.2002 24.2002
l-35.2002 35.3994l-125.7 -125.699zM306.5 67.4004l125.7 125.6l-125.7 125.7l-75 -75l77.2002 -77.2002l24.3994 24.4004l-53.0996 52.8994l26.5 26.5l77.2002 -77.2002l-77.2002 -77.1992l-11.0996 11.0996l-24.1006 -24.4004z" />
    <glyph glyph-name="tripadvisor" unicode="&#xf262;" horiz-adv-x="576" 
d="M166.4 167.479c0 -13.2354 -10.7305 -23.9658 -23.9668 -23.9658c-13.2354 0 -23.9658 10.7305 -23.9658 23.9658c0 13.2363 10.7305 23.9668 23.9658 23.9668c13.2363 0 23.9668 -10.7295 23.9668 -23.9668zM431.362 191.435
c13.2295 0 23.9551 -10.7246 23.9561 -23.9561c0 -13.2305 -10.7266 -23.9551 -23.9561 -23.9551c-13.2314 0 -23.9561 10.7256 -23.9561 23.9551c0 13.2314 10.7256 23.9561 23.9561 23.9561zM520.75 51.9453c-62.667 -49.1045 -153.276 -38.1094 -202.379 24.5586
l-30.9795 -46.3252l-30.6826 45.9395c-48.2773 -60.3906 -135.622 -71.8916 -197.885 -26.0547c-64.0586 47.1572 -77.7588 137.315 -30.6016 201.373c-5.05762 17.1221 -17.7021 42.7236 -28.2227 57.1475l90.2861 0.0498047
c48.0039 29.8701 132.851 54.1123 189.389 54.1123c2.11914 0 5.55762 -0.0371094 7.67578 -0.0820312c1.72363 0.0302734 4.52246 0.0556641 6.24609 0.0556641c55.5518 0 138.851 -23.9258 185.936 -53.4043l96.2178 -0.0742188
c-10.6191 -14.5371 -23.3213 -40.3643 -28.3516 -57.6494c46.793 -62.7471 34.9639 -151.37 -26.6484 -199.646zM259.366 166.239c-0.00683594 63.5566 -51.5352 115.075 -115.092 115.067c-63.5576 -0.00683594 -115.074 -51.5342 -115.068 -115.092
c0.00683594 -63.5566 51.5352 -115.075 115.092 -115.067c63.5127 0.0742188 114.984 51.5381 115.068 115.052v0.0400391zM287.957 176.694c5.43262 73.4395 65.5098 130.884 139.12 133.021c-35.5576 15.374 -95.8555 27.8506 -134.594 27.8506
c-1.41699 0 -3.7168 -0.0166016 -5.13379 -0.0380859c-0.953125 0.00878906 -2.50098 0.0166016 -3.45508 0.0166016c-39.2324 0 -100.479 -12.2168 -136.709 -27.2695c74.3447 -1.58203 135.3 -59.4248 140.771 -133.581zM539.663 205.461
c-21.9922 59.6338 -88.1621 90.1484 -147.795 68.1572c-59.6338 -21.9922 -90.1484 -88.1621 -68.1572 -147.795v-0.0322266c22.0381 -59.6074 88.1982 -90.0908 147.827 -68.1133c59.6152 22.0039 90.1133 88.1621 68.125 147.783zM213.624 167.486v-0.115234
c-0.0566406 -39.3281 -31.9863 -71.1631 -71.3145 -71.1064c-39.3271 0.0576172 -71.1621 31.9863 -71.1055 71.3145s31.9863 71.1631 71.3135 71.1055c39.2598 -0.115234 71.042 -31.9395 71.1064 -71.1982zM189.112 167.486v0.0839844
c-0.0517578 25.7832 -20.9941 46.6445 -46.7783 46.5938s-46.6445 -20.9941 -46.5938 -46.7773c0.0507812 -25.7842 20.9941 -46.6445 46.7764 -46.5938c25.7266 0.113281 46.5371 20.9678 46.5957 46.6934zM502.535 167.486
c-0.0205078 -39.3281 -31.918 -71.2422 -71.2471 -71.2217c-39.3291 0.0214844 -71.1943 31.918 -71.1729 71.2471c0.0195312 39.3281 31.918 71.1943 71.2471 71.1729c39.29 -0.0654297 71.1211 -31.9082 71.1729 -71.1982zM478.031 167.494
c-0.00878906 25.7842 -20.918 46.6787 -46.7021 46.6699s-46.6787 -20.918 -46.6699 -46.7021s20.918 -46.6777 46.7021 -46.6699c25.7646 0.0458984 46.6357 20.9277 46.6699 46.6934v0.00878906z" />
    <glyph glyph-name="odnoklassniki" unicode="&#xf263;" horiz-adv-x="320" 
d="M275.1 114c-27.3994 -17.4004 -65.0996 -24.2998 -90 -26.9004l20.9004 -20.5996l76.2998 -76.2998c27.9004 -28.6006 -17.5 -73.2998 -45.7002 -45.7002c-19.0996 19.4004 -47.0996 47.4004 -76.2998 76.5996l-76.2998 -76.5
c-28.2002 -27.5 -73.5996 17.6006 -45.4004 45.7002c19.4004 19.4004 47.1006 47.4004 76.3008 76.2998l20.5996 20.6006c-24.5996 2.59961 -62.9004 9.09961 -90.5996 26.8994c-32.6006 21 -46.9004 33.3008 -34.3008 59c7.40039 14.6006 27.7002 26.9004 54.6006 5.7002
c0 0 36.2998 -28.8994 94.8994 -28.8994c58.6006 0 94.9004 28.8994 94.9004 28.8994c26.9004 21.1006 47.0996 8.90039 54.5996 -5.7002c12.4004 -25.6992 -1.89941 -38 -34.5 -59.0996zM30.2998 318.3c0 71.7002 58.2998 129.7 129.7 129.7s129.7 -58 129.7 -129.7
c0 -71.3994 -58.2998 -129.399 -129.7 -129.399s-129.7 58 -129.7 129.399zM96.2998 318.3c0 -35.0996 28.6006 -63.7002 63.7002 -63.7002s63.7002 28.6006 63.7002 63.7002c0 35.4004 -28.6006 64 -63.7002 64s-63.7002 -28.5996 -63.7002 -64z" />
    <glyph glyph-name="odnoklassniki-square" unicode="&#xf264;" 
d="M184.2 270.9c0 22.0996 17.8994 40 39.7998 40s39.7998 -17.9004 39.7998 -40c0 -22 -17.8994 -39.8008 -39.7998 -39.8008s-39.7998 17.9004 -39.7998 39.8008zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352
c26.5 0 48 -21.5 48 -48zM142.9 270.9c0 -44.6006 36.3994 -80.9004 81.0996 -80.9004s81.0996 36.2002 81.0996 80.9004c0 44.7998 -36.3994 81.0996 -81.0996 81.0996s-81.0996 -36.2002 -81.0996 -81.0996zM317.4 180.2
c-4.60059 9.09961 -17.3008 16.7998 -34.1006 3.59961c0 0 -22.7002 -18 -59.2998 -18s-59.2998 18 -59.2998 18c-16.7998 13.2002 -29.5 5.5 -34.1006 -3.59961c-7.89941 -16.1006 1.10059 -23.7002 21.4004 -37c17.2998 -11.1006 41.2002 -15.2002 56.5996 -16.7998
l-12.8994 -12.9004c-18.2002 -18 -35.5 -35.5 -47.7002 -47.7002c-17.5996 -17.5996 10.7002 -45.7998 28.4004 -28.5996l47.6992 47.8994c18.2002 -18.1992 35.7002 -35.6992 47.7002 -47.8994c17.6006 -17.2002 46 10.7002 28.6006 28.5996l-47.7002 47.7002l-13 12.9004
c15.5 1.59961 39.0996 5.89941 56.2002 16.7998c20.3994 13.2998 29.2998 21 21.5 37z" />
    <glyph glyph-name="get-pocket" unicode="&#xf265;" 
d="M407.6 384c22.7002 0 40.4004 -18.2002 40.4004 -40.5996v-135.2c0 -124.7 -99.7998 -224.2 -223.8 -224.2c-124.5 0 -224.2 99.5 -224.2 224.2v135.2c0 22.0996 18.5 40.5996 40.5996 40.5996h367zM245.6 115.5c111.9 107.5 114.801 105.4 114.801 123.2
c0 16.8994 -13.8008 30.7002 -30.7002 30.7002c-16.9004 0 -14.9004 -2.40039 -105.5 -89.3008c-89.1006 85.5 -88.2002 89.3008 -105.2 89.3008c-16.9004 0 -30.7002 -13.8008 -30.7002 -30.7002c0 -18.1006 1.2002 -14.2998 114.9 -123.2
c11 -11.0996 30 -11.7998 42.3994 0z" />
    <glyph glyph-name="wikipedia-w" unicode="&#xf266;" horiz-adv-x="640" 
d="M640 396.8l-0.299805 -12.2002c-28.1006 -0.799805 -45 -15.7998 -55.7998 -40.2998c-25 -57.7998 -103.301 -240 -155.301 -358.6h-13.5996l-81.9004 193.1c-32.5 -63.5996 -68.2998 -130 -99.1992 -193.1c-0.300781 -0.299805 -15 0 -15 0.299805
c-46.9004 109.7 -96.1006 218.6 -143.101 328.6c-11.3994 26.7002 -49.3994 70 -75.5996 69.7002c0 3.10059 -0.299805 10 -0.299805 14.2002h161.899v-13.9004c-19.2002 -1.09961 -52.7998 -13.2998 -43.2998 -34.1992c21.9004 -49.7002 103.6 -240.301 125.6 -288.601
c15 29.7002 57.8008 109.2 75.3008 142.8c-13.9004 28.3008 -58.6006 133.9 -72.8008 160c-9.69922 17.8008 -36.0996 19.4004 -55.7998 19.7002v13.9004l142.5 -0.299805v-13.1006c-19.3994 -0.599609 -38.0996 -7.7998 -29.3994 -26.0996
c18.8994 -40 30.5996 -68.1006 48.0996 -104.7c5.59961 10.7998 34.7002 69.4004 48.0996 100.8c8.90039 20.6006 -3.89941 28.6006 -38.5996 29.4004c0.299805 3.59961 0 10.2998 0.299805 13.5996c44.4004 0.299805 111.101 0.299805 123.101 0.600586v-13.6006
c-22.5 -0.799805 -45.8008 -12.7998 -58.1006 -31.7002l-59.2002 -122.8c6.40039 -16.0996 63.3008 -142.8 69.2002 -156.7l122.4 282.601c-8.60059 23.0996 -36.4004 28.0996 -47.2002 28.2998v13.9004l127.8 -1.10059z" />
    <glyph glyph-name="safari" unicode="&#xf267;" horiz-adv-x="512" 
d="M274.69 173.31l-108.69 -71.3096l71.3096 108.69zM256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM411.85 265.21c-2.71094 -1.13477 -4.91211 -4.44043 -4.91211 -7.37988c0 -0.880859 0.274414 -2.25684 0.612305 -3.07031
v0c1.12988 -2.72559 4.44043 -4.9375 7.39062 -4.9375c0.87793 0 2.24902 0.272461 3.05957 0.607422l14.75 6.11035c2.72754 1.12891 4.94141 4.44043 4.94141 7.39258c0 0.879883 -0.273438 2.25391 -0.611328 3.06738v0
c-1.12793 2.73047 -4.44043 4.94629 -7.39453 4.94629c-0.876953 0 -2.24512 -0.271484 -3.05566 -0.606445zM314.43 354c-0.341797 -0.818359 -0.620117 -2.20117 -0.620117 -3.08789c0 -2.95215 2.21387 -6.26367 4.94043 -7.39258v0
c0.810547 -0.334961 2.18164 -0.607422 3.05957 -0.607422c2.9502 0 6.26074 2.21191 7.39062 4.9375l6.12988 14.7803c0.335938 0.811523 0.608398 2.18164 0.608398 3.05957c0 2.9502 -2.21289 6.26172 -4.93848 7.39062v0
c-0.813477 0.337891 -2.18848 0.612305 -3.07031 0.612305c-2.93848 0 -6.24512 -2.20117 -7.37988 -4.91211zM256 388c-4.41602 0 -8 -3.58398 -8 -8v-16c0 -4.41602 3.58398 -8 8 -8v0c4.41602 0 8 3.58398 8 8v16c0 4.41602 -3.58398 8 -8 8v0zM181 373.08
c-2.72461 -1.12988 -4.93555 -4.44043 -4.93555 -7.38965c0 -0.869141 0.266602 -2.22656 0.595703 -3.03027l6.12988 -14.7803c1.09863 -2.80664 4.43555 -5.08398 7.44922 -5.08398c4.41602 0 8 3.58398 8 8c0 0.922852 -0.299805 2.3584 -0.668945 3.2041l-6.11035 14.75
c-1.12891 2.72754 -4.44043 4.94141 -7.39258 4.94141c-0.879883 0 -2.25391 -0.273438 -3.06738 -0.611328zM117.42 330.59c-1.29297 -1.29297 -2.35156 -3.82617 -2.35156 -5.65527c0 -1.81445 1.03613 -4.33398 2.31152 -5.625l11.3105 -11.3096
c1.29297 -1.29199 3.82617 -2.34082 5.6543 -2.34082s4.3623 1.04883 5.65527 2.34082v0c1.28418 1.29199 2.32617 3.81836 2.32617 5.63965c0 1.82227 -1.04199 4.34863 -2.32617 5.64062l-11.2695 11.3096c-1.29395 1.29297 -3.82715 2.3418 -5.65527 2.3418
s-4.3623 -1.04883 -5.65527 -2.3418v0zM60 192c0 -4.41602 3.58398 -8 8 -8h16c4.41602 0 8 3.58398 8 8v0c0 4.41602 -3.58398 8 -8 8h-16c-4.41602 0 -8 -3.58398 -8 -8v0zM100.15 118.79c2.71094 1.13477 4.91211 4.44043 4.91211 7.37988
c0 0.880859 -0.274414 2.25684 -0.612305 3.07031v0c-1.12988 2.72559 -4.44043 4.9375 -7.39062 4.9375c-0.87793 0 -2.24902 -0.272461 -3.05957 -0.607422l-14.75 -6.11035c-2.72754 -1.12891 -4.94141 -4.44043 -4.94141 -7.39258
c0 -0.879883 0.273438 -2.25391 0.611328 -3.06738v0c1.12793 -2.73047 4.44043 -4.94629 7.39453 -4.94629c0.876953 0 2.24512 0.271484 3.05566 0.606445zM104.48 254.79c0.333008 0.80957 0.604492 2.14551 0.604492 3.02051
c0 2.94922 -2.21094 6.25977 -4.93457 7.38965l-14.7803 6.12988c-0.811523 0.335938 -2.18164 0.608398 -3.05957 0.608398c-2.9502 0 -6.26172 -2.21289 -7.39062 -4.93848v0c-0.337891 -0.813477 -0.612305 -2.18848 -0.612305 -3.07031
c0 -2.93848 2.20117 -6.24512 4.91211 -7.37988l14.7803 -6.12012c0.814453 -0.338867 2.19141 -0.614258 3.07422 -0.614258c2.96582 0 6.28418 2.22852 7.40625 4.97461v0zM197.57 30c0.369141 0.845703 0.668945 2.28125 0.668945 3.2041c0 4.41602 -3.58398 8 -8 8
c-3.01367 0 -6.35059 -2.27734 -7.44922 -5.08398l-6.12988 -14.7803c-0.335938 -0.811523 -0.608398 -2.18164 -0.608398 -3.05957c0 -4.41797 3.58594 -8.00293 8.00293 -8.00293c2.95312 0 6.2666 2.21387 7.39551 4.94238zM264 4v16c0 4.41602 -3.58398 8 -8 8v0
c-4.41602 0 -8 -3.58398 -8 -8v-16c0 -4.41602 3.58398 -8 8 -8v0c4.41602 0 8 3.58398 8 8zM331 10.9199c2.72461 1.12988 4.93555 4.44043 4.93555 7.38965c0 0.869141 -0.266602 2.22656 -0.595703 3.03027l-6.12988 14.7803
c-1.12891 2.72559 -4.44043 4.9375 -7.39062 4.9375c-0.87793 0 -2.24805 -0.272461 -3.05957 -0.607422v0c-2.72559 -1.12988 -4.9375 -4.44043 -4.9375 -7.39062c0 -0.87793 0.272461 -2.24902 0.607422 -3.05957l6.11035 -14.75
c1.12891 -2.72754 4.44043 -4.94141 7.39258 -4.94141c0.879883 0 2.25391 0.273438 3.06738 0.611328v0zM394.58 53.4102c1.29297 1.29297 2.35156 3.82617 2.35156 5.65527c0 1.81445 -1.03613 4.33398 -2.31152 5.625l-11.3105 11.3096
c-1.29297 1.29199 -3.82617 2.34082 -5.6543 2.34082s-4.3623 -1.04883 -5.65527 -2.34082v0c-1.28418 -1.29199 -2.32617 -3.81836 -2.32617 -5.63965c0 -1.82227 1.04199 -4.34863 2.32617 -5.64062l11.2695 -11.3096c1.29395 -1.29297 3.82715 -2.3418 5.65527 -2.3418
s4.3623 1.04883 5.65527 2.3418v0zM286.25 161.75l115.41 175.91l-175.91 -115.41l-115.41 -175.91zM437.08 117c0.337891 0.813477 0.612305 2.18848 0.612305 3.07031c0 2.93848 -2.20117 6.24512 -4.91211 7.37988l-14.7803 6.12012
c-0.818359 0.341797 -2.20117 0.620117 -3.08789 0.620117c-2.95215 0 -6.26367 -2.21387 -7.39258 -4.94043v0c-0.334961 -0.810547 -0.607422 -2.18164 -0.607422 -3.05957c0 -2.9502 2.21191 -6.26074 4.9375 -7.39062l14.7803 -6.12988
c0.811523 -0.335938 2.18164 -0.608398 3.05957 -0.608398c2.9502 0 6.26172 2.21289 7.39062 4.93848v0zM444 184c4.41602 0 8 3.58398 8 8v0c0 4.41602 -3.58398 8 -8 8h-16c-4.41602 0 -8 -3.58398 -8 -8v0c0 -4.41602 3.58398 -8 8 -8h16z" />
    <glyph glyph-name="chrome" unicode="&#xf268;" horiz-adv-x="496" 
d="M131.5 230.5l-76.4004 117.4c47.6006 59.1992 119 91.7998 192 92.0996c42.3008 0.299805 85.5 -10.5 124.801 -33.2002c43.3994 -25.2002 76.3994 -61.3994 97.3994 -103l-205.3 10.7998c-58.0996 3.40039 -113.4 -29.2998 -132.5 -84.0996zM164.4 192
c0 46.2998 37.3994 83.5996 83.5996 83.5996s83.5996 -37.3994 83.5996 -83.5996s-37.3994 -83.5996 -83.5996 -83.5996s-83.5996 37.3994 -83.5996 83.5996zM479.3 281.2c43.5 -111.9 0 -241.9 -107.399 -303.9c-43.4004 -25.2002 -91.3008 -35.3994 -137.801 -32.8994
l112.101 172.399c31.8994 49 31.2998 112.9 -6.60059 157.2zM133.7 144.4c26.2998 -51.7002 81.8994 -83.3008 139.5 -72.5l-63.7002 -124.801c-118.7 18.2002 -209.5 120.9 -209.5 244.9c0 50.0996 14.9004 96.9004 40.4004 135.9z" />
    <glyph glyph-name="firefox" unicode="&#xf269;" horiz-adv-x="512" 
d="M503.52 206.52c0.240234 -4.43945 0.360352 -9 0.480469 -13.5195c0 -137.19 -111.23 -248.42 -248.32 -248.42c-122.779 0 -224.859 89.2695 -244.779 206.38c-0.360352 3.24023 -0.720703 6.36035 -1.08008 9.59961c-4.91992 42.6006 0.479492 87.3604 16.0801 124.79
c10.7998 25.8809 32.6396 54 49.7998 62.8809c-16.2002 -31.8008 -24.1201 -63 -25.7998 -83.8809c11.2793 37.2002 32.6299 68.3604 62.5098 90.3604c51.2402 37.6699 120.229 39.3604 147.71 15.3604c-51 -17.5107 -106.55 -87.96 -94.3105 -170.511
c1.65137 -11.3535 7.08105 -28.9326 12.1201 -39.2393c-9.51953 25.0801 -10.3594 60.3594 5 83.2793c17.1602 25.5508 41.6299 30.9502 54.71 28.1904c-5.15918 1.08008 -16.5596 -20.75 -18.2393 -24.5898c-3.4502 -7.85645 -6.25098 -21.1953 -6.25098 -29.7754
c0 -0.337891 0.00488281 -0.886719 0.0107422 -1.22461c0.326172 -19.1992 11.7773 -45.6309 25.5596 -59c47.6504 -46.4307 124.561 -28.1602 159 24.8398c23.6406 36.4795 26.5205 98.3896 -3.83984 147.59c-6.29297 9.96582 -18.335 24.6416 -26.8799 32.7598
c-47.6602 45.4707 -116.06 64.6699 -180.24 52.9902c-0.240234 0 -0.599609 -0.120117 -0.839844 -0.120117c-1.7998 -0.359375 -3.47949 -0.719727 -5.16016 -1.08008c-0.359375 -0.120117 -0.839844 -0.120117 -1.2002 -0.239258l-5.87988 -1.44043
c-14.5195 -3.55957 -34.7998 -10.7998 -49.4395 -19.5596c-0.078125 -0.0107422 -0.185547 -0.0654297 -0.240234 -0.120117l0.120117 0.120117c0 -0.0664062 -0.0537109 -0.120117 -0.120117 -0.120117v0l-0.120117 -0.120117l0.120117 0.120117h-0.129883
l0.479492 0.479492c0.480469 0.480469 1.32031 1.16016 2.40039 2.16016c19.6797 17.7598 49.3203 31.9199 82.9102 39c12.417 2.60938 32.792 4.84961 45.4795 5h10.6299c10.5781 -0.25293 27.6016 -2.04492 38 -4c0.960938 -0.120117 1.76074 -0.360352 2.76074 -0.479492
h0.120117c1.7998 -0.360352 3.71973 -0.84082 5.63965 -1.2002c15.9277 -3.61621 40.7598 -12.3799 55.4297 -19.5605c2.40039 -1.2002 4.7998 -2.39941 7.2002 -3.71973c7.16211 -3.56738 18.1826 -10.3408 24.5996 -15.1201
c4.32031 -3.12012 8.48047 -6.36035 12.4805 -9.83984c5.35449 -4.27344 13.5479 -11.7559 18.29 -16.7002c7.01562 -6.8877 17.5479 -18.8223 23.5098 -26.6396c0.959961 -1.2002 1.75977 -2.40039 2.75977 -3.71973c0.400391 -0.480469 0.640625 -0.84082 1 -1.32031
l1.80078 -2.52051c0.359375 -0.479492 0.719727 -1.08008 1.08008 -1.55957c0.479492 -0.719727 1.0791 -1.56055 1.55957 -2.28027c0.365234 -0.473633 0.90332 -1.28027 1.2002 -1.7998l1.43945 -2.12988c0.366211 -0.473633 0.90332 -1.28027 1.2002 -1.7998
c0.480469 -0.720703 0.959961 -1.56055 1.32031 -2.16016c0.359375 -0.600586 0.839844 -1.24023 1.2002 -1.91992c0.359375 -0.680664 0.839844 -1.32031 1.19922 -2c0.360352 -0.680664 0.84082 -1.28027 1.2002 -2c0.367188 -0.53125 0.904297 -1.42676 1.2002 -2
c0.360352 -0.720703 0.839844 -1.56055 1.2002 -2.16016c0.359375 -0.599609 0.719727 -1.32031 1.08008 -1.91992c0.359375 -0.839844 0.799805 -1.67969 1.2002 -2.28027c0.399414 -0.599609 0.639648 -1.2002 1 -1.7998
c0.359375 -0.839844 0.839844 -1.56055 1.19922 -2.40039c0.240234 -0.479492 0.480469 -1.08008 0.720703 -1.55957c0.479492 -0.839844 0.839844 -1.63965 1.31934 -2.63965l0.360352 -0.720703c1.75977 -3.71973 3.44043 -7.55957 5 -11.3994
c0 -0.120117 0.120117 -0.240234 0.120117 -0.360352c0.439453 -1.2002 0.959961 -2.28027 1.43945 -3.48047c0.120117 -0.239258 0.240234 -0.599609 0.360352 -0.839844c0.480469 -1.08008 0.839844 -2.2793 1.32031 -3.35938
c0.117188 -0.269531 0.27832 -0.717773 0.359375 -1c0.360352 -1.08008 0.84082 -2.28027 1.2002 -3.36035l0.360352 -1.08008c0.479492 -1.2002 0.839844 -2.28027 1.2002 -3.47949c0.119141 -0.400391 0.239258 -0.640625 0.359375 -1
c0.360352 -1.08008 0.720703 -2.28027 1.08008 -3.48047c0.120117 -0.240234 0.120117 -0.599609 0.240234 -0.839844c0.360352 -1.2002 0.719727 -2.52051 1.08008 -3.71973c0.120117 -0.120117 0.120117 -0.360352 0.240234 -0.600586l1.08008 -4
c0.119141 -0.120117 0.119141 -0.120117 0.119141 -0.240234c2.98926 -11.1846 6.26855 -29.6201 7.32031 -41.1494v-0.120117l0.360352 -4.67969v-0.120117c0 -1.56055 0.120117 -3.12012 0.239258 -4.68066z" />
    <glyph glyph-name="opera" unicode="&#xf26a;" horiz-adv-x="496" 
d="M313.9 415.3c-170.2 0 -252.601 -223.8 -147.5 -355.1c36.5 -45.4004 88.5996 -75.6006 147.5 -75.6006c36.2998 0 70.2998 11.1006 99.3994 30.4004c-43.7998 -39.2002 -101.899 -63 -165.3 -63c-3.90039 0 -8 0 -11.9004 0.299805
c-131.5 6.10059 -236.1 114.601 -236.1 247.7c0 137 111 248 248 248h0.799805c63.1006 -0.299805 120.7 -24.0996 164.4 -63.0996c-29 19.3994 -63.1006 30.3994 -99.2998 30.3994zM415.7 17.5996c-40.9004 -24.6992 -90.7002 -23.5996 -132 5.80078
c56.2002 20.5 97.7002 91.5996 97.7002 176.6c0 84.7002 -41.2002 155.8 -97.4004 176.6c41.7998 29.2002 91.2002 30.3008 132.9 5c105.899 -98.6992 105.5 -265.699 -1.2002 -364z" />
    <glyph glyph-name="internet-explorer" unicode="&#xf26b;" horiz-adv-x="512" 
d="M483.049 288.294c25.1963 -45.4473 33.2578 -97.5811 26.8516 -141.162h-328.792c0 -100.432 144.31 -136.029 196.818 -47.4355h120.833c-32.5645 -91.7285 -119.689 -146.022 -216.813 -146.022c-35.1367 0 -70.2725 0.143555 -101.695 15.5732
c-87.3975 -44.4941 -180.251 -56.5693 -180.251 42.0059c0 45.8066 23.2461 107.096 43.9922 145.022c35.1357 63.7227 81.4121 124.875 135.687 173.168c-43.7061 -18.8604 -91.125 -66.2959 -121.977 -101.158c25.877 112.787 129.466 193.638 237.098 186.457
c130.032 59.7939 209.673 34.1445 209.673 -38.5771c0 -27.4326 -10.5684 -63.2959 -21.4238 -87.8711zM64.5586 101.123c-73.001 -152.4 11.5254 -172.244 100.267 -123.304c-46.5635 27.4326 -82.5557 72.1533 -100.267 123.304zM180.536 209.996h207.961
c-2 55.1514 -50.5635 94.8711 -103.981 94.8711c-53.7041 0 -101.979 -39.7197 -103.979 -94.8711zM365.072 397.596c46.2764 -18.002 85.9824 -57.2939 112.263 -99.5859c7.1416 18.8604 14.5693 47.8643 14.5693 67.8672c0 32.0049 -22.8525 53.7217 -54.2744 53.7217
c-23.9951 0 -51.1328 -11.7158 -72.5576 -22.0029z" />
    <glyph glyph-name="contao" unicode="&#xf26d;" horiz-adv-x="512" 
d="M45.4004 143c14.3994 -67.0996 26.3994 -129 68.1992 -175h-79.5996c-18.7002 0 -34 15.2002 -34 34v380c0 18.7002 15.2002 34 34 34h57.7002c-13.7998 -12.5996 -26.1006 -27.2002 -36.9004 -43.5996c-45.3994 -70 -27 -146.801 -9.39941 -229.4zM478 416
c18.7998 0 34 -15.2002 34 -34v-380.1c0 -18.8008 -15.2998 -34 -34 -34h-52.0996c38.6992 38.3994 60.5996 92.0996 57.3994 163.6l-137.399 -29.5996c-1.7002 -32.5 -12.9004 -63.8008 -57.4004 -73.2002c-24.9004 -5.2998 -45.4004 0.599609 -58.2998 11.7002
c-15.7998 13.5 -28.4004 31 -49.5 131.199c-21.4004 100.5 -17 121.601 -8.2002 140.301c7.2998 15.2998 23.7002 29.2998 48.2998 34.5996c44.7998 9.40039 67.7002 -14.9004 82.6006 -43.9004l137.1 29.3008c-13.5 34.5996 -31.2998 62.6992 -52.7002 84.0996h90.2002z
" />
    <glyph glyph-name="500px" unicode="&#xf26e;" 
d="M103.3 103.7c-6.5 14.2002 -6.89941 18.2998 7.40039 23.0996c25.5996 8 8 -9.2002 43.2002 -49.2002h0.299805v93.9004c1.2002 50.2002 44 92.2002 97.7002 92.2002c53.8994 0 97.6992 -43.5 97.6992 -96.7998c0 -63.4004 -60.7998 -113.2 -128.5 -93.3008
c-10.5 4.2002 -2.09961 31.7002 8.5 28.6006c53 0 89.4004 10.0996 89.4004 64.3994c0 61 -77.0996 89.6006 -116.9 44.6006c-23.5 -26.4004 -17.5996 -42.1006 -17.5996 -157.601c50.7002 -31 118.3 -22 160.4 20.1006c24.7998 24.7998 38.5 58 38.5 93
c0 35.2002 -13.8008 68.2002 -38.8008 93.2998c-24.7998 24.7998 -57.7998 38.5 -93.2998 38.5s-68.7998 -13.7998 -93.5 -38.5c-0.299805 -0.299805 -16 -16.5 -21.2002 -23.9004l-0.5 -0.599609c-3.2998 -4.7002 -6.2998 -9.09961 -20.0996 -6.09961
c-6.90039 1.69922 -14.2998 5.7998 -14.2998 11.7998v186.8c0 5 3.89941 10.5 10.5 10.5h241.3c8.2998 0 8.2998 -11.5996 8.2998 -15.0996c0 -3.90039 0 -15.1006 -8.2998 -15.1006h-223.2v-132.899h0.299805c104.2 109.8 282.801 36 282.801 -108.9
c0 -178.1 -244.801 -220.3 -310.101 -62.7998zM166.6 364.5c3.80078 18.7998 145.101 50.7998 238.301 -38.2002c8.5 -7.5 -9.5 -22.7998 -14.3008 -22.7998c-6.59961 0 -84.5996 87.9004 -209.399 40.4004c-10 -3.90039 -15.1006 16.3994 -14.6006 20.5996zM393 33.2998
c8.09961 8 27.5996 -12.5996 20.7002 -20.3994c-135.601 -135.601 -357.601 -52.1006 -381.601 121.3c-1.5 10.7002 28.9004 15.5 28.9004 3.2998c33 -165 222 -214.1 332 -104.2zM213.6 141.4c0 3.39941 2.30078 4.69922 20.4004 22.5996l-18.2002 18.2002
c-5.59961 5.59961 7.40039 17.2998 12.4004 17.2998c3.09961 0 2.89941 -0.700195 21.5 -19.5l17.8994 17.9004c6.10059 6.09961 22.5 -8.90039 16.2002 -15.7002l-18.2002 -18.2002l17.3008 -17.2998c7.7998 -7.7998 -5.30078 -18.2002 -10.7002 -18.2002
c-3.2002 0 -2.7002 0.200195 -22.2998 19.5c-19.7002 -19.7002 -18.5 -19.5 -22.3008 -19.5c-2.39941 0 -5.5 1.40039 -8.5 4.40039c-1.19922 1.19922 -5.5 4.5 -5.5 8.5z" />
    <glyph glyph-name="amazon" unicode="&#xf270;" 
d="M257.2 285.3c0 39.2998 5.2002 69.2002 -35.5 69.1006c0 0 -37.9004 0 -54.2002 -49.5l-73.5 6.7998c0 49.2998 46.7002 104.3 134.7 104.3c87.7998 0 112.3 -57 112.3 -82.2998v-147.101c0 -27.5 32.2998 -52.7998 32.2998 -52.7998l-56.7998 -56
c-9.90039 9.2998 -38.7998 36.6006 -45.2998 46.7998c-45.2002 -70.7998 -183.5 -66.2998 -183.5 43.2002c0 102 120.8 115.7 169.5 117.5zM257.2 198.5v40.5996c-33.7002 -1.09961 -84.2002 -10.5996 -84.2002 -57.7998c0 -50.7998 84.2002 -62.7998 84.2002 17.2002z
M393.2 35c-7.7002 -10 -70 -67 -174.5 -67s-184.5 71.5 -209 101c-6.7998 7.7002 1 11.2998 5.5 8.2998c73.2998 -44.5 187.8 -117.8 372.5 -30.2998c7.5 3.7002 13.2998 -2 5.5 -12zM433 32.7998c-6.5 -15.7998 -16 -26.7998 -21.2002 -31
c-5.5 -4.5 -9.5 -2.7002 -6.5 3.7998s19.2998 46.5 12.7002 55c-6.5 8.30078 -37 4.30078 -48 3.2002c-10.7998 -1 -13 -2 -14 0.299805c-2.2998 5.7002 21.7002 15.5 37.5 17.5c15.7002 1.80078 41 0.800781 46 -5.69922c3.7002 -5.10059 0 -27.1006 -6.5 -43.1006z" />
    <glyph glyph-name="houzz" unicode="&#xf27c;" 
d="M275.9 117.3h-104.601v-149.3h-154.3v448h109.5v-104.5l305.1 -85.5996v-257.9h-155.699v149.3z" />
    <glyph glyph-name="vimeo-v" unicode="&#xf27d;" 
d="M447.8 294.4c-2 -43.6006 -32.3994 -103.301 -91.3994 -179.101c-60.9004 -79.2002 -112.4 -118.8 -154.601 -118.8c-26.0996 0 -48.2002 24.0996 -66.2998 72.2998c-35.2002 129.2 -50.2002 204.9 -79.2998 204.9c-3.40039 0 -15.1006 -7.10059 -35.2002 -21.1006
l-21 27.2002c51.5996 45.2998 100.9 95.7002 131.8 98.5c34.9004 3.40039 56.2998 -20.5 64.4004 -71.5c28.7002 -181.5 41.3994 -208.899 93.5996 -126.7c18.7002 29.6006 28.7998 52.1006 30.2002 67.6006c4.7998 45.8994 -35.7998 42.7998 -63.2998 31
c22 72.0996 64.0996 107.1 126.2 105.1c45.7998 -1.2002 67.5 -31.0996 64.8994 -89.3994z" />
    <glyph glyph-name="black-tie" unicode="&#xf27e;" 
d="M0 416h448v-448h-448v448zM316.5 90.7998l-64.5 184l64.4004 86.6006h-184.9l64.5 -86.6006l-64.5 -184l92.5 -88.7002z" />
    <glyph glyph-name="fonticons" unicode="&#xf280;" 
d="M0 416h448v-448h-448v448zM187 275.1c11.9004 0 16.5996 -4.2998 16.2998 -23l50.7002 6.10059c0 44.5996 -30.5996 52.7998 -64.7002 52.7998c-50.7998 0 -77.2998 -20.4004 -77.2998 -70v-21h-28v-37.4004h22.2002c2.89941 0 5.7998 0 5.7998 -2.2998v-111.399
c0 -5.60059 -1.5 -7.30078 -6.7002 -7.90039l-21.2998 -2v-25.7002h130.7v25.1006l-43.5 4.09961c-5.2002 0.599609 -3.2002 1.5 -3.2002 7.2998v112.9h55.7002l11.0996 37.2998h-67.3994c-2.90039 0 0.599609 2 0.599609 4.40039v23.2998
c0 17.5 0.599609 27.3994 19 27.3994zM261.3 33.2998h102.601v25.1006l-15.7002 2.59961c-5.5 0.900391 -2.90039 1.5 -2.90039 7.2998v151.7h-80.2002l-6.69922 -29.5l24.1992 -6.40039c3.80078 -1.19922 6.7002 -3.7998 6.7002 -7.89941v-107.9
c0 -5.59961 -2.39941 -6.7002 -7.59961 -7.2998l-20.4004 -2.59961v-25.1006zM342.1 288.8l21.9004 24.2002l-3.5 9.59961h-27.7002l-15.5 28h-9.2998l-15.5 -28h-27.7002l-3.5 -9.59961l21.7998 -24.2002l-9 -33.2002l7.30078 -7.2998l31.1992 16.6006l31.2002 -16.6006
l7.2998 7.2998z" />
    <glyph glyph-name="reddit-alien" unicode="&#xf281;" horiz-adv-x="512" 
d="M440.3 244.5c55.2998 0 73.7002 -74.0996 23.7998 -99.7002c2.2002 -7.89941 3.10059 -16.7002 3.10059 -25.0996c0 -83.7998 -94.4004 -151.7 -210.8 -151.7c-115.9 0 -210.301 67.9004 -210.301 151.7c0 8.39941 0.800781 16.7998 2.60059 24.7002
c-50.9004 25.5 -32.7002 100.1 22.8994 100.1c15 0 28.7002 -6.2002 38.4004 -16.2998c35.7998 24.7002 83.4004 40.5996 136.3 42.7998l30.4004 137.6c1.2998 4.90039 6.09961 8.40039 11 7.10059l97.3994 -21.6006c6.60059 12.7002 19.9004 22 35.3008 22
c22.0996 0 39.6992 -18.0996 39.6992 -39.6992c0 -21.6006 -17.6992 -39.7002 -39.6992 -39.7002c-21.6006 0 -39.2002 17.5996 -39.2002 39.2002l-88.2002 19.7998l-27.7002 -124.8c53.2998 -1.7002 101.4 -17.6006 137.101 -42.3008
c9.69922 9.7002 22.8994 15.9004 37.8994 15.9004zM129.4 139.1c0 -21.5996 17.6992 -39.2998 39.6992 -39.1992c21.6006 0 39.2002 17.5996 39.2002 39.1992c0 22.1006 -17.5996 39.7002 -39.2002 39.7002c-22.0996 0 -39.6992 -17.7002 -39.6992 -39.7002zM343.7 45.5996
c4 3.5 4 9.7002 -0.100586 13.7002c-3.5 3.5 -9.69922 3.5 -13.1992 0c-29 -29 -121.2 -28.5 -149 0c-3.5 3.5 -9.7002 3.5 -13.2002 0c-4 -4 -4 -10.2002 0 -13.7002c36.3994 -36.3994 139.1 -36.3994 175.5 0zM342.9 99.7998c22 0 39.5996 17.7002 39.6992 39.2002
c0 22.0996 -17.6992 39.7002 -39.6992 39.7002c-21.6006 0 -39.2002 -17.7002 -39.2002 -39.7002c0 -21.5996 17.5996 -39.2002 39.2002 -39.2002z" />
    <glyph glyph-name="edge" unicode="&#xf282;" horiz-adv-x="512" 
d="M481.92 313.52c6.46973 -12.7793 22.4697 -41.6494 21.9697 -85.0791c-0.0791016 -37.5908 -26.4893 -83.4844 -58.9492 -102.44c-14.957 -8.88379 -41.2148 -16.1318 -58.6104 -16.1797c-0.139648 0 -52.6504 -2.56055 -80.5098 16.8096
c-5.85059 4.08008 -9.14062 8.94043 -9.14062 14c0 6.16016 4.82031 9 6.39062 11c9.7998 12.75 15.1094 28.1699 15.1094 38.5703c0 32.71 -11 59.2998 -33 83.0996c-1.16016 1.25 -42.9795 50.1807 -122.25 50.1807c-63.2393 0 -123.46 -32.6504 -149.46 -79.1406
c24.04 111.98 123.58 195.66 242.44 195.66c96.3496 0 184.96 -46.1797 226.01 -126.48zM212.77 -27.6699c1.28027 -0.570312 29.0107 -20.5898 67.1309 -27.21c-6.53809 -0.628906 -17.1748 -1.13965 -23.7422 -1.13965c-87.0234 0 -187.626 63.9521 -224.559 142.75
c-25.75 55.4697 -24.0801 105.96 -23 118.27c4.16992 34.2803 27.0801 59.7002 46.8408 74.7998c29.6299 22.6904 68.8193 35.6904 107.529 35.6904c7.0498 0 43.9199 -0.900391 77.6406 -18.5898c32.5596 -17.1006 47.3193 -37.5801 56.5596 -53.5107
c1.54688 -2.70312 3.73828 -7.24609 4.88965 -10.1396c-4.21973 4.65039 -40.0596 44.2002 -99.0596 -1c-22.9014 -16.6006 -48.4238 -51.957 -56.9697 -78.9199c-14.1406 -40.4004 -12.8398 -88.5801 20.0996 -136c10.2158 -15.1748 31.1104 -35.334 46.6396 -45z
M463.49 70.6602c1.99316 -1.25879 3.6123 -4.19531 3.6123 -6.55273c0 -1.25195 -0.547852 -3.12305 -1.22266 -4.17773c-47.5703 -75.4297 -127.86 -108.87 -163 -108.87c-22.7002 0 -48.1299 6.95996 -71.7002 19.6104c-33 17.6699 -49.4893 38.7598 -56 47.6699
c-46.3301 63.5303 -28.25 122.29 -13.3301 151.66c8.06445 15.8418 25.4287 38.2422 38.7607 50c-3.50684 -6.9668 -6.42773 -18.9512 -6.52051 -26.75c0 -80.9404 79.8506 -144 171.521 -144h0.341797c19.7266 0 50.7314 5.6084 69.208 12.5195
c5.78809 2.16992 14.9316 6.25586 20.4102 9.12012c0.969727 0.539062 2.65723 0.975586 3.76562 0.975586c1.24316 0 3.10449 -0.540039 4.1543 -1.20508z" />
    <glyph glyph-name="codiepie" unicode="&#xf284;" horiz-adv-x="472" 
d="M422.5 245.1c30.7002 0 33.5 -53.0996 -0.299805 -53.0996h-10.7998v-44.2998h-26.6006v97.3994h37.7002zM472 95.4004c-42.0996 -91.9004 -121.6 -151.4 -224 -151.4c-137 0 -248 111 -248 248s111 248 248 248c97.4004 0 172.8 -53.7002 218.2 -138.4l-186 -108.8z
M433.5 82.9004l-60.2998 30.6992c-27.1006 -44.2998 -70.4004 -71.3994 -122.4 -71.3994c-82.5 0 -149.2 66.7002 -149.2 148.899c0 82.5 66.7002 149.2 149.2 149.2c48.4004 0 88.9004 -23.5 116.9 -63.3994l59.5 34.5996c-40.7002 62.5996 -104.7 100 -179.2 100
c-121.2 0 -219.5 -98.2998 -219.5 -219.5s98.2998 -219.5 219.5 -219.5c78.5996 0 146.5 42.0996 185.5 110.4z" />
    <glyph glyph-name="modx" unicode="&#xf285;" 
d="M356 206.2l36.7002 -23.7002v-214.5l-133 83.7998zM440 373l-83.2002 -134.3l-153.5 96.5l23 37.7998h213.7zM351 230.2l-249.8 -57.7002l-46 29v214.5zM97 153.8l249.7 57.7002l-125 -200.5h-213.7z" />
    <glyph glyph-name="fort-awesome" unicode="&#xf286;" horiz-adv-x="512" 
d="M489.2 160.1c2.59961 0 4.59961 -2 4.5 -4.59961v-219.5h-182.9v96c0 72.5996 -109.7 72.5996 -109.7 0v-96h-182.899v219.5c0 2.59961 2 4.59961 4.59961 4.59961h27.4004c2.59961 0 4.59961 -2 4.59961 -4.59961v-32h36.6006v178.3
c0 2.60059 2 4.60059 4.59961 4.60059h27.4004c2.59961 0 4.59961 -2 4.59961 -4.60059v-32h36.2998v32c0 2.60059 2 4.60059 4.60059 4.60059h27.3994c2.60059 0 4.60059 -2 4.60059 -4.60059v-32h36.5996v32c0 6 8 4.60059 11.7002 4.60059v111.699
c-5.40039 2.60059 -9.10059 8.30078 -9.10059 14.3008c0 20.7998 31.4004 20.6992 31.4004 0c0 -6 -3.7002 -11.7002 -9.09961 -14.3008v-4.89941c7.69922 1.7998 15.6992 2.89941 23.6992 2.89941c11.7002 0 22.9004 -4.2998 32.6006 -4.2998
c8.89941 0 18.8994 4.2998 24 4.2998c2.59961 0 4.59961 -2 4.59961 -4.59961v-60c0 -6.90039 -23.0996 -8 -27.7002 -8c-10.5 0 -20.5 4.2998 -31.3994 4.2998c-8.60059 0 -17.4004 -1.39941 -25.7002 -3.39941v-38c3.7002 0 11.7002 1.39941 11.7002 -4.60059v-32h36.5996
v32c0 2.60059 2 4.60059 4.60059 4.60059h27.3994c2.60059 0 4.60059 -2 4.60059 -4.60059v-32h36.5996v32c0 2.60059 2 4.60059 4.59961 4.60059h27.4004c2.59961 0 4.59961 -2 4.59961 -4.60059v-178.3h36.6006v32c0 2.59961 2 4.59961 4.59961 4.59961h27.4004z
M201.1 164.6v64c0 2.60059 -2 4.60059 -4.59961 4.60059h-27.4004c-2.59961 0 -4.59961 -2 -4.59961 -4.60059v-64c0 -2.59961 2 -4.59961 4.59961 -4.59961h27.4004c2.59961 0 4.59961 2 4.59961 4.59961zM347.5 164.6v64c0 2.60059 -2 4.60059 -4.59961 4.60059h-27.4004
c-2.59961 0 -4.59961 -2 -4.59961 -4.60059v-64c0 -2.59961 2 -4.59961 4.59961 -4.59961h27.4004c2.59961 0 4.59961 2 4.59961 4.59961z" />
    <glyph glyph-name="usb" unicode="&#xf287;" horiz-adv-x="640" 
d="M641.5 192c0 -3.09961 -1.7002 -6.09961 -4.5 -7.5l-89.0996 -53.5c-1.40039 -0.799805 -2.80078 -1.40039 -4.5 -1.40039c-1.40039 0 -3.10059 0.300781 -4.5 1.10059c-2.80078 1.7002 -4.5 4.5 -4.5 7.7998v35.5996h-238.7
c25.2998 -39.5996 40.5 -106.899 69.5996 -106.899h26.7002v26.7998c0 5 3.90039 8.90039 8.90039 8.90039h89.0996c5 0 8.90039 -3.90039 8.90039 -8.90039v-89.0996c0 -5 -3.90039 -8.90039 -8.90039 -8.90039h-89.0996c-5 0 -8.90039 3.90039 -8.90039 8.90039v26.6992
h-26.7002c-75.3994 0 -81.0996 142.5 -124.7 142.5h-100.3c-8.09961 -30.5996 -35.8994 -53.5 -69 -53.5c-39.2998 0.100586 -71.2998 32.1006 -71.2998 71.4004s32 71.2998 71.2998 71.2998c33.1006 0 61 -22.7998 69 -53.5c39.1006 0 43.9004 -9.5 74.6006 60.4004
c40.0996 89.0996 58.0996 82.0996 108.899 82.0996c7.5 20.9004 27 35.6006 50.4004 35.6006c29.5 0 53.5 -23.9004 53.5 -53.5c0 -29.6006 -23.9004 -53.5 -53.5 -53.5c-23.4004 0 -42.9004 14.7998 -50.4004 35.5996h-29.7998
c-29.0996 0 -44.2998 -67.4004 -69.5996 -106.9h310.1v35.6006c0 3.2998 1.7002 6.09961 4.5 7.7998s6.40039 1.40039 8.90039 -0.299805l89.0996 -53.5c2.7998 -1.10059 4.5 -4.10059 4.5 -7.2002z" />
    <glyph glyph-name="product-hunt" unicode="&#xf288;" horiz-adv-x="512" 
d="M326.3 229.2c0 -20.5 -16.7002 -37.2002 -37.2002 -37.2002h-70.2998v74.4004h70.2998c20.5 0 37.2002 -16.7002 37.2002 -37.2002zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM375.9 229.2
c0 47.8994 -38.9004 86.7998 -86.8008 86.7998h-119.899v-248h49.5996v74.4004h70.2998c47.9004 0 86.8008 38.8994 86.8008 86.7998z" />
    <glyph glyph-name="mixcloud" unicode="&#xf289;" horiz-adv-x="640" 
d="M424.43 228.271c42.3623 -9.1377 74.4805 -47.0693 74.4805 -92.2002c0 -52.3311 -42.6406 -94.6934 -94.9688 -94.6934h-289.614c-62.5752 0 -113.243 50.668 -113.243 112.966c0 56.7598 42.085 103.554 96.6299 111.582
c22.9814 67.5586 86.9395 114.074 159.205 114.074c87.2158 0 159.205 -66.7266 167.511 -151.729zM403.941 83.7412c29.0713 0 52.6064 23.5352 52.6064 52.3301c0 22.1494 -14.1211 40.9766 -33.502 48.4531c-1.38477 -8.58301 -3.59961 -17.166 -6.36914 -25.4727
c-8.01367 -25.6484 -49.0898 -14.2266 -40.1465 13.29c4.15332 12.7373 6.36914 26.0264 6.36914 39.5938c0 69.2197 -56.4834 125.702 -125.979 125.702c-49.8379 0 -94.6934 -29.626 -114.628 -73.9258c19.3809 -4.98438 37.3779 -14.9512 52.0527 -29.3486
c19.9531 -19.9531 -10.2168 -50.1436 -30.1797 -30.1807c-13.29 13.291 -31.0107 20.7666 -49.8379 20.7666c-39.04 0 -70.8809 -31.5645 -70.8809 -70.6045s31.8408 -70.6035 70.8809 -70.6035h289.614zM639.01 136.071c0 -44.0244 -12.7363 -86.3867 -37.1016 -122.657
c-4.15332 -6.0918 -10.7979 -9.41406 -17.7197 -9.41406c-16.3174 0 -27.1279 18.8262 -17.4434 32.9492c19.3809 29.3486 29.9033 63.6816 29.9033 99.1221c0 35.4395 -10.5215 69.7725 -29.9033 98.8447c-15.6553 22.8311 19.3613 47.2402 35.1631 23.5342
c24.3662 -35.9932 37.1016 -78.3564 37.1016 -122.379zM568.13 136.071c0 -31.5654 -9.13672 -62.0215 -26.8564 -88.3252c-4.15332 -6.09082 -10.7988 -9.13574 -17.7207 -9.13574c-17.2012 0 -27.0215 18.9785 -17.4424 32.9473
c13.0127 19.1045 19.6572 41.2559 19.6572 64.5137c0 22.9805 -6.64453 45.4072 -19.6572 64.5117c-15.7617 22.9863 19.0078 47.0947 35.1631 23.5352c17.7188 -26.0264 26.8564 -56.4834 26.8564 -88.0469z" />
    <glyph glyph-name="scribd" unicode="&#xf28a;" horiz-adv-x="384" 
d="M42.2998 195.3c-16.0996 19 -24.7002 45.9004 -24.7998 79.9004c0 100.399 75.2002 153.1 167.2 153.1c98.5996 1.60059 156.8 -49 184.3 -70.5996l-50.5 -72.1006l-37.2998 24.6006l26.8994 38.5996c-36.5 24 -79.3994 36.5 -123 35.7998
c-50.6992 0.800781 -111.699 -27.1992 -111.699 -76.1992c0 -18.7002 11.1992 -20.7002 28.5996 -15.6006c23.2998 5.2998 41.9004 -0.599609 55.7998 -14c26.4004 -24.2998 23.2002 -67.5996 -0.700195 -91.8994c-29.1992 -29.5 -85.1992 -27.3008 -114.8 8.39941z
M360 189.4c33.9004 -40.4004 36.7998 -138.2 -20.2998 -189.601c-39.2002 -33.5996 -82.2002 -44.0996 -133.601 -44.0996c-70.2998 -0.299805 -138.199 25.3994 -190.699 72.2002l-15.4004 13.7998l60.7998 71.7998l35.6006 -27.4004l-33.7002 -39.3994
c41.7002 -30.9004 92.2002 -47.5 144.1 -47.2998c61.9004 0 104.7 23.5 121.4 64.3994c0.899414 4.2002 1.39941 8.40039 1.39941 12.7002c0 18.7002 -11.1992 20.7002 -28.5996 15.5996c-23.2998 -5.2998 -42.2002 0.5 -56.2998 14.4004
c-12.4004 11.2998 -19.1006 27.5 -18.4004 44.2998c-0.599609 39.2002 32.4004 69.2002 70.5 67.2002c24.2998 0.799805 47.7002 -9.7998 63.2002 -28.5996z" />
    <glyph glyph-name="bluetooth" unicode="&#xf293;" 
d="M292.6 276.9l-42.8994 -42.9004l-0.299805 86zM249.4 57.0996l0.199219 86l42.9004 -42.8994zM416 188.6c0 -205.6 -71.9004 -252.6 -185.1 -252.6c-113.2 0 -198.9 47 -198.9 252.6c0 205.601 83.4004 259.4 196.6 259.4c113.2 0 187.4 -53.9004 187.4 -259.4z
M257.5 188.6l79.4004 88.6006l-125.101 134.3v-176.9l-73.7998 73.8008l-27 -26.9004l92.7002 -93l-92.7002 -93l26.9004 -26.9004l73.7998 73.8008l2.2998 -170l127.4 127.5z" />
    <glyph glyph-name="bluetooth-b" unicode="&#xf294;" horiz-adv-x="320" 
d="M196.48 187.977l97.9111 -103.333l-148.552 -148.644l-2.71484 198.284l-86.1113 -86.1113l-31.4053 31.4053l108.061 108.398l-108.061 108.399l31.4053 31.4053l86.1113 -86.1113v206.33l145.981 -156.69zM237.34 290.973l-50.3145 50.3174l0.337891 -100.295z
M187.363 134.96l-0.337891 -100.294l50.3145 50.3164z" />
    <glyph glyph-name="gitlab" unicode="&#xf296;" horiz-adv-x="512" 
d="M105.2 423.1c0 0 56.5 -174.8 56.5996 -174.8h-132l56.5 174.8c3.2002 8.90039 15.7998 8.90039 18.9004 0zM0.900391 160.3l28.7998 88l226.2 -294l-247.9 184c-6.7998 5.10059 -9.7002 14 -7.09961 22zM161.7 248.3h188.6l-94.2998 -294zM511.1 160.3
c2.5 -8 -0.299805 -16.8994 -7.19922 -22l-247.9 -184l226.3 294zM425.7 423.1l56.5 -174.8h-132l56.5996 174.8c3.2002 8.90039 15.7998 8.90039 18.9004 0z" />
    <glyph glyph-name="wpbeginner" unicode="&#xf297;" horiz-adv-x="512" 
d="M462.799 125.626c56.2109 -64.3076 4.16211 -157.626 -91.8545 -157.626c-39.6025 0 -78.8242 17.6865 -100.143 50.04c-6.88672 -0.356445 -22.7021 -0.356445 -29.5898 0c-21.3643 -32.4209 -60.624 -50.04 -100.143 -50.04
c-95.4902 0 -148.349 92.9961 -91.8555 157.626c-79.1387 131.851 31.2646 290.374 206.792 290.374c175.632 0 285.87 -158.626 206.793 -290.374zM123.152 208.598h41.5283v58.0752h-41.5283v-58.0752zM340.332 122.526v23.8389
c-60.5059 -20.915 -132.355 -9.19824 -187.589 33.9707l0.246094 -24.8965c51.1006 -46.3672 131.746 -57.875 187.343 -32.9131zM189.579 208.598h166.058v58.0752h-166.058v-58.0752z" />
    <glyph glyph-name="wpforms" unicode="&#xf298;" 
d="M448 372.8v-361.7c0 -24.2998 -19 -43.1992 -43.2002 -43.1992h-361.6c-23.9004 0.0996094 -43.2002 18.6992 -43.2002 43.2998v361.6c0 24.1006 18.7998 43.2002 43.2002 43.2002h361.7c24 0 43.0996 -18.7998 43.0996 -43.2002zM410.7 11.2002v361.6
c0 3 -2.60059 5.7998 -5.7998 5.7998h-9.30078l-110.3 -74.5996l-61.2998 49.9004l-61.2002 -49.9004l-110.3 74.7002h-9.2998c-3.2002 0 -5.7998 -2.7998 -5.7998 -5.7998v-361.7c0 -3 2.59961 -5.7998 5.7998 -5.7998h361.7
c3.19922 -0.100586 5.7998 2.69922 5.7998 5.7998zM150.2 262v-37h-73.5v37h73.5zM150.2 187.6v-37.2998h-73.5v37.2998h73.5zM161.3 334.9l54 43.6992h-118.5zM371.3 262v-37h-196v37h196zM371.3 187.6v-37.2998h-196v37.2998h196zM286.7 334.9l64.5 43.6992h-118.4z
M371.3 113v-37.2998h-99.3994v37.2998h99.3994z" />
    <glyph glyph-name="envira" unicode="&#xf299;" 
d="M0 416c477.6 0 366.6 -317.3 367.1 -366.3l80.9004 -81.7002h-26l-70.4004 71.2002c-39 -4.2002 -124.399 -34.5 -214.399 37c-90.2002 71.5 -85.2002 157.1 -137.2 339.8zM79.7002 370c-49.7002 23.5 -5.2002 -9.2002 -5.2002 -9.2002
c45.2002 -31.2002 66 -73.7002 90.2002 -119.899c31.5 -60.2002 79 -139.7 144.2 -167.7c65 -28 34.1992 -12.5 6 8.5c-28.2002 21.2002 -68.2002 87 -91 130.2c-31.7002 60 -61 118.6 -144.2 158.1z" />
    <glyph glyph-name="glide" unicode="&#xf2a5;" 
d="M252.8 299.4c0 -8.80078 -1.59961 -17.7002 -3.39941 -26.4004c-5.80078 -27.7998 -11.6006 -55.7998 -17.3008 -83.5996c-1.39941 -6.30078 -8.2998 -4.90039 -13.6992 -4.90039c-23.8008 0 -30.5 26 -30.5 45.5c0 29.2998 11.1992 68.0996 38.5 83.0996
c4.2998 2.5 9.19922 4.2002 14.0996 4.2002c11.4004 0 12.2998 -8.2998 12.2998 -17.8994zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM384 181c0 5.09961 -20.7998 37.7002 -25.5 39.5
c-2.2002 0.900391 -7.2002 2.2998 -9.59961 2.2998c-23.1006 0 -38.7002 -10.5 -58.2002 -21.5l-0.5 0.5c4.2998 29.4004 14.5996 57.2002 14.5996 87.4004c0 44.5996 -23.7998 62.7002 -67.5 62.7002c-71.7002 0 -108 -70.8008 -108 -123.5c0 -54.7002 32 -85 86.2998 -85
c7.5 0 6.90039 0.599609 6.90039 -2.30078c-10.5 -80.2998 -56.5 -82.8994 -56.5 -58.8994c0 24.3994 28 36.5 28.2998 38c-0.200195 7.59961 -29.2998 17.2002 -36.7002 17.2002c-21.0996 0 -32.6992 -33 -32.6992 -50.6006c0 -32.2998 20.3994 -54.7002 53.2998 -54.7002
c48.2002 0 83.3994 49.7002 94.2998 91.7002c9.40039 37.7002 7 39.4004 12.2998 42.1006c20 10.0996 35.7998 16.7998 58.4004 16.7998c11.0996 0 19 -2.2998 36.7002 -5.2002c1.7998 -0.0996094 4.09961 1.7002 4.09961 3.5z" />
    <glyph glyph-name="glide-g" unicode="&#xf2a6;" 
d="M407.1 236.8c7.5 -2.89941 40.9004 -55.3994 40.9004 -63.3994c0 -2.90039 -3.7998 -5.80078 -6.7002 -5.80078c-28.3994 4.7002 -41.0996 8.40039 -58.8994 8.40039c-36.3008 0 -61.6006 -10.7998 -93.8008 -27c-8.5 -4.2998 -4.59961 -7.09961 -19.6992 -67.5996
c-17.4004 -67.6006 -74 -145.4 -151.4 -145.4c-52.7002 0 -85.5 36 -85.5 87.9004c0 28.0996 18.5 79.1992 52.4004 79.2998c11.8994 0 58.5996 -15.4004 58.8994 -27.6006c-0.5 -2.39941 -45.5 -21.7998 -45.5 -61c0 -38.5 73.9004 -34.2998 90.7998 94.6006
c0 4.7998 1 3.7998 -11 3.7998c-87.2998 0 -138.6 48.7002 -138.6 136.6c0 84.7002 58.2998 198.4 173.4 198.4c70.1992 0 108.399 -29.0996 108.399 -100.6c0 -48.5 -16.5 -93.1006 -23.5 -140.4l0.900391 -0.900391c31.2998 17.7002 56.3994 34.5 93.5 34.5
c3.7998 0 11.8994 -2.39941 15.3994 -3.7998zM231.8 321.2c2.90039 13.8994 5.5 28.0996 5.60059 42.3994c0 15.4004 -1.40039 28.7002 -20 28.7002c-7.80078 0 -15.6006 -2.59961 -22.6006 -6.7002c-43.7998 -24.0996 -61.7998 -86.3994 -61.7998 -133.399
c0 -31.2998 10.7002 -73.1006 49 -73.1006c8.7002 0 19.7002 -2.39941 22 7.80078c9.2002 44.6992 18.5 89.5996 27.7998 134.3z" />
    <glyph glyph-name="viadeo" unicode="&#xf2a9;" 
d="M276.2 297.5v-0.700195c-17.9004 52.6006 -42.6006 103.4 -70.7998 151.2c43.2998 -29.2002 67 -100 70.7998 -150.5zM308.9 175.8c15.0996 3.10059 29.5 9 42.1992 17c24.5 -58.5996 20.2002 -139.7 -36.3994 -201c-67.7998 -73.8994 -191.9 -74.5996 -259.8 0
c-108.801 117.8 -31.6006 313.7 129.899 313.7c21.2998 0 42.6006 -3.5 62.5 -10.7002c-6.89941 -13.3994 -11.7002 -28.2002 -13.3994 -43.2998c-15.4004 6.5 -32.3008 9.59961 -49.1006 9.59961c-78 0 -135.399 -66.6992 -135.399 -142.3
c0 -68.7998 45.5996 -126 111.3 -137.399c98.5 38.3994 116.6 188.199 116.6 280c0 11.6992 0 23.6992 -1 35.3994c12.4004 -36.0996 18.9004 -73.8994 18.9004 -112c0 -86.5 -35.1006 -158.399 -109.3 -205.1l-3.80078 -0.299805
c80 -1.60059 137.801 61.6992 137.801 139.399c0 19.5 -3.40039 38.7998 -11 57zM418.1 436.3c52 -74 20.9004 -208.6 -58.0996 -208.6c-21.2998 0 -40.2002 11.3994 -55 25.7998c35.0996 19.2998 79.4004 49.2002 99.7002 84.9004
c2.39941 4.7998 6.5 13.6992 7.2002 19.1992c-19.9004 -44.6992 -70.8008 -79.6992 -118.2 -90.6992c-7.5 11.6992 -12 24.6992 -12 38.7998c0 16.5 8.2002 38.5 20.5996 50.5c34.5 32.8994 84.7998 13.5996 115.8 80.0996z" />
    <glyph glyph-name="viadeo-square" unicode="&#xf2aa;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM280.7 66.7998c35.3994 38.2998 38.0996 89 22.7998 125.601c-7.90039 -4.90039 -16.9004 -8.60059 -26.4004 -10.5
c4.80078 -11.4004 6.90039 -23.5 6.90039 -35.7002c0 -48.6006 -36.2002 -88.2002 -86.2002 -87.2002l2.40039 0.200195c46.3994 29.2002 68.2998 74.0996 68.2998 128.2c0 23.7998 -4.09961 47.5 -11.7998 70v0.399414c-2.2998 31.6006 -17.1006 75.7998 -44.2002 94.1006
c17.5996 -29.9004 33 -61.6006 44.2002 -94.5c0.599609 -7.30078 0.599609 -14.8008 0.599609 -22.1006c0 -57.3994 -11.3994 -151 -72.8994 -175c-41 7.2002 -69.5 42.9004 -69.5 85.9004c0 47.2002 35.7998 88.8994 84.5996 88.8994c10.5 0 21 -1.89941 30.7002 -6
c1.09961 9.5 4.09961 18.7002 8.39941 27.1006c-12.5 4.59961 -25.7998 6.7002 -39.0996 6.7002c-101 0 -149.2 -122.5 -81.2002 -196.101c42.4004 -46.5996 120 -46.2002 162.4 0zM309 214.3c49.4004 0 68.7998 84.1006 36.2998 130.3
c-19.3994 -41.5 -50.7998 -29.5 -72.3994 -50c-7.7002 -7.5 -12.9004 -21.2998 -12.9004 -31.5996c0 -8.7998 2.7998 -17 7.5 -24.2998c29.7002 6.89941 61.4004 28.7998 73.9004 56.7002c-0.400391 -3.40039 -3 -9 -4.5 -12c-12.7002 -22.3008 -40.4004 -41 -62.3008 -53
c9.30078 -9 21.1006 -16.1006 34.4004 -16.1006z" />
    <glyph glyph-name="snapchat" unicode="&#xf2ab;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM417.5 101.1c2.2002 5.30078 -0.900391 9.80078 -4.90039 10.8008c-46.2998 7.59961 -67.0996 55.0996 -68 57.0996
c-0.0996094 0.0996094 -0.0996094 0.200195 -0.199219 0.299805c-2.40039 5 -3 9.2002 -1.60059 12.5c2.60059 6.2998 12.5 9.40039 19 11.5c1.7998 0.600586 3.5 1.10059 4.90039 1.7002c11.5 4.5 17.2998 10.0996 17.2002 16.5996
c-0.100586 5.10059 -4.10059 9.60059 -10.4004 11.9004c-4 1.59961 -9.59961 1.90039 -13.5996 0c-5.5 -2.59961 -10.4004 -4 -14.7002 -4.2002c-2.7998 0.100586 -4.60059 0.799805 -5.7002 1.40039c1.40039 24 4.7002 58 -3.7998 77.0996
c-16.2998 36.5 -49.6006 54.2998 -84.2998 54.2998c-0.600586 0 -6.10059 -0.0996094 -6.7002 -0.0996094c-14 0 -61.6006 -4 -84.1006 -54.2998c-8.5 -19.1006 -5.19922 -53.2002 -3.7998 -77.1006c-1.09961 -0.599609 -3.2998 -1.39941 -6.59961 -1.39941
c-4.5 0 -9.7998 1.39941 -15.7002 4.2002c-7.5 3.5 -20.2998 -1.80078 -21.9004 -10.3008c-1 -4.89941 1.2002 -12.0996 17 -18.2998c6.10059 -2.5 20.6006 -5.2998 24 -13.2002c1.40039 -3.2998 0.900391 -7.5 -1.59961 -12.5
c-0.0996094 -0.0996094 -0.200195 -0.199219 -0.200195 -0.299805c-0.899414 -2 -21.7002 -49.5 -68 -57.0996c-3.59961 -0.600586 -6.09961 -3.7998 -5.89941 -7.40039c0.699219 -13.8994 31.6992 -19.2998 45.5 -21.3994c1.39941 -1.90039 2.5 -9.90039 4.2998 -16
c0.799805 -2.7002 2.89941 -6 8.2998 -6s13.2998 3.09961 25.7998 3.09961c17.6006 0 23.6006 -4 37.4004 -13.7002c9.89941 -7 27.5 -19.7998 48.5 -18.2002c20.7998 -0.899414 34.7002 7.90039 49.2002 18.2002c13.6992 9.7002 19.7998 13.7002 37.3994 13.7002
c13 0 19.6006 -2.90039 25.7998 -2.90039h0.200195c4.40039 0 7 2.2002 8.10059 5.90039c1.7998 6.09961 2.89941 14 4.2998 15.9004c26.7002 4.19922 41.2998 10.0996 44.7998 18.1992z" />
    <glyph glyph-name="snapchat-ghost" unicode="&#xf2ac;" horiz-adv-x="512" 
d="M510.846 55.3271c-5.21094 -12.1572 -27.2383 -21.0889 -67.3594 -27.3184c-2.06445 -2.78613 -3.77539 -14.6855 -6.50781 -23.9561c-1.625 -5.56543 -5.62207 -8.86914 -12.1279 -8.86914l-0.296875 0.00585938c-9.39453 0 -19.2031 4.32227 -38.8516 4.32227
c-26.5215 0 -35.6621 -6.04297 -56.2539 -20.5879c-21.832 -15.4375 -42.7715 -28.7637 -74.0273 -27.3984c-31.6455 -2.33398 -58.0244 16.9072 -72.8711 27.4033c-20.7139 14.6436 -29.8281 20.582 -56.2412 20.582c-18.8633 0 -30.7354 -4.71973 -38.8516 -4.71973
c-8.07324 0 -11.2129 4.92188 -12.4219 9.04004c-2.70312 9.18848 -4.4043 21.2627 -6.52344 24.1299c-20.6787 3.20898 -67.3096 11.3438 -68.498 32.1504c-0.00878906 0.161133 -0.015625 0.422852 -0.015625 0.583984c0 4.97559 3.98438 9.67285 8.89258 10.4844
c69.583 11.4551 100.925 82.9014 102.228 85.9346c0.0742188 0.175781 0.155273 0.34375 0.237305 0.514648c3.71289 7.53711 4.54395 13.8486 2.46289 18.7529c-5.05078 11.8965 -26.8721 16.1641 -36.0537 19.7959c-23.7148 9.36621 -27.0146 20.1279 -25.6113 27.5039
c2.43652 12.8359 21.7246 20.7354 33.002 15.4531c8.91895 -4.18066 16.8428 -6.29688 23.5469 -6.29688c5.02148 0 8.21191 1.2041 9.95996 2.1709c-2.04297 35.9365 -7.10156 87.29 5.68652 115.969c33.7734 75.7188 105.356 81.6025 126.478 81.6025
c0.943359 0 9.14062 0.0888672 10.1094 0.0888672c52.1484 0 102.255 -26.7803 126.724 -81.6426c12.7764 -28.6504 7.74902 -79.792 5.69434 -116.01c1.58203 -0.87207 4.35742 -1.94141 8.59961 -2.13867c6.39648 0.286133 13.8145 2.38867 22.0693 6.25684
c6.08496 2.84668 14.4053 2.46094 20.4795 -0.0576172l0.0292969 -0.00976562c9.47559 -3.38574 15.4385 -10.2158 15.5889 -17.8701c0.183594 -9.74707 -8.52246 -18.165 -25.8779 -25.0186c-2.11816 -0.834961 -4.69434 -1.6543 -7.43457 -2.52441
c-9.79688 -3.10645 -24.5996 -7.80566 -28.6152 -17.2715c-2.0791 -4.9043 -1.25684 -11.2109 2.45996 -18.748c0.0869141 -0.167969 0.166016 -0.341797 0.238281 -0.514648c1.30176 -3.03027 32.6152 -74.46 102.23 -85.9346
c6.42676 -1.05762 11.1631 -7.87695 7.72461 -15.8584z" />
    <glyph glyph-name="snapchat-square" unicode="&#xf2ad;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM393.5 101.1c2.2002 5.30078 -0.900391 9.80078 -4.90039 10.8008c-46.2998 7.59961 -67.0996 55.0996 -68 57.0996
c-0.0996094 0.0996094 -0.0996094 0.200195 -0.199219 0.299805c-2.40039 5 -3 9.2002 -1.60059 12.5c2.60059 6.2998 12.5 9.40039 19 11.5c1.7998 0.600586 3.5 1.10059 4.90039 1.7002c11.5 4.5 17.2998 10.0996 17.2002 16.5996
c-0.100586 5.10059 -4.10059 9.60059 -10.4004 11.9004c-4 1.59961 -9.59961 1.90039 -13.5996 0c-5.5 -2.59961 -10.4004 -4 -14.7002 -4.2002c-2.7998 0.100586 -4.60059 0.799805 -5.7002 1.40039c1.40039 24 4.7002 58 -3.7998 77.0996
c-16.2998 36.5 -49.6006 54.2998 -84.2998 54.2998c-0.600586 0 -6.10059 -0.0996094 -6.7002 -0.0996094c-14 0 -61.6006 -4 -84.1006 -54.2998c-8.5 -19.1006 -5.19922 -53.2002 -3.7998 -77.1006c-1.09961 -0.599609 -3.2998 -1.39941 -6.59961 -1.39941
c-4.5 0 -9.7998 1.39941 -15.7002 4.2002c-7.5 3.5 -20.2998 -1.80078 -21.9004 -10.3008c-1 -4.89941 1.2002 -12.0996 17 -18.2998c6.10059 -2.5 20.6006 -5.2998 24 -13.2002c1.40039 -3.2998 0.900391 -7.5 -1.59961 -12.5
c-0.0996094 -0.0996094 -0.200195 -0.199219 -0.200195 -0.299805c-0.899414 -2 -21.7002 -49.5 -68 -57.0996c-3.59961 -0.600586 -6.09961 -3.7998 -5.89941 -7.40039c0.699219 -13.8994 31.6992 -19.2998 45.5 -21.3994c1.39941 -1.90039 2.5 -9.90039 4.2998 -16
c0.799805 -2.7002 2.89941 -6 8.2998 -6s13.2998 3.09961 25.7998 3.09961c17.6006 0 23.6006 -4 37.4004 -13.7002c9.89941 -7 27.5 -19.7998 48.5 -18.2002c20.7998 -0.899414 34.7002 7.90039 49.2002 18.2002c13.6992 9.7002 19.7998 13.7002 37.3994 13.7002
c13 0 19.6006 -2.90039 25.7998 -2.90039h0.200195c4.40039 0 7 2.2002 8.10059 5.90039c1.7998 6.09961 2.89941 14 4.2998 15.9004c26.7002 4.19922 41.2998 10.0996 44.7998 18.1992z" />
    <glyph glyph-name="pied-piper" unicode="&#xf2ae;" horiz-adv-x="480" 
d="M455.93 424.8c9.41992 2.40039 15.0703 -10.25 6.99023 -15.6797c-98.2295 -65.9199 -120.439 -127.561 -126.229 -160.18c-33.5205 -188.881 -101.37 -119.32 -184.311 -226.65c22.4619 -12.916 61.7197 -23.3984 87.6299 -23.4004
c97.6504 0 177.09 79.4502 177.09 177.11c-0.00390625 37.1318 -20.0967 89.7314 -44.8496 117.41c3.90332 8.05176 11.5186 20.3271 17 27.3994c32.4297 -33.3115 58.75 -98.0781 58.75 -144.569v-0.240234c0 -114.87 -93.1299 -208 -208 -208s-208 93.1201 -208 208
s93.1299 208 208 208c29.9082 -0.000976562 75.3125 -11.9443 101.35 -26.6602c46.4404 38.9697 87.8809 60.6602 114.58 67.46zM125 41.5996c64.7695 140.881 125.64 231.641 191.63 293.75c-19.9951 9.79883 -54.2959 17.75 -76.5635 17.75h-0.0664062
c-97.6504 0 -177.1 -79.4395 -177.1 -177.1c0.0195312 -45.0049 27.8408 -105.216 62.0996 -134.4z" />
    <glyph glyph-name="first-order" unicode="&#xf2b0;" 
d="M12.9004 218.8c0.0996094 0.100586 0.199219 0.299805 0.299805 0.400391c0 -0.100586 0 -0.299805 -0.100586 -0.400391h-0.199219zM224 351.4c7.40039 0 14.5996 -0.5 21.7002 -1.7002l-4 -67.7002l22.2998 64.2998c14.2998 -3.7998 27.7002 -9.5 40 -16.8994
l-29.4004 -61.1006l45.1006 50.9004c11.5 -8.90039 21.7002 -19.2002 30.5996 -30.9004l-50.5996 -45.3994l60.8994 29.6992c7.5 -12.2998 12.9004 -26 16.6006 -40.2998l-64 -22.2998l67.7002 4c1.09961 -7.09961 1.39941 -14.5996 1.39941 -22
s-0.299805 -14.5996 -1.39941 -21.7002l-67.4004 4l64 -22.2998c-3.7002 -14.5996 -9.5 -28 -16.5996 -40.2998l-61.1006 29.3994l50.6006 -45.0996c-8.60059 -11.7998 -18.9004 -22 -30.6006 -30.9004l-44.8994 50.9004l29.3994 -61.2998
c-12.2998 -7.5 -25.7002 -12.9004 -40 -16.9004l-22.5996 65.1006l4 -68.6006c-7.10059 -1.09961 -14.2998 -1.7002 -21.7002 -1.7002c-7.09961 0 -14.5996 0.600586 -21.7002 1.7002l4 68l-22.2998 -64.5996c-14.2998 3.7998 -27.7002 9.5 -40 16.8994l29.5 61.4004
l-44.9004 -50.9004c-11.7998 8.60059 -22 19.2002 -30.8994 30.9004l50.8994 45.0996l-61.0996 -29.6992c-7.2002 12.5996 -12.9004 26 -16.5996 40.2998l64 22.5996l-67.7002 -4c-0.799805 7.10059 -1.40039 14.2998 -1.40039 21.7002s0.5 14.9004 1.40039 22l68 -4
l-64.2998 22.5996c3.69922 14.3008 9.5 27.7002 16.5996 40l61.0996 -29.6992l-50.5996 45.3994c8.90039 11.7998 19.2002 22 30.5996 30.9004l45.1006 -50.9004l-29.4004 61.4004c12.2998 7.2002 25.7002 12.8994 40 16.5996l22 -64l-3.7002 67.4004
c6.80078 1.09961 14.3008 1.7002 21.4004 1.7002zM443.4 320v-256l-219.4 -128l-219.4 128v256l219.4 128zM426.3 309.7l-202.3 117.399l-202.3 -117.399v-235.101l202.3 -117.699l202.3 117.699v235.101zM224 410.9l187.7 -109.4v-218.9l-187.7 -109.5l-187.7 109.5
v218.801zM224 360c-92.2998 0 -166.9 -75.0996 -166.9 -168c0 -92.5996 74.6006 -167.7 166.9 -167.7c92 0 166.9 75.1006 166.9 167.7c0 92.9004 -74.9004 168 -166.9 168z" />
    <glyph glyph-name="yoast" unicode="&#xf2b1;" 
d="M91.2998 372h186l-7 -18.9004h-179c-39.7002 0 -71.8994 -31.5996 -71.8994 -70.2998v-205.399c0 -35.4004 24.8994 -70.3008 84 -70.3008v-19.0996h-12.1006c-50.0996 0 -91.2998 40.2002 -91.2998 89.5v205.3c0 49.2998 40.7002 89.2002 91.2998 89.2002zM320.4 428
h66.5c-143.801 -378.1 -145.7 -398.9 -184.7 -439.3c-20.7998 -21.6006 -49.2998 -31.7002 -78.2998 -32.7002v51.0996c49.1992 7.7002 64.5996 49.9004 64.5996 75.3008c0 20.0996 0.599609 12.5996 -82.0996 223.199h61.3994l50.4004 -156.6zM448 286.5v-298.5h-214
c6.59961 9.59961 10.7002 16.2998 12.0996 19.4004h182.5v279.1c0 32.5 -17.0996 51.9004 -48.1992 62.9004l6.69922 17.5996c41.7002 -13.5996 60.9004 -43.0996 60.9004 -80.5z" />
    <glyph glyph-name="themeisle" unicode="&#xf2b2;" horiz-adv-x="512" 
d="M208 359.714c0 10 6.28613 21.7139 17.7148 21.7139c11.1426 0 17.7139 -11.7139 17.7139 -21.7139c0 -10.2852 -6.57129 -21.7139 -17.7139 -21.7139c-11.4287 0 -17.7148 11.4287 -17.7148 21.7139zM512 199.714c0 -36.001 -11.4287 -102.286 -36.2861 -129.714
c-22.8574 -24.8584 -87.4277 -61.1426 -120.856 -70.5723l-1.14355 -0.286133v-32.5703c0 -16.2861 -12.5723 -30.5713 -29.1426 -30.5713c-10 0 -19.4297 5.71387 -24.5723 14.2861c-5.42676 -8.57227 -14.8564 -14.2861 -24.8564 -14.2861
s-19.4287 5.71387 -24.8574 14.2861c-5.14258 -8.57227 -14.5713 -14.2861 -24.5703 -14.2861c-10.2861 0 -19.4287 5.71387 -24.8574 14.2861c-5.14355 -8.57227 -14.5713 -14.2861 -24.5713 -14.2861c-18.8574 0 -29.4287 15.7139 -29.4287 32.8574
c-16.2861 -12.2852 -35.7158 -19.4287 -56.5713 -19.4287c-22 0 -43.4287 8.28516 -60.2861 22.8574c10.2852 0.286133 20.5713 2.28613 30.2852 5.71387c-20.8574 5.71387 -39.4277 18.8574 -52 36.2861c21.3701 -4.64551 46.209 -1.67285 67.1426 11.1426
c-22 22 -56.5703 58.8574 -68.5713 87.4287c-5.71387 13.4287 -6.85645 31.4287 -6.85645 45.7139c0 49.7139 20.2861 160 86.2861 160c10.5713 0 18.8564 -4.8584 23.1426 -14.8574c3.0498 4.46289 8.42578 11.374 12 15.4277c2 2.57227 5.71387 5.42969 7.14355 8.28613
c7.99902 12.5713 11.7139 21.1426 21.7139 34c32.2852 41.1445 81.7139 69.4297 134.856 69.4297c6 0 12 -0.285156 17.7148 -1.14355c10.8564 11.7148 26 18.2861 41.7148 18.2861c14.5703 0 29.7139 -6 40 -16.2861c0.856445 -0.857422 1.42773 -2.28613 1.42773 -3.42773
c0 -3.71387 -10.2852 -13.4287 -12.8574 -16.2861c4.28613 -1.42871 15.7148 -6.8584 15.7148 -12c0 -2.85742 -2.85742 -5.14258 -4.57129 -7.14258c31.4287 -27.7148 49.4287 -67.1436 56.2861 -108c4.28613 5.14258 10.2852 8.57129 17.1426 8.57129
c10.5713 0 20.8574 -7.14355 28.5713 -14.001c20.8564 -18.5703 25.7139 -53.1416 25.7139 -79.7139zM188 358.572c0 -18.2861 12.5713 -37.1436 32.2861 -37.1436c19.7139 0 32.2852 18.8574 32.2852 37.1436c0 18 -12.5713 36.8564 -32.2852 36.8564
c-19.7148 0 -32.2861 -18.8574 -32.2861 -36.8564zM237.714 254c0 19.7139 3.71387 39.1426 8.57129 58.2861c-52.0391 -79.5342 -13.5312 -184.571 68.8574 -184.571c21.4287 0 42.5713 7.71387 60 20c2 7.42871 3.71484 14.8574 3.71484 22.5723
c0 14.2861 -6.28613 21.4277 -20.5723 21.4277c-4.57129 0 -9.14355 -0.856445 -13.4287 -1.71387c-63.3438 -12.668 -107.143 -3.66895 -107.143 63.999zM196.572 -0.858398c0 11.1436 -8.8584 20.8574 -20.2861 20.8574c-11.4287 0 -20 -9.71484 -20 -20.8574v-32.5703
c0 -11.1436 8.57129 -21.1426 20 -21.1426c11.4277 0 20.2861 9.71484 20.2861 21.1426v32.5703zM245.715 -0.858398c0 11.1436 -8.57227 20.8574 -20 20.8574c-11.4287 0 -20.2861 -9.71484 -20.2861 -20.8574v-32.5703c0 -11.1436 8.85742 -21.1426 20.2861 -21.1426
c11.4277 0 20 10 20 21.1426v32.5703zM295.428 -0.858398c0 11.1436 -8.85645 20.8574 -20.2852 20.8574s-20.2852 -9.71484 -20.2852 -20.8574v-32.5703c0 -11.1436 8.85645 -21.1426 20.2852 -21.1426s20.2852 9.71484 20.2852 21.1426v32.5703zM345.143 -0.858398
c0 11.1436 -8.85645 20.8574 -20.2852 20.8574s-20.2861 -9.71484 -20.2861 -20.8574v-32.5703c0 -11.1436 8.85742 -21.1426 20.2861 -21.1426s20.2852 10 20.2852 21.1426v32.5703zM421.714 162c-30.8564 -59.1416 -90.2852 -102.572 -158.571 -102.572
c-96.5703 0 -160.57 84.5723 -160.57 176.572c0 16.8574 2 33.4287 6 49.7139c-20 -33.7148 -29.7139 -72.5723 -29.7139 -111.429c0 -60.2861 24.8564 -121.715 71.4287 -160.857c5.14258 9.71387 14.8564 16.2861 26 16.2861c10 0 19.4277 -5.71387 24.5713 -14.2861
c5.42871 8.57129 14.5703 14.2861 24.8574 14.2861c10 0 19.4277 -5.71387 24.5713 -14.2861c5.42871 8.57129 14.8564 14.2861 24.8574 14.2861c10 0 19.4287 -5.71387 24.8574 -14.2861c5.14258 8.57129 14.5713 14.2861 24.5723 14.2861
c10.8564 0 20.8564 -6.57227 25.7139 -16c43.4268 36.2861 68.5693 92 71.4258 148.286zM432.286 261.714c0 53.7139 -34.5713 105.714 -92.5723 105.714c-30.2852 0 -58.5713 -15.1426 -78.8564 -36.8564c-19.9951 -66.3828 -27.4473 -136.571 41.4287 -136.571
c28.8047 0 97.3564 28.5381 84.2861 -36.8574c28.8564 26 45.7139 65.7148 45.7139 104.571z" />
    <glyph glyph-name="google-plus" unicode="&#xf2b3;" horiz-adv-x="496" 
d="M248 440c136.9 0 248 -111.1 248 -248s-111.1 -248 -248 -248s-248 111.1 -248 248s111.1 248 248 248zM177.3 68c71.2998 0 118.8 50.4004 118.8 121.2c0 7.09961 -0.599609 13.8994 -1.89941 20.7002h-116.9v-42.6006h70.1006
c-5.2002 -34.2002 -37.5 -53.2998 -70.1006 -53.2998c-43 0 -77.2002 35.5 -77.2002 78.0996c0 42.6006 34.3008 78.1006 77.2002 78.1006c18.1006 0 36.2002 -6.2002 49.4004 -19.1006l33.5996 32.6006c-22.8994 21.2998 -51.7002 32.2998 -83 32.2998
c-68.7998 0 -124 -55.5 -124 -124s55.2002 -124 124 -124zM407.5 174.2h35.2002v35.5h-35.2002v35.5h-35.5v-35.5h-35.5v-35.5h35.5v-35.5h35.5v35.5z" />
    <glyph glyph-name="font-awesome" unicode="&#xf2b4;" 
d="M397.8 416c27.5 0 50.2002 -22.7002 50.2002 -50.2002v-347.6c0 -27.5 -22.7002 -50.2002 -50.2002 -50.2002h-347.6c-27.5 0 -50.2002 22.7002 -50.2002 50.2002v347.6c0 27.5 22.7002 50.2002 50.2002 50.2002h347.6zM352.4 131.7h0.0996094v140.3
c0 4.2002 -4.2002 7.7998 -9 7.7998c-6 0 -31.0996 -16.0996 -53.7998 -16.0996c-4.7002 0 -8.90039 0.599609 -13.1006 2.39941c-20.2998 7.7002 -38.1992 13.7002 -60.8994 13.7002c-20.9004 0 -43 -6.5 -61.5 -14.2998
c-1.7998 -1.2002 -3.60059 -1.7998 -5.40039 -2.40039v18.5c8.2998 6 13.1006 15.5 13.1006 26.3008c0 18.5996 -15 33.5 -33.5 33.5c-18.6006 0 -33.5 -15 -33.5 -33.5c0 -10.8008 5.2998 -20.3008 13.0996 -26.3008v-218.6c0 -11.2998 9 -20.2998 20.2998 -20.2998
c8.90039 0 16.7002 5.89941 19.1006 14.2998v1.2002c0.599609 1.2002 0.599609 3 0.599609 4.7998v45.4004c1.2002 0.599609 2.40039 0.599609 3.59961 1.19922c19.7002 8.90039 44.2002 17.3008 67.5 17.3008c32.3008 0 44.8008 -16.7002 71.7002 -16.7002
c19.2002 0 37.1006 6.5 53.7998 13.7002c4.2002 1.7998 7.80078 3.59961 7.80078 7.7998z" />
    <glyph glyph-name="linode" unicode="&#xf2b8;" 
d="M437.4 221.7c0.599609 -2 -8.80078 -66.2998 -9.7002 -72.7998c0 -0.900391 -0.5 -1.7002 -1.10059 -2l-54.5996 -43.7002c-1.09961 -0.900391 -2.59961 -0.900391 -3.7002 0l-20.2998 14l-2.2998 -33.4004c0 -0.899414 -0.200195 -1.7002 -1.10059 -2.2998
l-66.8994 -53.4004c-1.10059 -0.899414 -2.90039 -0.899414 -4 0l-28 23.7002l2 -46c0 -0.899414 -0.200195 -1.7002 -1.10059 -2.2998l-83.6992 -66.9004c-0.600586 -0.299805 -1.10059 -0.599609 -1.7002 -0.599609c-0.900391 0.299805 -1.7002 0.299805 -2.2998 0.900391
l-65.1006 69.0996c-1.5 1.40039 -15.5 72 -16.8994 79.0996c-0.300781 1.10059 0.5 2.5 1.39941 3.10059l17.4004 10.5996c-3.40039 3.2002 -26.5 23.4004 -27.1006 26.2998l-20.5996 100.301c-0.299805 1.09961 0.299805 2.5 1.7002 3.39941l26.8994 12.9004
c-4.59961 3.5 -37.6992 27.5 -38.5996 30.8994l-27.4004 133.101c-0.299805 1.7002 0.600586 3.09961 2 3.7002l123.7 38.5996c0.600586 0 1.40039 0 2.2998 -0.299805l90.6006 -43.7002c0.799805 -0.599609 1.7002 -1.7002 1.7002 -2.59961l5.69922 -132.301
c0 -1.19922 -0.599609 -2.2998 -1.69922 -2.89941l-33.7002 -17.4004l36 -24.2998c0.799805 -0.299805 1.39941 -1.40039 1.39941 -2.2998l1.40039 -35.1006l34.5996 21.2002c0.800781 0.600586 2.2002 0.600586 3.10059 0l24 -16l0.899414 31.4004
c0 0.899414 0.5 2 1.40039 2.59961l58.9004 36c1.09961 0.600586 2.19922 0.600586 3.09961 0l70 -38.5996c0.5 -0.600586 1.09961 -1.10059 1.40039 -2zM232.6 216.9l-100.6 -57.2002l14 -96.6006l90.5996 61.2002zM224.9 396.9l-120.9 -46.6006l19.7002 -134.8
l106.6 55.4004zM44 274.9l73.0996 -57.2002l-19.3994 132.899l-79.7002 49.4004zM74.5996 127.1l64.8008 -60.7998l-13.7002 93.4004l-70 58.2998zM98.9004 9.40039l57.6992 -61.2002l-9.69922 67.3994l-61.7002 60.9004zM163.4 -55.0996l78.1992 62.2998l-3.09961 70
l-85.7002 -61.4004zM245.4 60l27.0996 -22.9004l-0.599609 68.3008l-29.4004 22.5996c0 -2.2998 1.2002 -6.2998 -1.09961 -8l-22.3008 -14.9004l24.3008 -20c2.89941 -2.19922 2 -21.6992 2 -25.0996zM339.7 85.4004l4.2002 66.8994l-65.7002 -46.8994l0.599609 -68.6006z
M367.4 111.1l5.7998 66.6006l-64.6006 40.5996l-0.599609 -30l41.2002 -27.2002c0.799805 -0.599609 1.39941 -1.69922 1.09961 -2.59961l-2 -34zM422 150.9l8.5 63.3994l-51.0996 -36.5996l-5.7002 -65.1006z" />
    <glyph glyph-name="quora" unicode="&#xf2c4;" 
d="M440.5 61.2998c1.7998 -18 -7.2002 -93.2998 -89 -93.2998c-49.5 0 -75.5 28.7002 -95.2002 62.2998c-117.7 -32.5996 -249 54.9004 -249 189c0 117 98 196.7 197.7 196.7c101.8 0 198.5 -79.2002 198.4 -196.7c0 -65.5 -30.5 -118.8 -74.7002 -153
c14.2002 -21.5996 29 -35.7998 49.5 -35.7998c22.5 0 31.5 17.2998 33 30.7998h29.2998zM297 118.8c11.2998 24.9004 16.7998 58.7002 16.7002 100.5c0 104.2 -32.5 157.7 -108.7 157.7c-75 0 -107.5 -53.5 -107.5 -157.9c0 -103.699 32.5 -156.699 107.5 -156.699
c12 0 22.7002 1.19922 32.7002 4.19922c-15.5 30.5 -33.7002 61.3008 -69.2002 61.3008c-6.7998 0 -13.5996 -1 -19.7998 -4l-12.2002 24.2998c14.7002 12.7998 38.5 22.7998 69 22.7998c47.7998 0 72 -23 91.5 -52.2002z" />
    <glyph glyph-name="free-code-camp" unicode="&#xf2c5;" horiz-adv-x="576" 
d="M97.2197 351.79c-43.2197 -41.6201 -64.9697 -92.5898 -64.8193 -154.021c0.15918 -68 23.0293 -122.67 67.4795 -165c9.33984 -8.34961 13.2002 -14.9199 13.2002 -20.5498c0 -2.75 -1.90039 -5.62012 -3.81055 -8.37988
c-1.92676 -1.89453 -5.67676 -3.61426 -8.36914 -3.83984c-10.2803 0 -24.6807 12.1396 -43.4707 35.79c-36.5898 44.8701 -53.1992 94.3398 -54.0596 161.87s20.3096 113.34 61.79 160.6c14.9199 16.9004 27.3594 25.6904 35.8398 25.6904
c2.56152 -0.0585938 6.32031 -1.33105 8.38965 -2.83984c1.91016 -1.91016 3.83008 -4.66016 3.83008 -7.41992c0 -4.78027 -5.63965 -11.25 -16 -21.9004zM239.47 27.9297c0.580078 -0.370117 0.910156 -0.549805 0.910156 -0.549805zM333.26 27.3799l0.169922 0.129883
c-0.189453 -0.129883 -0.259766 -0.179688 -0.169922 -0.129883zM336.39 185.56c16.2305 -4.14941 24.04 24.04 30.0303 30.0508c84.71 -110.101 -27.5098 -184.45 -33 -188.101c3.86035 3.04004 44.3301 49.7705 21.5801 76.5498
c-1 1.03027 -67.2998 -20.0596 -54.8398 53.54c8.30957 48.6807 -7.60059 71.1309 -7.60059 71.1309c-17.9697 -37.29 -32.5 -53.8604 -43.5 -72.1602c-56.9492 -92.9404 -16.2793 -124.29 -9.5498 -128.641c-10.54 6.5 -108.27 70.8799 -34 175.23
c78.3701 110.189 62.8301 159.57 62.8301 159.57c118.46 -94.2803 51.8105 -173.021 68.0498 -177.171zM510.88 358.31c41.4404 -47.3096 62.6699 -93.1592 61.75 -160.649s-17.4697 -117.021 -54.0596 -161.87c-18.79 -23.6602 -33.1904 -35.79 -43.4707 -35.79
c-2.69238 0.231445 -6.44141 1.95605 -8.36914 3.84961c-1.91016 2.76074 -3.81055 5.63086 -3.81055 8.38086c0.0205078 5.62988 3.86035 12.1992 13.2002 20.5498c44.4795 42.3701 67.3203 97 67.4795 165c0.180664 61.4697 -21.5898 112.45 -64.8193 154.06
c-10.4004 10.6406 -16 17.1201 -16 21.9004c0 2.75977 1.91992 5.50977 3.83008 7.41992c2.06934 1.50977 5.82812 2.78125 8.38965 2.83984c8.51953 0 21 -8.79004 35.8799 -25.6904z" />
    <glyph glyph-name="telegram" unicode="&#xf2c6;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM369.8 270.1c3.60059 16.8008 -6.09961 23.5 -17.2002 19.5l-239.1 -92.1992c-16.4004 -6.40039 -16.0996 -15.5 -2.7998 -19.7002l61.2002 -19.1006l142 89.4004
c6.59961 4.40039 12.6992 1.90039 7.69922 -2.5l-114.899 -103.8l-4.40039 -63.1006c6.40039 0 9.2002 2.80078 12.5 6.10059l29.9004 28.7998l62 -45.7002c11.2998 -6.39941 19.3994 -3.09961 22.3994 10.5z" />
    <glyph glyph-name="bandcamp" unicode="&#xf2d5;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM296.2 113.9l84.7002 156.1h-181l-84.7002 -156.1h181z" />
    <glyph glyph-name="grav" unicode="&#xf2d6;" horiz-adv-x="512" 
d="M301.1 236c4.40039 -4.40039 4.40039 -11.9004 0 -16.2998l-9.69922 -9.7002c-4.40039 -4.7002 -11.9004 -4.7002 -16.6006 0l-10.5 10.5c-4.39941 4.7002 -4.39941 11.9004 0 16.5996l9.7002 9.7002c4.40039 4.40039 11.9004 4.40039 16.5996 0zM270.9 255.7
c-2.7002 -2.7998 -7.40039 -2.7998 -10.5 0c-2.80078 3 -2.80078 7.7002 0 10.5c3 3 7.69922 3 10.5 0c3 -2.7002 3 -7.5 0 -10.5zM244.9 250.4c2.7998 3 7.5 3 10.5 0c2.7998 -2.7002 2.7998 -7.40039 0 -10.2002c-3 -3 -7.7002 -3 -10.5 0c-3 2.7002 -3 7.39941 0 10.2002
zM317.4 263.7c-19.9004 14.3994 -33.8008 43.2002 -11.9004 68.0996c21.5996 24.9004 40.7002 17.2002 59.7998 -0.799805c11.9004 -11.2998 29.2998 -24.9004 17.2002 -48.2002c-12.5 -23.5 -45.0996 -33.2002 -65.0996 -19.0996zM365.1 308.2
c-8.89941 10 -23.2998 -6.90039 -15.5 -16.1006c7.40039 -9 32.1006 -2.39941 15.5 16.1006zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM437.8 149.4c2.5 16.0996 -20.2002 16.5996 -25.2002 25.6992
c-13.5996 24.1006 -27.6992 36.8008 -54.5 30.4004c11.6006 8 23.5 6.09961 23.5 6.09961c0.300781 6.40039 0 13 -9.39941 24.9004c3.89941 12.5 0.299805 22.4004 0.299805 22.4004c15.5 8.59961 26.7998 24.3994 29.0996 43.1992
c3.60059 31 -18.7998 59.2002 -49.7998 62.8008c-22.0996 2.5 -43.7002 -7.7002 -54.2998 -25.7002c-23.2002 -40.1006 1.40039 -70.9004 22.4004 -81.4004c-14.4004 1.40039 -34.3008 11.9004 -40.1006 34.2998c-6.59961 25.7002 2.7998 49.8008 8.90039 61.4004
c0 0 -4.40039 5.7998 -8 8.90039c0 0 -13.7998 0 -24.6006 -5.30078c11.9004 15.2002 25.2002 14.4004 25.2002 14.4004c0 6.40039 -0.599609 14.9004 -3.59961 21.5996c-5.40039 11 -23.7998 12.9004 -31.7002 -2.7998c0.0996094 0.200195 0.299805 0.400391 0.400391 0.5
c-5 -11.8994 -1.10059 -55.8994 16.8994 -87.2002c-2.5 -1.39941 -9.09961 -6.09961 -13 -10c-21.5996 -9.69922 -56.2002 -60.2998 -56.2002 -60.2998c-28.1992 -10.7998 -77.1992 -50.8994 -70.5996 -79.7002c0.299805 -3 1.40039 -5.5 3 -7.5
c-2.7998 -2.19922 -5.5 -5 -8.2998 -8.2998c-11.9004 -13.7998 -5.2998 -35.2002 17.7002 -24.3994c15.7998 7.19922 29.5996 20.1992 36.2998 30.3994c0 0 -5.5 5 -16.2998 4.40039c27.6992 6.59961 34.2998 9.39941 46.1992 9.09961c8 -3.89941 8 34.2998 8 34.2998
c0 14.7002 -2.19922 31 -11.0996 41.5c12.5 -12.1992 29.0996 -32.6992 28 -60.5996c-0.799805 -18.2998 -15.2002 -23 -15.2002 -23c-9.09961 -16.5996 -43.2002 -65.9004 -30.3994 -106c0 0 -9.7002 14.9004 -10.2002 22.0996
c-17.4004 -19.3994 -46.5 -52.2998 -24.6006 -64.5c26.6006 -14.6992 108.801 88.6006 126.2 142.301c34.6006 20.7998 55.4004 47.2998 63.9004 65c22 -43.5 95.2998 -94.5 101.1 -59z" />
    <glyph glyph-name="etsy" unicode="&#xf2d7;" horiz-adv-x="384" 
d="M384 100c-1.75 -10.75 -13.75 -110 -15.5 -132c-117.879 4.29883 -219.895 4.74316 -368.5 0v25.5c45.457 8.94824 60.627 8.01855 61 35.25c1.79297 72.3223 3.52441 244.143 0 322c-1.0293 28.46 -12.1299 26.7646 -61 36v25.5
c73.8857 -2.3584 255.933 -8.55078 362.999 3.75c-3.5 -38.25 -7.75 -126.5 -7.75 -126.5h-23.249c-11.0527 42.835 -18.7588 90.5 -54.75 90.5h-137c-10.25 0 -10.75 -3.5 -10.75 -9.75v-163.75c58 -0.5 88.5 2.5 88.5 2.5c29.7695 0.951172 27.5596 8.50195 40.75 65.251
h25.75c-4.40723 -101.351 -3.91016 -61.8291 -1.75 -160.25h-25.75c-9.15527 40.0859 -9.06543 61.0449 -39.501 61.5c0 0 -21.5 2 -88 2v-139c0 -26 14.25 -38.25 44.25 -38.25h89.251c63.6357 0 66.5645 24.9961 98.751 99.75h22.249v-0.000976562z" />
    <glyph glyph-name="imdb" unicode="&#xf2d8;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM21.2998 218.8h-0.299805c0.0996094 0.100586 0.200195 0.299805 0.299805 0.400391v-0.400391zM97 128.2v127.8h-33v-127.8h33z
M210.2 128.2v127.8h-43l-7.60059 -59.9004c-2.69922 20 -5.39941 40.1006 -8.69922 59.9004h-42.8008v-127.8h29v84.5l12.2002 -84.5h20.6006l11.5996 86.3994v-86.3994h28.7002zM221.6 128.2c86.1006 -0.100586 75 -6 75 82.5c0 8.09961 0.300781 16.7998 -1.39941 24.3994
c-4.2998 22.5 -31.4004 20.9004 -49 20.9004h-24.6006v-127.8zM382.5 157.4v36c0 17.2998 -0.799805 30.0996 -22.2002 30.0996c-8.89941 0 -14.8994 -2.7002 -20.8994 -9.2002v41.7002h-31.7002v-127.8h29.7998l1.90039 8.09961
c5.69922 -6.7998 11.8994 -9.7998 20.8994 -9.7998c19.7998 0 22.2002 15.2002 22.2002 30.9004zM265 218.1v-49.2998c0 -9.7002 1.90039 -18.7002 -10.2998 -18.3994v83.6992c11.8994 0 10.2998 -6.2998 10.2998 -16zM350.5 192v-32.7002
c0 -5.39941 1.59961 -14.3994 -6.2002 -14.3994c-1.59961 0 -3 0.799805 -3.7998 2.39941c-2.2002 5.10059 -1.09961 44.1006 -1.09961 44.7002c0 3.7998 -1.10059 12.7002 4.89941 12.7002c7.2998 0 6.2002 -7.2998 6.2002 -12.7002z" />
    <glyph glyph-name="ravelry" unicode="&#xf2d9;" horiz-adv-x="512" 
d="M407.4 386.5c72.6992 -37.9004 112 -117.2 103.3 -199.5c-1.7002 -16.7002 -4.40039 -36.2002 -9.7998 -52.2002c-22.2002 -65.7002 -52.9004 -108.6 -123.101 -147.7c-6.39941 -4.39941 -13.2998 -8.59961 -20.2002 -10.7998
c-12.5 -4.39941 -26.0996 -5.39941 -40.0996 -3.89941c-5.90039 -0.5 -11.7998 -0.700195 -18 -0.700195c-93.7002 0 -173 64 -196.9 151.399c-0.699219 0 -1.5 0.200195 -2.19922 0.200195c-5.60059 -44.2998 27.0996 -104.1 27.0996 -104.1s2 -3 13.2998 -20.2002
c-62.7998 33.2002 -64.5 131.2 -64.5 131.2c-15 5.59961 -67.2002 23.3994 -76.2998 37.8994c0 0 40.9004 -22.3994 76.2002 -27c-0.200195 0.300781 0.5 7.90039 0.5 7.90039c2.2002 30 12.5 53.4004 23.0996 71.4004c6.90039 33.7998 22.1006 64.2998 43.2998 89.8994
c3.7002 15.2998 9.60059 33.5 19.9004 52.7002c4.40039 8.40039 8.59961 13.7998 19.9004 19c74.8994 35 148.699 43.9004 224.5 4.5zM138.8 284.8c-7.59961 -11.2998 -13.7002 -23.5996 -18.8994 -36.3994c8.09961 8.59961 14.7998 14.1992 18.1992 16.6992
c-0.5 7.40039 0.700195 19.7002 0.700195 19.7002zM107.6 162.9c0.700195 -9.60059 2 -18.9004 4.2002 -28.1006l41.4004 -6.89941c-14.1006 42.0996 -15.7998 90.0996 -15.7998 90.0996c-16.5 -16 -25.4004 -37.9004 -29.8008 -55.0996zM115.5 120.1
c21.4004 -69.6992 81 -122.8 154.1 -134.399c-1 0.299805 -1.69922 0.5 -2.69922 1c0 0 -81 47.5 -108.301 124.3c-9.09961 1.5 -28.2998 5.90039 -43.0996 9.09961zM386 3.90039c63 32 106.6 98 106.8 174c0 107.399 -86.5996 194.5 -193 194.5
c-49.2998 0 -94.0996 -18.7002 -128.3 -49.5c-5.2002 -10.1006 -8.59961 -22.9004 -11.0996 -39.4004c52.5 44.5996 146 33.5 146 33.5c23.3994 -1 20.5996 -21.7002 20.3994 -28.0996c-85.2002 7.19922 -127 -17.2002 -168.399 -52.4004
c0 0 8.09961 -78.7998 26.7998 -110.8c107.8 -4.90039 189.8 53.7002 189.8 53.7002c10.2998 7.39941 19.4004 8.09961 21.4004 -4.7002c1.5 -10.4004 2.19922 -24.4004 -9.60059 -29.7998c-36 -16.8008 -75.5996 -27.3008 -115 -33
c-25.5996 -3.7002 -39.7998 -4.60059 -78 -3.90039c36.4004 -84.7002 127.5 -107.8 127.5 -107.8c28.5 -4.7002 50.2002 -1 64.7002 3.7002z" />
    <glyph glyph-name="sellcast" unicode="&#xf2da;" 
d="M353.4 416c52.0996 0 94.6992 -42.5996 94.6992 -94.5996v-258.801c0 -52 -42.5996 -94.5996 -94.6992 -94.5996h-258.7c-52.1006 0 -94.7002 42.5996 -94.7002 94.7002v258.7c0 52 42.5996 94.5996 94.7002 94.5996h258.7zM303.4 99.5996
c27.8994 48.2002 11.1992 110.5 -37.2002 138.5c-18.6006 10.8008 0.0996094 -0.0996094 -18.5 10.7002c-25 14.4004 -46.2002 -23.2998 -21.6006 -37.5c18 -10.2002 0.800781 -0.399414 18.6006 -10.5996c27.5996 -16 37.2002 -51.7998 21.2998 -79.4004
c-16 -27.5996 -51.7998 -37.2002 -79.4004 -21.2998c-18.5996 10.7998 0.100586 -0.0996094 -18.5 10.7002c-10.2998 6 -23.5996 2.39941 -29.5 -7.90039l-15.6992 -27.2002c-12.6006 -21.7998 19.3994 -53 42.2998 -13.1992c48.2998 -27.7002 110.3 -11 138.2 37.1992z
M325.2 308.4c14.2998 24.7998 -23.4004 46.3994 -37.7002 21.5l-4.7998 -8.40039c-48.2998 27.7002 -110.3 11 -138.2 -37.2002c-27.7998 -48.2998 -11.0996 -110.6 37.0996 -138.399c18.6006 -10.8008 -0.0996094 0.0996094 18.5 -10.7002
c25 -14.4004 46.2002 23.2998 21.6006 37.5c-0.100586 0 -18.6006 10.5996 -18.6006 10.5996c-27.5996 16 -37.2998 51.7998 -21.2998 79.4004c16 27.5996 51.7998 37.2002 79.4004 21.2998c18.5996 -10.7998 -0.100586 0.0996094 18.5 -10.7002
c10.2002 -5.09961 20 -2.89941 26.5 3.60059c2.7002 2.69922 2 2 19 31.5z" />
    <glyph glyph-name="superpowers" unicode="&#xf2dd;" 
d="M448 416l-87.2002 -87c39.7002 -38.7002 61.2002 -92.7002 57.7002 -148.2c-5.40039 -93 -76.9004 -167.3 -168.7 -179.8c-83.2998 -11 -166.5 -22 -249.8 -33l86.7998 86.7998c-39.7998 38.7002 -61.0996 92.7002 -57.7998 148.2c5.7002 93.2998 77 167.5 169 180
c83.2002 11 166.7 22 250 33zM368.3 183.7c4.40039 80 -56.7998 146.3 -136.1 151c-78.7002 4.7998 -148.5 -55.2998 -153 -134.5c-4.40039 -80 56.7998 -146.3 136.3 -151c78.7998 -4.7002 148.6 55 152.8 134.5z" />
    <glyph glyph-name="wpexplorer" unicode="&#xf2de;" horiz-adv-x="512" 
d="M512 192c0 -141.2 -114.7 -256 -256 -256c-141.2 0 -256 114.7 -256 256s114.7 256 256 256s256 -114.7 256 -256zM480 192c0 123.2 -100.3 224 -224 224c-123.5 0 -224 -100.5 -224 -224s100.5 -224 224 -224s224 100.5 224 224zM160.9 323.4l86.8994 -37.1006
l-37.0996 -86.8994l-86.9004 37.0996zM270.9 154.3l46.5996 -94h-14.5996l-50 100l-48.9004 -100h-14l51.0996 106.9l-22.2998 9.39941l6 14l68.6006 -29.0996l-6 -14.2998zM259.1 270.6l68.6006 -29.3994l-29.4004 -68.2998l-68.2998 29.0996zM339.4 227.7
l54.5996 -23.1006l-23.4004 -54.2998l-54.2998 23.1006z" />
    <glyph glyph-name="meetup" unicode="&#xf2e0;" horiz-adv-x="512" 
d="M99 33.7002c1.09961 -5.7002 -2.2998 -11.1006 -8 -12.2998c-5.40039 -1.10059 -10.9004 2.2998 -12 8c-1.09961 5.39941 2.2998 11.0996 7.7002 12.2998c5.39941 1.2002 11.0996 -2.2998 12.2998 -8zM242.1 -37.7002c6.60059 4.60059 15.5 2.7998 19.7002 -3.7002
c4.60059 -6.59961 2.90039 -15.3994 -3.39941 -20c-6.60059 -4.59961 -15.4004 -2.89941 -20 3.7002c-4.30078 6.60059 -2.60059 15.4004 3.69922 20zM156.1 424.6c-6.2998 -1.5 -12.5 2.5 -13.8994 9.10059c-1.2002 6.2998 2.7998 12.5996 9.09961 14
c6.2998 1.5 12.6006 -2.5 13.7002 -9.10059c1.40039 -6.2998 -2.59961 -12.5996 -8.90039 -14zM34.4004 221.7c10 -7.10059 12.5996 -20.7998 5.69922 -31.2002c-6.89941 -10.2998 -20.5996 -12.7998 -30.5996 -5.7002c-10 6.90039 -12.5996 20.9004 -5.7002 30.9004
c6.90039 10.2998 20.6006 12.8994 30.6006 6zM306.4 392.6c-10.3008 -6.2998 -23.7002 -2.89941 -29.7002 7.40039c-6.2998 10.5996 -2.90039 24.2998 7.39941 30.5996c10.3008 6.30078 23.7002 2.90039 30 -7.69922c6 -10.3008 2.90039 -24 -7.69922 -30.3008zM115.3 334.6
c-7.5 -5.19922 -18 -3.5 -23.0996 4.30078c-5.10059 7.69922 -3.40039 18.2998 4.2998 23.6992c7.40039 5.10059 18 3.40039 23.0996 -4.2998c5.10059 -7.7002 3.40039 -18.2998 -4.2998 -23.7002zM487.6 178.6c7.40039 1.40039 14.8008 -3.5 16.3008 -10.8994
c1.69922 -7.7002 -3.2002 -15.2002 -10.6006 -16.6006c-7.39941 -1.69922 -14.8994 3.2002 -16.2998 10.6006c-1.7002 7.7998 3.2002 15.2002 10.5996 16.8994zM527.3 235.4c1.40039 -5.7002 -2.2998 -11.1006 -7.7002 -12.6006
c-5.69922 -1.09961 -11.1992 2.60059 -12.2998 8c-1.09961 5.7002 2.2998 11.5 8 12.6006c5.40039 1.09961 10.9004 -2.30078 12 -8zM447 309.1c8.2998 6 20 3.80078 25.7002 -4.89941c5.7002 -8.60059 3.7002 -20.2998 -4.60059 -26.2998
c-8.59961 -5.7002 -20.2998 -3.7002 -26 4.89941c-5.69922 8.60059 -3.69922 20.2998 4.90039 26.2998zM440.7 169.7c26.2998 -43.1006 15.0996 -100 -26.2998 -129.101c-17.4004 -12.2998 -37.1006 -17.6992 -56.9004 -17.0996
c-12 -47.0996 -69.4004 -64.5996 -105.1 -32.5996c-1.10059 -0.900391 -2.60059 -1.7002 -3.7002 -2.90039c-39.1006 -27.0996 -92.2998 -17.4004 -119.4 22.2998c-9.7002 14.2998 -14.5996 30.6006 -15.0996 46.9004c-65.4004 10.8994 -90 94 -41.1006 139.7
c-28.2998 46.8994 0.600586 107.399 53.4004 114.899c25.0996 66.2002 107.6 97.6006 163.6 54.2002c67.4004 22.2998 136.301 -29.4004 130.9 -101.1c41.0996 -12.6006 52.7998 -66.9004 19.7002 -95.2002zM370.7 95.4004
c-3.10059 20.5996 -40.9004 4.59961 -43.1006 27.0996c-3.09961 32 43.7002 101.1 40 128c-3.39941 24 -19.3994 29.0996 -33.3994 29.4004c-13.4004 0.299805 -16.9004 -2 -21.4004 -4.60059c-2.89941 -1.7002 -6.59961 -4.89941 -11.7002 0.299805
c-6.2998 6 -11.0996 11.7002 -19.3994 12.9004c-12.2998 2 -17.7002 -2 -26.6006 -9.7002c-3.39941 -2.89941 -12 -12.8994 -20 -9.09961c-3.39941 1.7002 -15.3994 7.7002 -24 11.3994c-16.2998 7.10059 -40 -4.59961 -48.5996 -20
c-12.9004 -22.8994 -38 -113.1 -41.7002 -125.1c-8.59961 -26.5996 10.9004 -48.5996 36.9004 -47.0996c11.0996 0.599609 18.2998 4.59961 25.3994 17.3994c4 7.40039 41.7002 107.7 44.6006 112.601c2 3.39941 8.89941 8 14.5996 5.09961
c5.7002 -3.09961 6.90039 -9.40039 6 -15.0996c-1.09961 -9.7002 -28 -70.9004 -28.8994 -77.7002c-3.40039 -22.9004 26.8994 -26.6006 38.5996 -4c3.7002 7.09961 45.7002 92.5996 49.4004 98.2998c4.2998 6.2998 7.39941 8.2998 11.6992 8
c3.10059 0 8.30078 -0.900391 7.10059 -10.9004c-1.40039 -9.39941 -35.1006 -72.2998 -38.9004 -87.6992c-4.59961 -20.6006 6.60059 -41.4004 24.9004 -50.6006c11.3994 -5.7002 62.5 -15.7002 58.5 11.1006zM376.4 3.09961c10.5996 7.5 24.8994 4.60059 32.2998 -6
c7.09961 -10.5996 4.59961 -25.1992 -6 -32.5996c-10.6006 -7.09961 -24.9004 -4.59961 -32 6c-7.2002 10.5996 -4.60059 25.2002 5.7002 32.5996z" />
    <glyph glyph-name="font-awesome-alt" unicode="&#xf35c;" 
d="M339.3 276.8c5.40039 0 9.5 -3 7.7002 -7.09961v-134.4c0 -4.2002 -3 -6 -7.2002 -7.7998c-15.5996 -7.09961 -33.5 -13.7002 -52 -13.7002c-26.2998 0 -38.2002 16.1006 -69.2998 16.1006c-22.7002 0 -46 -8.30078 -65.7002 -16.7002
c-0.599609 -0.600586 -1.7998 -1.2002 -3 -1.2002v-44.2002c0 -1.7998 0 -3 -0.599609 -4.7998v-1.2998c-2.40039 -7.7002 -9.5 -13.7002 -18.5 -13.7002c-10.7002 0 -19.7002 8.90039 -19.7002 19.7002v212.1c-7.7002 6 -12.5 15.5 -12.5 25.7002
c0 18 14.2998 32.2998 32.2998 32.2998s32.2998 -14.3994 32.2998 -32.2998c0 -10.7998 -4.69922 -19.7002 -12.5 -25.7002v-17.8994c1.2002 0.599609 3 1.19922 4.80078 1.7998c17.8994 7.09961 39.3994 13.7002 59.6992 13.7002
c22.1006 0 39.4004 -5.90039 59.1006 -13.7002c4.09961 -1.7998 8.2998 -2.40039 12.5 -2.40039c22.7002 0 46.5996 15.5 52.5996 15.5zM397.8 416c27.5 0 50.2002 -22.7002 50.2002 -50.2002v-347.6c0 -27.5 -22.7002 -50.2002 -50.2002 -50.2002h-347.6
c-27.5 0 -50.2002 22.7002 -50.2002 50.2002v347.6c0 27.5 22.7002 50.2002 50.2002 50.2002h347.6zM412.1 18.2998v347.601c0 7.69922 -6.5 14.2998 -14.2998 14.2998v-0.100586h-347.6c-7.7002 0 -14.2998 -6.5 -14.2998 -14.2998v-347.5
c0 -7.7002 6.5 -14.2998 14.2998 -14.2998h347.6c7.7002 0 14.2998 6.5 14.2998 14.2998z" />
    <glyph glyph-name="accessible-icon" unicode="&#xf368;" 
d="M423.9 192.2l-12.9004 -157.3c-3.2998 -40.7002 -63.9004 -35.1006 -60.5996 4.89941l10 122.5l-41.1006 -2.2998c10.1006 -20.7002 15.7998 -43.9004 15.7998 -68.5c0 -41.2002 -16.0996 -78.7002 -42.2998 -106.5l-39.2998 39.2998
c57.9004 63.7002 13.0996 167.2 -74 167.2c-25.9004 0 -49.5 -9.90039 -67.2002 -26l-39.2998 39.2998c22 20.7002 50.0996 35.1006 81.4004 40.2002l75.2998 85.7002l-42.6006 24.7998l-51.5996 -46c-30 -26.7998 -70.5996 18.5 -40.5 45.4004l68 60.6992
c9.7998 8.80078 24.0996 10.2002 35.5 3.60059c0 0 139.3 -80.9004 139.5 -81.1006c16.2002 -10.0996 20.7002 -36 6.09961 -52.5996l-58.3994 -66.5l106.1 5.90039c18.5 1.09961 33.6006 -14.4004 32.1006 -32.7002zM359 346.2
c-28.0996 0 -50.9004 22.7998 -50.9004 50.8994c0 28.1006 22.8008 50.9004 50.9004 50.9004s50.9004 -22.7998 50.9004 -50.9004c0 -28.0996 -22.8008 -50.8994 -50.9004 -50.8994zM179.6 -8.5c20.8008 0 40.1006 6.40039 56.1006 17.2998l39.7002 -39.7002
c-100.7 -78.8994 -251.4 -8.19922 -251.4 122.5c0 36.1006 12.4004 69.4004 33.2002 95.7002l39.7002 -39.7002c-44.7002 -65.5 2.09961 -156.1 82.6992 -156.1z" />
    <glyph glyph-name="accusoft" unicode="&#xf369;" horiz-adv-x="640" 
d="M322.1 196c-1.69922 -1.59961 -89.5996 -82.5 -90.1992 -83.2998l-92.6006 -33.7998c-4.7998 -2 -7.59961 -3.7002 -7 -8.90039c0.200195 -1.5 0.600586 -22.5996 1 -27.7002c-0.700195 -0.5 -0.0996094 0 -0.599609 -0.599609c0 0 -113.7 -36.6006 -114.5 -36.6006
c-14.1006 -5.09961 -22.7002 -8.2998 -15.7002 1.7002c1.2998 1.7998 234.4 231.601 243.4 240.9c13 13.5 25 15.0996 25 15.0996l51.1992 -65.7998v-1zM482.2 75.9004c-5.7002 6.89941 -232.2 297.1 -239.9 306.6c-13.7002 17.2002 0 16.7998 19.2002 16.9004
c9.7002 0.0996094 106.3 0.599609 116.5 0.599609c24.0996 0.0996094 28.7002 -0.599609 38.4004 -12.7998c2.09961 -2.7002 205.1 -245.8 207.199 -248.3c5.5 -6.7002 15.2002 -19.1006 7.2002 -23.4004c-2.39941 -1.2998 -114.6 -47.7002 -117.8 -48.9004
c-10.0996 -4 -17.5 -6.7998 -30.7998 9.30078zM634.9 74.2998c6 -1.39941 7.09961 -4.2002 1.69922 -8.2002c-2 -1.39941 -123.699 -76.5996 -125.8 -77.7998c-15.0996 -8.7998 -38 -1.59961 -53.5996 1.7002c-7.10059 1.5 -305.3 68.2998 -308 69.0996
c-2.60059 0.900391 -4.40039 1 -4.60059 3.5c-0.299805 4 6 5.60059 11.1006 7.60059c5 1.89941 145.3 52.5996 150.2 54.7002c4.7998 2.09961 11.2998 2.69922 14.3994 2.89941c4.90039 0.299805 59.9004 -8.39941 65.2998 -9.2998l57.1006 -74
c9.7998 -11.4004 20.7002 -21.9004 36.7002 -14.5996c2.5 1.19922 117.5 51.5996 117.5 51.5996c13.3994 -2.5 35.6992 -6.90039 38 -7.2002z" />
    <glyph glyph-name="adversal" unicode="&#xf36a;" horiz-adv-x="512" 
d="M482.1 416c24.5 0 29.9004 -5.59961 29.9004 -30.2002v-388.1c0 -24.5 -5.5 -29.7002 -29.9004 -29.7002h-453.399c-22.9004 0 -28.7002 5.59961 -28.7002 28.9004v390.199c0 23 5.7998 28.9004 28.7002 28.9004h453.399zM178.4 227.7
c9.39941 -7.2002 12.3994 -17.1006 11.2998 -27.2998c-1.7998 -19.1006 -75.7998 -11.4004 -114 -30.9004c-27.2002 -13.9004 -42.7002 -41.7002 -39.6006 -71c6.7002 -64.7002 89.6006 -79.7002 147 -43.2998c4.60059 3.2002 8.30078 4.89941 11.9004 1
c2.09961 -2.60059 2 -4 3.90039 -6.2002c7.2998 -9.59961 38.1992 -14.0996 46.5996 -7.40039c3.09961 2.80078 4.59961 6.30078 2.7002 10.7002c-13.6006 30.5 -6.60059 63 -9.2998 88.7998c0 69.3008 6.39941 111.7 -34.5 128.5
c-41.9004 17.4004 -84.2002 16.6006 -125.301 -4.7998c-16.2998 -9 -53.6992 -52.8994 -24.8994 -64.2998c5.2998 -2.2998 12.7998 -4 22.5 -5.5c8.2002 -1.2002 13.2002 -2.7998 17.5 8.2998c12.0996 32.1006 56.7002 43.6006 84.2002 23.4004zM465.1 5.7002
c0 14.2998 -9.7998 9.89941 -16.5996 9.89941c-132.3 0.400391 -264.5 0.400391 -396.8 0c-6.60059 0 -16.7002 4.80078 -17.1006 -9.09961c-0.399414 -15.5 10.4004 -10.7002 17.8008 -10.7002h394.899c6.7002 0 17.7998 -5.2002 17.7998 9.90039zM468.9 346.2
c0 0.200195 0 0.299805 0.0996094 0.5c0 9.89941 -3.5 15.0996 -13.5996 14.2998c-3.10059 -0.400391 -6.60059 0 -9.7002 0c-26.1006 0 -26 0 -26 -26.2002v-71c-79.2002 45.6006 -124.3 -6.59961 -136.101 -30.5c-16.3994 -32.8994 -21.7998 -66.5996 -15.6992 -100
c16.2998 -92.2998 91 -114.899 144.399 -85.2002c4.60059 2.80078 6.60059 7.5 12.4004 -1.19922c8.59961 -12.7002 23.7002 -5.2002 36.0996 -5.60059c7.40039 0 8.10059 8.2002 8.10059 13.9004v291zM417.4 113.9c-19.5 -47.6006 -72.9004 -43.3008 -90 -5.2002
c-15.1006 33.2998 -15.5 68.2002 0.399414 101.5c16.2998 34.0996 59.7002 35.7002 81.5 4.7998c20.6006 -28.7998 14.9004 -84.5996 8.10059 -101.1zM122.6 78.5996c-7.5 1.30078 -33 3.30078 -33.6992 27.8008c-0.400391 13.8994 7.7998 23 19.7998 25.7998
c24.3994 5.89941 49.2998 9.89941 73.7002 14.7002c8.89941 2 7.39941 -4.40039 7.7998 -9.5c1.39941 -33 -26.1006 -59.2002 -67.6006 -58.8008z" />
    <glyph glyph-name="affiliatetheme" unicode="&#xf36b;" horiz-adv-x="512" 
d="M159.7 210.6c-51.2998 -70.8994 -116.601 -110.8 -145.7 -89.1992c-29.2002 21.6992 -11.2002 96.5996 40.2002 167.5c51.2998 70.8994 116.6 110.8 145.7 89.1992c29.0996 -21.5996 11.0996 -96.5996 -40.2002 -167.5zM510.9 267.9
c0.699219 -8.2002 1.09961 -16.5 1 -25c0 -151.801 -121.601 -274.9 -271.601 -274.9c-82.8994 0 -157.2 37.5996 -207 96.9004c71.2998 19.3994 130.5 68.3994 164.101 133.199c7.69922 -32.5996 24 -58.5996 49 -73.7998c72.5996 -44.0996 190.699 20.2002 264.5 143.601z
" />
    <glyph glyph-name="algolia" unicode="&#xf36c;" 
d="M229.3 265.4c49.2002 0 89.2002 -39.9004 89.2002 -89.2002s-39.9004 -89.2002 -89.2002 -89.2002s-89.2002 39.9004 -89.2002 89.2002s39.9004 89.2002 89.2002 89.2002zM292 208.8c1.2998 0.700195 1.7998 2.40039 1.09961 3.7002
c-12.1992 21.4004 -34.8994 36.0996 -61.0996 37.0996c-1.40039 0.100586 -2.7002 -1.09961 -2.7002 -2.59961v-66.5c0 -1.90039 2 -3.2002 3.7998 -2.2998zM389.1 416c32.5 0 58.9004 -26.4004 58.8008 -58.9004v-330.199c0 -32.5 -26.3008 -58.9004 -58.9004 -58.9004
h-330.1c-32.5 0 -58.9004 26.4004 -58.9004 59v330.1c0 32.5 26.4004 58.9004 58.9004 58.9004h330.199zM186.5 331.3h0.0996094v-15.7998c0 -1.7002 1.7002 -3 3.40039 -2.5c12.7002 3.7002 25.9004 5.5 39.4004 5.5c13 0 25.7998 -1.7002 38.0996 -5.09961
c1.59961 -0.5 3.2998 0.699219 3.2998 2.5v15.3994c0 10.7998 -8.7002 19.5 -19.5 19.5h-45.2998c-10.7998 0 -19.5 -8.7002 -19.5 -19.5zM102.1 294.3c-7.59961 -7.59961 -7.59961 -19.8994 0 -27.3994l7.7002 -7.7002c1.10059 -1.2002 3 -1 4 0.299805
c4.40039 6.09961 9.40039 12 14.7998 17.4004c5.5 5.5 11.4004 10.3994 17.6006 14.8994c1.2998 1 1.39941 2.90039 0.299805 4l-7.7002 7.7002c-7.59961 7.59961 -19.8994 7.59961 -27.5 0zM229.3 49.5c69.9004 0 126.601 56.7998 126.601 126.6
c0 70 -56.6006 126.601 -126.601 126.601c-69.8994 0 -126.6 -56.7002 -126.6 -126.601c0 -69.8994 56.5996 -126.6 126.6 -126.6z" />
    <glyph glyph-name="amilia" unicode="&#xf36d;" 
d="M240.1 416c134.101 0 191.9 -55.7002 192 -136v-296.6c0 -3 -1 -8.10059 -5.09961 -9.10059c-4 -1 -57.2998 -0.700195 -66.5 -0.700195s-56.7998 1 -59.9004 2c-4 0.900391 -6.09961 6.10059 -6.09961 9.10059v25.3994
c-39.5996 -21.3994 -105.5 -42.0996 -153.3 -42.0996c-109.7 0 -124.9 85.7002 -124.9 104s-5.09961 95.5 30.4004 111.8c31.5 13.2002 156.3 36.5 243.7 47.7998v38.5c0 44.7002 -1 73.1006 -58.9004 73.1006c-55.7998 0 -119.8 -25.4004 -152.3 -47.7002
c-6.10059 -4.09961 -16.2002 -4.09961 -20.2998 6.09961c-5.10059 12.2002 -9.10059 34.5 -10.2002 39.6006c-1.90039 10.2002 2.09961 16.2998 7.2002 19.3994c52.6992 38.5 122.3 55.4004 184.199 55.4004zM290.3 68v106.7c-44.7002 -4.10059 -95.5 -20.2998 -119.8 -33.5
c-21.2998 -10.2002 -18.2998 -40.7002 -18.2998 -52.9004c0.0996094 -11.2002 6.2002 -44.7002 59 -44.7002c30.3994 0 57.7002 11.2002 79.0996 24.4004z" />
    <glyph glyph-name="angrycreative" unicode="&#xf36e;" horiz-adv-x="640" 
d="M640 209.8l-3.2002 -28.2002l-34.5 -2.2998l-2 -18.0996l34.5 2.2998l-3.2002 -28.2002l-34.3994 -2.2002l-2.2998 -20.0996l34.3994 2.2002l-3 -26.1006l-64.7002 -4.09961l12.7002 113.2l-47.2998 -115.4l-31.9004 -2l-23.7998 117.8l30.2998 2l13.6006 -79.3994
l31.7002 82.3994zM426.8 76.5l12.7998 120l28.4004 1.90039l-12.9004 -120.101zM162 59.9004l-19.4004 36l-3.5 -37.4004l-28.1992 -1.7002l2.69922 29.1006c-11 -18 -32 -34.3008 -56.8994 -35.8008c-32.7998 -2 -59.7002 20.9004 -56.4004 58.2002
c2.60059 29.2998 26.7002 62.7998 67.5 65.4004c37.7002 2.39941 47.6006 -23.2002 51.2998 -28.7998l2.80078 30.7998l38.8994 2.5c20.1006 1.2998 38.7002 -3.7002 42.5 -23.7002l2.60059 26.5996l64.7998 4.2002l-2.7002 -27.8994l-36.4004 -2.40039l-1.69922 -17.9004
l36.3994 2.30078l-2.7002 -27.9004l-36.3994 -2.2998l-1.90039 -19.9004l36.2998 2.2998l-2.09961 -20.7998l55 117.2l23.7998 1.59961l32.1006 -110.6l8.89941 85.5996l-22.2998 -1.39941l2.90039 27.8994l75 4.90039l-3 -28l-24.3008 -1.59961l-9.69922 -91.9004
l-58 -3.7002l-4.30078 15.6006l-39.3994 -2.5l-8 -16.3008zM117.7 130.1l-26.4004 -1.69922c-6.7002 12.3994 -14.3994 16.5996 -26.2998 15.7998c-19 -1.2002 -33.2998 -17.5 -34.5996 -33.2998c-1.40039 -16 7.2998 -32.5 28.6992 -31.2002
c12.8008 0.799805 21.3008 8.59961 28.9004 18.8994l27 1.7002zM173.8 137.8c1.2002 12.9004 -7.59961 13.6006 -26.0996 12.4004l-2.7002 -28.5c14.2002 0.899414 27.5 2.09961 28.7998 16.0996zM194.9 67l5.7998 60c-5 -13.5 -14.7002 -21.0996 -27.9004 -26.5996z
M330.3 112l-7.89941 37.7998l-15.8008 -39.2998zM160.2 186.6l-4.2998 17.5l-39.6006 -2.59961l-8.09961 -18.2002l-31.9004 -2.09961l57 121.899l23.9004 1.60059l30.7002 -102l9.89941 104.7l27 1.7998l37.7998 -63.6006l6.5 66.6006l28.5 1.89941l-4 -41.1992
c7.40039 13.5 22.9004 44.6992 63.6006 47.5c40.5 2.7998 52.3994 -29.3008 53.3994 -30.3008l3.30078 32l39.2998 2.7002c12.7002 0.900391 27.7998 -0.299805 36.2998 -9.7002l-4.40039 11.9004l32.2002 2.2002l12.9004 -43.2002l23 45.7002l31 2.2002l-43.6006 -78.4004
l-4.7998 -44.2998l-28.3994 -1.90039l4.7998 44.2998l-15.7998 43c1 -22.2998 -9.2002 -40.0996 -32 -49.5996l25.1992 -38.7998l-36.3994 -2.40039l-19.2002 36.7998l-4 -38.2998l-28.4004 -1.89941l3.30078 31.5c-6.7002 -9.30078 -19.7002 -35.4004 -59.6006 -38
c-26.2002 -1.7002 -45.5996 10.2998 -55.3994 39.1992l-4 -40.2998l-25 -1.59961l-37.6006 63.2998l-6.2998 -66.2002zM436.8 268.7c10.2002 0.700195 17.5 2.09961 21.6006 4.2998c4.5 2.40039 7 6.40039 7.59961 12.0996
c0.599609 5.30078 -0.599609 8.80078 -3.40039 10.4004c-3.59961 2.09961 -10.5996 2.7998 -22.8994 2zM327.7 234c5.59961 -5.90039 12.7002 -8.5 21.2998 -7.90039c4.7002 0.300781 9.09961 1.80078 13.2998 4.10059c5.5 3 10.6006 8 15.1006 14.2998l-34.2002 -2.2998
l2.39941 23.8994l63.1006 4.30078l1.2002 12l-31.2002 -2.10059c-4.10059 3.7002 -7.7998 6.60059 -11.1006 8.10059c-4 1.69922 -8.09961 2.7998 -12.1992 2.5c-8 -0.5 -15.3008 -3.60059 -22 -9.2002c-7.7002 -6.40039 -12 -14.5 -12.9004 -24.4004
c-1.09961 -9.59961 1.40039 -17.2998 7.2002 -23.2998zM126.4 225.8l23.7998 1.60059l-8.2998 37.5996z" />
    <glyph glyph-name="app-store" unicode="&#xf36f;" horiz-adv-x="512" 
d="M255.9 327.1l9.09961 15.7002c5.59961 9.7998 18.0996 13.1006 27.9004 7.5c9.7998 -5.59961 13.0996 -18.0996 7.5 -27.8994l-87.5 -151.5h63.2998c20.5 0 32 -24.1006 23.0996 -40.8008h-185.5c-11.2998 0 -20.3994 9.10059 -20.3994 20.4004
s9.09961 20.4004 20.3994 20.4004h52l66.6006 115.399l-20.8008 36.1006c-5.59961 9.7998 -2.2998 22.1992 7.5 27.8994c9.80078 5.60059 22.2002 2.2998 27.9004 -7.5zM177.2 109.1l-19.6006 -34c-5.59961 -9.7998 -18.0996 -13.0996 -27.8994 -7.5
c-9.7998 5.60059 -13.1006 18.1006 -7.5 27.9004l14.5996 25.2002c16.4004 5.09961 29.7998 1.2002 40.4004 -11.6006zM346.1 170.8h53.1006c11.2998 0 20.3994 -9.09961 20.3994 -20.3994c0 -11.3008 -9.09961 -20.4004 -20.3994 -20.4004h-29.5l19.8994 -34.5
c5.60059 -9.7998 2.30078 -22.2002 -7.5 -27.9004c-9.7998 -5.59961 -22.1992 -2.2998 -27.8994 7.5c-33.5 58.1006 -58.7002 101.601 -75.4004 130.601c-17.0996 29.5 -4.89941 59.0996 7.2002 69.0996c13.4004 -23 33.4004 -57.7002 60.0996 -104zM256 440
c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM472 192c0 119.9 -97.2998 216 -216 216c-119.9 0 -216 -97.2998 -216 -216c0 -119.9 97.2998 -216 216 -216c119.9 0 216 97.2998 216 216z" />
    <glyph glyph-name="app-store-ios" unicode="&#xf370;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM127 63.5l19.2998 33.2998c-10.2998 12.5 -23.5 16.2998 -39.5996 11.4004l-14.2998 -24.7002
c-5.5 -9.5 -2.30078 -21.7998 7.2998 -27.2998c9.5 -5.5 21.7998 -2.2998 27.2998 7.2998zM265.9 117.4c8.7998 16.2998 -2.5 40 -22.7002 40h-62.1006l85.8008 148.6c5.5 9.5 2.2998 21.7998 -7.30078 27.2998c-9.5 5.5 -21.7998 2.2998 -27.2998 -7.2998
l-8.89941 -15.4004l-8.90039 15.4004c-5.5 9.5 -17.7002 12.7998 -27.2998 7.2998c-9.5 -5.5 -12.7998 -17.7002 -7.2998 -27.2998l20.5 -35.4004l-65.4004 -113.199h-51c-11 0 -20 -9 -20 -20s9 -20 20 -20h181.9zM364 117.4c11 0 20 8.89941 20 20c0 11 -9 20 -20 20h-52
c-26.2002 45.2998 -45.7998 79.2998 -58.9004 102c-11.8994 -9.80078 -23.7998 -38.8008 -7.09961 -67.8008c16.5 -28.3994 41.0996 -71.1992 74 -128.1c5.5 -9.5 17.7002 -12.7998 27.2998 -7.2998c9.5 5.5 12.7998 17.7002 7.2998 27.2998l-19.5996 33.9004h29z" />
    <glyph glyph-name="apper" unicode="&#xf371;" horiz-adv-x="640" 
d="M42.0996 208.9c22.2002 0 29 -2.80078 33.5 -14.6006h0.800781v22.9004c0 11.2998 -4.80078 15.3994 -17.9004 15.3994c-11.2998 0 -14.4004 -2.5 -15.0996 -12.7998h-38.6006c0.299805 13.9004 1.5 19.1006 5.7998 24.4004
c7.30078 8.7998 18.9004 11.7998 46.1006 11.7998c33 0 47.0996 -5 53.8994 -18.9004c2 -4.2998 4 -15.5996 4 -23.6992v-76.3008h-38.2998l1.2998 19.1006h-1c-5.2998 -15.6006 -13.5996 -20.4004 -35.5 -20.4004c-30.2998 0 -41.0996 10.1006 -41.0996 37.2998
c0 25.2002 12.2998 35.8008 42.0996 35.8008zM59.2002 160.8c13.0996 0 16.8994 3 16.8994 13.4004c0 9.09961 -4.2998 11.5996 -19.5996 11.5996c-13.0996 0 -17.9004 -3 -17.9004 -12.0996c-0.0996094 -10.4004 3.7002 -12.9004 20.6006 -12.9004zM137 255.7h38.2998
l-1.5 -20.6006h0.799805c9.10059 17.1006 15.9004 20.9004 37.5 20.9004c14.4004 0 24.7002 -3 31.5 -9.09961c9.80078 -8.60059 12.8008 -20.4004 12.8008 -48.1006c0 -30 -3 -43.0996 -12.1006 -52.8994c-6.7998 -7.30078 -16.3994 -10.1006 -33.2002 -10.1006
c-20.3994 0 -29.1992 5.5 -33.7998 21.2002h-0.799805v-70.2998h-39.5v169zM217.9 195c0 27.5 -3.30078 32.5 -20.7002 32.5c-16.9004 0 -20.7002 -5 -20.7002 -28.7002c0 -28 3.5 -33.5 21.2002 -33.5c16.3994 0 20.2002 5.60059 20.2002 29.7002zM275.8 255.7h38.2998
l-1.5 -20.6006h0.800781c9.09961 17.1006 15.8994 20.9004 37.5 20.9004c14.3994 0 24.6992 -3 31.5 -9.09961c9.7998 -8.60059 12.7998 -20.4004 12.7998 -48.1006c0 -30 -3 -43.0996 -12.1006 -52.8994c-6.7998 -7.30078 -16.3994 -10.1006 -33.2998 -10.1006
c-20.3994 0 -29.2002 5.5 -33.7998 21.2002h-0.799805v-70.2998h-39.5v169h0.0996094zM356.7 195c0 27.5 -3.2998 32.5 -20.7002 32.5c-16.9004 0 -20.7002 -5 -20.7002 -28.7002c0 -28 3.5 -33.5 21.2002 -33.5c16.4004 0 20.2002 5.60059 20.2002 29.7002zM410.5 198.8
c0 25.4004 3.2998 37.7998 12.2998 45.7998c8.7998 8.10059 22.2002 11.3008 45.1006 11.3008c42.7998 0 55.6992 -12.8008 55.6992 -55.7002v-11.1006h-75.2998c-0.299805 -2 -0.299805 -4 -0.299805 -4.7998c0 -16.8994 4.5 -21.8994 20.0996 -21.8994
c13.9004 0 17.9004 3 17.9004 13.8994h37.5v-2.2998c0 -9.7998 -2.5 -18.9004 -6.7998 -24.7002c-7.2998 -9.7998 -19.6006 -13.5996 -44.2998 -13.5996c-27.5 0 -41.6006 3.2998 -50.6006 12.2998c-8.5 8.5 -11.2998 21.2998 -11.2998 50.7998zM486.9 210.4
c-0.300781 1.7998 -0.300781 3.2998 -0.300781 3.7998c0 12.2998 -3.2998 14.5996 -19.5996 14.5996c-14.4004 0 -17.0996 -3 -18.0996 -15.0996l-0.300781 -3.2998h38.3008zM542.5 255.7h38.2998l-1.7998 -19.9004h0.700195
c6.7998 14.9004 14.3994 20.2002 29.7002 20.2002c10.7998 0 19.0996 -3.2998 23.3994 -9.2998c5.2998 -7.2998 6.7998 -14.4004 6.7998 -34c0 -1.5 0 -5 0.200195 -9.2998h-35c0.299805 1.7998 0.299805 3.2998 0.299805 4c0 15.3994 -2 19.3994 -10.2998 19.3994
c-6.2998 0 -10.7998 -3.2998 -13.0996 -9.2998c-1 -3 -1 -4.2998 -1 -12.2998v-68h-38.2998v118.5h0.0996094z" />
    <glyph glyph-name="asymmetrik" unicode="&#xf372;" horiz-adv-x="576" 
d="M517.5 138.8c-13.9004 -14.2998 -30.4004 -27.7002 -48.9004 -39.7998l73.4004 -110.4h-101.6l-45.9004 71.8008c-17.5996 -7.2002 -35.9004 -13.4004 -54.5 -18.7002l32.5996 -53.1006h-135.5l22.8008 37.1006c-23.3008 -2.7002 -46.4004 -3.7002 -68.6006 -2.7002
l-22 -34.4004h-101.6l34.5 51.7002c-45 17.9004 -68.9004 47.9004 -68.4004 83c0.299805 25.7998 14 54.2998 41.7002 82.9004c38.9004 40 96.5 72.5996 161.6 92.8994c-22.2998 -8.09961 -42 -18.5 -62 -30.6992c-31.1992 -16.2002 -58.6992 -35.9004 -79.5 -58.1006
c-57.3994 -61 -46.5 -121.8 19.1006 -151.2l190.2 285.5l150.899 -226.399c13 9.5 24.7998 19.7998 35 30.5996c98 104.2 53.7002 207.9 -98.7998 231.7c-68.2998 10.5996 -146.8 5.7002 -221.3 -14.7998c-60.1006 -10 -118.7 -31.7002 -170.7 -58.2002
c118.1 66.9004 277.9 102.1 406.6 82.4004c110 -16.8008 170.2 -69.5 169.4 -135c-0.400391 -36.1006 -19.7002 -76.1006 -58.5 -116.101zM329.9 58.2998c18.3994 5.2998 36.5 11.7998 53.6992 19.2002l-78.6992 123l-101.9 -159.3
c22.5 -0.700195 45.7998 0.899414 69.2002 4.39941l32.7002 53.3008z" />
    <glyph glyph-name="audible" unicode="&#xf373;" horiz-adv-x="640" 
d="M640 248.1v-54l-320 -200l-320 199.9v54l320 -200zM445.5 176.1c-70.7998 94.4004 -200.5 110.7 -290.2 36.3008c-2.59961 -2.2002 -5.2002 -4.40039 -7.7002 -6.7002h-0.299805c37.1006 55.7002 100.601 92.3994 172.601 92.3994s135.5 -36.7998 172.699 -92.5996z
M225.4 157.3c21 29.6006 55.5 49 94.3994 49c39.2002 0 73.9004 -19.5996 94.7998 -49.5l-45.3994 -28.3994c-21.2002 29.1992 -52 47.5996 -86.4004 47.5996c-20.8994 0 -40.5 -6.7998 -57.3994 -18.7002zM103.6 286.9c-11.5 -9.10059 -24.2998 -22.1006 -34.1992 -32.6006
c53.8994 82.1006 147 135.601 250.5 135.601c104.899 0 197.199 -54 250.699 -135.7l-48.7998 -30.4004l-0.700195 1c-99.2998 138.5 -285.699 166.4 -417.5 62.1006zM570.6 254.2z" />
    <glyph glyph-name="avianex" unicode="&#xf374;" horiz-adv-x="512" 
d="M453.1 416c39 0 64.8008 -31.2002 57.8008 -69.7998l-56.7002 -308.5c-7.10059 -38.5 -44.4004 -69.7002 -83.2998 -69.7002h-312c-39 0 -64.8008 31.2002 -57.7002 69.7002l56.5996 308.6c7.10059 38.5 44.4004 69.7002 83.2998 69.7002h312zM394.9 68.7002
l6.2998 7.89941l-94.9004 119.4l-4.5 7.2998c19.7998 14.2002 33.5 24.2998 35.2998 25.6006c7.90039 6.59961 6.30078 20.7998 -2.69922 31.2998c-9.2002 10.7998 -23 14.3994 -30.7002 7.89941c0 0 -14.4004 -13.5996 -33.7998 -32.3994l-4.90039 4.5l-103.1 112.399
l-8.90039 -4.7998l-18.7998 -28.8994l68.7998 -99.8008l20.5 -29.5996c-12 -12.2998 -23.5 -24.4004 -32.7998 -34.9004l-58 31.1006l-15.7002 -15.4004l52.4004 -48.0996l40.5996 -61l17.9004 12.7002l-22.1006 64.1992c12.5 7.60059 27 17.1006 41.7002 27.1006
l115.4 -110z" />
    <glyph glyph-name="aws" unicode="&#xf375;" horiz-adv-x="640" 
d="M180.41 244.99c-0.719727 -22.6504 10.5996 -32.6807 10.8799 -39.0498c-0.238281 -2.31543 -2.0752 -5.12402 -4.09961 -6.27051l-12.8008 -8.95996c-1.39941 -0.981445 -3.92188 -1.8418 -5.62988 -1.91992c-0.429688 0.0195312 -8.18945 -1.83008 -20.4795 25.6104
c-13.0283 -16.2627 -40.5127 -29.4609 -61.3496 -29.4609c-0.347656 0 -0.913086 0.00488281 -1.26074 0.0107422c-16.2803 -0.890625 -60.4004 9.24023 -58.1299 56.21c-1.58984 38.2803 34.0596 62.0596 70.9297 60.0498
c7.10059 -0.0195312 21.6006 -0.370117 46.9902 -6.26953v15.6191c2.69043 26.46 -14.7002 46.9902 -44.8096 43.9102c-2.40039 -0.00976562 -19.4004 0.5 -45.8408 -10.1094c-7.35938 -3.37988 -8.2998 -2.82031 -10.75 -2.82031
c-7.40918 0 -4.35938 21.4795 -2.93945 24.2002c5.20996 6.39941 35.8604 18.3496 65.9395 18.1797c1.86523 0.165039 4.89844 0.298828 6.77148 0.298828c15.2451 0 37.1611 -7.875 48.9189 -17.5791c9.87305 -11.0439 17.8867 -32.0303 17.8867 -46.8438
c0 -1.52539 -0.0966797 -3.99609 -0.216797 -5.51562zM93.9902 212.6c32.4297 0.470703 46.1602 19.9707 49.29 30.4707c2.45996 10.0498 2.0498 16.4102 2.0498 27.3994c-9.66992 2.32031 -23.5898 4.85059 -39.5605 4.87012
c-15.1494 1.14062 -42.8193 -5.62988 -41.7393 -32.2598c-1.24023 -16.79 11.1201 -31.4004 29.96 -30.4805zM264.91 189.55c-7.86035 -0.719727 -11.5205 4.86035 -12.6797 10.3701l-49.8008 164.65c-0.969727 2.7793 -1.60938 5.64941 -1.91992 8.58008
c-0.0283203 0.189453 -0.0517578 0.5 -0.0517578 0.692383c0 2.18555 1.75195 4.22656 3.91211 4.55762h22.25c8.78027 0.879883 11.6396 -6.03027 12.5498 -10.3701l35.7197 -140.83l33.1602 140.83c0.530273 3.21973 2.94043 11.0693 12.7998 10.2393h17.1602
c2.16992 0.180664 11.1104 0.5 12.6807 -10.3691l33.4199 -142.631l36.8701 142.631c0.479492 2.17969 2.71973 11.3691 12.6797 10.3691h19.7197c0.850586 0.130859 6.15039 0.810547 5.25 -8.5791c-0.429688 -1.85059 3.41016 10.6592 -52.75 -169.9
c-1.14941 -5.50977 -4.82031 -11.0898 -12.6797 -10.3701h-18.6904c-10.9395 -1.15039 -12.5098 9.66016 -12.6797 10.75l-33.1602 137.13l-32.7803 -136.99c-0.15918 -1.08984 -1.72949 -11.8994 -12.6797 -10.75h-18.2998v-0.00976562zM538.39 183.92
c-5.87988 -0.00976562 -33.9199 0.299805 -57.3594 12.29c-4.31152 1.8252 -7.81055 7.10645 -7.81055 11.7891v0.121094v10.75c0 8.4502 6.2002 6.89941 8.83008 5.88965c10.04 -4.05957 16.4805 -7.13965 28.8105 -9.59961
c36.6494 -7.53027 52.7695 2.2998 56.7197 4.47949c13.1504 7.81055 14.1895 25.6807 5.25 34.9502c-10.4805 8.79004 -15.4805 9.12012 -53.1299 21c-4.64062 1.29004 -43.7002 13.6104 -43.79 52.3604c-0.610352 28.2402 25.0498 56.1797 69.5195 55.9502
c12.6699 0.00976562 46.4307 -4.13086 55.5703 -15.6201c1.34961 -2.08984 2.01953 -4.5498 1.91992 -7.04004v-10.1104c0 -4.43945 -1.62012 -6.66016 -4.87012 -6.66016c-7.70996 0.860352 -21.3896 11.1699 -49.1602 10.75
c-6.88965 0.360352 -39.8896 -0.910156 -38.4092 -24.9697c-0.430664 -18.96 26.6094 -26.0703 29.6992 -26.8896c36.46 -10.9707 48.6504 -12.79 63.1201 -29.5801c17.1406 -22.25 7.90039 -48.2998 4.35059 -55.4404
c-19.0801 -37.4902 -68.4199 -34.4395 -69.2607 -34.4199zM578.59 79.0596c-70.0303 -51.7197 -171.689 -79.25 -258.49 -79.25c-0.853516 -0.00488281 -2.23926 -0.00976562 -3.09277 -0.00976562c-99.5195 0 -240.271 54.0918 -314.177 120.74
c-6.53027 5.88965 -0.770508 13.96 7.16992 9.46973c81.1748 -46.4336 222.955 -84.1201 316.473 -84.1201h0.407227c69.4072 0.373047 177.64 22.5713 241.59 49.5508c11.7803 5 21.7705 -7.80078 10.1201 -16.3809zM607.78 112.35
c-8.95996 11.5205 -59.2803 5.38086 -81.8105 2.69043c-6.79004 -0.770508 -7.93945 5.12012 -1.79004 9.46973c40.0703 28.1699 105.88 20.1006 113.44 10.6299c7.5498 -9.46973 -2.0498 -75.4092 -39.5605 -106.909c-5.75977 -4.87012 -11.2695 -2.30078 -8.70996 4.09961
c8.44043 21.25 27.3906 68.4902 18.4307 80.0195z" />
    <glyph glyph-name="bimobject" unicode="&#xf378;" 
d="M416 416c17.5996 0 32 -14.4004 32 -32v-384c0 -17.5996 -14.4004 -32 -32 -32h-384c-17.5996 0 -32 14.4004 -32 32v384c0 17.5996 14.4004 32 32 32h384zM352 158.6h-0.0996094v35c0 49.4004 -11.4004 82.5 -103.801 82.5h-17.2998
c-30 0 -65.0996 -8.2998 -69.7002 -38.7998h-1.09961v74.7002h-64v-232h64v34.7998h0.900391c8 -23.8994 26.2998 -38.7998 70.3994 -38.7998h16.9004c92.3994 0 103.8 33.2002 103.8 82.5996zM288 187.5v-22.9004c0 -21.6992 -3.40039 -33.7998 -38.4004 -33.7998h-45.2998
c-28.8994 0 -44.0996 6.5 -44.0996 35.7002v19c0 29.2998 15.2002 35.7002 44.0996 35.7002h45.2998c35 0.200195 38.4004 -12 38.4004 -33.7002z" />
    <glyph glyph-name="bitcoin" unicode="&#xf379;" horiz-adv-x="512" 
d="M504 192c0 -136.967 -111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248s248 -111.033 248 -248zM362.349 227.33c4.9375 32.999 -20.1904 50.7393 -54.5498 62.5732l11.1465 44.7021l-27.2129 6.78027l-10.8516 -43.5234
c-7.1543 1.78223 -14.502 3.46387 -21.8027 5.12988l10.9287 43.8096l-27.1982 6.78125l-11.1523 -44.6855c-5.92188 1.34863 -11.7354 2.68164 -17.377 4.08398l0.0302734 0.139648l-37.5293 9.37012l-7.23926 -29.0625s20.1914 -4.62695 19.7646 -4.91309
c11.0225 -2.75098 13.0146 -10.0439 12.6807 -15.8242l-12.6963 -50.9258c0.759766 -0.193359 1.74414 -0.472656 2.8291 -0.90625c-0.907227 0.224609 -1.87598 0.472656 -2.87598 0.712891l-17.7959 -71.3379c-1.34961 -3.34863 -4.76758 -8.37012 -12.4717 -6.46484
c0.271484 -0.394531 -19.7793 4.9375 -19.7793 4.9375l-13.5107 -31.1475l35.4141 -8.82617c6.58887 -1.65137 13.0449 -3.37988 19.4004 -5.00684l-11.2617 -45.2129l27.1816 -6.78027l11.1533 44.7324c5.96875 -1.61719 15.6846 -4.13867 21.6865 -5.62695
l-11.1152 -44.5225l27.2139 -6.78125l11.2617 45.1279c46.4043 -8.78125 81.2988 -5.23926 95.9863 36.7266c11.8359 33.79 -0.589844 53.2812 -25.0049 65.9912c17.7803 4.09766 31.1748 15.792 34.7471 39.9492zM300.172 140.151
c-8.41016 -33.79 -65.3076 -15.5234 -83.7549 -10.9434l14.9443 59.8994c18.4453 -4.60352 77.5996 -13.7178 68.8105 -48.9561zM308.589 227.818c-7.67285 -30.7363 -55.0312 -15.1201 -70.3926 -11.292l13.5479 54.3262
c15.3633 -3.82715 64.8359 -10.9727 56.8447 -43.0342z" />
    <glyph glyph-name="bity" unicode="&#xf37a;" horiz-adv-x="496" 
d="M78.4004 380.8c95.3994 89.2002 246.1 91.2002 343.1 -3.7998c14.2998 -14.0996 -6.40039 -37.0996 -22.4004 -21.5c-84.7998 82.4004 -215.8 80.2998 -298.899 3.2002c-16.2998 -15.1006 -36.5 8.2998 -21.7998 22.0996zM177.3 -37.7998
c-128.7 38.2998 -201.899 170.7 -169.8 298.1c5.2998 21 35.2002 12.5 30.2002 -7.09961c-28.2998 -111.3 35.2998 -227.101 147.5 -261c21.3994 -6.40039 11.3994 -35.7002 -7.90039 -30zM325.4 -35.7998c-19.2002 -6.2998 -30 22.7002 -8.80078 29.7002
c106.101 35.5 167.4 145.699 143.2 253.399c-4.89941 21.7002 25.5 27.6006 30 7.90039c28.5 -124.101 -42.5 -250.8 -164.399 -291zM262.5 43.2002c0 -8.2002 -6.59961 -14.7998 -14.7998 -14.7998s-14.7998 6.59961 -14.7998 14.7998l0.199219 71.7998
c0 8.09961 6.60059 14.7998 14.8008 14.7998c8.19922 0 14.7998 -6.59961 14.7998 -14.7998zM333.5 312.2c0 21.7998 32.5 19.5996 32.5 0v-71.6006c0 -69.2998 -60.7002 -90.8994 -118 -90.0996c-57.2998 -0.799805 -118 20.7998 -118 90.0996v71.6006
c0 19.5996 32.5 21.7998 32.5 0c-1.40039 -88.2002 -7 -131.8 85.5 -132.5c90.2002 0.599609 87.5996 41.5996 85.5 132.5z" />
    <glyph glyph-name="blackberry" unicode="&#xf37b;" horiz-adv-x="512" 
d="M166 331.1c0 -23.3994 -16.4004 -49.0996 -72.5 -49.0996h-70.0996l21 88.7998h67.7998c42.0996 0 53.7998 -23.2998 53.7998 -39.7002zM292.2 370.8c42.0996 0 53.7998 -23.2998 53.7002 -39.7002c0 -23.3994 -16.3008 -49.0996 -70.1006 -49.0996h-70.0996
l18.7002 88.7998h67.7998zM88.7998 239.9c42.1006 0 53.7998 -23.4004 53.7998 -39.7002c0 -25.7002 -16.3994 -49.1006 -72.5 -49.1006h-70.0996l21 88.8008h67.7998zM268.9 239.9c42 0 53.6992 -23.4004 53.6992 -39.7002c0 -25.7002 -16.2998 -49.1006 -70.0996 -49.1006
h-70.0996l18.6992 88.8008h67.8008zM458.2 293.7c42.0996 0 53.7998 -23.4004 53.7002 -39.7002c0 -25.7002 -16.3008 -49.0996 -70.1006 -49.0996h-70.0996l18.7002 88.7998h67.7998zM430.2 155.8c42.0996 0 53.7002 -23.3994 53.7002 -39.7002
c0 -25.6992 -14 -49.0996 -70.1006 -49.0996h-70.0996l18.7002 88.7998h67.7998zM240.8 102c42.1006 0 53.7998 -23.4004 53.7002 -39.7002c0 -23.3994 -14 -49.0996 -70.0996 -49.0996h-70.1006l18.7002 88.7998h67.7998z" />
    <glyph glyph-name="blogger" unicode="&#xf37c;" 
d="M162.4 252c4.7998 4.90039 6.19922 5.09961 36.3994 5.09961c27.2002 0 28.1006 -0.0996094 32.1006 -2.09961c5.7998 -2.90039 8.2998 -7 8.2998 -13.5996c0 -5.90039 -2.40039 -10 -7.60059 -13.4004c-2.7998 -1.7998 -4.5 -1.90039 -31.0996 -2.09961
c-16.4004 -0.100586 -29.5 0.199219 -31.5 0.799805c-10.2998 2.89941 -14.0996 17.7002 -6.59961 25.2998zM223.8 157.5c55.4004 0 55.1006 0 60.4004 -4.7002c7.39941 -7 5.89941 -19.2998 -3.10059 -24.3994l-9.19922 -1.5l-47.9004 -0.600586
c-42.2002 -0.5 -54.0996 0.200195 -56.2998 1.2002c-4.40039 1.90039 -8.5 7.2998 -9.2002 12c-0.599609 4.5 1.59961 10.7998 5.09961 13.9004c4.40039 3.89941 6.30078 4.09961 60.2002 4.09961zM447.2 27.4004c-3.5 -28.4004 -23 -50.4004 -51.1006 -57.5
c-7.19922 -1.80078 -9.69922 -1.90039 -172.899 -1.80078c-157.8 0 -165.9 0.100586 -172 1.80078c-8.40039 2.19922 -15.6006 5.5 -22.2998 10c-5.60059 3.7998 -13.9004 11.7998 -17 16.3994c-3.80078 5.60059 -8.2002 15.2998 -10 22
c-1.80078 6.7002 -1.90039 9.40039 -1.90039 173.4c0 163.1 0 166.6 1.7998 173.7c6.2998 24.6992 25.9004 43.5996 51.2002 49.1992c7.2998 1.60059 332.1 1.90039 340 0.300781c21.2002 -4.30078 37.9004 -17.1006 47.5996 -36.4004c7.7002 -15.2998 7 1.5 7.30078 -180.6
c0.199219 -115.801 0 -164.5 -0.700195 -170.5zM361.8 212.6c-1.09961 5 -4.2002 9.60059 -7.7002 11.5c-1.09961 0.600586 -8 1.30078 -15.5 1.7002c-12.3994 0.600586 -13.7998 0.799805 -17.7998 3.10059c-6.2002 3.59961 -7.89941 7.59961 -8 18.2998
c0 20.3994 -8.5 39.3994 -25.2998 56.5c-12 12.2002 -25.2998 20.5 -40.5996 25.0996c-3.60059 1.10059 -11.8008 1.5 -39.2002 1.7998c-42.9004 0.5 -52.5 -0.399414 -67.1006 -6.19922c-27 -10.7002 -46.2998 -33.4004 -53.3994 -62.4004
c-1.2998 -5.40039 -1.60059 -14.2002 -1.90039 -64.2998c-0.399414 -62.7998 0 -72.1006 4 -84.5c9.7002 -30.7002 37.1006 -53.4004 64.6006 -58.4004c9.19922 -1.7002 122.199 -2.09961 133.699 -0.5c20.1006 2.7002 35.9004 10.7998 50.7002 25.9004
c10.7002 10.8994 17.4004 22.7998 21.7998 38.5c3.2002 10.8994 2.90039 88.3994 1.7002 93.8994z" />
    <glyph glyph-name="blogger-b" unicode="&#xf37d;" 
d="M446.6 225.3c2 -8.89941 2.40039 -134.1 -2.5 -151.7c-7.09961 -25.2998 -17.8994 -44.3994 -35.1992 -62.0996c-23.9004 -24.4004 -49.4004 -37.5 -81.9004 -41.9004c-18.7002 -2.5 -201.2 -1.89941 -216 0.800781c-44.5 8 -88.7998 44.6992 -104.4 94.2998
c-6.2998 20.0996 -7 35 -6.39941 136.5c0.5 81 1 95.0996 3.09961 103.899c11.4004 46.8008 42.6006 83.4004 86.1006 100.601c23.5996 9.39941 39 10.7998 108.399 10c44.2002 -0.5 57.4004 -1.10059 63.2998 -2.90039c24.6006 -7.5 46.2002 -20.7998 65.5 -40.5
c27.1006 -27.5996 40.8008 -58.2998 40.9004 -91.2998c0.0996094 -17.2002 2.7998 -23.5996 12.9004 -29.5c6.39941 -3.7002 8.59961 -4.09961 28.6992 -5c12 -0.5 23.2002 -1.7002 25 -2.7002c5.7002 -3.09961 10.7002 -10.5 12.5 -18.5zM124.5 288.9
c-12.2002 -12.3008 -6 -36.1006 10.5996 -40.8008c3.10059 -0.799805 24.3008 -1.39941 50.8008 -1.19922c43 0.199219 45.6992 0.399414 50.2998 3.2998c8.5 5.39941 12.2998 12.0996 12.2998 21.5996c0 10.6006 -4.09961 17.2002 -13.4004 21.9004
c-6.39941 3.2998 -7.89941 3.39941 -51.7998 3.39941c-48.7998 0 -51 -0.299805 -58.7998 -8.19922zM316.3 89.0996c14.4004 8.2002 17 28.1006 4.90039 39.4004c-8.5 7.90039 -8 7.90039 -97.6006 7.7998c-87.0996 -0.0996094 -90.1992 -0.299805 -97.2998 -6.7002
c-5.59961 -5.09961 -9.2998 -15.0996 -8.2002 -22.3994c1.10059 -7.7002 7.80078 -16.2998 14.9004 -19.4004c3.59961 -1.59961 22.7998 -2.7998 90.9004 -2l77.5 0.900391z" />
    <glyph glyph-name="buromobelexperte" unicode="&#xf37f;" 
d="M0 416h128v-128h-128v128zM120 296v112h-112v-112h112zM160 416h128v-128h-128v128zM280 296v112h-112v-112h112zM320 416h128v-128h-128v128zM440 296v112h-112v-112h112zM0 256h128v-128h-128v128zM120 136v112h-112v-112h112zM160 256h128v-128h-128v128zM280 136v112
h-112v-112h112zM320 256h128v-128h-128v128zM440 136v112h-112v-112h112zM0 96h128v-128h-128v128zM120 -24v112h-112v-112h112zM160 96h128v-128h-128v128zM280 -24v112h-112v-112h112zM320 96h128v-128h-128v128z" />
    <glyph glyph-name="centercode" unicode="&#xf380;" horiz-adv-x="512" 
d="M329.2 179.4c-3.7998 -35.2002 -35.4004 -60.6006 -70.6006 -56.8008c-35.1992 3.80078 -60.5996 35.4004 -56.7998 70.6006s35.4004 60.5996 70.6006 56.7998c35.0996 -3.7998 60.5996 -35.4004 56.7998 -70.5996zM243.4 -55.7002
c-146.7 7.7002 -251.601 138.2 -233.301 279.4c11.2002 86.5996 65.8008 156.899 139.101 192c161 77.0996 349.7 -37.4004 354.7 -216.601c4.09961 -147 -118.4 -262.199 -260.5 -254.8zM423.3 124.3c27.9004 118 -160.5 205.9 -237.2 234.2
c-57.5 -56.2998 -69.0996 -188.6 -33.7998 -344.4c68.7998 -15.7998 169.101 26.4004 271 110.2z" />
    <glyph glyph-name="cloudscale" unicode="&#xf383;" 
d="M318.1 294c6.2002 6.2998 15.8008 -3.09961 9.5 -9.59961l-75.1992 -88.8008c0.899414 -8.19922 -1.80078 -16.7998 -8.10059 -23.0996c-11.0996 -11 -28.8994 -11 -40 0c-11.0996 11.0996 -11.0996 29 0 40c6.2998 6.2998 14.7998 9 23.1006 8.09961l25.1992 20.4004
c-16.3994 15.2998 -38.3994 24.7002 -62.5996 24.7002c-50.7998 0 -94.5996 -41.4004 -92.5996 -97.4004c-1 6.2998 -1.40039 12.7998 -1.40039 19.4004c0 71.5 57.7998 132.3 129.4 132.3c31.7998 0 60.7998 -14.2998 83.2998 -33.5996zM234.3 182.5
c5.60059 5.5 5.60059 14.5996 0 20.2002c-5.59961 5.59961 -14.5996 5.59961 -20.2002 0c-5.59961 -5.60059 -5.59961 -14.6006 0 -20.2002c5.60059 -5.5 14.6006 -5.5 20.2002 0zM224 416c123.5 0 224 -100.5 224 -224s-100.5 -224 -224 -224s-224 100.5 -224 224
s100.5 224 224 224zM224 32c88.2002 0 160 71.7998 160 160s-71.7998 160 -160 160s-160 -71.7998 -160 -160s71.7998 -160 160 -160z" />
    <glyph glyph-name="cloudsmith" unicode="&#xf384;" horiz-adv-x="332" 
d="M332.5 28.0996c0 -46.3994 -37.5996 -84.0996 -84 -84.0996s-84 37.7002 -84 84.0996c0 46.4004 37.5996 84 84 84s84 -37.5996 84 -84zM248.5 272c-46.4004 0 -80 -33.5996 -80 -80s-37.5996 -80 -84 -80s-84 33.5996 -84 80s37.5996 88 84 88s76 29.5996 76 76
s41.5996 84 88 84s80 -37.5996 80 -84s-33.5996 -84 -80 -84z" />
    <glyph glyph-name="cloudversify" unicode="&#xf385;" horiz-adv-x="616" 
d="M148.6 144v-0.0996094h-48.8994c-6.40039 0 -11.7002 5.39941 -11.7002 11.7998v40.3994c0 7.60059 7 11.9004 10.7998 11.9004h46.7998v-6.59961c0 -10.7002 8.80078 -16.7002 19.5 -16.7002h20.2002c10.7998 0 19.5 8.7998 19.5 19.5v20.3994
c0 10.6006 -3.5 19.5 -15.2002 19.5c18.5 15.2002 37.2002 21.4004 45 24.1006c15 56.5 42 92.3994 99.3008 109.7c55.0996 16.5 153.5 3.09961 186.5 -85c73.8994 -22.6006 106.899 -92.6006 92.0996 -155.101c-13 -54.8994 -62.2998 -100.6 -131.5 -99.5
c-49.5996 -51.3994 -135.2 -48.8994 -186.4 -5.59961c-78.5996 -4.2002 -137.8 42.7998 -146 111.3zM376 136c8.7002 -54.0996 59.7002 -65.5 91.7998 -59.2002c39.1006 7.7002 70.5 37.5 79.7002 76.5c5.7998 24.4004 2.40039 50 -9.40039 72l-10.5 19.6006
c1.2002 -22.5 -12.5 -60.6006 -47.5 -76.9004c65.5 67.7002 2.10059 141.2 -67.6992 150.5c-49.8008 6.59961 -83.3008 -13 -114.2 -43.7002c48 -4.7002 87.7002 -26.7998 101.8 -74.7998c-30.0996 49.2998 -103 56.5996 -133.6 40.7998
c-35.5 -18.2002 -60 -54 -57 -93.8994c3.59961 -47.4004 39.5 -67.4004 57.3994 -79.8008c-4.5 21.7002 -4 71.3008 29.2002 92.9004c-36.2998 -60 28.0996 -144.6 135.3 -110.8c-33.5996 14.3994 -66 40.5 -55.2998 86.7998zM128 240h-39.7998
c-8.90039 0 -16.2002 7.2998 -16.2002 16.2002v39.5996c0 8.90039 7.2998 16.2002 16.2002 16.2002h39.7998c8.90039 0 16.2002 -7.2998 16.2002 -16.2002v-39.5996c0 -8.90039 -7.2998 -16.2002 -16.2002 -16.2002zM10.0996 280c-5.59961 0 -10.0996 4.5 -10.0996 10.0996
v27.8008c0 5.59961 4.5 10.0996 10.0996 10.0996h27.7002c5.5 0 10.1006 -4.5 10.1006 -10.0996v-27.8008c0 -5.59961 -4.5 -10.0996 -10.1006 -10.0996h-27.7002zM168 305.3v21.4004c0 5.09961 4.2002 9.2998 9.2998 9.2998h21.4004
c5.09961 0 9.2998 -4.2002 9.2998 -9.2998v-21.4004c0 -5.09961 -4.2002 -9.2998 -9.2998 -9.2998h-21.4004c-5.09961 0 -9.2998 4.2002 -9.2998 9.2998zM56 212.5v-25c0 -6.2998 -5.09961 -11.5 -11.4004 -11.5h-25.1992c-6.30078 0 -11.4004 5.2002 -11.4004 11.5v25
c0 6.2998 5.09961 11.5 11.4004 11.5h25.0996c6.40039 0 11.5 -5.2002 11.5 -11.5z" />
    <glyph glyph-name="cpanel" unicode="&#xf388;" horiz-adv-x="640" 
d="M210.3 227.8c6.60059 -29.0996 -14.5 -65.2998 -51.7002 -65.2998h-32l6.40039 23.7998c1.7998 6.2002 7.2998 10.7998 14.2998 10.7998h10.2998c12.4004 0 20.8008 11.7002 18.3008 22.6006c-2.10059 9.2002 -9.90039 14.7998 -18.3008 14.7998h-19.7998
l-25.7998 -95.7002c-1.90039 -6.2002 -7.40039 -10.7002 -14.2002 -10.7002l-24.7002 -0.0996094l34.9004 130.1c1.7998 6.40039 7.2002 10.9004 14.2998 10.9004h37c24.1006 0 45.4004 -16.4004 51 -41.2002zM53.7998 199.8c-24.8994 0 -24.7002 -37.3994 0 -37.3994
h11.2998c4.2002 0 7.60059 -3.90039 6.40039 -8.30078l-7.09961 -26.0996h-12.4004c-33.5 0 -59 31.4004 -50.2998 65.2002c7.2998 27 28.2998 41.0996 51.2002 41.0996h40l-6.2002 -23.5996c-1.90039 -6.5 -7.40039 -10.9004 -14.2998 -10.9004h-18.6006zM301.3 234.6
c18.7998 0 33.2998 -17.5996 28.5 -36.7998l-14 -51.7998c-2.7998 -10.5996 -12.2002 -17.7998 -23.3994 -17.7998l-57.5 0.200195c-42.9004 0 -38.5 63.7998 0.699219 63.7998h48.4004l-3.5 -13.2002c-1.90039 -6.2002 -7.40039 -10.7998 -14.2002 -10.7998h-21.5996
c-5.2998 0 -5.2998 -7.90039 0 -7.90039h34.8994c4.60059 0 5.10059 3.90039 5.5 5.2998l8.60059 31.8008c0.299805 1 1.89941 5.2998 -2.10059 5.2998h-57.5c-9.69922 0 -16.5996 8.89941 -14.1992 18.5l3.5 13.3994h77.8994zM633.1 269c4.5 0 7.7002 -4 6.5 -8.2998
l-26.5 -98.2002c-5.09961 -20.7002 -24.1992 -34.5 -44.8994 -34.5l35.5996 133.1c1.2002 4.7002 5.5 7.90039 10.4004 7.90039h18.8994zM396.8 234.3c34.4004 0 59.2998 -32.2998 50.2998 -65.3994l-8.7998 -33.1006c-1.2002 -4.89941 -5.7002 -7.7998 -10.2998 -7.7998
h-19.0996c-4.5 0 -7.60059 4 -6.40039 8.2998l10.5996 40c3.30078 11.6006 -5.59961 23.4004 -18.0996 23.4004h-19.7998l-17.2002 -64c-1.2002 -4.7998 -5.59961 -7.7998 -10.4004 -7.7998h-18.8994c-4.2002 0 -7.60059 3.89941 -6.40039 8.2998l26.2002 98h48.2998
v0.0996094zM495.1 159.7h73.3008l-5.7002 -21c-1.90039 -6.2002 -7.40039 -10.7002 -14.2002 -10.7002h-66.7002c-20 0 -33.2998 19 -28.2998 36.7002l10.7998 40c4.7998 17.5996 20.7002 29.5996 38.6006 29.5996h47.2998c19 0 33.2002 -17.7002 28.2998 -36.7998
l-3.2002 -12c-2.89941 -11 -12.7002 -17.5996 -23.2002 -17.5996h-53.3994l3.5 13c1.59961 6.19922 7.2002 10.7998 14.2002 10.7998h21.5996c2 0 3.2998 1 3.90039 3l0.699219 2.59961c0.700195 2.7002 -1.2998 5.10059 -3.89941 5.10059h-32.9004
c-4.09961 0 -6.89941 -2.10059 -7.7998 -6l-8 -30c-0.900391 -3.30078 1.5 -6.7002 5.09961 -6.7002z" />
    <glyph glyph-name="css3-alt" unicode="&#xf38b;" horiz-adv-x="384" 
d="M0 416h384l-34.9004 -395.8l-157.1 -52.2002l-157.1 52.2002zM313.1 336h-242.199l5.7998 -47.2998h122.899l-6.5 -2.7002l-112.1 -46.7002l3.59961 -46.2998l0.200195 0.0996094v-0.0996094l166.3 -0.5l-3.69922 -61.5996l-54.7002 -15.4004l-52.6006 13.2998
l-3.19922 38.2998h-48.9004l6.40039 -73.8994l98.7998 -29.2002l98.2002 28.7002l12.7998 146.6h-111.5l0.299805 0.100586l115.3 49.2998z" />
    <glyph glyph-name="cuttlefish" unicode="&#xf38c;" horiz-adv-x="440" 
d="M344 142.5c13.7002 -50.9004 41.7002 -93.2998 87 -117.8c-45.2998 -49.6006 -110.5 -80.7002 -183 -80.7002c-137 0 -248 111 -248 248s111 248 248 248c72.5 0 137.7 -31.0996 183 -80.7002c-45.2998 -24.5 -73.2998 -66.8994 -87 -117.8
c-17.5 31.5996 -57.4004 54.5 -96 54.5c-56.5996 0 -104 -47.4004 -104 -104s47.4004 -104 104 -104c38.5996 0 78.5 22.9004 96 54.5z" />
    <glyph glyph-name="d-and-d" unicode="&#xf38d;" horiz-adv-x="576" 
d="M82.5 349.1c-0.599609 17.2002 2 33.8008 12.7002 48.2002c0.299805 -7.39941 1.2002 -14.5 4.2002 -21.5996c5.89941 27.5 19.6992 49.2998 42.2998 65.5c-1.90039 -5.90039 -3.5 -11.7998 -3 -17.7002c8.7002 7.40039 18.7998 17.7998 44.3994 22.7002
c14.7002 2.7998 29.7002 2 42.1006 -1c38.5 -9.2998 61 -34.2998 69.7002 -72.2998c5.2998 -23.1006 0.699219 -45 -8.30078 -66.4004c-5.19922 -12.4004 -12 -24.4004 -20.6992 -35.0996c-2 1.89941 -3.90039 3.7998 -5.80078 5.59961
c-42.7998 40.7998 -26.7998 25.2002 -37.3994 37.4004c-1.10059 1.19922 -1 2.19922 -0.100586 3.59961c8.30078 13.5 11.8008 28.2002 10 44c-1.09961 9.7998 -4.2998 18.9004 -11.2998 26.2002c-14.5 15.2998 -39.2002 15 -53.5 -0.600586
c-11.3994 -12.5 -14.0996 -27.3994 -10.8994 -43.5996c0.199219 -1.2998 0.399414 -2.7002 0 -3.90039c-3.40039 -13.6992 -4.60059 -27.5996 -2.5 -41.5996c0.0996094 -0.5 0.0996094 -1.09961 0.0996094 -1.59961c0 -0.300781 -0.0996094 -0.5 -0.200195 -1.10059
c-21.7998 11 -36 28.2998 -43.2002 52.2002c-8.2998 -17.7998 -11.0996 -35.5 -6.59961 -54.0996c-15.5996 15.1992 -21.2998 34.2998 -22 55.1992zM552.1 225.9c0.5 -0.600586 1.2002 -1 1.7002 -1.40039v-0.5c-15 3.59961 -29.7998 1.7998 -44.5 -1.2998
c-9.2998 -2 -18.2998 -4.7002 -26.7002 -9c-2.89941 -1.5 -5.69922 -3.2998 -8 -4.7002c-5.7998 2.40039 -11.2998 5.5 -17.1992 6.7998c-24.5 5.2998 -45.8008 -1.2002 -62.5 -20c-19.7002 -22.2002 -34.5 -47.5996 -46.7002 -74.5l-1.2002 -2.7002
c-0.0996094 -0.199219 -0.200195 -0.299805 -0.400391 -0.399414c-12.0996 8.2998 -21.5996 20.2998 -36.0996 25.5996c0.299805 0.400391 0.400391 0.900391 0.700195 1.2998c20.5996 28.2002 44.8994 52.5 75.0996 70.4004c16 9.5 33 16.0996 51.5 18.5
c1.7998 0.200195 3.5 0.400391 5.2998 1.09961c-4.39941 0 -8.7998 0.300781 -13.0996 -0.0996094c-21.2002 -1.90039 -40.5 -9.59961 -58.7002 -20.2002c-13.7998 -8 -26.2002 -17.7002 -36.5996 -29.7998c-0.400391 -0.5 -0.600586 -1.09961 -0.900391 -1.7002
c-0.299805 0.299805 -0.700195 0.600586 -1 0.900391c11 30.8994 30.7002 55 57.7002 73.2998c0.200195 -0.200195 0.5 -0.299805 0.700195 -0.5c-1.2002 -1.7002 -2.5 -3.2998 -3.5 -5.09961c-1.7998 -3.30078 -3.7002 -6.5 -5.10059 -10
c-1.7998 -4.30078 1.60059 -8.60059 12 -0.5c18.2002 14.0996 29.6006 26.2998 48.9004 29.5996c0.700195 0.0996094 1.2998 0.299805 1.90039 0.299805h2.5c-1 -0.700195 -1.60059 -1.09961 -2.2002 -1.5c-11.6006 -7.7998 -11.7998 -7.39941 -15 -12
c-2.60059 -3.7002 -0.200195 -8 4.7002 -6.7998c2.59961 0.599609 5.19922 1.2998 7.69922 2.2002c9.40039 3.2998 19 5.7998 29 6.39941c13.9004 0.800781 27.1006 -1.89941 39.9004 -7.09961c15.0996 -6.2002 28.5 -15 40.0996 -26.5996zM316.7 50.4004
c1.5 -1.30078 1.89941 -2.40039 0.899414 -4.2002c-25.2998 -50.2002 -61.0996 -89.1006 -116 -98.7998c-26.7998 -4.7002 -52.8994 -2.7002 -77.8994 8.59961c-18.5 8.2002 -34.6006 19.5996 -47.2002 35.5996c-2 2.60059 -3.7002 5.40039 -5.90039 8.60059
c-0.699219 -7.7998 0.100586 -14.9004 1.5 -21.9004c-0.199219 -0.200195 -0.399414 -0.299805 -0.599609 -0.5c-3.2002 3.40039 -6.59961 6.60059 -9.5 10.2998c-12.2002 15.5 -19.5 33.3008 -24.0996 52.3008c-11.8008 48.2998 -0.5 78.7998 7.7998 101.1
c-8.7002 -4.7998 -16.2002 -10.2998 -23.6006 -16.2002c11.6006 32.7998 31.9004 59.9004 56.1006 84.6006c2.39941 -2.10059 3.2998 -4.7002 3 -7.40039c-0.200195 -1 -5.90039 -38.9004 -5.60059 -44.7002c18.9004 18.9004 40.5 33.2998 64.8008 43.9004
c-7.5 -11.1006 -11 -23.4004 -11.8008 -37.2998c13.4004 12.1992 27.7002 20.0996 46.4004 13.8994c-8.5 -9.09961 -30.7998 -30.5 -38.5996 -64.2998c-5.10059 -21.9004 -3.80078 -43.0996 8.19922 -62.5996c11.2002 -18.3008 27.8008 -27.8008 49.4004 -27.8008
c12.5996 0 23.7998 5 34.0996 11.8008c18.5 12.2998 32.8008 28.5 44 47.5996c1.90039 3.2002 1.10059 2.09961 1.90039 3c19.9004 -16.0996 3.2998 -2.59961 42.7002 -35.5996zM488.7 96.7998c20.2002 -6.59961 35.5 -18.7998 43.7998 -38.8994
c9.2002 -23.1006 2.09961 -49.4004 -17.4004 -66c-16.3994 -14 -35.6992 -19.2002 -57 -17.4004c-0.599609 0 -1.19922 0 -1.89941 -0.299805c15.0996 -10.7002 31.5996 -15.2002 50.8994 -10.6006c-2.19922 -2.39941 -3.89941 -4.69922 -5.89941 -6.5
c-12.2998 -10.8994 -26.9004 -16.8994 -42.9004 -19.7998c-39.5996 -7.2998 -75.5996 12.7998 -85 56.9004c-0.5 2.09961 -0.599609 4.2002 -0.899414 6.39941c-10.8008 -8.19922 -16.4004 -34.0996 -0.700195 -52.2998c-1.60059 0.5 -2.60059 0.700195 -3.60059 1.10059
c-21.2998 8.2998 -34.3994 28.2998 -33.5 51.1992c0.900391 23.2002 4.90039 41 -13 56c-16.5 13.8008 -33 27.4004 -49.5 41.1006c-8.09961 6.7002 -14.7998 14.5 -17 25.0996c-1 4.60059 -1.39941 9.40039 -1.7998 14.1006c-0.5 6.09961 -3.2998 11 -7.89941 14.7998
c-4.5 3.89941 -9.30078 7.39941 -13.8008 11.2002c-8.89941 7.5 -12.2998 18.8994 -7.2998 29.8994c2.7998 -12.8994 9.60059 -18.8994 22.6006 -20.2998c4.39941 -0.5 8.89941 -0.799805 13.2998 -1.5c8.09961 -1.2002 12.7998 -6.09961 14.2998 -14.2002
c0.700195 -3.39941 1.2998 -6.7998 2.2002 -10.2002c1.59961 -5.59961 4.5 -8 10.3994 -8.39941c4.60059 -0.299805 9.30078 -0.5 13.9004 -0.900391c7.59961 -0.599609 14.2002 -3.7998 20.0996 -8.7002c19.4004 -16.1992 39 -32.1992 58.5 -48.2998
c5.7002 -4.7002 12 -8.2002 19.6006 -8.5c16.7002 -0.599609 29 15.2002 24.7998 31.7998c-0.200195 0.700195 -0.400391 1.5 -0.0996094 2.80078c2.39941 -2 4.89941 -3.80078 7 -5.90039c14.0996 -14 18.0996 -39.2998 8.69922 -56.0996
c-2.09961 -3.80078 -5.2998 -7.10059 -8.09961 -10.8008c0.700195 -0.199219 1.7998 -0.5 3 -0.599609c14 -1.40039 27.2002 1 38.9004 9.09961c15.7998 10.9004 18 31.2002 5.39941 45.6006c-4.7002 5.39941 -8.89941 8 -18.7998 12
c6.5 1.2998 19.2002 0.200195 28.7002 -2.90039zM99.4004 268.7c-5.30078 9.2002 -13.2002 15.5996 -22.1006 21.2998c13.7002 0.5 26.6006 -0.200195 39.6006 -3.7002c-7 12.2002 -8.5 24.7002 -5 38.7002c5.2998 -11.9004 13.6992 -20.0996 23.5996 -26.7998
c19.7002 -13.2002 35.7002 -19.6006 46.7002 -30.2002c3.39941 -3.2998 6.2998 -7.09961 9.59961 -10.9004c-0.799805 2.10059 -1.39941 4.10059 -2.2002 6c-5 10.6006 -13 18.6006 -22.5996 25c-1.7998 1.2002 -2.7998 2.5 -3.40039 4.5
c-3.2998 12.5 -3 25.1006 -0.699219 37.6006c1 5.5 2.7998 10.8994 4.5 16.2998c0.799805 2.40039 2.2998 4.59961 4 6.59961c0.599609 -6.89941 0 -25.5 19.5996 -46c10.7998 -11.2998 22.4004 -21.8994 33.9004 -32.6992c9 -8.5 18.2998 -16.7002 25.5 -26.8008
c1.09961 -1.59961 2.19922 -3.2998 3.7998 -4.69922c-5 13 -14.2002 24.0996 -24.2002 33.7998c-9.59961 9.2998 -19.4004 18.3994 -29.2002 27.3994c-3.2998 3 -4.59961 6.7002 -5.09961 10.9004c-1.2002 10.4004 0 20.5996 4.2998 30.2002c0.5 1 1.09961 2 1.90039 3.2998
c0.5 -4.2002 0.599609 -7.90039 1.39941 -11.5996c4.7998 -23.1006 20.4004 -36.3008 49.2998 -63.5c10 -9.40039 19.3008 -19.2002 25.6006 -31.6006c4.7998 -9.2998 7.2998 -19 5.7002 -29.5996c-0.100586 -0.600586 0.5 -1.7002 1.09961 -2
c6.2002 -2.60059 10 -6.90039 9.7002 -14.2998c7.7002 2.59961 12.5 8 16.3994 14.5c4.2002 -20.2002 -9.09961 -50.3008 -27.1992 -58.7002c0.399414 4.5 5 23.3994 -16.5 27.7002c-6.80078 1.2998 -12.8008 1.2998 -22.9004 2.09961c4.7002 9 10.4004 20.5996 0.5 22.4004
c-24.9004 4.59961 -52.7998 -1.90039 -57.7998 -4.60059c8.2002 -0.399414 16.2998 -1 23.5 -3.2998c-2 -6.5 -4 -12.7002 -5.7998 -18.9004c-1.90039 -6.5 2.09961 -14.5996 9.2998 -9.59961c1.2002 0.900391 2.2998 1.90039 3.2998 2.7002
c-3.09961 -17.9004 -2.90039 -15.9004 -2.7998 -18.2998c0.299805 -10.2002 9.5 -7.80078 15.7002 -7.30078c-2.5 -11.7998 -29.5 -27.2998 -45.4004 -25.7998c7 4.7002 12.7002 10.2998 15.9004 17.9004c-6.5 -0.799805 -12.9004 -1.60059 -19.2002 -2.40039
l-0.299805 0.900391c4.69922 3.39941 8 7.7998 10.1992 13.0996c8.7002 21.1006 -3.59961 38 -25 39.9004c-9.09961 0.799805 -17.7998 -0.799805 -25.8994 -5.5c6.2002 15.5996 17.2002 26.5996 32.5996 34.5c-15.2002 4.2998 -8.89941 2.7002 -24.5996 6.2998
c14.5996 9.2998 30.2002 13.2002 46.5 14.5996c-5.2002 3.2002 -48.1006 3.60059 -70.2002 -20.8994c7.90039 -1.40039 15.5 -2.7998 23.2002 -4.2002c-23.7998 -7 -44 -19.7002 -62.4004 -35.5996c1.10059 4.7998 2.7002 9.5 3.2998 14.2998
c0.600586 4.5 0.800781 9.2002 0.100586 13.5996c-1.5 9.40039 -8.90039 15.1006 -19.7002 16.2998c-7.90039 0.900391 -15.5996 -0.0996094 -23.2998 -1.2998c-0.900391 -0.0996094 -1.7002 -0.299805 -2.90039 0c15.7998 14.7998 36 21.7002 53.1006 33.5
c6 4.5 6.7998 8.2002 3 14.9004zM227.8 241.9c3.2998 -16 12.6006 -25.5 23.7998 -24.3008c-4.59961 11.3008 -12.0996 19.5 -23.7998 24.3008z" />
    <glyph glyph-name="deploydog" unicode="&#xf38e;" horiz-adv-x="512" 
d="M382.2 312h51.7002v-239.6h-51.7002v20.6992c-19.7998 -24.7998 -52.7998 -24.0996 -73.7998 -14.6992c-26.2002 11.6992 -44.3008 38.0996 -44.3008 71.7998c0 29.7998 14.8008 57.8994 43.3008 70.7998c20.1992 9.09961 52.6992 10.5996 74.7998 -12.9004v103.9z
M317.5 150.2c0 -18.2002 13.5996 -33.5 33.2002 -33.5c19.7998 0 33.2002 16.3994 33.2002 32.8994c0 17.1006 -13.7002 33.2002 -33.2002 33.2002c-19.6006 0 -33.2002 -16.3994 -33.2002 -32.5996zM188.5 312h51.7002v-239.6h-51.7002v20.6992
c-19.7998 -24.7998 -52.7998 -24.0996 -73.7998 -14.6992c-26.2002 11.6992 -44.2998 38.0996 -44.2998 71.7998c0 29.7998 14.7998 57.8994 43.2998 70.7998c20.2002 9.09961 52.7002 10.5996 74.7998 -12.9004v103.9zM123.8 150.2c0 -18.2002 13.6006 -33.5 33.2002 -33.5
c19.7998 0 33.2002 16.3994 33.2002 32.8994c0 17.1006 -13.7002 33.2002 -33.2002 33.2002c-19.7002 0 -33.2002 -16.3994 -33.2002 -32.5996zM448 352h-384c-17.5996 0 -32 -14.5 -32 -32v-256c0 -17.5996 14.5 -32 32 -32h384c17.5996 0 32 14.5 32 32v256
c0 17.5996 -14.5 32 -32 32zM448 384c35.2002 0 64 -28.7998 64 -64v-256c0 -35.2002 -28.7998 -64 -64 -64h-384c-35.2002 0 -64 28.7998 -64 64v256c0 35.2002 28.7998 64 64 64h384z" />
    <glyph glyph-name="deskpro" unicode="&#xf38f;" horiz-adv-x="480" 
d="M205.9 -64l31.0996 38.4004c12.2998 0.199219 25.5996 1.39941 36.5 6.59961c38.9004 18.5996 38.4004 61.9004 38.2998 63.7998c-0.0996094 5 -0.799805 4.40039 -28.8994 37.4004h79.0996c-0.200195 -50.1006 -7.2998 -68.5 -10.2002 -75.7002
c-9.39941 -23.7002 -43.8994 -62.7998 -95.2002 -69.4004c-8.69922 -1.09961 -32.7998 -1.19922 -50.6992 -1.09961zM406.3 103.7l-119.2 -0.100586l17.4004 31.3008l175.5 -0.300781c-15.2002 -17.2998 -35.0996 -30.8994 -73.7002 -30.8994zM362.7 327.6v-168.3h-73.5
l-32.7002 -55.5h-6.5c-52.2998 0 -58.0996 56.5 -58.2998 58.9004c-1.2002 13.2002 -21.2998 11.5996 -20.1006 -1.7998c1.40039 -15.8008 8.80078 -40 26.4004 -57.1006h-91c-25.5 0 -110.8 26.7998 -107 114v213.3c0 16 9.7002 16.6006 15 16.8008h82
c0.200195 0 0.299805 -0.100586 0.5 -0.100586c4.2998 0.400391 50.0996 2.10059 50.0996 -43.7002c0 -13.2998 20.2002 -13.3994 20.2002 0c0 18.2002 -5.5 32.8008 -15.7998 43.7002h84.2002c108.7 0.400391 126.5 -79.3994 126.5 -120.2zM230.2 271.6l64 -29.2998
c13.2998 45.5 -42.2002 71.7002 -64 29.2998z" />
    <glyph glyph-name="digital-ocean" unicode="&#xf391;" horiz-adv-x="512" 
d="M87 -33.7998v73.5996h73.7002v-73.5996h-73.7002zM25.4004 101.4h61.5996v-61.6006h-61.5996v61.6006zM491.6 271.1c53.2002 -170.3 -73 -327.1 -235.6 -327.1v95.7998h0.299805v0.299805c101.7 0.200195 180.5 101 141.4 208
c-14.2998 39.6006 -46.1006 71.4004 -85.7998 85.7002c-107.101 38.7998 -208.101 -39.8994 -208.101 -141.7h-95.7998c0 162.2 156.9 288.7 327 235.601c74.2002 -23.2998 133.6 -82.4004 156.6 -156.601zM256.3 40.0996h-0.299805v-0.299805h-95.2998v95.6006h95.5996
v-95.3008z" />
    <glyph glyph-name="discord" unicode="&#xf392;" 
d="M297.216 204.8c0 -15.6162 -11.5195 -28.416 -26.1123 -28.416c-14.3359 0 -26.1113 12.7998 -26.1113 28.416s11.5195 28.416 26.1113 28.416c14.5928 0 26.1123 -12.7998 26.1123 -28.416zM177.664 233.216c14.5918 0 26.3682 -12.7998 26.1123 -28.416
c0 -15.6162 -11.5205 -28.416 -26.1123 -28.416c-14.3359 0 -26.1123 12.7998 -26.1123 28.416s11.5205 28.416 26.1123 28.416zM448 395.264v-459.264c-64.4941 56.9941 -43.8682 38.1279 -118.784 107.776l13.5684 -47.3604h-290.304
c-28.9287 0 -52.4805 23.5518 -52.4805 52.7363v346.111c0 29.1846 23.5518 52.7363 52.4805 52.7363h343.039c28.9287 0 52.4805 -23.5518 52.4805 -52.7363zM375.04 152.576c0 82.4316 -36.8643 149.248 -36.8643 149.248
c-36.8643 27.6475 -71.9355 26.8799 -71.9355 26.8799l-3.58398 -4.0957c43.5195 -13.3125 63.7441 -32.5127 63.7441 -32.5127c-60.8115 33.3291 -132.244 33.335 -191.232 7.42383c-9.47168 -4.35156 -15.1035 -7.42383 -15.1035 -7.42383
s21.2471 20.2246 67.3271 33.5361l-2.55957 3.07227s-35.0723 0.767578 -71.9355 -26.8799c0 0 -36.8643 -66.8164 -36.8643 -149.248c0 0 21.5039 -37.1201 78.0801 -38.9121c0 0 9.47168 11.5195 17.1514 21.248c-32.5117 9.72754 -44.7998 30.208 -44.7998 30.208
c3.7666 -2.63574 9.97656 -6.05273 10.4961 -6.40039c43.21 -24.1973 104.588 -32.126 159.744 -8.95996c8.95996 3.32812 18.9443 8.19238 29.4395 15.1045c0 0 -12.7998 -20.9922 -46.3359 -30.4639c7.68066 -9.72852 16.8965 -20.7363 16.8965 -20.7363
c56.5762 1.79199 78.3359 38.9121 78.3359 38.9121z" />
    <glyph glyph-name="discourse" unicode="&#xf393;" 
d="M225.9 416c122.699 0 222.1 -102.3 222.1 -223.9c0 -121.6 -99.4004 -223.899 -222.1 -223.899l-225.801 -0.200195s-0.0996094 224 -0.0996094 227.9c0 121.6 103.3 220.1 225.9 220.1zM224 64c70.7002 0 128 57.2998 128 128s-57.2998 128 -128 128
s-128 -57.2998 -128 -128c0 -22.0996 5.59961 -42.9004 15.4004 -61l-22.9004 -75l81.0996 20.0996c16.5 -7.7998 35 -12.0996 54.4004 -12.0996z" />
    <glyph glyph-name="dochub" unicode="&#xf394;" horiz-adv-x="416" 
d="M397.9 288h-141.9v140.4zM304 256h96v-126.1c0 -129.301 -70.2998 -193.9 -210.8 -193.9h-189.2v512h189.2c12.2002 0 23.7002 -1.09961 34.5996 -3.2998v-84c-10 1.7002 -21.0996 2.5 -33.0996 2.5h-94.7002v-337.3h94.7002c76.7998 0 113.3 33.2998 113.3 100.1v130z
" />
    <glyph glyph-name="docker" unicode="&#xf395;" horiz-adv-x="640" 
d="M349.9 211.7h-66.1006v59.3994h66.1006v-59.3994zM349.9 416v-60.7002h-66.1006v60.7002h66.1006zM428.1 271.2v-59.4004h-66.0996v59.4004h66.0996zM271.8 343.3v-60.0996h-66.0996v60.0996h66.0996zM349.9 343.3v-60.0996h-66.1006v60.0996h66.1006zM626.7 243.3
l13.2998 -8.89941c-1.90039 -3.90039 -7 -14.6006 -8.5 -17.1006c-23.7002 -45.2998 -69.9004 -45.5996 -91.2998 -45.2002c-54.5 -131.699 -171 -204.199 -328.4 -204.199c-72.7002 0 -128.3 22.2998 -165.399 66.1992c-38.2002 45.3008 -52.7002 111.301 -44 162.101
h434.699c22.6006 -0.400391 39.7002 6 48.4004 10.7002c-19.7002 30.1992 -14.7002 76 3.7002 103.8l9.2998 14l14 -9.2998c24.4004 -18.8008 37.7998 -39.7002 41.0996 -63.7002c25.5 4.7998 58.7002 1.2998 73.1006 -8.40039zM115.6 271.2h0.100586v-59.4004h-66.1006
v59.4004h66zM193.7 271.2v-59.4004h-66.1006v59.4004h66.1006zM271.8 271.2v-59.4004h-66.0996v59.4004h66.0996zM193.7 343.3v-60.0996h-66.1006v60.0996h66.1006z" />
    <glyph glyph-name="draft2digital" unicode="&#xf396;" horiz-adv-x="480" 
d="M480 49.9004l-144 -81.9004v64.2002l-336 -0.100586c18.2998 19.1006 84.5 87.8008 161.1 174.801c32.6006 37.1992 78 83.2998 69.7002 127.6c-5.2998 28.2998 -42.2002 50.7998 -83.2998 33.5c-8.59961 -3.59961 -24.5 -17.4004 -26.2998 -24.7002
c28.2998 -4.7002 48 -29.7002 48 -56.7998c0 -31.7002 -25.6006 -57.4004 -57.2998 -57.4004c-37.3008 0 -62.2002 34.1006 -56.7002 67.1006c1.2002 7.89941 5.09961 26.7998 18.2002 47.7002c14.8994 23.8994 45.1992 54.8994 104.3 67.2998
c103.8 21.7002 161.6 -36.6006 166 -41.2002c28.8994 -29.9004 48 -90.7002 12.7998 -153.3c-30 -53.4004 -81 -114.3 -111.8 -149.3h91.2998v64.6992zM369.9 77v-54.4004l47.0996 27.2002zM134.2 286.6c0 12.3008 -10 22.4004 -22.4004 22.4004
c-12.3994 0 -22.3994 -10 -22.3994 -22.4004c0 -12.3994 10 -22.3994 22.3994 -22.3994c12.4004 0 22.4004 10 22.4004 22.3994zM82.5 67.5h114.4c17.5996 19.2002 91.5 100.8 128.5 166.7c36.5996 65.0996 -5.80078 113.3 -5.80078 113.3
c-14.1992 14.9004 -36.8994 36.2002 -82.1992 38.2998c6.7998 -5.5 16.8994 -16.8994 24.2998 -35.7002c11.8994 -30.2998 6.7002 -69.5996 -28.4004 -112.699c-53.0996 -65.2002 -125.2 -142.5 -150.8 -169.9z" />
    <glyph glyph-name="dribbble-square" unicode="&#xf397;" 
d="M90.2002 219.8c8.89941 42.4004 37.3994 77.7002 75.7002 95.7002c3.59961 -4.90039 28 -38.7998 50.6992 -79c-64 -17 -120.3 -16.7998 -126.399 -16.7002zM314.6 294c-2.5 -3.5 -23 -31.0996 -71.5996 -49.4004c-22.4004 41.1006 -47.2002 74.9004 -51 80
c43.2998 10.5 89 -0.799805 122.6 -30.5996zM140.1 84c14.3008 29.2002 53 66.7998 108.101 85.5996c19.2002 -49.7998 27.2002 -91.5996 29.2002 -103.6c-44 -18.7002 -96.8008 -13.5996 -137.301 18zM238.9 192.2c-49.4004 -13.9004 -94.3008 -53.9004 -116.5 -91.7998
c-21.8008 24.2998 -35.1006 56.2998 -35.1006 91.3994c0 1.40039 0.100586 2.7998 0.100586 4.2002c6 -0.200195 72.1992 -1 140.399 19.4004c3.90039 -7.7002 7.7002 -15.4004 11.1006 -23.2002zM273.8 175.9c42.7998 6.89941 80.5 -4.30078 85.1006 -5.80078
c-6.10059 -38 -27.9004 -70.8994 -58.6006 -91.5996c-1.39941 8.2998 -8.59961 48.2998 -26.5 97.4004zM253.5 224.3c50.5 20.7002 73.4004 50 76.2998 53.9004c19.1006 -23.2002 30.6006 -52.7998 30.9004 -85.1006c-4.5 1 -49.7002 10.1006 -95.2002 4.40039
c-3.7002 9 -7.2002 17 -12 26.7998zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM384 192c0 88.2002 -71.7998 160 -160 160s-160 -71.7998 -160 -160s71.7998 -160 160 -160
s160 71.7998 160 160z" />
    <glyph glyph-name="dyalog" unicode="&#xf399;" horiz-adv-x="416" 
d="M0 416h171.2c74.5 0 137.7 -24 182.5 -69.5996c40.2002 -40.9004 62.2998 -95.6006 62.2998 -154.301c0 -111.399 -84.0996 -224.1 -244.8 -224.1h-171.2v64h171.2c122.2 0 180.8 84 180.8 160.1c0 79.7002 -67.4004 159.9 -180.8 159.9h-107.2v-55.2002h-64v119.2z" />
    <glyph glyph-name="earlybirds" unicode="&#xf39a;" horiz-adv-x="480" 
d="M313.2 400.5c1.2002 13 21.2998 14 36.5996 8.7002c0.900391 -0.299805 26.2002 -9.7002 19 -15.2002c-27.8994 7.40039 -56.3994 -18.2002 -55.5996 6.5zM112.2 393.6c-7.7998 6.2002 19.8994 16.4004 20.8994 16.7002c16.8008 5.7002 38.9004 4.60059 40.2002 -9.59961
c0.900391 -27.1006 -30.3994 1 -61.0996 -7.10059zM319.4 288c8.7998 0 16 -7.2002 16 -16s-7.2002 -16 -16 -16c-8.80078 0 -16 7.2002 -16 16s7.19922 16 16 16zM159.7 288c8.7998 0 16 -7.2002 16 -16s-7.2002 -16 -16 -16s-16 7.2002 -16 16s7.2002 16 16 16z
M478.2 124.8c-9.90039 -24 -40.7002 -11 -63.9004 1.2002c-13.5 -69.0996 -58.0996 -111.4 -126.3 -124.2c0.299805 -0.899414 -2 0.100586 24 -1c33.5996 -1.39941 63.7998 3.10059 97.4004 8c-19.8008 13.7998 -11.4004 37.1006 -9.80078 38.1006
c1.40039 0.899414 14.7002 -1.7002 21.6006 -11.5c8.59961 12.5 28.3994 14.7998 30.2002 13.5996c1.59961 -1.09961 6.59961 -20.9004 -6.90039 -34.5996c4.7002 0.899414 8.2002 1.59961 9.7998 2.09961c2.60059 0.799805 17.7002 -11.2998 3.10059 -13.2998
c-14.3008 -2.2998 -22.6006 -5.10059 -47.1006 -10.7998c-45.8994 -10.7002 -85.8994 -11.8008 -117.7 -12.8008l1 -11.5996c3.80078 -18.0996 -23.3994 -24.2998 -27.5996 -6.2002c0.799805 -17.8994 -27.0996 -21.7998 -28.4004 1l-0.5 -5.2998
c-0.699219 -18.4004 -28.3994 -17.9004 -28.2998 0.599609c-7.5 -13.5 -28.0996 -6.7998 -26.3994 8.5l1.19922 12.4004c-36.6992 -0.900391 -59.6992 -3.09961 -61.7998 -3.09961c-20.8994 0 -20.8994 31.5996 0 31.5996c2.40039 0 27.7002 -1.2998 63.2002 -2.7998
c-61.0996 15.5 -103.7 55 -114.9 118.2c-25 -12.8008 -57.5 -26.8008 -68.1992 -0.800781c-10.5 25.4004 21.5 42.6006 66.7998 73.4004c0.700195 6.59961 1.59961 13.2998 2.7002 19.7998c-14.4004 19.6006 -11.6006 36.2998 -16.1006 60.4004
c-16.7998 -2.40039 -23.2002 9.09961 -23.5996 23.0996c0.299805 7.2998 2.09961 14.9004 2.39941 15.4004c1.10059 1.7998 10.1006 2 12.7002 2.59961c6 31.7002 50.6006 33.2002 90.9004 34.5c19.7002 21.7998 45.2002 41.5 80.8994 48.2998
c-15.2998 19.4004 -3.39941 39.9004 -2.39941 40.4004c1.7002 0.799805 21.2002 -4.2998 26.2998 -23.2002c5.2002 8.7998 18.2998 11.4004 19.5996 10.7002c1.10059 -0.599609 6.40039 -15 -4.89941 -25.9004c40.2998 -3.5 72.2002 -24.6992 96 -50.6992
c36.0996 -1.5 71.7998 -5.90039 77.0996 -34c2.7002 -0.600586 11.6006 -0.800781 12.7002 -2.60059c0.299805 -0.5 2.09961 -8.09961 2.40039 -15.3994c-0.5 -13.9004 -6.80078 -25.4004 -23.6006 -23.1006c-3.2002 -17.2998 -2.7002 -32.8994 -8.7002 -47.7002
c2.40039 -11.6992 4 -23.7998 4.80078 -36.3994c37 -25.4004 70.2998 -42.5 60.2998 -66.9004zM207.4 288.1c0.899414 44 -37.9004 42.2002 -78.6006 40.3008c-21.7002 -1 -38.8994 -1.90039 -45.5 -13.9004c-11.3994 -20.9004 5.90039 -92.9004 23.2002 -101.2
c9.7998 -4.7002 73.4004 -7.89941 86.2998 7.10059c8.2002 9.39941 15 49.3994 14.6006 67.6992zM259.4 229.8c-4.30078 12.4004 -6 30.1006 -15.3008 32.7002c-2 0.5 -9 0.5 -11 0c-10 -2.7998 -10.7998 -22.0996 -17 -37.2002c15.4004 0 19.3008 -9.7002 23.7002 -9.7002
c4.2998 0 6.2998 11.3008 19.6006 14.2002zM395.1 314.5c-6.59961 12.0996 -24.7998 12.9004 -46.5 13.9004c-40.1992 1.89941 -78.1992 3.7998 -77.2998 -40.3008c-0.5 -18.2998 5 -58.2998 13.2002 -67.7998c13 -14.8994 76.5996 -11.7998 86.2998 -7.09961
c15.7998 7.59961 36.5 78.8994 24.2998 101.3z" />
    <glyph glyph-name="erlang" unicode="&#xf39d;" horiz-adv-x="640" 
d="M87.2002 394.5c-41.5 -50.2002 -65.6006 -116.2 -65.5 -192.9c-0.100586 -86.7998 29 -159.5 78.7002 -212.1h-100.4v405h87.2002zM325.4 384.8c46.1992 -0.0996094 79.5996 -33.5 80.6992 -83.2002h-169.899c4.09961 49.7002 43.2998 83.1006 89.2002 83.2002z
M556.1 394.4h0.300781l-0.100586 0.0996094zM556.4 394.4h83.5996v-405h-80.7998c21.3994 23 40.5 49.8994 57.8994 80.7998l-96.3994 48.2002c-33.9004 -55.1006 -83.4004 -105.801 -151.9 -106.101c-99.7002 0.400391 -138.8 85.6006 -138.6 195.3h372.399
c0.5 12.4004 0.5 18.1006 0 24.1006c2.5 65.2002 -14.7998 120 -46.1992 162.7z" />
    <glyph glyph-name="facebook-f" unicode="&#xf39e;" horiz-adv-x="320" 
d="M279.14 160h-74.6895v-224h-100.17v224h-81.3906v92.6602h81.3906v70.6201c0 80.3398 47.8594 124.72 121.08 124.72c35.0693 0 71.75 -6.25977 71.75 -6.25977v-78.8906h-40.4199c-39.8203 0 -52.2402 -24.71 -52.2402 -50.0596v-60.1299h88.9102z" />
    <glyph glyph-name="facebook-messenger" unicode="&#xf39f;" horiz-adv-x="512" 
d="M256.55 440c140.04 0 247.45 -102.34 247.45 -240.57c0 -175.13 -166.15 -273.229 -319.44 -231.04c-8.96973 2.44043 -9.64941 0.600586 -62.5596 -22.6992c-2.10449 -0.918945 -5.67578 -1.66504 -7.97168 -1.66504c-10.624 0 -19.543 8.61719 -19.9082 19.2344
c-1.41992 46.3701 0.299805 50.7207 -8.0498 58.2305c-48.3604 43.1602 -78.0703 105.64 -78.0703 177.939c0 138.23 108.52 240.57 248.55 240.57zM405.79 254.87c7.0498 11.0801 -6.65039 23.5996 -17.0898 15.6201l-78.4102 -59.3799
c-2.20801 -1.65625 -6.24023 -3 -9 -3s-6.79199 1.34375 -9 3l-58.0596 43.46c-5.48926 4.09961 -15.5049 7.42676 -22.3564 7.42676c-11.3438 0 -25.4805 -7.77637 -31.5537 -17.3574l-73 -115.569c-7.05078 -11.0703 6.64941 -23.6006 17.1094 -15.6699l78.3701 59.4395
c2.20801 1.65625 6.24023 3 9 3s6.79199 -1.34375 9 -3l58.0801 -43.4697c5.48926 -4.09766 15.5039 -7.42285 22.3535 -7.42285c11.3428 0 25.4805 7.77441 31.5566 17.3525z" />
    <glyph glyph-name="firstdraft" unicode="&#xf3a1;" horiz-adv-x="384" 
d="M384 256h-64v-128h-128v-128h-192v25.5996h166.4v128h128v128h89.5996v-25.5996zM358.4 217.6h25.5996v-153.6h-128v-128h-192v25.5996h166.4v128h128v128zM384 25.5996v-25.5996h-64v-64h-25.5996v89.5996h89.5996zM0 448h384v-128h-128v-128h-128v-128h-128v384z" />
    <glyph glyph-name="fonticons-fi" unicode="&#xf3a2;" horiz-adv-x="384" 
d="M114.4 224h92.3994l-15.2002 -51.2002h-76.3994v-157.8c0 -8 -2.7998 -9.2002 4.39941 -10l59.6006 -5.59961v-34.4004h-179.2v35.2002l29.2002 2.7998c7.2002 0.799805 9.2002 3.2002 9.2002 10.7998v155.8c0 3.2002 -4 3.2002 -8 3.2002h-30.4004v51.2002h38.4004
v28.7998c0 68 36.3994 96 106 96c46.7998 0 88.7998 -11.2002 88.7998 -72.3994l-69.6006 -8.40039c0.400391 25.5996 -6 31.5996 -22.3994 31.5996c-25.2002 0 -26 -13.5996 -26 -37.5996v-32c0 -3.2002 -4.7998 -6 -0.799805 -6zM384 -35h-140.8v34.4004l28 3.59961
c7.2002 0.799805 10.3994 2.40039 10.3994 10v148c0 5.59961 -4 9.2002 -9.19922 10.7998l-33.2002 8.7998l9.2002 40.4004h110v-208c0 -8 -3.60059 -8.7998 4 -10l21.5996 -3.59961v-34.4004zM354 312.2l12.4004 -45.6006l-10 -10l-42.8008 22.8008l-42.7998 -22.8008
l-10 10l12.4004 45.6006l-30 36.3994l4.7998 10h38l21.2002 38.4004h12.7998l21.2002 -38.4004h38l4.7998 -13.1992z" />
    <glyph glyph-name="fort-awesome-alt" unicode="&#xf3a3;" horiz-adv-x="512" 
d="M208 210.6c2.09961 0 3.7002 -1.59961 3.7002 -3.69922v-51.7002c0 -2.10059 -1.60059 -3.7002 -3.7002 -3.7002h-22.2002c-2.09961 0 -3.7002 1.59961 -3.7002 3.7002v51.7002c0 2.09961 1.60059 3.69922 3.7002 3.69922h22.2002zM326.2 210.6
c2 0 3.59961 -1.59961 3.7002 -3.69922v-51.7002c0 -2.10059 -1.60059 -3.7002 -3.7002 -3.7002h-22.2002c-2.09961 0 -3.7002 1.59961 -3.7002 3.7002v51.7002c0 2.09961 1.60059 3.69922 3.7002 3.69922h22.2002zM458.2 335.7
c28.8994 -40.7002 45.7998 -90.2002 45.7998 -143.7c0 -2 0 -4 -0.0996094 -6c0 -0.700195 0 -1.2998 -0.100586 -2c0 -1.2998 -0.0996094 -2.7002 -0.200195 -4c0 -0.799805 -0.0996094 -1.5 -0.0996094 -2.2998
c-0.0996094 -1.2002 -0.0996094 -2.40039 -0.200195 -0.700195c-0.0996094 -0.799805 -0.0996094 -1.59961 -0.200195 -2.40039c-0.0996094 -1.19922 -0.199219 -2.39941 -0.299805 -3.5c-0.0996094 -0.799805 -0.200195 -1.59961 -0.200195 -2.39941
c-0.0996094 -1.2002 -0.299805 -2.40039 -0.399414 -3.60059c-0.100586 -0.799805 -0.200195 -1.5 -0.299805 -2.2998c-0.200195 -1.2998 -0.400391 -2.59961 -0.5 -3.89941c-0.100586 -0.600586 -0.200195 -1.30078 -0.300781 -1.90039l-0.899414 -5.7002
c-0.100586 -0.599609 -0.200195 -1.09961 -0.299805 -1.7002c-0.200195 -1.2998 -0.5 -2.69922 -0.800781 -4c-0.199219 -0.799805 -0.299805 -1.59961 -0.5 -2.39941c-0.199219 -1.10059 -0.5 -2.2002 -0.699219 -3.2002
c-0.200195 -0.900391 -0.400391 -1.7002 -0.600586 -2.59961c-0.200195 -1 -0.5 -2 -0.700195 -3c-0.199219 -0.900391 -0.5 -1.80078 -0.699219 -2.7002c-0.300781 -1 -0.5 -1.90039 -0.800781 -2.90039c-0.199219 -0.899414 -0.5 -1.7998 -0.799805 -2.7002
c-0.299805 -0.899414 -0.599609 -1.89941 -0.799805 -2.7998c-0.299805 -0.899414 -0.5 -1.7998 -0.799805 -2.7002c-0.299805 -0.899414 -0.600586 -1.7998 -0.900391 -2.7998c-0.5 -1.59961 -1.09961 -3.2998 -1.7002 -4.89941
c-0.299805 -0.900391 -0.599609 -1.80078 -1 -2.80078c-0.399414 -1 -0.699219 -2 -1.09961 -3c-0.299805 -0.799805 -0.599609 -1.5 -0.900391 -2.2998l-1.19922 -3c-0.300781 -0.700195 -0.600586 -1.5 -0.900391 -2.2002c-0.400391 -1 -0.799805 -2 -1.2998 -3
l-0.900391 -2.09961c-0.399414 -1 -0.899414 -2 -1.39941 -3c-0.300781 -0.700195 -0.600586 -1.2998 -0.900391 -2c-0.5 -1 -1 -2.09961 -1.5 -3.09961c-0.299805 -0.600586 -0.599609 -1.10059 -0.799805 -1.7002c-0.600586 -1.10059 -1.10059 -2.2002 -1.7002 -3.2998
c-0.0996094 -0.200195 -0.200195 -0.300781 -0.299805 -0.5c-2.2002 -4.10059 -4.40039 -8.2002 -6.7998 -12.2002c-0.200195 -0.400391 -0.5 -0.799805 -0.700195 -1.2002c-0.700195 -1.09961 -1.2998 -2.2002 -2 -3.2998
c-0.299805 -0.5 -0.600586 -0.900391 -0.900391 -1.40039c-0.700195 -1.09961 -1.39941 -2.09961 -2 -3.2002c-0.299805 -0.5 -0.599609 -0.899414 -0.899414 -1.39941c-0.700195 -1.10059 -1.40039 -2.10059 -2.10059 -3.2002
c-0.299805 -0.400391 -0.599609 -0.799805 -0.799805 -1.2002c-0.799805 -1.09961 -1.5 -2.2002 -2.2998 -3.2998c-0.200195 -0.200195 -0.299805 -0.5 -0.5 -0.700195c-37.6006 -54.7002 -94.5 -91.3994 -160.101 -102.399
c-0.899414 -0.100586 -1.69922 -0.300781 -2.59961 -0.400391c-1 -0.200195 -2.09961 -0.299805 -3.09961 -0.5c-0.900391 -0.0996094 -1.80078 -0.299805 -2.80078 -0.400391c-1 -0.0996094 -2 -0.299805 -3 -0.399414c-1 -0.100586 -2 -0.200195 -2.89941 -0.299805
c-1 -0.100586 -1.90039 -0.200195 -2.90039 -0.300781c-1 -0.0996094 -2.09961 -0.199219 -3.09961 -0.299805c-0.900391 -0.0996094 -1.7998 -0.200195 -2.7002 -0.200195c-1.09961 -0.0996094 -2.2998 -0.0996094 -3.40039 -0.199219
c-0.799805 0 -1.69922 -0.100586 -2.5 -0.100586c-1.2998 -0.0996094 -2.59961 -0.0996094 -3.89941 -0.0996094c-0.700195 0 -1.40039 -0.100586 -2.10059 -0.100586c-2 0 -4 -0.0996094 -6 -0.0996094s-4 0 -6 0.0996094c-0.699219 0 -1.39941 0 -2.09961 0.100586
c-1.2998 0 -2.59961 0.0996094 -3.90039 0.0996094c-0.799805 0 -1.69922 0.100586 -2.5 0.100586c-1.09961 0.0996094 -2.2998 0.0996094 -3.39941 0.199219c-0.900391 0.100586 -1.7998 0.100586 -2.7002 0.200195c-1 0.100586 -2.09961 0.200195 -3.09961 0.299805
c-1 0.100586 -1.90039 0.200195 -2.90039 0.300781c-1 0.0996094 -2 0.199219 -2.90039 0.299805c-1 0.0996094 -2 0.200195 -3 0.399414c-0.899414 0.100586 -1.7998 0.300781 -2.7998 0.400391s-2.09961 0.299805 -3.09961 0.5
c-0.900391 0.0996094 -1.7002 0.299805 -2.60059 0.400391c-65.5996 10.8994 -122.5 47.6992 -160 99.3994c-0.199219 0.200195 -0.299805 0.5 -0.5 0.700195c-0.799805 1.09961 -1.59961 2.2002 -2.2998 3.2998c-0.299805 0.400391 -0.599609 0.799805 -0.799805 1.2002
c-0.700195 1.09961 -1.40039 2.09961 -2.09961 3.2002c-0.300781 0.5 -0.600586 0.899414 -0.900391 1.39941c-0.700195 1.10059 -1.40039 2.10059 -2 3.2002c-0.299805 0.5 -0.599609 0.900391 -0.900391 1.40039c-0.699219 1.09961 -1.2998 2.2002 -2 3.2998
c-0.199219 0.400391 -0.5 0.799805 -0.699219 1.2002c-2.40039 4 -4.60059 8.09961 -6.80078 12.2002c-0.0996094 0.199219 -0.199219 0.299805 -0.299805 0.5c-0.599609 1.09961 -1.09961 2.19922 -1.7002 3.2998c-0.299805 0.599609 -0.599609 1.09961 -0.799805 1.7002
c-0.5 1 -1 2.09961 -1.5 3.09961c-0.299805 0.700195 -0.599609 1.2998 -0.899414 2c-0.5 1 -0.900391 2 -1.40039 3l-0.900391 2.09961c-0.399414 1 -0.899414 2 -1.2998 3c-0.299805 0.700195 -0.599609 1.5 -0.899414 2.2002l-1.2002 3
c-0.299805 0.799805 -0.600586 1.5 -0.900391 2.2998c-0.399414 1 -0.799805 2 -1.09961 3c-0.299805 0.900391 -0.600586 1.80078 -1 2.80078c-0.600586 1.59961 -1.10059 3.2998 -1.7002 4.89941c-0.299805 0.900391 -0.599609 1.7998 -0.900391 2.7998
c-0.299805 0.900391 -0.5 1.80078 -0.799805 2.7002c-0.299805 0.900391 -0.599609 1.90039 -0.799805 2.7998c-0.299805 0.900391 -0.5 1.80078 -0.799805 2.7002c-0.299805 1 -0.5 1.90039 -0.799805 2.90039c-0.200195 0.899414 -0.5 1.7998 -0.700195 2.7002
c-0.299805 1 -0.5 2 -0.700195 3c-0.200195 0.899414 -0.400391 1.69922 -0.599609 2.59961c-0.200195 1.09961 -0.5 2.2002 -0.700195 3.2002c-0.200195 0.799805 -0.299805 1.59961 -0.5 2.39941c-0.299805 1.30078 -0.5 2.7002 -0.799805 4
c-0.100586 0.600586 -0.200195 1.10059 -0.300781 1.7002l-0.899414 5.7002c-0.100586 0.599609 -0.200195 1.2998 -0.299805 1.90039c-0.200195 1.2998 -0.400391 2.59961 -0.5 3.89941c-0.100586 0.799805 -0.200195 1.5 -0.300781 2.2998
c-0.0996094 1.2002 -0.299805 2.40039 -0.399414 3.60059c-0.100586 0.799805 -0.200195 1.59961 -0.200195 2.39941c-0.0996094 1.2002 -0.200195 2.40039 -0.299805 3.5c-0.100586 0.800781 -0.100586 1.60059 -0.200195 2.40039
c-0.0996094 1.2002 -0.200195 2.40039 -0.200195 3.7002c0 0.799805 -0.0996094 1.5 -0.0996094 2.2998c-0.100586 1.2998 -0.100586 2.7002 -0.200195 4c0 0.700195 0 1.2998 -0.0996094 2c0 2 -0.100586 4 -0.100586 6c0 53.5 16.9004 103 45.7998 143.6
c2.30078 3.2002 4.7002 6.40039 7.10059 9.5c4.89941 6.2002 10.0996 12.3008 15.5996 18c2.7002 2.90039 5.5 5.7002 8.40039 8.40039c2.89941 2.7002 5.7998 5.40039 8.7998 8c4.5 3.90039 9.09961 7.59961 13.9004 11.2002c1.59961 1.2002 3.19922 2.39941 4.7998 3.5
c27.2998 19.5996 59 33.7002 93.2998 40.7998c16.0996 3.2998 32.9004 5 50 5s33.7998 -1.7002 50 -5c34.2998 -7 66 -21.0996 93.5996 -40.7002c1.60059 -1.2002 3.2002 -2.2998 4.80078 -3.5c4.7998 -3.59961 9.39941 -7.2998 13.8994 -11.2002
c12 -10.3994 23 -21.8994 32.7998 -34.3994c2.5 -3.10059 4.80078 -6.2998 7.10059 -9.5zM448 76.5v71.2998c0 2.10059 -1.59961 3.7002 -3.7002 3.7002h-22.2002c-2.09961 0 -3.69922 -1.59961 -3.69922 -3.7002v-25.7998h-29.5v144
c0 2.09961 -1.60059 3.7002 -3.7002 3.7002h-22.1006c-2.09961 0 -3.69922 -1.60059 -3.69922 -3.7002v-25.9004h-29.5v25.9004c0 2.09961 -1.60059 3.7002 -3.7002 3.7002h-22.2002c-2.09961 0 -3.7002 -1.60059 -3.7002 -3.7002v-25.9004h-29.5v25.9004
c0 4.7998 -6.5 3.7002 -9.5 3.7002v30.7002c6.7002 1.59961 13.7998 2.7998 20.7998 2.7998c8.80078 0 16.8008 -3.5 25.4004 -3.5c3.7002 0 22.4004 0.899414 22.4004 6.5v48.3994c0 2.10059 -1.60059 3.7002 -3.7002 3.7002c-4.2002 0 -12.2002 -3.5 -19.4004 -3.5
c-7.89941 0 -16.8994 3.5 -26.2998 3.5c-6.5 0 -12.9004 -0.899414 -19.2002 -2.2998v3.90039c4.40039 2.09961 7.40039 6.69922 7.40039 11.5c0 16.7998 -25.4004 16.7998 -25.4004 0c0 -4.80078 3 -9.5 7.40039 -11.5v-90.2002c-3 0 -9.5 1.09961 -9.5 -3.7002v-25.9004
h-29.5v25.9004c0 2.09961 -1.60059 3.7002 -3.7002 3.7002h-22.2002c-2.09961 0 -3.7002 -1.60059 -3.7002 -3.7002v-25.9004h-29.5v25.9004c0 2.09961 -1.59961 3.7002 -3.69922 3.7002h-22.1006c-2.09961 0 -3.7002 -1.60059 -3.7002 -3.7002v-144h-29.5996v25.7998
c0 2.10059 -1.59961 3.7002 -3.7002 3.7002h-22.0996c-2.10059 0 -3.7002 -1.59961 -3.7002 -3.7002v-71.2998c9.40039 -15.5 20.5996 -29.9004 33.5996 -42.9004c20.6006 -20.5996 44.5 -36.6992 71.2002 -48c13.9004 -5.89941 28.2002 -10.2998 42.9004 -13.1992v75.7998
c0 58.5996 88.5996 58.5996 88.5996 0v-75.7998c14.7002 2.89941 29 7.39941 42.9004 13.1992c26.7002 11.3008 50.5996 27.4004 71.2002 48c13 13 24.1992 27.4004 33.5996 42.9004z" />
    <glyph glyph-name="freebsd" unicode="&#xf3a4;" 
d="M303.7 351.8c11.0996 11.1006 115.5 77 139.2 53.2002c23.6992 -23.7002 -42.1006 -128.1 -53.2002 -139.2c-11.1006 -11.0996 -39.4004 -0.899414 -63.1006 22.9004c-23.7998 23.7002 -34.0996 52 -22.8994 63.0996zM109.9 379.9
c-31.6006 -19.4004 -57.9004 -46.5 -76.4004 -78.7002c-20.7998 36.2998 -44.5 89.0996 -27.9004 105.7c16.4004 16.5 68 -6.40039 104.301 -27zM406.7 274c3.2998 5.5 7 11.7998 10.8994 18.7998c17.6006 -31.2998 27.7002 -67.3994 27.7002 -105.8
c0 -119.1 -96.5 -215.6 -215.6 -215.6c-119.101 0 -215.601 96.5996 -215.601 215.6c0 119.1 96.5 215.6 215.601 215.6c35.8994 0 69.7002 -8.7998 99.5 -24.2998c-7.2998 -4 -13.9004 -8 -19.6006 -11.5996c-26 4.7002 -32.8994 -16.4004 -14.8994 -48.7002
c21.7998 -43.0996 89 -90.4004 109.3 -70.0996c5.40039 5.39941 6 14.7998 2.7002 26.0996z" />
    <glyph glyph-name="gitkraken" unicode="&#xf3a6;" horiz-adv-x="592" 
d="M565.7 329.9c11.7998 -31.6006 18.2998 -65.7002 18.2998 -101.4c0 -155.1 -122.6 -281.6 -276.3 -287.7v145.8c-8.40039 -0.5 -16.6006 -0.399414 -23.4004 0v-145.899c-153.7 6.2002 -276.3 132.7 -276.3 287.8c0 35.7002 6.5 69.7998 18.2998 101.3
c2.2998 6.2002 9.2998 9.2002 15.2998 6.60059c5.7002 -2.40039 8.5 -8.80078 6.30078 -14.6006c-10.9004 -29 -16.9004 -60.5 -16.9004 -93.2998c0 -134.6 100.4 -245.7 230.2 -262.7v123.7c-7.90039 1.59961 -15.4004 3.7002 -23 6.2002v-104
c-106.7 26 -185.9 122.1 -185.9 236.8c0 91.7998 50.7998 171.8 125.8 213.3c5.80078 3.2002 13 0.900391 15.9004 -5c2.7002 -5.5 0.700195 -12.0996 -4.7002 -15.0996c-67.8994 -37.7002 -113.899 -110.101 -113.899 -193.2c0 -93.4004 57.8994 -173.2 139.8 -205.4
v92.2002c-14.2002 4.5 -24.7998 17.7002 -24.7998 33.5c0 13.1006 6.69922 24.4004 17.2998 30.5c-8.2002 79.6006 -44.5 58.6006 -44.5 83.9004v14.7998c0 38 87.8994 161.7 129.1 164.7c2.60059 0.200195 5.10059 0.200195 7.60059 0
c41.0996 -2.90039 129 -126.7 129 -164.7v-14.7002c0 -25.2998 -36.2002 -4.39941 -44.5 -83.8994c10.5 -6.10059 17.2998 -17.4004 17.2998 -30.5c0 -15.8008 -10.7002 -29 -24.9004 -33.5v-92.2002c81.9004 32.2998 139.8 112.1 139.8 205.399
c0 83.2002 -46 155.601 -113.899 193.2c-5.2998 2.90039 -7.40039 9.60059 -4.7002 15.1006c2.90039 5.89941 10.2002 8.19922 15.9004 5c75 -41.5 125.8 -121.5 125.8 -213.301c0 -114.699 -79.2002 -210.899 -185.9 -236.8v104
c-7.5 -2.59961 -15.0996 -4.7002 -23 -6.2002v-123.699c129.9 17 230.2 128.1 230.2 262.699c0 32.8008 -6 64.3008 -16.9004 93.3008c-2.19922 5.69922 0.600586 12.1992 6.30078 14.5996c6 2.59961 13 -0.5 15.2998 -6.59961zM365.9 172.5
c-13.1006 0 -23.7002 -10.5996 -23.7002 -23.7002c0 -13.2002 10.7002 -23.7002 23.7002 -23.7002c13.0996 0 23.6992 10.6006 23.6992 23.7002c0 13.2002 -10.6992 23.7002 -23.6992 23.7002zM226.1 125.2c13.2002 0 23.7002 10.7002 23.7002 23.7002
c0 13.0996 -10.5996 23.6992 -23.7002 23.6992c-13.1992 0 -23.6992 -10.6992 -23.6992 -23.6992s10.5 -23.7002 23.6992 -23.7002z" />
    <glyph glyph-name="gofore" unicode="&#xf3a7;" horiz-adv-x="400" 
d="M324 128.2c54.2998 0 65.7002 -50.1006 67.7002 -77.7002c-46.5 -56.2998 -107.8 -82.5 -171 -82.5c-123.7 0 -220.7 101.5 -220.7 224c0 123.4 98 224 220.7 224c59 0 114.3 -23.2998 156.1 -65.5996l-62.2998 -63.3008c-25 25.4004 -58.2998 39.4004 -93.5996 39.4004
c-73.2002 0 -132.4 -60.2998 -132.4 -134.4c0 -74.1992 59.2002 -134.399 132.4 -134.399c33.5996 0 65.3994 12.7002 89.8994 35.7998v34.7002h13.2002zM311.9 240.7c47.6992 0 88.0996 -35 88.0996 -100.2v-30.5996c-15.5 26.6992 -42.5 41.7998 -76 41.7998h-118.4v89
h106.301z" />
    <glyph glyph-name="goodreads" unicode="&#xf3a8;" 
d="M299.9 256.8c5.09961 -37.2998 -4.7002 -79 -35.9004 -100.7c-22.2998 -15.5 -52.7998 -14.0996 -70.7998 -5.69922c-37.1006 17.2998 -49.5 58.5996 -46.7998 97.1992c4.2998 60.9004 40.8994 87.9004 75.2998 87.5c46.8994 0.200195 71.7998 -31.7998 78.2002 -78.2998
zM448 360v-336c0 -30.9004 -25.0996 -56 -56 -56h-336c-30.9004 0 -56 25.0996 -56 56v336c0 30.9004 25.0996 56 56 56h336c30.9004 0 56 -25.0996 56 -56zM330 134.8c0 0 -0.0996094 34 -0.0996094 217.3h-29v-40.2998c-0.800781 -0.299805 -1.2002 0.5 -1.60059 1.2002
c-9.59961 20.7002 -35.8994 46.2998 -76 46c-51.8994 -0.400391 -87.2002 -31.2002 -100.6 -77.7998c-4.2998 -14.9004 -5.7998 -30.1006 -5.5 -45.6006c1.7002 -77.8994 45.0996 -117.8 112.399 -115.199c28.9004 1.09961 54.5 17 69 45.1992
c0.5 1 1.10059 1.90039 1.7002 2.90039c0.200195 -0.0996094 0.400391 -0.0996094 0.600586 -0.200195c0.299805 -3.7998 0.199219 -30.7002 0.0996094 -34.5c-0.200195 -14.7998 -2 -29.5 -7.2002 -43.5c-7.7998 -21 -22.2998 -34.7002 -44.5 -39.5
c-17.7998 -3.89941 -35.5996 -3.7998 -53.2002 1.2002c-21.5 6.09961 -36.5 19 -41.0996 41.7998c-0.299805 1.60059 -1.2998 1.2998 -2.2998 1.2998h-26.7998c0.799805 -10.5996 3.19922 -20.2998 8.5 -29.1992c24.1992 -40.5 82.6992 -48.5 128.199 -37.4004
c49.9004 12.2998 67.3008 54.9004 67.4004 106.3z" />
    <glyph glyph-name="goodreads-g" unicode="&#xf3a9;" horiz-adv-x="384" 
d="M42.5996 44.7002h2.80078c12.6992 0 25.5 0 38.1992 -0.100586c1.60059 0 3.10059 0.400391 3.60059 -2.09961c7.09961 -34.9004 30 -54.5996 62.8994 -63.9004c26.9004 -7.59961 54.1006 -7.7998 81.3008 -1.7998c33.7998 7.40039 56 28.2998 68 60.4004
c8 21.5 10.6992 43.7998 11 66.5c0.0996094 5.7998 0.299805 47 -0.200195 52.7998l-0.900391 0.299805c-0.799805 -1.5 -1.7002 -2.89941 -2.5 -4.39941c-22.0996 -43.1006 -61.2998 -67.4004 -105.399 -69.1006c-103 -4 -169.4 57 -172 176.2
c-0.5 23.7002 1.7998 46.9004 8.2998 69.7002c20.5996 71.0996 74.5996 118.2 153.899 118.8c61.3008 0.400391 101.5 -38.7002 116.2 -70.2998c0.5 -1.10059 1.2998 -2.2998 2.40039 -1.90039v61.6006h44.2998c0 -280.301 0.0996094 -332.2 0.0996094 -332.2
c-0.0996094 -78.5 -26.6992 -143.7 -103 -162.2c-69.5 -16.9004 -159 -4.7998 -196 57.2002c-8 13.5 -11.7998 28.2998 -13 44.5zM188.9 411.5c-52.5 0.5 -108.5 -40.7002 -115 -133.8c-4.10059 -59 14.7998 -122.2 71.5 -148.601
c27.5996 -12.8994 74.2998 -15 108.3 8.7002c47.5996 33.2002 62.7002 97 54.7998 154c-9.7002 71.1006 -47.7998 120 -119.6 119.7z" />
    <glyph glyph-name="google-drive" unicode="&#xf3aa;" horiz-adv-x="512" 
d="M339 133.1l-163.6 282.9h161.199l163.601 -282.9h-161.2zM201.5 109.5h310.5l-80.5996 -141.5h-310.5zM154.1 380.6l82.9004 -141.399l-156.4 -271.2l-80.5996 141.5z" />
    <glyph glyph-name="google-play" unicode="&#xf3ab;" horiz-adv-x="512" 
d="M325.3 213.7l-220.7 221.3l280.801 -161.2zM47 448l256.6 -255.9l-256.6 -256c-13 6.80078 -21.7002 19.2002 -21.7002 35.3008v441.3c0 16.0996 8.7002 28.5 21.7002 35.2998zM472.2 222.4c19.2002 -14.3008 19.2002 -46.5 1.2002 -60.8008l-60.1006 -34.0996
l-65.7002 64.5l65.7002 64.5zM104.6 -51l220.7 221.3l60.1006 -60.0996z" />
    <glyph glyph-name="gripfire" unicode="&#xf3ac;" horiz-adv-x="384" 
d="M112.5 146.6c0 -26.8994 16.5996 -47.1992 32.5996 -69.5c22.5 -30.1992 44.2002 -56.8994 44.2002 -86.5c-0.0996094 -14.5 -4.39941 -29.6992 -17.5 -46.3994c0 5.2998 4.7998 12.2002 4.7998 22.2998c0 15.2002 -13 39.9004 -78.0996 86.5996
c-34.2998 29.1006 -66.5 58.5 -66.5 108.301c0 114.699 147.1 176.5 147.1 268.6c0 3.2998 -0.199219 6.7002 -0.599609 10c5.09961 -2.40039 39.0996 -43.2998 39.0996 -90.4004c0 -80.5 -105.1 -129.199 -105.1 -203zM317.8 185.6
c1.5 -8.39941 2.2002 -16.5996 2.2002 -24.5996c0 -51.7998 -29.4004 -97.5 -67.2998 -136.8c-1 -1 -2.2002 -2.40039 -3.2002 -2.40039c-3.59961 0 -35.5 41.6006 -35.5 53.2002c0 0 41.7998 55.7002 41.7998 96.9004c0 10.7998 -2.7002 21.6992 -9.09961 33.3994
c-1.5 -32.2998 -55.7002 -87.7002 -58.1006 -87.7002c-2.69922 0 -17.8994 22 -17.8994 42.1006c0 5.2998 1 10.7002 3.2002 15.7998c2.39941 5.5 56.5996 72 56.5996 116.7c0 6.2002 -1 12 -3.40039 17.0996l-4 7.2002c16.7002 -6.5 82.6006 -64.0996 94.7002 -130.9z" />
    <glyph glyph-name="grunt" unicode="&#xf3ad;" horiz-adv-x="384" 
d="M61.2998 258.7c0.5 4.89941 2.7998 10 7 12h0.100586c-4.60059 1.7002 -9.2002 3.09961 -13.5 4.09961c42.1992 10.2002 73.3994 -20.5996 83.0996 -31.7998c16.5996 -19.2002 35.5 -8.7998 35.5 -8.7998c0.299805 -11.1006 -10.2998 -19 -21.0996 -19.5
c1.19922 -15.4004 -13.9004 -32.5 -13.9004 -32.5s5.59961 15 2.7002 25.2998c-0.900391 3.2002 -2 6.09961 -3 8.5c-19.2998 -17.2002 -48 -1.5 -54.9004 6.09961c-9.59961 10.6006 -12.3994 23.8008 -12.7998 34.1006c-1.7998 -3.7998 -3.2998 -9.10059 -4 -16.6006
c0 0 -6.2998 9.10059 -5.2002 19.1006zM89.5996 260.5c-2.89941 -9.09961 -3.39941 -27.7002 6.90039 -35.2998c16.2998 -12.1006 32.2998 -5 38 -1.7002c-7.5 11.2998 -25.4004 26 -44.9004 37zM231.7 214.7c-10.7998 0.399414 -21.4004 8.39941 -21.2002 19.2998
c0 0 18.7998 -10.4004 35.5 8.7998c9.7002 11.2002 40.7998 42 83.0996 31.7998c-4.2998 -0.899414 -8.89941 -2.2998 -13.5 -4.09961h0.100586c4.09961 -1.7998 6.39941 -6.7998 7 -11.7998c1.2002 -10 -5.2002 -19.1006 -5.2002 -19.1006
c-0.599609 7.5 -2.2002 12.8008 -4 16.6006c-0.5 -10.2998 -3.2002 -23.5 -12.7998 -34.1006c-6.7998 -7.59961 -35.5 -23.3994 -54.7998 -6.09961c-1 -2.5 -2.10059 -5.2998 -3 -8.5c-2.90039 -10.2998 2.69922 -25.2998 2.69922 -25.2998s-15.0996 17 -13.8994 32.5z
M294.4 260.5c-19.5 -11 -37.4004 -25.5996 -44.9004 -37c5.7002 -3.40039 21.5996 -10.5 37.9004 1.59961c10.3994 7.7002 10 26.3008 7 35.4004zM160 29.5c4.09961 0 7 -0.900391 8.7998 -2.7002c2.2002 -2.2998 1.5 -5.2998 0.900391 -6.7998
c-1.10059 -2.7002 -5.5 -11.5996 -13 -19.7998c-2.7002 -2.90039 -6.60059 -4.60059 -11 -4.60059c-4.2998 0 -8.7002 1.60059 -11.7998 4.30078c-2.30078 2.09961 -10.2002 9.5 -13.7002 18.5996c-1.2998 3.40039 -1 6.09961 0.899414 8.09961
c1.30078 1.30078 4 2.90039 9.5 2.90039h29.4004zM349.2 130.7c0 0 29.2998 -22.5 21.0996 -70.9004c-5.2998 -29.5 -23.2002 -46 -47 -54.7002c-8.7998 -19.0996 -29.3994 -45.6992 -67.2998 -49.5996c-14.5 -11.7998 -34.5 -19.5 -63.5996 -19.5h-0.200195
c-29.2002 0 -49.2002 7.7002 -63.6006 19.5c-37.8994 3.90039 -58.5 30.5 -67.2998 49.5996c-23.7998 8.60059 -41.7998 25.2002 -47 54.7002c-8.59961 48.2002 20.6006 70.7998 20.6006 70.7998c2.39941 -17.8994 13 -33.8994 24.5996 -43.7998
c3.09961 22.7002 3.7002 55.5 3.7002 62.4004c0 14.7002 -9.5 24.5 -12.2002 26.0996c-2.5 1.5 -5.2998 3 -8.2998 4.60059c-18 9.59961 -40.4004 21.5996 -40.4004 43.6992c0 16.1006 9.2998 23.2002 15.4004 27.8008c0.799805 0.599609 1.5 1.19922 2.2002 1.69922
c2.09961 1.7002 3.69922 3 4.2998 4.40039c4.39941 9.7998 3.59961 34.2002 1.7002 37.5996c-0.600586 0.700195 -16.8008 21 -11.8008 39.2002c2 7.40039 6.90039 13.2998 14.1006 17c5.2998 2.7002 11.7998 4.2002 19.5 4.5c0.0996094 2 0.5 4 0.899414 5.90039
c0.5 2.59961 1.10059 5.2998 0.900391 8.09961c-0.400391 4.7002 -0.799805 9.10059 -2.2002 11.2998c-8.39941 13.3008 -28.7998 17.6006 -29 17.6006l-12.2998 2.39941l8.09961 9.40039c0.200195 0.200195 17.3008 17.5 46.3008 17.5c7.89941 0 16 -1.2998 23.8994 -3.5
c24.2998 -7.7998 42.9004 -30.5 49.4004 -39.2998c2 0.599609 3.89941 1.2002 5.89941 1.7002c-1 26.3994 20.7002 47.3994 28.2002 48.2998c0.5 -4.5 -0.399414 -22.2002 7.2002 -27.6006c2.2002 14.4004 9.59961 30.3008 39.0996 40.7002
c-6.2998 -16.7002 -0.799805 -30.7002 1.80078 -37.2002c20.0996 18.2002 33.6992 15.2002 33.6992 15.2002s-13.1992 -22.7002 -9 -38.5c3.30078 -0.799805 6.5 -1.7002 9.60059 -2.7002c6.5 8.80078 25.2002 31.5 49.3994 39.3008
c8.10059 2.59961 16.2002 3.89941 24.1006 3.89941c29 0 46.2002 -17.2998 46.2998 -17.5l8.09961 -9.5l-12.2998 -2.39941c-0.200195 0 -20.5996 -4.30078 -29 -17.6006c-1.39941 -2.2998 -1.7998 -6.59961 -2.2002 -11.2998
c-0.199219 -2.7998 0.300781 -5.5 0.900391 -8.09961c0.400391 -2 0.799805 -3.90039 0.900391 -5.90039c7.59961 -0.299805 14.1992 -1.7998 19.5 -4.5c7.19922 -3.7002 12.0996 -9.59961 14.0996 -17c4.90039 -18.2998 -11.2002 -38.5996 -11.7998 -39.2002
c-1.90039 -3.39941 -2.7002 -27.7998 1.7002 -37.5996c0.599609 -1.40039 2.19922 -2.7002 4.2998 -4.40039c0.700195 -0.599609 1.39941 -1.09961 2.2002 -1.7002c6.09961 -4.59961 15.3994 -11.5996 15.3994 -27.7998c0 -22.0996 -22.3994 -34.0996 -40.3994 -43.7002
c-2.90039 -1.59961 -5.80078 -3.09961 -8.30078 -4.59961c-2.69922 -1.59961 -12.1992 -11.4004 -12.1992 -26.0996c0 -6.90039 0.599609 -39.7002 3.69922 -62.4004c11.6006 9.90039 22.2002 25.7998 24.6006 43.7002zM305.7 410.3
c-17.7998 -5.7002 -31.6006 -23.0996 -37.7002 -32.2002c1.59961 -0.699219 3.09961 -1.39941 4.7002 -2.19922c2.59961 -1.2002 4.89941 -2.40039 7.09961 -3.7002c2.7002 5.5 8.40039 13.7002 20.7002 22.3994c8.2002 5.80078 18.2002 8.90039 28.7002 8.90039
c3.59961 0 6.7998 -0.400391 9.2002 -0.799805c3.2998 2.09961 6.59961 3.89941 9.69922 5.2998c-4.7998 2 -13.6992 5 -24.6992 5c-6.10059 0 -12.1006 -0.900391 -17.7002 -2.7002zM326.7 392.1c-7.40039 -0.299805 -14 -2.69922 -19.6006 -7
c-8 -6.39941 -12.0996 -17.6992 -13.5 -22.5c4.90039 -4.19922 8.2002 -8.09961 10.5 -11.1992c3.40039 1 7.30078 1.89941 11.5 2.69922c3.30078 4.5 3.90039 10.6006 4.40039 17c0.5 6.2002 1.09961 12.6006 4.40039 17.8008c0.699219 1.09961 1.5 2.19922 2.2998 3.19922
zM45.5996 402.7c2.40039 0.399414 5.60059 0.799805 9 0.899414c10.6006 0 20.5 -3.09961 28.8008 -8.89941c12.3994 -8.7002 18.0996 -17 20.6992 -22.4004c2.2002 1.2002 4.60059 2.5 7.10059 3.7002c1.59961 0.799805 3.2002 1.5 4.7998 2.2002
c-6.09961 8.89941 -19.9004 26.2998 -37.7002 32.0996c-5.7002 1.7998 -11.5996 2.7002 -17.7002 2.7002c-11 0 -19.8994 -3 -24.6992 -5c3.09961 -1.2998 6.39941 -3.09961 9.69922 -5.2998zM90.2998 362.6c-1.39941 4.80078 -5.5 16.1006 -13.5 22.4004
c-5.5 4.40039 -12.0996 6.7002 -19.5 7c0.799805 -1 1.60059 -2.09961 2.2998 -3.2002c3.30078 -5.2002 3.90039 -11.5996 4.40039 -17.7998c0.5 -6.40039 1 -12.5 4.2998 -16.9004c4.2002 -0.799805 8.10059 -1.7998 11.5 -2.69922c2.2002 3.19922 5.60059 7 10.5 11.1992z
M58.0996 188.1c8.7002 -5 18.1006 -16.7998 19 -34.1992c0.900391 -14.7002 -0.899414 -49.9004 -3.39941 -75.9004c12.5 -4.7998 26.7002 -6.40039 39.7002 -6.7998c2 4.09961 3.89941 8.5 5.5 13.0996c0.699219 1.90039 19.5996 51 26.3994 62.2002
c-5.39941 -39 -17.5 -73.7002 -23.5 -89.5996c3.40039 0.399414 7.2998 0.699219 11.7002 0.699219h117c4.40039 0 8.2002 -0.199219 11.7002 -0.699219c-6 15.8994 -18 50.5996 -23.5 89.5996c6.7998 -11.0996 25.7002 -60.2002 26.3994 -62.2002
c1.60059 -4.59961 3.5 -9 5.5 -13.0996c13 0.399414 27.3008 2 39.7002 6.7998c-2.5 26 -4.2998 61.2998 -3.39941 75.9004c1.09961 17.5 10.3994 29.1992 19.0996 34.1992c2.7002 1.5 5.5 3.10059 8.40039 4.60059c14.7998 8 30.1992 16.2998 30.1992 30.5
c0 11.0996 -4.2998 14.5 -8.89941 18.2002l-0.5 0.399414c-0.700195 0.600586 -1.5 1.2002 -2.2002 1.7998c0.900391 -7.19922 1.90039 -13.2998 2.7002 -14.8994c0 0 -12.1006 15 -15.7002 44.2998c-1.40039 11.5 1.09961 34.2002 5.09961 43
c-0.199219 -4.90039 0 -9.7998 0.300781 -14.4004c0.399414 0.900391 0.799805 1.60059 1.2998 2.2002c3.2998 4 11.8994 17.5 9.39941 26.6006c-1 3.39941 -3.19922 6 -6.69922 7.7998c-3.80078 1.89941 -8.80078 2.89941 -15.1006 2.89941
c-12.2998 0 -25.8994 -3.7998 -32.8994 -6c-25.1006 -7.89941 -55.4004 -30.8994 -64.1006 -37.6992c-0.200195 -0.200195 -0.399414 -0.300781 -0.399414 -0.300781l-5.60059 -3.89941l3.5 5.7998c0.200195 0.299805 19.1006 31.4004 53.1006 46.5
c-2 2.90039 -7.40039 8.2002 -21.6006 15.0996c-21.3994 10.5 -46.3994 15.8008 -74.2998 15.8008c-27.7998 0 -52.9004 -5.30078 -74.2998 -15.8008c-14.2002 -7 -19.6006 -12.1992 -21.6006 -15.0996c34.1006 -15.0996 53 -46.2002 53.2002 -46.5l3.5 -5.7998
l-5.59961 3.89941s-0.200195 0.100586 -0.400391 0.300781c-8.7002 6.7998 -39 29.6992 -64.0996 37.6992c-7 2.30078 -20.6006 6 -32.9004 6c-6.2998 0 -11.2998 -1 -15.0996 -2.89941c-3.60059 -1.7998 -5.7998 -4.2998 -6.7002 -7.7998
c-2.40039 -9.10059 6.2002 -22.6006 9.40039 -26.6006c0.5 -0.599609 0.899414 -1.39941 1.2998 -2.2002c0.299805 4.60059 0.5 9.5 0.299805 14.4004c4 -8.7002 6.5 -31.5 5.09961 -43c-3.59961 -29.2998 -15.6992 -44.2998 -15.6992 -44.2998
c0.799805 1.59961 1.7998 7.7002 2.69922 14.8994c-0.799805 -0.599609 -1.5 -1.19922 -2.19922 -1.7998l-0.5 -0.399414c-4.60059 -3.60059 -8.90039 -7.10059 -8.90039 -18.2002c0 -14.2002 15.2998 -22.5 30.2002 -30.5c2.7998 -1.5 5.7002 -3 8.39941 -4.60059z
M34.7998 43.4004c11.9004 -19.7002 35.5 -29.4004 58.2002 -29.5c-4.5 13.2998 -3.09961 24 4.09961 31.7998l1.40039 1.39941c1.7998 2.40039 4.2998 5.80078 7 10c-27.2002 1.10059 -63.5 11 -74.4004 45.4004c-5 -5 -8.39941 -39.0996 3.7002 -59.0996zM80.5 -0.0996094
c6.5 -9.5 16.5 -19.6006 30.9004 -25.5c-4.90039 7.19922 -8.80078 15.0996 -12.3008 23.0996c-6.39941 0.5 -12.5996 1.2998 -18.5996 2.40039zM192 -50.2002c60.5996 0.100586 78.2998 45.9004 84.9004 64.7002c3.59961 10.5 3.2998 18.2998 -0.900391 23.0996
c-2.7998 3.30078 -9.5 7.2002 -24.5996 7.2002h-118.801c-15.0996 0 -21.6992 -3.89941 -24.5996 -7.2002c-4.2998 -4.89941 -4.59961 -12.5996 -0.900391 -23.0996c6.60059 -18.9004 24.3008 -64.5996 84.9004 -64.7002zM272.6 -25.5996
c14.4004 5.89941 24.4004 16 30.9004 25.5c-6 -1.10059 -12.2002 -1.90039 -18.5996 -2.40039c-3.5 -8 -7.40039 -15.9004 -12.3008 -23.0996zM349.2 43.4004c12.2002 19.8994 8.7998 54 3.7998 59c-10.9004 -34.4004 -47.2002 -44.2002 -74.4004 -45.4004
c2.7002 -4.2002 5.2002 -7.59961 7 -10c0.5 -0.5 1 -1 1.40039 -1.5c7.2002 -7.7002 8.59961 -18.5 4.09961 -31.7998c22.5 0.399414 46.1006 10 58.1006 29.7002zM191.9 260.3c-12.7002 0.200195 -27.2002 17.7998 -27.2002 17.7998
c9.89941 -6 18.7998 -8.09961 27.2998 -8.2998c8.5 0.200195 17.4004 2.2998 27.2998 8.2998c0 0 -14.5 -17.6992 -27.2002 -17.7998h-0.199219zM253.6 29.5996c5.40039 -0.0996094 8.10059 -1.69922 9.40039 -3c1.90039 -1.89941 2.2002 -4.59961 0.900391 -7.89941
c-3.5 -8.90039 -11.4004 -16.1006 -13.7002 -18.1006c-3.10059 -2.59961 -7.40039 -4.19922 -11.7998 -4.19922c-4.40039 0 -8.30078 1.59961 -11 4.5c-7.5 8 -12 16.6992 -13 19.2998c-0.600586 1.5 -1.30078 4.39941 0.899414 6.7002
c1.7002 1.7998 4.7002 2.69922 8.90039 2.69922h29.3994z" />
    <glyph glyph-name="gulp" unicode="&#xf3ae;" horiz-adv-x="256" 
d="M209.8 56.9004l-14.0996 -24.6006l-4.60059 -80.2002c0 -8.89941 -28.2998 -16.0996 -63.0996 -16.0996s-63.0996 7.2002 -63.0996 16.0996l-5.80078 79.4004l-14.8994 25.4004c41.2002 -17.3008 126 -16.7002 165.6 0zM13.7998 310.2
c30.7002 -17 197.8 -16.9004 228.3 0.200195l-14.7998 -136.801c-4.7998 -4.19922 -11.5996 -10.1992 -16.5996 -14.0996c-1.60059 -1.2002 -6 -4.7002 -8 -4.7002c-1.2998 0 -2.2002 0.5 -2.2002 1.7998c0.0996094 1 3.40039 4.5 5 6.40039
c4.90039 5.7002 13.7998 16 13.7998 23.4004c0 7 -10.7002 14.0996 -25.7002 0.199219c-1.59961 -1.5 -3.09961 -3 -4.5 -4.5c0.400391 1.10059 1.10059 5.10059 1.10059 6.2002c0 2.7998 -1.40039 4 -4.2002 4c-1 0 -1.90039 -0.599609 -2.7002 -1.59961
c-2.59961 -3.10059 -3.89941 -7.5 -5.2998 -11.2998c-0.5 -1.80078 -1.09961 -3.60059 -1.7002 -5.5c-0.399414 -0.200195 -0.700195 -0.300781 -0.899414 -0.600586c-3.80078 -3.89941 -17.7002 -17 -23.1006 -17c-2.2998 0 -1.59961 3.60059 -1 5.7998
c1 3.40039 6.7998 17.7002 8.7002 22.3008c4.59961 11.0996 8 19.7998 13.2002 31.8994c3.89941 9.2002 3.7998 8.60059 4.5 10.5c0.700195 2.10059 0.700195 4.90039 -1 6.2002c-1 0.700195 -2 1.09961 -3.2002 1.09961c-2.40039 0 -4.7998 -1.39941 -6.09961 -4.69922
c-25.5 -64.4004 -25.2002 -63.3008 -26.4004 -68.2002c-2 -1.7002 -4.40039 -3.40039 -6.7998 -4.5c-3.10059 -1.40039 -6.7998 -2.2002 -6.7998 1.2002c0 3.69922 1.39941 8.19922 2.69922 11.6992c2.2002 6.10059 4.90039 11.1006 6.90039 16.7002
c0.900391 2.40039 1.2998 4.7002 -0.400391 6.90039c-0.799805 1 -1.89941 1.5 -3.19922 1.5c-2.60059 0 -4.10059 -2.60059 -5.2002 -5.10059c-0.700195 -1.5 -1.2998 -3.09961 -1.7998 -4.7998c-1.2002 -4 -3.60059 -8.7002 -5.60059 -12.2998
c-2.7998 -5 -6.5 -10.0996 -11.0996 -13.5c-2.2002 -1.59961 -4.5 -2.40039 -6.90039 -2.40039c-3.5 0 -2.39941 5.7002 -1.5 9c2.2002 7.80078 5.5 13.3008 9.2998 20.8008c1.30078 2.69922 2.30078 5.39941 -0.299805 7.19922c-0.5 0.300781 -1 0.5 -1.59961 0.700195
c-3.40039 0.900391 -6 -1.09961 -7.60059 -4.5c-3.09961 -6.2998 -5.39941 -11.7002 -7.09961 -16.2002c-3.2998 -8.89941 -6.90039 -18.2998 -4.59961 -23.7998c1.5 -3.7002 4.5 -5.09961 8.59961 -5.09961c9.7998 0 17.7998 6.7002 22.4004 14.8994
c-4.30078 -19.7998 8.19922 -17.2998 20 -8.09961c0.0996094 -0.400391 0.0996094 -0.799805 0.199219 -1.2002c1.5 -6.7002 8.7002 -6.7002 14.5 -4.09961c3.5 1.59961 8.2002 4.5 14.4004 10.5c0.200195 0.299805 0.799805 1.39941 -0.799805 -2.2998
c-7.2002 -16.2002 -13.5 -28.2002 -15 -34.3008c-0.200195 -0.899414 -0.299805 -1.7998 -0.299805 -2.69922c0 -1.80078 0.399414 -3.10059 1.2998 -3.7002c1.59961 -1.2002 4.2002 -1.2998 6.09961 -0.299805c1.7998 1 3.10059 2.59961 4 4.5
c1 2.19922 0.200195 0.699219 5.2002 14c5 13.3994 2.90039 7.7998 9.09961 22c1.90039 4.2998 4.2002 9.5 8.5 15.5c2.5 3.39941 5.5 7 8.7002 9.69922c5.7002 4.7002 11.7002 5.40039 11.7002 2.5c0 -2.19922 -3.2998 -6.39941 -4.7002 -8.09961
c-5.2998 -6.7002 -14.3994 -16.2998 -14.3994 -21.5c0 -9.5 12 -8 17.3994 -5.7002c7.2998 3.2002 13.9004 9.60059 19.6006 14.7998l-10.9004 -94.5996c-1.90039 -4.90039 -39.0996 -17.0996 -88.2002 -17.0996c-49 0 -86.2002 12.0996 -88.2002 17.0996l-7.59961 79.5996
c2.09961 -1.5 4.2998 -2.39941 7.7002 -2.39941c7.39941 0 16.0996 6.7002 21.5 11.7998c2.2998 2.2002 4.39941 4.40039 6.39941 6.59961c-1 -3 -7.09961 -22 -7.2998 -25.1992c-0.0996094 -1 -0.200195 -4.90039 0.799805 -6.30078
c0.5 -0.799805 1.40039 -1.19922 2.60059 -1.19922c2.89941 0 5.59961 4.69922 6.2998 7.5c0 0 1.7998 6.2998 7.59961 25.7998c6.30078 21.0996 10 24.5 10 34.7002c0 5.59961 -7.2998 6.7998 -9.89941 0l-5.2002 -15.5c-2.2002 -4.5 -8 -11.5 -12.5 -16
c-3.5 -3.5 -10.7998 -10.1006 -15.7998 -10.1006c-2.40039 0 -3.90039 1.40039 -4.90039 3.60059c-2.2998 5.2998 -0.899414 14.2998 0.600586 19.8994c2.59961 9.7002 6.89941 19.4004 12 28.2002c4.19922 7.2998 10.1992 15.7002 17.0996 20.7002
c6.59961 4.7998 12.7998 4.5 16.9004 -2.7998c1.5 -2.7002 3.7998 -7.30078 6.7998 -7.30078c2.5 0 5.7002 2.60059 4.5 9.10059c-0.5 2.5 -4.90039 8.7998 -10.1006 11.7998c-6 3.59961 -12.3994 3.59961 -18.6992 0.900391
c-19.2002 -8.2002 -34.1006 -35.2002 -40 -55.2002zM243.5 318.7c0 -21 -231.2 -21 -231.2 0c0 8.7998 51.7998 15.8994 115.601 15.8994c9 0 17.7998 -0.0996094 26.2998 -0.399414l12.5996 48.7002l61.2998 64.5c1.40039 1.39941 5.80078 0.199219 9.90039 -3.5
c4.09961 -3.7002 6.59961 -7.90039 5.2998 -9.30078l-0.0996094 -0.0996094l-57.2998 -60.5l-10 -40.7002c39.8994 -2.59961 67.5996 -8.09961 67.5996 -14.5996zM174.1 314.1c0 0.800781 -0.899414 1.5 -2.5 2.10059l-0.199219 -0.799805
c0 -1.30078 -5 -2.40039 -11.1006 -2.40039c-6.09961 0 -11.0996 1.09961 -11.0996 2.40039c0 0.0996094 0 0.199219 0.0996094 0.299805l0.200195 0.700195c-1.7998 -0.600586 -3 -1.40039 -3 -2.30078c0 -2.09961 6.2002 -3.69922 13.7002 -3.69922
c7.7002 -0.100586 13.8994 1.59961 13.8994 3.69922z" />
    <glyph glyph-name="hacker-news-square" unicode="&#xf3af;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM21.2002 218.8h-0.200195c0.0996094 0.100586 0.200195 0.299805 0.299805 0.400391c0 -0.100586 0 -0.299805 -0.0996094 -0.400391z
M239.2 164.9l80.7998 155.1h-34.7998c-54.7998 -101.2 -48.2998 -98.5996 -60.6006 -125.6c-10.0996 24.3994 -6.7998 27.2998 -59.2998 125.6h-37.2998l79.7998 -153.3v-102.7h31.4004v100.9z" />
    <glyph glyph-name="hire-a-helper" unicode="&#xf3b0;" horiz-adv-x="512" 
d="M443.1 448c3.90039 -36.4004 32.5 -65.7998 68.9004 -71.7002v-370.5c-35.4004 -4 -64.9004 -33.3994 -67.9004 -69.7998h-372.199c-5.90039 36.4004 -34.5 63.9004 -71.9004 68.7998v371.5c37.4004 3.90039 67.9004 34.4004 71.9004 71.7002h371.199zM406.1 43.0996
c7.80078 0 5.80078 10.8008 0 10.8008c-10.2998 3.39941 -13.5 3.59961 -21.6992 13.7998c-7.80078 12.8994 -7.90039 44.3994 -7.90039 127.8v101.2c0 22.0996 12.2002 28.2998 28.5996 32.3994c8.90039 2.2002 3.90039 11.8008 -1 11.8008
c-36.5 0 -20.5996 -2 -57.0996 -2c-32.7002 0 -16.5 2 -49.2002 2c-3.2998 0 -8.5 -8.30078 -1 -10.8008c4.90039 -1.59961 27.6006 -3.69922 27.6006 -39.2998c0 -45.5996 0.199219 -55.7998 -1 -68.7998c0 -1.2998 -2.30078 -12.7998 -12.8008 -12.7998h-109.199
c-10.5 0 -12.8008 11.5 -12.8008 12.7998c-1.19922 13 -1 23.2002 -1 68.7998c0 35.6006 22.7002 37.7002 27.6006 39.2998c7.5 2.5 2.2998 10.8008 -1 10.8008c-32.7002 0 -16.5 -2 -49.2002 -2c-36.5 0 -20.5996 2 -57.0996 2c-5 0 -9.80078 -9.60059 -1 -11.8008
c16.3994 -4.09961 28.5996 -10.1992 28.5996 -32.3994v-101.2c0 -83.4004 -0.200195 -114.9 -7.90039 -127.8c-8.19922 -10.2998 -11.5 -10.4004 -21.6992 -13.7998c-5.80078 0 -7.90039 -10.8008 0 -10.8008c36.2998 0 18.7998 2 55.0996 2c35.7998 0 21 -2 56.0996 -2
c6 0 4.90039 8.2002 0 9.80078c-22.7998 7.59961 -22.8994 10.2998 -24.5996 12.7998c-10.4004 15.5996 -5.90039 83 -5.90039 113c0 5.2998 6.40039 12.7998 13.8008 12.7998h111.199c7.40039 0 13.8008 -7.5 13.8008 -12.7998c0 -30 4.5 -97.4004 -5.90039 -113
c-1.7002 -2.60059 -1.7998 -5.2002 -24.5996 -12.7998c-4.90039 -1.60059 -5.90039 -9.80078 0 -9.80078c35.0996 0 20.2998 2 56.0996 2c36.2998 0 18.7998 -2 55.0996 -2z" />
    <glyph glyph-name="hotjar" unicode="&#xf3b1;" 
d="M414.9 286.5c30 -53 41.7998 -121.6 26.2998 -180.9c-14.7002 -56.6992 -68.2998 -120.3 -148.8 -145.6c54.5 76.9004 43.8994 200.1 -27.1006 215.5c54.2002 -93.9004 -53.7002 -180.3 -110.8 -93.9004c-2.5 -7.19922 -25.0996 -74.5 4.09961 -129.6
c-61.0996 9.09961 -117.8 33.5 -144.6 93.4004c-35 78.1992 -2.7002 149.8 79 204.899c129.2 87.2998 28.0996 197.7 28.0996 197.7s219.101 -29 293.801 -161.5z" />
    <glyph glyph-name="hubspot" unicode="&#xf3b2;" horiz-adv-x="512" 
d="M267.4 236.4l-163.2 114.699c-7.90039 -4.69922 -17 -7.59961 -26.7998 -7.59961c-28.8008 0 -52.2002 23.4004 -52.2002 52.2998c0 28.7998 23.3994 52.2002 52.2002 52.2002c28.8994 0 52.3994 -23.4004 52.3994 -52.2002c0 -4.7998 -0.799805 -9.39941 -2 -13.7998
c51.4004 -39.0996 141.3 -103.9 168.9 -124.8c13.0996 6.89941 27.5 11.5 42.7002 13.5996v61.2002c-17.5 7.40039 -28.2002 23.7998 -28.2002 42.9004c0 26.0996 20.5996 47.8994 46.7002 47.8994c26.0996 0 47 -21.7998 47 -47.8994
c0 -19.1006 -10.7002 -35.5 -28.2002 -42.9004v-61.5996c62.5 -9.5 110.2 -63.5 110.2 -128.7c0 -71.9004 -58.1006 -130.2 -130 -130.2c-29.9004 0 -57.3008 10 -79.3008 26.9004l-50 -50.2002c1.30078 -3.90039 1.90039 -7.90039 1.90039 -12.1006
c0 -10.6992 -4.2002 -20.8994 -11.7998 -28.5c-7.7002 -7.69922 -17.7998 -11.5996 -28.6006 -11.5996c-10.6992 0 -20.8994 4 -28.5 11.5996c-7.59961 7.60059 -11.7998 17.7002 -11.7998 28.5c0 10.8008 4.2002 21 11.7998 28.6006
c7.60059 7.59961 17.7002 11.7998 28.5 11.7998c4.90039 0 9.60059 -0.900391 14 -2.5l49.5 49.7998c-16.2998 21.7002 -26 48.7002 -26 78c0 37.2998 15.7002 70.9004 40.8008 94.6006zM356.9 72.7998c38.0996 0 69 30.9004 69 69c0 38.1006 -30.9004 69 -69 69
c-38.1006 0 -69 -30.8994 -69 -69c0 -38.0996 30.8994 -69 69 -69z" />
    <glyph glyph-name="itunes" unicode="&#xf3b4;" 
d="M223.6 367.7c94.5 0 171.2 -76.7002 171.2 -171.3c0 -94.5 -76.5996 -171.2 -171.2 -171.2c-94.5996 0 -171.1 76.7998 -171.1 171.3s76.5 171.2 171.1 171.2zM303 127.7c1.40039 6.2002 0.900391 -3 1 167.6c0 5.7002 -3.2998 9.10059 -9 8.7002
c-1.7998 0 -14.0996 -2.40039 -115.1 -21.4004c-0.900391 0 -4.60059 -1 -6.7002 -2.69922c-2 -1.60059 -3.10059 -3.80078 -3.5 -6.40039c-1.7002 -6.7002 2.39941 -128 -2.60059 -133.7c-2.09961 -2.5 -4.69922 -3.2002 -7.69922 -3.7002
c-17.7002 -3.19922 -29.6006 -4.7998 -38 -12.7998c-14.5 -14.2002 -7 -38.8994 14.3994 -42.8994c8 -1.40039 23.1006 0.599609 31.4004 5.19922c7.2998 3.80078 12.7998 10.6006 14.8994 19.6006c1.7002 7.7002 1.2002 2.39941 1.2002 118.5
c0 5.7002 1.7002 7.2002 6.7002 8.2998c0 0 87.9004 16.4004 91.9004 17.0996c5.69922 1 8.39941 -0.5 8.39941 -6.09961c0 -78.7998 1 -77.2002 -2.2002 -80.7998c-2.09961 -2.5 -4.69922 -3.2002 -7.69922 -3.7002c-17.7002 -3.2002 -29.6006 -4.7998 -38 -12.7998
c-10.6006 -10.4004 -10.4004 -26.7998 1.39941 -36.7998c9.7002 -7.80078 19.7998 -7.2002 31.9004 -5c13.7998 2.59961 24.0996 10.1992 27.2998 23.7998zM345.2 416c56.8994 0 102.8 -45.9004 102.8 -102.8v-242.4c0 -56.8994 -45.7998 -102.8 -102.8 -102.8h-242.4
c-56.8994 0 -102.8 45.9004 -102.8 102.8v242.4c0 56.8994 45.9004 102.8 102.8 102.8h242.4zM223.6 4c106.301 0 192.5 86.2002 192.5 192.5s-86.1992 192.5 -192.5 192.5c-106.3 0 -192.5 -86.2002 -192.5 -192.5s86.2002 -192.5 192.5 -192.5z" />
    <glyph glyph-name="itunes-note" unicode="&#xf3b5;" horiz-adv-x="384" 
d="M381.9 59.7998c-6.40039 -27.3994 -27.2002 -42.7998 -55.1006 -48c-24.5 -4.5 -44.8994 -5.59961 -64.5 10.2002c-23.8994 20.0996 -24.2002 53.4004 -2.7002 74.4004c17 16.1992 40.9004 19.5 76.8008 25.7998c6 1.09961 11.1992 2.5 15.5996 7.39941
c6.40039 7.2002 4.40039 4.10059 4.40039 163.2c0 11.2002 -5.5 14.2998 -17 12.2998c-8.2002 -1.39941 -185.7 -34.5996 -185.7 -34.5996c-10.2002 -2.2002 -13.4004 -5.2002 -13.4004 -16.7002c0 -234.7 1.10059 -223.899 -2.5 -239.5
c-4.2002 -18.2002 -15.3994 -31.8994 -30.2002 -39.5c-16.7998 -9.2998 -47.1992 -13.3994 -63.3994 -10.3994c-43.2002 8.09961 -58.4004 58 -29.1006 86.5996c17 16.2002 40.9004 19.5 76.8008 25.7998c6 1.10059 11.1992 2.5 15.5996 7.40039
c10.0996 11.5 1.7998 256.6 5.2002 270.2c0.799805 5.19922 3 9.59961 7.09961 12.8994c4.2002 3.5 11.7998 5.5 13.4004 5.5c204 38.2002 228.899 43.1006 232.399 43.1006c11.5 0.799805 18.1006 -6 18.1006 -17.6006c0.200195 -344.5 1.09961 -326 -1.7998 -338.5z" />
    <glyph glyph-name="jenkins" unicode="&#xf3b6;" horiz-adv-x="512" 
d="M487.1 23c1.5 -11.9004 -5.2998 -28.2998 -8.69922 -39.7002c-4.90039 -16.2998 -9.7002 -31.8994 -14.6006 -47.2002h-422c-0.700195 1.90039 -1.39941 4 -2.09961 6c-4.60059 14.2002 -12.6006 31.7002 -14.7002 45.8008
c-3.09961 20.8994 16.5996 22.0996 29.2002 31.0996c19.5 14 34.7998 21.7998 55.8994 34.2998c6.30078 3.7998 25.1006 13.2002 27.3008 17.6006c4.2998 8.69922 -7.30078 20.8994 -10.4004 27.6992c-4.90039 10.7002 -7.5 19.8008 -8.2002 30.4004
c-17.7002 2.7998 -31.0996 13.2998 -39.2002 25.2002c-13.3994 19.7002 -22.6992 56 -11.0996 83.7002c0.900391 2.19922 5.40039 6.5 6.09961 9.7998c1.40039 6.59961 -2.5 15.3994 -2.69922 22.3994c-1.2002 36 6.09961 67 30.2998 77.8008
c9.7998 39.0996 45 52.1992 78.0996 71.5996c12.2998 7.2998 26 11.9004 40.1006 17.0996c50.5 18.7002 128.1 15.1006 170.1 -16.5996c17.7998 -13.5 46.2002 -41.9004 56.4004 -62.5c26.8994 -54.2998 25 -145.1 6.19922 -211.2
c-2.5 -8.89941 -6.19922 -21.8994 -11.2998 -32.5996c-3.59961 -7.40039 -14.7002 -22.2998 -13.2998 -28.9004c1.40039 -6.7998 25.2998 -24.8994 30.4004 -29.8994c9.19922 -8.80078 26.7998 -20.7002 28.1992 -31.9004zM205.9 414.3
c-33.2002 -9.39941 -75.7002 -33.5 -89.3008 -63.3994c10.6006 1.5 17.9004 6.7998 28.3008 7.5c3.89941 0.299805 9.09961 -1.60059 13.5996 -0.5c9 2.2998 16.5996 22.5 23.4004 30c6.59961 7.39941 14.5996 10.5 20 17.1992c3.5 1.7002 8.69922 1.60059 8.89941 6.80078
c-1.5 1.69922 -3.09961 2.89941 -4.89941 2.39941zM101.1 320.7c-14.6992 -16.1006 -11.5996 -46.2998 -9.7998 -67.7998c26.5 16.6992 61.6006 -1.30078 61.2998 -29.6006c12.6006 0.299805 4.7002 15.7998 2.40039 25.7002c-7.5 32.5996 12.5996 67.9004 0.900391 97.5996
c-22.7002 -1.7998 -41.3008 -11 -54.8008 -25.8994zM137.8 120.5c4.90039 -20 15.7002 -46 26.2998 -61.4004c13.6006 -19.3994 40.1006 -22.2998 68.7002 -24.1992c5.10059 11 23.9004 10.0996 36.2002 7.19922c-14.7002 5.80078 -28.4004 19.9004 -39.7002 32.4004
c-13 14.2998 -26.0996 29.7002 -26.7998 48.4004c24.5 -34 44.7998 -63.8008 89.5 -78.8008c33.7998 -11.2998 73.2002 5.2002 99.2002 23.4004c10.7998 7.59961 17.2002 19.5996 24.8994 30.5996c28.7002 41.2002 42 100.101 39.1006 157.101
c-1.2002 23.5 -1.10059 47 -9 62.7998c-8.2998 16.5996 -36.2002 31.2998 -52.5 16.4004c-3 16.0996 13.5996 26.0996 33.0996 20.2998c-13.8994 18 -28.5996 39.5996 -48.2998 50.7002c-34.4004 19.5 -92.7002 34.0996 -129.3 15.7998
c-29.6006 -14.7002 -69.5 -39.1006 -83.1006 -70c12.7002 -29.7998 -3.7998 -57.1006 -4.7998 -87.4004c-0.599609 -16.0996 7.60059 -30.2002 8.2002 -47.7002c-4.40039 -7.19922 -17.7002 -8.09961 -26.9004 -7.59961c-3.09961 15.5 -8.5 32.9004 -24.5 34.7002
c-22.5 2.39941 -39.0996 -16.2998 -40.0996 -35.7998c-1.2002 -23 17.7002 -61 44.4004 -58.4004c10.2998 1.09961 12.7998 11.4004 24.0996 11.2998c6.09961 -12.2002 -9.40039 -16 -11 -24.7002c-0.400391 -2.19922 1.2998 -11 2.2998 -15.0996zM359.8 -3.59961
c-1.59961 -4.40039 0.299805 -10.4004 -0.599609 -16.5c14.8994 -4.2002 31.8994 -6.40039 50.7002 -7c3.69922 4.7998 4.89941 13.7998 4.5 22.7998c-0.600586 10.7998 -3.40039 33.0996 -10.1006 37c-14.0996 8.2002 -39 -16.5 -49.5996 -20.2998
c1.2002 -3.40039 3.09961 -6 3.2002 -10.2002c6.2998 1.5 13.8994 0.5 19.2998 -2.2002c-6.2998 -0.700195 -13.2998 -0.599609 -17.4004 -3.59961zM342.6 16.4004c7.60059 5.5 14.3008 12 22.2002 17.0996c-18.2002 -1.59961 -41 -12.9004 -59 -4.90039
c-0.0996094 -0.899414 -1.2998 -0.599609 -1.5 -1.39941c12.2998 -9.60059 21.5 -11.6006 38.2998 -10.7998zM330.5 -16.7998c26.9004 -8.40039 22.2002 36.7998 -2.7998 20.2002c-0.700195 -8.2002 1.2002 -10.8008 2.7998 -20.2002zM226 9.40039
c0 6.19922 3.59961 12 2.7998 16.3994c-13.7998 2.40039 -31.8994 0.799805 -41.2998 7.2998c-9.59961 -9.69922 26.9004 -23 38.5 -23.6992zM57.7002 -49.0996v-0.100586h180.7c-0.800781 2.5 -1.5 4.90039 -2.2002 7.2002c-4.7998 15.2998 -7.5 26.7002 -8.7002 35.5
c-19.2002 9.2002 -39.7002 18.5 -56.2002 30.2002c-3 2.2002 -23.3994 28.7002 -26.2002 27.5996c-36.8994 -14.5996 -71.3994 -39.7002 -102.199 -63.5c5.59961 -11.7998 10.5 -24.2002 14.7998 -36.8994zM298.3 -54.7998h-0.799805
c0.299805 0.200195 0.5 0.399414 0.799805 0.5v-0.5zM305.8 -49.0996h9.60059c-1 1.5 -2.10059 2.89941 -3.2002 4.2998c-2.10059 -1.5 -4.2998 -2.90039 -6.40039 -4.2998zM320.9 -24.4004c0.0996094 3.60059 0.299805 7.2002 0.399414 10.6006
c-6.5 3.2002 -14 5.5 -23.5 5.89941c6.5 3.30078 15.9004 3.2002 21.7998 7.10059c0.100586 1.5 0.100586 2.89941 0.200195 4.2998c-10.7998 0.900391 -14.7998 5.59961 -21.8994 9.5c-11.6006 6.40039 -29 13.2002 -43.9004 16.0996
c-18.5 3.60059 -16.7998 -25.1992 -16 -42.3994c0.700195 -13.6006 7.7002 -28 10.7998 -37c1.5 -4.2002 1.7998 -8.7002 5.40039 -9.5c6.39941 -1.5 27.3994 6.89941 33.3994 10.2002c12.7002 6.89941 22.5 17.8994 33.3008 25.1992zM374.3 -49.0996l0.600586 12.5996
c-11.2002 -0.700195 -17.5 10.2002 -25.4004 11c-6.90039 0.700195 -12.7002 -7.90039 -21.7002 -4.2002c-2 -2.2002 -3.89941 -4.7002 -6 -6.89941c3.2002 -3.90039 6.10059 -8.10059 8.90039 -12.5h17.3994c0.200195 3.19922 2.80078 5.7998 6.10059 5.7998
s6 -2.60059 6.09961 -5.7998h14zM383 -49.0996h36.2998c-6.7002 10.1992 -20.0996 18.7998 -35.7002 11.5c-0.199219 -3.7002 -0.399414 -7.5 -0.599609 -11.5zM466.4 -12.0996c1.19922 6.19922 4.59961 19.5996 3.7998 25.0996
c-1.40039 9.7998 -14.6006 17.0996 -21.4004 23.0996c-12.3994 11.1006 -20.2002 21 -33.2002 31.4004c-5.19922 -7.7998 -16.5 -13 -20.7998 -19.2998c30.7002 14.8994 36.2998 -55.7998 24.2002 -78.5c1.90039 -6.7998 8.2998 -9.40039 10.9004 -15.5
c-0.700195 -1.10059 -1.30078 -2.2002 -1.90039 -3.2998h27.9004c0.199219 0 0.399414 0 0.599609 -0.100586c4.09961 13.1006 7.59961 25.9004 9.90039 37.1006zM222.2 317.5c5.39941 14.9004 27.2002 34.7002 45 32c7.7002 -1.2002 18 -8.2002 12.2002 -17.7002
c-30.2002 7 -45.2002 -12.5996 -54.4004 -33.0996c-8.09961 2 -4.90039 13.0996 -2.7998 18.7998zM406.3 254.4c8.2002 3.59961 22.4004 0.699219 29.6006 5.2998c-4.2002 11.5 -10.3008 21.3994 -9.30078 37.7002c0.5 0 1 0 1.40039 -0.100586
c6.7998 -14.2002 12.7002 -29.2002 21.4004 -41.7002c-5.7002 -13.5 -43.6006 -25.3994 -43.1006 -1.19922zM309.5 251.7c-6.7998 10.8994 -19 32.5 -14.5 45.2998c6.5 -11.9004 8.59961 -24.4004 17.7998 -33.2998c4.10059 -4 12.2002 -9 8.2002 -20.2002
c-0.900391 -2.7002 -7.7998 -8.59961 -11.7002 -9.7002c-14.3994 -4.2998 -47.8994 -0.899414 -36.5996 17.1006c11.8994 -0.700195 27.8994 -7.80078 36.7998 0.799805zM336.8 181.7c3.7998 -6.60059 1.40039 -18.7002 12.1006 -20.6006
c20.1992 -3.39941 43.5996 12.3008 58.0996 17.8008c9 15.1992 -0.799805 20.6992 -8.90039 30.5c-16.5996 20 -38.7998 44.7998 -38 74.6992c6.7002 4.90039 7.30078 -7.39941 8.2002 -9.69922c8.7002 -20.3008 30.4004 -46.2002 46.2998 -63.5
c3.90039 -4.30078 10.3008 -8.40039 11 -11.2002c2.10059 -8.2002 -5.39941 -18 -4.5 -23.5c-21.6992 -13.9004 -45.7998 -29.1006 -81.3994 -25.6006c-7.40039 6.7002 -10.2998 21.4004 -2.90039 31.1006zM135.5 190.9c-6.7998 3.89941 -8.40039 21 -16.4004 21.3994
c-11.3994 0.700195 -9.2998 -22.2002 -9.2998 -35.5c-7.7998 7.10059 -9.2002 29.1006 -3.5 40.2998c-6.59961 3.2002 -9.5 -3.59961 -13.0996 -5.89941c4.7002 34.0996 49.7998 15.7998 42.2998 -20.2998zM435.1 162.1c-10.0996 -19.1992 -24.3994 -40.3994 -54 -41
c-0.599609 6.2002 -1.09961 15.6006 0 19.4004c22.7002 2.2002 36.6006 13.7002 54 21.5996zM293.2 149.7c18.8994 -9.90039 53.5996 -11 79.2998 -10.2002c1.40039 -5.59961 1.2998 -12.5996 1.40039 -19.4004c-33 -1.7998 -72 6.40039 -80.7002 29.6006zM385.4 103
c-1.7002 -4.2998 -5.30078 -9.2998 -9.80078 -11.0996c-12.0996 -4.90039 -45.5996 -8.7002 -62.3994 0.299805c-10.7002 5.7002 -17.5 18.5 -23.4004 26c-2.7998 3.59961 -16.8994 12.8994 -0.200195 12.8994c13.1006 -32.6992 58 -29 95.8008 -28.0996z" />
    <glyph glyph-name="joget" unicode="&#xf3b7;" horiz-adv-x="496" 
d="M378.1 403c116.601 -71.7998 152.9 -224.6 81 -341.2c-71.8994 -116.5 -224.6 -152.8 -341.199 -80.8994c-116.601 71.8994 -152.9 224.6 -81 341.199c46.8994 76 128.1 117.9 211.3 117.9c44.3994 0 89.3994 -11.9004 129.899 -37zM429.9 79.7998
c5.2998 8.7002 9.89941 17.6006 13.8994 26.6006c-32.0996 -1.10059 -157.1 1.5 -208.8 -17.6006c-58.4004 -21.5 -36.9004 -53.3994 -31.2002 -67.0996c3.7998 -9.10059 14.7002 -28.7998 23.7002 -42.4004c6.7998 -0.599609 13.5996 -1 20.4004 -1
c71.5996 0 141.6 36 182 101.5zM229.1 166.1c51 -1.2998 205.4 -4.39941 230.301 -4.89941c11.8994 81.7998 -24.5 166.6 -99.3008 212.7c-100.5 61.8994 -232.1 30.6992 -294 -69.8008c-28.5996 -46.3994 -37.2998 -99.3994 -28.5 -149.1
c11 40.9004 49.7002 131.5 178.301 140.2c50.8994 4 41.5 -19.2002 23.5996 -29.7002c-17.7998 -10.5 -45.7002 -23.7998 -68.9004 -51.2002c-23.1992 -27.3994 3 -46.7998 58.5 -48.2002zM412.9 220.9c22.6992 -6 19.0996 -15.5 19.0996 -15.5l-46.5 -23.4004
l-169.5 -1.59961s33.7998 10.7998 65.2998 31.2998c26 16.8994 49.7002 35.5996 67.5 35.5996c3.7002 0 7.2002 -0.899414 10.4004 -2.7002c18.5 -10.5996 -2.90039 -18.1992 -13.4004 -24.5996s-50.7002 -34.5 -50.7002 -34.5s1.40039 -7.59961 31.1006 8.2002
c29.7002 15.8994 64 33.2002 86.7002 27.2002z" />
    <glyph glyph-name="js" unicode="&#xf3b8;" 
d="M0 416h448v-448h-448v448zM243.8 66.5996v143.7h-42.0996v-143.1c0 -21.1006 -8.7998 -26.5 -22.6006 -26.5c-14.5 0 -20.5 9.89941 -27.0996 21.5996l-34.2998 -20.7002c10 -21.0996 29.5 -38.5 63.2002 -38.5c37.2998 0 62.8994 19.9004 62.8994 63.5zM343.4 3.09961
c39.8994 0 69.6992 20.8008 69.6992 58.6006c0 35.2002 -20.0996 50.8994 -55.8994 66.2002l-10.5 4.5c-18.1006 7.89941 -25.9004 13 -25.9004 25.5996c0 10.2002 7.7998 18 20.1006 18c12.0996 0 19.8994 -5.09961 27.0996 -18l32.7998 21
c-13.7998 24.4004 -33 33.7002 -59.7998 33.7002c-37.5 0 -61.5996 -24 -61.5996 -55.6006c0 -34.2998 20.0996 -50.5996 50.5 -63.5l10.5 -4.5c19.2998 -8.5 30.6992 -13.5996 30.6992 -28c0 -12.0996 -11.1992 -20.7998 -28.5996 -20.7998
c-20.7002 0 -32.5 10.9004 -41.5 25.6006l-34.2998 -19.8008c12.2998 -24.3994 37.5996 -43 76.7002 -43z" />
    <glyph glyph-name="js-square" unicode="&#xf3b9;" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM243.8 66.5996v143.7h-42.0996v-143.1c0 -21.1006 -8.7998 -26.5 -22.6006 -26.5c-14.5 0 -20.5 9.89941 -27.0996 21.5996
l-34.2998 -20.7002c10 -21.0996 29.5 -38.5 63.2002 -38.5c37.2998 0 62.8994 19.9004 62.8994 63.5zM343.4 3.09961c39.8994 0 69.6992 20.8008 69.6992 58.6006c0 35.2002 -20.0996 50.8994 -55.8994 66.2002l-10.5 4.5c-18.1006 7.89941 -25.9004 13 -25.9004 25.5996
c0 10.2002 7.7998 18 20.1006 18c12.0996 0 19.8994 -5.09961 27.0996 -18l32.7998 21c-13.7998 24.4004 -33 33.7002 -59.7998 33.7002c-37.5 0 -61.5996 -24 -61.5996 -55.6006c0 -34.2998 20.0996 -50.5996 50.5 -63.5l10.5 -4.5
c19.2998 -8.5 30.6992 -13.5996 30.6992 -28c0 -12.0996 -11.1992 -20.7998 -28.5996 -20.7998c-20.7002 0 -32.5 10.9004 -41.5 25.6006l-34.2998 -19.8008c12.2998 -24.3994 37.5996 -43 76.7002 -43z" />
    <glyph glyph-name="keycdn" unicode="&#xf3ba;" horiz-adv-x="512" 
d="M63.7998 38.7002l60.5 59c32.1006 -42.7998 71.1006 -66 126.601 -67.4004c30.5 -0.700195 60.2998 7 86.3994 22.4004c5.10059 -5.2998 18.5 -19.5 20.9004 -22c-32.2002 -20.7002 -69.6006 -31.1006 -108.101 -30.2002
c-43.2998 1.09961 -84.5996 16.7002 -117.699 44.4004c0.299805 0.599609 -38.2002 -37.5 -38.6006 -37.9004c9.5 -29.7998 -13.0996 -62.4004 -46.2998 -62.4004c-26.7998 0.100586 -47.5 21.7002 -47.5 48.5c0 34.3008 33.0996 56.6006 63.7998 45.6006zM418.7 291.1
c19.0996 -31.2998 29.5996 -67.3994 28.7002 -104c-1.10059 -44.7998 -19 -87.5 -48.6006 -121c0.299805 -0.299805 23.7998 -25.1992 24.1006 -25.5c9.59961 1.30078 19.1992 -2 25.8994 -9.09961c11.2998 -12 10.9004 -30.9004 -1.09961 -42.4004
c-12 -11.2998 -30.9004 -10.8994 -42.4004 1.10059c-6.7002 7 -9.39941 16.7998 -7.59961 26.2998c-24.9004 26.5996 -44.4004 47.2002 -44.4004 47.2002c42.7002 34.0996 63.2998 79.5996 64.4004 124.2c0.700195 28.8994 -7.2002 57.1992 -21.1006 82.1992zM104 394.9
c6.7002 -7 9.40039 -16.8008 7.59961 -26.3008l45.9004 -48.0996c-4.7002 -3.7998 -13.2998 -10.4004 -22.7998 -21.2998c-25.4004 -28.5 -39.6006 -64.7998 -40.7002 -102.9c-0.700195 -28.8994 6.09961 -57.2002 20 -82.3994l-22 -21.5
c-19.2998 31.5996 -28.9004 67.6992 -27.7998 104.699c1 44.6006 18.2998 87.6006 47.5 121.101l-25.2998 26.3994c-9.60059 -1.2998 -19.2002 2 -25.9004 9.10059c-11.2998 12 -10.9004 30.8994 1.09961 42.3994c11.9004 11.2002 30.6006 10.9004 42.4004 -1.19922z
M464.9 440c26 0 47.0996 -22.4004 47.0996 -48.2998c0 -25.9004 -21.0996 -47.7002 -47.0996 -47.7002c-6.30078 -0.0996094 -14 1.09961 -15.9004 1.7998l-62.9004 -59.7002c-32.6992 43.6006 -76.6992 65.9004 -126.899 67.2002
c-30.5 0.700195 -60.2998 -6.7998 -86.2002 -22.3994l-21.0996 22c32.1992 20.7998 69.5996 31.0996 108.1 30.1992c43.2998 -1.09961 84.5996 -16.6992 117.7 -44.5996l41.0996 38.5996c-1.5 4.7002 -2.2002 9.60059 -2.2002 14.5
c-0.0996094 26.7002 22.3008 48.4004 48.3008 48.4004zM256.7 334.6c5.5 0 10.8994 -0.399414 16.3994 -1.09961c78.1006 -9.7998 133.4 -81.0996 123.801 -159.1c-9.80078 -78.1006 -81.1006 -133.4 -159.101 -123.801c-78.0996 9.80078 -133.399 81.1006 -123.8 159.2
c9.2998 72.4004 70.0996 124.601 142.7 124.8zM197.7 215.2c0.599609 -22.7002 12.2002 -41.7998 32.3994 -52.2002l-11 -51.7002h73.7002l-11 51.7002c20.1006 10.9004 32.1006 29 32.4004 52.2002c-0.400391 32.7998 -25.7998 57.5 -58.2998 58.2998
c-32.1006 -0.799805 -57.3008 -24.7998 -58.2002 -58.2998zM256 288z" />
    <glyph glyph-name="kickstarter" unicode="&#xf3bb;" 
d="M400 -32h-352c-26.4004 0 -48 21.5996 -48 48v352c0 26.4004 21.5996 48 48 48h352c26.4004 0 48 -21.5996 48 -48v-352c0 -26.4004 -21.5996 -48 -48 -48zM199.6 269.5c0 30.7002 -17.5996 45.0996 -39.6992 45.0996c-25.8008 0 -40 -19.7998 -40 -44.5v-154.8
c0 -25.7998 13.6992 -45.5996 40.5 -45.5996c21.5 0 39.1992 14 39.1992 45.5996v41.7998l60.6006 -75.6992c12.2998 -14.9004 39 -16.8008 55.7998 0c14.5996 15.0996 14.7998 36.7998 4 50.3994l-49.0996 62.7998l40.5 58.7002c9.39941 13.5 9.5 34.5 -5.60059 49.1006
c-16.3994 15.8994 -44.5996 17.2998 -61.3994 -7l-44.8008 -64.7002v38.7998z" />
    <glyph glyph-name="kickstarter-k" unicode="&#xf3bc;" horiz-adv-x="384" 
d="M147.3 333.6v-70.5996l82.7998 118.2c31.2002 44.3994 83.3008 41.7998 113.601 12.7998c27.8994 -26.7002 27.7998 -65.0996 10.3994 -89.7998l-74.8994 -107.4l90.7998 -114.8c19.9004 -24.7998 19.5996 -64.5996 -7.40039 -92.2002
c-31.0996 -30.7002 -80.5 -27.2002 -103.199 0l-112.101 138.3v-76.5c0 -57.7998 -32.5996 -83.3994 -72.3994 -83.3994c-49.6006 0 -74.9004 36.0996 -74.9004 83.3994v283c0 45.2002 26.2002 81.4004 73.9004 81.4004c40.8994 0 73.3994 -26.2002 73.3994 -82.4004z" />
    <glyph glyph-name="laravel" unicode="&#xf3bd;" horiz-adv-x="512" 
d="M504.4 332.17c0.131836 -0.549805 0.240234 -1.45605 0.240234 -2.02246c0 -0.0185547 0 -0.0488281 -0.000976562 -0.0673828v-109.85c0.000976562 -0.0205078 0.000976562 -0.0527344 0.000976562 -0.0722656c0 -2.5498 -1.79199 -5.65332 -4.00098 -6.92773
l-92.2393 -53.1104v-105.26v-0.0224609c0 -2.54883 -1.79199 -5.65332 -4 -6.92773l-192.561 -110.84c-0.37207 -0.194336 -0.999023 -0.454102 -1.39941 -0.580078c-0.180664 -0.0605469 -0.350586 -0.169922 -0.550781 -0.220703
c-0.555664 -0.148438 -1.47363 -0.269531 -2.0498 -0.269531c-0.575195 0 -1.49414 0.121094 -2.0498 0.269531c-0.219727 0.0605469 -0.419922 0.180664 -0.629883 0.260742c-0.378906 0.119141 -0.975586 0.360352 -1.33008 0.540039l-192.5 110.84
c-2.20801 1.27441 -4 4.37891 -4 6.92773v0.0224609v329.699c0.00195312 0.589844 0.126953 1.53125 0.280273 2.10059c0.0693359 0.189453 0.199219 0.489258 0.290039 0.669922c0.111328 0.354492 0.339844 0.910156 0.509766 1.24023
c0.149414 0.259766 0.370117 0.469727 0.549805 0.719727c0.177734 0.270508 0.496094 0.6875 0.709961 0.929688c0.208008 0.179688 0.561523 0.448242 0.790039 0.600586c0.226562 0.210938 0.621094 0.520508 0.879883 0.689453v0l96.2705 55.4199
c1.02441 0.591797 2.81641 1.07227 4 1.07227c1.18262 0 2.97461 -0.480469 4 -1.07227l96.29 -55.4199v0c0.25293 -0.173828 0.647461 -0.478516 0.879883 -0.679688c0.223633 -0.154297 0.573242 -0.422852 0.779297 -0.599609
c0.21582 -0.24707 0.538086 -0.667969 0.720703 -0.94043c0.169922 -0.25 0.399414 -0.459961 0.540039 -0.719727c0.170898 -0.331055 0.404297 -0.886719 0.519531 -1.24023c0.0800781 -0.230469 0.219727 -0.44043 0.280273 -0.679688
c0.154297 -0.561523 0.280273 -1.48926 0.280273 -2.07129v-0.0195312v-205.93l80.2197 46.1904v105.239c0.00195312 0.584961 0.126953 1.5166 0.280273 2.08008c0.0693359 0.240234 0.199219 0.450195 0.279297 0.680664
c0.120117 0.354492 0.352539 0.915039 0.520508 1.25c0.149414 0.259766 0.370117 0.469727 0.540039 0.709961c0.179688 0.270508 0.50293 0.6875 0.719727 0.929688c0.205078 0.179688 0.553711 0.448242 0.780273 0.599609
c0.229492 0.208008 0.624023 0.516602 0.879883 0.69043v0l96.2803 55.4502c1.02441 0.591797 2.81641 1.07129 4 1.07129c1.18262 0 2.97461 -0.479492 4 -1.07129l96.2598 -55.4199c0.259766 -0.171875 0.663086 -0.476562 0.899414 -0.680664
c0.25 -0.199219 0.540039 -0.379883 0.770508 -0.599609c0.214844 -0.24707 0.538086 -0.667969 0.719727 -0.94043c0.164062 -0.18457 0.40625 -0.50293 0.540039 -0.709961c0.173828 -0.333008 0.411133 -0.892578 0.530273 -1.25
c0.0888672 -0.182617 0.214844 -0.487305 0.280273 -0.679688zM111.6 430.72l-80.1895 -46.1602l80.1797 -46.1699l80.2002 46.1807l-80.1904 46.1494v0zM199.85 370.72l-33.6895 -19.4297l-46.5303 -26.79v-201.29l33.6904 19.4004l46.5293 26.79v201.319zM199.85 -42.0596
l-0.109375 92.3594l-92.1904 52.1807v0v0c-0.248047 0.166992 -0.633789 0.462891 -0.859375 0.65918c-0.25 0.200195 -0.540039 0.360352 -0.770508 0.580078v0c-0.198242 0.219727 -0.494141 0.595703 -0.660156 0.839844
c-0.177734 0.206055 -0.446289 0.555664 -0.599609 0.780273v0c-0.139648 0.266602 -0.328125 0.713867 -0.419922 1c-0.125977 0.240234 -0.295898 0.643555 -0.379883 0.900391v0c-0.0683594 0.322266 -0.140625 0.850586 -0.160156 1.17969
c-0.0498047 0.246094 -0.103516 0.649414 -0.120117 0.900391v215.18l-46.5205 26.7998l-33.6895 19.3799v-311.18zM207.85 64.1104l117.62 67.1494l58.7998 33.5605l-80.1299 46.1299l-92.2598 -53.1104l-84.0898 -48.4102zM392.37 59.54v91.4102l-45.7705 -26.1504
l-130.72 -74.5996v-92.3105zM392.37 178.67v91.3301l-46.5303 26.8096l-33.6895 19.4004v-91.4199l46.5293 -26.79zM400.37 283.95l80.1797 46.1797l-80.1797 46.1504l-80.2002 -46.1602zM408.37 178.67l80.3096 46.1504v0v91.3896l-33.6797 -19.4004l-46.6299 -26.8096
v-91.3301z" />
    <glyph glyph-name="line" unicode="&#xf3c0;" 
d="M272.1 243.8v-71.0996c0 -1.7998 -1.39941 -3.2002 -3.19922 -3.2002h-11.4004c-1.09961 0 -2.09961 0.599609 -2.59961 1.2998l-32.6006 44v-42.2002c0 -1.7998 -1.39941 -3.19922 -3.2002 -3.19922h-11.3994c-1.7998 0 -3.2002 1.39941 -3.2002 3.19922v71.1006
c0 1.7998 1.40039 3.2002 3.2002 3.2002h11.2998c1 0 2.09961 -0.5 2.59961 -1.40039l32.6006 -44v42.2002c0 1.7998 1.39941 3.2002 3.2002 3.2002h11.3994c1.7998 0.0996094 3.2998 -1.40039 3.2998 -3.10059zM190.1 247c1.80078 0 3.2002 -1.5 3.2002 -3.2002v-71.0996
c0 -1.7998 -1.39941 -3.2002 -3.2002 -3.2002h-11.3994c-1.7998 0 -3.2002 1.40039 -3.2002 3.2002v71.0996c0 1.7998 1.40039 3.2002 3.2002 3.2002h11.3994zM162.6 187.4c1.7002 0 3.10059 -1.5 3.10059 -3.2002v-11.4004c0 -1.7998 -1.40039 -3.2002 -3.2002 -3.2002
h-45.7002c-0.899414 0 -1.59961 0.400391 -2.2002 0.900391c-0.599609 0.599609 -0.899414 1.2998 -0.899414 2.2002v71.0996c0 1.7998 1.39941 3.2002 3.2002 3.2002h11.3994c1.7998 0 3.2002 -1.40039 3.2002 -3.2002v-56.3994h31.0996zM332.1 247
c1.7002 0 3.10059 -1.5 3.2002 -3.2002v-11.3994c0 -1.80078 -1.39941 -3.2002 -3.2002 -3.2002h-31.0996v-12h31.0996c1.80078 0 3.2002 -1.40039 3.2002 -3.2002v-11.5c0 -1.7998 -1.39941 -3.2002 -3.2002 -3.2002h-31.0996v-12h31.0996
c1.80078 0 3.2002 -1.39941 3.2002 -3.2002v-11.3994c0 -1.7998 -1.39941 -3.2002 -3.2002 -3.2002h-45.6992c-1.80078 0 -3.2002 1.5 -3.2002 3.2002v71.0996c0 1.7998 1.5 3.2002 3.2002 3.2002h45.6992zM448 334.3v-285.3
c-0.0996094 -44.7998 -36.7998 -81.0996 -81.7002 -81h-285.3c-44.7998 0.0996094 -81.0996 36.9004 -81 81.7002v285.3c0.0996094 44.7998 36.9004 81.0996 81.7002 81h285.3c44.7998 -0.0996094 81.0996 -36.7998 81 -81.7002zM386.4 211.7
c0 73 -73.2002 132.399 -163.101 132.399c-89.8994 0 -163.1 -59.3994 -163.1 -132.399c0 -65.4004 58 -120.2 136.399 -130.601c19.1006 -4.09961 16.9004 -11.0996 12.6006 -36.7998c-0.700195 -4.09961 -3.2998 -16.0996 14.0996 -8.7998
c17.4004 7.2998 93.9004 55.2998 128.2 94.7002c23.5996 26 34.9004 52.2998 34.9004 81.5z" />
    <glyph glyph-name="lyft" unicode="&#xf3c3;" horiz-adv-x="512" 
d="M0 366.9h77.7998v-208.7c0 -33.1006 15 -52.7998 27.2002 -61c-12.7002 -11.1006 -51.2002 -20.9004 -80.2002 2.7998c-17 14 -24.7998 37.2998 -24.7998 59v207.9zM485.9 193.4c0 -14.2002 11.5996 -25.9004 26.0996 -25.9004v-76.5
c-56.7002 0 -102.7 46.0996 -102.7 102.7v77.0996c0 34.6006 -52.2002 34.6006 -52.2002 0v-23.2998h38.8008v-76.7998h-38.8008v-6.7002c0 -21.7998 -7.69922 -45 -24.7998 -59c-16.2998 -13.7002 -35.7002 -16.2998 -51.7002 -14v179.2
c0 56.7002 46.1006 102.7 102.7 102.7c49.1006 0 90.2002 -34.4004 100.3 -80.7002h26.1006v-76.7998h-23.7998v-22zM191.6 292.4v0.5h77.1006v-178.2c0 -52.4004 -29.7002 -91.7002 -76.7998 -100.8c-26.1006 -5.10059 -52.5 -2.80078 -77.6006 4.69922v70.3008
c9.7998 -4.2002 29.5 -9.40039 45 -7.80078c20.4004 2 32.7998 11.9004 34.9004 25.3008c0 0 -21.2002 -20.4004 -58.2002 -10.6006c-37 9.90039 -45 40.1006 -45 63.9004v132.7h76.7998v-113c0 -15.4004 23.7998 -15.4004 23.7998 0v113z" />
    <glyph glyph-name="magento" unicode="&#xf3c4;" 
d="M445.7 320.1v-256.1l-63.4004 -36.5v255.8l-158.5 91.6006l-158.6 -91.6006l0.399414 -255.899l-63.2998 36.5996v255.9l221.9 128.1zM255.6 27.5v255.9l63.4004 -36.6006v-256l-95.0996 -54.8994l-94.9004 54.8994l-0.0996094 255.9l63.2998 36.5996v-256
l31.7998 -18.2002z" />
    <glyph glyph-name="medapps" unicode="&#xf3c6;" horiz-adv-x="320" 
d="M118.3 209.6c3.5 12.5 6.90039 33.6006 13.2002 33.6006c8.2998 -1.7998 9.59961 -23.4004 18.5996 -36.6006c4.60059 23.5 5.30078 85.1006 14.1006 86.7002c9 0.700195 19.7002 -66.5 22 -77.5c9.89941 -4.09961 48.8994 -6.59961 48.8994 -6.59961
c1.90039 -7.2998 -24 -7.60059 -40 -7.7998c-4.59961 -14.8008 -5.39941 -27.7002 -11.3994 -28c-4.7002 -0.200195 -8.2002 28.7998 -17.5 49.5996l-9.40039 -65.5c-4.39941 -13 -15.5 22.5 -21.8994 39.2998c-3.30078 0.100586 -62.4004 1.60059 -47.6006 7.7998zM228 0
h-136c-21.2002 0 -21.2002 32 0 32h136c21.2002 0 21.2002 -32 0 -32zM204 -64h-88c-21.2002 0 -21.2002 32 0 32h88c21.2002 0 21.2002 -32 0 -32zM238.2 77.5c-3.60059 -21.2998 -36 -15.5 -32.6006 5.09961c3.60059 21.2002 5.60059 40.6006 15.3008 58.6006
c32.5996 60.2998 66.0996 95.5 66.0996 151.6c0 67.9004 -57 123.2 -127 123.2s-127 -55.2998 -127 -123.2c0 -56.0996 33.5 -91.2998 66.0996 -151.7c9.7002 -17.8994 11.7002 -36.8994 15.3008 -58.5996c3.5 -20.7998 -29.1006 -26.0996 -32.6006 -5.09961
c-3.2002 19.0996 -5.2002 36.3994 -11.8994 48.8994c-8 14.7002 -16.1006 28.1006 -24 41c-24.6006 40.4004 -45.9004 75.2998 -45.9004 125.5c0 85.6006 71.7998 155.2 160 155.2s160 -69.5996 160 -155.2c0 -50.2998 -21.2998 -85.0996 -45.9004 -125.5
c-7.89941 -12.8994 -16.0996 -26.2998 -24 -41c-6.69922 -12.3994 -8.69922 -29.8994 -11.8994 -48.7998z" />
    <glyph glyph-name="medium-m" unicode="&#xf3c7;" horiz-adv-x="512" 
d="M71.5 305.7c0.599609 5.89941 -1.7002 11.7998 -6.09961 15.7998l-45.1006 54.4004v8.09961h140.2l108.4 -237.7l95.2998 237.7h133.7v-8.09961l-38.6006 -37c-3.2998 -2.5 -5 -6.7002 -4.2998 -10.8008v-272c-0.700195 -4.09961 1 -8.2998 4.2998 -10.7998l37.7002 -37
v-8.09961h-189.7v8.09961l39.1006 37.9004c3.7998 3.7998 3.7998 5 3.7998 10.7998v219.8l-108.7 -275.899h-14.7002l-126.399 275.899v-184.899c-1.10059 -7.80078 1.5 -15.6006 7 -21.2002l50.7998 -61.6006v-8.09961h-144v8l50.7998 61.7002
c5.40039 5.59961 7.90039 13.5 6.5 21.2002v213.8z" />
    <glyph glyph-name="medrt" unicode="&#xf3c8;" horiz-adv-x="544" 
d="M113.7 192c0 -121.8 83.8994 -222.8 193.5 -241.1c-18.7002 -4.5 -38.2002 -6.90039 -58.2002 -6.90039c-137.6 0 -249 111 -249 248s111.4 248 248.9 248c20.0996 0 39.5996 -2.40039 58.1992 -6.90039c-109.6 -18.2998 -193.399 -119.3 -193.399 -241.1zM411.1 91.7002
c77.7002 55.3994 104.4 155.1 67 233.899c11.2002 -9.89941 21.5 -21.2998 30.5 -34.1992c61.6006 -88.3008 40.8008 -210.301 -46.5 -272.601c-87.2998 -62.2998 -208.1 -41.2002 -269.699 47c-9 12.7998 -16.2002 26.4004 -21.7002 40.5
c60.7998 -62.0996 162.7 -70 240.399 -14.5996zM192.3 335.7c72.5 54.5996 171.601 45.7002 221.601 -19.7998c45.2998 -59.7002 34.3994 -145.601 -22.3008 -201.801c18.5 51.4004 11.3008 111 -24.3994 158c-43 56.5 -114.601 78.3008 -178.9 60.5
c1.2998 1 2.60059 2.10059 4 3.10059zM296 224h40c4.40039 0 8 -3.59961 8 -8v-48c0 -4.40039 -3.59961 -8 -8 -8h-40c-4.40039 0 -8 -3.59961 -8 -8v-40c0 -4.40039 -3.59961 -8 -8 -8h-48c-4.40039 0 -8 3.59961 -8 8v40c0 4.40039 -3.59961 8 -8 8h-40
c-4.40039 0 -8 3.59961 -8 8v48c0 4.40039 3.59961 8 8 8h40c4.40039 0 8 3.59961 8 8v40c0 4.40039 3.59961 8 8 8h48c4.40039 0 8 -3.59961 8 -8v-40c0 -4.40039 3.59961 -8 8 -8z" />
    <glyph glyph-name="microsoft" unicode="&#xf3ca;" 
d="M0 416h214.6v-214.6h-214.6v214.6zM233.4 416h214.6v-214.6h-214.6v214.6zM0 182.6h214.6v-214.6h-214.6v214.6zM233.4 182.6h214.6v-214.6h-214.6v214.6z" />
    <glyph glyph-name="mix" unicode="&#xf3cb;" 
d="M0 384h448v-204.1c0 -56.6006 -88 -59.9004 -88 0v23.7998c0 56.7998 -82.7002 59 -88 4.2998v-116.1c0 -58 -96 -57.9004 -96 0v175.3c0 56.8994 -80.0996 59.3994 -88 6.5v-238.601c0 -58.0996 -88 -56.1992 -88 0v348.9z" />
    <glyph glyph-name="mizuni" unicode="&#xf3cc;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111.1 248 -248c0 -137 -111 -248 -248 -248s-248 111 -248 248c0 136.9 111 248 248 248zM168 88.0996v223.9c0 22.0996 -17.9004 40 -40 40s-40 -17.9004 -40 -40v-272.1c21.2002 20.8994 48.5996 37.5996 80 48.1992zM288 98v214
c0 22.0996 -17.9004 40 -40 40s-40 -17.9004 -40 -40v-214c13 2 26.4004 3.09961 40.2002 3.09961c13.5996 0 26.8994 -1.09961 39.7998 -3.09961zM408 40.2998v271.7c0 22.0996 -17.9004 40 -40 40s-40 -17.9004 -40 -40v-223.7c31.4004 -10.5996 58.7998 -27.2002 80 -48z
" />
    <glyph glyph-name="monero" unicode="&#xf3d0;" horiz-adv-x="496" 
d="M352 64h108.4c-43.4004 -71.9004 -122.301 -120 -212.4 -120s-169 48.0996 -212.4 120h108.4v127.8l104 -104.8l104 105v-128zM88 112h-74.7998c-8.60059 25.0996 -13.2002 52 -13.2002 80c0 137 111 248 248 248s248 -111 248 -248c0 -28 -4.7002 -54.9004 -13.2002 -80
h-74.7998v208l-160.6 -159.4l-159.4 159.4v-208z" />
    <glyph glyph-name="napster" unicode="&#xf3d2;" horiz-adv-x="496" 
d="M298.3 74.4004c-14.2002 -13.6006 -31.2998 -24.1006 -50.3994 -30.5c-19 6.39941 -36.2002 16.8994 -50.3008 30.5h100.7zM342.3 274c-56.3994 39.7998 -132.1 39.9004 -188.899 -0.0996094c-19.9004 16.7998 -43.6006 29.5 -69.5 36.3994v-161.6
c0 -217.3 328 -219.101 328 0.299805v161.2c-26 -7 -49.6006 -19.2998 -69.6006 -36.2002zM133.5 332.5c6.5 -3.2002 14.0996 -7.40039 20.4004 -11.4004c58.6992 30.5 129.199 30.6006 187.899 0.100586c6.7002 4.2002 13.5 8 20.6006 11.5
c-64.6006 59.8994 -164.5 59.7998 -228.9 -0.200195zM43.7998 354.8c17.5 -0.5 34.2998 -3.09961 50.6006 -7.5c82 91.6006 225.5 91.6006 307.5 0.100586c16.0996 4.39941 32.7998 6.89941 50.0996 7.39941v-69.2002c58.7002 -36.5 58.5 -121.899 -0.200195 -158.199
l-0.299805 -1.7002c-25.9004 -238.8 -381.2 -243.601 -407.6 1.5c-58.5 37.2002 -58.5 121.8 -0.100586 158.3v69.2998zM259.2 96c13.0996 59.2998 33.5 56 113 55.4004c-0.799805 -8.2002 0.0996094 -32.3008 -26.2002 -47.4004c-4.40039 -2.5 -15.2998 -6 -25.5 -6.5
c-25.2998 -1.2002 -61.2998 -1.5 -61.2998 -1.5zM123.7 151.3c79.2998 0.700195 99.7998 4 113 -55.3994c0 0 -36 0.399414 -61.2998 1.5c-10.3008 0.5 -21.1006 4 -25.5 6.5c-26.3008 15.0996 -25.4004 39.1992 -26.2002 47.3994zM292.8 27.9004
c3 -4.90039 3.2002 -8.80078 3.2998 -8.90039c-29.0996 -17.5996 -67.0996 -17.5996 -96.1992 0c0 0 0.899414 5.5 3.69922 9.59961c3.5 5.10059 6.40039 6.60059 6.40039 6.60059c23.7002 -6.90039 51.0996 -7.2998 75.9004 0c0 0 3.69922 -2 6.89941 -7.2998z" />
    <glyph glyph-name="node-js" unicode="&#xf3d3;" 
d="M224 -60c-6.7002 0 -13.5 1.7998 -19.4004 5.2002l-61.6992 36.5c-9.2002 5.2002 -4.7002 7 -1.7002 8c12.2998 4.2998 14.7998 5.2002 27.8994 12.7002c1.40039 0.799805 3.2002 0.5 4.60059 -0.400391l47.3994 -28.0996c1.7002 -1 4.10059 -1 5.7002 0l184.7 106.6
c1.7002 1 2.7998 3 2.7998 5v213.2c0 2.09961 -1.09961 4 -2.89941 5.09961l-184.601 106.5c-1.7002 1 -4 1 -5.7002 0l-184.5 -106.6c-1.7998 -1 -2.89941 -3 -2.89941 -5.10059v-213.1c0 -2 1.09961 -4 2.89941 -4.90039l50.6006 -29.1992
c27.5 -13.7002 44.2998 2.39941 44.2998 18.6992v210.4c0 3 2.40039 5.2998 5.40039 5.2998h23.3994c2.90039 0 5.40039 -2.2998 5.40039 -5.2998v-210.5c0 -36.5996 -20 -57.5996 -54.7002 -57.5996c-10.7002 0 -19.0996 0 -42.5 11.5996l-48.4004 27.9004
c-12 6.89941 -19.3994 19.7998 -19.3994 33.6992v213.101c0 13.7998 7.39941 26.7998 19.3994 33.7002l184.5 106.6c11.7002 6.59961 27.2002 6.59961 38.8008 0l184.699 -106.7c12 -6.89941 19.4004 -19.7998 19.4004 -33.7002v-213.1
c0 -13.7998 -7.40039 -26.7002 -19.4004 -33.7002l-184.699 -106.6c-5.90039 -3.40039 -12.6006 -5.2002 -19.4004 -5.2002zM373.1 150.1c0 -40.1992 -33.5996 -63.2998 -92 -63.3994c-80.8994 0 -97.7998 37.0996 -97.7998 68.2002c0 2.89941 2.2998 5.2998 5.2998 5.2998
h23.9004c2.7002 0 4.90039 -1.90039 5.2998 -4.5c3.60059 -24.2998 14.2998 -36.6006 63.2002 -36.6006c38.9004 0 55.5 8.80078 55.5 29.4004c0 11.9004 -4.7002 20.7998 -65.2002 26.7002c-50.5 5 -81.7998 16.2002 -81.7998 56.5996c0 37.2998 31.4004 59.5 84.0996 59.5
c59.2002 0 88.5 -20.5 92.2002 -64.5996c0.100586 -1.5 -0.399414 -3 -1.39941 -4.10059c-1 -1.09961 -2.40039 -1.69922 -3.90039 -1.69922h-24c-2.5 0 -4.7002 1.7998 -5.2002 4.19922c-5.7998 25.6006 -19.7998 33.8008 -57.7002 33.8008
c-42.5 0 -47.3994 -14.8008 -47.3994 -25.9004c0 -13.4004 5.7998 -17.2998 63.2002 -24.9004c56.6992 -7.5 83.6992 -18.0996 83.6992 -58z" />
    <glyph glyph-name="npm" unicode="&#xf3d4;" horiz-adv-x="576" 
d="M288 160h-32v64h32v-64zM576 288v-192h-288v-32h-128v32h-160v192h576zM160 256h-128v-128h64v96h32v-96h32v128zM320 256h-128v-160h64v32h64v128zM544 256h-192v-128h64v96h32v-96h32v96h32v-96h32v128z" />
    <glyph glyph-name="ns8" unicode="&#xf3d5;" horiz-adv-x="640" 
d="M187.1 288.1h44.9004l-48.5 -160.1h-56.9004l-50.5996 106.5l-31.0996 -106.5h-44.9004l49 160.1h49.4004l54.5 -113.699zM639.6 289c4.60059 -28.5996 -36.0996 -44.7002 -65.6992 -50.5996h-0.100586c17.5 -29.3008 22.1006 -69.3008 3.40039 -105.5
c-26.4004 -51.2002 -86.5 -79.9004 -135.101 -68c-29.3994 7.19922 -51.3994 29 -56.7998 59.5c-0.700195 3.5 -1 7.09961 -1.2002 10.7998c-5.5 -2.7998 -11.8994 -4.2002 -18.5 -4.90039c-15.5996 -1.7002 -21 -2.2998 -160.899 -2.2998l11.5996 39.5h126.8
c9.10059 0 12.2002 3.2002 13.8008 7.40039c1.69922 4.59961 3.39941 10.1992 4.5 14.5996c1.09961 3.90039 0.0996094 6.59961 -7.7002 6.59961h-87.2998c-33.4004 0 -38.2002 9.2002 -32.8008 28.6006c3.2002 11.5 10.8008 37.2002 17.6006 47.0996
c7.09961 10.2002 18.2998 13.7002 30.5996 15c15.6006 1.7002 20.4004 1.2002 160.101 1.2002l-9.7002 -31.5h-133.5c-5.5 0 -11.2002 -0.700195 -13.2998 -7.09961c-1.80078 -5.40039 -2.10059 -6.7002 -3.7002 -12.2002c-1.40039 -5.10059 2.2002 -7.40039 11.5 -7.40039
h87.5996c20.4004 0 31 -6.7998 34 -16.5996c19.9004 21.3994 50.4004 39.5 94.2002 48.2002v0.0996094c-13.4004 42.5 43.9004 66.5996 88.5 58.7998c18.2002 -3.2002 39.2002 -13.2998 42.0996 -31.2998zM530.7 184.3c3.09961 15.7998 -0.5 33.7002 -7.2002 47.7998
c-23.2998 -2.89941 -52.2998 -10.0996 -68.5 -26.8994c-24.4004 -25.2998 -16.7998 -60 14.0996 -64.7998c25 -3.90039 55.7002 14.3994 61.6006 43.8994zM552.5 267.4c10.5996 1.5 23.5 3.5 34.2002 9.59961c14.7998 8.5 10.3994 21 -4.90039 24.4004
c-10.8994 2.39941 -25.0996 -0.5 -31.7998 -7.7002c-7.2998 -7.7998 -1.7002 -20.2998 2.5 -26.2998z" />
    <glyph glyph-name="nutritionix" unicode="&#xf3d6;" horiz-adv-x="400" 
d="M88 439.9c0 0 133.4 8.19922 121 -104.4c0 0 19.0996 74.9004 103 40.5996c0 0 -17.7002 -74 -88 -56c0 0 14.5996 54.6006 66.0996 56.6006c0 0 -39.8994 10.2998 -82.0996 -48.7998c0 0 -19.7998 94.5 -93.5996 99.6992c0 0 75.1992 -19.3994 77.5996 -107.5
c0 -0.0996094 -106.4 -7 -104 119.801zM400 124.3c0 -48.5 -9.7002 -95.2998 -32 -132.3c-42.2002 -30.9004 -105 -48 -168 -48c-62.9004 0 -125.8 17.0996 -168 48c-22.2998 37 -32 83.7998 -32 132.3c0 48.4004 17.7002 94.7002 40 131.7
c42.2002 30.9004 97.0996 48.5996 160 48.5996c63 0 117.8 -17.5996 160 -48.5996c22.2998 -37 40 -83.2998 40 -131.7zM120 20c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28s12.5 -28 28 -28s28 12.5 28 28zM120 86.2002c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28
s12.5 -28 28 -28s28 12.5 28 28zM120 152.4c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28s12.5 -28 28 -28s28 12.5 28 28zM192 20c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28s12.5 -28 28 -28s28 12.5 28 28zM192 86.2002c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28
s12.5 -28 28 -28s28 12.5 28 28zM192 152.4c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28s12.5 -28 28 -28s28 12.5 28 28zM264 20c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28s12.5 -28 28 -28s28 12.5 28 28zM264 86.2002c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28
s12.5 -28 28 -28s28 12.5 28 28zM264 152.4c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28s12.5 -28 28 -28s28 12.5 28 28zM336 20c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28s12.5 -28 28 -28s28 12.5 28 28zM336 86.2002c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28
s12.5 -28 28 -28s28 12.5 28 28zM336 152.4c0 15.5 -12.5 28 -28 28s-28 -12.5 -28 -28s12.5 -28 28 -28s28 12.5 28 28zM360 192c-4.7998 22.2998 -7.40039 36.9004 -16 56c-38.7998 19.9004 -90.5 32 -144 32s-105.2 -12.0996 -144 -32
c-8.7998 -19.5 -11.2002 -33.9004 -16 -56c42.2002 7.90039 98.7002 14.7998 160 14.7998s117.8 -6.89941 160 -14.7998z" />
    <glyph glyph-name="page4" unicode="&#xf3d7;" horiz-adv-x="496" 
d="M248 -56c-137 0 -248 111 -248 248s111 248 248 248c20.9004 0 41.2998 -2.59961 60.7002 -7.5l-266.4 -376.5h205.7v-112zM248 87.5996h-149.4l149.4 213.601v-213.601zM344 56h111.4c-26.9004 -41 -65.7002 -73.5 -111.4 -92.7002v92.7002zM401.4 194.2v-16.7002
l-21.2002 8.2998zM381.1 139.7c5.90039 0 8.2002 -4.7002 8.2002 -10.6006v-10h-16.2002v7.7002c0 6.60059 1.30078 12.9004 8 12.9004zM496 192c0 -37.2998 -8.2002 -72.7002 -23 -104.4h-129v333.101c89.2998 -37.5 152 -125.8 152 -228.7zM360.4 304.4h68.1992v47.5996
h-13.8994v-32.5996h-13.9004v29.5996h-13.8994v-29.5996h-12.7002v32.5996h-13.9004v-47.5996h0.100586zM428.5 119.1h-26.5v11c0 15.4004 -5.59961 25.2002 -20.9004 25.2002c-15.3994 0 -20.6992 -10.5996 -20.6992 -25.8994v-25.3008h68.1992v15h-0.0996094zM428.5 222.1
l-68.2002 -29.6992v-12.4004l68.2002 -29.5v16.5996l-14.4004 5.7002v26.5l14.4004 5.90039v16.8994zM423.7 290.6h-35.6006v-26.5996h13.9004v12.2002h11c8.59961 -15.7998 1.2998 -35.2998 -18.5996 -35.2998c-22.5 0 -28.3008 25.2998 -15.5 37.6992l-11.6006 10.6006
c-16.2002 -17.5 -12.2002 -63.9004 27.1006 -63.9004c34 0 44.6992 35.9004 29.2998 65.2998z" />
    <glyph glyph-name="palfed" unicode="&#xf3d8;" horiz-adv-x="576" 
d="M384.9 254.1c0.0996094 -53.3994 -46.5 -96.1992 -83.3008 -96.1992c-12.5 0 -14.3994 3.39941 -15.0996 6.19922c0.5 39.1006 1.7002 80.4004 3 119.801c40.2002 14.3994 95.4004 17.5996 95.4004 -29.8008zM190.4 181.9
c-0.200195 0.599609 -0.400391 2.09961 -0.600586 4.59961c0 25.5996 37 60.9004 58.5 75.9004c-1.2002 -36.4004 -5.5 -198.101 -1.39941 -242.5c3 -32.3008 26.7998 -32.9004 36.3994 -22.3008c5.90039 6.60059 5.5 15.7002 5.2998 19.1006v0.200195
c-1.7998 25.5996 -2.7998 60.5996 -2.69922 100c60.7998 -14.4004 140.1 60.2998 140.1 138.199c0 71 -63 94.2002 -135.2 72c-2.89941 14.6006 -18.2998 20.1006 -29.5 11.1006c-7.5 -6.2002 -9.5 -15.7998 -10.5 -28.2002c-57.7998 -30.9004 -100.7 -84.5 -100.7 -126.5
c0 -24.9004 15.6006 -43 37.1006 -43c35.0996 0 41 44.0996 14.3994 44.0996c-4.69922 0 -11 -2.69922 -11.1992 -2.69922zM8 266.9c0 38.5996 38.4004 37.3994 38.4004 37.3994h29c15.5 70.1006 120.5 74.2998 120.5 74.2998h28.0996v19.1006
c0 18.3994 21.0996 18.3994 21.0996 18.3994h85.8008c18.3994 0 21.0996 -18.3994 21.0996 -18.3994v-19.1006h28c89.2002 0 112.1 -48.6992 119.4 -74.2998h30.0996c38.5 0 38.4004 -37.3994 38.4004 -37.3994c0 -38.6006 -38.4004 -37.4004 -38.4004 -37.4004h-30
l-22.4004 -217.2c0 -43.8994 -44.6992 -44.2998 -44.6992 -44.2998h-288.9c-44.7002 0 -44.7002 44.2998 -44.7002 44.2998l-22.3994 217.2h-30c-38.5 0 -38.4004 37.4004 -38.4004 37.4004z" />
    <glyph glyph-name="patreon" unicode="&#xf3d9;" horiz-adv-x="512" 
d="M512 253.2c0 -101.3 -82.4004 -183.8 -183.8 -183.8c-101.7 0 -184.4 82.3994 -184.4 183.8c0 101.6 82.7002 184.3 184.4 184.3c101.399 0 183.8 -82.7002 183.8 -184.3zM0 -53.5v491h90v-491h-90z" />
    <glyph glyph-name="periscope" unicode="&#xf3da;" 
d="M370 384.4c38.4004 -40.7002 59.5 -94.3008 59.5 -150.801c0 -74.2998 -57.4004 -159.5 -82 -192.6c-8 -10.7998 -79.2998 -105 -120.9 -105c-34 0 -88.7998 56.5 -125.399 104.9c-24.9004 32.8994 -82.7002 117.6 -82.7002 192.699c0 118.2 93.4004 214.4 208.1 214.4
c53.9004 0 104.801 -22.5996 143.4 -63.5996zM226.6 -45.9004c37.3008 0 184.801 167.301 184.7 279.4c0 107.3 -83.8994 196.3 -184.7 196.3c-106.1 0 -190 -88.8994 -190 -196.3c0 -112.1 147.5 -279.4 190 -279.4zM338 241.2c0 -59.1006 -51.0996 -109.7 -110.8 -109.7
c-100.601 0 -150.7 108.2 -92.9004 181.8v-0.399414c0 -24.5 20.1006 -44.4004 44.7998 -44.4004c24.7002 0 44.8008 19.9004 44.8008 44.4004c0 18.1992 -11.1006 33.7998 -26.9004 40.6992c76.5996 19.2002 141 -39.2998 141 -112.399z" />
    <glyph glyph-name="phabricator" unicode="&#xf3db;" horiz-adv-x="496" 
d="M323 185.9c0 0 21.5996 -19.6006 20.9004 -20.7002l-8.10059 -19.7998c-0.5 -1.40039 -29.7002 -0.5 -29.7002 -0.5l-9.09961 -9.10059s1.59961 -31.5 0.200195 -32.0996l-20 -7.5c-1.2998 -0.5 -21.7998 23.2998 -21.7998 23.2998l-13.1006 0.200195
s-19.2998 -24.1006 -20.7002 -23.5l-20.0996 8.2998c-1.40039 0.5 -1.2002 32.2998 -1.2002 32.2998l-9.39941 9.2998s-28.9004 -0.899414 -29.5 0.5l-9.5 20c-0.600586 1.40039 21.0996 21.2002 21.0996 21.2002l-0.0996094 12.9004s-21.6006 19.5996 -21 21
l8.09961 19.7998c0.5 1.2998 29.7002 0.400391 29.7002 0.400391l9.09961 9.09961s-1.59961 28.4004 -0.200195 28.9004l20 8.2998c1.40039 0.599609 21.9004 -20.7998 21.9004 -20.7998l13.0996 -0.200195s19.3008 21.5996 20.7002 21l20.1006 -9.2002
c1.39941 -0.599609 1.19922 -29.0996 1.19922 -29.0996l9.40039 -9.30078s28.9004 0.900391 29.5 -0.5l9.5 -20c0.599609 -1.39941 -21.0996 -21.1992 -21.0996 -21.1992zM278.1 194.6c-0.699219 17 -15.5 30.3008 -32.7998 29.5
c-17.2998 -0.699219 -30.7998 -15.1992 -30.0996 -32.2998c0.700195 -17.0996 15.5 -30.3994 32.7998 -29.5996s30.7998 15.2998 30.0996 32.3994zM479.3 232.5c22.2998 -22.2998 22.2998 -58.7002 0 -81c-67.3994 -67.4004 -44.2998 -44.4004 -95.2998 -95.2998
c-74.4004 -74.5 -194.7 -74.9004 -269.8 -1.60059l-0.100586 -0.0996094c-51 51 -27.5 27.5996 -97.3994 97c-22.2998 22.2998 -22.2998 58.7002 0 81c67.8994 67.4004 44.7998 44.2998 95.7002 95.2998c74.3994 74.4004 194.699 74.9004 269.8 1.60059l0.0996094 0.0996094
zM140.4 84.2002c59.5996 -59.5 156 -59.6006 215.6 -0.100586c59.5996 59.6006 59.5 156.101 0 215.601c-59.5996 59.5 -156.1 59.5996 -215.6 0c-59.6006 -59.5 -59.6006 -156 0 -215.5z" />
    <glyph glyph-name="phoenix-framework" unicode="&#xf3dc;" horiz-adv-x="640" 
d="M212.9 103.7c-36.7002 -1.2002 -108.7 29.2998 -127.7 106.399c-8.7002 35.3008 -2.7002 51.8008 -8 86.1006c-8.2002 53.3994 -32.1006 72.2002 -55.9004 76.5c-6.2002 1.09961 -12.3994 1.2998 -18.7002 0.299805
c-0.799805 -0.0996094 -1.59961 -0.200195 -2.39941 -0.200195c-0.100586 0.200195 -0.100586 0.299805 -0.200195 0.5c0.700195 0.600586 1.40039 1.2002 2.2002 1.7998c36.8994 26.9004 92 38.4004 136.3 35c123.6 -9.5 141.3 -156.6 252.5 -173.1
c6.09961 -0.900391 12.2998 -1.09961 18.5 -1.7002c0.700195 -0.0996094 1.40039 -0.0996094 2.5 -0.200195c-2.09961 -2.19922 -21.5996 -11.7998 -36.5 -14.5c-18.4004 -3.39941 -35.7002 -0.0996094 -51.2998 10.3008c-14.5 9.7998 -24.5 23.5 -38.9004 27.3994
c-13 3.60059 -34.0996 1.7002 -35.8994 -19.5996c-1.30078 -15.9004 14.1992 -51.7998 51.7998 -74.6006c40.3994 -24.5 101.399 -26.8994 134.7 -14.7998c0.299805 0.100586 0.699219 0.200195 1.09961 0.299805c0.200195 0.100586 0.400391 0 1 -0.0996094
c-23.5996 -28.4004 -71.2002 -49.9004 -108.2 -45.4004c-50.3994 6.2002 -77.7002 75.9004 -113.7 97.5c-19.0996 11.5 -49.0996 7 -52 -18.5c-1.09961 -10 2.10059 -19 6.40039 -27.5996c24.4004 -48.5996 65.5996 -47 68 -49.5996
c-2.7998 -0.800781 -21.7998 -2.10059 -25.5996 -2.2002zM75.2998 383.1c13.1006 -14.5 34.2002 -7.89941 35.2998 6.80078c-12.3994 -0.700195 -24.5 -2.2002 -36.5996 -4.80078c0.400391 -0.799805 0.400391 -1 1.2998 -2zM272.2 32.5996
c-42.7998 -1.19922 -92 26.7002 -123.5 61.4004c-4.60059 5 -16.7998 20.2002 -18.6006 23.4004l0.400391 0.399414c6.59961 -4.09961 25.7002 -18.5996 54.7998 -27c24.2002 -7 48.1006 -6.2998 71.6006 3.2998c22.6992 9.30078 41 0.5 43.0996 -2.89941
c-18.5 -3.7998 -20.0996 -4.40039 -24 -7.90039c-5.09961 -4.39941 -4.59961 -11.7002 7 -17.2002c26.2002 -12.3994 63 2.80078 97.2002 -25.3994c2.39941 -2 8.09961 -7.7998 10.0996 -10.7002c-0.0996094 -0.200195 -0.299805 -0.299805 -0.399414 -0.5
c-4.80078 1.5 -16.4004 7.5 -40.2002 9.2998c-24.7002 2 -46.2998 -5.2998 -77.5 -6.2002zM447 284.6c16.4004 5.2002 41.2998 13.4004 66.5 3.30078c16.0996 -6.5 26.2002 -18.7002 32.0996 -34.6006c3.5 -9.39941 5.10059 -19.7002 5.10059 -28.7002
c-0.200195 0 -0.400391 0 -0.600586 -0.0996094c-0.199219 0.400391 -0.399414 0.900391 -0.5 1.2998c-5 22 -29.8994 43.7998 -67.5996 29.9004c-50.2002 -18.6006 -130.4 -9.7002 -176.9 48c-0.699219 0.899414 -2.39941 1.7002 -1.2998 3.2002
c0.100586 0.199219 2.10059 -0.600586 3 -1.30078c18.1006 -13.3994 38.2998 -21.8994 60.2998 -26.1992c30.5 -6.10059 54.6006 -2.90039 79.9004 5.19922zM549.7 167.1c-32.4004 -0.199219 -33.7998 -50.0996 -103.601 -64.3994
c-18.1992 -3.7002 -38.6992 -4.60059 -44.8994 -4.2002v0.400391c2.7998 1.5 14.7002 2.59961 29.7002 16.5996c7.89941 7.2998 15.2998 15.0996 22.7998 22.9004c19.5 20.1992 41.3994 42.1992 81.8994 39c23.1006 -1.80078 29.3008 -8.2002 36.1006 -12.7002
c0.299805 -0.200195 0.399414 -0.5 0.700195 -0.900391c-0.5 0 -0.700195 -0.0996094 -0.900391 0c-7 2.7002 -14.2998 3.2998 -21.7998 3.2998zM537.4 191.2c-0.100586 -0.200195 -0.100586 -0.400391 -0.200195 -0.600586c-28.9004 4.40039 -48 7.90039 -68.5 -4
c-17 -9.89941 -31.4004 -20.5 -62 -24.3994c-27.1006 -3.40039 -45.1006 -2.40039 -66.1006 8c-0.299805 0.200195 -0.599609 0.399414 -1 0.599609c0 0.200195 0.100586 0.299805 0.100586 0.5c24.8994 -3.7998 36.3994 -5.09961 55.5 5.7998
c22.2998 12.9004 40.0996 26.6006 71.2998 31c29.5996 4.10059 51.2998 -2.5 70.9004 -16.8994zM268.6 350.7c-0.599609 0.599609 -1.09961 1.2002 -2.09961 2.2998c7.59961 0 29.7002 1.2002 53.4004 -8.40039c19.6992 -8 32.1992 -21 50.1992 -32.8994
c11.1006 -7.2998 23.4004 -9.2998 36.4004 -8.10059c4.2998 0.400391 8.5 1.2002 12.7998 1.7002c0.400391 0.100586 0.900391 0 1.5 -0.299805c-0.599609 -0.400391 -1.2002 -0.900391 -1.7998 -1.2002c-8.09961 -4 -16.7002 -6.2998 -25.5996 -7.09961
c-26.1006 -2.60059 -50.3008 3.7002 -73.4004 15.3994c-19.2998 9.90039 -36.4004 22.9004 -51.4004 38.6006zM640 112.3c-3.5 -3.09961 -22.7002 -11.5996 -42.7002 -5.2998c-12.2998 3.90039 -19.5 14.9004 -31.5996 24.0996
c-10 7.60059 -20.9004 7.90039 -28.1006 8.40039c0.600586 0.799805 0.900391 1.2002 1.2002 1.40039c14.7998 9.19922 30.5 12.1992 47.2998 6.5c12.5 -4.2002 19.2002 -13.5 30.4004 -24.2002c10.7998 -10.4004 21 -9.90039 23.0996 -10.5
c0.100586 0.0996094 0.200195 0 0.400391 -0.400391zM427.5 -24.7002c2.2002 -1.2002 1.59961 -1.5 1.5 -2c-18.5 1.40039 -33.9004 7.60059 -46.7998 22.2002c-21.7998 24.7002 -41.7002 27.9004 -48.6006 29.7002c0.5 0.200195 0.800781 0.399414 1.10059 0.399414
c13.0996 -0.0996094 26.0996 -0.699219 38.8994 -3.89941c25.3008 -6.40039 35 -25.4004 41.6006 -35.2998c3.2002 -4.80078 7.2998 -8.30078 12.2998 -11.1006z" />
    <glyph glyph-name="playstation" unicode="&#xf3df;" horiz-adv-x="576" 
d="M570.9 75.7002c-11.3008 -14.2002 -38.8008 -24.2998 -38.8008 -24.2998l-205.1 -73.6006v54.2998l150.9 53.8008c17.0996 6.09961 19.7998 14.7998 5.7998 19.3994c-13.9004 4.60059 -39.1006 3.2998 -56.2002 -2.89941l-100.5 -35.5v56.3994
c23.2002 7.7998 47.0996 13.6006 75.7002 16.7998c40.8994 4.5 90.8994 -0.599609 130.2 -15.5c44.1992 -14 49.1992 -34.6992 38 -48.8994zM346.5 168.2v139c0 16.2998 -3 31.2998 -18.2998 35.5996c-11.7002 3.7998 -19 -7.09961 -19 -23.3994v-347.9l-93.7998 29.7998
v414.7c39.8994 -7.40039 98 -24.9004 129.199 -35.4004c79.5 -27.2998 106.4 -61.2998 106.4 -137.8c0 -74.5 -46 -102.8 -104.5 -74.5996zM43.2002 37.7998c-45.4004 12.7998 -53 39.5 -32.2998 54.7998c19.0996 14.2002 51.6992 24.9004 51.6992 24.9004l134.5 47.7998
v-54.5l-96.7998 -34.5996c-17.0996 -6.10059 -19.7002 -14.7998 -5.7998 -19.4004c13.9004 -4.59961 39.0996 -3.2998 56.2002 2.90039l46.3994 16.8994v-48.7998c-51.5996 -9.2998 -101.399 -7.2998 -153.899 10z" />
    <glyph glyph-name="pushed" unicode="&#xf3e1;" horiz-adv-x="432" 
d="M407 336.1c21.7002 -1.89941 33.7998 -28 17.4004 -44.7998l-235.2 -231.3l-35.2998 -80.7998c-11 -17.2002 -41.2002 -14.2998 -47.7002 7l-105.101 348.3c-4.59961 18.2998 6.30078 33.9004 21.4004 36.5996l271.3 44.4004c17.9004 3.40039 39.1006 -13.5 28.7002 -37
l-14 -33.4004zM297.6 394.4l-189 -31l177.4 -16.3008l16.7998 39.9004c2.2998 4.90039 -0.0996094 8.09961 -5.2002 7.40039zM22.7002 340.1l157.899 -244.3l96.9004 230.7l-248.7 22.7002c-5.09961 0.899414 -9.2002 -4 -6.09961 -9.10059zM136 -8.40039
c0 0 28.2002 64.1006 35.2002 79.1006l-127.7 197.6l83.0996 -275.5c1.5 -4.2998 6.80078 -5.2002 9.40039 -1.2002zM408.8 306.1c3.10059 3.30078 1.40039 7.5 -2.59961 8.60059l-106.4 9.7002l-89.7002 -213.7z" />
    <glyph glyph-name="python" unicode="&#xf3e2;" 
d="M439.8 247.5c10.7002 -42.9004 11.2002 -75.0996 0 -108.6c-10.7998 -32.5 -22.2998 -54.2002 -53.3994 -54.2002h-160.2v-13.6006h106.7v-40.6992c0 -30.8008 -26.5 -46.5 -53.4004 -54.3008c-40.5 -11.6992 -73 -9.89941 -106.8 0
c-28.2002 8.30078 -53.4004 25.3008 -53.4004 54.3008v101.8c0 29.2998 24.2002 54.2998 53.4004 54.2998h106.8c35.5996 0 66.7998 31 66.7998 67.7998v47.4004h40.1006c31.0996 0 45.6992 -23.2998 53.3994 -54.2002zM286.2 44c-11 0 -20 -9 -20.1006 -20.2998
c0 -11.2002 9.10059 -20.4004 20.1006 -20.4004c11.0996 0 20.0996 9.10059 20.0996 20.4004c0 11.2002 -9 20.2998 -20.0996 20.2998zM167.8 199.9c-36.2998 0 -66.7998 -31.1006 -66.7998 -66.4004v-48.7998h-36.7002c-31.0996 0 -49.2002 22.5996 -56.7998 54.2002
c-10.2002 42.5 -9.7998 67.8994 0 108.6c8.5 35.5 35.7002 54.2002 66.7998 54.2002h147v13.5996h-106.899v40.7002c0 30.9004 8.19922 47.5996 53.3994 55.5996c32.1006 5.7002 71 6 106.8 0.100586c29 -4.90039 53.4004 -26.6006 53.4004 -55.6006v-101.899
c0 -29.7998 -23.7002 -54.2998 -53.4004 -54.2998h-106.8zM161.1 342.5c11.1006 0 20.1006 9.09961 20.1006 20.2998s-9.10059 20.4004 -20.1006 20.4004c-11.0996 0 -20 -9.10059 -20.0996 -20.4004c0 -11.2002 9 -20.2998 20.0996 -20.2998z" />
    <glyph glyph-name="red-river" unicode="&#xf3e3;" 
d="M353.2 416c52.3994 0 94.7998 -42.4004 94.7998 -94.7998v-258.4c0 -52.3994 -42.4004 -94.7998 -94.7998 -94.7998h-258.4c-52.3994 0 -94.7998 42.4004 -94.7998 94.7998v258.4c0 52.3994 42.4004 94.7998 94.7998 94.7998h258.4zM144.9 247.1
c-0.600586 12.4004 11.6992 24.6006 24 24h56.2998c27 0 48.8994 21.9004 48.8994 48.9004h-154.199c-13.2002 0 -23.9004 -10.7002 -23.9004 -23.9004v-154.199c27 0 48.9004 21.8994 48.9004 48.8994v56.2998zM321.2 175.1c27 0 48.8994 21.9004 48.8994 48.9004h-154.199
c-13.2002 0 -23.9004 -10.7002 -23.9004 -23.9004v-154.199c27 0 48.9004 21.8994 48.9004 48.8994v56.2998c-0.600586 12.4004 11.6992 24.6006 24 24h56.2998z" />
    <glyph glyph-name="wpressr" unicode="&#xf3e4;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM419.33 281.4c2.41016 5.47949 0.459961 8.2793 -5.62012 8.26953c-104.8 0.00976562 -107.69 -0.0302734 -130.78 0.0302734
c-4.31934 0.00976562 -7.10938 -1.82031 -8.83984 -5.78027c-5.70996 -13.0996 -11.5195 -26.1504 -17.2998 -39.21c-2.57031 -5.7998 -1 -8.26953 5.26953 -8.26953c25.2607 0 50.5205 -0.0107422 75.7803 0.0195312
c10.0303 0.00976562 8.54004 -13.6602 -3.89941 -13.6396c-26.4307 0.0498047 -52.8604 0 -79.29 0.0498047c-4.91016 0.00976562 -8.33008 -1.88965 -10.3506 -6.5c-4.2998 -9.83008 -32.1494 -73.0801 -32.1895 -73.1602
c-3.2002 -7.16016 -16.2607 -6.09961 -11.2803 5.33008c8.26953 18.9902 16.6504 37.9297 24.9795 56.8896c2.25 5.11035 -0.0996094 8.74023 -5.65918 8.75c-15.21 0.0205078 -30.4307 -0.0400391 -45.6406 0.0400391
c-3.35938 0.0107422 -5.41016 -1.29004 -6.76953 -4.38965c-31.4307 -71.8701 -29.7803 -67.3203 -30.0098 -67.6904c-3.87012 -6.37012 -14.8604 -3.34961 -10.9502 5.60059c5.66992 13.0098 11.3701 26.0098 17.0898 39c13.5703 30.7793 27.1396 61.5596 40.7402 92.3301
c2.54004 5.75 -0.419922 10.5801 -6.66016 10.5898c-14.2402 0.0302734 -28.4805 -0.0498047 -42.7197 0.0498047c-4.26074 0.0302734 -6.84082 -1.76953 -8.54004 -5.65039c-12.8604 -29.3896 -25.8203 -58.7295 -38.75 -88.0791
c-8.62012 -19.5605 -17.2305 -39.1201 -25.8906 -58.6602c-1.58008 -3.55078 -1.47949 -6.78027 1.20996 -9.73047c11.2207 -12.3096 22.4707 -24.6094 33.6807 -36.9395c2.08984 -2.30078 4.58984 -3.4502 7.71973 -3.4502c45.9395 0.0195312 91.8701 0.00976562 137.81 0
c3.86035 0 6.37988 1.78027 7.91992 5.29004c10.3203 23.5 20.7607 46.9395 30.9502 70.5c2.08984 4.83008 5.21973 6.75 10.3398 6.71973c23.0205 -0.110352 46.0303 -0.0400391 69.0508 -0.0498047c6.0791 0 10.5293 2.72949 12.9697 8.24023
c15.2598 34.4795 30.4502 68.9893 45.6299 103.5z" />
    <glyph glyph-name="replyd" unicode="&#xf3e6;" 
d="M320 -32h-192c-70.4004 0 -128 57.5996 -128 128v192c0 70.4004 57.5996 128 128 128h192c70.4004 0 128 -57.5996 128 -128v-192c0 -70.4004 -57.5996 -128 -128 -128zM193.4 174.8c-6.10059 2 -11.6006 3.10059 -16.4004 3.10059
c-7.2002 0 -13.5 -1.90039 -18.9004 -5.60059c-5.39941 -3.7002 -9.59961 -9 -12.7998 -15.7998h-1.09961l-4.2002 18.2998h-28v-138.899h36.0996v89.6992c1.5 5.40039 4.40039 9.80078 8.7002 13.2002c4.2998 3.40039 9.7998 5.10059 16.2002 5.10059
c4.59961 0 9.7998 -1 15.5996 -3.10059zM308.6 71.4004c-3.19922 -2.40039 -7.69922 -4.80078 -13.6992 -7.10059s-12.8008 -3.5 -20.4004 -3.5c-12.2002 0 -21.0996 3 -26.5 8.90039c-5.5 5.89941 -8.5 14.7002 -9 26.3994h83.2998
c0.900391 4.80078 1.60059 9.40039 2.10059 13.9004c0.5 4.40039 0.699219 8.59961 0.699219 12.5c0 10.7002 -1.59961 19.7002 -4.69922 26.9004c-3.2002 7.19922 -7.30078 13 -12.5 17.1992c-5.2002 4.30078 -11.1006 7.30078 -17.8008 9.2002
c-6.69922 1.7998 -13.5 2.7998 -20.5996 2.7998c-21.0996 0 -37.5 -6.09961 -49.2002 -18.2998s-17.5 -30.5 -17.5 -55c0 -22.7998 5.2002 -40.7002 15.6006 -53.7002c10.3994 -13.0996 26.7998 -19.5996 49.1992 -19.5996c10.7002 0 20.9004 1.5 30.4004 4.59961
c9.5 3.10059 17.0996 6.80078 22.5996 11.2002zM286.8 141.7c3.7998 -5.40039 5.2998 -13.1006 4.60059 -23.1006h-51.7002c0.899414 9.40039 3.7002 17 8.2002 22.6006c4.5 5.59961 11.5 8.5 21 8.5c8.19922 0.0996094 14.0996 -2.60059 17.8994 -8zM366.7 139.2
c4.09961 -3.90039 9.39941 -5.7998 16.0996 -5.7998c7 0 12.6006 1.89941 16.7002 5.7998c4.09961 3.89941 6.09961 9.09961 6.09961 15.5996s-2 11.6006 -6.09961 15.4004s-9.59961 5.7002 -16.7002 5.7002c-6.7002 0 -12 -1.90039 -16.0996 -5.7002
c-4.10059 -3.7998 -6.10059 -8.90039 -6.10059 -15.4004s2 -11.7002 6.10059 -15.5996zM366.7 38.7002c4.09961 -3.90039 9.39941 -5.7998 16.0996 -5.7998c7 0 12.6006 1.89941 16.7002 5.7998c4.09961 3.89941 6.09961 9.09961 6.09961 15.5996
s-2 11.6006 -6.09961 15.4004s-9.59961 5.7002 -16.7002 5.7002c-6.7002 0 -12 -1.90039 -16.0996 -5.7002c-4.10059 -3.7998 -6.10059 -8.90039 -6.10059 -15.4004c0 -6.59961 2 -11.7002 6.10059 -15.5996z" />
    <glyph glyph-name="resolving" unicode="&#xf3e7;" horiz-adv-x="496" 
d="M281.2 169.8l-197.9 -57.2002l-28.5996 98.6006l188.2 54.0996c52.6992 15.2998 65 8.10059 71.0996 -12.7998l11.2002 -39.2998c5.59961 -19.9004 2 -30.1006 -44 -43.4004zM248.5 440c137 0 248.5 -111.4 247.5 -247.7c0 -136.899 -111.5 -248.3 -248.5 -248.3
c-46 0 -89.5 12.7002 -126.3 34.7002l-23 80.2002l286.8 -37.3008l48.0996 13.3008l-9.69922 34.1992l-220.4 27.1006l92.5996 26.5996c30.2002 8.7002 42 15.7998 61.4004 33.2002c24.5 23 31.7002 45.5 23.5 73.5996l-10.7002 37.8008
c-8.7002 30.1992 -25.0996 49.0996 -61.3994 55.1992c-25.1006 3.5 -44.5 2 -79.3008 -8.19922l-221.899 -63.9004c26 108.8 124.2 189.5 241.3 189.5zM38.2998 59.4004c-24 38.3994 -38.2998 83.2998 -38.2998 131.8z" />
    <glyph glyph-name="rocketchat" unicode="&#xf3e8;" horiz-adv-x="576" 
d="M486.41 340.43c119.649 -76.54 119.26 -221 0 -297.14c-77.1201 -50.9199 -179.37 -62.3896 -264.12 -47.1602c-95.5205 -91.1895 -201.72 -49.1602 -222.29 -37c0 0 73.0801 62.1006 61.21 116.49c-45.3896 46.3701 -86.5195 144.57 0 232.77
c11.8701 54.3906 -61.21 116.49 -61.21 116.49c20.7695 12.1201 127.26 54.2803 222.29 -37.3799c84.9404 15.3301 187.19 3.75977 264.12 -47.0703zM294.18 43.7803c126.67 0 229.409 66.2197 229.409 148.22s-102.74 148.43 -229.41 148.43
s-229.41 -66.4297 -229.41 -148.43c0 -35.79 19.4707 -68.5195 52 -94.1299c9.11426 -29.127 3.78125 -62.0234 -15.999 -98.6904c-0.889648 -1.67969 -1.76953 -3.45996 -2.76953 -5.23926c15.0498 1.33594 38.2158 7.93555 51.71 14.7295
c11.0684 6.26562 27.46 18.5361 36.5898 27.3896l19.7705 19.0908c23.6396 -6.27734 62.6758 -11.3721 87.1348 -11.3721c0.269531 0 0.706055 0.000976562 0.974609 0.00195312zM184.119 156.7c-0.133789 -0.00195312 -0.351562 -0.00390625 -0.485352 -0.00390625
c-18.6182 0 -33.9912 15.1084 -34.3145 33.7236c-0.700195 45.3896 67.8301 46.3799 68.5195 1.08984v-0.509766c0.000976562 -0.0888672 0.00195312 -0.232422 0.00195312 -0.321289c0 -18.6152 -15.1074 -33.8467 -33.7217 -33.999v0.0205078zM257.889 190.42
c-0.790039 45.3896 67.7402 46.4805 68.5303 1.19043v-0.610352c0.389648 -45.0801 -67.7402 -45.5703 -68.5303 -0.580078zM401.269 156.7c-0.133789 -0.00195312 -0.350586 -0.00390625 -0.485352 -0.00390625c-18.6182 0 -33.9951 15.1084 -34.3242 33.7236
c-0.69043 45.3896 67.8398 46.3799 68.5303 1.08984v-0.509766c0.000976562 -0.119141 0.00292969 -0.311523 0.00292969 -0.430664c0 -18.6152 -15.1084 -33.7979 -33.7236 -33.8896v0.0205078z" />
    <glyph glyph-name="rockrms" unicode="&#xf3e9;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM405.4 20.5l-101.5 118.9s73.5996 0.199219 74.1992 0.199219c29.6006 -1.09961 46.6006 33.3008 27.6006 56.1006l-157.7 185.1c-13.2002 17.2998 -40.0996 18.4004 -54.5 0
l-147.1 -172.5h90l84.2998 98.9004l84.5996 -99.2998h-75.2998c-30.5 0 -44.5 -35.7002 -26.5996 -56.1006l112 -131.3h90z" />
    <glyph glyph-name="schlix" unicode="&#xf3ea;" 
d="M350.5 290.3l-54.2002 46.1006l73.4004 39l78.2998 -44.2002zM192 325.9l45.7002 28.1992l34.7002 -34.5996l-55.4004 -29zM126.9 319.3l31.8994 22.1006l17.2002 -28.4004l-36.7002 -22.5zM103.6 231.1l-8.7998 34.8008l29.6006 18.2998l13.0996 -35.2998z
M82.4004 314.8l23.8994 18.1006l8.90039 -24l-26.7002 -18.3008zM59 241.5l-3.59961 28.4004l22.2998 15.5l6.09961 -28.7002zM28.4004 224.9l20.7998 12.7998l3.2998 -33.4004l-22.9004 -12zM1.40039 180l19.1992 10.2002l0.400391 -38.2002l-21 -8.7998zM60.5 120.7
l-28.2998 -8.2998l-1.60059 46.7998l25.1006 10.7002zM99 184.8l-31.0996 -13l-5.2002 40.7998l27.3994 14.4004zM123.2 71l-41.6006 -5.90039l-8.09961 63.5l35.2002 10.8008zM151.7 210.9l21.2002 -57.1006l-46.2002 -13.5996l-13.7002 54.0996zM237.4 -19.5996
l-70.9004 3.2998l-24.2998 95.7998l55.2002 8.59961zM152.5 260.1l42.2002 22.4004l28 -45.9004l-50.7998 -21.2998zM193.5 165.2l61.2998 18.7002l52.7998 -86.6006l-79.7998 -11.2998zM244.9 250.8l67.2998 28.7998l65.5 -65.3994l-88.6006 -26.2002z" />
    <glyph glyph-name="searchengin" unicode="&#xf3eb;" horiz-adv-x="460" 
d="M220.6 317.7l-67.1992 -209.3v130.3l-54.7002 -24.2002l54.7002 190.3v-115.3zM137.4 414.4l-1.30078 -4.7002l-15.1992 -52.9004c-40.3008 -15.5 -68.9004 -54.5996 -68.9004 -100.3c0 -52.2998 34.2998 -95.9004 83.4004 -105.5v-53.5996
c-77.9004 10.5 -135.4 78.1992 -135.4 159c0 80.5 59.7998 147.199 137.4 158zM448.8 -32.7998c-11.2002 -11.2002 -23.0996 -12.2998 -28.5996 -10.5c-5.40039 1.7998 -27.1006 19.8994 -60.4004 44.3994c-33.2998 24.6006 -33.5996 35.7002 -43 56.7002
c-9.39941 20.9004 -30.3994 42.6006 -57.5 52.4004l-9.7002 14.7002c-24.6992 -16.9004 -53 -26.9004 -81.2998 -28.7002l2.10059 6.59961l15.8994 49.5c46.5 11.9004 80.9004 54 80.9004 104.2c0 54.5 -38.4004 102.1 -96 107.1v52.1006
c83.2002 -5.10059 148.8 -74.5 148.8 -159.3c0 -33.6006 -11.2002 -64.7002 -29 -90.4004l14.5996 -9.59961c9.80078 -27.1006 31.5 -48 52.4004 -57.4004s32.2002 -9.7002 56.7998 -43c24.6006 -33.2002 42.7002 -54.9004 44.5 -60.2998
c1.7998 -5.40039 0.700195 -17.2998 -10.5 -28.5zM438.9 -14.9004c0 4.40039 -3.60059 8 -8 8c-4.40039 0 -8 -3.59961 -8 -8c0 -4.39941 3.59961 -8 8 -8c4.39941 0 8 3.60059 8 8z" />
    <glyph glyph-name="servicestack" unicode="&#xf3ec;" horiz-adv-x="496" 
d="M88 232c81.7002 -10.2002 273.7 -102.3 304 -232h-392c99.5 8.09961 184.5 137 88 232zM120 384c102.8 -15.5 335.3 -167.9 376 -384h-96c-26.2998 126.7 -150.7 216.7 -233.6 250.4c1.2998 49.6992 -14.1006 98 -46.4004 133.6z" />
    <glyph glyph-name="sistrix" unicode="&#xf3ee;" 
d="M448 -1l-30.5 -31l-146 148.1c-28.7002 -23.6992 -65.2002 -37.8994 -105 -37.8994c-91.7998 0 -166.5 75.7998 -166.5 168.899c0 93.1006 74.7002 168.9 166.6 168.801c91.8008 0 166.5 -75.8008 166.5 -168.9c0 -37 -11.8994 -71.2998 -31.8994 -99.2002zM166.5 117.2
c70.7002 0 128.1 58.2998 128.1 129.899c0 71.6006 -57.5 129.9 -128.1 129.9s-128.1 -58.2998 -128.1 -129.9c0 -71.5996 57.5 -129.899 128.1 -129.899z" />
    <glyph glyph-name="slack-hash" unicode="&#xf3ef;" 
d="M446.2 177.6c6.2002 -19 -3.90039 -39.6992 -22.9004 -45.6992l-45.3994 -15.1006l15.6992 -47c6.10059 -19.0996 -3.89941 -39.7002 -23 -45.8994c-21.2998 -6.10059 -40.0996 6 -46 22.8994l-15.6992 47l-93.6006 -31.2998l15.7002 -47
c6.09961 -19.0996 -3.90039 -39.7002 -23 -45.9004c-21.2998 -6.09961 -40.0996 6 -46 22.9004l-15.7002 47c-45.7002 -15.2002 -50.8994 -17.7998 -57.7002 -16.7998c-14.5 0.599609 -28.5996 10.0996 -33.5996 24.5996c-6.09961 19 4 39.7002 23 45.9004l45.4004 15.0996
l-30.3008 90c-45.6992 -15.2002 -50.8994 -17.7998 -57.6992 -16.7998c-14.5 0.599609 -28.6006 10.0996 -33.6006 24.5996c-6.09961 19.1006 3.90039 39.7002 23 45.9004l45.2998 15l-15.6992 47c-6.10059 19.0996 3.89941 39.7002 23 45.9004
c19.0996 6.19922 39.7998 -3.90039 46 -22.9004l15.6992 -47l93.4004 31.2002l-15.7002 47c-6.09961 19.0996 3.90039 39.7002 23 45.8994c19.1006 6.2002 39.7998 -3.89941 46 -22.8994l15.7002 -47l45.4004 15.0996c19.0996 6.2002 39.7998 -3.89941 46 -22.8994
c6.09961 -19.1006 -3.90039 -39.7002 -23 -45.9004l-45.4004 -15.0996l30.2998 -90l45.4004 15.0996c19.0996 6.2002 39.7998 -3.90039 46 -22.9004zM192.1 130.4l93.5 31.2998l-30.2998 90.2002l-93.5 -31.3008z" />
    <glyph glyph-name="speakap" unicode="&#xf3f3;" 
d="M64 56.2197c-79.4102 88.1904 -72 224.36 16.6396 304.141c88.6406 79.7793 224.801 73 304.21 -15.2402c79.4102 -88.2402 72 -224.36 -16.6396 -304.14c-18.7402 -16.8701 64 -43.0908 42 -52.2607c-82.0596 -34.21 -253.91 -35 -346.229 67.5h0.0195312z
M277.31 267.82l38.5 40.8594c-9.60938 8.89062 -32 26.8301 -76.1699 27.6006c-52.3301 0.910156 -95.8594 -28.2998 -96.7695 -80c-0.200195 -11.3301 0.290039 -36.7207 29.4199 -54.8301c34.46 -21.4199 86.5195 -21.5098 86 -52.2598
c-0.370117 -21.2803 -26.4199 -25.8105 -38.5898 -25.6006c-3 0.0498047 -30.2305 0.459961 -47.6104 24.6201l-40 -42.6104c28.1602 -27 59 -32.6191 83.4902 -33.0498c10.2295 -0.179688 96.4199 -0.330078 97.8398 81
c0.280273 15.8105 -2.07031 39.7197 -28.8604 56.5898c-34.3594 21.6406 -85 19.4502 -84.4297 49.75c0.410156 23.25 31 25.3701 37.5303 25.2607c0.429688 0 26.6201 -0.260742 39.6201 -17.3701z" />
    <glyph glyph-name="staylinked" unicode="&#xf3f5;" horiz-adv-x="440" 
d="M382.7 155.5l44.2998 -41.2998c3.7002 -3.5 3.2998 -9 -0.700195 -12.2002l-198 -163.9c-9.89941 -7.59961 -17.2998 -0.799805 -17.2998 -0.799805l-208.7 196.101c-3.5 3.5 -3 9 1.2002 12.1992l45.7998 34.9004c4.2002 3.2002 10.4004 3 13.9004 -0.5l151.899 -147.5
c3.7002 -3.5 10 -3.7002 14.2002 -0.400391l93.2002 74c4.09961 3.2002 4.5 8.7002 0.900391 12.2002l-84 81.2998c-3.60059 3.5 -9.90039 3.7002 -14 0.5l-0.100586 -0.0996094c-4.09961 -3.2002 -10.3994 -3 -14 0.5l-68.0996 64.2998
c-3.5 3.5 -3.10059 9 1.09961 12.2002l57.2998 43.5996c4.10059 3.2002 10.3008 3 13.8008 -0.5l170 -167.3zM437.2 238.9c3.7002 -3.5 3.39941 -9 -0.700195 -12.2002l-45.7998 -35.7998c-4.10059 -3.2002 -10.4004 -3 -14.1006 0.5l-160.399 159
c-3.60059 3.5 -9.7998 3.69922 -13.9004 0.5l-92.2002 -71.5c-4.19922 -3.30078 -4.69922 -8.7002 -1.09961 -12.2002l94.5996 -91.7998c3.7002 -3.5 10 -3.60059 14.2002 -0.400391l0.100586 0.0996094c4.19922 3.2002 10.5996 3 14.1992 -0.5l57.1006 -54.3994
c3.7002 -3.5 3.2998 -9 -0.900391 -12.2002l-7.7002 -6l0.300781 -0.299805l-50.2002 -38.7998c-4.2002 -3.30078 -10.6006 -3.10059 -14.2998 0.399414l-171.7 165.101l-42.2998 41.6992c-3.60059 3.5 -3 9 1.19922 12.2002l206.801 162.101
c8.2998 6.59961 14.7998 2.2998 16.2998 1.09961z" />
    <glyph glyph-name="steam-symbol" unicode="&#xf3f6;" 
d="M395.5 270.5c0 -33.7998 -27.5 -61 -61 -61c-33.7998 0 -61 27.2998 -61 61s27.2998 61 61 61c33.5 0 61 -27.2002 61 -61zM448 270.3c0 -63 -51 -113.8 -113.7 -113.8l-109.3 -79.7998c-4 -43 -40.5 -76.7998 -84.5 -76.7998c-40.5 0 -74.7002 28.7998 -83 67
l-57.5 23.0996v107.3l97.2002 -39.2998c15.0996 9.2002 32.2002 13.2998 52 11.5l71 101.7c0.5 62.2998 51.5 112.8 114 112.8c62.7998 0 113.8 -51 113.8 -113.7zM203 85c0 34.7002 -27.7998 62.5 -62.5 62.5c-4.5 0 -9 -0.5 -13.5 -1.5l26 -10.5
c25.5 -10.2002 38 -39 27.7002 -64.5c-10.2002 -25.5 -39.2002 -38 -64.7002 -27.5c-10.2002 4 -20.5 8.2998 -30.7002 12.2002c10.5 -19.7002 31.2002 -33.2002 55.2002 -33.2002c34.7002 0 62.5 27.7998 62.5 62.5zM410.5 270.3c0 42 -34.2998 76.2002 -76.2002 76.2002
c-42.2998 0 -76.5 -34.2002 -76.5 -76.2002c0 -42.2002 34.2998 -76.2002 76.5 -76.2002c41.9004 -0.0996094 76.2002 33.9004 76.2002 76.2002z" />
    <glyph glyph-name="sticker-mule" unicode="&#xf3f7;" horiz-adv-x="576" 
d="M561.7 248.4c-1.2998 -0.300781 0.299805 0 0 0zM555.5 325.8c20.2002 -50.0996 20.5996 -45.2002 20.5996 -52.8994c0 -7.5 -4.09961 -11 -7.19922 -16.5c-1.5 -3 -4.60059 -7.5 -7.2002 -8c-0.400391 0 -3 -0.5 -13.4004 -2.5c-7.2002 -1 -13.3994 4.5 -14.8994 9.5
c-1.60059 4.69922 2.7998 10.0996 -11.8008 22.8994c-10.2998 10 -21.0996 11.2998 -31.8994 17c-9.7998 5.7002 -11.9004 -1 -18 -8c-18 -22.8994 -34 -46.8994 -52 -69.7998c-11.7998 -15 -24.2002 -30.4004 -33.5 -47.4004
c-3.90039 -6.7998 -9.5 -28.0996 -10.2998 -29.8994c-6.2002 -17.7002 -5.5 -25.7998 -16.5 -68.2998c-3.10059 -10 -5.7002 -21.4004 -8.7002 -32.4004c-2.2002 -6.7998 -7.40039 -49.2998 -0.5 -59.4004c2.09961 -3.5 8.7002 -4.5 11.2998 -8
c0.0996094 -0.0996094 9.59961 -18.1992 9.2998 -20c0 -6.09961 -9.39941 -5.59961 -11.2998 -6.5c-4.7998 -2.89941 -3.7998 -5.89941 -6.40039 -7.39941c-5.89941 -2.90039 -32.0996 -3.2002 -36.5 0.5c-4.09961 3 -2.19922 11.8994 -1.5 15
c2.2002 15 -2.5 7.89941 -9.7998 11.5c-3.09961 1.5 -4.09961 5.5 -4.59961 10c-0.5 1.5 -1 2.5 -1.5 3.5c-1.7002 10.7002 6.7998 33.5996 8.2002 43.3994c4.89941 23.7002 -0.700195 37.2002 1.5 46.9004c3.69922 16.2002 4.09961 3.5 4.09961 29.9004
c-1.40039 25.8994 3.2998 36.8994 0.5 38.8994c-14.7998 0 -64.2998 -10.7002 -112.2 -2c-46.0996 8.90039 -59.3994 29 -65.3994 30.9004c-10.3008 4.5 -23.2002 -0.5 -27.3008 -7c-0.0996094 -0.100586 -35 -70.6006 -39.5996 -87.7998
c-6.2002 -20.5 -0.5 -47.4004 4.09961 -66.8008c0 -0.0996094 4.5 -14.5996 10.3008 -19.5c2.09961 -1.5 5.09961 -2.5 7.19922 -4.5c2.80078 -2.69922 9.40039 -15.1992 9.80078 -16c2.59961 -4.5 3.59961 -8 -1.5 -10.5c-3.60059 -2 -9.30078 -2.5 -14.4004 -2.5
c-2.59961 -0.5 -1.5 -3.5 -3.09961 -5c-2.90039 -2.7998 -20.7002 -6.09961 -29.9004 -2.5c-2.59961 1 -5.7002 3 -6.2002 5c-1.5 4 2.10059 9 -1 12.5c-4.5 2.90039 -13.0996 2 -17 12c-2.2002 5.40039 -2.59961 7.60059 -2.59961 49.4004
c0 9.7002 -5.90039 38.7002 -8.2002 46.9004c-1.5 5.5 -1.5 11.5 0 16c0.299805 0.899414 4.09961 4.59961 4.09961 13c-1 1.5 -4.59961 0.5 -5.09961 1.5c-10.4004 80.5996 -5.90039 79 -7.7002 98.2998c-1.5 16 -10.8994 43.8994 -6.7002 64.2998
c0.5 2.40039 3.40039 21 24.2002 38.9004c31 26.6992 48.4004 38.2998 159 11.5c1.10059 -0.400391 66.2998 -21.1006 110.7 9c15.5 11.2998 28.7998 11.2998 35.5 16c0.0996094 0.0996094 61.7002 52.0996 87 65.2998c47.2002 29.3994 69.9004 16.7002 75.0996 18
c4.7002 1 13.4004 25.7998 17 25.7998c5.5 0 1.60059 -20.2002 3.60059 -25.9004c0.5 -2 3.59961 -5 6.2002 -5c2.2998 0 1.69922 0.800781 10.2998 5c8.39941 5.40039 14.8994 17.6006 20.5996 17c11.7002 -1.59961 -19 -41.5996 -19 -46.8994
c0 -2 0.200195 -0.799805 4.60059 -9.5c2.59961 -5.5 4.59961 -13.5 6.19922 -20c8.30078 -29.7002 5.7002 -14.6006 13.4004 -36.9004z" />
    <glyph glyph-name="studiovinari" unicode="&#xf3f8;" horiz-adv-x="512" 
d="M480.3 260.3l4.2002 -28v-28l-25.0996 -44.0996l-39.8008 -78.4004l-56.0996 -67.5l-79.0996 -37.7998l-17.7002 -24.5l-7.7002 -12l-9.59961 -4s17.2998 63.5996 19.3994 63.5996c2.10059 0 20.2998 -0.699219 20.2998 -0.699219l66.7002 38.5996l-92.5 -26.0996
l-55.8994 -36.8008l-22.8008 -28l-6.59961 -1.39941l20.7998 73.5996l6.90039 5.5l20.7002 -12.8994l88.2998 45.1992l56.7998 51.5l14.7998 68.4004l-125.399 -23.2998l15.1992 18.2002l-173.399 53.2998l81.8994 10.5l-166 122.899l114.9 -18.0996l-101.3 108
l252.899 -126.6l-31.5 38l124.4 -74.4004l-143.3 99l18.7002 -38.4004l-49.6006 18.1006l-45.5 84.2998l194.601 -122l-42.9004 55.7998l108 -96.3994l12 8.89941l-21 16.4004l4.2002 37.7998l37.7998 10.4004l29.2002 -24.7002l11.5 -4.2002l-7 -6.2002l8.5 -12
l-13.1006 -7.39941l-10.2998 -20.2002z" />
    <glyph glyph-name="supple" unicode="&#xf3f9;" horiz-adv-x="640" 
d="M640 185.5c0 -64.0996 -109 -116.1 -243.5 -116.1c-24.7998 0 -48.5996 1.7998 -71.0996 5c7.69922 -0.400391 15.5 -0.600586 23.3994 -0.600586c134.5 0 243.5 56.9004 243.5 127.101c0 29.3994 -19.0996 56.3994 -51.2002 78
c60 -21.1006 98.9004 -55.1006 98.9004 -93.4004zM47.7002 220.1c0.0996094 -29.3994 19.2998 -56.5 51.5996 -78c-60.2002 21 -99.2002 55 -99.2998 93.3008c-0.0996094 64.0996 108.8 116.3 243.3 116.699c24.7002 0 48.5 -1.69922 71 -4.89941
c-7.7002 0.299805 -15.3994 0.5 -23.2998 0.5c-134.5 -0.299805 -243.4 -57.4004 -243.3 -127.601zM107.9 180.2l8.7998 10.8994s8.7998 -10.0996 20.7002 -10.0996c6.5 0 12.2998 3.5 12.2998 10.0996c0 14.5 -40.2002 13.3008 -40.2002 39.9004
c0 13.9004 12 24.0996 28.5 24.0996c10 0 25.4004 -4.69922 25.4004 -16.7998v-7.89941h-14.2002v3.89941c0 4 -5.60059 6.60059 -11.2998 6.60059c-7.2002 0 -12.5 -3.7002 -12.5 -9.10059c0 -14.5996 40.1992 -11.7002 40.1992 -39.7002
c0 -13.5996 -10.5 -25.0996 -28.3994 -25.0996c-18.7998 0 -29.2998 13.2002 -29.2998 13.2002zM228.7 253.8h15.7002v-55c0 -18.8994 -13.3008 -31.8994 -33.4004 -31.8994c-20.2998 0 -33.7002 13 -33.7002 31.8994v55h15.7998v-54.5
c0 -11.2002 7.10059 -17.7002 17.8008 -17.7002c10.6992 0 17.7998 6.5 17.7998 17.8008v54.3994zM263.1 168.4v72h-7.7998v13.3994h39.1006c16 0 27.1992 -11.2002 27.1992 -27.7998s-11.1992 -28.0996 -27.1992 -28.0996h-15.5v-29.5h-15.8008zM278.9 211.4h12.5996
c8.90039 0 14 5.7998 14 14.6992c0 8.7002 -5 14.4004 -13.7002 14.4004h-12.8994v-29.0996zM335.9 168.4v72h-7.80078v13.3994h39.1006c16 0 27.2002 -11.2002 27.2002 -27.7998s-11.2002 -28.0996 -27.2002 -28.0996h-15.5v-29.5h-15.7998zM351.6 211.4h12.6006
c9 0 14 5.7998 14 14.6992c0 8.7002 -5 14.4004 -13.7002 14.4004h-12.9004v-29.0996zM408.7 176.6h0.0996094v61.2002c0 1.60059 -0.899414 2.60059 -2.59961 2.60059h-5.2002v13.3994h15.4004c5.7998 0 8.19922 -2.5 8.19922 -8.2002v-61.1992
c0 -1.60059 0.900391 -2.60059 2.60059 -2.60059h18.5996c1.60059 0 2.60059 0.900391 2.60059 2.60059v5.19922h14.2998v-13c0 -5.7998 -2.40039 -8.19922 -8.2002 -8.19922h-37.5996c-5.80078 0 -8.2002 2.39941 -8.2002 8.19922zM472.1 176.6h-0.0996094v63.9004h-7.7998
v13.4004h51.5996c5.7002 0 8.2002 -2.5 8.2002 -8.2002v-13h-14.2002v5.2002c0 1.59961 -0.899414 2.59961 -2.59961 2.59961h-19.2002v-22.4004h27.7002v-13.3994h-27.7002v-20.2998c0 -1.60059 0.900391 -2.60059 2.59961 -2.60059h19.7002
c1.60059 0 2.60059 0.900391 2.60059 2.60059v5.19922h14.2998v-13c0 -5.7998 -2.5 -8.19922 -8.2002 -8.19922h-38.7002c-5.7998 0 -8.2002 2.39941 -8.2002 8.19922zM531 252.6h-2.7002v1.2002h7v-1.2002h-2.7002v-5.89941h-1.59961v5.89941zM536.7 253.8h2.39941
l2.10059 -5.09961l2.09961 5.09961h2.2998v-7.09961h-1.5v5.7002l-2.2998 -5.7002h-1.2998l-2.2998 5.7002v-5.7002h-1.5v7.09961z" />
    <glyph glyph-name="telegram-plane" unicode="&#xf3fe;" 
d="M446.7 349.4l-67.6006 -318.801c-5.09961 -22.5 -18.3994 -28.0996 -37.2998 -17.5l-103 75.9004l-49.7002 -47.7998c-5.5 -5.5 -10.0996 -10.1006 -20.6992 -10.1006l7.39941 104.9l190.9 172.5c8.2998 7.40039 -1.7998 11.5 -12.9004 4.09961l-236 -148.6
l-101.6 31.7998c-22.1006 6.90039 -22.5 22.1006 4.59961 32.7002l397.4 153.1c18.3994 6.90039 34.5 -4.09961 28.5 -32.1992z" />
    <glyph glyph-name="uber" unicode="&#xf402;" 
d="M414.1 416c18.7002 0 33.9004 -15.2002 33.8008 -33.9004v-380.199c0 -18.7002 -15.2002 -33.9004 -33.9004 -33.9004h-380.1c-18.7002 0 -33.9004 15.2002 -33.9004 34v380.1c0 18.7002 15.2002 33.9004 33.9004 33.9004h380.199zM237.6 56.9004
c74.6006 7.5 129 74.0996 121.5 148.6c-7 69.4004 -65.3994 122.2 -135.1 122.2s-128.1 -52.7998 -135.1 -122.2h94.3994v20.4004c0 3.7998 3.10059 6.7998 6.7998 6.7998h67.9004c3.7998 0 6.7998 -3.10059 6.7998 -6.7998v-67.9004
c0 -3.7998 -3.09961 -6.7998 -6.7998 -6.7998h-67.9004c-3.7998 0 -6.7998 3.09961 -6.7998 6.7998v20.4004h-94.3994c7.5 -74.6006 74.0996 -129 148.699 -121.5z" />
    <glyph glyph-name="uikit" unicode="&#xf403;" 
d="M443.9 320v-256l-225.9 -128l-218 128v214.3l87.5996 -45.0996v-117l133.5 -75.5l135.801 75.5v151l-101.101 57.5996l87.6006 53.1006zM308.6 398.9l-87.3994 -53l-86 47.2998l88.5996 54.7998z" />
    <glyph glyph-name="uniregistry" unicode="&#xf404;" horiz-adv-x="384" 
d="M192 -32c-39.5 0 -76.2002 11.7998 -106.7 32.2002h213.5c-30.5996 -20.4004 -67.2998 -32.2002 -106.8 -32.2002zM102.9 161.1c0 -2.5 0.0996094 -5 0.299805 -7.39941h-103.101c-0.0996094 2.39941 -0.0996094 4.89941 -0.0996094 7.39941v12.4004h102.9v-12.4004z
M123.4 104.1c8.89941 -10.5996 20.0996 -19.0996 33 -24.7998h-138.301c-3.7998 8 -7 16.2998 -9.59961 24.7998h114.9zM105.7 138.8c2 -7.89941 5.2002 -15.3994 9.2002 -22.2998h-109.7c-1.7002 7.2998 -3 14.7002 -3.90039 22.2998h104.4zM102.9 208.1v-17.2998h-102.9
v17.2998h102.9zM102.9 381.3v-4.89941h-102.9v4.89941h102.9zM102.9 416v-2.5h-102.9v2.5h102.9zM102.9 346.7v-7.40039h-102.9v7.40039h102.9zM102.9 242.7v-14.7998h-102.9v14.7998h102.9zM102.9 312v-9.90039h-102.9v9.90039h102.9zM102.9 277.4v-12.4004h-102.9v12.4004
h102.9zM269.1 116.5c4 6.90039 7.10059 14.4004 9.2002 22.2998h104.4c-0.799805 -7.59961 -2.10059 -15 -3.90039 -22.2998h-109.7zM281.1 302.2v9.7998h102.9v-9.7998h-102.9zM281.1 265v12.4004h102.9v-12.4004h-102.9zM281.1 339.3v7.40039h102.9v-7.40039h-102.9z
M281.1 416h102.9v-2.5h-102.9v2.5zM78.0996 5.09961c-11.7998 8.7002 -23.5996 18.7002 -33.1992 29.7002h293.1c-9.5 -11.0996 -20.4004 -21 -32.2002 -29.7002h-227.7zM281.1 376.4v4.89941h102.9v-4.89941h-102.9zM281.1 227.9v14.7998h102.9v-14.7998h-102.9z
M38.7998 42.2998c-6.59961 8.5 -10.5996 17.6006 -15.7998 27.2002h338.9c-5.2002 -9.59961 -11.1006 -18.7002 -17.8008 -27.2002h-305.3zM227.6 79.4004c12.8008 5.59961 24.1006 14.0996 32.9004 24.7998h115c-2.7002 -8.60059 -4.7998 -16.7998 -8.5 -24.7998h-139.4z
M281.1 161.1v12.4004h102.9v-12.4004c0 -2.5 -0.0996094 -4.89941 -0.200195 -7.39941h-103.1c0.299805 2.39941 0.399414 4.89941 0.399414 7.39941zM281.1 190.8v17.2998h102.9v-17.2998h-102.9z" />
    <glyph glyph-name="untappd" unicode="&#xf405;" horiz-adv-x="640" 
d="M401.3 398.1c-79.7998 -160.1 -84.5996 -152.5 -87.8994 -173.199l-5.2002 -32.8008c-1.90039 -12 -6.60059 -23.5 -13.7002 -33.3994l-148.9 -207.8c-7.59961 -10.6006 -20.3994 -16.2002 -33.3994 -14.6006c-40.2998 5 -77.7998 32.2002 -95.2998 68.5
c-5.7002 11.7998 -4.5 25.7998 3.09961 36.4004l148.9 207.899c7.09961 9.90039 16.3994 18 27.1992 23.7002l29.3008 15.5c18.5 9.7998 9.69922 11.9004 135.6 138.9c1 4.7998 1 7.2998 3.59961 8c3 0.700195 6.60059 1 6.30078 4.59961l-0.400391 4.60059
c-0.200195 1.89941 1.2998 3.59961 3.2002 3.59961c4.5 0.0996094 13.2002 -1.2002 25.5996 -10c12.2998 -8.90039 16.4004 -16.7998 17.7002 -21.0996c0.599609 -1.80078 -0.599609 -3.7002 -2.40039 -4.2002l-4.5 -1.10059
c-3.39941 -0.899414 -2.5 -4.39941 -2.2998 -7.39941c0.100586 -2.7998 -2.2998 -3.60059 -6.5 -6.10059zM230.1 411.6c-3.19922 0.800781 -8.19922 1.2002 -6.7998 5.40039c1.2998 4.2998 5.40039 12.2002 17.7002 21.0996c12.4004 8.90039 21.0996 10.1006 25.5996 10
c4.2002 -0.0996094 3.10059 -4.89941 2.80078 -8.19922c-0.300781 -3.60059 3.2998 -3.80078 6.2998 -4.60059c2.59961 -0.700195 2.59961 -3.2998 3.59961 -8c9.10059 -9.2002 17.6006 -17.8994 25.6006 -26.0996c1.2998 -1.40039 1.19922 -3.5 -0.100586 -4.90039
c-15.8994 -16.3994 -29.2998 -30.5996 -40.5 -42.5996c-1 -1 -2.59961 -0.799805 -3.2998 0.5c-6.90039 13.5 -14.2998 28.0996 -22.2002 44c-4.2998 2.5 -6.59961 3.2998 -6.39941 6c0.199219 3 1.09961 6.5 -2.30078 7.39941zM620 41.2998
c7.7002 -10.7002 8.7998 -24.7002 3.40039 -36.5996c-17.7002 -36.6006 -55.4004 -63.7002 -95.7002 -68.6006c-12.9004 -1.5 -25.5 4.10059 -33.1006 14.7002l-148.899 207.9c-7.10059 9.89941 -11.7998 21.3994 -13.7002 33.3994
c-1.59961 9.80078 -2 19.1006 -0.299805 29.8008c1.89941 12 2.7002 6 49 94.7998c0.700195 1.39941 2.59961 1.59961 3.59961 0.5c16.2998 -18 19.2998 -23 30.5 -28.9004c29.7998 -15.7002 43.2002 -20.5996 56.4004 -39.0996z" />
    <glyph glyph-name="ussunnah" unicode="&#xf407;" horiz-adv-x="512" 
d="M156.8 162.9l5.7002 -14.4004h-8.2002c-1.2998 3.2002 -3.09961 7.7002 -3.7998 9.5c-2.5 6.2998 -1.09961 8.40039 0 10c1.90039 2.7002 3.2002 4.40039 3.59961 5.2002c0 -2.2002 0.800781 -5.7002 2.7002 -10.2998zM454.1 144.1
c-2.09961 -13.7998 -5.69922 -27.0996 -10.5 -39.6992l43 -23.4004l-44.7998 18.7998c-5.2998 -13.2002 -12 -25.5996 -19.8994 -37.2002l34.1992 -30.1992l-36.7998 26.3994c-8.39941 -11.7998 -18 -22.5996 -28.7002 -32.2998l24.9004 -34.7002l-28.0996 31.7998
c-11 -9.59961 -23.1006 -18 -36.1006 -25.0996l15.7002 -37.2002l-19.2998 35.2998c-13.1006 -6.7998 -27 -12.0996 -41.6006 -15.8994l6.7002 -38.4004l-10.5 37.4004c-14.2998 -3.40039 -29.2002 -5.2998 -44.5 -5.40039l-1.7998 -38.2998l-1.90039 38.4004
c-15.2998 0.0996094 -30.1992 2 -44.5 5.2998l-10.5996 -37.2998l6.7002 38.1992c-14.6006 3.7002 -28.6006 9.10059 -41.7002 15.8008l-19.2002 -35.1006l15.6006 37c-13 7 -25.2002 15.4004 -36.2002 25.1006l-27.9004 -31.6006l24.7002 34.4004
c-10.7002 9.7002 -20.4004 20.5 -28.7998 32.2998l-36.5 -26.2002l33.8994 29.9004c-7.89941 11.5996 -14.5996 24.0996 -20 37.2998l-44.3994 -18.7002l42.5996 23.2002c-4.7998 12.7002 -8.39941 26.0996 -10.5 39.9004l-51 -9l50.2998 14.1992
c-1.09961 8.5 -1.69922 17.1006 -1.69922 25.9004c0 4.7002 0.199219 9.40039 0.5 14.0996l-55.4004 2.90039l56 2.7998c1.2998 13.1006 3.7998 25.7998 7.5 38.1006l-57.0996 16.0996l58.8994 -10.4004c4 12 9.10059 23.5 15.2002 34.4004l-55.0996 30l58.2998 -24.5996
c6.2998 10.5996 13.5 20.3994 21.5996 29.5996l-49.5 43.5996l53.9004 -38.6992c8.09961 8.59961 17 16.5 26.5996 23.5996l-40 55.5996l45.6006 -51.5996c9.5 6.59961 19.6992 12.2998 30.2998 17.2002l-27.2998 64.8994l33.7998 -62.0996
c10.5 4.40039 21.3994 7.90039 32.7002 10.4004l-12.4004 70.6992l19.5 -69.1992c11 2.09961 22.2998 3.19922 33.7998 3.39941l3.7002 72.2002l3.59961 -72.2002c11.5 -0.200195 22.8008 -1.39941 33.8008 -3.5l19.5996 69.2998l-12.4004 -70.6992
c11.3008 -2.60059 22.2002 -6.10059 32.6006 -10.5l33.8994 62.1992l-27.3994 -65.0996c10.5996 -4.90039 20.7002 -10.7002 30.2002 -17.2002l45.7998 51.7998l-40.1006 -55.8994c9.5 -7.10059 18.4004 -15 26.5 -23.6006l54.2002 38.9004l-49.7002 -43.9004
c8 -9.09961 15.2002 -18.8994 21.5 -29.3994l58.7002 24.7002l-55.5 -30.2002c6.10059 -10.9004 11.1006 -22.2998 15.1006 -34.2998l59.2998 10.3994l-57.5 -16.2002c3.7002 -12.1992 6.2002 -24.8994 7.5 -37.8994l56.2998 -2.7002l-56 -2.7998
c0.299805 -4.60059 0.5 -9.2998 0.5 -14.1006c0 -8.69922 -0.599609 -17.2998 -1.59961 -25.7998l50.6992 -14.2998zM432.3 175.1c0 97.5 -79 176.5 -176.5 176.5s-176.5 -79 -176.5 -176.5s79 -176.5 176.5 -176.5s176.5 79 176.5 176.5zM408.3 175.1
c0 -84.2998 -68.2998 -152.6 -152.6 -152.6s-152.601 68.2998 -152.601 152.6c0 84.3008 68.3008 152.601 152.601 152.601s152.6 -68.2998 152.6 -152.601zM195 207c0 -2.09961 1.2998 -3.7998 3.59961 -5.09961c3.30078 -1.90039 6.2002 -4.60059 8.2002 -8.2002
c2.7998 5.7002 4.2998 9.5 4.2998 11.2002c0 2.19922 -1.09961 4.39941 -3.19922 7c-2.10059 2.5 -3.2002 5.19922 -3.30078 7.69922c-6.5 -6.7998 -9.59961 -10.8994 -9.59961 -12.5996zM154.3 226c0 -2.09961 1.2998 -3.7998 3.60059 -5.09961
c3.5 -1.90039 6.19922 -4.60059 8.19922 -8.2002c2.80078 5.7002 4.30078 9.5 4.30078 11.2002c0 2.19922 -1.10059 4.39941 -3.2002 7c-2.10059 2.5 -3.2002 5.19922 -3.2998 7.69922c-6.5 -6.7998 -9.60059 -10.8994 -9.60059 -12.5996zM135.3 226
c0 -2.09961 1.2998 -3.7998 3.60059 -5.09961c3.2998 -1.90039 6.19922 -4.60059 8.19922 -8.2002c2.80078 5.7002 4.30078 9.5 4.30078 11.2002c0 2.19922 -1.10059 4.39941 -3.2002 7c-2.10059 2.5 -3.2002 5.19922 -3.2998 7.69922
c-6.40039 -6.7998 -9.60059 -10.8994 -9.60059 -12.5996zM340.2 138.1c-8.40039 3 -8.7002 6.80078 -8.7002 15.6006v112.3c-8.2002 -12.5 -14.2002 -18.5996 -18 -18.5996c6.2998 -14.4004 9.5 -23.9004 9.5 -28.3008v-64.2998c0 -2.2002 -2.2002 -6.5 -4.7002 -6.5h-18
c-2.7998 7.5 -10.2002 26.9004 -15.2998 40.2998c-2 -2.5 -7.2002 -9.19922 -10.7002 -13.6992c2.40039 -1.60059 4.10059 -3.60059 5.2002 -6.30078c2.59961 -6.69922 6.40039 -16.5 7.90039 -20.1992h-9.2002c-3.90039 10.3994 -9.60059 25.3994 -11.7998 31.0996
c-2 -2.5 -7.2002 -9.2002 -10.7002 -13.7002c2.39941 -1.59961 4.09961 -3.59961 5.2002 -6.2998c0.799805 -2 2.7998 -7.2998 4.2998 -10.9004h-9.2002c-1.5 4.10059 -5.59961 14.6006 -8.40039 22c-2 -2.5 -7.19922 -9.19922 -10.6992 -13.6992
c2.5 -1.60059 4.2998 -3.60059 5.19922 -6.30078c0.200195 -0.599609 0.5 -1.39941 0.600586 -1.69922h-17.7002c-4.59961 13.8994 -11.4004 27.6992 -11.4004 34.0996c0 2.2002 0.300781 5.09961 1.10059 8.2002c-8.7998 -10.7998 -14 -15.9004 -14 -25
c0 -7.5 10.3994 -28.2998 10.3994 -33.2998c0 -1.7002 -0.5 -3.30078 -1.39941 -4.90039c-9.60059 12.7002 -15.5 20.7002 -18.7998 20.7002h-12l-11.2002 28c-3.7998 9.59961 -5.7002 16 -5.7002 18.7998c0 3.7998 0.5 7.7002 1.7002 12.2002
c-1 -1.2998 -3.7002 -4.7002 -5.5 -7.10059c-0.799805 2.10059 -3.10059 7.7002 -4.60059 11.5c-2.09961 -2.5 -7.5 -9.09961 -11.1992 -13.5996c0.899414 -2.2998 3.2998 -8.09961 4.89941 -12.2002c-2.5 -3.2998 -9.09961 -11.7998 -13.5996 -17.7002
c-4 -5.2998 -5.7998 -13.2998 -2.7002 -21.7998c2.5 -6.7002 2 -7.89941 -1.7002 -14.0996h61.7002c5.5 0 14.2998 -14 15.5 -22c13.2002 16 15.4004 19.5996 16.7998 21.5996h107c3.90039 0 7.2002 1.90039 9.90039 5.7998zM360.3 164.7v101.6
c-9 -12.5 -15.8994 -18.5996 -20.7002 -18.5996c7.10059 -14.4004 10.7002 -23.9004 10.7002 -28.2998v-66.3008c0 -17.5 8.60059 -20.3994 24 -20.3994c8.10059 0 12.5 0.799805 13.7002 2.7002c-4.2998 1.59961 -7.59961 2.5 -9.90039 3.2998
c-8.09961 3.2002 -17.7998 7.39941 -17.7998 26z" />
    <glyph glyph-name="vaadin" unicode="&#xf408;" 
d="M224.5 307.3c1.5 17.6006 4.90039 52.7002 49.7998 52.7002h98.6006c20.6992 0 32.0996 7.7998 32.0996 21.5996v12.3008c0 12.1992 9.2998 22.0996 21.5 22.0996s21.5 -9.90039 21.5 -22.0996v-36.5c0 -42.9004 -21.5 -62 -66.7998 -62h-100.5
c-30.1006 0 -33 -14.7002 -33 -27.1006c0 -1.2998 -0.100586 -2.5 -0.200195 -3.7002c-0.700195 -12.2998 -10.9004 -22.1992 -23.4004 -22.1992s-22.6992 9.7998 -23.3994 22.1992c-0.100586 1.2002 -0.200195 2.40039 -0.200195 3.7002c0 12.2998 -3 27.1006 -33 27.1006
h-100.7c-45.2998 0 -66.7998 19.0996 -66.7998 62v36.5c0 12.1992 9.40039 22.0996 21.5996 22.0996c12.2002 0 21.5 -9.90039 21.5 -22.0996v-12.3008c0 -13.7998 11.4004 -21.5996 32.1006 -21.5996h98.5996c44.7998 0 48.2998 -35.0996 49.7998 -52.7002h0.900391z
M224 -8c-11.5 0 -21.4004 7 -25.7002 16.2998c-1.09961 1.7998 -97.0996 169.5 -98.2002 171.4c-11.8994 19.7002 3.2002 44.2998 27.2002 44.2998c13.9004 0 23.4004 -6.40039 29.7998 -20.2998l66.9004 -117.7l66.9004 117.7c6.5 13.8994 15.8994 20.2998 29.7998 20.2998
c24 0 39.0996 -24.7002 27.2002 -44.2998c-1.10059 -1.7998 -97.1006 -169.601 -98.2002 -171.4c-4.2998 -9.2998 -14.2002 -16.2998 -25.7002 -16.2998z" />
    <glyph glyph-name="viber" unicode="&#xf409;" horiz-adv-x="512" 
d="M444 398.1c42.2002 -36.6992 65.5996 -117.899 49.7998 -246.5c-15.2002 -124.6 -109.1 -136.6 -125.7 -142c-7.19922 -2.2998 -70.2998 -18.0996 -152.5 -11.1992c-9.09961 -10.5 -21.0996 -24.3008 -29.7998 -33.7002
c-15.8994 -17.1006 -25.7002 -33 -42.2998 -27.7998c-13.7998 4.19922 -13 25.0996 -13 25.0996l0.0996094 51.5996h-0.0996094c-120.1 33.8008 -118.4 158.4 -117 224.9s14.2998 120.2 50.9004 156.8c65.7998 60.4004 200.899 52.2998 200.899 52.2998
c114.601 -0.5 166 -37.7998 178.7 -49.5zM457.9 161c13.2998 107.3 -4.90039 180.5 -40.6006 211.1c-10.7998 9.80078 -57.2002 39 -154.1 39.4004c0 0 -114.7 7.5 -170.4 -43c-31 -30.5996 -41.5 -76.0996 -42.5996 -131.6
c-1.10059 -55.5 -7.10059 -161.601 94.7002 -189.801c-0.100586 0 -0.100586 0 0 0c0 0 -0.400391 -78.7998 -0.400391 -85.6992c-0.0996094 -10.5 5.7002 -11 11 -5.7002c16.2002 16.2998 68.2002 79 68.2002 79c69.7002 -4.5 125.2 9.2998 131.2 11.2002
c14 4.5 90.0996 11.0996 103 115.1zM318.9 241.8c0.399414 -8.59961 -12.5 -9.2002 -12.9004 -0.599609c-1.09961 22 -11.4004 32.7002 -32.5996 33.8994c-8.60059 0.5 -7.80078 13.4004 0.699219 12.9004c27.9004 -1.5 43.4004 -17.5 44.8008 -46.2002zM339.2 230.5
c1 42.4004 -25.5 75.5996 -75.7998 79.2998c-8.5 0.600586 -7.60059 13.5 0.899414 12.9004c58 -4.2002 88.9004 -44.1006 87.7998 -92.5c-0.0996094 -8.60059 -13.0996 -8.2002 -12.8994 0.299805zM386.2 217.1c0.0996094 -8.59961 -12.9004 -8.69922 -12.9004 -0.0996094
c-0.599609 81.5 -54.8994 125.9 -120.8 126.4c-8.5 0.0996094 -8.5 12.8994 0 12.8994c73.7002 -0.5 133 -51.3994 133.7 -139.2zM374.9 119v-0.200195c-10.8008 -19 -31 -40 -51.8008 -33.2998l-0.199219 0.299805c-21.1006 5.90039 -70.8008 31.5 -102.2 56.5
c-16.2002 12.7998 -31 27.9004 -42.4004 42.4004c-10.2998 12.8994 -20.7002 28.2002 -30.7998 46.5996c-21.2998 38.5 -26 55.7002 -26 55.7002c-6.7002 20.7998 14.2002 41 33.2998 51.7998h0.200195c9.2002 4.7998 18 3.2002 23.9004 -3.89941
c0 0 12.3994 -14.8008 17.6992 -22.1006c5 -6.7998 11.7002 -17.7002 15.2002 -23.7998c6.10059 -10.9004 2.2998 -22 -3.7002 -26.5996l-12 -9.60059c-6.09961 -4.89941 -5.2998 -14 -5.2998 -14s17.7998 -67.2998 84.2998 -84.2998c0 0 9.10059 -0.799805 14 5.2998
l9.60059 12c4.59961 6 15.7002 9.7998 26.5996 3.7002c14.7002 -8.2998 33.4004 -21.2002 45.7998 -32.9004c7 -5.69922 8.60059 -14.3994 3.80078 -23.5996z" />
    <glyph glyph-name="vimeo" unicode="&#xf40a;" 
d="M403.2 416c24.7002 0 44.7998 -20.0996 44.7998 -44.7998v-358.4c0 -24.7002 -20.0996 -44.7998 -44.7998 -44.7998h-358.4c-24.7002 0 -44.7998 20.0996 -44.7998 44.7998v358.4c0 24.7002 20.0996 44.7998 44.7998 44.7998h358.4zM377 267.2
c1.90039 42.2002 -13.7998 63.7998 -47.0996 64.7002c-44.9004 1.39941 -75.3008 -23.9004 -91.2002 -76c19.8994 8.5 49.2998 10.7998 45.7998 -22.4004c-1 -11.2002 -8.2998 -27.5 -21.7998 -48.9004c-37.7002 -59.3994 -46.9004 -39.5996 -67.6006 91.6006
c-5.7998 36.8994 -21.2998 54.0996 -46.5 51.7002c-22.2998 -2 -57.8994 -38.4004 -95.1992 -71.2002l15.1992 -19.6006c14.5 10.1006 23 15.2002 25.4004 15.2002c21 0 31.9004 -54.7002 57.4004 -148c13.0996 -34.8994 29 -52.2998 47.8994 -52.2998
c30.4004 0 67.7002 28.5996 111.7 85.7998c42.5996 54.7002 64.5996 97.9004 66 129.4z" />
    <glyph glyph-name="vnv" unicode="&#xf40b;" horiz-adv-x="640" 
d="M104.9 96c-34.1006 0 -46.4004 30.4004 -46.4004 30.4004l-55.9004 111.5s-10.3994 18.0996 10.4004 18.0996h32.7998c10.4004 0 13.2002 -8.7002 18.7998 -18.0996l36.7002 -74.5s5.2002 -13.1006 21.1006 -13.1006c15.8994 0 21.0996 13.1006 21.0996 13.1006
l36.7002 74.5c5.59961 9.5 8.39941 18.0996 18.7998 18.0996h32.7998c20.7998 0 10.4004 -18.0996 10.4004 -18.0996l-55.7998 -111.5s-12.2002 -30.4004 -46.4004 -30.4004h-35.0996zM499.9 96c-34.1006 0 -46.4004 30.4004 -46.4004 30.4004l-55.9004 111.5
s-10.3994 18.0996 10.4004 18.0996h32.7998c10.4004 0 13.2002 -8.7002 18.7998 -18.0996l36.7002 -74.5s5.2002 -13.1006 21.1006 -13.1006c15.8994 0 21.0996 13.1006 21.0996 13.1006l36.7998 74.5c5.60059 9.5 8.40039 18.0996 18.7998 18.0996h32.9004
c20.7998 0 10.4004 -18.0996 10.4004 -18.0996l-55.9004 -111.5s-12.2002 -30.4004 -46.4004 -30.4004h-35.1992zM337.6 256c34.1006 0 46.4004 -30.4004 46.4004 -30.4004l55.9004 -111.5s10.3994 -18.0996 -10.4004 -18.0996h-32.7998
c-10.4004 0 -13.2002 8.7002 -18.7998 18.0996l-36.7002 74.5s-5.2002 13.1006 -21.1006 13.1006c-15.8994 0 -21.0996 -13.1006 -21.0996 -13.1006l-36.7002 -74.5c-5.59961 -9.39941 -8.39941 -18.0996 -18.7998 -18.0996h-32.9004
c-20.7998 0 -10.3994 18.0996 -10.3994 18.0996l55.8994 111.5s12.2002 30.4004 46.4004 30.4004h35.0996z" />
    <glyph glyph-name="whatsapp-square" unicode="&#xf40c;" 
d="M224 325.2c35.2002 0 68.2002 -13.7002 93.2002 -38.7002c24.8994 -24.9004 40.0996 -58 40.0996 -93.2002c0 -72.7002 -60.7002 -131.8 -133.3 -131.8h-0.0996094c-23.7002 0 -46.9004 6.40039 -67.1006 18.4004l-4.7998 2.89941l-49.9004 -13.0996l13.3008 48.5996
l-3.10059 5c-13.2002 20.9004 -20.2002 45.2002 -20.2002 70.1006c0.100586 72.6992 59.2002 131.8 131.9 131.8zM301.5 136.8c3.2998 9.2002 3.2998 17.2002 2.40039 19.1006c-1 1.59961 -3.60059 2.59961 -7.60059 4.59961s-23.5 11.5996 -27.0996 12.9004
c-3.60059 1.2998 -6.2998 2 -8.90039 -2c-2.59961 -3.90039 -10.2002 -12.9004 -12.5 -15.5c-2.2998 -2.7002 -4.59961 -3 -8.59961 -1c-23.2998 11.6992 -38.6006 20.7998 -53.9004 47.0996c-4.09961 7 4 6.40039 11.6006 21.5996
c1.39941 2.60059 0.699219 4.90039 -0.300781 6.90039s-8.89941 21.5 -12.1992 29.4004c-3.2002 7.69922 -6.5 6.69922 -8.90039 6.7998c-2.2998 0.0996094 -5 0.0996094 -7.59961 0.0996094c-2.7002 0 -7 -1 -10.6006 -5c-3.7002 -4 -13.8994 -13.5996 -13.8994 -33.0996
s14.1992 -38.4004 16.1992 -41c2 -2.60059 28 -42.6006 67.7002 -59.7998c25.1006 -10.8008 34.9004 -11.8008 47.5 -9.90039c7.60059 1.09961 23.4004 9.5 26.7002 18.7998zM400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48
v352c0 26.5 21.5 48 48 48h352zM223.9 34.7998c87.3994 0 160.1 71.1006 160.1 158.5c0 42.4004 -18 82.2002 -47.9004 112.2c-30 30 -69.7998 46.5 -112.199 46.5c-87.4004 0 -158.5 -71.0996 -158.601 -158.5c0 -28 7.2998 -55.2998 21.2002 -79.2998l-22.5 -82.2002
l84.0996 22.0996c23.1006 -12.5996 49.2002 -19.2998 75.8008 -19.2998z" />
    <glyph glyph-name="whmcs" unicode="&#xf40d;" 
d="M448 287l-29.0996 -7l-2.2002 -12.0996l20.8994 -18.8008l-10.2998 -20.0996l-28.7998 8.7998l-7.7998 -8.09961l8.7998 -28l-20.4004 -12.1006l-20.6992 21.6006l-11.6006 -3.5l-6.7002 -28.7998l-22.5996 0.299805l-6.7002 28.5l-11.5996 2.89941l-19.4004 -20.3994
l-19.8994 11.5996l8.09961 26.9004l-7.2002 8.59961l-29.5996 -7.5l-10.4004 18.5l20.1006 19.9004l-2.40039 12.0996l-28.7998 7.5l0.299805 21.7002l28.5 7.7998l2.90039 10.4004l-20.7002 21l11 19.0996l28.5 -7.5l8.09961 8.40039l-8.09961 27.7002l19.3994 11
l19.7002 -21l12.1006 3.19922l6.19922 26.4004h22.6006l7 -26.4004l10.7002 -3.19922l21.2998 21l19.0996 -11.6006l-7.5 -28.2002l7.2002 -7.5l29 7.5l10.4004 -19.3994l-20.1006 -20.7002l2.2002 -10.4004l28.5 -8.7998v-21.2998zM328.8 241.8
c31.4004 0 56.7998 25.2998 56.7998 56.7998c0 31.4004 -25.3994 56.8008 -56.7998 56.8008c-31.3994 0 -56.7998 -25.4004 -56.7998 -56.8008c0 -31.3994 25.5 -56.7998 56.7998 -56.7998zM401.1 225.4l46.9004 -14.5v-39.9004l-55.0996 -13.4004l-4.10059 -22.6992
l38.9004 -35.3008l-19.2002 -37.8994l-54 16.7002l-14.5996 -15.2002l16.6992 -52.5l-38.2998 -22.7002l-38.8994 40.5l-21.7002 -6.59961l-12.6006 -54l-42.3994 0.5l-12.6006 53.5996l-21.6992 5.59961l-36.4004 -38.3994l-37.4004 21.7002l15.2002 50.5l-13.7002 16.0996
l-55.5 -14.0996l-19.6992 34.7998l37.8994 37.3994l-4.7998 22.8008l-54 14.0996l0.5 40.9004l53.5 14.6992l5.7002 19.7002l-38.9004 39.4004l20.7002 35.7998l53.5996 -14.0996l15.2002 15.6992l-15.2002 52l36.4004 20.7002l36.7998 -39.3994l22.7002 6.09961l11.5996 52
h42.4004l11.5996 -45.9004l-22.5996 5.90039l-6.2998 1.7002l-3.2998 -5.7002l-11 -19.0996l-3.30078 -5.60059l4.60059 -4.59961l17.2002 -17.4004l-0.300781 -1l-23.7998 -6.5l-6.2002 -1.7002l-0.0996094 -6.39941l-0.200195 -12.9004
c-47.5 -10.3994 -83.2998 -52.7998 -83.2998 -103.5c0 -58.2998 47.2998 -105.7 105.7 -105.7c50.5 0 92.7002 35.4004 103.2 82.8008l13.1992 -0.200195l6.90039 -0.100586l1.59961 6.7002l5.60059 24l1.89941 0.600586l17.1006 -17.8008l4.7002 -4.89941l5.7998 3.39941
l20.3994 12.1006l5.80078 3.5l-2 6.5z" />
    <glyph glyph-name="wordpress-simple" unicode="&#xf411;" horiz-adv-x="512" 
d="M256 440c136.7 0 248 -111.2 248 -248c0 -136.7 -111.3 -248 -248 -248s-248 111.3 -248 248c0 136.8 111.3 248 248 248zM33 192c0 -88.2002 51.2998 -164.5 125.7 -200.7l-106.4 291.4c-12.3994 -27.7002 -19.2998 -58.4004 -19.2998 -90.7002zM256 -31
c26 0 50.9004 4.5 74 12.5996c-0.599609 1 -1.09961 2 -1.59961 3.10059l-68.5 187.8l-66.9004 -194.4c20 -5.89941 41.0996 -9.09961 63 -9.09961zM286.7 296.5l80.7002 -239.6l22.1992 74.2998c9.7002 30.8994 17 53 17 72.0996c0 27.6006 -9.89941 46.7002 -18.3994 61.5
c-11.2998 18.4004 -21.9004 33.9004 -21.9004 52.2998c0 20.5 15.5 39.6006 37.4004 39.6006c1 0 1.89941 -0.100586 2.89941 -0.200195c-39.6992 36.2998 -92.5996 58.5 -150.6 58.5c-77.9004 0 -146.4 -40 -186.3 -100.5
c5.2998 -0.200195 10.2002 -0.299805 14.3994 -0.299805c23.3008 0 59.4004 2.7998 59.4004 2.7998c12 0.700195 13.4004 -17 1.40039 -18.4004c0 0 -12.1006 -1.39941 -25.5 -2.09961l81.1992 -241.5l48.8008 146.3l-34.7002 95.2002
c-12 0.700195 -23.4004 2.09961 -23.4004 2.09961c-12 0.700195 -10.5996 19.1006 1.40039 18.4004c0 0 36.7998 -2.7998 58.7002 -2.7998c23.2998 0 59.3994 2.7998 59.3994 2.7998c12 0.700195 13.4004 -17 1.40039 -18.4004c0 0 -12.1006 -1.39941 -25.5 -2.09961z
M368.1 -0.700195c66.3008 38.6006 110.9 110.4 110.9 192.7c0 38.7998 -9.90039 75.2002 -27.2998 107c1 -7.09961 1.5 -14.7002 1.5 -22.9004c0 -22.6992 -4.2998 -48.0996 -17 -79.8994z" />
    <glyph glyph-name="xbox" unicode="&#xf412;" horiz-adv-x="512" 
d="M369.9 129.8c44.2998 -54.2998 64.6992 -98.7998 54.3994 -118.7c-7.89941 -15.0996 -56.7002 -44.5996 -92.5996 -55.8994c-29.6006 -9.2998 -68.4004 -13.2998 -100.4 -10.2002c-38.2002 3.7002 -76.8994 17.4004 -110.1 39
c-27.9004 18.2002 -34.2002 25.7002 -34.2002 40.5996c0 29.9004 32.9004 82.3008 89.2002 142.101c32 33.8994 76.5 73.7002 81.3994 72.5996c9.40039 -2.09961 84.3008 -75.0996 112.301 -109.5zM188.6 304.2c-66.3994 -81.5 -106 -155.4 -120.3 -194.4
c-9.7998 -26.5 -13.7002 -53 -9.5 -64c2.7998 -7.39941 0.200195 -4.7002 -9.2998 9.90039c-23.2002 35.5 -34.9004 70.3994 -40.5 120.899c-1.90039 16.7002 -1.2002 26.3008 4.2002 60.5c6.7998 42.7002 31.0996 92 60.2998 122.4
c12.4004 12.9004 13.5 13.2002 28.7002 8.09961c28.2998 -9.5 56.7002 -36.5 86.3994 -63.3994zM500.2 240.7c4.7002 -22.6006 5.09961 -70.9004 0.799805 -93.4004c-3.59961 -18.5 -11.2002 -42.5 -18.5996 -58.7002c-5.5 -12.1992 -19.3008 -35.7998 -25.4004 -43.5
c-3.09961 -3.89941 -3.09961 -3.89941 -1.40039 4.60059c2.30078 11.2002 -0.599609 31.5996 -7.39941 52.2998c-20.7002 62.9004 -80.5 149 -122.9 202.3c23.2998 21.4004 41 38.2998 64.2998 52.7998c11.8008 7.40039 28.7002 13.9004 36 13.9004
c7.10059 0 57.7002 -50.2998 74.6006 -130.3zM141.3 405c-14.5996 -0.700195 -14 0.0996094 9.40039 11.2002c81.2002 38.2998 170 27.5996 233.899 -11.7002c-13.3994 0.599609 -43.5 5.90039 -107.399 -25.2002c-11.2002 -5.5 -20.9004 -9.7998 -21.6006 -9.7002
c-4.59961 0.900391 -66.5996 37.9004 -114.3 35.4004z" />
    <glyph glyph-name="yandex" unicode="&#xf413;" horiz-adv-x="256" 
d="M153.1 132.2l-87.3994 -196.2h-63.7002l96 209.8c-45.0996 22.9004 -75.2002 64.4004 -75.2002 141.101c-0.0996094 107.399 68 161.1 148.9 161.1h82.2998v-512h-55.0996v196.2h-45.8008zM198.9 401.5h-29.4004c-44.4004 0 -87.4004 -29.4004 -87.4004 -114.6
c0 -82.3008 39.4004 -108.801 87.4004 -108.801h29.4004v223.4z" />
    <glyph glyph-name="yandex-international" unicode="&#xf414;" horiz-adv-x="320" 
d="M129.5 -64v166.1l-111 297.9h55.7998l81.7998 -229.7l94.1006 277.7h51.2998l-120.7 -347.8v-164.2h-51.2998z" />
    <glyph glyph-name="apple-pay" unicode="&#xf415;" horiz-adv-x="640" 
d="M116.9 289.5c-7.5 -8.90039 -19.5 -15.9004 -31.5 -14.9004c-1.5 12 4.39941 24.8008 11.2998 32.6006c7.5 9.09961 20.5996 15.5996 31.2998 16.0996c1.2002 -12.3994 -3.7002 -24.7002 -11.0996 -33.7998zM127.8 272.3c6.7998 -0.5 26.2998 -2.5 38.7998 -21.0996
c-1 -0.799805 -23.1992 -13.5 -22.8994 -40.2998c0.299805 -32 28 -42.6006 28.2998 -42.9004c-0.200195 -0.799805 -4.40039 -15.0996 -14.5 -29.9004c-8.90039 -13 -18 -25.6992 -32.5 -26c-14 -0.199219 -18.7002 8.40039 -34.7998 8.40039
c-16 0 -21.2002 -8.09961 -34.5 -8.59961c-14 -0.5 -24.6006 13.7998 -33.5 26.7998c-18.2002 26.2998 -32.1006 74 -13.2998 106.3c9.09961 16.0996 25.6992 26.2002 43.5996 26.5c13.7998 0.299805 26.4004 -9.09961 34.7998 -9.09961
c8.2002 0 23.1006 10.8994 40.5 9.89941zM228.2 308.5h73.2002c37.6992 0 64.0996 -26 64.0996 -64s-26.7998 -64.2998 -65.0996 -64.2998h-41.9004v-66.6006h-30.2998v194.9zM258.5 283v-77.4004h34.7998c26.4004 0 41.4004 14.2002 41.4004 38.8008
c0 24.5996 -15 38.5996 -41.2998 38.5996h-34.9004zM420.7 112.1c-28.1006 0 -47.7002 16.8008 -47.7998 42c0 25 19 39.4004 54.0996 41.5l37.7998 2.30078v10.7998c0 15.8994 -10.3994 24.5 -28.8994 24.5c-15.2002 0 -26.3008 -7.90039 -28.6006 -19.9004h-27.2998
c0.900391 25.2002 24.7002 43.6006 56.7998 43.6006c34.6006 0 57.1006 -18.2002 57.1006 -46.3008v-97h-28v23.4004h-0.600586c-8 -15.2998 -25.5996 -24.9004 -44.5996 -24.9004zM428.9 135.2c20.5 0 36 13 36 31.2002v11l-33.6006 -2.10059
c-18.8994 -1.09961 -28.7998 -8.2002 -28.7998 -20.5c0 -11.7998 10.2998 -19.5996 26.4004 -19.5996zM531.4 60.5996c-2.30078 0 -9.80078 0.300781 -11.6006 0.700195v23.4004c1.90039 -0.200195 6.5 -0.5 8.90039 -0.5c13.3994 0 20.8994 5.7002 25.5 20.2998
l2.7998 8.59961l-51.2002 141.9h31.6006l35.5996 -115.1h0.599609l35.6006 115.1h30.7998l-53.0996 -149c-12.1006 -34.0996 -26 -45.4004 -55.5 -45.4004z" />
    <glyph glyph-name="cc-apple-pay" unicode="&#xf416;" horiz-adv-x="576" 
d="M302.2 229.6c0 -17.1992 -10.5 -27.0996 -29 -27.0996h-24.2998v54.2002h24.3994c18.4004 0 28.9004 -9.7998 28.9004 -27.1006zM349.7 167c0 8.59961 6.89941 13.5 20.2002 14.4004l23.5 1.5v-7.7002c0 -12.7998 -10.8008 -21.9004 -25.2002 -21.9004
c-11.2998 0 -18.5 5.40039 -18.5 13.7002zM576 369v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48zM127.8 250.8c8.40039 -0.700195 16.7998 4.2002 22.1006 10.4004
c5.19922 6.39941 8.59961 15 7.69922 23.7002c-7.39941 -0.300781 -16.5996 -4.90039 -21.8994 -11.3008c-4.7998 -5.5 -8.90039 -14.3994 -7.90039 -22.7998zM188.4 176.3c-0.200195 0.200195 -19.6006 7.60059 -19.8008 30c-0.199219 18.7002 15.3008 27.7002 16 28.2002
c-8.7998 13 -22.3994 14.4004 -27.0996 14.7002c-12.2002 0.700195 -22.5996 -6.90039 -28.4004 -6.90039c-5.89941 0 -14.6992 6.60059 -24.2998 6.40039c-12.5 -0.200195 -24.2002 -7.2998 -30.5 -18.6006c-13.0996 -22.5996 -3.39941 -56 9.2998 -74.3994
c6.2002 -9.10059 13.7002 -19.1006 23.5 -18.7002c9.30078 0.400391 13 6 24.2002 6c11.2998 0 14.5 -6 24.2998 -5.90039c10.2002 0.200195 16.5 9.10059 22.8008 18.2002c6.89941 10.4004 9.7998 20.4004 10 21zM323.8 229.7c0 26.5996 -18.5 44.7998 -44.8994 44.7998
h-51.2002v-136.4h21.2002v46.6006h29.2998c26.7998 0 45.5996 18.3994 45.5996 45zM413.8 206c0 19.7002 -15.7998 32.4004 -40 32.4004c-22.5 0 -39.0996 -12.9004 -39.7002 -30.5h19.1006c1.59961 8.39941 9.39941 13.8994 20 13.8994c13 0 20.2002 -6 20.2002 -17.2002
v-7.5l-26.4004 -1.59961c-24.5996 -1.5 -37.9004 -11.5996 -37.9004 -29.0996c0 -17.7002 13.7002 -29.4004 33.4004 -29.4004c13.2998 0 25.5996 6.7002 31.2002 17.4004h0.399414v-16.4004h19.6006v68h0.0996094zM516 237.1h-21.5l-24.9004 -80.5996h-0.399414
l-24.9004 80.5996h-22.2998l35.9004 -99.2998l-1.90039 -6c-3.2002 -10.2002 -8.5 -14.2002 -17.9004 -14.2002c-1.69922 0 -4.89941 0.200195 -6.19922 0.300781v-16.4004c1.19922 -0.400391 6.5 -0.5 8.09961 -0.5c20.7002 0 30.4004 7.90039 38.9004 31.7998z" />
    <glyph glyph-name="fly" unicode="&#xf417;" horiz-adv-x="384" 
d="M197.8 20.2002c12.9004 -11.7002 33.7002 -33.2998 33.2002 -50.7002c0 -0.799805 -0.0996094 -1.59961 -0.0996094 -2.5c-1.80078 -19.7998 -18.8008 -31.0996 -39.1006 -31c-25 0.0996094 -39.8994 16.7998 -38.7002 35.7998c1 16.2002 20.5 36.7002 32.4004 47.6006
c2.2998 2.09961 2.7002 2.69922 5.59961 3.59961c3.40039 0 3.90039 -0.299805 6.7002 -2.7998zM331.9 380.7c23.8994 -40 27.7998 -73.2998 20.7998 -112.5c-15.2002 -69.9004 -103.601 -166.5 -155.9 -215.7c-1.7002 -1.59961 -1.39941 -1.40039 -3.5 -2.09961
l-3.2998 0.0996094c-1.7002 0.599609 -4.5 3.5 -6.2002 5.09961c-58.7998 57.8008 -148.7 151.601 -155.8 233.801c-1.5 71.3994 29.2998 113.399 82.9004 141.3c9.89941 4.09961 37 17.2998 81.0996 17.2998c22 0.200195 51.0996 -4.5 76.5996 -15.2002
c24.7002 -11.5 47 -26.3994 63.3008 -52.0996zM186.8 96.0996v325.7c-57.8994 -5.5 -72.7002 -89.2002 -69.2998 -136.7c4.09961 -58.2998 41.2998 -137.899 69.2998 -189zM328.7 268c15.7998 54.9004 -10.9004 134.7 -99.7002 153
c38.2002 -25.5996 49.5996 -85.5 48 -131.4c-2 -58.5996 -39.4004 -140 -67.2002 -191.899c41.6006 42.2998 102.5 113.5 118.9 170.3z" />
    <glyph glyph-name="node" unicode="&#xf419;" horiz-adv-x="640" 
d="M316.3 -4c-2.09961 0 -4.2002 0.599609 -6.09961 1.59961l-19.2002 11.4004c-2.90039 1.59961 -1.5 2.2002 -0.5 2.5c3.7998 1.2998 4.59961 1.59961 8.7002 4c0.399414 0.200195 1 0.0996094 1.39941 -0.0996094l14.8008 -8.80078
c0.5 -0.299805 1.2998 -0.299805 1.7998 0l57.7998 33.4004c0.5 0.299805 0.900391 0.900391 0.900391 1.59961v66.7002c0 0.700195 -0.300781 1.2998 -0.900391 1.60059l-57.7998 33.2998c-0.5 0.299805 -1.2002 0.299805 -1.7998 0l-57.8008 -33.2998
c-0.599609 -0.300781 -0.899414 -1 -0.899414 -1.60059v-66.7002c0 -0.599609 0.399414 -1.19922 0.899414 -1.5l15.8008 -9.09961c8.59961 -4.2998 13.8994 0.799805 13.8994 5.7998v65.9004c0 0.899414 0.700195 1.7002 1.7002 1.7002h7.2998
c0.900391 0 1.7002 -0.700195 1.7002 -1.7002v-65.9004c0 -11.5 -6.2002 -18 -17.0996 -18c-3.30078 0 -6 0 -13.3008 3.60059l-15.1992 8.69922c-3.7002 2.2002 -6.10059 6.2002 -6.10059 10.5v66.7002c0 4.2998 2.2998 8.40039 6.10059 10.5l57.7998 33.4004
c3.7002 2.09961 8.5 2.09961 12.0996 0l57.7998 -33.4004c3.7002 -2.2002 6.10059 -6.2002 6.10059 -10.5v-66.7002c0 -4.2998 -2.2998 -8.39941 -6.10059 -10.5l-57.7998 -33.3994c-1.7002 -1.10059 -3.7998 -1.7002 -6 -1.7002zM363 61.7998
c0 -12.5996 -10.5 -19.7998 -29 -19.7998c-25.2998 0 -30.5996 11.5996 -30.5996 21.2998c0 1 0.799805 1.7002 1.69922 1.7002h7.5c0.900391 0 1.60059 -0.599609 1.7002 -1.40039c1.10059 -7.59961 4.5 -11.3994 19.7998 -11.3994
c12.2002 0 17.4004 2.7002 17.4004 9.2002c0 3.69922 -1.5 6.39941 -20.4004 8.2998c-15.7998 1.59961 -25.5996 5 -25.5996 17.7002c0 11.5996 9.7998 18.5996 26.2998 18.5996c18.5 0 27.6006 -6.40039 28.7998 -20.2002
c0.100586 -0.5 -0.0996094 -0.899414 -0.399414 -1.2998c-0.299805 -0.299805 -0.700195 -0.5 -1.2002 -0.5h-7.5c-0.799805 0 -1.40039 0.5 -1.59961 1.2998c-1.80078 8 -6.2002 10.6006 -18.1006 10.6006c-13.2998 0 -14.7998 -4.60059 -14.7998 -8.10059
c0 -4.2002 1.7998 -5.39941 19.7998 -7.7998c17.7998 -2.40039 26.2002 -5.7002 26.2002 -18.2002zM417.5 111.9c0 -6.10059 -5 -11.1006 -11.0996 -11.1006c-6.10059 0 -11.1006 5 -11.1006 11.1006c0 6.2998 5.2002 11.0996 11.1006 11.0996
c6 0.0996094 11.0996 -4.7998 11.0996 -11.0996zM415.7 111.9c0 5.19922 -4.2002 9.2998 -9.40039 9.2998c-5.09961 0 -9.2998 -4.10059 -9.2998 -9.2998c0 -5.2002 4.2002 -9.40039 9.2998 -9.40039c5.2002 0.0996094 9.40039 4.2998 9.40039 9.40039zM411.2 105.7
h-2.60059c-0.0996094 0.599609 -0.5 3.7998 -0.5 3.89941c-0.199219 0.700195 -0.399414 1.10059 -1.2998 1.10059h-2.2002v-5h-2.39941v12.5h4.2998c1.5 0 4.40039 0 4.40039 -3.2998c0 -2.30078 -1.5 -2.80078 -2.40039 -3.10059
c1.7002 -0.0996094 1.7998 -1.2002 2.09961 -2.7998c0.100586 -1 0.300781 -2.7002 0.600586 -3.2998zM408.4 114.5c0 1.7002 -1.2002 1.7002 -1.80078 1.7002h-2v-3.5h1.90039c1.59961 0 1.90039 1.09961 1.90039 1.7998zM137.3 257l-0.200195 -95
c0 -1.2998 -0.699219 -2.59961 -1.7998 -3.2002c-1.09961 -0.700195 -2.59961 -0.700195 -3.7002 0l-36.3994 20.9004c-2.2998 1.2998 -3.7002 3.7998 -3.7002 6.39941v44.4004c0 2.59961 -1.40039 5.09961 -3.7002 6.40039l-15.5 8.89941
c-1.09961 0.700195 -2.39941 1 -3.7002 1c-1.2998 0 -2.5 -0.299805 -3.69922 -1l-15.5 -8.89941c-2.30078 -1.30078 -3.7002 -3.80078 -3.7002 -6.40039v-44.4004c0 -2.59961 -1.40039 -5 -3.7002 -6.39941l-36.4004 -20.9004
c-1.19922 -0.700195 -2.59961 -0.700195 -3.69922 0c-1.10059 0.700195 -1.80078 1.90039 -1.80078 3.2002l-0.0996094 95c0 2.59961 1.40039 5.09961 3.7002 6.40039l61.2002 35.2998c1.09961 0.599609 2.19922 1 3.39941 1h0.600586
c1.19922 -0.100586 2.39941 -0.400391 3.39941 -1l61.2998 -35.2998c2.30078 -1.30078 3.7002 -3.7002 3.7002 -6.40039zM472.5 360.7v-176.4c0 -2.59961 -1.40039 -5.09961 -3.7002 -6.39941l-61.2998 -35.4004c-2.2998 -1.2998 -5.09961 -1.2998 -7.40039 0
l-61.2998 35.4004c-2.2998 1.2998 -3.7002 3.7998 -3.7002 6.39941v70.7998c0 2.60059 1.40039 5.10059 3.7002 6.40039l61.2998 35.4004c2.30078 1.2998 5.10059 1.2998 7.40039 0l15.2998 -8.80078c1.7002 -1 3.90039 0.300781 3.90039 2.2002v94
c0 2.7998 3 4.60059 5.5 3.2002l36.5 -20.4004c2.2998 -1.19922 3.7998 -3.69922 3.7998 -6.39941zM426.5 231.8c0 0.700195 -0.400391 1.2998 -0.900391 1.60059l-21 12.1992c-0.599609 0.300781 -1.2998 0.300781 -1.89941 0l-21 -12.1992
c-0.600586 -0.300781 -0.900391 -0.900391 -0.900391 -1.60059v-24.2998c0 -0.700195 0.400391 -1.2998 0.900391 -1.59961l21 -12.1006c0.599609 -0.299805 1.2998 -0.299805 1.7998 0l21 12.1006c0.599609 0.299805 0.900391 0.899414 0.900391 1.59961v24.2998h0.0996094
zM636.3 232.5l-36.7002 -21.2998c-2.5 -1.40039 -5.59961 0.399414 -5.59961 3.2002v17.3994c0 1.2998 -0.799805 2.5 -1.90039 3.2002l-19.1992 11.0996c-1.10059 0.700195 -2.60059 0.700195 -3.7002 0l-19.2002 -11.0996
c-1.2002 -0.700195 -1.90039 -1.90039 -1.90039 -3.2002v-22.2002c0 -1.2998 0.700195 -2.5 1.90039 -3.19922l61.7002 -35.4004c2.5 -1.40039 2.5 -5 0 -6.40039l-36.7998 -20.5c-2.30078 -1.2998 -5.10059 -1.2998 -7.30078 0l-60.8994 34.7002
c-2.2998 1.2998 -3.7002 3.7002 -3.7002 6.40039v70.7998c0 2.59961 1.40039 5.09961 3.7002 6.40039l61.2998 35.3994c2.2998 1.2998 5.09961 1.2998 7.40039 0l60.8994 -35.3994c2.2998 -1.30078 3.7002 -3.80078 3.7002 -6.40039v-17.0996
c0 -2.60059 -1.40039 -5.10059 -3.7002 -6.40039zM559 229l11.7998 6.7998c0.400391 0.299805 1 0.299805 1.40039 0l11.7998 -6.7998c0.400391 -0.200195 0.700195 -0.700195 0.700195 -1.2002v-13.5996c0 -0.5 -0.299805 -0.900391 -0.700195 -1.2002l-11.7998 -6.7998
c-0.400391 -0.299805 -1 -0.299805 -1.40039 0l-11.7998 6.7998c-0.400391 0.200195 -0.700195 0.700195 -0.700195 1.2002v13.5996c0 0.5 0.299805 0.900391 0.700195 1.2002zM304.8 185.5c0 -0.599609 -0.0996094 -1.2002 -0.200195 -1.7002
c-0.5 -2 -1.7998 -3.7002 -3.59961 -4.7002l-61 -35.1992c-2.2002 -1.30078 -5 -1.40039 -7.40039 0l-61.1992 35.1992c-2.10059 1.2002 -4 3.60059 -4 6.40039v70.4004c0 2.69922 1.59961 5.09961 3.89941 6.39941l61.1006 35.2002
c2.39941 1.40039 5.2998 1.2002 7.39941 0l61.1006 -35.2002c2.2998 -1.2998 3.89941 -3.7998 3.89941 -6.39941v-70.4004zM230.5 310.4l-0.799805 -0.5h1.09961zM306.7 180.2l-0.400391 0.700195v-0.900391z" />
    <glyph glyph-name="osi" unicode="&#xf41a;" horiz-adv-x="512" 
d="M8 181.56c2.2998 135.801 97.3994 232.441 213.799 248.102c138.8 18.5996 255.601 -75.7998 278 -201.101c21.2998 -118.8 -44 -230 -151.6 -274c-9.2998 -3.7998 -14.4004 -1.69922 -18 7.7002c-17.7998 46.2998 -35.5996 92.6328 -53.3994 138.999
c-3.09961 8.10059 -1 13.2002 7 16.7998c24.2002 11 39.2998 29.4004 43.2998 55.8008c0.469727 3.01562 0.850586 7.94043 0.850586 10.9922c0 36.2061 -29.2764 68.1074 -65.3506 71.207c-39 3.40039 -71.7998 -23.6992 -77.5 -59.6992
c-5.19922 -33 11.1006 -63.7002 41.9004 -77.7002c9.59961 -4.40039 11.5 -8.60059 7.7998 -18.4004c-17.8994 -46.5996 -35.7998 -93.2324 -53.7002 -139.899c-2.59961 -6.90039 -8.2998 -9.30078 -15.5 -6.5c-52.5996 20.2998 -101.399 61 -130.8 119
c-24.8994 49.1992 -25.2002 87.6992 -26.7998 108.699zM28.8994 183.461c0.399414 -6.59961 0.599609 -14.3008 1.2998 -22.1006c6.2998 -71.9004 49.5996 -143.5 131 -183.101c3.2002 -1.5 4.39941 -0.799805 5.59961 2.2998c14.9004 39.1006 29.9004 78.2012 45 117.302
c1.2998 3.2998 0.600586 4.7998 -2.39941 6.69922c-31.6006 19.9004 -47.3008 48.5 -45.6006 86c1 21.6006 9.2998 40.5 23.7998 56.3008c30 32.6992 77 39.7998 115.5 17.5996c25.3174 -14.5977 45.8643 -50.1641 45.8643 -79.3877
c0 -3.05078 -0.296875 -7.98438 -0.664062 -11.0127c-3.59961 -30.5996 -19.2998 -53.8994 -45.7002 -69.7998c-2.69922 -1.59961 -3.5 -2.89941 -2.2998 -6c15.2002 -39.2002 30.2666 -78.4336 45.2002 -117.7c1.2002 -3.09961 2.40039 -3.7998 5.59961 -2.2998
c35.5 16.6006 65.2002 40.2998 88.1006 72c34.7998 48.2002 49.0996 101.9 42.2998 161c-13.7002 117.5 -119.4 214.8 -255.5 198c-106.1 -13 -195.3 -102.5 -197.1 -225.8z" />
    <glyph glyph-name="react" unicode="&#xf41b;" horiz-adv-x="512" 
d="M418.2 270.8c54.3994 -18.7002 93.7998 -48.0996 93.7998 -78.3994c0 -31.7002 -41.7998 -62.6006 -99.5 -81.7002c-3.09961 -1 -6.2002 -2 -9.40039 -2.90039c1.10059 -4.59961 2.10059 -9.09961 3 -13.5c11.4004 -57.5996 2.60059 -104.899 -24.3994 -120.5
c-26.1006 -15.0996 -68.4004 -0.200195 -111.2 36.6006c-4.59961 4 -9.2002 8.09961 -13.5996 12.3994c-3.5 -3.39941 -7 -6.59961 -10.5 -9.7002c-44.2002 -38.6992 -89.6006 -54.6992 -116.601 -39.0996c-26.2002 15.0996 -34.3994 59.0996 -23.8994 114.6
c1.19922 6.10059 2.5 12 4 18c-4.60059 1.30078 -9.10059 2.80078 -13.6006 4.30078c-55.5 19 -96.2998 50.2998 -96.2998 81.5c0 30.1992 38.2998 59.3994 91.7002 77.8994c5.89941 2.10059 12.2002 4.10059 18.5996 5.90039
c-1.39941 5.59961 -2.59961 11.0996 -3.7002 16.7002c-11 56.3994 -3.19922 101.5 23 116.699c27.3008 15.9004 72.9004 -1.09961 118.4 -41.5c2.7998 -2.5 5.59961 -5.09961 8.2998 -7.69922c4 3.89941 8.2002 7.7998 12.5 11.5
c43.4004 37.7998 86.2998 53.5 112.601 38.3994c27.2998 -15.7998 35.3994 -63.7002 23.0996 -123.3c-0.799805 -3.7002 -1.59961 -7.40039 -2.5 -11.0996c5.40039 -1.60059 10.7998 -3.30078 16.2002 -5.10059zM282.9 355.7c-4 -3.5 -7.80078 -7 -11.7002 -10.7002
c15.3994 -16.7002 29.5996 -34.5 42.5996 -53.0996c22.6006 -2 45.1006 -5.60059 67.2998 -10.6006c0.900391 3.2998 1.60059 6.60059 2.30078 10c10.5996 51.5 4.09961 90.7002 -12.8008 100.4c-15.7998 9.09961 -50.5 -3.60059 -87.6992 -36zM167.2 140.5
c-5 8.59961 -9.7002 17.2998 -14.2998 26.0996c-6.40039 -15.1992 -11.9004 -30.0996 -16.3008 -44.5c15.3008 -3.2998 30.8008 -5.7998 46.4004 -7.5c-5.5 8.5 -10.7002 17.2002 -15.7998 25.9004zM136.9 260.8c4.39941 -14.0996 9.69922 -28.7002 16 -43.5996
c4.5 8.7998 9.2998 17.5 14.1992 26c4.90039 8.59961 10.1006 17.0996 15.4004 25.3994c-15.9004 -2 -31.2002 -4.59961 -45.5996 -7.7998zM164.3 191.9c6.7002 -13.8008 13.7998 -27.3008 21.5 -40.6006s15.9004 -26.2998 24.6006 -39
c14.6992 -0.899414 29.8994 -1.39941 45.5996 -1.39941s31.2002 0.5 46.0996 1.59961c8.5 12.7998 16.6006 25.7002 24.2002 39c7.7002 13.4004 14.9004 27 21.6006 40.7998c-6.80078 13.7002 -14 27.2002 -21.7002 40.4004s-15.7998 26.0996 -24.2998 38.7002
c-14.9004 1.09961 -30.3008 1.69922 -45.9004 1.69922s-30.9004 -0.599609 -45.9004 -1.69922c-8.59961 -12.7002 -16.7998 -25.6006 -24.3994 -38.9004c-7.60059 -13.2998 -14.7998 -26.7998 -21.4004 -40.5996zM344.9 140.7c-5 -8.60059 -10.1006 -17.2002 -15.5 -25.6006
c15.7998 1.80078 31.5 4.5 47 8c-4.90039 15.1006 -10.5 29.8008 -16.9004 44.3008c-4.7002 -9 -9.5 -17.9004 -14.5996 -26.7002zM359.3 217.2c6.10059 14.2002 11.5 28.5996 16.1006 43.3994c-14.4004 3.30078 -29.8008 6 -45.9004 8
c5.2998 -8.2998 10.4004 -16.6992 15.2998 -25.1992c5 -8.60059 9.7998 -17.4004 14.5 -26.2002zM256.2 329.7c-10 -10.9004 -20.1006 -22.9004 -29.9004 -35.7998c19.7998 0.899414 39.7002 0.899414 59.5 0c-9.2002 12.3994 -19.0996 24.3994 -29.5996 35.7998zM140.2 391
c-15.7998 -9.09961 -22 -45.5996 -12.6006 -94c1.10059 -5.2002 2.2002 -10.4004 3.5 -15.5c22.2002 4.90039 44.6006 8.40039 67.2002 10.4004c13.1006 18.5996 27.4004 36.3994 42.9004 53.0996c-2.60059 2.40039 -5.10059 4.7998 -7.60059 7
c-39.2998 34.7998 -76.5996 48.7998 -93.3994 39zM115.7 127.4c6.89941 22 15.2002 43.5996 24.7998 64.5c-9.5 20.5996 -17.7002 41.8994 -24.5 63.5996c-5.7998 -1.7002 -11.5996 -3.5 -17.2998 -5.5c-45.6006 -15.9004 -77.2002 -39.2998 -77.2002 -57.5996
c1.90039 -12.1006 8.7002 -22.9004 18.7998 -29.9004c17.5 -13.9004 41.7002 -24.5 63 -31.2002c4.10059 -1.39941 8.2002 -2.7002 12.4004 -3.89941zM232.3 29.4004c3.2002 2.7998 6.40039 5.7998 9.60059 8.89941c-15.5 16.7998 -30 34.7002 -43.2002 53.4004
c-22.9004 1.7002 -45.5 5 -67.9004 9.7998c-1.39941 -5.5 -2.59961 -11.0996 -3.7002 -16.7002c-9 -47.5 -2.39941 -82.7998 13.5 -92c11.4004 -4.5 24.2002 -4 35.3008 1.2998c20.7998 8.2002 39.8994 20.2002 56.3994 35.3008zM256.8 53.7002
c10.5 11.5996 20.4004 23.7002 29.6006 36.3994c-10 -0.5 -20.1006 -0.699219 -30.4004 -0.699219c-10 0 -19.9004 0.199219 -29.5 0.599609c9.90039 -13.0996 20.0996 -25.2998 30.2998 -36.2998zM387.5 23.7002c3.2002 22.2002 2.40039 44.7002 -2.5 66.2998
c-0.799805 4 -1.7002 8.09961 -2.7002 12.2002c-22.5 -5.10059 -45.2998 -8.60059 -68.2002 -10.5c-12.7998 -18.7998 -26.8994 -36.7002 -42.1992 -53.6006c4.2998 -4 8.5 -7.89941 12.6992 -11.5c36.6006 -31.3994 70.5 -43.3994 86.4004 -34.1992
c9.59961 7.69922 15.5996 19.0996 16.5 31.2998zM405.7 131.2c49.8994 16.5 84.7998 41.7998 84.7998 61.3994c0 18.2002 -32.7002 42 -79.2998 58c-4.7998 1.60059 -9.7998 3.2002 -15 4.7002c-6.7998 -21.5 -14.9004 -42.5 -24.5 -62.8994
c9.89941 -20.7002 18.5 -42 25.5 -63.8008c2.89941 0.800781 5.7002 1.7002 8.5 2.60059zM256 146.2c-25.2998 0 -45.7998 20.5 -45.7998 45.7998s20.5 45.7998 45.7998 45.7998s45.7998 -20.5 45.7998 -45.7998s-20.5 -45.7998 -45.7998 -45.7998z" />
    <glyph glyph-name="autoprefixer" unicode="&#xf41c;" horiz-adv-x="640" 
d="M318.4 432l164.1 -480h-77.5l-25.2002 81.4004h-119.5l-25.3994 -81.4004h-77.5zM278.1 90.0996h83.6006l-40.9004 130.4h-1.5zM640 43l-158.5 -9.5l-19.4004 56.5l167.9 -15.5996zM177.9 90l-19.4004 -56.4004l-158.5 9.40039l10 31.2998z" />
    <glyph glyph-name="less" unicode="&#xf41d;" horiz-adv-x="640" 
d="M612.7 229c0 -11 6.7998 -22.5996 27.2998 -23.2998v-27.2998c-20.5 -1 -27.2998 -12.6006 -27.2998 -23.6006c0 -20.3994 3.2002 -32 3.2002 -54.5996c0 -34.2002 -12.7002 -45.2002 -40.5 -45.2002h-20.5v25.2002h6.2998v0.5c13.5996 0 17.2998 4.7002 17.2998 22.5996
c0 17.2998 -1.59961 32.6006 -1.59961 51.5c0 24.2002 7.7998 33.6006 23.5996 37.2998v1.60059c-15.7002 3.7002 -23.5996 13.0996 -23.5996 37.2998c0 18.9004 1.59961 35.2002 1.59961 51.5c0 17.4004 -3.09961 22.0996 -17.2998 22.0996h-6.2998v24.2002h20.5
c27.8994 0 40.5 -11 40.5 -45.2002c0 -22 -3.2002 -34.0996 -3.2002 -54.5996zM507.1 197c20.5 -6.7998 43 -18.9004 43 -47.7998c0 -28.9004 -22.5996 -51 -64.5996 -51c-20 0 -44.0996 9 -59.9004 22.0996l21 30.5c14.2002 -11 27.4004 -16.2998 40.5 -16.2998
c14.2002 0 20.5 5.2002 20.5 13.0996c0 10.5 -15.7998 15.8008 -32.0996 22.1006c-18.9004 7.2998 -41.5 20.5 -41.5 46.2002c0 28.8994 24.2002 49.3994 59.9004 49.3994c24.1992 0 42.0996 -10.5 55.1992 -20.5l-21 -27.7998c-11.5 8.40039 -22 13.0996 -33.5996 13.0996
s-17.9004 -4.69922 -17.9004 -12.5996c0 -10.5 14.7002 -14.2002 30.5 -20.5zM148.2 137.6c1.59961 0 3.09961 0 6.2002 0.800781l5.2998 -34.2002c-5.7002 -2.10059 -13.6006 -3.7002 -23.6006 -3.7002c-32.0996 0 -43.0996 21 -43.0996 53.0996v150.801h-14.0996
c-13.6006 0 -17.3008 -4.80078 -17.3008 -22.1006s1.60059 -32.5996 1.60059 -51.5c0 -24.2002 -7.7998 -33.5996 -23.6006 -37.2998v-1.59961c15.7002 -3.7002 23.6006 -13.1006 23.6006 -37.3008c0 -19.3994 -1.60059 -34.1992 -1.60059 -51.5
c0 -17.2998 4.2002 -22.5996 17.3008 -22.5996h6.2998v-24.2002h-20.5c-27.9004 0 -40.5 11 -40.5 45.2002c0 22.5996 3.2002 34.2002 3.2002 53.5996c0 11 -6.80078 22.6006 -27.3008 23.1006v27.2998c20.5 1 27.3008 12.5996 27.3008 23.5996
c0 19.4004 -3.2002 32 -3.2002 54.6006c0 34.2002 12.5996 45.2002 41 45.2002h74.5996v-178.2c0 -9.90039 4.7002 -13.1006 8.40039 -13.1006zM379.9 197c20.5 -6.7998 43.0996 -18.9004 43 -47.7998c0 -28.9004 -22.6006 -51 -64.6006 -51
c-20 0 -44.0996 9 -59.8994 22.0996l20.5 30.5c14.1992 -11 27.3994 -16.2998 40.5 -16.2998c14.1992 0 20.5 5.2002 20.5 13.0996c0 10.5 -15.8008 15.8008 -32.1006 22.1006c-18.8994 7.2998 -41.5 20.5 -41.5 46.2002c0 28.8994 24.2002 49.3994 59.9004 49.3994
c24.2002 0 42.0996 -10.5 55.2002 -20.5l-21 -27.7998c-11.5 8.40039 -22 13.0996 -33.6006 13.0996c-11.5996 0 -17.8994 -4.69922 -17.8994 -12.5996c0 -10.5 14.6992 -14.2002 31 -20.5zM224.9 265.8c44.0996 0 67.2998 -33.0996 66.6992 -75.7002
c0 -8.39941 -1.09961 -15.6992 -1.59961 -19.3994h-95.2002c4.2002 -24.2002 20.5 -34.2002 41.5 -34.2002c11.6006 0 22.6006 3.2002 34.2002 10l15.7998 -27.7998c-16.2998 -11.1006 -37.2998 -17.9004 -56.2002 -17.9004c-45.0996 0 -79.2998 30.5 -79.2998 82.5
c-1 50.4004 35.7002 82.5 74.1006 82.5zM194.9 199.6h56.7998c0 17.9004 -7.40039 31 -26.2998 31c-14.7002 0 -27.3008 -10 -30.5 -31z" />
    <glyph glyph-name="sass" unicode="&#xf41e;" horiz-adv-x="640" 
d="M301.84 69.0801c-0.299805 -0.599609 -0.599609 -1.08008 0 0zM550.97 156.08c57.9092 0.300781 90.5703 -37.0801 88.9707 -71.0801c-1.10059 -26.9004 -25.6904 -37.9004 -30.29 -38.7002c-3.30078 -0.599609 -5.10059 -0.700195 -5.60059 1.90039
c-0.299805 1.7998 0.900391 2.7002 4.7998 5.09961c3.90039 2.40039 15.6006 10.5 17.7002 25c2.10059 14.5 -8.7998 49.2998 -64.4795 55.7998c-26 3 -46.3906 -0.599609 -62.0898 -7.19922c2.89941 -7.60059 5.09961 -15.5 5.39941 -23.4004
c0.799805 -17.5 -11.29 -30.4004 -23.79 -39.5996c-5.48535 -3.98535 -15.1572 -8.95801 -21.5898 -11.1006c-5.2002 -2.2002 -12.2002 -4.5 -17.0996 -3.5c-10.9004 2.2002 -16.7002 11.7998 -9.30078 33.1006c4 11.5 15.5 29 34.0908 44.0996
c-4.30078 8.7002 -8.99023 17.5996 -11.3906 25.7002c-2.18164 7.00781 -4.95898 18.5664 -6.2002 25.7998c0 0 -15.2998 -31.7197 -35.0898 -60.6201c-1.09961 -1.7002 -2.2998 -3.39941 -3.39941 -5c3.7998 -9 6.89941 -18.5996 7.2998 -28.2002
c0.700195 -17.3994 -6.90039 -30.5996 -19.4004 -39.7998c-5.16211 -3.70605 -14.208 -8.45508 -20.1895 -10.5996c-3.90039 -1.7998 -12 -4.60059 -23.5 -5.40039c-6.29004 -0.5 -12.29 -0.0996094 -15.6904 2.5c-4.59961 3.40039 -5.2002 7.7998 -2.7998 13.7002
c2 5 17.21 22.4004 30 37.5996c3.5 4.2002 6.90039 8.5 9.90039 12.5c-0.0498047 0.0449219 -0.09375 0.134766 -0.100586 0.200195c0 0 2.2998 3 6.10059 8.2002c-4.7002 10.0996 -10.6006 20.5 -13.4004 30c-2.18164 7.00781 -4.95898 18.5664 -6.2002 25.7998
c0 0 -15.4902 -39.7002 -31.6895 -71.5c-12.4902 -24.5996 -20.79 -39.5 -24.5908 -46v-0.299805s-0.5 -0.900391 -1.5 -2.40039c-0.5 -0.799805 -0.699219 -1.19922 -0.699219 -1.19922v0.0996094c-4.20996 -6.2002 -13.6104 -18.2998 -23 -18.2998
c-25.7002 0 -16.3008 52.2002 -16.3008 52.2002s-7.5 -19.3008 -16 -35.9004c-6.88965 -13.5996 -13.0898 -25 -26.8896 -25c-3.90039 0 -10.1904 0.0996094 -15.3896 5c-11.8008 11.2002 -20.9004 39.7002 -19.1006 61.7002c1.5 18.7998 4.40039 31.7998 8.40039 42.5996
c-7.10059 -3.89941 -15.2002 -8.39941 -23.4902 -13.2998c-4.2998 -2.5 -8.59961 -5 -12.7998 -7.5c0.0996094 -0.299805 0.299805 -0.5 0.400391 -0.799805c10.5996 -20.4004 13.3896 -65.2002 -9.60059 -99.5s-65.7803 -55.2002 -107.57 -43.6006
c-13.3896 3.80078 -33.79 31.6006 -16.29 70.4004c15.4902 34.2002 77.3809 66.5996 93.6709 74.7002c1.39941 0.799805 2.89941 1.59961 4.5 2.5c-32.4902 28.3994 -113.671 66.7998 -125.061 125.7c-3.2002 16.5996 4.58984 56.2998 53.2803 101.899
c40.9902 38.2998 97.9697 67.7002 150.66 86.4004c88.4297 31.3994 181.949 12.8994 196.31 -43.5c14.1006 -55.5 -33.9902 -121.8 -95.7695 -145.601c-54.9902 -21.2998 -100.471 -17.8994 -119.17 -11.7998c-21.29 7 -33.79 21 -36.79 28.9004
c-1.2002 3.09961 -3.30078 8.2998 0 10.0996c2 1.10059 2.7998 0.799805 8.09961 -5.09961c5.09961 -5.60059 25.4902 -20.6006 64.2803 -16.2998c101.77 11.3994 163.06 90.5 143.66 133c-13.4902 29.7998 -91.8408 43.1992 -189.841 -5.60059
c-119.569 -59.5996 -126.069 -108.7 -127.069 -127.399c-2.7998 -51.3008 63.2793 -78.3008 99.0693 -116.5c0.5 -0.5 0.900391 -1 1.40039 -1.5c6.7002 3.69922 13.7998 7.59961 20.7002 11.3994c18 9.90039 35.0996 19.2002 43 23.5
c12.5801 18.2998 38.1797 38.5 56.5801 38.5c29.4893 0 19.3896 -42.3994 19.3896 -42.3994s0.599609 2 1.40039 2c0.799805 0 4.09961 5.5 13.1992 2.19922c9.40039 -3.5 7.2002 -10 7.30078 -10.6992c0.0996094 -1.30078 -11 -38.9004 -15.7002 -63.1006
c-2.2002 -11.5 -0.900391 -19.8994 -0.299805 -19.8994c0.899414 0 2.7998 2.89941 4.5 6.09961v0.0996094s1.2998 2.40039 3.5 6.7002c0 0.200195 -0.200195 -0.299805 -0.5 -0.799805c0.199219 0.400391 0.5 0.900391 0.899414 1.7002
c2.60059 5 6.2002 12.3994 10.4004 21.5996c8.18945 18.1006 39.4795 87.7002 42.0801 95.4004c2.59961 7.7002 4 15.7002 5.2998 19.0996c1.2998 3.40039 12.4102 6 25.2998 5.90039c12.8906 -0.100586 14.1904 -5.60059 14.29 -6.7002
c0.100586 -1.09961 -6.2002 -16.4004 -7.59961 -27.2002c-1.40039 -10.7998 -0.100586 -16.2002 1.09961 -25.2998c0.799805 -6 4.5 -13.5 8.90039 -22c13.2998 21.7998 36.79 63.5996 39.0898 75.2998c1.03613 5.38965 3.41016 13.9473 5.2998 19.1006
c1.29004 3.39941 12.3896 6 25.29 5.89941c12.9004 -0.0996094 14.2002 -5.59961 14.2998 -6.7002c0.100586 -1.09961 -6.2002 -16.3994 -7.59961 -27.1992c-1.40039 -10.8008 -0.100586 -16.2002 1.09961 -25.3008c1 -7.7998 7.10059 -18.1992 13 -30.0996
c15.1289 7.45215 41.0938 13.5 57.958 13.5h0.0419922zM121.79 11.3799c19.4004 21.0996 27.3896 47.9199 19.0996 78.3203c-1 -0.600586 -2 -1.10059 -2.89941 -1.7002c0 0 -0.400391 -0.200195 -1.2002 -0.700195c-4.7998 -2.89941 -8.7002 -5.2998 -11.4004 -6.89941
c-11.7998 -7.40039 -29.5898 -19.4004 -43.3896 -32.4004c-22.6904 -21.4199 -27.3896 -51 -15.4902 -57.9199c11.0898 -6.40039 36.8906 1.2002 55.2803 21.2998zM256.15 102.78c4 9.7998 19.6992 53.2998 16.1992 59.2002c-2.59961 4.5 -13.6992 0.899414 -23.79 -10.4004
c-6.2998 -7 -16.8994 -25 -21.8994 -40.0996c-9.90039 -30 -5.60059 -60.5 1.39941 -62.3008c8.2002 -2.09961 21.6904 37.9004 28.0908 53.6006zM367.15 49.7803c7.7998 4.7998 24.96 16.8994 25.0898 34.7998c0 0.599609 -0.100586 1.09961 -0.100586 1.59961
c-3.98926 -5.19922 -7.68945 -9.89941 -10.8896 -13.8994c-5.5 -6.7998 -19.4004 -21.7002 -19.4004 -21.7002s-2 -1.90039 -1.09961 -2.40039c1.2002 -0.699219 3.7002 0.200195 6.40039 1.60059zM452.73 69.2803c9.68945 3.5 25.7998 11.8994 25.8994 34.3994
c-0.0673828 3.06152 -0.918945 7.90039 -1.89941 10.8008c-10.4102 -9.2002 -16.4004 -18.8008 -19 -24.5c-6.7002 -14.6006 -7 -19.3008 -5 -20.7002z" />
    <glyph glyph-name="vuejs" unicode="&#xf41f;" 
d="M356.9 383.7h91.0996l-224 -383.7l-224 383.7h176l48 -88.6006l56 88.6006h76.9004zM55.7002 351.7l168.3 -288.2l168.2 288.2h-53.7998l-114.4 -198.2l-114.5 198.2h-53.7998z" />
    <glyph glyph-name="angular" unicode="&#xf420;" 
d="M185.7 179.9l38.0996 91.5996l38.1006 -91.5996h-76.2002zM223.8 416l207.8 -74.4004l-31.7998 -275.699l-176 -97.9004l-176 97.9004l-31.7998 275.699zM354 74.2002l-130.2 292.3l-130.1 -292.3h48.7002l26.1992 65.3994h110.601l26.2002 -65.3994h48.5996z" />
    <glyph glyph-name="aviato" unicode="&#xf421;" horiz-adv-x="640" 
d="M107.2 164.5l-19 41.7998h-52.1006l-19 -41.7998h-17.0996l62.2002 131.4l62.2002 -131.4h-17.2002zM62.2002 262.6l-19.6006 -42.5h39.2002zM174.9 160.2l-62.2002 131.399h17.0996l45.1006 -96l45.0996 96h17zM255.5 164.5v127.1h15.5v-127.1h-15.5zM464.6 280.1
v-115.6h-17.2998v115.6h-41.2002v11.5h99.6006v-11.5h-41.1006zM640 229.2c0 -9.2002 -1.7002 -17.7998 -5.09961 -25.7998c-3.40039 -8 -8.2002 -15.1006 -14.2002 -21.1006s-13.1006 -10.7998 -21.1006 -14.2002c-8 -3.39941 -16.5996 -5.09961 -25.7998 -5.09961
s-17.7998 1.7002 -25.7998 5.09961c-8 3.40039 -15.0996 8.2002 -21.0996 14.2002s-10.8008 13 -14.2002 21.1006c-3.40039 8 -5.10059 16.5996 -5.10059 25.7998s1.7002 17.7998 5.10059 25.7998c3.39941 8 8.2002 15.0996 14.2002 21.0996s13 8.40039 21.0996 11.9004
c8 3.40039 16.5996 5.09961 25.7998 5.09961s17.7998 -1.69922 25.7998 -5.09961s15.1006 -5.7998 21.1006 -11.9004c6 -6 10.7002 -13.0996 14.2002 -21.0996c3.39941 -8 5.09961 -16.5996 5.09961 -25.7998zM624.5 229.2c0 7.2998 -1.2998 14 -3.90039 20.2998
c-2.59961 6.2998 -6.19922 11.7002 -10.7998 16.2998c-4.59961 4.60059 -10 8.2002 -16.2002 10.9004c-6.19922 2.7002 -12.7998 4 -19.7998 4s-13.5996 -1.2998 -19.7998 -4s-11.5996 -6.2998 -16.2002 -10.9004c-4.59961 -4.59961 -8.2002 -10 -10.7998 -16.2998
s-3.90039 -13.0996 -3.90039 -20.2998c0 -7.2998 1.30078 -14 3.90039 -20.2998c2.59961 -6.30078 6.2002 -11.7002 10.7998 -16.3008c4.60059 -4.59961 10 -8.19922 16.2002 -10.8994s12.7998 -4 19.7998 -4s13.6006 1.2998 19.7998 4
c6.2002 2.7002 11.6006 6.2998 16.2002 10.8994c4.60059 4.60059 8.2002 10 10.7998 16.3008c2.60059 6.2998 3.90039 13.0996 3.90039 20.2998zM529.7 132.5c6 -0.900391 10.5 -6 10.7002 -12.2998c0 -6.7998 -5.60059 -12.4004 -12.4004 -12.4004
s-12.4004 5.60059 -12.4004 12.4004c0 6.2002 4.60059 11.2998 10.5 12.2002v5.7998l-80.2998 -9v-5.40039c5.60059 -1.09961 9.90039 -6.09961 9.90039 -12.0996c0 -6.7998 -5.60059 -10.2002 -12.4004 -10.2002s-12.3994 3.40039 -12.3994 10.2002
c0 5.89941 4.19922 11 9.89941 12.0996v4.90039l-28.3994 -3.2002v-23.7002h5.89941v-13.7998h-5.89941v6.59961h-5v-6.59961h-5.90039v13.7998h5.90039v23.2002l-38.3008 -4.2998c-8.09961 -11.5 -19 -13.6006 -19 -13.6006l0.100586 -6.69922l5.09961 -0.200195
l0.100586 -12.1006h-4.10059l-0.0996094 5h-5.2002l-0.0996094 -5h-4.10059l0.100586 12.1006l5.09961 0.200195l0.0996094 6.69922s-10.8994 2.2002 -19 13.6006l-38.2998 4.2998v-23.2002h5.90039v-13.7998h-5.90039v6.59961h-5v-6.59961h-5.89941v13.9004h5.89941
v23.6992l-28.3994 3.2002v-4.89941c5.59961 -1.10059 9.89941 -6.10059 9.89941 -12.1006c0 -6.7998 -5.59961 -10.2002 -12.3994 -10.2002c-6.80078 0 -12.4004 3.40039 -12.4004 10.2002c0 5.90039 4.2002 11 9.90039 12.1006v5.39941l-80.3008 9v-5.7998
c5.90039 -0.900391 10.5 -6 10.5 -12.2002c0 -6.7998 -5.59961 -12.3994 -12.3994 -12.3994s-12.4004 5.59961 -12.4004 12.3994c0 6.2002 4.60059 11.2998 10.5 12.2002v6.2998l-88.8994 10l242.899 -13.5c-0.599609 2.2002 -1.09961 4.60059 -1.39941 7.2002
c-0.300781 2.09961 -0.5 4.2002 -0.600586 6.5l-64.7998 8.09961l64.9004 -1.89941c0 0.399414 0 0.799805 0.0996094 1.09961c2.7998 17.2002 25.5 23.7002 25.5 23.7002l1.09961 26.4004h-23.5996l-19 -41.8008h-17.0996l62.1992 131.4l62.2002 -131.4h-17.0996
l-19 41.8008h-23.7998l1.09961 -26.3008s22.7002 -6.5 25.5 -23.6992c0 -0.400391 0.0996094 -0.700195 0.0996094 -1.10059l64.9004 1.90039l-64.7998 -8.10059c-0.100586 -2.2998 -0.299805 -4.5 -0.600586 -6.5c-0.299805 -2.59961 -0.799805 -5 -1.39941 -7.19922
l242.899 13.3994l-88.8994 -10v-6.2998zM328.9 220.1h17.8994l1.7002 40.3008l1.7002 -40.3008h17.8994l-19.5996 42.5z" />
    <glyph glyph-name="ember" unicode="&#xf423;" horiz-adv-x="640" 
d="M639.9 193.4c1.09961 -10.8008 -5.30078 -14.3008 -5.30078 -14.3008s-26.5996 -19.5996 -47 -13.6992c-20.3994 5.89941 -21.5 43.1992 -21.5 43.1992h-1.89941l-20.7002 -57.1992s-8.2998 -27.9004 -20.7002 -22.8008
c-12.3994 5.10059 -12.0996 18.6006 -12.0996 18.6006s-19.2998 -21.2998 -54.7998 -18.6006c-31.1006 2.30078 -41.1006 26.7002 -41.1006 26.7002s-20.7998 -14.3994 -79.0996 -25.8994c-26.1006 -2.90039 -44.6006 12.8994 -44.6006 12.8994
c-2.39941 -2.39941 -18 -10.2002 -18 -10.2002s-22.2998 -10.2998 -30.8994 5.30078c-8.60059 15.5996 -3 63.6992 -3 63.6992h-1.60059s-12.8994 -26.2998 -19.5996 -49.8994c-6.7002 -23.6006 -15 -21.2002 -15 -21.2002s-15.2998 -1.40039 -18.7998 11.4004
c-3.5 12.8994 5.59961 59.6992 5.59961 59.6992l-1.2998 -0.299805s-0.799805 1.40039 -12.5996 -23.5996c-20.1006 -48.9004 -24.9004 -50 -36.5 -47.9004c-11.6006 2.10059 -12.1006 16.7002 -12.1006 16.7002l-15.8994 -8.7998s-38.6006 -16.6006 -58.8008 -1.2998
c-13.3994 10.1992 -18 22.1992 -19.5996 29.6992c0 0 -17 1.80078 -28.0996 6.10059c-11.1006 4.2998 0.0996094 18.2998 0.0996094 18.2998s3.5 5.2998 10 0s18.7998 -2.90039 18.7998 -2.90039c1 8.5 2.5 19.7002 7.7998 31.5c11 24.7002 27.6006 33 41.3008 33.3008
c13.6992 0.199219 23.3994 -3.5 31.6992 -15.3008c18.6006 -45.8994 -49.3994 -69.1992 -49.3994 -69.1992s-1.7998 -12.1006 16.7002 -11.8008c18.5996 0.200195 46.7998 20.4004 46.7998 20.4004c1.2998 15.4004 12.0996 63.5 15 70.7002
c2.89941 7.2002 14.2002 5.89941 14.2002 5.89941s8.89941 1.90039 10.5 -7.5c1.69922 -9.39941 -6.40039 -47.5996 -6.40039 -47.5996l1.2998 -1.59961c0.799805 3.69922 20.4004 36.5 20.4004 36.5s11.2998 19.5996 28.5 18.7998s-0.799805 -53.5 -0.799805 -53.5
l1.2998 -1.60059l1.2998 2.40039c2.2002 5.90039 27.7002 44.5996 27.7002 44.5996s9.59961 11.3008 18.5 8.60059c8.7998 -2.60059 9.39941 -6.7002 9.89941 -14.2002s-7 -52.0996 -7 -52.0996s-4.2998 -29.2002 5.40039 -28.7002s20.2002 10.7002 20.2002 10.7002
s7.5 57.5996 12.5996 105.1c5.10059 47.5 27.1006 79.5 27.1006 79.5s6.5 10 23.5 16.7002c11.1992 4 23.3994 1.2998 29.1992 -23.1006c9.5 -41 -23.2998 -87.8994 -36.8994 -105.199c5.89941 5.7998 15.7998 12.0996 27.2002 5.2998
c40.2998 -25.2998 7.2998 -80.9004 7.2998 -80.9004c11.7998 3.7998 33 18 33 18s0.5 6.10059 0.700195 7.5c7.19922 41.2998 32 56.2002 36.5996 59.7002c4.7998 3.59961 47.0996 19.7998 49 -24s-52.9004 -59.0996 -52.9004 -59.0996s4.80078 -12.6006 25 -9.40039
c20.2002 3.2002 43.3008 22.7998 43.3008 22.7998c0.799805 18 12.5996 61 15 67.2002c2.39941 6.2002 17.1992 6.5 18.7998 3c2.2002 -7 0.299805 -37.5996 0.299805 -37.5996l1.59961 0.5c5.90039 17.5 18.3008 31.1992 18.3008 31.1992s9.89941 9.7002 18 7.30078
c8.09961 -2.30078 5.09961 -30.4004 5.09961 -30.4004s-4.2998 -30.7002 9.40039 -32c13.6992 -1.40039 29.2998 10.7002 29.2998 10.7002s9.59961 3.89941 10.7002 -6.7998zM61.9004 188.1c0 0 6.19922 -1.89941 19.8994 7.60059
c13.7002 9.39941 16.4004 24.3994 9.10059 31.3994c-7.2002 6.90039 -28.2002 -7 -29 -39zM334.7 311.9c0 0 -15.9004 -54.5 -16.4004 -70.7002c0 0 44.5 72 40 96.2002c-4.5 24.1992 -23.5996 -25.5 -23.5996 -25.5zM357.5 173.5
c12.5996 33.0996 -3.59961 45.5 -3.59961 45.5s-23.4004 12.9004 -33.3008 -20.2002c-9.89941 -33.0996 -6.39941 -44.8994 -6.39941 -44.8994s30.7002 -13.4004 43.2998 19.5996zM442.1 188.1c0 0 15.7002 -1.09961 26.4004 14.2002s1.2998 25.5 1.2998 25.5
s-8.59961 11.1006 -19.5996 -9.09961c-11.1006 -20.1006 -8.10059 -30.6006 -8.10059 -30.6006z" />
    <glyph glyph-name="font-awesome-flag" unicode="&#xf425;" 
d="M444.373 88.5762c0 -7.16797 -6.14453 -10.2402 -13.3125 -13.3125c-28.6719 -12.2881 -59.3916 -23.5518 -92.1592 -23.5518c-46.0801 0 -67.584 28.6719 -122.88 28.6719c-39.9365 0 -81.9209 -14.3359 -115.713 -29.6953
c-2.04785 -1.02441 -4.0957 -1.02441 -6.14355 -2.04883v-77.8232c0 -21.4053 -16.1221 -34.8164 -33.792 -34.8164c-19.4561 0 -34.8164 15.3604 -34.8164 34.8164v374.783c-13.3115 10.2402 -22.5273 26.624 -22.5273 45.0566c0 31.7441 25.5996 57.3438 57.3438 57.3438
s57.3438 -25.5996 57.3438 -57.3438c0 -18.4326 -8.19141 -34.8164 -22.5273 -45.0566v-31.7432c4.12402 1.37402 58.7676 28.6719 114.688 28.6719c65.2705 0 97.6758 -27.6484 126.976 -27.6484c38.9121 0 81.9209 27.6484 92.1602 27.6484
c8.19238 0 15.3604 -6.14453 15.3604 -13.3125v-240.64z" />
    <glyph glyph-name="gitter" unicode="&#xf426;" horiz-adv-x="384" 
d="M66.4004 125.5h-50.4004v322.5h50.4004v-322.5zM166.9 371.9v-435.9h-50.4004v435.9h50.4004zM267.5 371.9v-435.9h-50.4004v435.9h50.4004zM368 372v-247h-50.4004v247h50.4004z" />
    <glyph glyph-name="hooli" unicode="&#xf427;" horiz-adv-x="640" 
d="M144.5 96v16c12.2998 -6.59961 25.0996 -12.2002 38.2998 -16.7998zM202.2 101.3c29.5 -10.7002 55.3994 -13.5 75.2998 -13.2998c-24.7998 -7 -58.2002 -5.2998 -94.7002 7.2002l19.4004 0.799805v5.2998zM611.1 216.5c-16 0 -28.8994 13 -28.8994 28.9004
c0 15.8994 13 24.5 28.8994 24.5c16 0 28.9004 -8.5 28.9004 -24.5s-13 -28.9004 -28.9004 -28.9004zM582.1 96v110.5h57.9004v-110.5h-57.9004zM508.4 96v168l57.8994 27.2998v-195.3h-57.8994zM477.4 215.4c18.0996 -18.1006 16.6992 -33.8008 16.7998 -52.6006
c0 -18.7002 1.39941 -34.2998 -16.7998 -52.5c-18.1006 -18.2002 -50.4004 -17.0996 -50.4004 -17.0996s-32.2002 -1.10059 -50.4004 17.0996c-18.1992 18.2002 -16.7998 33.7998 -16.7998 52.5s-1.39941 34.4004 16.7998 52.6006
c18.1006 18.1992 50.4004 17.0996 50.4004 17.0996s32.2002 1.09961 50.4004 -17.0996zM437.6 143.5v40.4004c0 8.7998 -7.2998 10.8994 -10.6992 10.8994c-3.40039 0 -10.7002 -2.2002 -10.7002 -10.8994v-40.4004c0 -3.59961 1.7998 -12.5 10.7002 -12.5
c8.89941 0 10.6992 8.90039 10.6992 12.5zM331.4 215.4c18.1992 -18.1006 16.6992 -33.8008 16.6992 -52.3008c0 -18.6992 1.5 -34.2998 -16.6992 -52.5c-18.1006 -18.1992 -50.4004 -17.0996 -50.4004 -17.0996s-32.2002 -1.09961 -50.4004 17.0996
c-18.1992 18.2002 -16.7998 33.8008 -16.7998 52.5c0 15.6006 -0.899414 29.1006 9.2998 43.7002c-16 11.7998 -58 37.4004 -99.8994 58.2998v-54.2998c8 13.7002 22.7002 22 38.5 21.9004c27.2002 0 40.5996 -18.7002 40.5996 -37.4004v-93.8994
c-20.3994 7.5 -39.7002 17.3994 -57.7002 29.5996v48.7002c0 8.09961 -1.5 15 -10.5996 15s-10.7998 -11.2998 -10.7998 -18.2002v-29.7998l-4.5 3.59961c-22.9004 18.9004 -40.2998 35.6006 -53.4004 50.2998v-31c11 -9.7998 23.6006 -20.1992 38.4004 -31.3994
c6.39941 -4.90039 12.8994 -9.40039 19.3994 -13.6006v-28.5996h-57.8994v73.7002c-86.7002 78 -61.7998 110.8 -61.7998 110.8c8.2998 18.2998 42.8994 22.2002 97.2998 0.0996094l22.5 10.6006v-20.7002c29.5996 -14.5996 63.8994 -31.5 102.1 -61.0996
c1.60059 2.09961 3.40039 4.09961 5.2998 6c18.2002 18.1992 50.4004 17.0996 50.4004 17.0996s32.2002 1.09961 50.4004 -17.0996zM65.2002 264l29.2002 13.7002c-26.9004 10.0996 -50.9004 13.5 -64.4004 2.09961c-3.7002 -3.09961 -13.5 -24.5996 35.2002 -79.0996
v63.2998zM291.7 143.5v40.4004c0 8.7998 -7.2998 10.8994 -10.7002 10.8994s-10.7002 -2.2002 -10.7002 -10.8994v-40.4004c0 -3.59961 1.7998 -12.5 10.7002 -12.5s10.7002 8.90039 10.7002 12.5z" />
    <glyph glyph-name="strava" unicode="&#xf428;" horiz-adv-x="384" 
d="M158.4 448l150.199 -292h-88.5l-61.6992 116.1l-62.2002 -116.1h-89.2002zM308.6 156h67.6006l-111.5 -220l-112.2 220h67.5996l44.6006 -88.2002z" />
    <glyph glyph-name="stripe" unicode="&#xf429;" horiz-adv-x="640" 
d="M165 303.3l0.0996094 -38.5h33.7002v-37.7998h-33.7002v-63.2002c0 -26.2002 28 -18 33.7002 -15.7002v-33.7998c-5.89941 -3.2002 -16.5996 -5.89941 -31.2002 -5.89941c-26.2998 0 -46.0996 17 -46.0996 43.2998l0.200195 142.399zM254.1 251.7
c10.4004 19.0996 31.1006 15.2002 37.1006 13.0996v-40.7998c-5.7002 1.7998 -23.4004 4.5 -33.9004 -9.2998v-103.101h-44.2998v153.2h38.4004zM346.4 324v-36.2002l-44.6006 -9.5v36.2002zM44.9004 219.7c0 -20 67.8994 -10.5 67.8994 -63.4004
c0 -32 -25.3994 -47.7998 -62.2998 -47.7998c-15.2998 0 -32 3 -48.5 10.0996v40c14.9004 -8.09961 33.9004 -14.1992 48.5996 -14.1992c9.90039 0 17 2.69922 17 10.8994c0 21.2002 -67.5 13.2002 -67.5 62.4004c0 31.3994 24 50.2002 60 50.2002
c14.7002 0 29.4004 -2.30078 44.1006 -8.10059v-41.7998c-13.5 7.2998 -30.7002 11.4004 -44.2002 11.4004c-9.2998 -0.100586 -15.0996 -2.80078 -15.0996 -9.7002zM640 186.4c0 -4.30078 -0.400391 -13.6006 -0.599609 -15.9004h-86.9004
c2 -20.7998 17.2002 -26.9004 34.5 -26.9004c17.5996 0 31.5 3.7002 43.5996 9.80078v-33.4004c-12.0996 -6.7002 -28 -11.5 -49.1992 -11.5c-43.2002 0 -73.5 24.7002 -73.5 78.2002c0 45.2002 25.6992 81.0996 67.8994 81.0996s64.2002 -35.8994 64.2002 -81.3994z
M552.1 203.2h45.9004c0 20 -11.5996 28.3994 -22.5 28.3994c-11.0996 0 -23.4004 -8.39941 -23.4004 -28.3994zM439.2 267.8c31.2002 0 60.5996 -28.0996 60.5 -79.7002c0 -56.3994 -29 -79.5996 -60.7998 -79.5996c-15.5 0 -25 6.5 -31.4004 11.2002l-0.0996094 -50.2002
l-44.4004 -9.40039v204.801h39.0996l2.30078 -11c6.19922 5.69922 17.3994 13.8994 34.7998 13.8994zM428.6 145.3c16.5 0 27.5 17.9004 27.4004 41.7998c0 23.2002 -11.2002 41.4004 -27.4004 41.4004c-10.1992 0 -16.5996 -3.7002 -21.1992 -8.7998l0.299805 -66
c4.2998 -4.60059 10.5 -8.40039 20.8994 -8.40039zM301.9 111.6v153.2h44.5996v-153.2h-44.5996z" />
    <glyph glyph-name="stripe-s" unicode="&#xf42a;" horiz-adv-x="384" 
d="M155.3 293.4c0 -64.2002 218 -33.7002 218 -203.9c0 -102.6 -81.7002 -153.6 -200.3 -153.6c-44.8916 0.101562 -114.78 14.6172 -156 32.3994v128.5c47.9004 -26 108.9 -45.5 156.1 -45.5c31.8008 0 54.7002 8.5 54.7002 34.9004c0 68.0996 -216.8 42.5 -216.8 200.399
c0 101 77.0996 161.4 192.8 161.4c47.2998 0 94.5 -7.2002 141.8 -26.0996v-134.301c-43.3994 23.4004 -98.5 36.7002 -141.899 36.7002c-29.7998 0 -48.4004 -8.59961 -48.4004 -30.8994z" />
    <glyph glyph-name="typo3" unicode="&#xf42b;" 
d="M178.7 369.6c0 -66.3994 83.3994 -264.899 140.6 -264.899c6.90039 0 11.5 0 18.5 2.2998c-49.3994 -79.5 -110.399 -139 -146.7 -139c-77.2998 0 -184.1 234 -184.1 337.5c0 16.2998 3.90039 29.4004 9.2998 37.0996c27 32.4004 106.8 57.9004 176.3 66.4004
c-8.5 -7 -13.8994 -14.7002 -13.8994 -39.4004zM301.5 416c71.7998 0 138.8 -11.5996 138.8 -52.5c0 -82.5996 -52.5 -182.3 -78.7998 -182.3c-47.9004 0 -101.7 132.1 -101.7 198.5c0 30.8994 11.6006 36.2998 41.7002 36.2998z" />
    <glyph glyph-name="amazon-pay" unicode="&#xf42c;" horiz-adv-x="640" 
d="M14 122.7c2.2998 4.2002 5.2002 4.89941 9.7002 2.5c10.3994 -5.60059 20.5996 -11.4004 31.2002 -16.7002c33.6992 -16.8047 90.7744 -37.5469 127.399 -46.2998c17.2734 -4.16797 45.5869 -9.4541 63.2002 -11.7998c22.083 -2.96875 58.0898 -5.37793 80.3721 -5.37793
c4.03809 0 10.5908 0.0800781 14.6279 0.177734c17.4004 0.399414 34.7998 1.7998 52.0996 3.7998c46.7393 5.44824 119.897 24.623 163.301 42.7998c2.89941 1.2002 5.89941 2 9.09961 1.2002c6.7002 -1.7998 9 -9 4.09961 -13.9004
c-2.47168 -2.27246 -6.77246 -5.58789 -9.59961 -7.39941c-30.7002 -21.1006 -64.2002 -36.4004 -99.5996 -47.9004c-20.3311 -6.55176 -53.9756 -14.4365 -75.1006 -17.5996c-14.6006 -2.23633 -38.4346 -4.38672 -53.2002 -4.7998
c-0.694336 -0.0419922 -1.81445 -0.176758 -2.5 -0.300781h-21.0996c-0.685547 0.124023 -1.80469 0.258789 -2.5 0.300781c-3.59961 0.199219 -7.2002 0.299805 -10.7002 0.399414c-13.9971 0.634766 -36.5762 3.00879 -50.3994 5.2998
c-22.7275 3.7041 -58.7471 13.0674 -80.4004 20.9004c-44.8652 16.1797 -110.094 55.1562 -145.6 87c-1.80078 1.59961 -3 3.7998 -4.40039 5.7002v2zM172 382.9c2.7998 0 5.5 0 8.2998 -0.100586c3.2998 -0.5 6.60059 -0.799805 9.7998 -1.5
c21.3008 -4.39941 35.4004 -17.2998 43.9004 -36.8994c6.90039 -15.9004 8.59961 -32.7002 8.09961 -49.8008c-0.399414 -15.3994 -3.2998 -30.1992 -10.2998 -44.0996c-9.2002 -18.4004 -23.3994 -30.9004 -43.7998 -34.9004c-22.5 -4.39941 -43.0996 0.5 -61 15.4004
c-0.5 0.5 -1.09961 1 -2.2002 1.90039v-72.4004c0 -1 0 -2 -0.0996094 -3c-0.299805 -3 -2.10059 -5 -5 -5c-7 -0.0996094 -14.1006 -0.0996094 -21.1006 0c-2.89941 0.0996094 -4.69922 2 -4.89941 5c-0.100586 1 -0.100586 2 -0.100586 3v209.3
c0 6.90039 1.30078 8.2002 8.2002 8.2002h11.5c4.60059 0 6.90039 -2 7.60059 -6.59961c0.5 -2.7002 0.899414 -5.5 1.2998 -8.2002c0.0439453 -0.405273 0.222656 -1.0332 0.399414 -1.40039c2.5 1.90039 4.7002 3.7002 7.10059 5.40039
c9.39941 6.90625 26.4238 13.6709 38 15.0996zM124.6 341c0.100586 -14.0996 0 -28 0 -42.0996c0 -14.1006 0.100586 -28.1006 0 -42.2002c-0.00488281 -0.0703125 -0.00878906 -0.183594 -0.00878906 -0.253906c0 -1.10547 0.765625 -2.46973 1.70898 -3.0459
c11.2002 -7.90039 23.4004 -13.3008 37.4004 -13.9004c20.2002 -0.900391 35.7998 7.2002 42.5996 28.5c3.2002 10 4 20.2002 4 30.5996c0 11.2002 -1 22.3008 -4.89941 33c-6.40039 17.5 -18.6006 24.8008 -33.5 25.9004
c-16.8008 1.2998 -31.9004 -3.7002 -45.6006 -13.2002c-0.945312 -0.556641 -1.71289 -1.90039 -1.71289 -2.99805c0 -0.0830078 0.00585938 -0.21875 0.0126953 -0.301758zM330.3 382.9c4 0 8 0 11.9004 0.0996094c3.59961 -0.5 7.2002 -0.799805 10.7998 -1.2998
c7.7002 -1.10059 15.0996 -3.10059 21.7998 -7.10059c11.6006 -6.89941 17.1006 -17.5 19 -30.3994c0.5 -3.29297 0.905273 -8.66895 0.905273 -12c0 -0.248047 -0.00195312 -0.651367 -0.00488281 -0.900391v-106
c0.00195312 -0.128906 0.00390625 -0.336914 0.00390625 -0.46582c0 -0.645508 -0.046875 -1.69141 -0.104492 -2.33398c-0.0742188 -2.57422 -2.22461 -4.67969 -4.7998 -4.7002c-5.39941 -0.0996094 -10.8994 -0.0996094 -16.2998 0
c-2.90039 0.100586 -4.7998 2.10059 -5.40039 5.2002c-0.699219 3.59961 -1.19922 7.2002 -1.7998 11c-0.481445 -0.245117 -1.19824 -0.737305 -1.59961 -1.09961c-11.7998 -9.7002 -25.2002 -16.1006 -40.2998 -18.4004c-13.1006 -2 -26 -1.2002 -37.9004 5.40039
c-12.4004 6.89941 -19.4004 17.6992 -21.4004 31.6992c-1.5 10.5 -0.799805 20.9004 3.90039 30.7002c6.09961 12.6006 16.5 20.4004 29.4004 24.9004c10.7998 3.7998 22 4.5 33.2998 3.89941c8.95312 -0.556641 23.2891 -2.75195 32 -4.89941
c0.399414 -0.100586 0.799805 0 1.2998 -0.100586c0.0898438 0.381836 0.179688 1.00879 0.200195 1.40039c-0.100586 8.2998 0 16.5996 -0.299805 24.9004c-0.200195 5.89941 -1.60059 11.5996 -5.30078 16.3994c-4.19922 5.5 -10.2998 7.40039 -16.7998 8.40039
c-12.5 1.89941 -24.8994 0.899414 -37.2002 -1.40039c-7.89941 -1.5 -15.6992 -3.7002 -23.5 -5.7002c-4.69922 -1.19922 -6.69922 0.100586 -6.7998 4.90039c-0.0996094 3.2998 0.100586 6.59961 0 9.90039c-0.0996094 3.89941 1.7002 6.5 5.2998 7.69922
c5.90039 2 11.8008 4.2002 17.9004 5.80078c7.86426 1.92188 20.8115 3.75879 28.9004 4.09961c0.899414 0.0996094 1.89941 0.299805 2.89941 0.400391zM365.3 255.2c-0.0996094 4.7002 0.100586 9.2998 0.100586 14.0996s-0.100586 9.5 0 14.2998
c0 1.60059 -0.5 2.40039 -2.10059 2.60059c-8.39941 1.09961 -16.5996 2.7002 -25 3.39941c-1.95117 0.227539 -5.12891 0.412109 -7.09375 0.412109c-4.99316 0 -12.9258 -1.16992 -17.7061 -2.61133c-8 -2.60059 -13.9004 -7.30078 -16.4004 -15.6006
c-0.779297 -2.57422 -1.41211 -6.84766 -1.41211 -9.53809c0 -2.78613 0.677734 -7.2041 1.5127 -9.86133c1.55762 -5.40918 7.11328 -11.3672 12.3994 -13.3008c5.40039 -2.19922 11.1006 -2.39941 16.8008 -1.7998c13.8994 1.40039 26.1992 6.7998 37.3994 14.9004
c0.832031 0.543945 1.50684 1.79199 1.50684 2.78613c0 0.0595703 -0.00292969 0.155273 -0.00683594 0.213867zM625.2 125.8v-17.2998c-0.700195 -3.59961 -1.2998 -7.2998 -2.10059 -10.9004c-4.39941 -20.2998 -11.8994 -39.1992 -24.6992 -55.5996
c-3.27148 -3.9209 -8.96094 -9.92383 -12.7002 -13.4004c-1.1416 -1.04102 -3.29199 -2.16113 -4.7998 -2.5c-2.90039 -0.699219 -4.60059 1.2002 -4.10059 4.10059c0.201172 0.852539 0.649414 2.19629 1 3c5.7998 14.7998 11.7002 29.7002 15.7998 45.0996
c2.10059 7.60059 3.90039 15.2998 3.5 23.2998c-0.199219 5.2002 -2.5 9 -7.59961 10.4004c-3.89746 1.15332 -10.3486 2.36328 -14.4004 2.7002c-11.3994 0.899414 -22.8994 0.200195 -34.2998 -0.900391c-7.7998 -0.799805 -15.5 -1.7002 -23.2998 -2.5
c-0.504883 -0.0576172 -1.32617 -0.103516 -1.83398 -0.103516c-0.100586 0 -0.264648 0.000976562 -0.366211 0.00390625c-1.5 -0.100586 -3.2002 0.299805 -3.59961 1.7998c-0.111328 0.383789 -0.201172 1.01855 -0.201172 1.41797
c0 0.764648 0.314453 1.92188 0.701172 2.58203c0.838867 1.1582 2.49609 2.72656 3.7002 3.5c12.0996 8.2998 25.6992 12.9004 40 15.5996c7.29883 1.34375 19.2461 2.43457 26.668 2.43457c3.46484 0 9.0791 -0.239258 12.5312 -0.53418
c5.92773 -0.371094 15.335 -2.11816 21 -3.90039c4.30078 -1.39941 8.10059 -3.2998 9.10059 -8.2998zM493.1 249c0.300781 -0.700195 0.501953 -1.2998 0.902344 -2.40039c2.59961 7.7002 5.2002 15 7.7002 22.2002l34.7998 100
c0.5 1.40039 1.09961 2.7002 1.59961 4.10059c0.932617 2.87988 4.14648 5.21777 7.17383 5.21777c0.145508 0 0.381836 -0.0078125 0.526367 -0.0185547c6.60059 0 13.2998 0.100586 19.9004 0c2.7998 0 4.09961 -1.59961 3.7002 -4.39941
c-0.277344 -1.56641 -0.994141 -4.03027 -1.60059 -5.5c-23.3662 -59.9336 -46.8994 -119.801 -70.5996 -179.601c-2.1416 -5.27734 -6.2627 -13.5205 -9.2002 -18.3994c-8.7998 -14.9004 -22.4004 -21.7998 -39.5 -21.4004c-4.70801 0.18457 -12.2793 1.08008 -16.9004 2
c-5.39941 0.900391 -7.2998 3.40039 -7.39941 8.90039c-0.100586 3.2666 -0.100586 6.56641 0 9.89941c0.0996094 3.5 1.7998 5 5.2002 4.80078c2.5 -0.200195 5 -0.800781 7.5 -1c1.30664 -0.148438 3.43359 -0.268555 4.74902 -0.268555
c2.98828 0 7.75977 0.612305 10.6504 1.36816c7.2002 1.90039 12.2002 6.7998 15.2002 13.2998c3.40039 7.2998 6 15 9.2998 22.2998c1.90039 4.2002 1.5 7.7002 -0.200195 11.8008c-19.7998 48.5 -39.5 97 -59.1006 145.5
c-0.649414 1.64453 -1.50098 4.37695 -1.90039 6.09961c-0.5 2.5 0.700195 4.5 3.2002 4.5c7.7002 0.0996094 15.2998 0 22.9004 -0.0996094c3.2002 0 5.2998 -1.90039 6.39941 -4.80078c2.10059 -5.59961 4.30078 -11.1992 6.30078 -16.8994
c12.8994 -35.7666 25.7988 -71.5 38.6982 -107.2z" />
    <glyph glyph-name="cc-amazon-pay" unicode="&#xf42d;" horiz-adv-x="576" 
d="M124.7 246.2c0.0996094 11.7998 0 23.5 0 35.2998v35.2998c0 1.2998 0.399414 2 1.39941 2.7002c11.5 8 24.1006 12.0996 38.2002 11.0996c12.5 -0.899414 22.7002 -7 28.1006 -21.6992c3.2998 -8.90039 4.09961 -18.2002 4.09961 -27.7002
c0 -8.7002 -0.700195 -17.2998 -3.40039 -25.6006c-5.69922 -17.7998 -18.6992 -24.6992 -35.6992 -23.8994c-11.7002 0.5 -21.9004 5 -31.4004 11.7002c-0.900391 0.799805 -1.40039 1.59961 -1.2998 2.7998zM279.6 231.6c-5.19922 2 -8.7998 5.7002 -10.3994 11.2002
c-1.7002 5.40039 -1.7002 10.7998 -0.100586 16.2002c2 6.90039 7 10.9004 13.7002 13.0996c6.7998 2.2002 13.7998 2.5 20.7998 1.90039c7 -0.700195 13.9004 -2 20.9004 -2.90039c1.40039 -0.199219 1.7998 -0.799805 1.7998 -2.19922c-0.0996094 -4 0 -8 0 -12
c0 -3.90039 -0.0996094 -7.90039 0 -11.8008c0 -1.19922 -0.399414 -1.89941 -1.2998 -2.5c-9.40039 -6.7998 -19.7002 -11.2998 -31.2998 -12.5c-4.7998 -0.5 -9.5 -0.299805 -14.1006 1.5zM576 368v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352
c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48zM368.5 344.1c0.400391 -1.69922 0.900391 -3.39941 1.59961 -5.09961c16.5 -40.5996 32.9004 -81.2998 49.5 -121.9c1.40039 -3.5 1.7002 -6.39941 0.200195 -9.89941
c-2.7998 -6.2002 -4.89941 -12.6006 -7.7998 -18.7002c-2.59961 -5.5 -6.7002 -9.5 -12.7002 -11.2002c-4.2002 -1.09961 -8.5 -1.2998 -12.8994 -0.899414c-2.10059 0.199219 -4.2002 0.699219 -6.30078 0.799805c-2.7998 0.200195 -4.19922 -1.10059 -4.2998 -4
c-0.0996094 -2.7998 -0.0996094 -5.60059 0 -8.2998c0.100586 -4.60059 1.60059 -6.7002 6.2002 -7.5c4.7002 -0.800781 9.40039 -1.60059 14.2002 -1.7002c14.2998 -0.299805 25.7002 5.39941 33.0996 17.8994c2.90039 4.90039 5.60059 10.1006 7.7002 15.4004
c19.7998 50.0996 39.5 100.3 59.2002 150.5c0.599609 1.5 1.09961 3 1.2998 4.59961c0.400391 2.40039 -0.700195 3.60059 -3.09961 3.7002c-5.60059 0.100586 -11.1006 0 -16.7002 0c-3.10059 0 -5.2998 -1.39941 -6.40039 -4.2998
c-0.399414 -1.09961 -0.899414 -2.2998 -1.2998 -3.40039l-29.0996 -83.6992c-2.10059 -6.10059 -4.2002 -12.1006 -6.5 -18.6006c-0.400391 0.900391 -0.600586 1.40039 -0.800781 1.90039c-10.7998 29.8994 -21.5996 59.8994 -32.3994 89.7998
c-1.7002 4.7002 -3.5 9.5 -5.2998 14.2002c-0.900391 2.5 -2.7002 4 -5.40039 4c-6.40039 0.0996094 -12.7998 0.200195 -19.2002 0.0996094c-2.2002 0 -3.2998 -1.59961 -2.7998 -3.7002zM242.4 242c1.69922 -11.7002 7.59961 -20.7998 18 -26.5996
c9.89941 -5.5 20.6992 -6.2002 31.6992 -4.60059c12.7002 1.90039 23.9004 7.2998 33.8008 15.5c0.399414 0.299805 0.799805 0.600586 1.39941 1c0.5 -3.2002 0.900391 -6.2002 1.5 -9.2002c0.5 -2.59961 2.10059 -4.2998 4.5 -4.39941
c4.60059 -0.100586 9.10059 -0.100586 13.7002 0c2.2998 0.0996094 3.7998 1.59961 4 3.89941c0.0996094 0.800781 0.0996094 1.60059 0.0996094 2.30078v88.7998c0 3.59961 -0.199219 7.2002 -0.699219 10.7998c-1.60059 10.7998 -6.2002 19.7002 -15.9004 25.4004
c-5.59961 3.2998 -11.7998 5 -18.2002 5.89941c-3 0.400391 -6 0.700195 -9.09961 1.10059h-10c-0.799805 -0.100586 -1.60059 -0.300781 -2.5 -0.300781c-8.2002 -0.399414 -16.2998 -1.39941 -24.2002 -3.5c-5.09961 -1.2998 -10 -3.19922 -15 -4.89941
c-3 -1 -4.5 -3.2002 -4.40039 -6.5c0.100586 -2.7998 -0.0996094 -5.60059 0 -8.2998c0.100586 -4.10059 1.80078 -5.2002 5.7002 -4.10059c6.5 1.7002 13.1006 3.5 19.7002 4.7998c10.2998 1.90039 20.7002 2.7002 31.0996 1.2002
c5.40039 -0.799805 10.5 -2.39941 14.1006 -7c3.09961 -4 4.2002 -8.7998 4.39941 -13.7002c0.300781 -6.89941 0.200195 -13.8994 0.300781 -20.7998c0 -0.399414 -0.100586 -0.700195 -0.200195 -1.2002c-0.400391 0 -0.799805 0 -1.10059 0.100586
c-8.7998 2.09961 -17.6992 3.59961 -26.7998 4.09961c-9.5 0.5 -18.8994 -0.0996094 -27.8994 -3.2002c-10.8008 -3.7998 -19.5 -10.2998 -24.6006 -20.7998c-4.09961 -8.2998 -4.59961 -17 -3.39941 -25.7998zM98.7002 341.1v-175.3c0 -0.799805 0 -1.7002 0.0996094 -2.5
c0.200195 -2.5 1.7002 -4.09961 4.10059 -4.2002c5.89941 -0.0996094 11.7998 -0.0996094 17.6992 0c2.5 0 4 1.7002 4.10059 4.10059c0.0996094 0.799805 0.0996094 1.7002 0.0996094 2.5v60.7002c0.900391 -0.700195 1.40039 -1.2002 1.90039 -1.60059
c15 -12.5 32.2002 -16.5996 51.0996 -12.8994c17.1006 3.39941 28.9004 13.8994 36.7002 29.1992c5.7998 11.6006 8.2998 24.1006 8.7002 37c0.5 14.3008 -1 28.4004 -6.7998 41.7002c-7.10059 16.4004 -18.9004 27.2998 -36.7002 30.9004
c-2.7002 0.599609 -5.5 0.799805 -8.2002 1.2002h-7c-1.2002 -0.200195 -2.40039 -0.300781 -3.59961 -0.5c-11.7002 -1.40039 -22.3008 -5.80078 -31.8008 -12.7002c-2 -1.40039 -3.89941 -3 -5.89941 -4.5c-0.100586 0.5 -0.299805 0.799805 -0.400391 1.2002
c-0.399414 2.2998 -0.700195 4.59961 -1.09961 6.89941c-0.600586 3.90039 -2.5 5.5 -6.40039 5.60059h-9.7002c-5.89941 0.0996094 -6.89941 -1 -6.89941 -6.80078zM493.6 109c-2.69922 0.700195 -5.09961 0 -7.59961 -1c-43.9004 -18.4004 -89.5 -30.2002 -136.8 -35.7998
c-14.5 -1.7002 -29.1006 -2.7998 -43.7002 -3.2002c-26.5996 -0.700195 -53.2002 0.799805 -79.5996 4.2998c-17.8008 2.40039 -35.5 5.7002 -53 9.90039c-37 8.89941 -72.7002 21.7002 -106.7 38.7998c-8.7998 4.40039 -17.4004 9.2998 -26.1006 14
c-3.7998 2.09961 -6.19922 1.5 -8.19922 -2.09961v-1.7002c1.19922 -1.60059 2.19922 -3.40039 3.69922 -4.7998c36 -32.2002 76.6006 -56.5 122 -72.9004c21.9004 -7.90039 44.4004 -13.7002 67.3008 -17.5c14 -2.2998 28 -3.7998 42.1992 -4.5
c3 -0.0996094 6 -0.200195 9 -0.400391c0.700195 0 1.40039 -0.199219 2.10059 -0.299805h17.7002c0.699219 0.100586 1.39941 0.299805 2.09961 0.299805c14.9004 0.400391 29.7998 1.80078 44.5996 4c21.4004 3.2002 42.4004 8.10059 62.9004 14.7002
c29.5996 9.60059 57.7002 22.4004 83.4004 40.1006c2.7998 1.89941 5.69922 3.7998 8 6.19922c4.2998 4.40039 2.2998 10.4004 -3.30078 11.9004zM544 136.7c-0.799805 4.2002 -4 5.7998 -7.59961 7c-5.7002 1.89941 -11.6006 2.7998 -17.6006 3.2998
c-11 0.900391 -22 0.400391 -32.7998 -1.59961c-12 -2.2002 -23.4004 -6.10059 -33.5 -13.1006c-1.2002 -0.799805 -2.40039 -1.7998 -3.09961 -3c-0.600586 -0.899414 -0.700195 -2.2998 -0.5 -3.39941c0.299805 -1.30078 1.69922 -1.60059 3 -1.5
c0.599609 0 1.19922 0 1.7998 0.0996094l19.5 2.09961c9.59961 0.900391 19.2002 1.5 28.7998 0.800781c4.09961 -0.300781 8.09961 -1.2002 12 -2.2002c4.2998 -1.10059 6.2002 -4.40039 6.40039 -8.7002c0.299805 -6.7002 -1.2002 -13.0996 -2.90039 -19.5
c-3.5 -12.9004 -8.2998 -25.4004 -13.2998 -37.7998c-0.299805 -0.799805 -0.700195 -1.7002 -0.799805 -2.5c-0.400391 -2.5 1 -4 3.39941 -3.5c1.40039 0.299805 3 1.09961 4 2.09961c3.7002 3.60059 7.5 7.2002 10.6006 11.2002
c10.6992 13.7998 17 29.5996 20.6992 46.5996c0.700195 3 1.2002 6.10059 1.7002 9.10059c0.200195 4.7002 0.200195 9.59961 0.200195 14.5z" />
    <glyph glyph-name="ethereum" unicode="&#xf42e;" horiz-adv-x="320" 
d="M311.9 187.2l-151.9 -92.7998l-152 92.7998l152 260.8zM160 64.5996l152 92.8008l-152 -221.4l-152 221.4z" />
    <glyph glyph-name="korvue" unicode="&#xf42f;" horiz-adv-x="446" 
d="M386.5 414c32.7002 0 59.5 -26.7998 59.5996 -59.5v-327c0 -32.7002 -26.5 -59.5 -59.5 -59.5h-327.1c-32.7002 0 -59.5 26.7998 -59.5 59.4004v327.1c0 32.7002 26.7998 59.5 59.5 59.5h327zM87.0996 327.2v-132h187.5l81.2002 132h-110.899l-61.8008 -116v116h-96z
M248.9 55.0996h118.399l-88.5996 130.801h-191.5v-130.801h96v113.601z" />
    <glyph glyph-name="elementor" unicode="&#xf430;" 
d="M425.6 416c12.4004 0 22.4004 -10 22.4004 -22.4004v-403.199c0 -12.4004 -10 -22.4004 -22.4004 -22.4004h-403.199c-12.4004 0 -22.4004 10 -22.4004 22.4004v403.199c0 12.4004 10 22.4004 22.4004 22.4004h403.199zM164.3 92.5v199h-39.7998v-199h39.7998z
M323.6 92.5v39.7998h-119.5v-39.7998h119.5zM323.6 172.1v39.8008h-119.5v-39.8008h119.5zM323.6 251.8v39.7998h-119.5v-39.7998h119.5z" />
    <glyph glyph-name="youtube-square" unicode="&#xf431;" 
d="M186.8 245.9l95.2002 -54.1006l-95.2002 -54.0996v108.2zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM406 191.7c0 0 0 59.5996 -7.59961 88.2002
c-4.2002 15.7998 -16.5 28.1992 -32.2002 32.3994c-28.2998 7.7002 -142.2 7.7002 -142.2 7.7002s-113.9 0 -142.2 -7.7002c-15.7002 -4.2002 -28 -16.5996 -32.2002 -32.3994c-7.59961 -28.5 -7.59961 -88.2002 -7.59961 -88.2002s0 -59.6006 7.59961 -88.2002
c4.2002 -15.7998 16.5 -27.7002 32.2002 -31.9004c28.2998 -7.59961 142.2 -7.59961 142.2 -7.59961s113.9 0 142.2 7.7002c15.7002 4.2002 28 16.0996 32.2002 31.8994c7.59961 28.5 7.59961 88.1006 7.59961 88.1006z" />
    <glyph glyph-name="flipboard" unicode="&#xf44d;" 
d="M0 416h448v-448h-448v448zM358.4 236.8v89.6006h-268.801v-268.801h89.6006v89.6006h89.5996v89.5996h89.6006z" />
    <glyph glyph-name="hips" unicode="&#xf452;" horiz-adv-x="640" 
d="M251.6 290.4v-201.801c0 -1.89941 -0.899414 -2.7998 -2.7998 -2.7998h-40.8994c-1.60059 0 -2.7002 1.40039 -2.7002 2.7998v201.801c0 1.39941 1.09961 2.7998 2.7002 2.7998h40.8994c1.90039 0 2.7998 -0.900391 2.7998 -2.7998zM156.5 280
c18.7002 -13.5 28 -31.9004 28 -55.2998v-136.101c0 -1.89941 -0.900391 -2.7998 -2.7002 -2.7998h-27.2998c-9.09961 0 -16.4004 7.2998 -16.4004 16.2998v122.601c0 0.899414 2.7002 27 -45.7998 27c-48.5996 0 -45.7998 -26.2002 -45.7998 -27v-136.101
c0 -1.89941 -0.900391 -2.7998 -2.7998 -2.7998h-41c-1.7998 0 -2.7002 0.900391 -2.7002 2.7998v279.2c0 1.7998 0.900391 2.7002 2.7002 2.7002h40.8994c1.90039 0 2.80078 -0.900391 2.80078 -2.7002v-81.2002c15.1992 7.7002 31.6992 11.5 49.7998 11.4004
c24 -0.0996094 44.2002 -6.2002 60.2998 -18zM634.9 169.9c5.5 -12.6006 6.59961 -25.6006 3.09961 -39.1006c-9.59961 -36.8994 -44.9004 -45.5 -45.5996 -45.7998c-10.5 -3.09961 -23.6006 -4.2998 -36.3008 -4.2998c-16.5996 0 -32.5996 2.7002 -48.1992 8.2002
c-9.7002 3.39941 -14.6006 10.2998 -14.6006 20.6992v34.4004c0 2.09961 2.2998 3.7002 4.40039 2.2998c13.7002 -10.2002 34.0996 -19.0996 58.3994 -19.0996c23.3008 0 32.8008 4.5 36.5 13.5996c3 7.90039 -0.599609 16.1006 -12.1992 21.2002l-53.6006 23.5
c-21.3994 9.40039 -33.7998 24 -37.2002 43.5996c-5.69922 33.7002 22.2002 53.3008 22.7002 53.7002c13.2002 9.60059 32 15.4004 58.5 15.4004c19 0 37.4004 -3.2998 55.1006 -9.90039c1.2998 -0.5 1.89941 -1.2998 1.89941 -2.59961v-44.7002
c0 -2.09961 -2.2998 -3.40039 -4 -2.40039c-39.7002 20.7002 -76.5996 12.3008 -84 6.80078c-6.59961 -4.90039 -6 -12.5 2.60059 -16.1006l57.5996 -25.2998c16.5 -7.09961 28.0996 -18.4004 34.9004 -34.0996zM376.2 298.2c60.3994 0 108.7 -48.2998 108.6 -108.601
c0 -60.1992 -48.2002 -108.699 -108.7 -108.699c-21.8994 0 -41.1992 6.39941 -57.6992 19.0996v-88.7998c0 -1.7998 -0.900391 -2.7002 -2.80078 -2.7002h-40.8994c-2.10059 0 -2.7002 1.90039 -2.7002 2.7002v183.5c0 83.3994 72.5 103.5 104.2 103.5zM376.2 127.3
c34.8994 0 62.2998 27.9004 62.2002 62.2002c0 34.5996 -27.7002 62.2002 -62.2002 62.2002c-34.6006 0 -62.2002 -27.7002 -62.2002 -62.2002c0 -17.2002 6 -31.7998 18.2002 -44c12.0996 -12.0996 26.7998 -18.2002 44 -18.2002zM228.3 375.5
c15.9004 0 28.9004 -12.7002 28.9004 -28.9004c0 -15.7998 -12.7002 -28.8994 -28.9004 -28.8994s-28.8994 13.2998 -28.8994 28.8994c0.0996094 16 13 28.9004 28.8994 28.9004z" />
    <glyph glyph-name="php" unicode="&#xf457;" horiz-adv-x="640" 
d="M320 343.5c-171.3 0 -303.2 -72.2002 -303.2 -151.5s131.8 -151.5 303.2 -151.5c171.3 0 303.2 72.2002 303.2 151.5s-131.8 151.5 -303.2 151.5zM320 360.3c176.7 0 320 -75.2998 320 -168.3s-143.3 -168.3 -320 -168.3s-320 75.2998 -320 168.3s143.3 168.3 320 168.3z
M218.2 205.5c7.39941 38.4004 -18.4004 34.2998 -56.4004 34.2998l-13.7002 -70.5996c34.3008 0 62.2002 -4.2002 70.1006 36.2998zM97.4004 97.7002l32.6992 168.7h70.7002c21.2002 0 36.7998 -5.5 46.5 -16.7002c18.6006 -21.4004 11.7998 -64.1006 -14.2998 -88.1006
c-23.5996 -22.0996 -49.0996 -19.0996 -90.2002 -19.0996l-8.7002 -44.7998h-36.6992zM283.1 311.3h36.5l-8.69922 -44.7998c31.5 0 60.6992 2.2998 74.7998 -10.7002c14.7998 -13.5996 7.7002 -31 -8.2998 -113.1h-37c15.3994 79.3994 18.2998 86 12.6992 92
c-5.39941 5.7998 -17.6992 4.59961 -47.3994 4.59961l-18.7998 -96.5996h-36.5zM505 205.5c7.40039 38.4004 -18.2002 34.2998 -56.4004 34.2998l-13.6992 -70.5996c33.3994 0 62.0996 -4.7998 70.0996 36.2998zM384.2 97.7002l32.7998 168.7h70.7002
c21.2002 0 36.7998 -5.5 46.5 -16.7002c18.5996 -21.4004 11.7998 -64.1006 -14.2998 -88.1006c-23.1006 -21.5996 -47 -19.0996 -90.2002 -19.0996l-8.7002 -44.7998h-36.7998z" />
    <glyph glyph-name="quinscape" unicode="&#xf459;" horiz-adv-x="512" 
d="M313.6 -26.5996c4.40039 -4.40039 8.10059 -9 13.3008 -12.5c-18.5029 -5.58008 -49.2031 -10.1074 -68.5283 -10.1074c-0.516602 0 -1.35547 0.00292969 -1.87207 0.00683594c-135 0 -244.5 109.5 -244.5 244.601c0 135.1 109.4 244.6 244.5 244.6
s244.6 -109.5 244.6 -244.6c0 -35.3008 -6.89941 -67.4004 -20.2998 -97.7002c-3 5.7002 -7.2002 10.2002 -11.2002 15.2998c11.2002 93.5 -62.0996 176.6 -157 176.6c-87.2705 0 -158.1 -70.8281 -158.1 -158.1s70.8291 -158.1 158.1 -158.1h1zM313.5 -26.5
l0.400391 -0.0996094zM391.9 142.4c54.7471 0 99.1992 -44.4326 99.1992 -99.1807v-0.0195312c0 -54.7588 -44.4414 -99.2002 -99.1992 -99.2002c-54.7588 0 -99.2002 44.4414 -99.2002 99.2002c0 54.7578 44.4414 99.2002 99.2002 99.2002z" />
    <glyph glyph-name="readme" unicode="&#xf4d5;" horiz-adv-x="576" 
d="M528.3 401.5c26.4004 -0.200195 47.7002 -21.7002 47.7002 -48.0996v-245.7c0 -26.5 -21.5 -48 -48 -48h-89.7002c-102.1 0 -132.6 -24.4004 -147.3 -75c-0.799805 -2.7998 -5.2998 -2.7998 -6 0c-14.5996 50.5996 -45.0996 75 -147.3 75h-89.7002
c-26.5 0 -48 21.5 -48 48v245.8c0 26.5 21.5 48 48 48h139.7c48.0996 0 89.7998 -33.2998 100.399 -80.2998c10.5 47 52.3008 80.2998 100.4 80.2998h139.8zM242 136.1h0.0996094v22.9004c0 2 -1.59961 3.5 -3.5 3.5h-160.399c-2 0 -3.5 -1.59961 -3.5 -3.5v-22.9004
c0 -2 1.59961 -3.5 3.5 -3.5h160.3c2 0 3.5 1.60059 3.5 3.5zM242 197h0.0996094v22.9004c0 2 -1.59961 3.5 -3.5 3.5h-160.399c-2 0 -3.5 -1.60059 -3.5 -3.5v-22.9004c0 -2 1.59961 -3.5 3.5 -3.5h160.3c2 0 3.5 1.59961 3.5 3.5zM242 257.9h0.0996094v22.8994
c0 2 -1.59961 3.5 -3.5 3.5h-160.399c-2 0 -3.5 -1.59961 -3.5 -3.5v-22.8994c0 -2 1.59961 -3.5 3.5 -3.5h160.3c2 0 3.5 1.59961 3.5 3.5zM501.3 136.2h0.100586v22.8994c0 2 -1.60059 3.5 -3.5 3.5h-160.4c-2 0 -3.5 -1.59961 -3.5 -3.5v-22.8994
c0 -2 1.59961 -3.5 3.5 -3.5h160.3c2 0 3.5 1.59961 3.5 3.5zM501.3 197.1h0.100586v22.9004c0 2 -1.60059 3.5 -3.5 3.5h-160.4c-2 0 -3.5 -1.59961 -3.5 -3.5v-22.9004c0 -2 1.59961 -3.5 3.5 -3.5h160.3c2 0 3.5 1.60059 3.5 3.5zM501.3 258h0.100586v22.7998
c0 2 -1.60059 3.5 -3.5 3.5h-160.4c-2 0 -3.5 -1.59961 -3.5 -3.5v-22.7998c0 -2 1.59961 -3.5 3.5 -3.5h160.3c2 0 3.5 1.59961 3.5 3.5z" />
    <glyph glyph-name="java" unicode="&#xf4e4;" horiz-adv-x="384" 
d="M277.74 135.1c-94.5 -24.8994 -277 -13.2998 -224.5 12.1006c44.5 21.3994 80.5996 19 80.5996 19s-93.0996 -22.1006 -33 -30.1006c25.4004 -3.39941 76 -2.59961 123.101 1.30078c38.5 3.19922 77.1992 10.1992 77.1992 10.1992s-13.5996 -5.7998 -23.3994 -12.5z
M192.34 167.2c-48.5 43.7998 -84.0996 82.2998 -60.2002 118.2c35.1006 52.5 132.2 78.0996 110.7 162.6c0 0 53.1602 -53.2002 -50.5 -135c-83.0996 -65.5996 -19 -103.1 0 -145.8zM306.94 343.4c-111.601 -64.7002 -91 -83.5 -64.1006 -121.301
c28.7998 -40.5 -33.8994 -72.8994 -33.8994 -72.8994s31.1992 25.5996 6.5 54c-83.7002 96.3994 91.5996 140.2 91.5 140.2zM300.84 72.9004c96.1006 49.8994 51.6006 97.8994 20.6006 91.3994c-3.10352 -0.581055 -8.03125 -1.92578 -11 -3
c1.71973 2.44629 5.39258 5.26855 8.19922 6.2998c61.3008 21.6006 108.5 -63.5996 -19.7998 -97.2998c0.649414 0.642578 1.5459 1.80762 2 2.60059zM348 10.5996c53 -23.8994 -115.16 -72 -319.4 -38.7998c-74.8994 12.1006 36.1006 54.5 56.4004 40.2002
c0 0 -6.5 0.400391 -17.7002 -2c-10.7998 -2.2998 -45.0996 -13.4004 -26.7998 -21.2998c50.7998 -22.1006 233.7 -16.7998 291.6 0.700195c30.4004 9.2998 15.9004 21.1992 15.9004 21.1992zM124.44 52c0 0 -19.6006 -11.4004 13.8994 -15.2002
c40.6006 -4.59961 61.2998 -4 106 4.5c7.46094 -4.46777 20.0938 -10.6504 28.2002 -13.7998c-100.2 -42.9004 -226.8 2.5 -148.1 24.5zM304.24 -45.2002c69.7998 13.2002 76.2002 29.7002 76.2002 29.7002c-3.30078 -43.5996 -144.9 -52.7998 -237.101 -46.9004
c-60.5996 3.90039 -72.3994 13.7002 -72.3994 13.6006c57.5 -9.5 154.6 -11.2002 233.3 3.59961zM260.64 95c5.08594 -4.74902 14.5391 -10.4834 21.1006 -12.7998c-121.3 -35.5 -256.3 -2.90039 -169.5 25.8994c0 0 -21.9004 -16.1992 11.5996 -19.6992
c43.2998 -4.5 77.6006 -4.80078 136.8 6.59961z" />
    <glyph glyph-name="pied-piper-hat" unicode="&#xf4e5;" horiz-adv-x="640" 
d="M640 423.1c-80.7998 -53.5996 -89.4004 -92.5 -96.4004 -104.399c-6.69922 -12.2002 -11.6992 -60.2998 -23.2998 -83.6006c-11.7002 -23.5996 -54.2002 -42.1992 -66.0996 -50c-11.7002 -7.7998 -28.2998 -38.0996 -41.9004 -64.1992
c-108.1 4.39941 -167.399 -38.8008 -259.2 -93.6006c29.4004 9.7002 43.3008 16.7002 43.3008 16.7002c94.1992 36 139.3 68.2998 281.1 49.2002c1.09961 0 1.90039 -0.600586 2.7998 -0.799805c3.90039 -2.2002 5.2998 -6.90039 3.10059 -10.8008l-53.9004 -95.7998
c-2.5 -4.7002 -7.7998 -7.2002 -13.0996 -6.09961c-126.801 23.7998 -226.9 -17.2998 -318.9 -18.6006c-73.4004 -1.09961 -97.5 33.5 -97.5 35.1006c0 1.09961 0.599609 1.7002 1.7002 1.7002c0 0 38.2998 0 103.1 15.2998c73.6006 140.3 139.2 189.399 210.601 189.399
c0 0 71.6992 0 90.5996 -61.8994c22.7998 39.7002 28.2998 49.2002 28.2998 49.2002c5.2998 9.39941 35 77.1992 86.4004 141.399c51.5 64 90.3994 79.9004 119.3 91.7998z" />
    <glyph glyph-name="creative-commons-by" unicode="&#xf4e7;" horiz-adv-x="496" 
d="M314.9 253.6v-101.399h-28.3008v-120.5h-77.0996v120.399h-28.2998v101.5c0 4.40039 1.59961 8.2002 4.59961 11.3008c3.10059 3.09961 6.90039 4.69922 11.2998 4.69922h101.9c4.09961 0 7.7998 -1.59961 11.0996 -4.69922
c3.10059 -3.2002 4.80078 -6.90039 4.80078 -11.3008zM213.4 317.3c0 23.2998 11.5 35 34.5 35s34.5 -11.7002 34.5 -35c0 -23 -11.5 -34.5 -34.5 -34.5s-34.5 11.5 -34.5 34.5zM247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248
c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 395.3c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3z" />
    <glyph glyph-name="creative-commons-nc" unicode="&#xf4e8;" horiz-adv-x="496" 
d="M247.6 440c139.801 0 248.4 -107.9 248.4 -248c0 -147.2 -118.5 -248 -248.4 -248c-134.5 0 -247.6 110.8 -247.6 248c0 132.9 104.7 248 247.6 248zM55.7998 258.9c-7.39941 -20.4004 -11.0996 -42.7002 -11.0996 -66.9004c0 -110.9 92.0996 -202.4 203.7 -202.4
c122.399 0 177.199 101.801 178.5 104.101l-93.4004 41.5996c-7.7002 -37.0996 -41.2002 -53 -68.2002 -55.3994v-38.1006h-28.7998v38.2002c-27.5 0.299805 -52.5996 10.2002 -75.2998 29.7002l34.0996 34.5c31.7002 -29.4004 86.4004 -31.7998 86.4004 2.2002
c0 6.19922 -2.2002 11.1992 -6.60059 15.0996c-14.1992 6 -1.7998 0.0996094 -219.3 97.4004zM248.4 395.7c-38.4004 0 -112.4 -8.7002 -170.5 -93l94.7998 -42.5c10 31.2998 40.3994 42.8994 63.7998 44.2998v38.0996h28.7998v-38.0996
c22.7002 -1.2002 43.4004 -8.90039 62 -23l-32.2998 -33.2002c-42.7002 29.9004 -83.5 8 -70 -11.0996c53.4004 -24.1006 43.7998 -19.7998 93 -41.6006l127.1 -56.6992c4.10059 17.3994 6.2002 35.0996 6.2002 53.0996c0 57 -19.7998 105 -59.2998 143.9
c-39.2998 39.8994 -87.2002 59.7998 -143.6 59.7998z" />
    <glyph glyph-name="creative-commons-nc-eu" unicode="&#xf4e9;" horiz-adv-x="496" 
d="M247.7 440c140.7 0 248.3 -109 248.3 -248c0 -147.1 -118.1 -248 -248.3 -248c-136 0 -247.7 111.7 -247.7 248c0 131.2 103.6 248 247.7 248zM248.3 -10.7002c122.601 0 177.3 102.2 178.8 104.3l-128.3 56.8008h-90.2998
c9.2002 -39.3008 39.0996 -50.2002 67.2998 -50.2002c19.1006 0 38.6006 6.2002 47.2998 10.7998l10 -46.0996c-14.1992 -7.90039 -38.1992 -15.8008 -64.7998 -15.8008c-57.3994 0 -113.2 34.3008 -124.6 101.301h-27v29.5h22.7998
c0 16.2998 0.400391 13.2998 0.400391 19.5h-23.3008v29.5h4.7002l-65.7002 29.0996c-7.19922 -20.7998 -10.8994 -42.7998 -10.8994 -66c0 -110.2 91.5996 -202.7 203.6 -202.7zM231.6 179.9l-0.5 0.399414l0.900391 -0.399414h-0.400391zM308.8 199.4l136.101 -60.5
c4.19922 16.5996 6.2998 34.1992 6.2998 52.8994c0 113.2 -90 203.4 -203 203.4c-13 0 -106.101 3.2002 -170.7 -93.6006l81.5996 -36.0996c4.10059 7.2002 8.60059 14 13.9004 20.0996c23.7002 26.5 56.9004 42.3008 95.9004 42.3008
c25.2998 0 47.2998 -5.80078 62.2998 -12.4004l-11.6006 -47.2998c-10.7998 4.59961 -27.7998 10 -46.0996 10c-20 0 -38.2002 -6.60059 -51.0996 -22.4004c-3.40039 -3.7998 -6.30078 -8.7998 -8.80078 -14.2998l28.6006 -12.5996h70.2998v-29.5h-3.7002z" />
    <glyph glyph-name="creative-commons-nc-jp" unicode="&#xf4ea;" horiz-adv-x="496" 
d="M247.7 440c140.8 0 248.3 -109.2 248.3 -248c0 -147.2 -118.1 -248 -248.3 -248c-135.9 0 -247.7 111.6 -247.7 248c0 131.2 103.6 248 247.7 248zM248.3 -10.7002c118.101 0 173.7 96.1006 175.2 98.2998l-81 36.1006v-35.7002h-64.2002v-56h-61.7002v56h-63.7998
v38.7002h63.7998v18.7002l-5.69922 11.7998h-58.1006v38.5996h27.9004l-127 56.5c-6 -19.0996 -9 -39.2002 -9 -60.2998c0 -110.2 91.5996 -202.7 203.6 -202.7zM335.9 126.6l-54.7002 24.3008l-2.90039 -5.60059v-18.7002h57.6006zM342.4 178l101 -45.0996
c5.19922 18.3994 7.89941 38 7.89941 59c0 113.399 -90.2002 203.399 -203 203.399c-91.0996 0 -145.899 -54 -173.7 -98.0996l81.9004 -36.5l-27.2998 51h65.7998l39.5996 -85.7002l23 -10.2002l43.4004 96h65.7998l-63 -116h38.6006v-17.7998z" />
    <glyph glyph-name="creative-commons-nd" unicode="&#xf4eb;" horiz-adv-x="496" 
d="M247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 395.3c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8
c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3zM342.4 251v-42.5h-180.301v42.5h180.301zM342.4 171.2v-42.5h-180.301v42.5h180.301z" />
    <glyph glyph-name="creative-commons-pd" unicode="&#xf4ec;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111.1 248 -248c0 -137 -111 -248 -248 -248s-248 111 -248 248c0 136.9 111 248 248 248zM248 -9.5c76.0996 0 142.4 42.4004 176.7 104.8c-1.40039 0.299805 12.5 -5.7998 -217.9 96.7998c0.200195 -32 16.1006 -71.8994 53.9004 -71.8994
c18.7002 0 30.7998 10.3994 36.2998 16.7002l36.0996 -43.9004c-25.8994 -22.7998 -56.5 -29.5 -79.3994 -29.5c-46.5 0 -120.4 27.9004 -120.4 126.9c0 11.3994 1.2002 22.3994 3.2998 32.8994l-78.7998 35.1006c-45.5996 -129.9 51 -267.9 190.2 -267.9zM442.2 140.5
c0.200195 -0.200195 0.299805 -0.299805 0.599609 -0.400391c4.40039 16.6006 6.7998 34 6.7998 52c0 111.101 -90.3994 201.5 -201.5 201.5c-70.3994 0 -132.399 -36.2998 -168.5 -91.1992l74.9004 -33.4004c19.7998 31.0996 53.2998 51.5996 100.7 51.5996
c20.0996 0 51 -4.19922 78.0996 -27.5l-40.3994 -41.5996c-19.8008 19.7002 -55.9004 23 -74.7002 -11z" />
    <glyph glyph-name="creative-commons-pd-alt" unicode="&#xf4ed;" horiz-adv-x="496" 
d="M247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 -10.7998c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3
c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8zM316.7 262c21.3994 0 70 -5.2002 70 -68.5996c0 -63.5 -48.6006 -68.6006 -70 -68.6006h-53.2002v137.2h53.2002zM317.5 153.5c24 0 34.5 15.2998 34.5 39.9004
c0 42 -31.2002 39.8994 -35 39.8994l-19.4004 -0.0996094v-79.7002h19.9004zM203.7 262c33.7002 0 50.5 -15.5 50.5 -46.5c0 -9 -3 -46.5 -57.1006 -46.5h-27v-44.2998h-34.5996v137.3h68.2002zM198.8 194.7c27.9004 0 30 41.5996 -0.899414 41.5996h-28.3008v-41.5996
h29.2002z" />
    <glyph glyph-name="creative-commons-remix" unicode="&#xf4ee;" horiz-adv-x="496" 
d="M247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 395.3c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8
c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3zM410.1 187.6l4.90039 -2.19922v-70c-7.2002 -3.60059 -63.4004 -27.5 -67.2998 -28.8008c-6.5 1.80078 -113.7 46.8008 -137.3 56.2002l-64.2002 -26.5996l-63.2998 27.5v63.7998
l59.2998 24.7998c-0.700195 0.700195 -0.400391 -5 -0.400391 70.4004l67.2998 29.7002l151.9 -62.9004v-61.5996zM339.7 106.1v43.8008h-0.400391v1.7998l-113.8 46.5v-45.2002l113.8 -46.9004v0.400391zM347.2 163.7l39.8994 16.3994l-36.7998 15.5l-39 -16.3994z
M399.5 125.6v43l-44.2998 -18.5996v-43.4004z" />
    <glyph glyph-name="creative-commons-sa" unicode="&#xf4ef;" horiz-adv-x="496" 
d="M247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 395.3c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8
c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3zM137.7 227c13 83.9004 80.5 95.7002 108.899 95.7002c99.8008 0 127.5 -82.5 127.5 -134.2c0 -63.5996 -41 -132.9 -128.899 -132.9c-38.9004 0 -99.1006 20 -109.4 97h62.5
c1.5 -30.0996 19.6006 -45.1992 54.5 -45.1992c23.2998 0 58 18.1992 58 82.7998c0 82.5 -49.0996 80.5996 -56.7002 80.5996c-33.0996 0 -51.6992 -14.5996 -55.7998 -43.7998h18.2002l-49.2002 -49.2002l-49 49.2002h19.4004z" />
    <glyph glyph-name="creative-commons-sampling" unicode="&#xf4f0;" horiz-adv-x="496" 
d="M247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 395.3c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8
c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3zM252 342.1c2.7998 0.300781 11.5 -1 11.5 -11.5l6.59961 -107.199l4.90039 59.2998c0 6 4.7002 10.5996 10.5996 10.5996c5.90039 0 10.6006 -4.7002 10.6006 -10.5996
c0 -2.5 -0.5 5.7002 5.7002 -81.5l5.7998 64.2002c0.299805 2.89941 2.89941 9.2998 10.2002 9.2998c3.7998 0 9.89941 -2.2998 10.5996 -8.90039l11.5 -96.5l5.2998 12.7998c1.7998 4.40039 5.2002 6.60059 10.2002 6.60059h58v-21.2998h-50.9004l-18.1992 -44.3008
c-3.90039 -9.89941 -19.5 -9.09961 -20.8008 3.10059l-4 31.8994l-7.5 -92.5996c-0.299805 -3 -3 -9.2998 -10.1992 -9.2998c-3 0 -9.80078 2.09961 -10.6006 9.2998c0 1.90039 0.600586 -5.7998 -6.2002 77.9004l-5.2998 -72.2002
c-1.09961 -4.7998 -4.7998 -9.2998 -10.5996 -9.2998c-2.90039 0 -9.7998 2 -10.6006 9.2998c0 1.89941 0.5 -6.7002 -5.7998 87.7002l-5.7998 -94.8008c0 -6.2998 -3.59961 -12.3994 -10.5996 -12.3994c-5.2002 0 -10.6006 4.09961 -10.6006 12l-5.7998 87.7002
c-5.7998 -92.5 -5.2998 -84 -5.2998 -85.9004c-1.10059 -4.7998 -4.7998 -9.2998 -10.6006 -9.2998c-3 0 -9.7998 2.09961 -10.5996 9.2998c0 0.700195 -0.400391 1.09961 -0.400391 2.59961l-6.19922 88.6006l-4.90039 -56.7002
c-0.700195 -6.5 -6.7002 -9.2998 -10.5996 -9.2998c-5.80078 0 -9.60059 4.09961 -10.6006 8.89941l-11.0996 76.4004c-2 -4 -3.5 -8.40039 -11.1006 -8.40039h-51.3994v21.3008h44.7998l13.7002 27.8994c4.39941 9.90039 18.2002 7.2002 19.8994 -2.7002l3.10059 -20.3994
l8.39941 97.8994c0 6 4.80078 10.6006 10.6006 10.6006c0.5 0 10.5996 0.200195 10.5996 -12.4004l4.90039 -69.0996l6.59961 92.5996c0 10.1006 9.5 10.6006 10.2002 10.6006c0.599609 0 10.5996 -0.700195 10.5996 -10.6006l5.30078 -80.5996l6.19922 97.8994
c0.100586 1.10059 -0.599609 10.3008 9.90039 11.5z" />
    <glyph glyph-name="creative-commons-sampling-plus" unicode="&#xf4f1;" horiz-adv-x="496" 
d="M247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 395.3c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8
c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3zM355.4 189.7l58.3994 0.299805v-23.2002h-50.5l-18 -43.3994c-4.59961 -11 -20.8994 -8.7002 -22.2998 3.09961l-2.7002 22.2998l-6.7998 -83
c-1.09961 -14.0996 -22 -14.2002 -23.0996 0.100586l-4.90039 64.3994l-4.59961 -58.5996c-1.10059 -14.2998 -22.3008 -14.1006 -23.2002 0.200195l-4.5 71.7998l-4.90039 -80.5c-0.899414 -14.5 -22.2998 -14.5 -23.2002 -0.100586l-4.7998 73.3008l-4.59961 -70.4004
c-0.900391 -14.2998 -22.1006 -14.5 -23.2002 -0.0996094l-5.7002 78.2998l-3.7998 -43.6006c-1.2002 -13.6992 -21.0996 -14.1992 -23.0996 -0.699219l-10.7002 73.0996c-2 -3.90039 -6 -6.40039 -10.4004 -6.40039h-51.2998v23.2002h43.9004l13.1992 27.7002
c4.90039 10.2998 20.3008 8.09961 22 -3.2998l1.80078 -12.2002l7.69922 89.7998c1.2002 14.1006 22.1006 14.1006 23.2002 -0.200195l4.10059 -57l5.2998 80.2002c1 14.4004 22.2998 14.4004 23.2002 0l4.2998 -66.2998l5.09961 83.7002
c0.900391 14.3994 22.2998 14.5 23.2002 0l5.90039 -94.2998l3.5 44.8994c1.09961 14.2002 22.0996 14.2998 23.1992 0l5.2002 -68.7998l4.2998 51.4004c1.10059 13.7998 21.4004 14.2998 23.1006 0.399414l11 -92.7998l4 9.5c1.7002 4.40039 6 7.2002 10.7002 7.2002z
M277.4 184.5c4.09961 0 7.5 3.40039 7.5 7.5c0 4.2002 -3.40039 7.5 -7.5 7.5h-21.9004v21.9004c0 4.19922 -3.40039 7.5 -7.5 7.5s-7.5 -3.40039 -7.5 -7.5v-21.9004h-21.9004c-4.09961 0 -7.5 -3.40039 -7.5 -7.5c0 -4.2002 3.40039 -7.5 7.5 -7.5h21.9004v-21.9004
c0 -4.19922 3.40039 -7.5 7.5 -7.5c4.2002 0 7.5 3.40039 7.5 7.5v21.9004h21.9004z" />
    <glyph glyph-name="creative-commons-share" unicode="&#xf4f2;" horiz-adv-x="496" 
d="M247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 395.3c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8
c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3zM349.4 262.9c7.7998 0 13.6992 -6.10059 13.6992 -13.7002v-182.5c0 -7.7002 -6.09961 -13.7002 -13.6992 -13.7002h-135.101c-7.7002 0 -13.7002 6 -13.7002 13.7002v54h-54
c-7.7998 0 -13.6992 6 -13.6992 13.7002v182.5c0 8.19922 6.59961 12.6992 12.3994 13.6992h136.4c7.7002 0 13.7002 -6 13.7002 -13.6992v-54h54zM159.9 147.7h40.6992v101.399c0 7.40039 5.80078 12.6006 12 13.7002h55.8008v40.2998h-108.5v-155.399zM336.1 235.8h-108.5
v-155.399h108.5v155.399z" />
    <glyph glyph-name="creative-commons-zero" unicode="&#xf4f3;" horiz-adv-x="496" 
d="M247.6 440c141.801 0 248.4 -110.1 248.4 -248c0 -147.1 -118.5 -248 -248.4 -248c-134 0 -247.6 109.5 -247.6 248c0 132.9 104.7 248 247.6 248zM248.4 395.3c-118.2 0 -203.7 -97.8994 -203.7 -203.3c0 -109.8 91.2002 -202.8 203.7 -202.8
c103.199 0 202.8 81.0996 202.8 202.8c0.0996094 113.8 -90.2002 203.3 -202.8 203.3zM248 334.8c81.9004 0 102.5 -77.2998 102.5 -142.8s-20.5996 -142.8 -102.5 -142.8s-102.5 77.2998 -102.5 142.8s20.5996 142.8 102.5 142.8zM248 280.9
c-42.0996 0 -44.0996 -60.1006 -44.0996 -88.9004c0 -9.2998 0.199219 -21.7002 1.89941 -34.4004l54.5 100.2c5.7002 9.7998 2.7998 16.7998 -3.09961 21.9004c-2.7998 0.700195 -5.90039 1.2002 -9.2002 1.2002zM288.8 234.7l-60.8994 -105.2
c-12.5 -18.7002 6.59961 -26.4004 20.0996 -26.4004c42.0996 0 44.0996 60 44.0996 88.9004c0 11.2998 -0.399414 27.2998 -3.2998 42.7002z" />
    <glyph glyph-name="ebay" unicode="&#xf4f4;" horiz-adv-x="640" 
d="M606 258.5h34l-99.2002 -194.8h-35.8994l28.5 54.0996l-61.5 116.101c3.09961 -6.60059 4.7998 -14.5 4.7998 -23.8008v-65.5996c0 -9.2998 0.299805 -18.5996 1 -26.7998h-29.7998c-0.800781 6.89941 -1.10059 13.5996 -1.10059 20.2002
c-16.0996 -19.8008 -35.2998 -25.5 -61.8994 -25.5c-39.5 0 -60.6006 20.8994 -60.6006 45c0 3.19922 0.200195 6.19922 0.700195 9c-8.40039 -32.3008 -36.4004 -54.2002 -73.2998 -54.2002c-23.2998 0 -45.1006 8.2998 -58.7002 24.8994
c0 -6.59961 -0.400391 -13.1992 -1.09961 -19.5h-31.5c0.5 10.2002 1.09961 22.8008 1.09961 33.1006v169.5h32.0996v-80.6006c15.7002 18.7002 37.4004 24.2002 58.7002 24.2002c35.7002 0 75.4004 -24.0996 75.4004 -76.2002c0 -5.59961 -0.5 -11 -1.5 -16.1992
c7.09961 24.3994 34.2998 33.5 76.7002 34.3994c13.6992 0.299805 29 0.400391 41.6992 0.400391v3.39941c0 23.4004 -15 33 -41 33c-19.2998 0 -33.5996 -8 -35 -21.7998h-33.6992c3.59961 34.4004 39.6992 43.1006 71.5 43.1006c27.3994 0 51.7998 -7 63.2998 -26
l-10.9004 20.5996h37.5l54.9004 -109.9zM243.7 134.2c29.7998 0 50.2002 21.5 50.2002 53.7998c0 32.4004 -20.4004 53.7998 -50.2002 53.7998c-29.6006 0 -50.2002 -21.3994 -50.2002 -53.7998c0 -32.2998 20.5996 -53.7998 50.2002 -53.7998zM444.6 181.5v3.2998
c-11.7998 0 -26.2998 -0.0996094 -39.3994 -0.599609c-29.1006 -0.900391 -47.2002 -6.2002 -47.2002 -25.2998c0 -12.4004 9.90039 -25.8008 35 -25.8008c33.7002 0 51.5996 18.4004 51.5996 48.4004zM32.7002 179.9c3.5 -58.3008 79.2002 -57.4004 91.2002 -21.6006
h33.0996c-6.40039 -34.3994 -43 -46.0996 -74.4004 -46.0996c-57.1992 0 -82.5 31.5 -82.5 74c0 46.7998 26.2002 77.5996 83 77.5996c45.3008 0 78.4004 -23.7002 78.4004 -75.3994v-8.5h-128.8zM127.7 201.3c-2.2998 54.7002 -87.5 56.6006 -94.4004 0h94.4004z" />
    <glyph glyph-name="keybase" unicode="&#xf4f5;" 
d="M286.17 29c9.93652 0 18 -8.06445 18 -18s-8.06348 -18 -18 -18c-9.93555 0 -18 8.06445 -18 18s8.06445 18 18 18zM398.09 176.6c22.9102 -33.46 35.9102 -72.3398 35.9102 -110.92c0 -31.6797 -5 -60.6797 -14.5996 -86.2295
c-3.04004 -8.0498 -10.9502 -12.7197 -18.3701 -11.1504c-6.83984 1.24023 -11.1201 9.28027 -8.60059 15.7402c11.1904 28.71 14.8799 58.3398 14.8799 81.6396c-0.0517578 7.91797 -1.30566 20.6543 -2.7998 28.4307
c-0.649414 -1.06055 -1.12988 -2.2207 -1.84961 -3.2207c-17.29 -24.5293 -50.54 -33.8896 -84.7402 -23.8398c-78.8701 23.1699 -178.02 3.81055 -236.25 -38.5898l24.6602 74.1104l-46.8203 -59.8301c2.04297 -15.3486 9.10352 -39.1504 15.7598 -53.1299
c6.25 -13.1904 0.460938 -18.2402 -3.75 -20.1104c-4.76953 -2.12012 -13.8594 -2.7998 -19.6396 7.33008c-5.43652 9.81641 -11.96 26.6436 -14.5596 37.5596l-23.3203 -29.7998v33.6406c0 55.7695 0 125.109 62.6504 188.409c11.4258 11.5684 32.1631 27.4902 46.29 35.54
l-8.93066 0.540039c-27.8799 1.64062 -49.2402 24.8506 -47.6299 51.8506l2.36035 36.6797c0 -6.24023 0.139648 45.8799 50.75 45.8799c2.05957 0 -0.470703 0.120117 41.0596 -2.33008c2.31641 -0.15625 6.03027 -0.71582 8.29004 -1.25
c7.41992 11.3398 15.6504 22.8301 24.3398 34.8906l5.48047 7.55957l22.8994 -13.5195c-11.29 -24 -10 -33 -9.39941 -35c9.08008 0.229492 20 -1.6709 32.4102 -5.77051c29.6523 -9.84375 53.7188 -43.1914 53.7188 -74.4355
c0 -8.5127 -2.61621 -21.8154 -5.83887 -29.6943c6.18652 -2.13965 12.3135 -4.56348 18.3799 -7.27051c47.8896 -21.2598 77.7598 -59.0898 87.2598 -73.71zM142.37 319.42c1.55664 5.42773 4.69336 14.0156 7 19.1699l-29.1104 1.73047
c0.610352 -0.0507812 -12.2598 0.849609 -13.2598 -11.3203l-2.41016 -36.6602c-0.00585938 -0.143555 -0.0107422 -0.376953 -0.0107422 -0.520508c0 -6.50293 5.27344 -12 11.7705 -12.2695l22.3809 -1.33984c-0.380859 3.10645 -0.689453 8.16797 -0.689453 11.2969
c0 2.28809 0.165039 5.99414 0.369141 8.27344l-13.1299 0.779297l1.38965 21.79zM290.79 147.24c2.06152 1.58789 3.73438 4.9873 3.73438 7.58887c0 1.80273 -0.893555 4.42383 -1.99414 5.85059l-81.0898 96.3203c-1.71484 1.99023 -5.23828 3.60547 -7.86523 3.60547
c-1.99023 0 -4.87305 -1.00098 -6.43555 -2.23535c-2.05957 -1.58398 -3.73242 -4.97949 -3.73242 -7.57812c0 -1.7998 0.892578 -4.41699 1.99316 -5.8418c0.0898438 -0.140625 18.5996 -22.1406 18.5996 -22.1406l-16.9102 -13.29
c-1.59473 -1.22266 -2.88867 -3.8457 -2.88867 -5.85547c0 -1.37988 0.680664 -3.38867 1.51855 -4.48438c0.0800781 -0.109375 2.52246 -3.07324 3.7998 -4.5293c1.27832 -1.45703 3.8877 -2.63867 5.8252 -2.63867c1.4707 0 3.60547 0.734375 4.76562 1.63867
l17.0898 13.4492l14.1396 -16.7393l-34.5703 -27.1807c-1.58398 -1.22266 -2.86914 -3.83984 -2.86914 -5.84082c0 -1.38574 0.685547 -3.40039 1.5293 -4.49902l15.7803 -18.6396c1.33594 -1.55176 4.08203 -2.81055 6.12988 -2.81055
c1.54492 0 3.78516 0.775391 5 1.73047l34.4199 27l9.68066 -11.4902c1.7334 -1.98242 5.27832 -3.5918 7.91211 -3.5918c1.98438 0 4.86816 0.986328 6.4375 2.20215zM187.44 29c9.93555 0 18 -8.06445 18 -18s-8.06445 -18 -18 -18c-9.93652 0 -18 8.06445 -18 18
s8.06348 18 18 18z" />
    <glyph glyph-name="mastodon" unicode="&#xf4f6;" 
d="M433 268.89c0 0 0.799805 -71.6992 -9 -121.5c-6.23047 -31.5996 -55.1104 -66.1992 -111.23 -72.8994c-20.0996 -2.40039 -93.1191 -14.2002 -178.75 6.7002v-0.339844c0 -3.75977 0.40332 -9.83496 0.900391 -13.5605c6.62988 -49.5996 49.2197 -52.5996 89.6299 -54
c40.8105 -1.2998 77.1201 10.0996 77.1201 10.0996l1.7002 -36.8994s-28.5098 -15.2998 -79.3203 -18.1006c-28.0098 -1.59961 -62.8193 0.700195 -103.33 11.4004c-112.229 29.7002 -105.63 173.4 -105.63 289.1c0 97.2002 63.7197 125.7 63.7197 125.7
c61.9209 28.4004 227.96 28.7002 290.48 0c0 0 63.71 -28.5 63.71 -125.7zM357.88 143.69c0 122 5.29004 147.71 -18.4199 175.01c-25.71 28.7002 -79.7197 31 -103.83 -6.10059l-11.5996 -19.5l-11.6006 19.5c-24.0098 36.9004 -77.9297 35 -103.83 6.10059
c-23.6094 -27.1006 -18.4092 -52.9004 -18.4092 -175h46.7295v114.2c0 49.6992 64 51.5996 64 -6.90039v-62.5098h46.3301v62.5c0 58.5 64 56.5996 64 6.89941v-114.199h46.6299z" />
    <glyph glyph-name="r-project" unicode="&#xf4f7;" horiz-adv-x="581" 
d="M581 221.4c0 -54.8008 -33.9004 -104.301 -88.4004 -139.7l67.4004 -113.7h-112l-40.0996 75.4004c-21.8008 -6.5 -45.1006 -11.2002 -69.4004 -13.9004v-61.5h-99.0996v61.9004c-136.101 16.0996 -239.4 95.6992 -239.4 191.5c0 107.5 130.1 194.6 290.5 194.6
s290.5 -87.0996 290.5 -194.6zM114.2 206.9c0 -52.8008 51.0996 -98.4004 125.2 -119.9v208.3h199s90.5996 -1.59961 90.5996 -87.8994c0 -86.3008 -86.5996 -92.7002 -86.5996 -92.7002s17.5996 -5.2998 27.7998 -10.5c1.7002 -0.799805 4 -2.10059 6.39941 -3.7002
c43.8008 21.4004 70.3008 56.2998 70.3008 106.4c0 92.2998 -90 133 -211.9 133s-220.8 -59.5 -220.8 -133zM339.3 168.6c49.6006 0 87.7998 -8.19922 87.7998 28.3008c0 34.0996 -30 27.2998 -87.7998 27.2998v-55.6006zM338.4 96.0996v-22.0996
c17.5996 0.0996094 34.5 1 50.5996 2.90039c-5.09961 7.5 -13.2002 19.1992 -24 19.1992h-26.5996z" />
    <glyph glyph-name="researchgate" unicode="&#xf4f8;" 
d="M0 416h448v-448h-448v448zM262.2 81.5996v7.30078c-10 0 -20 6.89941 -27.2002 14.6992c-12.2002 13.3008 -28.5996 34.7002 -42.2002 58.9004c22.5 5.2998 39.2002 26.4004 39.2002 47.5c0 31.2002 -24.2002 45.5996 -55.9004 45.5996
c-17.7998 0 -45.0996 -1.59961 -70.8994 -0.599609v-8.09961c15.5996 -2.90039 22 -1.30078 22 -23.9004v-109.4c0 -22.5996 -6.5 -21 -22 -23.8994v-8.10059c7.5 0.200195 20.5 0.800781 33.5996 0.800781c12.5 0 28.7002 -0.5 35.6006 -0.800781v8.10059
c-19.8008 2.7002 -25.8008 0.399414 -25.8008 23.8994v46.4004c6.7002 -0.599609 12.5 -0.599609 21.4004 -0.599609c16.9004 -30.3008 33 -53 42.2002 -63.6006c16.7998 -20.2002 43.3994 -17.2002 50 -14.2002zM285.1 216.6c38.7002 0 34 29.4004 34 49.9004h-30.3994
v-10.7002h17.8994c0 -15.8994 -7.39941 -26.7998 -21.5 -26.7998c-11.2998 0 -17.8994 9.90039 -17.8994 23.2998v26.7998c0 12.4004 11.7998 19.7002 19.7002 19.7002c14.1992 0 19.6992 -12.5 19.6992 -12.5l10.7002 7.2002s-5.2002 17.9004 -30.3994 17.9004
c-25.2002 0 -34 -18.2002 -34 -30.4004v-32.2002c0 -16.5 8.89941 -32.2002 32.1992 -32.2002zM168.6 171.9c-9.39941 0 -13.5996 0.299805 -20 0.799805v69.7002c6.40039 0.599609 15 0.599609 22.5 0.599609c23.3008 0 37.2002 -12.2002 37.2002 -34.5
c0 -21.9004 -15 -36.5996 -39.7002 -36.5996z" />
    <glyph glyph-name="teamspeak" unicode="&#xf4f9;" horiz-adv-x="512" 
d="M244.2 101.21c-2.40039 -12.5 -10.6006 -20 -22.5 -24.2998c-9.2002 -3.2002 -50.1006 -1.60059 -61.7002 -1c-18 1.2998 -33.2002 8.5 -43.4004 24c-14.5 22.5 -19.5 47.7002 -14.5 73.8994c4.60059 24.5 24.6006 34.7002 46.3008 22.7002
c15.1992 -7.5 42.5 -27.3994 63.3994 -46.5996c20.4004 -18.7002 34.7998 -36.4004 32.4004 -48.7002zM449.2 80.4102c6.7002 -5.41016 11.2002 -22 11.5996 -32.1006c1 -50.3994 -23.8994 -68 -46.5996 -85.3994c-65.1006 -50 -295.101 -16.9004 -145.4 -6.40039
c127.4 9 164.101 96.1006 172.101 121.5c0.647461 1.99023 2.87109 3.60547 4.96387 3.60547c1.04102 0 2.53516 -0.540039 3.33594 -1.20508zM511.2 202.81c0 -17.1992 1.89941 -34.5996 -1 -51.6992c-4 -24.7002 -29.1006 -41.7002 -53.2002 -36.7002
c-7.2002 1.7002 -9.40039 7.2002 -9.40039 14.2002c0 28.0996 0.800781 56.3994 0 84.5996c-1.89941 75.79 -36.1992 132.79 -102.3 169.4c-111 60.3896 -253.2 -7 -277.8 -131.5c-6.09961 -30.4004 -1.7002 -48.3008 -3.7002 -125.801
c-0.299805 -7.19922 -4.2998 -11.1992 -12 -11.5c-30.7998 -1.39941 -51.7998 18.2002 -51.7998 49v20.9004l0.799805 26.4902c2.40039 15.5 10.7002 27 24.9004 34c3.5 1.7998 5.7002 3.5 6.39941 7.7998c6.10059 33.4102 19.5 64 39.3008 91.71
c2.2998 3.09961 4 5.2998 1 9.2998c-3.7002 5.40039 -1 10.2002 3 14.5c28.0996 31.7998 61.8994 55.1006 102 67.4004c96 29.4668 180.1 9.29688 252.3 -60.5098c6.7002 -6.40039 15.5 -12.9004 7 -24.4004c-1.2998 -1.7998 1.09961 -3.5 2.2002 -5
c17.2246 -23.209 35.3242 -65.1367 40.3994 -93.5898c0.900391 -3.7002 3 -5.10059 5.90039 -6.40039c17.3994 -8.7998 25.7002 -23.2998 26 -42.2002zM351.6 71.3096l-51.5996 7.7002c-22.7998 5.90039 -51 32.7002 22.2002 60.7998
c21.5996 8.5 85.7002 37.2002 87.7998 -8c0.900391 -32 -21.9004 -63.2998 -58.4004 -60.5z" />
    <glyph glyph-name="first-order-alt" unicode="&#xf50a;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM248 -48.21c132.66 0 240.21 107.55 240.21 240.21s-107.55 240.21 -240.21 240.21s-240.21 -107.55 -240.21 -240.21s107.55 -240.21 240.21 -240.21z
M248 411.71c121.34 0 219.71 -98.3701 219.71 -219.71s-98.3701 -219.71 -219.71 -219.71s-219.71 98.3701 -219.71 219.71s98.3701 219.71 219.71 219.71zM248 -19.5098c116.81 0 211.51 94.7002 211.51 211.51s-94.7002 211.51 -211.51 211.51
s-211.51 -94.6895 -211.51 -211.51s94.7002 -211.51 211.51 -211.51zM434.23 143.47c-3.69141 -14.209 -12.709 -36.0225 -20.1309 -48.6895l-74.1299 35.8799l61.4805 -54.8203c-8.85352 -11.7021 -25.5195 -28.4082 -37.2002 -37.29l-54.7998 61.5703l35.8799 -74.2705
c-12.6445 -7.45215 -34.4307 -16.5156 -48.6299 -20.2295l-27.29 78.4697l4.79004 -82.9297c-8.61035 -1.17969 -17.4004 -1.7998 -26.3301 -1.7998s-17.7197 0.620117 -26.3301 1.7998l4.75977 82.46l-27.1494 -78.0303c-14.2021 3.70996 -35.998 12.7588 -48.6504 20.2002
l35.9297 74.3398l-54.8701 -61.6396c-11.6836 8.87988 -28.3584 25.582 -37.2197 37.2793l61.5898 54.9004l-74.2598 -35.9297c-7.42383 12.667 -16.4463 34.4795 -20.1396 48.6895l77.8398 27.1104l-82.2305 -4.75977c-1.15918 8.56934 -1.7793 17.3193 -1.7793 26.21
c0 9 0.629883 17.8398 1.81934 26.5098l82.3799 -4.76953l-77.9395 27.1592c3.71973 14.208 12.7822 36.0127 20.2295 48.6699l74.2207 -35.9199l-61.5205 54.8604c8.88086 11.6836 25.582 28.3584 37.2803 37.2197l54.7598 -61.5293l-35.8301 74.1699
c12.6562 7.41895 34.4521 16.4375 48.6504 20.1299l26.8701 -77.25l-4.70996 81.6094c8.60938 1.18066 17.3896 1.80078 26.3193 1.80078c8.93066 0 17.71 -0.620117 26.3203 -1.80078l-4.74023 -82.1592l27.0498 77.7598c17.2705 -4.5 33.6006 -11.3506 48.6309 -20.1699
l-35.8203 -74.1201l54.7197 61.4697c11.6924 -8.86133 28.376 -25.54 37.2402 -37.2295l-61.4502 -54.7705l74.1201 35.8604c7.43945 -12.6533 16.4893 -34.4492 20.2002 -48.6504l-77.8105 -27.0996l82.2402 4.75c1.19043 -8.66016 1.82031 -17.5 1.82031 -26.4902
c0 -8.87988 -0.610352 -17.6299 -1.78027 -26.1904l-82.1201 4.75z" />
    <glyph glyph-name="fulcrum" unicode="&#xf50b;" horiz-adv-x="320" 
d="M95.75 283.86l-35.3799 -43.5508l-35.3701 43.5508l35.3799 43.5498zM144.23 448v-211.11l-41.0801 -44.8896l41.0801 -44.8896v-211.11l-20.5107 198.18l-51 57.8203l50.9707 57.8203zM223.9 283.86l35.3799 43.5498l35.3799 -43.5498l-35.3799 -43.5508zM175.42 236.86
v211.14l20.5801 -198.18l51 -57.8203l-51 -57.8203l-20.5801 -198.18v211.11l41.0801 44.8896z" />
    <glyph glyph-name="galactic-republic" unicode="&#xf50c;" horiz-adv-x="496" 
d="M248 -56c-136.75 0 -248 111.25 -248 248s111.25 248 248 248s248 -111.25 248 -248s-111.25 -248 -248 -248zM248 423.47c-127.63 0 -231.47 -103.84 -231.47 -231.47s103.84 -231.47 231.47 -231.47s231.47 103.84 231.47 231.47s-103.84 231.47 -231.47 231.47z
M275.62 401.66c37.6602 -4.91016 72.21 -19.7402 100.96 -41.7998l-17.3896 -17.3604c-20.6758 15.3154 -58.1152 30.7891 -83.5703 34.54v24.6201zM220.25 401.59v-24.54c-30.9697 -4.60938 -59.4502 -16.8301 -83.5195 -34.6699h-0.0800781l-17.2803 17.3604
c28.7197 22.0498 63.2402 36.9102 100.88 41.8496zM232.5 351.42h31v-82.8604c10.0498 -2.0293 19.3701 -6.00977 27.6201 -11.5l58.6699 58.6709l21.9297 -21.9307l-58.6699 -58.6699c5.46973 -8.24023 9.48047 -17.5996 11.5 -27.6201h82.8701v-31h-82.8701
c-2.03027 -10.0195 -6.04004 -19.3096 -11.5 -27.54l58.6699 -58.6895l-21.9297 -21.9307l-58.6699 58.6904c-8.25 -5.49023 -17.5703 -9.52051 -27.6201 -11.5498v-82.9004h-31v82.9004c-8.25781 1.66895 -20.6533 6.80762 -27.6699 11.4697l-58.6201 -58.6201
l-21.9297 21.9297l58.6699 58.6904c-5.45996 8.23047 -9.4502 17.5205 -11.4697 27.54h-82.9004v31h82.9004c2.01953 10.0303 6 19.3896 11.4697 27.6201l-58.6699 58.6699l21.9297 21.9297l58.6201 -58.5898c8.25 5.48047 17.6299 9.38965 27.6699 11.4199v82.8701z
M415.74 320.7c22.0996 -28.7402 36.9795 -63.3398 41.9297 -101.03h-24.6201c-3.7832 25.4902 -19.3154 62.9746 -34.6699 83.6699zM80.1904 320.57l17.3896 -17.3906c-17.8301 -24.0693 -29.9902 -52.5596 -34.5898 -83.5195h-24.6504
c4.94043 37.6494 19.79 72.1895 41.8506 100.91zM38.3398 164.33l24.6504 0.00976562c4.58984 -30.9502 16.7002 -59.4502 34.5098 -83.5195l-17.3604 -17.3906c-22.0498 28.7207 -36.8799 63.2607 -41.7998 100.9zM433.04 164.33h24.6201
c-4.9502 -37.6699 -19.8506 -72.2197 -41.9297 -100.96l-17.3604 17.3604c17.8701 24.0996 30.0596 52.6094 34.6699 83.5996zM136.66 41.6201c24.0703 -17.8604 52.6094 -30.0205 83.5996 -34.6504v-24.6396c-37.6602 4.9502 -72.2295 19.8398 -100.96 41.9297z
M359.19 41.5703h0.0791016l17.3105 -17.3906c-28.75 -22.0596 -63.29 -36.9297 -100.96 -41.8496v24.5703c30.9902 4.58984 59.4795 16.8301 83.5703 34.6699z" />
    <glyph glyph-name="galactic-senate" unicode="&#xf50d;" horiz-adv-x="512" 
d="M249.86 414.52h12.2793v-26.0693c13.5801 -20.6201 23.8604 -108.59 24.4902 -215.351c-11.7402 15.6201 -19.1299 33.3301 -19.1299 48.2402v16.8799c0.0302734 5.32031 -0.75 10.5303 -2.19043 15.6504c-0.649414 2.13965 -1.38965 4.07031 -2.61914 5.82031
c-1.23047 1.73926 -3.44043 3.79004 -6.68066 3.79004c-3.25 0 -5.4502 -2.04004 -6.67969 -3.79004c-1.23047 -1.74023 -1.96973 -3.68066 -2.62012 -5.82031c-1.44043 -5.12012 -2.21973 -10.3301 -2.19043 -15.6504v-16.8799
c0 -14.9102 -7.38965 -32.6201 -19.1299 -48.2402c0.610352 106.761 10.8906 194.73 24.4707 215.351v26.0693zM223.52 266.75c-1.59961 -22.4004 -2.75 -46.5195 -3.47949 -72.0703c-23.2998 -11.2793 -40.7705 -33.1602 -46.3203 -59.5098
c-7.71973 -2.25977 -22.71 -3.91992 -40.4893 -4.21973c-7.51074 3.66016 -16.5 5.85938 -26.1807 6.04004c1.90039 14.9102 5.87012 29.1699 11.6504 42.4199c15.4395 -8.10059 30.9297 -8.66016 35.4697 -0.959961c4.57031 7.74023 -3.58984 21.04 -18.3203 30.6602
c8.68066 11.7695 18.9805 22.2998 30.5605 31.0898c9.50977 -15.5898 23.3594 -24.4404 31.3594 -19.8203c8.05078 4.65039 7.19043 21.1699 -1.70996 37.29c8.76074 3.88965 17.9404 6.92969 27.46 9.08008zM288.48 266.75
c7.82227 -1.75977 20.1201 -5.82812 27.4492 -9.08008c-8.89941 -16.1299 -9.75977 -32.6396 -1.70996 -37.29c8 -4.62012 21.8506 4.23047 31.3604 19.8203c11.5801 -8.79004 21.8799 -19.3203 30.5596 -31.0898c-14.7197 -9.61035 -22.8896 -22.9199 -18.3193 -30.6602
c4.54004 -7.7002 20.0293 -7.14062 35.4697 0.959961c5.79004 -13.25 9.75 -27.5098 11.6504 -42.4199c-9.68066 -0.19043 -18.6709 -2.37988 -26.1807 -6.04004c-17.7793 0.299805 -32.7695 1.95996 -40.4902 4.21973c-5.5498 26.3496 -23.0293 48.2305 -46.3193 59.5098
c-0.719727 25.5508 -1.87988 49.6699 -3.46973 72.0703zM256 258.15c3.23047 0 5.86035 -8.81055 6.08984 -19.9307h0.0498047v-16.8799c0 -41.4199 49.0107 -95.04 93.4902 -95.04c52 0 122.76 1.4502 156.37 -29.1699v-2.50977
c-9.41992 -17.1104 -20.5801 -33.1699 -33.1797 -47.9697c-12.5303 21.0898 -51.5898 40.96 -108.021 41.3496c-45.6797 -1.01953 -79.0195 -20.3301 -90.7598 -40.8701c-0.00976562 -0.00976562 0.00976562 -0.0400391 0 -0.0498047
c-7.66992 -2.13965 -15.8496 -3.23047 -24.04 -3.20996c-8.19043 -0.0205078 -16.3701 1.07031 -24.04 3.20996c-0.00976562 0.00976562 0.00976562 0.0400391 0 0.0498047c-11.7295 20.54 -45.0801 39.8506 -90.7598 40.8701
c-56.4307 -0.400391 -95.5 -20.2598 -108.021 -41.3496c-12.5996 14.7998 -23.7598 30.8496 -33.1797 47.9697v2.50977c33.6201 30.6201 104.37 29.1699 156.37 29.1699c44.4795 0 93.4902 53.6201 93.4902 95.04v16.8799h0.0498047
c0.229492 11.1201 2.85938 19.9307 6.08984 19.9307zM256 161.56c-22.4199 0 -40.5996 -18.1797 -40.5996 -40.5996s18.1797 -40.6504 40.5996 -40.6504s40.5996 18.2305 40.5996 40.6504s-18.1797 40.5996 -40.5996 40.5996zM256 153.92
c18.1904 0 32.96 -14.7695 32.96 -32.96s-14.7695 -32.96 -32.96 -32.96s-32.96 14.7695 -32.96 32.96s14.7695 32.96 32.96 32.96zM256 147.78c-14.8096 0 -26.8203 -12.0107 -26.8203 -26.8203s12.0107 -26.8203 26.8203 -26.8203s26.8203 12.0107 26.8203 26.8203
s-12.0107 26.8203 -26.8203 26.8203zM141.2 81.1104c18.75 -0.419922 35.1895 -4.18066 48.6094 -9.66992c12.5508 -16.0303 29.1602 -30.04 49.5801 -33.0703c0.100586 -0.00976562 0.169922 -0.0302734 0.270508 -0.0498047
c0.0498047 -0.0107422 0.109375 -0.0400391 0.160156 -0.0507812c5.23926 -1.06934 10.6396 -1.59961 16.1895 -1.59961c5.56055 0 10.9502 0.530273 16.1904 1.59961c0.0498047 0.0107422 0.109375 0.0400391 0.160156 0.0507812
c0.0996094 0.00976562 0.179688 0.0292969 0.269531 0.0498047c20.4199 3.04004 37.04 17.04 49.5801 33.0703c13.4199 5.5 29.8496 9.25 48.6104 9.66992c10.1797 -0.0800781 21.5996 -0.360352 30.5 -1.66016c-0.430664 -4.41992 -1.51074 -18.6299 -7.11035 -29.7598
c-9.11035 2.55957 -18.3604 3.89941 -27.6201 3.89941c-41.2803 -0.939453 -71.4795 -34.3496 -78.2598 -74.4697l-0.110352 -4.7002c-10.3994 -1.91992 -21.1797 -2.93945 -32.21 -2.93945c-11.0195 0 -21.8096 1.0293 -32.21 2.93945l-0.109375 4.7002
c-6.78027 40.1201 -36.9805 73.5303 -78.2607 74.4697c-9.25977 0 -18.5098 -1.33984 -27.6201 -3.89941c-5.59961 11.1299 -6.67969 25.3398 -7.10938 29.7598c8.89941 1.2998 20.3096 1.58984 30.5 1.66016z" />
    <glyph glyph-name="jedi-order" unicode="&#xf50e;" 
d="M398.5 74.4004c0 0 26.2998 16.1992 49.9004 77.6992c0 0 -17 -183.3 -222 -185.699h-4.10059c-205.1 2.39941 -222 185.699 -222 185.699c23.2002 -61.5996 49.4004 -77.6992 49.4004 -77.6992c-95.9004 122.1 -17.2002 233.1 -17.2002 233.1
c-45.4004 -85.7002 41.4004 -170.5 41.4004 -170.5c-105 171.6 60.5 271.5 60.5 271.5c-96.9004 -72.5996 10.0996 -190.7 10.0996 -190.7c-85.7998 -158.399 68.5996 -230.1 68.5996 -230.1s0.400391 16.8994 2.2002 85.7002l-34.5 -36.2002l24.2002 47.3994
l-62.5996 9.10059l62.5996 9.09961l-20.2002 55.5l31.4004 -45.8994c2.2998 87.8994 7.89941 305.899 7.89941 306.899v2.40039v-1v1v-2.40039c0.100586 -1.7998 5.7002 -219.2 7.90039 -306.899l31.4004 45.8994l-20.2002 -55.5l62.5996 -9.09961l-62.5996 -9.10059
l24.2002 -47.3994s-30.2002 31.7002 -34.5 36.2002c1.7998 -68.8008 2.19922 -85.7002 2.19922 -85.7002s154.4 71.7002 68.6006 230.1c0 0 107 118 10.0996 190.7c0 0 165.5 -100 60.5 -271.5c0 0 86.7998 84.7002 41.4004 170.5c0 0 78.7002 -111 -17.2002 -233.1z" />
    <glyph glyph-name="mandalorian" unicode="&#xf50f;" 
d="M232.27 -63.8896c-1 3.25977 -1.68945 15.8301 -1.38965 24.5801c0.549805 15.8896 1 24.7197 1.40039 28.7598c0.639648 6.2002 2.87012 20.7197 3.2793 21.3799c0.600586 1 0.400391 27.8701 -0.239258 33.1299c-0.310547 2.58008 -0.629883 11.9004 -0.69043 20.7305
c-0.129883 16.4697 -0.530273 20.1191 -2.72949 24.7598c-1.10059 2.31934 -1.23047 3.83984 -1 11.4297c0.0449219 1.07324 0.0820312 2.81641 0.0820312 3.89062c0 2.43945 -0.189453 6.39062 -0.422852 8.81934c-2 13 -3.45996 27.7002 -3.25 33.9004
s0.430664 7.14941 2.06055 9.66992c3.0498 4.70996 6.50977 14 8.62012 23.2695c2.25977 9.86035 3.87988 17.1807 4.58984 20.7402c0.921875 4.24121 2.90137 10.9834 4.41992 15.0498c2.26953 6.25 2.49023 15.3906 0.370117 15.3906
c-0.299805 0 -1.37988 -1.2207 -2.41016 -2.70996c-1.03027 -1.49023 -4.75977 -4.80078 -8.29004 -7.36035c-8.37012 -6.08008 -11.7002 -9.38965 -12.6602 -12.5801s-1 -7.22949 -0.160156 -7.75977c0.34082 -0.209961 1.29004 -2.40039 2.11035 -4.87988
c0.791992 -2.41602 1.43457 -6.43945 1.43457 -8.98145c0 -1.78223 -0.320312 -4.64062 -0.714844 -6.37891c-0.389648 -1.76953 -1 -5.46973 -1.45996 -8.22949c-0.459961 -2.76074 -1 -6.46094 -1.25 -8.2207c-0.149414 -1.27637 -0.84375 -3.18555 -1.5498 -4.25977
c-1 -1 -1.13965 -0.910156 -2.0498 0.530273c-0.619141 1.24316 -1.26465 3.37109 -1.44043 4.75c-0.25 1.73926 -1.62988 7.10938 -3.08008 11.9297c-3.2793 10.9004 -3.51953 16.1504 -1 21c0.683594 1.19141 1.43164 3.25684 1.66992 4.61035
c0 2.38965 -2.19922 5.31934 -7.40918 9.88965c-7 6.17969 -8.62988 7.91992 -10.2305 11.2998c-1.70996 3.60059 -3.05957 4.06055 -4.54004 1.54004c-1.78027 -3 -2.59961 -9.10938 -3 -22l-0.339844 -12.1895l2 -2.25c3.20996 -3.7002 12.0703 -16.4502 13.7803 -19.8301
c3.41016 -6.74023 4.33984 -11.6904 4.41016 -23.5605c0.0693359 -11.8701 0.949219 -22.75 2 -24.71c0.359375 -0.660156 0.509766 -1.34961 0.339844 -1.51953s0.410156 -2.08984 1.29004 -4.27051c0.871094 -2.41406 1.79395 -6.44629 2.05957 -9
c0.306641 -2.88867 1.07227 -7.53516 1.70996 -10.3701c2.23047 -9.55957 2.77051 -14.0801 2.39062 -20.1396c-0.200195 -3.26953 -0.530273 -11.0703 -0.730469 -17.3203c-1.30957 -41.7598 -1.84961 -58 -2 -61.21c-0.120117 -2 -0.389648 -11.5098 -0.599609 -21.0693
c-0.360352 -16.3008 -1.30078 -27.3701 -2.41992 -28.6504c-0.640625 -0.729492 -8.07031 4.91016 -12.5205 9.49023c-3.75 3.87012 -4 4.79004 -2.83008 9.9502c0.700195 3 2.25977 18.29 3.33008 32.6191c0.360352 4.78027 0.80957 10.5 1 12.7109
c0.830078 9.36914 1.66016 20.3496 2.61035 34.7793c0.55957 8.45996 1.33008 16.4404 1.71973 17.7305s0.889648 9.88965 1.12988 19.1094l0.429688 16.7705l-2.25977 4.2998c-1.71973 3.28027 -4.87012 6.94043 -13.2197 15.3398
c-6 6.07031 -11.8398 12.2998 -12.9102 13.8506l-1.9502 2.80957l0.75 10.9004c1.08984 15.71 1.10059 48.5693 0 59.0596l-0.889648 8.7002l-3.28027 4.51953c-5.85938 8.08008 -5.7998 7.75 -6.21973 33.2705c-0.100586 6.07031 -0.379883 11.5 -0.629883 12.0596
c-0.830078 1.87012 -3.0498 2.66016 -8.54004 3.05078c-8.86035 0.619141 -11 1.89941 -23.8506 14.5498c-6.14941 6 -12.3398 12 -13.75 13.1895c-2.80957 2.41992 -2.79004 2 -0.55957 9.62988l1.34961 4.65039l-1.68945 3c-0.630859 1.17676 -1.79102 3 -2.58984 4.07031
c-1.33008 1.50977 -5.5 10.8896 -6 13.4893c-0.0859375 0.307617 -0.155273 0.816406 -0.155273 1.13574c0 0.868164 0.458984 2.10645 1.02539 2.76465c2.22949 2.86035 3.39941 5.67969 4.44922 10.7305c2.33008 11.1895 7.74023 26.0898 10.6006 29.2197
c3.17969 3.46973 7.7002 1 9.41016 -5c1.33984 -4.79004 1.36914 -9.79004 0.0996094 -18.5498c-0.445312 -3.05176 -0.893555 -8.02832 -1 -11.1104c0 -4 0.19043 -4.69043 2.25 -7.38965c3.33008 -4.37012 7.72949 -7.41016 15.2002 -10.5205
c1.41992 -0.591797 3.53418 -1.86914 4.71973 -2.84961c11.1699 -10.7207 18.6201 -16.1807 22.9502 -16.8506c5.17969 -0.799805 8 -4.54004 10 -13.3896c1.30957 -5.65039 4 -11.1396 5.45996 -11.1396c0.994141 0.203125 2.48633 0.826172 3.33008 1.38965
c2 1.21973 2.25 1.73047 2.25 4.17969c-0.21875 4.96191 -1.11523 12.9541 -2 17.8398c-0.370117 1.66016 -0.780273 4.06055 -0.930664 5.35059c-0.149414 1.29004 -0.609375 3.84961 -1 5.68945c-2.5498 11.1602 -3.64941 15.46 -4.09961 16
c-1.5498 2 -4.08008 10.2002 -4.92969 15.9209c-1.64062 11.1094 -4 14.2295 -12.9102 17.3896c-4.0791 1.50293 -10.0547 5.0332 -13.3398 7.87988c-1.15039 1 -4 3.21973 -6.35059 5.05957c-2.34961 1.84082 -4.40918 3.53027 -4.59961 3.76074
c-0.701172 0.606445 -1.90625 1.50293 -2.69043 2c-6.23926 4.21973 -8.83984 7 -11.2598 12l-2.43945 5l-0.220703 13l-0.219727 13l6.91016 6.5498c3.9502 3.75 8.47949 7.34961 10.5898 8.42969c3.30957 1.69043 4.4502 1.89062 11.3701 2
c8.53027 0.19043 10.1201 0 11.6602 -1.55957c1.54004 -1.56055 1.35938 -6.40039 -0.290039 -8.5c-0.501953 -0.564453 -1.10156 -1.60352 -1.33984 -2.32031c0 -0.580078 -2.61035 -4.91016 -5.41992 -9c-0.879883 -1.80371 -1.94141 -4.85938 -2.37012 -6.82031
c20.4395 -13.3896 21.5498 -3.76953 14.0693 -29l11.3604 -2.51953c3.11035 8.66016 6.46973 17.2598 8.61035 26.2197c0.290039 7.62988 -12 4.19043 -15.4004 8.68066c-2.33008 5.92969 3.12988 14.1797 6.05957 19.1992c1.60059 2.33984 6.62012 4.7002 8.82031 4.15039
c0.879883 -0.219727 4.16016 0.349609 7.37012 1.28027c2.04395 0.641602 5.42676 1.39453 7.5498 1.67969c1.69336 0.183594 4.38184 0.760742 6 1.29004c3.65039 1.11035 4.5 1.16992 6.35059 0.400391c1.56738 -0.539062 4.1748 -1.14844 5.81934 -1.36035
c1.74902 -0.236328 4.43652 -1.0918 6 -1.91016c1.30762 -0.765625 3.54785 -1.73828 5 -2.16992c2.51074 -0.679688 3 -0.570312 7.05078 1.66992l4.34961 2.40039l10.7402 0.389648c10.4395 0.400391 10.8096 0.469727 15.2598 2.67969l4.58008 2.32031l2.45996 -1.42969
c1.75977 -1 3.13965 -2.73047 4.84961 -6c2.36035 -4.51074 2.37988 -4.58008 1.37012 -7.37012c-0.879883 -2.44043 -0.889648 -3.2998 -0.0996094 -6.39062c0.435547 -1.68164 1.37695 -4.3291 2.09961 -5.90918c0.535156 -1.04785 1.12207 -2.83984 1.31055 -4
c0.30957 -4.33008 0 -5.30078 -2.41016 -6.91992c-2.16992 -1.4707 -7 -7.91016 -7 -9.34082c-0.206055 -0.859375 -0.685547 -2.2041 -1.07031 -3c-5 -11.5098 -6.75977 -13.5596 -14.2598 -17c-9.2002 -4.19922 -12.2998 -5.18945 -16.21 -5.18945
c-3.10059 0 -4 -0.25 -4.54004 -1.25977c-0.972656 -1.19629 -2.80566 -2.8584 -4.08984 -3.70996c-1.53223 -1.02344 -3.49512 -3.16504 -4.37988 -4.78027c-0.411133 -1.04004 -1.52734 -2.34375 -2.49023 -2.91016
c-0.78125 -0.321289 -1.87891 -1.08789 -2.4502 -1.70996c-1.83496 -1.61133 -4.9707 -4.02148 -7 -5.37988c-3.33008 -2.33984 -6.87012 -5 -7.87012 -6c-0.560547 -0.604492 -1.62695 -1.36621 -2.37988 -1.7002c-0.697266 -0.314453 -1.65137 -1.05273 -2.12988 -1.65039
c-1.31055 -1.38965 -1.49023 -2.10938 -1.13965 -4.59961c0.255859 -1.65527 0.892578 -4.29004 1.41992 -5.87988c1.31934 -3.7998 1.30957 -7.86035 0 -10.5703c-1.31055 -2.70996 -0.890625 -6.64941 1.34961 -9.58984c2 -2.62988 2.16016 -4.55957 0.709961 -8.83984
c-0.587891 -2.27344 -1.06445 -6.02344 -1.06445 -8.37109c0 -0.148438 0.00195312 -0.390625 0.00488281 -0.539062c0 -4.87988 0.219727 -6.28027 1.45996 -8.37988c1.23926 -2.09961 1.81934 -2.48047 3.23926 -2.32031c2 0.230469 2.30078 1.0498 4.70996 12.1201
c2.18066 10 3.70996 11.9199 13.7607 17.0801c2.93945 1.50977 7.45996 4 10 5.44043c2.54004 1.43945 6.79004 3.68945 9.37012 4.90918c4.99414 2.18652 11.8125 7.41504 15.2197 11.6709c7.10938 8.78906 10 16.2197 12.8496 33.2998
c0.298828 2.31445 1.58008 5.77832 2.86035 7.72949c1.19434 1.86133 2.48828 5.13574 2.88965 7.31055c1 5.2998 2.85059 9.08008 5.58008 11.5098c4.7002 4.17969 6 1.08984 4.58984 -10.8701c-0.459961 -3.86035 -1.09961 -10.3301 -1.43945 -14.3799l-0.610352 -7.36035
l4.4502 -4.08984l4.4502 -4.08984l0.109375 -8.41992c0.0605469 -4.62988 0.470703 -9.53027 0.919922 -10.8896l0.820312 -2.4707l-6.42969 -6.2793c-8.54004 -8.33008 -12.8799 -13.9307 -16.7598 -21.6104c-1.77051 -3.49023 -3.74023 -7.11035 -4.38086 -8
c-2.17969 -3.11035 -6.45996 -13 -8.75977 -20.2598l-2.29004 -7.2207l-7 -6.48926c-3.83008 -3.57031 -8 -7.25 -9.16992 -8.16992c-3.0498 -2.32031 -4.25977 -5.15039 -4.25977 -10c-0.00683594 -0.166992 -0.0126953 -0.438477 -0.0126953 -0.605469
c0 -1.94336 0.717773 -4.9248 1.60254 -6.65527c0.660156 -1.29688 1.59668 -3.45996 2.08984 -4.83008c0.290039 -0.875 0.993164 -2.16992 1.57031 -2.88965c1.40039 -1.58984 1.91992 -16.1201 0.830078 -23.2197c-0.679688 -4.48047 -3.62988 -12 -4.7002 -12
c-1.79004 0 -4.05957 -9.27051 -5.07031 -20.7402c-0.179688 -2 -0.620117 -5.94043 -1 -8.7002s-1 -10 -1.34961 -16.0498c-0.770508 -12.2197 -0.19043 -18.7705 2 -23.1504c3.41016 -6.68945 0.519531 -12.6895 -11 -22.8398l-4 -3.49023l0.0703125 -5.18945
c0.0439453 -2.4834 0.554688 -6.45703 1.13965 -8.87012c4.61035 -16 4.73047 -16.9199 4.37988 -37.1299c-0.459961 -26.4004 -0.259766 -40.2705 0.629883 -44.1504c0.410156 -1.91406 0.893555 -5.05078 1.08008 -7c0.169922 -2 0.660156 -5.33008 1.08008 -7.35938
c0.469727 -2.26074 0.780273 -11 0.790039 -22.7402v-19.0605l-1.80957 -2.62988c-2.70996 -3.91016 -15.1104 -13.54 -15.4902 -12.29zM261.8 -18.7803c-0.179688 0.299805 -0.330078 6.87012 -0.330078 14.5898c0 14.0605 -0.889648 27.54 -2.25977 34.4502
c-0.400391 2 -0.80957 9.7002 -0.900391 17.0605c-0.149414 11.9297 -1.39941 24.3701 -2.63965 26.3799c-0.660156 1.06934 -3 17.6602 -3 21.2998c0 4.23047 1 6 5.28027 9.12988s4.85938 3.13965 5.47949 0.719727c0.280273 -1.09961 1.4502 -5.61914 2.60059 -10
c3.92969 -15.1191 4.13965 -16.2695 4.0498 -21.7393c-0.0996094 -5.78027 -0.129883 -6.12988 -1.74023 -17.7305c-1 -7.07031 -1.16992 -12.3896 -1 -28.4297c0.169922 -19.4004 -0.639648 -35.7305 -2 -41.2705c-0.709961 -2.7793 -2.7998 -5.47949 -3.42969 -4.42969z
M190.8 18.7998c-0.638672 2.95215 -1.41406 7.78613 -1.72949 10.79s-1.09082 7.83789 -1.73047 10.79c-0.433594 1.76758 -0.880859 4.6748 -1 6.49023c-0.30957 3.18945 -0.910156 7.45996 -1.33008 9.47949c-1 4.79004 -3.34961 19.3506 -3.41992 21.0703
c0 0.740234 -0.339844 4.0498 -0.700195 7.36035c-0.669922 6.20996 -0.839844 27.6699 -0.219727 28.29c1 1 6.62988 -2.76074 11.3301 -7.43066l5.28027 -5.25l-0.450195 -6.46973c-0.25 -3.55957 -0.599609 -10.2295 -0.780273 -14.8301
c-0.179688 -4.59961 -0.490234 -9.87012 -0.669922 -11.71s-0.610352 -9.36035 -0.939453 -16.7197c-0.790039 -17.4102 -1.94043 -31.29 -2.65039 -32c-0.101562 -0.107422 -0.302734 -0.193359 -0.450195 -0.193359c-0.208008 0 -0.454102 0.149414 -0.549805 0.333008
h0.00976562zM103.62 285.39c21.0703 -12.79 17.8398 -14.1494 28.4902 -17.6592c13 -4.29004 18.8701 -7.13086 23.1494 -16.8701c-43.6602 -36.1406 -69.0098 -57.8604 -76.71 -70.8604c-31 -52 -6 -101.59 62.75 -87.21c-14.1797 -29.2305 -78 -28.6299 -98.6797 4.90039
c-24.6797 39.9492 -22.0898 118.3 61 187.659v0.0400391zM314.41 106.39c56.6602 -6.87988 82.3203 37.7402 46.54 89.2305c0 0 -26.8701 29.3398 -64.2803 68c3 15.4502 9.49023 32.1201 30.5703 53.8203c89.2002 -63.5107 92 -141.61 92.46 -149.36
c4.2998 -70.6396 -78.7002 -91.1797 -105.29 -61.71v0.0195312z" />
    <glyph glyph-name="old-republic" unicode="&#xf510;" horiz-adv-x="496" 
d="M235.76 437.77c7.5 0.310547 15 0.280273 22.5 0.0908203c3.61035 -0.140625 7.2002 -0.400391 10.79 -0.730469c4.91992 -0.269531 9.79004 -1.03027 14.6699 -1.62012c2.93066 -0.429688 5.83008 -0.979492 8.75 -1.45996
c7.90039 -1.33008 15.6699 -3.28027 23.3906 -5.39941c12.2393 -3.4707 24.1895 -7.91992 35.7598 -13.21c26.5596 -12.2402 50.9395 -29.21 71.6299 -49.8809c20.0303 -20.0898 36.7197 -43.5498 48.8896 -69.1895c1.12988 -2.58984 2.44043 -5.10059 3.4707 -7.74023
c2.80957 -6.42969 5.38965 -12.9697 7.58008 -19.6299c4.13965 -12.3301 7.33984 -24.9902 9.41992 -37.8301c0.569336 -3.13965 1.04004 -6.2998 1.39941 -9.46973c0.549805 -3.83008 0.94043 -7.69043 1.18066 -11.5605
c0.829102 -8.33984 0.839844 -16.7295 0.769531 -25.0996c-0.0703125 -4.96973 -0.259766 -9.94043 -0.75 -14.8896c-0.240234 -3.38086 -0.509766 -6.76074 -0.979492 -10.1201c-0.390625 -2.7207 -0.630859 -5.45996 -1.11035 -8.16992
c-0.900391 -5.15039 -1.7002 -10.3105 -2.87012 -15.4102c-4.09961 -18.5 -10.2998 -36.5498 -18.5098 -53.6299c-15.7705 -32.8301 -38.8301 -62.1699 -67.1201 -85.1201c-14.3926 -11.7676 -39.8887 -27.3848 -56.9102 -34.8604
c-6.20996 -2.67969 -12.46 -5.25 -18.8701 -7.41016c-3.50977 -1.16016 -7.00977 -2.37988 -10.5703 -3.38965c-6.61914 -1.87988 -13.2891 -3.63965 -20.0391 -5c-4.66016 -0.910156 -9.34082 -1.73047 -14.0303 -2.48047c-5.25 -0.65918 -10.5 -1.43945 -15.79 -1.73926
c-6.69043 -0.660156 -13.4102 -0.839844 -20.1201 -0.810547c-6.82031 -0.0292969 -13.6504 0.120117 -20.4502 0.790039c-3.29004 0.230469 -6.57031 0.5 -9.83008 0.950195c-2.71973 0.389648 -5.45996 0.629883 -8.16992 1.11035
c-4.12012 0.719727 -8.25 1.37012 -12.3496 2.21973c-4.25 0.939453 -8.49023 1.88965 -12.6904 3.01953c-8.62988 2.16992 -17.0801 5.01074 -25.4102 8.13086c-10.4893 4.11914 -20.79 8.75 -30.6396 14.25c-2.13965 1.14941 -4.28027 2.28906 -6.34961 3.56934
c-11.2207 6.58008 -21.8604 14.1006 -31.9199 22.3398c-34.6807 28.4102 -61.4102 66.4307 -76.3506 108.7c-3.08984 8.74023 -5.70996 17.6504 -7.7998 26.6797c-1.48047 6.16016 -2.52051 12.4209 -3.58008 18.6602
c-0.400391 2.35059 -0.610352 4.73047 -0.950195 7.08984c-0.599609 3.96094 -0.75 7.96094 -1.16992 11.9404c-0.799805 9.46973 -0.709961 18.9902 -0.509766 28.4902c0.139648 3.50977 0.339844 7.00977 0.700195 10.5098
c0.30957 3.16992 0.459961 6.37012 0.919922 9.52051c0.410156 2.80957 0.649414 5.64941 1.16016 8.43945c0.699219 3.94043 1.2998 7.90039 2.11914 11.8203c3.43066 16.5195 8.4707 32.7295 15.2607 48.1797c1.14941 2.91992 2.58984 5.71973 3.85938 8.58984
c8.05078 16.71 17.9004 32.5605 29.4902 47.0605c20 25.3799 45.1006 46.6797 73.2705 62.4697c7.5 4.15039 15.1592 8.0498 23.0693 11.3701c15.8203 6.87988 32.4102 11.9502 49.3105 15.3799c3.50977 0.669922 7.04004 1.24023 10.5596 1.84961
c2.62012 0.470703 5.28027 0.700195 7.91016 1.08008c3.53027 0.530273 7.09961 0.680664 10.6504 1.04004c2.45996 0.240234 4.90918 0.360352 7.35938 0.509766zM244.4 413.36c-9.23047 -0.100586 -18.4307 -0.990234 -27.5703 -2.23047
c-7.2998 -1.08008 -14.5303 -2.59961 -21.71 -4.2998c-13.9102 -3.5 -27.4805 -8.33984 -40.46 -14.4199c-10.46 -4.99023 -20.5898 -10.7002 -30.1797 -17.2197c-4.18066 -2.9209 -8.40039 -5.80078 -12.3408 -9.03027
c-5.08008 -3.96973 -9.97949 -8.16992 -14.6797 -12.5898c-2.50977 -2.24023 -4.80957 -4.7002 -7.21973 -7.06055c-28.2207 -28.79 -48.4404 -65.3896 -57.5 -104.689c-2.04004 -8.44043 -3.54004 -17.0205 -4.44043 -25.6504
c-1.09961 -8.88965 -1.43945 -17.8496 -1.41016 -26.7998c0.110352 -7.13965 0.379883 -14.2803 1.2207 -21.3701c0.620117 -7.12012 1.87012 -14.1602 3.19922 -21.1797c1.07031 -4.65039 2.03027 -9.32031 3.33008 -13.9102
c6.29004 -23.3799 16.5 -45.7002 30.0703 -65.75c8.63965 -12.9805 18.7803 -24.9297 29.9805 -35.7705c16.2793 -15.8193 35.0498 -29.04 55.3398 -39.2197c7.2793 -3.51953 14.6602 -6.87012 22.2695 -9.62988c5.04004 -1.75977 10.0605 -3.57031 15.2197 -4.98047
c11.2607 -3.22949 22.7705 -5.59961 34.3906 -7.05957c2.91016 -0.290039 5.80957 -0.610352 8.71973 -0.900391c13.8203 -1.08008 27.7402 -1 41.54 0.430664c4.4502 0.599609 8.91992 0.989258 13.3496 1.7793c3.63086 0.670898 7.28027 1.25 10.8701 2.10059
c4.12988 0.979492 8.28027 1.91016 12.3604 3.07031c26.5 7.33984 51.5801 19.71 73.5801 36.1992c15.7803 11.8203 29.96 25.7607 42.1201 41.2803c3.25977 4.02051 6.16992 8.30957 9.12988 12.5498c3.38965 5.06055 6.58008 10.25 9.59961 15.54
c2.40039 4.44043 4.74023 8.91016 6.9502 13.4502c5.69043 12.0498 10.2803 24.6201 13.75 37.4902c2.58984 10.0098 4.75 20.1602 5.90039 30.4502c1.76953 13.4697 1.93945 27.0996 1.29004 40.6494c-0.290039 3.89062 -0.669922 7.77051 -1 11.6602
c-2.23047 19.0801 -6.79004 37.9102 -13.8203 55.7998c-5.9502 15.1299 -13.5303 29.6299 -22.6104 43.1299c-12.6895 18.8008 -28.2393 35.6807 -45.9697 49.8301c-25.0498 20 -54.4697 34.5498 -85.6504 42.0801c-7.7793 1.92969 -15.6895 3.33984 -23.6299 4.4502
c-3.90918 0.589844 -7.84961 0.820312 -11.7695 1.24023c-7.38965 0.569336 -14.8105 0.719727 -22.2197 0.580078zM139.26 364.47c13.2998 8.89062 28.0801 15.3799 43.2998 20.1807c-3.16992 -1.77051 -6.43945 -3.38086 -9.5293 -5.29004
c-11.21 -6.68066 -21.5205 -14.9004 -30.3799 -24.4902c-6.80078 -7.42969 -12.7607 -15.7305 -17.0107 -24.8896c-3.29004 -6.86035 -5.63965 -14.1904 -6.85938 -21.7109c-0.930664 -4.84961 -1.2998 -9.80957 -1.16992 -14.75
c0.129883 -13.6592 4.43945 -27.0791 11.29 -38.8193c5.91992 -10.2197 13.6299 -19.3301 22.3594 -27.2598c4.85059 -4.36035 10.2402 -8.09082 14.9502 -12.6006c2.25977 -2.18945 4.49023 -4.41992 6.42969 -6.91016c2.62012 -3.30957 4.89062 -6.98926 5.99023 -11.0996
c0.900391 -3.02051 0.660156 -6.2002 0.69043 -9.31055c0.0195312 -4.09961 -0.0400391 -8.19922 0.0292969 -12.2998c0.140625 -3.54004 -0.0195312 -7.08984 0.110352 -10.6299c0.0800781 -2.37988 0.0205078 -4.75977 0.0498047 -7.13965
c0.160156 -5.77051 0.0605469 -11.5303 0.150391 -17.2998c0.109375 -2.91016 0.0195312 -5.82031 0.129883 -8.74023c0.0302734 -1.62988 0.129883 -3.28027 -0.0302734 -4.91016c-0.910156 -0.120117 -1.81934 -0.179688 -2.72949 -0.160156
c-10.9902 0 -21.8799 2.62988 -31.9502 6.92969c-6 2.7002 -11.8105 5.89062 -17.0898 9.83008c-5.75 4.19043 -11.0898 8.95996 -15.79 14.3105c-6.53027 7.24023 -11.9805 15.3896 -16.6201 23.9502c-1.07031 2.0293 -2.24023 4.01953 -3.17969 6.12012
c-1.16016 2.63965 -2.62012 5.13965 -3.66992 7.81934c-4.05078 9.68066 -6.57031 19.9404 -8.08008 30.3105c-0.490234 4.43945 -1.09082 8.87988 -1.2002 13.3496c-0.700195 15.7305 0.839844 31.5498 4.66992 46.8203c2.12012 8.14941 4.76953 16.1797 8.30957 23.8301
c6.32031 14.1992 15.3398 27.1797 26.3008 38.1895c6.2793 6.2002 13.1299 11.8398 20.5293 16.6699zM314.63 384.59c2.74023 -0.740234 5.41016 -1.74023 8.08984 -2.67969c6.36035 -2.33008 12.6807 -4.83984 18.71 -7.95996
c13.1104 -6.44043 25.3105 -14.8105 35.8203 -24.9697c10.2002 -9.9502 18.7402 -21.6006 25.1396 -34.3408c1.28027 -2.75 2.64062 -5.45996 3.81055 -8.25977c6.30957 -15.0996 10 -31.2598 11.2295 -47.5703c0.410156 -4.54004 0.44043 -9.08984 0.450195 -13.6396
c0.0703125 -11.6396 -1.49023 -23.25 -4.2998 -34.5303c-1.96973 -7.26953 -4.34961 -14.4893 -7.86035 -21.1797c-3.17969 -6.63965 -6.67969 -13.1602 -10.8398 -19.2402c-6.93945 -10.4697 -15.5996 -19.8701 -25.8203 -27.2197
c-10.4795 -7.63965 -22.6396 -13.0195 -35.3994 -15.3799c-3.50977 -0.69043 -7.08008 -1.08008 -10.6602 -1.20996c-1.84961 -0.0605469 -3.71973 -0.160156 -5.55957 0.0996094c-0.280273 2.15039 0 4.31055 -0.0107422 6.45996
c-0.0292969 3.73047 0.140625 7.4502 0.100586 11.1699c0.189453 7.02051 0.0195312 14.0508 0.209961 21.0703c0.0292969 2.37988 -0.0302734 4.75977 0.0292969 7.13965c0.170898 5.07031 -0.0390625 10.1406 0.140625 15.21
c0.0996094 2.99023 -0.240234 6.04004 0.509766 8.95996c0.660156 2.5 1.78027 4.86035 3.08984 7.08008c4.45996 7.31055 11.0605 12.96 17.6807 18.2607c5.37988 4.17969 10.4697 8.76953 15.0195 13.8398c7.67969 8.37012 14.1699 17.8799 18.7803 28.2695
c2.5 5.93066 4.51953 12.1006 5.5498 18.46c0.860352 4.37012 1.05957 8.83008 1.00977 13.2705c-0.0195312 7.84961 -1.39941 15.6494 -3.63965 23.1699c-1.75 5.72949 -4.27051 11.1797 -7.08984 16.4502c-3.87012 6.92969 -8.65039 13.3096 -13.96 19.1992
c-9.94043 10.8506 -21.75 19.9404 -34.6006 27.1006c-1.84961 1.01953 -3.83984 1.82031 -5.62988 2.96973zM213.83 326.14c0.979492 1.18066 1.99023 2.33008 3.12012 3.37988c-0.610352 -0.929688 -1.27051 -1.80957 -1.9502 -2.67969
c-3.09961 -3.87988 -5.54004 -8.30957 -7.03027 -13.0596c-0.870117 -3.27051 -1.67969 -6.60059 -1.72949 -10c-0.0703125 -2.52051 -0.0800781 -5.07031 0.319336 -7.57031c1.13086 -7.62988 4.33008 -14.8496 8.77051 -21.1201c2 -2.7002 4.25 -5.26953 6.91992 -7.33008
c1.62012 -1.26953 3.53027 -2.08984 5.33984 -3.0498c3.11035 -1.67969 6.32031 -3.22949 9.07031 -5.47949c2.66992 -2.09082 4.5498 -5.33008 4.39941 -8.79004c-0.00976562 -73.6709 0 -147.341 -0.00976562 -221.021c0 -1.34961 -0.0800781 -2.7002 0.0400391 -4.04004
c0.129883 -1.47949 0.820312 -2.83008 1.46973 -4.14941c0.860352 -1.66016 1.78027 -3.34082 3.18066 -4.62012c0.849609 -0.770508 1.96973 -1.40039 3.14941 -1.24023c1.5 0.200195 2.66016 1.34961 3.4502 2.57031c0.959961 1.50977 1.67969 3.15918 2.28027 4.84961
c0.759766 2.12988 0.439453 4.41992 0.540039 6.62988c0.139648 4.03027 -0.0205078 8.06055 0.139648 12.0898c0.0302734 5.89062 0.0302734 11.7705 0.0605469 17.6602c0.139648 3.62012 0.0292969 7.24023 0.109375 10.8604
c0.150391 4.0293 -0.0195312 8.05957 0.140625 12.0898c0.0292969 5.99023 0.0292969 11.9795 0.0693359 17.9697c0.140625 3.62012 0.0205078 7.24023 0.110352 10.8604c0.139648 3.92969 -0.0205078 7.85938 0.139648 11.7803
c0.0302734 5.98926 0.0302734 11.9795 0.0605469 17.9697c0.160156 3.93945 -0.00976562 7.87988 0.189453 11.8193c0.290039 -1.43945 0.129883 -2.91992 0.220703 -4.37988c0.189453 -3.60938 0.419922 -7.22949 0.759766 -10.8398
c0.320312 -3.43945 0.439453 -6.88965 0.859375 -10.3193c0.370117 -3.10059 0.510742 -6.2207 0.950195 -9.31055c0.570312 -4.08984 0.870117 -8.20996 1.54004 -12.29c1.45996 -9.04004 2.83008 -18.1104 5.08984 -26.9902c1.13086 -4.81934 2.40039 -9.60938 4 -14.2998
c2.54004 -7.89941 5.7207 -15.6699 10.3105 -22.6201c1.72949 -2.63965 3.87012 -4.97949 6.09961 -7.20996c0.270508 -0.25 0.549805 -0.509766 0.879883 -0.709961c0.600586 -0.25 1.31055 0.0703125 1.7002 0.570312c0.709961 0.879883 1.16992 1.93945 1.7002 2.92969
c4.0498 7.7998 8.17969 15.5605 12.3398 23.3105c0.700195 1.30957 1.44043 2.62012 2.56055 3.60938c1.75 1.57031 3.83984 2.69043 5.97949 3.62988c2.87988 1.2207 5.90039 2.19043 9.03027 2.41992c6.58008 0.620117 13.1094 -0.75 19.5596 -1.84961
c3.69043 -0.580078 7.40039 -1.16992 11.1299 -1.41016c3.74023 -0.0996094 7.48047 -0.0498047 11.21 0.280273c8.55078 0.919922 16.9902 2.95996 24.9404 6.25c5.2998 2.24023 10.46 4.83008 15.3096 7.92969c11.46 7.20996 21.46 16.5703 30.04 27.0107
c1.16992 1.41992 2.25 2.89941 3.45996 4.2793c-1.19922 -3.24023 -2.66992 -6.37012 -4.15918 -9.47949c-1.25 -2.90039 -2.84082 -5.61035 -4.27051 -8.41992c-5.16016 -9.62988 -11.0195 -18.9102 -17.75 -27.5205
c-4.03027 -5.20996 -8.53027 -10.0498 -13.3301 -14.5703c-6.63965 -6.0498 -14.0703 -11.3691 -22.4297 -14.7598c-8.20996 -3.37012 -17.3105 -4.62988 -26.0898 -3.29004c-3.56055 0.580078 -7.01074 1.69043 -10.4102 2.87988
c-2.79004 0.970703 -5.39062 2.38086 -8.03027 3.69043c-3.42969 1.70996 -6.63965 3.80957 -9.70996 6.08008c2.70996 -3.06055 5.69043 -5.86035 8.7002 -8.61035c4.26953 -3.75977 8.74023 -7.30957 13.6299 -10.2295c3.98047 -2.4502 8.29004 -4.40039 12.8398 -5.51074
c1.45996 -0.369141 2.95996 -0.459961 4.4502 -0.599609c-1.25 -1.09961 -2.62988 -2.04004 -3.99023 -2.97949c-9.60938 -6.54004 -20.0098 -11.8604 -30.6895 -16.4307c-20.8604 -8.7002 -43.1699 -13.9697 -65.7402 -15.3398
c-4.66016 -0.240234 -9.32031 -0.360352 -13.9805 -0.360352c-4.97949 0.110352 -9.96973 0.130859 -14.9199 0.650391c-11.2002 0.759766 -22.29 2.73047 -33.1699 5.42969c-10.3496 2.70996 -20.5498 6.12012 -30.2998 10.5508
c-8.70996 3.85938 -17.1201 8.41992 -24.9902 13.79c-1.83008 1.30957 -3.74023 2.5293 -5.37012 4.0791c6.60059 1.19043 13.0303 3.39062 18.9902 6.48047c5.74023 2.86035 10.9902 6.66016 15.6299 11.0703c2.24023 2.18945 4.29004 4.58984 6.19043 7.08984
c-3.43066 -2.12988 -6.93066 -4.15039 -10.6201 -5.78027c-4.41016 -2.16016 -9.07031 -3.76953 -13.8105 -5.01953c-5.72949 -1.52051 -11.7393 -1.73047 -17.6094 -1.14062c-8.12988 0.950195 -15.8604 4.27051 -22.5098 8.98047
c-4.32031 2.93945 -8.2207 6.42969 -11.96 10.0596c-9.93066 10.1602 -18.2002 21.8105 -25.6602 33.8604c-3.94043 6.26953 -7.53027 12.75 -11.1201 19.2197c-1.0498 2.04004 -2.15039 4.0498 -3.17969 6.10059c2.84961 -2.9209 5.56934 -5.9707 8.42969 -8.88086
c8.99023 -8.96973 18.5596 -17.4395 29.1602 -24.4795c7.5498 -4.90039 15.6699 -9.23047 24.5596 -11.0303c3.11035 -0.729492 6.32031 -0.469727 9.46973 -0.80957c2.77051 -0.280273 5.56055 -0.200195 8.34082 -0.299805
c5.0498 -0.0605469 10.1094 -0.0400391 15.1592 0.15918c3.65039 0.160156 7.27051 0.660156 10.8906 1.09082c2.06934 0.25 4.10938 0.709961 6.13965 1.19922c3.87988 0.950195 8.11035 0.959961 11.8301 -0.609375c4.75977 -1.85059 8.44043 -5.64062 11.3799 -9.70996
c2.16016 -3.02051 4.06055 -6.2207 5.66016 -9.58008c1.16016 -2.43066 2.45996 -4.79004 3.5498 -7.26074c1 -2.23926 2.15039 -4.41992 3.41992 -6.51953c0.669922 -1.01953 1.40039 -2.15039 2.62012 -2.5498c1.06055 0.75 1.70996 1.91016 2.28027 3.03027
c2.09961 4.15918 3.41992 8.64941 4.88965 13.0498c2.02051 6.58984 3.78027 13.2695 5.19043 20.0195c2.20996 9.25 3.25 18.7197 4.54004 28.1299c0.55957 3.98047 0.830078 7.99023 1.30957 11.9707c0.870117 10.6396 1.90039 21.2695 2.24023 31.9395
c0.0800781 1.86035 0.240234 3.70996 0.25 5.57031c0.00976562 4.34961 0.25 8.68945 0.219727 13.0303c-0.00976562 2.37988 -0.00976562 4.75977 0 7.12988c0.0498047 5.06934 -0.200195 10.1396 -0.219727 15.21c-0.200195 6.60938 -0.709961 13.2002 -1.29004 19.7793
c-0.730469 5.88086 -1.5498 11.7803 -3.12012 17.5107c-2.0498 7.75 -5.58984 15.0293 -9.7998 21.8193c-3.16016 5.07031 -6.79004 9.87988 -11.0898 14.0303c-3.87988 3.86035 -8.58008 7.08008 -13.9404 8.4502c-1.5 0.410156 -3.05957 0.450195 -4.58984 0.639648
c0.0703125 2.99023 0.700195 5.93066 1.25977 8.85059c1.58984 7.70996 3.7998 15.2998 6.76074 22.5996c1.51953 4.03027 3.40918 7.90039 5.38965 11.7197c3.4502 6.56055 7.62012 12.79 12.46 18.46zM245.1 324.44
c0.350586 0.0595703 0.709961 0.119141 1.07031 0.189453c0.19043 -1.79004 0.0898438 -3.58008 0.0996094 -5.37012v-38.1299c-0.00976562 -1.74023 0.130859 -3.49023 -0.149414 -5.21973c-0.360352 0.0302734 -0.709961 0.0498047 -1.06055 0.0498047
c-0.949219 3.75 -1.71973 7.5498 -2.61914 11.3096c-0.380859 1.53027 -0.580078 3.09082 -1.07031 4.59082c-1.7002 0.239258 -3.42969 0.169922 -5.15039 0.199219c-5.05957 0.0107422 -10.1299 0 -15.1895 0.0107422
c-1.66016 0.00976562 -3.32031 -0.0898438 -4.98047 0.0292969c-0.0302734 0.390625 -0.259766 0.910156 0.160156 1.18066c1.28027 0.649414 2.71973 0.879883 4.05957 1.34961c3.43066 1.13965 6.88086 2.16016 10.3105 3.31055
c1.38965 0.479492 2.90039 0.719727 4.16016 1.54004c0.0400391 0.55957 0.0195312 1.12988 -0.0498047 1.67969c-1.23047 0.549805 -2.53027 0.870117 -3.81055 1.28027c-3.12988 1.0293 -6.29004 1.95996 -9.41016 3.01953c-1.79004 0.620117 -3.66992 1 -5.41016 1.79004
c-0.0292969 0.370117 -0.0693359 0.730469 -0.109375 1.08984c5.08984 0.19043 10.2002 -0.0595703 15.2998 0.120117c3.36035 0.129883 6.73047 -0.0800781 10.0898 0.0703125c0.120117 0.389648 0.259766 0.769531 0.370117 1.16016
c1.08008 4.93945 2.33008 9.8291 3.38965 14.75zM251.07 324.64c0.359375 -0.0498047 0.719727 -0.120117 1.08008 -0.199219c0.979492 -3.85059 1.72949 -7.76074 2.70996 -11.6104c0.359375 -1.41992 0.55957 -2.87988 1.0293 -4.27051
c2.53027 -0.179688 5.07031 0.0107422 7.61035 -0.0498047c5.16016 -0.120117 10.3301 -0.120117 15.4902 -0.0693359c0.759766 0.00976562 1.51953 -0.0302734 2.2793 -0.0800781c-0.0390625 -0.360352 -0.0693359 -0.720703 -0.0996094 -1.08008
c-1.82031 -0.830078 -3.78027 -1.25 -5.66992 -1.89062c-3.73047 -1.22949 -7.48047 -2.38965 -11.2197 -3.56934c-0.570312 -0.169922 -1.12012 -0.419922 -1.66992 -0.640625c-0.150391 -0.549805 -0.180664 -1.12012 -0.120117 -1.68945
c0.870117 -0.480469 1.81934 -0.810547 2.76953 -1.08984c4.87988 -1.52051 9.73047 -3.14062 14.6299 -4.60059c0.379883 -0.129883 0.780273 -0.269531 1.12988 -0.490234c0.400391 -0.269531 0.230469 -0.790039 0.150391 -1.17969
c-1.66016 -0.129883 -3.30957 -0.0302734 -4.96973 -0.0400391c-5.16992 -0.00976562 -10.3301 0.00976562 -15.5 -0.00976562c-1.61035 -0.0302734 -3.21973 0.0195312 -4.82031 -0.209961c-0.519531 -1.66992 -0.719727 -3.41992 -1.16992 -5.11035
c-0.94043 -3.56934 -1.51953 -7.24023 -2.54004 -10.7793c-0.360352 -0.0107422 -0.709961 -0.0205078 -1.05957 -0.0605469c-0.290039 1.73047 -0.150391 3.48047 -0.150391 5.21973v38.1299c0.0205078 1.78027 -0.0800781 3.58008 0.110352 5.37012zM65.0498 279.67
c1.12012 2.15039 2.08008 4.40039 3.37012 6.45996c-1.82031 -7.55957 -2.91016 -15.2695 -3.62012 -23c-0.799805 -7.70996 -0.849609 -15.4902 -0.540039 -23.2295c1.0498 -19.9404 5.54004 -39.8301 14.2305 -57.8809c2.99023 -5.98926 6.34961 -11.8291 10.5 -17.1094
c6.12012 -7.46973 12.5293 -14.7598 19.8398 -21.0898c4.7998 -4.10059 9.99023 -7.78027 15.54 -10.8008c3.26953 -1.64941 6.50977 -3.38965 9.93945 -4.67969c5.01074 -2.03027 10.1904 -3.60938 15.4209 -4.93945c3.8291 -0.959961 7.7793 -1.41016 11.5195 -2.70996
c5 -1.57031 9.46973 -4.61035 13.0303 -8.43066c4.92969 -5.22949 8.08984 -11.8701 10.2002 -18.6699c0.989258 -2.89941 1.58984 -5.91016 2.16992 -8.91992c0.149414 -0.75 0.219727 -1.51953 0.15918 -2.29004c-6.5 -2.78027 -13.2598 -5.05957 -20.2598 -6.17969
c-4.10938 -0.780273 -8.29004 -0.990234 -12.46 -1.08008c-10.25 -0.240234 -20.4697 1.75977 -30.1201 5.12012c-3.73926 1.41992 -7.48926 2.84961 -11.0293 4.71973c-8.06055 3.83984 -15.6406 8.7002 -22.46 14.46c-2.9209 2.5498 -5.83008 5.12988 -8.40039 8.03027
c-9.16016 9.83008 -16.2998 21.4102 -21.79 33.6494c-2.38965 5.55078 -4.61035 11.1807 -6.37012 16.96c-1.16992 3.94043 -2.36035 7.89062 -3.25977 11.9102c-0.75 2.94043 -1.21973 5.9502 -1.87012 8.91992c-0.459961 2.14062 -0.69043 4.32031 -1.03027 6.48047
c-0.849609 5.42969 -1.2793 10.9297 -1.33008 16.4297c0.110352 6.18066 0.25 12.3701 1.07031 18.5c0.400391 2.86035 0.669922 5.74023 1.15039 8.60059c0.979492 5.69922 2.13965 11.3691 3.70996 16.9297c3.08984 11.6504 7.47949 22.9502 12.6895 33.8398z
M428.78 286.11c1.09961 -1.66016 1.91016 -3.48047 2.7793 -5.26074c2.10059 -4.44922 4.24023 -8.89941 6.02051 -13.4893c7.61035 -18.7607 12.2998 -38.79 13.04 -59.0508c0.0195312 -1.75977 0.0703125 -3.51953 0.110352 -5.29004
c0.129883 -9.56934 -1.27051 -19.0898 -3.18066 -28.4492c-0.729492 -3.58984 -1.54004 -7.16992 -2.58008 -10.6904c-4.04004 -14.7197 -10 -29 -18.4102 -41.7803c-8.20996 -12.5693 -19.0098 -23.5498 -31.8398 -31.4092
c-5.72949 -3.59082 -11.79 -6.64062 -18.0498 -9.19043c-5.78027 -2.19043 -11.71 -4.03027 -17.7998 -5.11035c-6.40039 -1.0498 -12.9102 -1.51953 -19.4004 -1.22949c-7.91992 0.479492 -15.7793 2.07031 -23.21 4.84961
c-1.93945 0.799805 -3.93945 1.45996 -5.83984 2.33008c-0.209961 1.50977 0.25 2.99023 0.530273 4.45996c1.16016 5.74023 3.03027 11.3604 5.7002 16.5801c2.36914 4.50977 5.51953 8.65039 9.45996 11.9004c2.42969 2.0498 5.23926 3.60938 8.15918 4.83008
c3.58008 1.5 7.4707 1.96973 11.2402 2.83008c7.23047 1.70996 14.3701 3.92969 21.1504 7c10.3496 4.64941 19.71 11.3799 27.6494 19.46c1.59082 1.60938 3.23047 3.17969 4.74023 4.86914c3.37012 3.76074 6.70996 7.57031 9.85059 11.5303
c7.47949 10.0703 12.8193 21.5898 16.71 33.4805c1.58008 5.2998 3.20996 10.5996 4.20996 16.0498c0.629883 2.87012 1.04004 5.78027 1.51953 8.67969c0.870117 6.08984 1.58984 12.2207 1.67969 18.3799c0.120117 6.65039 0.140625 13.3203 -0.529297 19.9404
c-0.730469 7.99023 -1.87012 15.96 -3.70996 23.7803z" />
    <glyph glyph-name="phoenix-squadron" unicode="&#xf511;" horiz-adv-x="512" 
d="M96 384.62c46.4902 36.1299 105.55 56.0703 164.51 54.5703c29.5801 0.379883 59.1104 -5.37012 86.9102 -15.3301c-24.1299 4.62988 -49 6.33984 -73.3799 2.44922c-42.8701 -5.30957 -83.04 -27.1494 -111.83 -59.1797c5.66992 1 10.7803 3.66992 16 5.86035
c18.1396 7.87012 37.4902 13.2598 57.2305 14.8301c19.7393 2.12988 39.6396 0.429688 59.2793 -1.91992c-14.4199 -2.79004 -29.1201 -4.57031 -43 -9.59082c-34.4297 -11.0693 -65.2695 -33.1592 -86.2998 -62.6299c-13.7998 -19.71 -23.6299 -42.8594 -24.6699 -67.1299
c-0.349609 -16.4902 5.21973 -34.8096 19.8301 -44c7.01465 -4.23926 19.3594 -7.67969 27.5547 -7.67969c2.77539 0 7.23926 0.420898 9.96484 0.939453c15.4502 2.45996 30.0703 8.64062 43.6006 16.3301c11.5195 6.82031 22.6699 14.5508 32 24.25
c3.79004 3.2207 2.53027 8.4502 2.62012 12.79c-2.12012 0.339844 -4.37988 1.11035 -6.30078 -0.299805c-9.47656 -5.19531 -25.5244 -12.0811 -35.8193 -15.3701c-20 -6.16992 -42.1602 -8.45996 -62.1006 -0.779297c12.79 -1.73047 26.0605 -0.310547 37.7402 5.43945
c20.2305 9.71973 36.8105 25.2002 54.4404 38.7705c23.0107 17.7168 62.8379 42.4951 88.8994 55.3096c25.71 12 52.9404 22.7803 81.5703 24.1201c-15.6299 -13.7197 -32.1504 -26.5205 -46.7803 -41.3799c-14.5098 -14 -27.46 -29.5 -40.1094 -45.1807
c-3.52051 -4.59961 -8.9502 -6.93945 -13.5801 -10.1592c-18.8516 -12.6768 -42.0986 -39.6016 -51.8906 -60.1006c-9.33008 -19.6797 -14.5 -41.8496 -11.7695 -63.6494c1.93945 -13.6904 8.70996 -27.5908 20.8994 -34.9102c12.9004 -8 29.0508 -8.07031 43.4805 -5.10059
c32.7998 7.4502 61.4297 28.8906 81 55.8408c20.4404 27.5195 30.5195 62.1992 29.1602 96.3496c-0.520508 7.5 -1.57031 15 -1.66016 22.4902c8 -19.4805 14.8203 -39.71 16.6504 -60.8301c2 -14.2803 0.75 -28.7598 -1.62012 -42.9004
c-1.91016 -11 -5.66992 -21.5098 -7.78027 -32.4297c17.209 19.293 34.833 55.6123 39.3398 81.0703c1.24121 7.8584 2.24902 20.6953 2.24902 28.6514c0 21.957 -7.37305 55.999 -16.459 75.9883c20.7803 -32 32.3398 -69.5801 35.71 -107.48
c0.490234 -12.7295 0.490234 -25.5098 0 -38.2295c-2.37305 -28.7334 -15.6289 -72.5254 -29.5898 -97.75c-26.1201 -47.3398 -68 -85.6299 -117.19 -108c-78.29 -36.2305 -174.68 -31.3203 -248 14.6797c-32.9014 20.1289 -73.8711 64.3281 -91.4492 98.6602
c-12.291 24.2021 -23.6523 65.8301 -25.3604 92.9199v31.3398c3.92969 69.7402 40.8701 135.92 96 178.36zM318 304.29c4.54688 0.770508 11.7148 2.77734 16 4.47949c5 1.77051 9.24023 5.94043 10.3203 11.2207c-8.95996 -4.99023 -17.9805 -9.91992 -26.3203 -15.7002z
" />
    <glyph glyph-name="sith" unicode="&#xf512;" 
d="M0 416l118.75 -69.71l-11.5195 58.9004l91.0596 -69.8701c8.5 1.50977 17.0996 2.29004 25.71 2.29004s17.21 -0.770508 25.71 -2.29004l91.0596 69.8701l-11.5195 -58.9004l118.75 69.71l-69.71 -118.75l58.8604 11.5195l-69.8408 -91.0293
c3.04004 -17.0098 3.03027 -34.4404 0 -51.4502l69.8408 -91.0303l-58.8604 11.5205l69.71 -118.78l-118.75 69.71l11.5195 -58.8604l-91.0293 69.8408c-17.0098 -3.04004 -34.46 -3.04004 -51.4805 0l-91.0293 -69.8408l11.5195 58.8604l-118.75 -69.71l69.71 118.78
l-58.8604 -11.5205l69.8408 91.0303c-1.25488 7.04492 -2.27246 18.5693 -2.27246 25.7246c0 7.15625 1.01758 18.6807 2.27246 25.7256l-69.8408 91.0293l58.8604 -11.5195zM224 316.22c-31.7998 0 -63.6104 -12.0898 -87.8496 -36.3398
c-48.4902 -48.4902 -48.5 -127.2 0 -175.7c48.5 -48.4893 127.21 -48.5195 175.699 -0.0292969c48.4902 48.4893 48.5 127.199 0 175.699c-24.25 24.25 -56.0498 36.3701 -87.8496 36.3701zM224 279.56c22.4199 0 44.8301 -8.51953 61.9199 -25.6094
c34.1904 -34.1904 34.1797 -89.6904 0 -123.87c-34.1895 -34.1797 -89.6504 -34.1904 -123.84 0c-34.1904 34.1895 -34.1797 89.6895 0 123.87c17.0898 17.0898 39.5 25.6094 61.9199 25.6094z" />
    <glyph glyph-name="trade-federation" unicode="&#xf513;" horiz-adv-x="496" 
d="M248 439.2c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -43.5996c129.7 0 234.8 105.1 234.8 234.8s-105.1 234.8 -234.8 234.8s-234.8 -105.1 -234.8 -234.8s105.1 -234.8 234.8 -234.8zM403.1 284.9v-0.100586h-145.699
v-34.7998h83.2998v-47h-83.2998v-195.8h-48.8008v196.8h-117.699l-36.7002 46h155.1v81.7002h193.8v-46.7998zM329.8 239.8h-82.8994v56.2002h145v24.4004h-171.801v-80.6006h-143.899l20.0996 -23.8994h123.8v-197.4h26.8008v197.4h82.8994v23.8994zM168.5 308.8l22 9.2998
l-15.7998 -18.0996l15.7002 -18.0996l-22.2002 9.5l-12.2998 -20.5l2.09961 24l-23.2998 5.39941l23.5 5.40039l-2.10059 23.7998zM138.9 328.5l9.5 -10.2002l-13.8008 5.2998l-6.7998 -12.1992l0.799805 14.6992l-13.6992 2.7002l14.2998 3.7998l-1.7002 13.9004
l8 -12.4004l12.7002 5.90039zM304.3 183.3l-9.2998 -10.7998l9.40039 -10.7002l-13.1006 5.5l-7.2998 -12.2002l1.2002 14.2002l-13.9004 3.2002l13.9004 3.2002l-1.2998 14.2002l7.2998 -12.2002zM411.2 260.5l-15 -17.5996l15.0996 -17l-21.2002 8.7998l-11.5 -19.6006
l1.80078 22.9004l-22.2002 4.90039l22.2998 5.39941l-2.2002 22.7002l12 -19.5996zM248 418.1c125.3 0 226.9 -101.6 226.9 -226.899s-101.601 -226.9 -226.9 -226.9s-226.9 101.601 -226.9 226.9s101.601 226.899 226.9 226.899zM342.6 252h-83.1992v30.9004h145.699
v50.6992h-197.8v-81.5996h-157.399l40 -49.9004h116.699v-196.8h52.7002v195.7h83.2998v51zM248 404.8c-94.5996 0 -174.9 -61.5996 -202.9 -146.8h157.4v81.5996h199.1c-38.7998 40.2002 -93.2998 65.2002 -153.6 65.2002zM248 -22.2998c117.9 0 213.5 95.5996 213.4 213.5
c0 51.8994 -18.5 99.5 -49.3008 136.5v-50.7998h-145.6v-19.2002h83.2002v-62.7002h-83.2998v-195.8h-64.6006v196.8h-114.7l-43.7998 56.2998c-5.7998 -19.2998 -8.89941 -39.8994 -8.89941 -61.0996c0 -117.9 95.6992 -213.5 213.6 -213.5zM178.8 173l22.7002 9.2998
l-16.9004 -17.0996l15.8008 -18.7998l-21.5 10.7998l-13 -20.9004l3.69922 23.7998l-23.7998 5.90039l23.7002 3.90039l-1.7002 24.5z" />
    <glyph glyph-name="wolf-pack-battalion" unicode="&#xf514;" horiz-adv-x="512" 
d="M267.73 -23.5303l-11.4404 -21.1396l-11.4404 21.1104l-10.5596 -15.8408l-5.28027 12.3203l-5.2793 -7v-29.8301c-21.0605 7.91992 -21.1104 66.8604 -25.5107 97.21c-4.62012 31.8799 0.879883 92.8105 -81.3701 149.11c8.88086 23.5996 12 49.4297 2.64062 80.0498
c-27.8701 -3.33008 -53.9404 -10.5801 -63.3398 -54.0996l30.3496 -8.36035c-11.2002 -23.04 -17.0195 -46.7598 -13.2002 -72.1396l27.2705 7l6.16016 -33.4307l18.4697 7l8.7998 -33.4297l19.3496 7l-26.4297 -21.0596l-8.7998 28.1494l-24.6299 -5.28027l-7 35.6309
l-26.3906 -14.5205c-0.25 20.0205 -6.95996 58.0605 8.80078 84.4502l-26.3906 -5.28027c-3.99023 22.0703 2.37988 39.21 7.91992 56.7402l-22.4297 -9.67969c0.44043 25.0693 29.9404 56.79 61.5898 58.5098c20.2197 1.08984 56.7305 25.1602 54.1006 51.8994
c-1.95996 19.8701 -17.4502 42.6201 -43.1104 49.7002c43.9795 -36.5098 9.71973 -67.2998 -5.28027 -73.46c-4.39941 11.4404 -17.54 69.0801 0 130.2c40.4697 -22.8701 89.7002 -65.0996 93.21 -147.86l58.0605 -38.71l3.51953 -93.25l-107.33 59.8203l-7 -7
l17.5801 -3.50977l44 -38.71l15.8398 5.2793l28.1504 -49.2598l3.51953 -119.64l-21.1094 -15.8398l32.5498 -15.8398l32.5498 15.8398l-21.1094 15.8398l3.51953 119.64l28.0996 49.25l15.8408 -5.28027l44 38.7109l17.5898 3.51953l-7 7l-107.3 -59.7695l3.51953 93.25
l58 38.71c3.5498 82.6895 52.8096 124.92 93.2002 147.79c17.54 -61.1201 4.39941 -118.761 0 -130.2c-14.96 6.16016 -49.2803 36.9502 -5.28027 73.46c-25.6602 -7.08008 -41.1104 -29.8301 -43.1104 -49.7002c-2.63965 -26.7305 33.8809 -50.8096 54.1006 -51.9004
c31.6396 -1.70996 61.1396 -33.4297 61.5801 -58.5l-22.4307 9.68066c5.54004 -17.5303 11.9209 -34.6699 7.9209 -56.7402l-26.3906 5.28027c15.7998 -26.3906 9.0498 -64.4502 8.7998 -84.4502l-26.3896 14.5195l-7 -35.6299l-24.5898 5.24023l-8.7998 -28.1504
l-26.3906 21.1104l19.3506 -7l8.7998 33.3896l18.4697 -7l6.16016 33.4307l27.2803 -7.05078c3.7998 25.3809 -2.0498 49.1406 -13.2002 72.1406l30.3496 8.35938c-9.42969 43.5205 -35.4297 50.7305 -63.3398 54.1006
c-9.35938 -30.6201 -6.24023 -56.4404 2.64062 -80.0498c-82.25 -56.3008 -76.75 -117.221 -81.3701 -149.11c-4.40039 -30.3496 -4.4502 -89.29 -25.5107 -97.21v29.9502l-5.2793 7l-5.28027 -12.3203zM346.9 71.4697l-15.8408 10.5303
c7.4707 4.36035 13.7607 8.41992 19.3506 12.3203c-0.600586 -7.2207 -0.270508 -13.8398 -3.50977 -22.8398v-0.0107422zM375.05 120.73c-0.399414 -10.9404 -0.899414 -21.6602 -1.75977 -31.6709c-7.84961 1.86035 -15.5703 3.80078 -21.1104 7
c8.24023 7.94043 15.5508 16.3203 22.8701 24.6807v-0.00976562zM399.68 115.45l-23.75 6.16016c5.62695 7.16797 13.9014 19.3848 18.4707 27.2695c3.22949 -9.21973 5.2793 -20 5.2793 -33.4297zM403.2 196.39c19.4395 -12.8096 27.7998 -33.6592 29.9102 -56.2998
c-12.3203 4.53027 -24.6299 9.31055 -36.9502 10.5605c5.05957 12 6.64941 28.1396 7 45.7393h0.0400391zM401.44 242.13c18.5596 -2.62988 35.1494 -9.18945 45.7598 -28.1494c-14.2197 -4.36035 -24.7803 -5.9707 -44 -14.0801
c0.0800781 13.4092 -0.950195 27.9297 -1.75977 42.2295zM165.68 71.4805c-3.23926 9 -2.91016 15.5791 -3.50977 22.8398c5.58984 -3.90039 11.8799 -7.95996 19.3496 -12.3203zM137.53 120.74c7.31934 -8.36035 14.6299 -16.7402 22.8701 -24.6699
c-5.54004 -3.2002 -13.2607 -5.14062 -21.1104 -7c-0.860352 10.0098 -1.36035 20.7295 -1.75977 31.6699zM112.89 115.46c0 13.4297 2 24.21 5.28027 33.4297c4.56934 -7.88477 12.8438 -20.1016 18.4697 -27.2695zM109.37 196.4h0.0898438
c0.349609 -17.6006 2 -33.7402 7 -45.7402c-12.3701 -1.25 -24.6797 -6.03027 -37 -10.5605c2.11035 22.6406 10.4697 43.4902 29.9102 56.3008zM111.13 242.14c-0.80957 -14.2998 -1.83984 -28.8193 -1.75977 -42.2295c-19.2197 8.10938 -29.7803 9.71973 -44 14.0801
c10.6299 18.9502 27.2295 25.5195 45.7598 28.1494z" />
    <glyph glyph-name="hornbill" unicode="&#xf592;" horiz-adv-x="512" 
d="M76.3799 77.7002c0.182617 -1.37207 0.331055 -3.6084 0.331055 -4.99219c0 -20.8662 -16.9346 -37.8008 -37.7998 -37.8008s-37.7998 16.9346 -37.7998 37.8008c0 20.8652 16.9346 37.7998 37.7998 37.7998c1.49805 0 3.91602 -0.173828 5.39844 -0.387695
c-78.2793 111.35 52 190.53 52 190.53c-5.85938 -43 -8.23926 -91.1602 -8.23926 -91.1602c-67.3105 -41.4902 0.929688 -64.0605 39.8096 -72.8701c18.6445 -50.7129 77.6279 -91.9023 131.66 -91.9404c1.91992 0 3.76953 0.209961 5.66992 0.280273l0.110352 -18.8604
c-99.2207 -1.38965 -158.7 29.1406 -188.94 51.6006zM184.38 405.4c109.75 73.9395 187.601 -54.0605 187.601 -54.0605c-43.04 5.86035 -91.1807 8.24023 -91.1807 8.24023c-43.0996 70.0098 -65.7998 -6.58008 -73.7998 -44.29
c-48.4805 -19.5557 -87.8545 -77.8545 -87.8896 -130.13c0 -0.910156 0.139648 -1.78027 0.139648 -2.67969l-21.8398 -0.150391c-1.41016 100.43 29.8701 160.09 52.4199 190c-0.842773 -0.0683594 -2.21191 -0.123047 -3.05664 -0.123047
c-20.9482 0 -37.9502 17.001 -37.9502 37.9492c0 20.9492 17.002 37.9502 37.9502 37.9502c13.1934 0 28.5273 -9.65723 34.2266 -21.5566c2.04199 -4.25488 3.7002 -11.5381 3.7002 -16.2578c0 -1.35547 -0.143555 -3.54785 -0.320312 -4.8916zM488.57 271.23
c-4.21777 -2.00879 -11.3906 -3.63867 -16.0615 -3.63867c-0.886719 0 -2.32422 0.0625 -3.20898 0.138672c84.4502 -113.45 -49 -194.61 -49 -194.61c5.87012 43.0303 8.20996 91.1602 8.20996 91.1602c66.6006 40.96 0.640625 63.54 -38.46 72.54
c-19.3633 48.9775 -77.8232 88.7422 -130.49 88.7598c-2.75 0 -5.43945 -0.259766 -8.13965 -0.410156l-0.139648 22.5c93.6094 1.33008 151.72 -25.7998 183.45 -47.7402c-0.226562 1.52539 -0.40918 4.01465 -0.40918 5.55566c0 20.9434 16.9971 37.9404 37.9395 37.9404
c20.9434 0 37.9404 -16.9971 37.9404 -37.9404c0 -13.2236 -9.69043 -28.5703 -21.6309 -34.2549zM374.06 11.7598v-0.0595703c0.0917969 0.000976562 0.239258 0.000976562 0.330078 0.000976562c20.9375 0 37.9297 -16.9922 37.9297 -37.9297
s-16.9922 -37.9297 -37.9297 -37.9297c-13.1963 0 -28.5273 9.66211 -34.2197 21.5684c-1.76367 3.66602 -3.39453 9.93848 -3.63965 14c-111.98 -80.3398 -191.9 51 -191.9 51c43.0703 -5.87988 91.1904 -8.21973 91.1904 -8.21973
c41.3301 -67.1709 63.9199 0.540039 72.7695 39.4893c50.418 18.7646 91.3604 77.6543 91.3906 131.45c0 2.08008 -0.220703 4.08984 -0.300781 6.15039l19.5205 0.139648c1.28027 -89.9697 -23.71 -147.2 -45.1406 -179.66z" />
    <glyph glyph-name="mailchimp" unicode="&#xf59e;" 
d="M330.61 204.48c-2.50977 3.17969 -4.70996 8.31934 -5.9707 14.3193c-2.22949 10.6807 -1.98926 18.4102 4.24023 19.4199c6.23047 1.01074 9.25 -5.45996 11.4805 -16.1299c1.5 -7.17969 1.20996 -13.7803 -0.450195 -17.6094
c-1.27832 0.165039 -3.36133 0.299805 -4.65039 0.299805c-1.28809 0 -3.37207 -0.134766 -4.64941 -0.299805zM277.05 196c-4.45996 1.95996 -10.2598 4.13965 -17.2598 3.7002c-12.5996 -0.770508 -21.75 -7.21973 -22.5996 -3.48047
c-0.400391 1.83984 2.40918 4.87988 5.40918 7.06055c4.5791 3.35254 12.9014 6.07422 18.5762 6.07422c3.45312 0 8.84473 -1.07324 12.0342 -2.39453c8.63965 -3.7002 14.0098 -11.1504 12.1201 -13.0898c-1.08008 -1.12988 -3.81055 0.129883 -8.28027 2.12988z
M268.05 190.87c9.68066 1.14941 16.8604 -4.62988 15.4004 -6.85059c-0.629883 -1.00977 -2.02051 -0.829102 -4.94043 -0.489258c-1.55078 0.239258 -4.08301 0.433594 -5.65234 0.433594c-3.72656 0 -9.58105 -1.06738 -13.0674 -2.38379
c-4.04004 -1.62012 -4.30957 -1.15039 -5.20996 -0.810547c-1.53027 3.57031 4.40039 8.68066 13.4697 10.1006zM322.22 173.77c-3.40039 -6.91016 -17.7002 0.0703125 -14.2998 7c3.40039 6.93066 17.6797 -0.129883 14.2998 -7zM337.88 194.24
c7.69922 -0.149414 7.42969 -16.0605 -0.259766 -15.9307c-7.69043 0.130859 -7.40039 16.0605 0.259766 15.9307zM119.09 115.34c4.0293 0.910156 3.40039 -1.25 3.37012 -0.359375c0.256836 -0.317383 0.46582 -0.904297 0.46582 -1.3125
c0 -0.299805 -0.119141 -0.755859 -0.265625 -1.01758c-3.16016 -7.37012 -20.1904 -7.68066 -21.5801 9c-0.910156 10.8594 9.30957 21.0293 -2.28027 28.6191c-1.77734 1.17773 -4.95117 2.13281 -7.08301 2.13281c-3.84961 0 -8.67285 -2.62207 -10.7666 -5.85254
c-3.2998 -5.16016 -3.11035 -12.2002 -7.37988 -11.6299c-3.7207 0.540039 -3.70996 14.4805 5 24.0801c7.22949 8 25.9492 11.9297 35.0498 -5.54004c8.11035 -15.3896 -8.2002 -27.7695 -3 -35.7695c2.46973 -3.80078 7.14941 -2.66016 8.46973 -2.35059zM418.81 132.41
c6.44043 0 16.5605 -7.5 16.5605 -25.2705c0 -17.7695 -7.37012 -37.9092 -9.11035 -42.3799c-54.3896 -130.279 -264.56 -130.06 -322.29 3c-31.5293 -0.0400391 -64.1699 26.9805 -67.5293 60.3799c-0.256836 2.25195 -0.463867 5.91992 -0.463867 8.18652
c0 7.21289 2.04395 18.5537 4.56348 25.3135l-14.7598 12.5107c-67.5498 57.04 143.72 291.85 211.27 232.93c0.339844 -0.299805 22.9902 -22.5205 23.0498 -22.5703l12.5508 5.33008c59.2695 24.5303 107.359 12.6904 107.42 -26.4697
c0.0292969 -20.3604 -12.9404 -44.1006 -33.7305 -65.6504c26.1699 -24.2998 20.0205 -71.6094 21.5205 -83c7.19922 -2 30.6992 -7.62012 41.0996 -18.54c18.3604 -19.25 5.52051 -39.5801 3.07031 -43.25c4.20996 -11.2998 3.42969 -8.79004 6.7793 -20.5195z
M102.81 84.25c29.4502 -0.680664 38.6309 28.2002 34.0908 57.8398c-9.74023 62.9404 -90.1699 48.9805 -84 -12.3301c2.44922 -24.3594 27.0898 -44.8994 49.9092 -45.5098zM84.2998 198.45c19.3105 51.8096 51.54 99.5498 94.2002 132.399
c31.6504 26.4102 65.7998 45.3506 65.7998 45.3506s-18.3896 21.3193 -23.9395 22.8896c-34.1699 9.23047 -107.94 -41.6494 -155.051 -108.88c-19.0596 -27.21 -46.3096 -75.3604 -33.2998 -100.21c1.58984 -3 10.71 -10.9297 15.5898 -15
c8.18066 11.9102 21.54 20.5 36.7002 23.4502zM323.18 97.2998c2.58984 0.259766 0.560547 -2.53027 0.560547 -2.53027s-27.4004 -12.75 -71 0.740234c1.20996 -10.2295 11.1699 -14.8193 15.9395 -16.6699c31.4004 -12.21 86.6904 -2.58008 128.46 26
c0.850586 0.589844 1.41992 0 0.730469 -1c-28.9697 -41.3496 -128.73 -54.7598 -151.37 -21.3496c-12.0801 17.8301 -0.599609 43.8594 19.5498 41.1494c6.7998 -0.769531 53.7705 -8 100.48 13.6807c27.4893 12.7598 37.8701 26.79 36.3096 38.1602
c-0.447266 3.00293 -2.57031 7.16504 -4.74023 9.28906c-5 4.83008 -12.79 8.60059 -26 12.3105c-4.35938 1.22949 -7.31934 2.00977 -10.5098 3.05957c-5.67969 1.83008 -8.47949 3.33008 -9.10938 14c-0.280273 4.62988 -1.09082 20.9102 -1.38086 27.6299
c-0.519531 11.7607 -1.91992 27.8506 -11.9199 34.4902c-2.37305 1.51953 -6.58691 2.75195 -9.40527 2.75195c-1.1748 0 -3.05371 -0.229492 -4.19434 -0.511719c-5.69043 -0.969727 -9.06055 -4.00977 -13.2598 -7.50977
c-12.4404 -10.3701 -22.9502 -12.0605 -34.6406 -11.5605c-6.98926 0.290039 -14.3994 1.37988 -22.8799 1.87988l-5 0.290039c-19.5801 1 -40.5693 -15.9092 -44.0693 -39.9092c-4.86035 -33.4307 19.3291 -50.7002 26.3291 -60.8301
c0.912109 -1.0918 1.77246 -3.12598 1.9209 -4.54004c0 -1.94043 -1.25 -3.48047 -2.48047 -4.79004c-19.9805 -20.54 -26.3701 -53.1699 -18.8398 -80.3701c0.768555 -2.76562 2.35938 -7.12891 3.5498 -9.74023c17.7002 -41.2598 72.4902 -60.4795 126 -43
c5.81152 1.89844 14.9238 5.74219 20.3398 8.58008c9.78906 4.8418 23.7441 15.2852 31.1504 23.3096c14.2002 14.8408 22.6396 30.9707 25.9297 50.8408c2.81055 18.6191 -7.78027 18.7598 -11.4395 18.0996c-1.13477 6.94531 -4.32422 17.8223 -7.12012 24.2803
c-15.6299 -12.3506 -35.71 -20.9707 -51 -25.3506c-69.4004 -19.9102 -90.1904 6.35059 -96.4004 -13.8096c33.7705 -12.3701 69.5098 -7.07031 69.5098 -7.07031zM171.31 290.5l0.0605469 0.00976562c-0.0947266 -0.115234 -0.171875 -0.331055 -0.171875 -0.481445
c0 -0.418945 0.34082 -0.759766 0.759766 -0.759766c0.124023 0 0.308594 0.0546875 0.412109 0.121094c11.4199 8.30078 64.9502 42.7705 134.5 26.8301c0.860352 -0.189453 1.39941 1.29004 0.639648 1.7207c-11.3398 6.33984 -28.6895 10.6494 -41 10.7393
c-0.404297 0.00976562 -0.732422 0.345703 -0.732422 0.75c0 0.134766 0.0634766 0.332031 0.142578 0.44043c1.84668 2.41602 5.30078 5.88379 7.70996 7.74023c0.166992 0.126953 0.302734 0.401367 0.302734 0.611328c0 0.424805 -0.344727 0.770508 -0.770508 0.770508
c-0.0146484 0 -0.0380859 -0.000976562 -0.0517578 -0.00195312c-17.5205 -1.08008 -37.5107 -9.4707 -49 -17.2998c-0.107422 -0.0751953 -0.300781 -0.136719 -0.431641 -0.136719c-0.414062 0 -0.75 0.335938 -0.75 0.75
c0 0.0498047 0.00976562 0.12793 0.0214844 0.176758c0.899414 4.30957 3.72949 9.98926 5.18945 12.6494c0.0566406 0.0947266 0.102539 0.261719 0.102539 0.37207c0 0.402344 -0.327148 0.729492 -0.730469 0.729492
c-0.110352 0 -0.276367 -0.0449219 -0.37207 -0.101562c-18.4697 -9.4502 -39.0898 -26.2803 -55.8301 -45.6299z" />
    <glyph glyph-name="megaport" unicode="&#xf5a3;" horiz-adv-x="496" 
d="M214.5 238.4l33.4004 33.3994l33.3994 -33.3994v-66.4004l-33.2998 -33.2998l-33.5 33.5v66.2002zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM393.1 25.5996h0.100586v87.1006l-59.7002 59.7002v87.5996l-59.5 59.5
v75.5996l-26.0996 19.2002l-26.1006 -19.2002v-75.5996l-59.5 -59.5v-87.9004l-59.5 -59.5v-87l26.1006 -19.1992l26.0996 19.1992v65.5l33.5 33.4004l33.4004 -33.4004v-65.5l26.0996 -19.1992l26.2002 19.1992v65.5l33.3994 33.4004l33.4004 -33.4004v-65.5l26 -19.1992z
" />
    <glyph glyph-name="nimblr" unicode="&#xf5a8;" horiz-adv-x="384" 
d="M246.6 148.71c15.5703 0 27.1504 -11.46 27.1504 -27s-11.6201 -27 -27.1504 -27c-15.6992 0 -27.1494 11.5703 -27.1494 27s11.5498 27 27.1494 27zM113 121.75c0 15.6104 11.6797 27 27.1504 27c15.4697 0 27.1494 -11.46 27.1494 -27s-11.4697 -27 -27.1494 -27
c-15.4404 0 -27.1504 11.3096 -27.1504 27zM191.76 289c98.3701 0 177.76 -78.9102 177.76 -176.48c0 -97.5693 -79.6094 -176.52 -177.76 -176.52c-98.1494 0 -177.76 78.8701 -177.76 176.52v335.48l45.25 -227c30.2002 48.2305 97.75 68 132.51 68zM191.76 -19.1201
c73.2402 0 132.51 58.96 132.51 131.64c0 72.6807 -59.2393 131.54 -132.51 131.54c-73.2695 0 -132.51 -58.8994 -132.51 -131.59c0 -72.6895 59.2402 -131.59 132.51 -131.59z" />
    <glyph glyph-name="rev" unicode="&#xf5b2;" 
d="M289.67 173.11c0 -36.1943 -29.375 -65.5801 -65.5703 -65.5801c-36.1943 0 -65.5693 29.375 -65.5693 65.5693c0 36.1953 29.375 65.5703 65.5693 65.5703h0.0107422c36.1445 -0.0439453 65.5156 -29.415 65.5596 -65.5596zM429.22 178.16v-210.16h-210.16v0.110352
c-110.939 2.70996 -200.06 93.4092 -200.06 205c0 108.569 84.2998 197.319 191 204.569v38.3203l108.77 -62.7803l-108.77 -62.79v39.1201c-80 -7.16016 -143 -74.5498 -143 -156.43c0 -86.6201 70.4902 -157.12 157.11 -157.12s157.09 70.5 157.09 157.12
c-0.0224609 47.1709 -32.1934 106.235 -71.8105 131.84l45.3799 26.2002c39.8018 -32.8584 73.0977 -101.402 74.3203 -153h0.129883z" />
    <glyph glyph-name="shopware" unicode="&#xf5b5;" horiz-adv-x="512" 
d="M403.5 -7.41016c-36.0898 -26.8223 -101.875 -48.5908 -146.841 -48.5908c-0.181641 0 -0.477539 0.000976562 -0.65918 0.000976562c-137.19 0 -248 111 -248 248c0 137.19 111 248 248 248h0.211914c52.3994 0 126.538 -28.4482 165.488 -63.5
c0.643555 -0.585938 1.16602 -1.76855 1.16602 -2.63965c0 -1.9707 -1.59961 -3.56934 -3.57031 -3.56934c-0.125977 0 -0.330078 0.0126953 -0.456055 0.0292969c-15.2227 2.03223 -40.042 3.68164 -55.4004 3.68164
c-0.361328 0 -0.948242 -0.000976562 -1.30957 -0.00195312c-129.36 0 -222.399 -53.4697 -222.399 -155.35c0 -109 92.1299 -145.881 176.829 -178.73c33.6406 -13 65.4004 -25.3604 87 -41.5898c0.788086 -0.592773 1.42676 -1.87402 1.42676 -2.86035
c0 -0.985352 -0.638672 -2.2666 -1.42676 -2.85938zM503 214.91c0.578125 -6.2832 1.04688 -16.5039 1.04688 -22.8135c0 -25.8613 -7.62793 -66.4043 -17.0273 -90.4971c-0.495117 -1.2373 -1.98047 -2.24316 -3.31348 -2.24316
c-0.495117 0 -1.25 0.19043 -1.68652 0.423828c-29.4893 16.3594 -61.6094 28.3398 -92.6797 39.9297c-60.2803 22.4902 -112.34 41.8896 -112.34 84.4902c0 1.45996 -3.87988 53.6299 80.25 53.6299c50.8604 0 92.7197 -17.4805 144.48 -60.4805
c0.625 -0.530273 1.19336 -1.62305 1.26953 -2.43945z" />
    <glyph glyph-name="squarespace" unicode="&#xf5be;" horiz-adv-x="512" 
d="M186.12 104.66l157.22 157.2c38.5703 38.5898 101.13 38.5898 139.72 0c38.5908 -38.5801 38.5908 -101.13 0 -139.721l-119.25 -119.239l-0.0400391 -0.0400391c-19.2891 -19.2705 -50.5498 -19.25 -69.8193 0.0400391l154.149 154.14
c19.29 19.29 19.29 50.5703 0 69.8604s-50.5693 19.29 -69.8594 0l-157.181 -157.181c-9.64941 -9.64941 -25.29 -9.64941 -34.9395 0c-9.65039 9.65039 -9.65039 25.29 0 34.9404zM430.65 209.46c9.63965 -9.63965 9.63965 -25.2803 -0.0107422 -34.9297l-157.199 -157.2
c-38.5801 -38.5703 -101.141 -38.5703 -139.721 0l-0.0195312 0.0195312c-9.64062 9.65039 -9.62988 25.29 0.0195312 34.9307l0.0107422 0.00976562c9.64941 9.63965 25.2793 9.62988 34.9199 -0.00976562l0.0498047 -0.0498047
c19.29 -19.2607 50.5498 -19.2402 69.8193 0.0498047l157.2 157.18c9.64062 9.65039 25.2803 9.65039 34.9307 0zM168.66 122.13c-38.6006 -38.5801 -101.13 -38.5801 -139.73 0.00976562c-38.5801 38.5801 -38.5801 101.13 0 139.721l119.23 119.25l0.0195312 0.0195312
c19.3008 19.2803 50.5703 19.2705 69.8506 -0.0195312l-154.17 -154.17l-0.0302734 -0.0302734c-19.2803 -19.2998 -19.2598 -50.5605 0.0302734 -69.8398l0.00976562 -0.0107422c19.29 -19.29 50.5703 -19.2793 69.8496 0.0107422l157.21 157.18
c9.64062 9.63965 25.2705 9.63965 34.9102 0c9.64062 -9.65039 9.64062 -25.29 0 -34.9404zM81.3301 174.53c-9.64062 9.64941 -9.65039 25.29 0 34.9297l157.189 157.19c38.5908 38.5898 101.131 38.5898 139.721 0c9.64941 -9.64062 9.64941 -25.2803 0 -34.9307
c-9.64062 -9.64941 -25.2803 -9.64941 -34.9307 0l-0.0195312 0.0205078c-19.29 19.2793 -50.5596 19.2695 -69.8398 -0.0205078l-157.21 -157.189c-9.64062 -9.64062 -25.2705 -9.64062 -34.9102 0z" />
    <glyph glyph-name="themeco" unicode="&#xf5c6;" 
d="M202.9 439.57c9.89941 5.72949 26 5.81934 35.9492 0.209961l191.15 -107.63c10 -5.60059 18 -19.4404 18 -30.8604v-217.29c0 -11.4404 -8.05957 -25.29 -18 -31l-191.19 -108.74c-9.92969 -5.66016 -26 -5.56934 -35.8496 0.209961l-185.1 108.41
c-9.86035 5.78027 -17.8604 19.7402 -17.8604 31.1201v217.29c0 11.4404 8 25.3604 17.9102 31.0801zM125.5 239.74c-15.9404 0 -31.8896 -0.140625 -47.8301 -0.140625v-101.449h19.1299v29.8496h28.7002c49.71 0 49.5596 71.7402 0 71.7402zM265.64 139.45
l-30.7295 34.6396c37 7.50977 34.7998 65.2305 -10.8701 65.5098c-16.0898 0 -32.1699 0.140625 -48.2598 0.140625v-101.59h19.1299v33.9092h18.4102l29.5596 -33.9092h22.7598v1.2998zM224.05 221.77c23.3398 0 23.2598 -32.46 0 -32.46h-29.1299v32.46h29.1299z
M128.49 223.37c21.1797 0 21.1094 -38.8506 0 -38.8506h-32.3105v38.8408zM321.14 241.62c-68.46 0 -71 -105.8 0 -105.8c69.4805 0.00976562 69.4102 105.8 0 105.8zM321.14 224.23c44.1201 0 44.8008 -70.8604 0 -70.8604c-44.7998 0 -44.4297 70.8604 0 70.8604z" />
    <glyph glyph-name="weebly" unicode="&#xf5cc;" horiz-adv-x="512" 
d="M425.09 382.17c50.9102 0 87.5498 -35.1504 86.9199 -83.4697c0 -21.6201 -0.950195 -18.5498 -77.5 -227.2c-22.3799 -60.5703 -67.7695 -69.6699 -92.7402 -69.6699c-39.2393 0 -70.0391 19.46 -85.9297 54.29c-15.8896 -34.5205 -46.7002 -53.9805 -85.9297 -53.9805
c-24.9697 0 -70.3701 8.78027 -92.7402 69.3506c-72.9902 200.21 -77.1699 204.52 -77.1699 233.479c0 43.3105 38.5898 77.2002 87.54 77.2002c40.21 0 73.2803 -25.7295 83.6602 -64.3301c18.4795 58.0498 65.5 64.3301 85.2803 64.3301
c19.4492 0 66.7891 -6.26953 84.9492 -64.3301c10.3799 38.6006 43.7803 64.3301 83.6602 64.3301zM451.43 267.36c3.49023 11.1992 7.29004 19.3701 7.61035 27.2393c0 22.3906 -16.1602 35.71 -38.3301 35.71c-18.6904 0 -31.9902 -11.7998 -36.1104 -29.0498
l-44.0293 -139.819h-0.950195l-44.6602 136.79c-6.01953 19.9697 -16.4697 32.0791 -38.96 32.0791s-32.9404 -12.4092 -38.96 -32.0791l-44.6602 -136.79h-0.950195l-44.0293 139.819c-4.12012 17.25 -17.4199 29.0498 -36.1104 29.0498
c-22.4902 0 -38.3301 -13.0195 -38.3301 -29.3594c0 -10.5898 2.54004 -19.6699 7.91992 -34.5l64.9404 -175.23c7.91016 -21.4795 21.2197 -37.2197 46.2393 -37.2197c23.1201 0 37.0605 12.0996 44.0205 33.5996l39.2803 117.42h0.949219l39.2803 -117.42
c6.65039 -21.4893 20.5898 -33.8994 44.0303 -33.8994c25.0195 0 38.3203 15.7295 46.2402 37.2197z" />
    <glyph glyph-name="wix" unicode="&#xf5cf;" horiz-adv-x="640" 
d="M393.38 316.31c0 -13.0293 2.08008 -32.6895 -28.6797 -43.8291c-9.52051 -3.4502 -15.9502 -9.66016 -15.9502 -9.66016c0 31 4.71973 42.2197 17.4004 48.8594c9.75 5.11035 27.2295 4.62988 27.2295 4.62988zM277.58 280.77
c5.47949 26.3408 30.8799 38.3408 55.2998 35.2705l-65.5703 -247.93s-21.6396 -1.56055 -32.46 3.95996c-14.2197 7.25 -20.9893 12.8398 -29.5898 46.5693c-7.66992 30.0703 -29.1494 118.4 -31.1201 124.7c-4.30957 13.8105 -10.6396 14.9404 -15.3994 0
c-2.00977 -6.29004 -23.4502 -94.6299 -31.1201 -124.7c-8.61035 -33.7295 -15.3701 -39.3193 -29.5898 -46.5693c-10.8301 -5.52051 -32.46 -3.95996 -32.46 -3.95996l-65.5703 247.93c23.8604 3 49.7305 -8.5498 55.2803 -35.2705l34.2393 -132.659l28.4805 108.569
c7.76953 32.3506 21.0596 48.5303 48.4297 48.5303c27.6201 0 40.7402 -16.54 48.4307 -48.5303l28.4795 -108.569zM393.36 275.56v-8.97949l0.0195312 0.00976562v-150.27c-0.129883 -30.8301 -3.33008 -37.6807 -17.2598 -44.7803
c-10.8203 -5.52051 -27.3701 -3.42969 -27.3701 -3.42969v152.069c0 21.25 -1.95996 27.9404 13.1797 35.2002c6.19043 2.96973 11.96 5.25 17.9707 8.61035c9.35938 5.22949 13.46 11.5693 13.46 11.5693zM556.8 191.48l82.9902 -123.36s-35.9297 -4.62012 -53.3203 11.21
c-13.9102 12.6602 -23.7393 28.3398 -53.1396 70.7197c-0.5 0.770508 -6.25977 10.5205 -13.0703 0c-34.9297 -50.3496 -41.0195 -60.2598 -52.5098 -70.7197c-17.3799 -15.8301 -53.9502 -11.21 -53.9502 -11.21l82.9697 123.36l-83.1992 123.739
s35.1094 5.98047 52.5 -9.84961c13.3799 -12.1797 24.8896 -30.2402 54.1797 -72.4697c6.82031 -10.54 12.5996 -0.730469 13.0703 0c29.7695 42.9199 40.8799 60.3691 54.1797 72.4697c17.3896 15.8301 52.5 9.84961 52.5 9.84961z" />
    <glyph glyph-name="ello" unicode="&#xf5f1;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM391.84 154.8c2.48047 7.44043 -2.47949 15.71 -9.91992 17.3604c-7.43945 2.47949 -15.71 -2.48047 -17.3604 -9.91992
c-14.0498 -52.9102 -62 -90.1104 -116.56 -90.1104s-102.51 37.2002 -116.56 90.1104c-1.65039 7.43945 -9.9209 11.5693 -17.3604 9.91992c-7.44043 -1.65039 -11.5703 -9.91992 -9.91992 -17.3604c16.5303 -65.3096 76.0498 -111.6 143.84 -111.6
s127.31 46.29 143.84 111.6z" />
    <glyph glyph-name="hackerrank" unicode="&#xf5f7;" horiz-adv-x="512" 
d="M477.5 320c14.5 -25 14.4805 -230.92 -0.00976562 -256s-192.391 -128 -221.33 -128c-28.9404 0 -206.83 102.8 -221.32 128s-14.4102 230.79 0 256s192.351 128 221.32 128s206.84 -103.05 221.34 -128zM316.13 33.7803c3.95996 0 40.4404 35.7793 37.5605 38.6895
c-0.870117 0.839844 -8.82031 1.49023 -17.6904 1.83984c0 32.4004 -3 19.0508 0.679688 210.341c0.0703125 3.65918 -1.04004 5.37988 -4.5 5.37988c-11.0801 0.0693359 -22.1602 0.0195312 -33.2295 -0.0605469c-3.25977 -0.0292969 -4.31055 -1.80957 -4.20996 -5.2002
c1.58984 -48.8994 1.2002 -79.0898 1.2002 -83.6396h-80.2607c0.629883 25.7998 0.209961 79.6396 2.62988 105.39v3.16016c8.87012 0.350586 15.9004 0.970703 16.7705 1.83984c2.90039 2.91016 -34.3203 38.6904 -38.2705 38.6904
c-3.94922 0 -41.4092 -35.7695 -38.4893 -38.6904c0.879883 -0.839844 7.58984 -1.48926 17.2598 -1.83984v-3.16992c3.15039 -128.67 1.07031 -179.229 0.150391 -212.67c-0.130859 -4.58008 1.63965 -6.10938 5.73926 -6.10938
c10.1406 0.0292969 20.2803 -0.0800781 30.4102 -0.0800781c4.16016 -0.0605469 5.96973 1.39941 5.74023 5.93945c-1.83008 36.6797 -1.37012 65.7803 -1.37012 72.8799h79.9297c0 -2.41992 0.44043 -3.84961 0.44043 -5.84961
c-0.350586 -17.7305 -0.94043 -60.0898 -0.94043 -86.3203c-11.29 -0.349609 -16.6797 -0.959961 -17.5498 -1.83008c-2.91016 -2.91992 34 -38.6895 38 -38.6895z" />
    <glyph glyph-name="kaggle" unicode="&#xf5fa;" horiz-adv-x="320" 
d="M304.2 -53.5l1.39941 -7.59961c-0.5 -2 -2.5 -3 -6 -3h-66.8994c-4 0 -7.5 1.7998 -10.5 5.2998l-110.5 140.6l-30.7998 -29.2998v-109c0 -5 -2.5 -7.5 -7.5 -7.5h-51.9004c-5 0 -7.5 2.5 -7.5 7.5v497c0 5 2.5 7.5 7.5 7.5h51.9004c5 0 7.5 -2.5 7.5 -7.5v-306
l132.3 133.7c3.5 3.5 7 5.2998 10.5 5.2998h69.2002c7 0 7.89941 -7.7998 5.2998 -10.5l-139.8 -135.3z" />
    <glyph glyph-name="markdown" unicode="&#xf60f;" horiz-adv-x="640" 
d="M593.8 388.9c25.5 0 46.2002 -20.7002 46.2002 -46.1006v-301.6c0.0996094 -25.4004 -20.5996 -46.1006 -46.0996 -46.1006h-547.7c-25.5 0 -46.2002 20.7002 -46.2002 46.2002v301.5c0 25.4004 20.7002 46.1006 46.2002 46.1006h547.6zM338.5 87.4004h-0.200195v209.199
h-61.5l-61.5 -76.8994l-61.5 76.8994h-61.5v-209.199h61.7002v120l61.5 -76.9004l61.5 76.9004v-120h61.5zM473.8 84.2998l92.2002 107.7h-61.5v104.6h-61.5v-104.6h-61.5z" />
    <glyph glyph-name="neos" unicode="&#xf612;" horiz-adv-x="512" 
d="M415.44 -64h-95.1104l-108.21 154.54v-91.0996l-86.4297 -63.4404h-97.6904v482.18l40.4697 29.8203h108.05l123.74 -176.13v112.68l86.4307 63.4502h97.6895v-461.5zM38.7695 412.73v-460.73l72 52.8799v249.12l215.5 -307.64h84.79l52.3506 38.1699h-78.2705
l-316.14 450.47zM121.31 -53.8799l80 58.7803v101l-79.7598 114.399v-220.939l-72.5498 -53.25h72.3398zM80.6299 437.23l310.601 -442.57h82.3691v442.57h-79.75v-317.561l-222.939 317.561h-90.2803zM311 256.35l72 -102.81v278.53l-72 -53v-122.721z" />
    <glyph glyph-name="zhihu" unicode="&#xf63f;" horiz-adv-x="640" 
d="M170.54 299.87h122.68v-217.55h-49.5293l-42.0107 -26.3701l-7.70996 26.3701l-23.4297 0.00976562v217.54zM268.29 105.94v170.31h-72.8203v-170.31l11.9004 -0.0400391l5.08008 -17.4707l27.8994 17.5107h27.9404zM149.83 200.33
c7.5 0 7.58984 -23.6104 7.58984 -23.6104h-61.6504c-0.879883 -13.1201 -3.50977 -26.6895 -7.86914 -40.6699l14.6191 11.6201c8.73047 -8.75 29.2109 -32.8896 36.79 -41.8096c9.15039 -13.1006 1.24023 -39.9902 1.24023 -39.9902l-53.96 64.9395
c-12.6094 -48.3496 -35.5898 -69.25 -35.5898 -69.25c-10.0898 -8.96973 -30.5098 -15.75 -51 -9.89941c42.8301 33.2197 66.4502 75.2402 70.8496 125.1h-65.5801s3.82031 23.6201 15.5605 23.6201h52.2695c0.480469 6.56055 1.68066 62.9404 1.68066 73.4404h-28.8701
c-2.62988 -7.87012 -3.03027 -8.64062 -5.14062 -14.5303c-11.4697 -21.0303 -30.9492 -21.5703 -36.8398 -22.21c17.4902 34.9795 27.3105 69.2197 30.7002 78.1201c8.2002 21.5693 32.2705 21.5693 32.2705 21.5693c-5.25 -14.0098 -9.63086 -27.5498 -13.1201 -40.6699
h88.5c10.5498 0.25 8.58008 -22.3096 8.58008 -22.3096h-51.1602c0 -21.8701 -0.459961 -46.3604 -2.2002 -73.46h52.3301zM561.85 201.93l-19.2295 14.4307s30.8301 40.0498 36.8301 48.1992c8.72949 10.7402 27.3799 -4.05957 27.3799 -4.05957
s-24.1504 -32.9297 -44.9805 -58.5703zM411.76 261.02l0.00976562 0.0107422c8.99023 -8.25 34.6602 -45.8604 34.6602 -45.8604l-19.46 -13.7295c-1.59961 2.40918 -41.1201 57.4492 -41.1201 57.4492s16.9004 10.3799 25.9102 2.12988zM640 189.65
c0 0 0.950195 -23.79 -8.73047 -23.79h-122.359v-73.3203c0.780273 -28.0303 -15.3301 -45.3096 -44.8906 -45.3096c-9.84961 0 -16.1396 1.75977 -26.0195 6.56934c-12.9805 7.4502 -17.3203 17.8701 -19.3096 21.8398c15.6094 -0.65918 27.6094 -1.91992 41.6895 -1.80957
c13.29 -0.870117 24.4805 7.15039 24.4805 21.1201v70.9199h-107.94c-22.6895 0.540039 -25.5098 22.8496 -25.5098 22.8496h133.47v99.8105c-12.8301 0 -31.6797 -0.830078 -56.5098 -2.43066c-26.46 -0.80957 -35.8398 -2.58984 -49.1504 0.890625
c-8.16016 2.46973 -14.1797 10.7295 -15.7793 19.5498c67.1396 1.55957 232.359 18.0498 232.359 18.0498s20.1006 5.75977 23.1699 4.58008c12.8105 -6.25 0.589844 -33.4395 0.589844 -33.4395c-17.6396 -0.810547 -46.8896 -2.40039 -87.7695 -4.81055
c-10.4297 -0.799805 -18.04 -1.2002 -22.8496 -1.2002v-101c0.149414 0 111.279 0.930664 131.06 0.930664z" />
    <glyph glyph-name="alipay" unicode="&#xf642;" 
d="M377.74 416c38.6895 0 70.0898 -31.5703 69.9297 -70.2598v-234.41c-48.6104 16.7002 -99.6895 36.04 -148.62 52.7402c23.1406 44.2998 38.3506 90.9199 38.3506 90.9199h-88.7705v31.2402h109.45v19.0098h-109.44v50.4199h-50.9199v-50.4199h-109.439v-19.0098h109.439
v-31.2402h-92.0801v-16.7002h178.2s-9.91992 -30.25 -26.4502 -60.3398c-47.7793 14.71 -91.75 24.96 -127.13 24.96c-84.6396 0 -103.49 -42.4902 -99.5195 -81.5c3.30957 -31.0703 26.4502 -76.3701 97.04 -76.3701c64.4795 0 116.55 37.0303 148.62 81
c61.0098 -28.0996 125.64 -62.8203 171.6 -88.4404c-0.5 -38.5195 -31.7402 -69.5996 -70.2598 -69.5996h-307.48c-38.8496 0 -70.2598 31.4102 -70.2598 70.2598v307.48c0 38.8496 31.4102 70.2598 70.2598 70.2598h307.48zM47.2803 125.05
c-0.990234 17.5205 10.9102 50.5801 78.3594 50.5801c24.96 0 64.8105 -12.7295 109.44 -31.4102c-25.29 -33.2197 -65.7998 -72.8994 -117.87 -72.8994c-59.6797 0 -68.9404 33.5596 -69.9297 53.7295z" />
    <glyph glyph-name="the-red-yeti" unicode="&#xf69d;" horiz-adv-x="512" 
d="M488.23 206.3c2.49805 -3.35254 5.51465 -9.31152 6.76953 -13.2998c3.37793 -9.19922 7.36523 -24.5205 8.90039 -34.2002l-2.5 -0.5l-13 14.2998c-17.9004 -28.0996 -9.90039 -15.3994 -16.7002 -25.0996c0 -124.2 -101.3 -211.5 -223 -211.5
c-61.5 0 -113.9 20.2002 -157.5 60.2002c-64.5 60.8994 -64.9004 125 -64.9004 150.5c-0.5 1.7998 -0.700195 3.5 -1.2002 5.2002l-20.1992 -22.4004c-6.80078 43 25.6992 74.2998 33 80.7002c0.5 1 0.699219 2.2002 1.19922 3.2002l-28.7998 1l-3 3.39941
c8.5 3.5 25.2998 13.2998 40.2998 14.2998c6.30273 12.0684 18.7568 30.123 27.8008 40.3008c1.2998 6.39941 3.2998 14.1992 6.59961 25.7998l-7.59961 -4.7002l-1.7002 1.7002l1.7002 8.39941c8.87207 21.3857 29.7939 51.5811 46.6992 67.4004l-33 14.2998h3.7002
c20.9004 4.90039 33.2002 3.2998 49.2002 0c-2.5 4.10059 -5.40039 10.5 -8.40039 18.9004c-1.16699 3.20996 -2.11426 8.58691 -2.11426 12.0029c0 3.81152 1.1709 9.76855 2.61426 13.2969c8.90039 -7.40039 14.3008 -24.5996 15.2002 -27
c0.700195 3.59961 2.10059 21.2998 33.7002 45.5l1.83008 -0.5l-12 -44.2002c30 17.7002 63 21.9004 97.9004 11.7998c-12.7002 -12.1992 -24.3008 -28.8994 -42.5 -33c7.39941 -2.2998 28.6992 -9.69922 34.1992 -15.1992l-24.7998 7.09961
c6.5 -6 19.6006 -16.4004 25.1006 -25.0996c19.418 -0.893555 50.0615 -6.85254 68.3994 -13.3008l-0.5 0.5c29.4004 14.7002 37.7002 27.3008 74.7998 3c0 -30.1992 -2.2998 -23.3994 3 -29.7998c6.41602 5.42383 17.75 12.8154 25.3008 16.5
c13 6.40039 23.0996 4.7002 30.6992 -5.89941c11.8008 0 17.8008 -15.7002 18.4004 -27c14.7998 -2.90039 2.7002 -30.7002 2.5 -30.7002l-7.09961 -18.2002c7.7998 -7.7998 22.0996 -20.9004 31.6992 -44.7998zM398 336.8c-13.0996 8.90039 -22.7002 11.9004 -28.2998 8.5
c8.09961 -7.2002 13 -14.2998 13.5 -20.7002c1.2002 -7.59961 -2.2002 -14.7998 -10.6006 -21.8994l-4.19922 -3.40039c3.60059 -5.90918 7.36328 -16.2578 8.39941 -23.0996h2.5c-2.09961 13.8994 -2.5 11 0.700195 14.7998c11 -6.40039 14.9004 -14.5 16 -19.9004
c21.7998 10.1006 29.5 12.7002 54.7998 20.9004l-18.2002 -16c11.4004 0 25.6006 0.299805 46.5 -8.40039c7 24.3008 7.10059 20.7002 2.5 20.7002l-4.69922 -11.2998c-1.7002 10.5 -2.90039 18.9004 -3.40039 25.2998c-0.5 6.7002 -3.90039 9.60059 -9.2998 10.1006
c-0.00976562 -0.384766 -0.0175781 -1.00781 -0.0175781 -1.3916c0 -3.87012 0.769531 -10.0566 1.71777 -13.8086l-1.7002 -5.90039c-2.90039 10.6006 -5.90039 20.2002 -9.2998 27.7998c-9.7002 17.7002 -30.2002 -9.19922 -43 -11.2998
c3.72266 -0.207031 9.77051 -0.375977 13.5 -0.375977c3.72852 0 9.77637 0.168945 13.5 0.375977l-22.4004 -5.39941l3.40039 -4.7002c-5.5 0 -16.9004 -0.900391 -22.4004 17.2002zM358.4 346.9l-20.3008 -11.8008c11.3008 -7.59961 20.2002 -18.1992 27.8008 -31.1992
c6.39941 2.89941 10.0996 5.09961 11.7998 7.59961c2.5 2.7998 2.5 4.7002 3 7.09961c0.599609 1.30078 0.799805 2.7002 -3.40039 11.1006c-7.5 11.7998 -16.2002 15.2998 -18.8994 17.2002zM91 304.9c-7.7998 -24.1006 -11.7002 -49.4004 -13.2002 -74.6006l13.2002 -5
l1.2002 27c9.5 -16.3994 11.2002 -23.2998 12.2998 -28.7998c2.7998 2.09961 7.7002 7 22.5996 11.2998l1.2002 -1.7002l-7.59961 -10.5996c10.0996 3.5 19.5 3.5 28.2998 0.5l-10.5996 -8.40039c22.7998 -8.39941 26.5996 -7.59961 38.3994 -26.0996l-11.7998 1.2002
c34.9297 -20.5 66 -47.9004 141.2 -63.2002c15.5996 24.0996 14 21.0996 14 22.9004l0.200195 0.199219l-0.200195 0.200195c-0.700195 1.90039 -14.1006 16.6006 -18.2002 20.7002c7.2998 -1.7998 6 -0.900391 10.7998 -3.7002
c1.7002 -0.899414 -5.39941 5.40039 -21.8994 20.2002c16.5 -6.7002 27.5996 -15.5 33 -27.7998l1.69922 30.7002l-22.3994 17.6992l6.39941 5.90039c-7.2998 0 -31 3.7002 -49.1992 -16l-2.5 0.5c5.89844 12.1807 13.0664 32.7881 16 46
c1.61914 7.72656 2.96289 20.4053 3 28.2998c0 19.5 -4.7002 38.4004 -13.5 56.6006c-6.40039 13.5 -16.5 25.2998 -30 35.3994c-5.4707 4.09961 -14.7441 10.1475 -20.7002 13.5c3 0.700195 1 1.2002 -5.40039 1.2002c-6.39941 0.200195 -13 0.700195 -19.3994 1.2002v-3
c-8.67773 -1.375 -20.0127 -8.18457 -25.3008 -15.2002h-1.19922l-5.40039 -3.40039c-1.2002 2.90039 0 6.30078 4.2002 9.30078l10.5996 11.2998l-3.39941 -0.5l2 3.39941c-2.30078 0.200195 -4.2002 0.5 -6.2002 0.700195l-0.5 1.2002l2.5 1.7002
c2.2002 -0.200195 4.59961 -0.5 7.09961 -0.700195c2.52539 1.3457 6.89746 2.43848 9.75879 2.43848c1.18359 0 3.08301 -0.196289 4.24121 -0.438477l2.5 -1.2002l0.200195 -0.5c6.50488 0.421875 16.9883 1.7207 23.4004 2.90039
c20.6992 2.89941 36.6992 11.2998 48.5 24.7998l-21.1006 0.5c-25.7998 0.5 -49.3994 -5.40039 -71.2998 -18.9004l-2.5 2.5l0.5 4.7002l1.7002 7.10059c1.37695 7.08105 4.24414 18.415 6.39941 25.2998c-1.69922 -0.700195 -4.59961 -4.90039 -9.2998 -11.2998
c-4.7002 -6.40039 -8.39941 -13 -10.0996 -19.4004c-0.905273 -4.24512 -3.54785 -10.6514 -5.90039 -14.2998l-13.5 29l8.40039 -35.7998l-0.5 -1.7002h-0.015625c-4.51953 0 -11.6807 1.12012 -15.9844 2.5c-3.40039 0.700195 -10.6006 1.2002 -20.9004 1.2002
c0.5 0 -0.700195 0 -3.2002 -0.5c5.40039 -1.30078 13.5 -4.2002 24.8008 -8.40039l6.39941 1.2002c-4.2002 -3.40039 -10.8994 -10.1006 -20.2002 -19.4004c-9.39941 -8.89941 -20.1992 -26.0996 -32.5 -50.2002l4.2002 1.2002l10.1006 9.2998l-5.40039 -4.69922
l13 12.2998l-2.5 -3.40039c-5.09961 -7.59961 -8.09961 -12.2998 -9.2998 -15.2002zM367.5 -25.0996c8.2998 40.2998 3.59961 55.1992 -0.700195 89.5c-35.5 -11.8008 -20.2998 -6 -32 -10.8008l10.5 -14.1992l-1.2002 -1.2002c-20.1992 6 -23.1992 10.7998 -27.7998 15
c6 -22.2002 13.9004 -26.4004 29.5 -31.7002c-9.5 -9.59961 -25.3994 4 -34.3994 13l2.5 -23.5996l-4.2002 -3c-5 22.0996 -22 39.0996 -25.2998 39.0996c-44 -13 -79.1006 -5.7998 -113.9 10.5996c-1.59961 -0.399414 -70.5996 -18 -120.5 37.1006
c13.7002 -35 32.2998 -63.7002 71.2998 -82.6006c-4.13574 8.56934 -13.4102 20.4863 -20.7002 26.6006c0 0 0.700195 3.7002 1.2002 10.0996c19.4004 -19.3994 50.7002 -39.5 93.2002 -60.2002c-59.5996 24.5 -59.9004 24.8008 -69.0996 29l16 -20.6992
c-3 -1.30078 -6.7002 -0.5 -10.1006 1.19922c-10.3359 6.03809 -26.1943 17.1484 -35.3994 24.8008c1.89941 -2.2002 80.0996 -98.5 200.899 -74.3008c-43.0996 21.8008 -52.3994 52.4004 -66.5996 73.5l17.7002 -7.59961l-11.8008 23.0996
c20.1006 -27.7998 28.6006 -35 38.4004 -44.2998l-30 16.5c12.5996 -27.0996 33.7002 -47 63.5 -58.7998c2.90039 1.5 9.09961 -1.09961 59 23.9004zM482.8 189.3l8.93066 -12.7998l-12.3008 32.5c10.9004 0 10 -0.0996094 21.2002 -3.40039
c-6.72168 9.44824 -18.8184 23.7842 -27 32l-26.5996 23.1006l1.2002 3l23.5996 2.5c-9.00293 1.98535 -23.7871 3.86719 -33 4.2002l-17.7002 -0.5l-0.5 2.89941l14.7998 13l-41.7998 -20.2002l-12.2998 18.9004l3.40039 -16l-2.5 -1.2002l-5.90039 4.2002h-10.0996
l5.39941 -4.2002v-2l-13.5 -27.7998c-10.0996 -31.2002 -21.8994 -67.9004 -35.3994 -109.7l1.19922 16l-1.19922 -3v-0.5c-6.40039 -16 -13.6006 -29.5 -21.2002 -39.5996l9.2998 21.8994l-46.7002 -20.1992c11.7998 13.5 23.6006 19.3994 34.9004 18.8994
c-71.2002 11.4004 -106.2 41 -110.4 46c3.60059 -6.2002 13.2002 -17.7998 16 -40.0996l-1.7002 -1.2002c-4.2998 15.5996 -16.3994 46.5996 -55.7998 69.5996l23.6006 -2.5c-10.5 12.6006 -36.3008 17.8008 -40.8008 16l-2.5 2.5l8.40039 8.40039l-22.2998 -5.7998
l5.39941 13.5c-8.09961 -4.40039 -4.2998 -2.40039 -17 -8.90039l-1.69922 0.5c0.599609 0.600586 0.899414 -0.700195 -3 9.2998c-0.600586 -11 -0.400391 -8.59961 -1 -11.7998c-1.07324 -0.355469 -2.73145 -1.11719 -3.7002 -1.7002c-40 20.6006 -57.2002 11 -73 5.2002
c36.7998 -6 29.2998 -4 38.3994 -9.2998c-25.7998 -12.2002 -31.8994 -12.5996 -51.3994 -70.0996l22.2695 22.2998l2.5 -16.4004c13.4004 -58 68.7002 -92.5 126.4 -83.3994l-26.1006 22.3994l44.8008 -22.3994l-1.2002 -3c4.59961 -1.7002 9.2998 -3 13.5 -4.2002
c16.4727 -4.87598 43.7852 -8.83203 60.9648 -8.83203c8.94727 0 23.3887 1.08887 32.2354 2.43164l-32.5 21.2002c35.7998 -7 50.6992 -31.4004 56.7998 -39.5996l-7.60059 29l1.2002 2.5l19 -27.9004l-9.2998 26.5996l21.9004 -13.5h1.19922l-3.39941 4.2002
l7.09961 -4.7002l-14.2998 16l1.2002 3l7.59961 -7.09961c4.2998 1.2002 41.4004 10.5 80.9004 40.2998c47.8994 35.4004 68.0996 73.7998 71.5996 79.7002l-3 9.2998zM476.7 260.6l-18.2002 -1.19922l14.2998 -11.8008zM221.9 253.5
c2.69922 -5.09961 5.69922 -12.4004 18.3994 -18.7998c-7.5 -10.9004 -8.2998 -10.5 -20.2002 -16c-7.59961 -7.7002 -13.5 -13.1006 -17.6992 -14.7998l7.09961 13c-4.61914 -1.69336 -12.3604 -3.06641 -17.2793 -3.06641c-2.08789 0 -5.45703 0.25293 -7.52051 0.566406
l-0.5 1.19922c19 2.10059 37.2002 9.40039 46.5 16c-4.10059 4.2002 -7.10059 11.3008 -8.7998 21.9004zM225.6 355.8c4.92578 -2.78809 11.3486 -8.9707 14.3008 -13.7998c14.6992 -24.0996 19.1992 -40.0996 11.2998 -47.7002
c-7.90039 -7.59961 -16.7998 -7.09961 -26.1006 3c-9.2998 10.1006 -13.5 23.7002 -11.7998 39.6006c1.7002 15.8994 5.90039 22.2998 12.2998 18.8994zM220.9 309.5c7.09961 -21.2998 33.3994 -23.0996 26.8994 4.90039c-3.89941 16.5 -8.7998 27.0996 -15.2002 32.5
c-6.59961 5.39941 -10.0996 6.69922 -11.2998 4.19922c-2.5 -2.89941 -3.5 -11.2998 -3 -24.7998c7.5 12.7998 11.6006 5.90039 12.5 4.7002l-0.5 -0.5c-0.799805 -1.7002 -2.59961 -3.09961 1.7002 -6.2002l1.2002 0.5v-4.7002
c-1.7998 -12.5 -6.90039 -12.7998 -12.2998 -10.5996zM175.9 315c-2.09375 0.388672 -4.49707 2.27051 -5.40039 4.2002c-3.5 8.5 0 21.2002 8.09961 21.2002c2 -0.5 3.7002 -1.7002 5.40039 -4.7002c-1.5 -0.400391 -4.7002 -4.7998 0.700195 -5.90039h0.5
c0 -13.7002 -7.7002 -15.0996 -9.2998 -14.7998zM216 365.1l-3.7002 2.40039l-0.5 2.5c18.2998 0 25.7998 -8.7998 28.2998 -14.2998c-6.0459 3.29688 -16.542 5.97266 -23.4297 5.97266c-0.737305 0 -1.93359 -0.0322266 -2.66992 -0.0732422l-0.5 3zM144.2 315.7
c1.59961 -1.60059 0.599609 -0.299805 4.89941 -6.60059c-25.3994 -4.69922 -23.1992 -12.2998 -30 -12.2998c0.300781 0.600586 7.10059 16 23.6006 16l-7.10059 7.60059c9.40039 0.5 15.2002 2.09961 19.9004 -5.90039c0.0175781 6.60938 1.31641 17.1826 2.90039 23.5996
c2 7.60059 3.69922 11.8008 5.39941 13.5c1 1.5 16.2998 15.7002 29 22.4004c2.05469 1.48047 5.77637 2.68262 8.30859 2.68262c1.48438 0 3.81055 -0.44043 5.19141 -0.982422c0.285156 -0.345703 0.515625 -0.989258 0.515625 -1.43652
c0 -0.0732422 -0.00683594 -0.191406 -0.015625 -0.263672l-13 -7.59961c7.60059 -11.8008 10.5 -25.3008 8.7998 -41.3008c-0.932617 -9.45898 -7.5625 -22.1377 -14.7998 -28.2998l2.90039 -4.7002c-30 2.2002 -24.7998 6.80078 -46.5 23.6006zM162.9 334.4
c-1.80078 -7.2002 -2.30078 -16 -3.10059 -26l5.40039 -6.40039l7.09961 -3.40039c2.01465 -0.384766 5.31445 -0.697266 7.36523 -0.697266c1.08887 0 2.85156 0.0888672 3.93457 0.197266c1 1.7002 3.5 4.2002 6.40039 7.60059c5 5.89941 7.90039 13.7998 8.40039 23.0996
c0.0703125 1.18262 0.126953 3.10449 0.126953 4.28906c0 5.92773 -1.40137 15.3408 -3.12695 21.0107c-3 8.10059 -5.90039 11 -10.1006 9.30078c-5.39941 -1.7002 -10.5996 -5.40039 -16 -11.8008c-3 -4.19922 -5.2002 -9.59961 -6.39941 -17.1992zM204.9 278.3
l-3.10059 -6.5c7.10059 4.2002 13.5 7.2002 19.4004 8.40039l7.09961 0.5l11.7998 -7.60059h-2.5c-8.7998 3.7002 -19.3994 1.2002 -30.6992 -7.59961c-0.5 -4.7002 1.69922 -14.7002 5.89941 -29.5l9.2002 0.5c-21.9004 -6.59961 -37.5996 -8.40039 -48.9004 -5.40039
c-24.8994 6.7002 -27.3994 23.6006 -27.5 24.1006c-1.47754 5.69238 -2.67676 15.0869 -2.67676 20.9688c0 3.53418 0.438477 9.23828 0.977539 12.7314c-6.40039 -0.5 -11 -4.2002 -15.2002 -10.6006c-2.90039 5.90039 -5.40039 8.7998 -5.90039 9.2998
c1.5 0.700195 12.2998 7.5 32.5 4.90039l0.5 -2.5l-5.89941 -1.2002c-0.100586 -0.399414 -1.90039 -29.5 18.8994 -24.7998c1.40039 0.299805 1.2998 -0.0996094 36.1006 14.2998z" />
    <glyph glyph-name="acquisitions-incorporated" unicode="&#xf6af;" horiz-adv-x="384" 
d="M357.45 -20.2002c2.2002 -14.2998 4.09961 -28.7002 6.59961 -43.7002h-337.1c-4 0 -6.10059 0.700195 -5.2998 5.7002c2.09961 12.9004 3.5 25.9004 5 38.7998c0.5 4.80078 2.2998 6.80078 7.59961 6.80078c118.1 -1 114.9 -0.300781 121.4 2.39941
c9.39941 4 14.8994 12.9004 14.8994 23.1006c-0.0996094 42.8994 -0.299805 85.8994 -0.200195 128.8c0 3.7998 -1.19922 5.89941 -4.59961 6.7998c-15.7002 3.90039 -31.2998 7.7002 -47.5996 11.7002c-5.30078 -12.2998 -10.4004 -24.4004 -15.7002 -36.7002
c1.7998 -3.2998 28.3994 -2.90039 35.2998 -2.90039v-27.5996h-114.3c1 8.59961 1.7002 16.7998 3.2002 24.9004c0.299805 1.39941 3.59961 3.09961 5.5 3.19922c8.39941 0.400391 16.8994 0.300781 25.3994 0.100586c4 0 5.90039 1.09961 7.60059 5.2002
c16.5996 40.6992 13.5 31.1992 67.2998 161c31.5 76.0996 33 76 32.5996 87.3994c-0.700195 18.6006 -25.3994 22.2998 -37.7002 22.1006c-30 -0.400391 -38.3994 0.5 -101.8 0.5c-7.2002 44.5 -4.2002 32.0996 -6.39941 45.2998c-0.700195 4.2002 1 5.2998 4.59961 5.2998
l339.1 -0.200195c-0.799805 -5.39941 -1.59961 -10.7998 -2.39941 -16.0996c-1.2998 -9.7002 -2.7998 -19.4004 -4 -29.2002c-0.299805 -2.90039 -1.2002 -4.2998 -4.2998 -4.2998c-20.6006 -0.100586 -41.2002 -0.100586 -61.8008 -0.5
c-18.6992 -0.400391 -37.5996 -0.299805 -56.1992 -2c-13.4004 -1.2002 -23.3008 -12.6006 -18.9004 -26.6006c8.59961 -27.0996 27.7002 -69.0996 36.5 -89.1992c65.7002 -154.2 61.4004 -157 84 -158.601c6.59961 -0.5 13.4004 -0.0996094 20.4004 -0.0996094
c1.2998 -9.40039 2.59961 -18 4 -27.5h-116v27c10.3994 0 20.3994 0.0996094 30.3994 -0.100586c3.5 0 5 0.700195 3.40039 4.40039c-4.40039 10.2998 -8.7002 20.5996 -13.2002 30.9004c-1.59961 3.69922 -4.09961 4.7998 -8.40039 3.5
c-12.3994 -3.60059 -24.7998 -6.7002 -37.2998 -9.7002c-4.2998 -1.10059 -6 -2.7998 -5.89941 -7.5c0.799805 -57.5 0.899414 -127.5 1 -129.101c0.399414 -12.5996 8.69922 -21.3994 21 -23.0996c0.899414 -0.200195 12.8994 -2.7998 112.699 -2.59961
c8.30078 0 8.40039 0.0996094 9.60059 -7.60059zM182.55 185.5c2.46484 -0.869141 6.58691 -1.5752 9.2002 -1.5752s6.73535 0.706055 9.2002 1.5752c13 4.2002 26.2998 7.7998 39.3994 11.7002c1.1123 0.512695 2.86035 1.45312 3.90039 2.09961
c-6.7002 17.4004 -13.0996 34.2002 -19.7002 50.9004c-8.89941 22.7002 -17.7002 60.2998 -27 82.7998c-1.5 0.799805 -1.89941 -2.40039 -9.39941 0c-17.1006 -44 -34.1006 -87.7998 -51.3008 -132.1c1.54297 -0.917969 4.1416 -2.2168 5.80078 -2.90039
c13.2998 -4.2998 26.5996 -8.2998 39.8994 -12.5z" />
    <glyph glyph-name="critical-role" unicode="&#xf6c9;" 
d="M225.82 448c0.259766 -0.150391 216.569 -124.51 217.12 -124.72c3 -1.18066 3.69922 -3.45996 3.69922 -6.56055c-0.0732422 -83.4463 -0.0732422 -166.899 0 -250.359c0.00976562 -0.124023 0.0175781 -0.326172 0.0175781 -0.450195
c0 -2.06836 -1.52148 -4.45703 -3.39746 -5.33008c-21.3701 -12 -207.859 -118.29 -218.93 -124.58h-3c-79.3301 45.6602 -218.25 125.44 -218.4 125.52c-1.04297 0.491211 -1.89062 1.8252 -1.89062 2.97754c0 0.0732422 0.00488281 0.19043 0.0107422 0.262695
c0 0.870117 0 225.94 -0.0498047 253.101c-0.0078125 0.102539 -0.0136719 0.269531 -0.0136719 0.37207c0 1.78223 1.31836 3.82422 2.94336 4.55762c23.2607 13.0996 209.271 119.21 220.141 125.21h1.75zM215.4 427.58l-0.219727 0.158203
c-64.7471 -36.8604 -129.474 -73.7305 -194.18 -110.61c0 -0.120117 0.0800781 -0.229492 0.129883 -0.349609l30.8604 -11.6406c-7.70996 -6 -8.32031 -6 -10.6504 -5.12988c-0.0996094 0 -24.1699 9.28027 -26.7998 10v-230.43
c0.879883 1.41016 64.0703 110.91 64.1299 111c1.62012 2.82031 3 1.91992 9.12012 1.51953c1.40039 -0.0898438 1.47949 -0.219727 0.780273 -1.41992c-41.1904 -71.3301 -36.4004 -63 -67.4805 -116.939c-0.80957 -1.40039 -0.609375 -1.12988 1.25 -1.12988h186.5
c1.44043 0 1.69043 0.229492 1.7002 1.63965v8.87988c0 1.33984 2.36035 0.810547 -18.3701 1c-7.45996 0.0703125 -14.1396 3.21973 -21.3799 12.7002c-7.37988 9.66016 -14.6201 19.4297 -21.8496 29.21c-2.28027 3.08008 -3.4502 2.37988 -16.7607 2.37988
c-1.75 0 -1.7793 0 -1.75977 -1.82031c0.290039 -26.21 0.150391 -25.2695 1 -32.6592c0.520508 -4.37012 2.16016 -4.2002 9.69043 -4.81055c3.13965 -0.259766 3.87988 -4.08008 0.519531 -4.91992c-1.57031 -0.389648 -31.5996 -0.509766 -33.6699 0.0996094
c-0.982422 0.269531 -1.78027 1.31543 -1.78027 2.33398c0 1.16016 0.931641 2.2334 2.08008 2.39648c3.29004 0.759766 6.16016 -0.80957 6.66016 4.44043c1.2998 13.6592 1.16992 9 1.09961 79.4199c0 10.8193 -0.349609 12.5801 -5.35938 13.5498
c-1.21973 0.240234 -3.54004 0.160156 -4.69043 0.549805c-2.87988 1 -2 4.83984 1.77051 4.84961c33.6699 0 46.0801 1.07031 56.0596 -4.85938c7.74023 -4.61035 12 -11.4805 12.5098 -20.4004c0.880859 -14.5898 -6.50977 -22.3496 -15 -32.5898
c-0.282227 -0.241211 -0.510742 -0.738281 -0.510742 -1.11035c0 -0.371094 0.228516 -0.868164 0.510742 -1.10938c2.60059 -3.25 5 -6.62988 7.70996 -9.83008c27.5605 -33.2305 24.1104 -30.54 41.2803 -33.0605c0.890625 -0.129883 1 0.419922 1 1.15039v11
c0 1 0.320312 1.42969 1.41016 1.25977c2.98633 -0.454102 7.86133 -0.822266 10.8818 -0.822266c3.53223 0 9.2207 0.50293 12.6982 1.12207c1.08008 0.150391 1.5 -0.199219 1.47949 -1.33008c0 -0.109375 0.880859 -26.6895 0.870117 -26.7998
c-0.0498047 -1.51953 0.669922 -1.62012 1.89062 -1.62012h186.71c-27.1533 47.0342 -54.2334 93.9746 -81.2402 140.821c2.25977 0.660156 -0.400391 0 6.69043 1.38965c2 0.390625 2.0498 0.410156 3.10938 -1.43945c7.31055 -12.6396 77.3105 -134 77.3701 -134.061
v230.44c-1.71973 -0.5 -103.3 -38.7197 -105.76 -39.6797c-1.08008 -0.419922 -1.5498 -0.200195 -1.91016 0.879883c-0.629883 1.89941 -1.33984 3.75977 -2.08984 5.62012c-0.320312 0.790039 -0.0898438 1.12988 0.649414 1.38965
c0.100586 0 95.5303 35.8496 103 38.7705c-65.4199 37.5693 -130.56 75 -196 112.6l86.8203 -150.39l-0.280273 -0.330078c-9.56934 0.899414 -10.46 1.59961 -11.7998 3.93945c-1 1.69043 -73.5 127.71 -82 142.16c-9.09961 -14.6699 -83.5596 -146.21 -85.3701 -146.32
c-2.92969 -0.169922 -5.87988 -0.0800781 -9.25 -0.0800781c28.833 49.8271 57.5596 99.4941 86.1797 149.001zM267.331 297.658c1.54688 0.120117 4.02832 0.500977 5.54004 0.849609c1.68945 0.299805 2.53027 -0.200195 2.59961 -1.91992
c0 -0.109375 0.0703125 -19.0596 -0.859375 -20.4502c-0.930664 -1.38965 -1.87988 -1.21973 -2.60059 0.19043c-5 9.68945 6.2207 9.66016 -39.1201 12c-0.699219 0 -1 -0.230469 -1 -0.929688c0 -0.130859 3.7207 -122 3.73047 -122.11
c0 -0.889648 0.519531 -1.2002 1.20996 -1.50977c2.46484 -0.980469 6.3623 -2.79492 8.7002 -4.0498c7.30957 -4.33008 11.3799 -10.8408 12.4102 -19.3105c1.43945 -11.7998 -2.77051 -35.7695 -32.21 -37.1396c-2.75 -0.129883 -28.2607 -1.08008 -34.1406 23.25
c-4.66016 19.2598 8.25977 32.7002 19.8906 36.3994c1.11035 0.202148 2.0127 1.28223 2.0127 2.41113c0 0.0683594 -0.00585938 0.180664 -0.0126953 0.249023c0.0996094 5.62988 3 107.101 3.70996 121.351c0.0498047 1.0791 -0.620117 1.15918 -1.35059 1.14941
c-32.3496 -0.519531 -36.75 0.339844 -40.2197 -8.51953c-2.41992 -6.18066 -4.13965 -1.32031 -3.9502 -0.230469c1.05957 6 2.16309 12 3.31055 18c0.399414 2.11035 1.42969 2.61035 3.42969 1.86035c5.58984 -2.11035 6.71973 -1.7002 37.25 -1.91992
c1.72949 0 1.78027 0.0800781 1.82031 1.84961c0.679688 27.4902 0.579102 22.5898 1 29.5498c0.00976562 0.0878906 0.0185547 0.231445 0.0185547 0.320312c0 0.986328 -0.738281 2.09766 -1.64941 2.48047c-5.59961 2.90918 -8.75 7.5498 -8.89941 13.8691
c-0.350586 14.8105 17.7197 21.6699 27.3799 11.5107c6.83984 -7.19043 5.7998 -18.9102 -2.4502 -24.1504c-1.24316 -0.68457 -2.25195 -2.3916 -2.25195 -3.81055c0 -0.146484 0.0146484 -0.383789 0.0322266 -0.529297c0 -0.589844 -0.110352 4.30957 1 -30.0498
c0 -0.900391 0.429688 -1.12012 1.24023 -1.11035c0.0996094 0 23 0.0898438 34.4697 0.370117zM68.2705 306.298c19.8408 4.50977 32.6807 0.560547 52.4902 -1.68945c2.75977 -0.310547 3.74023 -1.2207 3.62012 -4c-0.209961 -5 -1.16016 -22.3301 -1.24023 -23.1504
c-0.0371094 -0.932617 -0.767578 -1.98145 -1.62988 -2.33984c-4.05957 -1.7002 -3.60938 4.4502 -4 7.29004c-3.12988 22.4297 -73.8701 32.7002 -74.6299 -25.4004c-0.30957 -23.9199 17 -53.6299 54.0801 -50.8799c27.2402 2 19 20.1904 24.8398 20.4697
c0.0996094 0.0136719 0.261719 0.0244141 0.362305 0.0244141c1.50195 0 2.7207 -1.21875 2.7207 -2.71973c0 -0.186523 -0.0371094 -0.483398 -0.0830078 -0.664062c-1.83008 -10.8506 -3.41992 -18.9502 -3.4502 -19.1504
c-1.54004 -9.16992 -86.6992 -22.0898 -93.3496 42.0605c-2.70996 25.8496 10.4404 53.3691 40.2695 60.1494zM148.271 218.628h-19.4893c-0.0576172 -0.00488281 -0.151367 -0.00878906 -0.208984 -0.00878906c-1.04102 0 -2.13867 0.805664 -2.45117 1.79883
c2.37988 3.75 5.88965 -0.919922 5.86035 6.13965c-0.0800781 25.75 0.209961 38 0.229492 40.1006c0 3.41992 -0.530273 4.64941 -3.32031 4.93945c-7 0.720703 -3.10938 3.37012 -1.10938 3.38086c11.8398 0.0996094 22.6201 0.179688 30.0498 -0.720703
c8.76953 -1.06934 16.71 -12.6299 7.92969 -22.6201c-2 -2.25 -4 -4.41992 -6.13965 -6.72949c0.950195 -1.15039 6.89941 -8.82031 17.2803 -19.6797c2.65918 -2.78027 6.14941 -3.51074 9.87988 -3.13086h0.0214844c1.1709 0 2.16016 0.950195 2.20801 2.12012
c0.299805 3.41992 0.259766 -4.72949 0.450195 40.5801c0 5.65039 -0.339844 6.58008 -3.22949 6.83008c-3.9502 0.350586 -4 2.25977 -0.69043 3.37012l19.0898 0.0898438c0.320312 0 4.49023 -0.530273 1 -3.37988c0 -0.0498047 -0.160156 0 -0.240234 0
c-3.60938 -0.259766 -3.93945 -1 -4 -4.62012c-0.269531 -43.9297 0.0703125 -40.2295 0.410156 -42.8203c0.110352 -0.839844 0.270508 -2.22949 5.10059 -2.13965c2.48926 0 3.85938 -3.37012 0 -3.39941c-10.3701 -0.0800781 -20.7402 0 -31.1104 -0.0703125
c-10.6699 0 -13.4697 6.2002 -24.21 20.8203c-1.59961 2.17969 -8.31055 2.35938 -8.2002 0.369141c0.879883 -16.4697 0 -17.7793 4 -17.6699c4.75 0.100586 4.73047 -3.56934 0.830078 -3.5498h0.0595703zM423.271 228.778
c-1.20996 -7.12988 0.170898 -10.3799 -5.2998 -10.3398c-61.5498 0.419922 -47.8193 0.219727 -50.7197 0.30957c-1.02246 0.100586 -2.64844 0.426758 -3.62988 0.730469c-2.53027 0.599609 1.47949 1.22949 -0.379883 5.59961
c-1.43066 3.37012 -2.78027 6.78027 -4.11035 10.1895c-0.210938 0.797852 -1.05078 1.44434 -1.875 1.44434c-0.0351562 0 -0.0908203 -0.00195312 -0.125 -0.00390625c-1.82812 0.0878906 -4.79785 0.15918 -6.62793 0.15918
c-2.19727 0 -5.75879 -0.102539 -7.95215 -0.229492c-0.587891 -0.0771484 -1.31348 -0.551758 -1.62012 -1.05957c-1.58008 -3.62012 -3.06934 -7.29004 -4.50977 -11c-1.26953 -3.23047 7.86035 -1.32031 12.1904 -2.16016c3 -0.570312 4.5293 -3.71973 0.65918 -3.72949
h-26.3691c-2.91992 0 -3.09082 3.14941 -0.740234 3.20996c0.0791016 -0.00390625 0.208008 -0.00683594 0.288086 -0.00683594c2.14648 0 4.66992 1.55762 5.63184 3.47656c1.5 3 2.7998 6 4.11035 9.08984c18.1797 42.1396 17.0596 40.1699 18.4199 41.6104
c0.300781 0.431641 0.973633 0.78125 1.5 0.78125s1.19824 -0.349609 1.5 -0.78125c2.92969 -3.33984 18.3994 -44.71 23.6201 -51.9199c2 -2.7002 5.73926 -2 6.35938 -2c3.61035 -0.130859 4 1.10938 4.12988 4.29004
c0.0898438 1.86914 0.0800781 -1.1709 0.0703125 41.2393c0 4.45996 -2.36035 3.74023 -5.5498 4.27051c-0.259766 0 -2.56055 0.629883 -0.0800781 3.05957c0.209961 0.200195 -0.890625 0.240234 21.7002 0.150391c2.31934 0 5.31934 -2.75 -1.20996 -3.4502
c-0.0322266 0.000976562 -0.0830078 0.00292969 -0.115234 0.00292969c-1.41309 0 -2.55957 -1.14746 -2.55957 -2.56055c0 -0.0751953 0.00683594 -0.197266 0.0146484 -0.272461c-0.0703125 -1.62988 -0.19043 -38.8896 0.290039 -41.21
c0.27832 -1.34668 1.62109 -2.43848 2.99609 -2.43848c0.0644531 0 0.168945 0.00390625 0.233398 0.00878906c13.25 -0.430664 14.9199 -0.44043 16 3.41016c1.66992 5.7793 4.12988 2.51953 3.73047 0.189453zM318.551 164.408
c-4.24023 0 -4.41992 3.38965 -0.609375 3.41016c35.9092 0.160156 28.1094 -0.379883 37.1895 0.649414c1.67969 0.19043 2.37988 -0.239258 2.25 -1.88965c-0.259766 -3.38965 -0.639648 -6.78027 -1 -10.1602c-0.25 -2.16016 -3.2002 -2.61035 -3.39941 0.150391
c-0.380859 5.30957 -2.15039 4.44922 -15.6309 5.08008c-1.58008 0.0693359 -1.63965 0 -1.63965 -1.52051v-16.1299c0 -1.65039 0 -1.59961 1.62012 -1.46973c3.12012 0.25 10.3096 -0.339844 15.6895 1.51953c0.470703 0.160156 3.30078 1.79004 3.07031 -1.75977
c0 -0.209961 -0.759766 -10.3496 -1.17969 -11.3896c-0.530273 -1.29004 -1.87988 -1.51074 -2.58008 -0.320312c-1.16992 2 0 5.08008 -3.70996 5.2998c-15.4199 0.900391 -12.9102 2.5498 -12.9102 -6c0 -12.25 -0.759766 -16.1104 3.88965 -16.2402
c16.6406 -0.479492 14.4004 0 16.4307 5.70996c0.839844 2.37012 3.5 1.77051 3.17969 -0.580078c-0.44043 -3.20996 -0.849609 -6.42969 -1.22949 -9.63965c0 -0.360352 -0.160156 -2.39941 -4.66016 -2.38965c-37.1602 0.0800781 -34.54 0.189453 -35.21 0.30957
c-2.7207 0.509766 -2.2002 3 0.219727 3.4502c1.09961 0.19043 4 -0.540039 4.16016 2.55957c2.43945 56.2207 -0.0703125 51.3408 -3.91016 51.3301zM318.141 273.928c2.45996 -0.609375 3.12988 -1.75977 2.9502 -4.64941
c-0.330078 -5.2998 -0.339844 -9 -0.549805 -9.69043c-0.660156 -2.22949 -3.15039 -2.12012 -3.33984 0.270508c-0.379883 4.80957 -3.0498 7.81934 -7.57031 9.14941c-26.2803 7.73047 -32.8096 -15.46 -27.1699 -30.2197c5.87988 -15.4102 22 -15.9199 28.8604 -13.7803
c5.91992 1.85059 5.87988 6.5 6.91016 7.58008c1.22949 1.2998 2.25 1.83984 3.11914 -1.09961c0 -0.100586 0.570312 -11.8906 -6 -12.75c-1.59961 -0.209961 -19.3799 -3.69043 -32.6797 3.38965c-21 11.1904 -16.7402 35.4697 -6.87988 45.3301
c14 14.0596 39.9102 7.05957 42.3203 6.46973h0.0292969zM289.801 167.858c3.28027 0 3.66016 -3 0.160156 -3.43066c-2.61035 -0.319336 -5 0.419922 -5 -5.45996c0 -2 -0.19043 -29.0498 0.400391 -41.4502c0.109375 -2.28906 1.14941 -3.51953 3.43945 -3.64941
c22 -1.20996 14.9502 1.64941 18.79 6.33984c1.83008 2.24023 2.75977 -0.839844 2.75977 -1.08008c0.350586 -13.6201 -4 -12.3896 -5.18945 -12.3994l-38.1602 0.189453c-1.92969 0.230469 -2.05957 3 -0.419922 3.37988c2 0.480469 4.93945 -0.399414 5.12988 2.7998
c1 15.8701 0.570312 44.6504 0.339844 47.8105c-0.269531 3.76953 -2.7998 3.26953 -5.67969 3.70996c-2.46973 0.379883 -2 3.21973 0.339844 3.21973c1.4502 0.0205078 17.9697 0.0302734 23.0898 0.0205078zM258.171 225.648
c0.0703125 -4.08008 2.86035 -3.45996 6 -3.58008c2.61035 -0.100586 2.53027 -3.41016 -0.0703125 -3.43066c-6.47949 0 -13.6992 0 -21.6094 0.0605469c-3.83984 0 -3.37988 3.34961 0 3.37012c4.49023 0 3.24023 -1.61035 3.41016 45.54
c0 5.08008 -3.27051 3.54004 -4.7207 4.22949c-2.58008 1.23047 -1.35938 3.08984 0.410156 3.15039c1.29004 0 20.1904 0.410156 21.1699 -0.209961c0.980469 -0.620117 1.87012 -1.65039 -0.419922 -2.86035c-1 -0.519531 -3.85938 0.280273 -4.14941 -2.46973
c0 -0.209961 -0.820312 -1.62988 -0.0703125 -43.7998h0.0498047zM221.261 -48.6221c0.408203 -0.273438 1.13867 -0.495117 1.62988 -0.495117c0.492188 0 1.22168 0.22168 1.62988 0.495117c17 9.79004 182 103.57 197.421 112.51
c-0.140625 0.430664 11.2598 0.180664 -181.521 0.270508c-1.21973 0 -1.57031 -0.370117 -1.53027 -1.56055c0 -0.0996094 1.25 -44.5098 1.2207 -50.3799c-0.0791016 -2.17969 -0.688477 -5.63379 -1.36035 -7.70996c-0.549805 -1.83008 0.379883 0.5 -13.5 -32.2295
c-0.730469 -1.7207 -1 -2.20996 -2 0.0800781c-4.19043 10.3398 -8.28027 20.7197 -12.5703 31c-1.12109 2.52441 -2.03125 6.81543 -2.03125 9.57812c0 0.333984 0.0146484 0.876953 0.03125 1.21191c0.160156 2.45996 0.800781 16.1191 1.51074 48c0 1.94922 0 2 -2 2
h-183c2.5791 -1.63086 178.319 -102.57 196 -112.761zM130.361 140.128c0 -2.39941 0.359375 -2.79004 2.75977 -3c11.54 -1.16992 21 -3.74023 25.6396 7.32031c6 14.46 2.66016 34.4102 -12.4795 38.8398c-2 0.589844 -16 2.75977 -15.9404 -1.50977
c0.0498047 -8.04004 0.00976562 -11.6104 0.0205078 -41.6504zM236.111 155.178c0 -2.12988 1.06934 -38.6797 1.08984 -39.1299c0.339844 -9.93945 -25.5801 -5.76953 -25.2305 2.58984c0.0800781 2 1.37012 37.4199 1.10059 39.4307
c-14.1006 -7.44043 -14.4199 -40.21 6.43945 -48.8008c1.88184 -0.816406 5.0752 -1.47949 7.12695 -1.47949c5.53418 0 12.3721 3.83008 15.2637 8.5498c4.90918 7.75977 6.83984 29.4697 -5.43066 39c-0.0966797 -0.0400391 -0.257812 -0.09375 -0.359375 -0.120117
v-0.0400391zM223.831 353.178c-9.83008 0 -9.73047 -14.75 -0.0703125 -14.8701c9.66016 -0.119141 10.1006 14.8809 0.0703125 14.9102v-0.0400391zM143.681 249.348c0 -1.7998 0.410156 -2.39941 2.16992 -2.58008c13.6201 -1.38965 12.5107 11 12.1602 13.3604
c-1.68945 11.2197 -14.3799 10.2002 -14.3496 7.81055c0.0498047 -4.5 -0.0302734 -13.6807 0.0195312 -18.5908zM356.001 242.948l-6.09961 15.8398c-2.16016 -5.48047 -4.16016 -10.5703 -6.23047 -15.8398h12.3301z" />
    <glyph glyph-name="d-and-d-beyond" unicode="&#xf6ca;" horiz-adv-x="640" 
d="M313.8 206.5c-9.89941 0 -16 7 -15.7002 7.09961c-4.2998 5.7002 -3 -0.299805 -2.39941 -1.89941c-10.9004 10.2998 -5.2998 25.3994 -5.10059 26c0.700195 1.89941 0 2.2002 -0.599609 1.89941c-1 -0.299805 -2.09961 -1.89941 -2.09961 -1.89941
c0.799805 9.09961 9.2998 14.7002 9.2998 14.7002l0.200195 -0.200195c1 -1.5 -0.400391 -3.2002 -0.600586 -9c1.60059 2.2998 7.90039 6.59961 11.4004 7.89941c-1.10059 -1.5 -2.10059 -3.59961 -2.10059 -6.59961c3.7002 4.2002 7.5 2.59961 8 2.40039
c-12.1992 -11.9004 -7 -26.6006 3.2002 -26.6006c5.7002 0 11.5 6.40039 13.9004 10.7002c2.39941 -2.40039 6.39941 -5.5 7.39941 -6.59961c-3.7998 -7.80078 -11 -17.9004 -24.7998 -17.9004zM366.2 227.6c0 -2.89941 -2.90039 -4.09961 -5.40039 -4.5
c0.700195 1.5 1.7998 5.10059 -0.200195 9c0.700195 -0.0996094 5.60059 -0.5 5.60059 -4.5zM376.5 222.4c-0.400391 -6.5 -6.90039 -11.6006 -14.5996 -10.6006c2 -1.7002 6.59961 -3 9 -1.89941c-3.90039 -6.90039 -23.1006 -7.5 -23.1006 6.39941
c-2.89941 -2.89941 -2.09961 -7.39941 0 -9.2998c-2.2002 0.700195 -5.7998 3.09961 -6.39941 7.40039c-1.30078 10.0996 4.39941 6.5 -10.4004 18.0996c-4.7998 3.7002 -3 6.59961 -4 8.5c-1.09961 2.2002 -7 4.09961 -4.5 8.5
c-0.0996094 -1.59961 1 -2.90039 2.59961 -3.5c1.80078 -0.700195 3.2002 -0.200195 4.80078 -1c1.69922 -1.2002 0.899414 -3.90039 2.19922 -5c1.10059 -0.799805 4.2002 0.299805 6.60059 -1.7998c2.59961 -2 8.2002 -6.7002 10.5996 -8.60059
c4.40039 -3.59961 8.7998 0.400391 7.40039 4.60059c4.5 -2.60059 5 -9.90039 1.2998 -12.5c10.5996 -2.40039 13 10.0996 5 11.3994c7.2998 0.700195 13.5 -4.2998 13.5 -10.6992zM337.1 240.8c4.30078 6.10059 13.3008 15.2998 23.8008 15.7998
c-5.90039 0.800781 -15.1006 -3.19922 -19.7002 -9c0.899414 3.90039 5.09961 10.1006 10.2002 13c0 0 -2.5 -3.19922 -1.40039 -3.69922c1.59961 -0.800781 5.7998 5.69922 11.2002 5.89941c0 0 -4 -2 -3.2002 -3.39941c0.599609 -0.900391 3.2998 1.2998 8 1.2998
c5.7998 0 10.9004 -3.5 13.2998 -6.2002c-4 1.09961 -11.5996 -0.799805 -13.7998 -2.7002c-0.299805 0.200195 -11.7998 9 -22 -15.5c-4.7998 3.7998 -4.40039 3.7002 -6.40039 4.5zM579.6 188.9c37.2002 0 60.4004 -19.6006 60.4004 -48.9004
c0 -28.2002 -17 -48.9004 -59.0996 -48.9004c-20.7002 0 -41.2002 1.30078 -51.6006 2.10059l7.40039 8.2002v77.1992l-7.40039 8.2002c10.2998 0.799805 29.6006 2.10059 50.2998 2.10059zM564.5 113.3c25.4004 -3.2002 46.7998 1.40039 46.7998 27
c0 22.5 -16.7002 29.6006 -46.7998 26.2998v-53.2998zM301.6 267c0.100586 -0.299805 -2.7998 2.2998 -3.2998 7.5c-0.200195 2.2998 0 19.7998 20 18.9004c11.2002 -0.600586 16.7002 -8.30078 16.7002 -16.5c0 -4.30078 -2.2998 -10.1006 -5.5 -13.8008
c-2.2002 2.2002 -5.59961 4.60059 -7.7002 7.80078c3.7998 5.59961 2.2002 14.3994 -4.7002 14.3994c-4.2998 0 -7.7998 -4.5 -6.39941 -9.89941c-0.700195 -2.40039 -1 -5.60059 -0.5 -8c-4.90039 2.59961 -6.5 6 -7.5 9c-1.2998 -2.5 -2.10059 -6 -1.10059 -9.40039z
M301.2 261c0.299805 1.7002 -3.10059 4.59961 -4.7998 5.2002c4.7998 0.200195 7 -0.600586 7 -0.600586c-1.30078 1.7002 -1.60059 4.5 -1 6.7002c2.5 -6.09961 11.6992 -7.09961 13.8994 -12.2002c-0.299805 2.30078 -2.39941 4.7002 -4.7998 6.10059
c-1.2998 3.2002 -0.299805 9.39941 1.2998 11c-0.5 -8.7998 12 -13.7998 14.6006 -20.2002c-1.40039 5.5 -7.40039 9 -10.1006 12.2002c-1 2.09961 -0.200195 5.7998 0.799805 7.09961c-0.5 -9.7002 15.8008 -14.2998 14.1006 -23.8994
c0.899414 -0.400391 2.09961 -1.2002 1.89941 -2.60059c1.30078 0.299805 2.60059 1.7002 2.90039 2.7002c0.700195 -4.5 -1.90039 -9 -4.7998 -10.4004c1.59961 4 -2.7002 5.60059 -6.7002 5.10059c0 0 1.59961 2.2998 1 3.39941
c-0.799805 1.5 -8 0.800781 -11.2002 -0.299805c1.10059 0.100586 3.60059 -0.200195 4.60059 -0.5c-2.10059 -2.89941 -1 -7.09961 1.2998 -4.2002c0 0 -1.10059 -3.5 -0.299805 -4.2998c0.799805 -0.799805 2.59961 -0.200195 2.59961 -0.200195
c-1.2002 -2.69922 -5.2998 -4.59961 -8.2002 -4.59961c1.10059 0.400391 2.7002 2.2998 3 3.40039c-0.799805 -0.5 -2.7002 -0.700195 -3.5 -0.5c6.10059 3 0 13.1992 -7 8.19922c1 2.7002 3.7002 5.30078 5.7998 6.10059c-1.2998 0.5 -2.69922 0.799805 -4.2998 1.09961
c1.7998 1.5 6.2998 2.7998 8.5 2.60059c-3.5 0.799805 -9.89941 -0.300781 -12.7998 -3.7002c0.900391 0 3.2998 -0.5 4.2998 -0.799805c-4 -0.700195 -9.39941 -4.40039 -11 -6.2002c0.299805 2.2002 1 4.2002 0.5 5.59961c-0.799805 2 -3 2.7998 -7.7998 1.7998
c3.2002 3.2002 9.7002 5.10059 10.2002 6.90039zM327.1 253.6c0 0 -0.899414 3 -4.19922 4.30078c0.699219 -2.2002 1.5 -4.30078 4.19922 -4.30078zM366 249.9l0.700195 0.699219c0.5 0.400391 1.59961 0.900391 2.7002 1.40039v-18.4004
c-1.7002 0.800781 -3.5 1.10059 -5.60059 1.10059c-2.39941 0 -5 -0.5 -5 -0.5c-0.5 0.5 -3.59961 2.89941 -5.09961 3.2002c4.09961 -4.30078 0.5 -9.80078 -3 -7.2002v15.7002c0.700195 0.799805 1.2998 1.7998 2.09961 2.59961
c1.7002 2.09961 4.60059 3.40039 7.5 3.40039c1.7998 0 3.60059 -0.400391 4.7002 -1.40039zM79.9004 142.1c22 -6.39941 19.3994 -20.0996 19.3994 -25.1992c0 -7.80078 -3.2002 -13.6006 -9.89941 -17.6006c-12.6006 -7.39941 -24.7002 -5.89941 -86.4004 -5.89941
l8.40039 8.59961v32.2998l-11.4004 14.6006h11.2998v29.5l-8.2998 8.59961h56.0996c12.9004 0 37 -4.40039 37 -25c0 -1.90039 1 -15.2998 -16.1992 -19.9004zM38.5996 169.6v-20.8994c10.6006 0 29.6006 -3.2998 29.6006 8.7998v3
c0 9.90039 -9.60059 9.09961 -29.6006 9.09961zM38.5996 110.4c20.4004 0 32.9004 -1.90039 32.9004 9.2998h-0.200195v4.5c0 11.0996 -20.5 8.7998 -32.7002 8.7998v-22.5996zM139.8 129.7v-15.4004l60.1006 0.200195l-14.1006 -21.2002h-81.2002l7.40039 8.2002v77.0996
l-7.40039 8.2002l73.5 0.200195v-0.200195l14.1006 -21h-52.4004v-14.8994h37.2002l-14.0996 -21.2002v-0.200195zM354.5 189.8c73.7998 0 77.5996 -99.2998 -0.299805 -99.2998c-77.2002 0 -73.6006 99.2998 0.299805 99.2998zM354.2 112.3
c39 0 37 55.2002 0.200195 55.2998c-37.1006 0 -37.6006 -55.2998 -0.200195 -55.2998zM262.9 120.6l0.199219 -19l7.2002 -8.19922h-42.5996l7.7002 8.19922l-0.200195 19.4004l-44.1006 65.7998h44.9004l-6.40039 -7.2002l21 -37.1992h0.300781l20.5 37.1992
l-6.10059 7.2002h41.7002zM234.5 271.9c-9.09961 6.69922 -9.5 14.0996 -9.59961 14.8994c7.2998 -4.2998 9 -4 39.8994 -4c-5.7998 0 24 3.10059 32.2002 -22.8994c-0.400391 0 -8.40039 -4.80078 -10.4004 -7.90039c5.30078 1.90039 8.90039 1.09961 9 1.09961
c-8 -5.09961 -9.59961 -14.7998 -9.59961 -20.5c0.900391 2.10059 2.7002 3.7002 2.7002 3.5c-0.600586 -2.5 -1.40039 -7 -0.799805 -12c-8.60059 -7.09961 -16 -8.59961 -26 -8.59961h-35.1006c0.400391 0.0996094 7.7998 4.5 7.90039 4.59961
c1.89941 1.10059 2.7002 2.2002 2.7002 6.40039v38.7998c0 4.2002 -1.30078 5.2998 -2.90039 6.60059zM256 266.4v-34.6006c4.7002 0 23.0996 -3.39941 23.0996 17.2998c0 20.6006 -18.5 17.3008 -23.0996 17.3008zM484.9 186.8l39.1992 -0.0996094l-7.39941 -8.2998
v-85.2002h-21.2998c-4 12.7002 -44.8008 45 -48.5 55.5996h-0.300781v-47.3994l7.40039 -8.2002h-39l7.2002 8.2998v76.9004l-7.40039 8.5h31.6006c2.89941 -9.40039 39.7998 -36.5 45.1992 -50.9004h0.300781v42.5zM378.2 282.9
c32.7002 -1.60059 33.7998 -29.8008 33.7998 -33.6006c0 -6.7002 -3.2998 -34 -36.7002 -34h-0.299805c3.59961 4.2998 3.5 11.9004 -2.2002 16.2998c1.2002 0 19.7002 -3.19922 19.7002 17.3008c0 20.6992 -18.4004 17.2998 -23.0996 17.2998v-4.2998
c-5.40039 0.799805 -7.40039 -0.300781 -7.5 -0.300781c2.09961 1.80078 4.5 2.60059 6.09961 2.90039c-7.09961 1.59961 -13.5996 -2.40039 -14.5996 -3.5c0.799805 1.7998 2.39941 3.40039 3.5 4.5c-2.30078 -0.799805 -4.30078 -1.90039 -6.10059 -3
c0 5.2002 0.200195 7.5 -2.89941 9.5c-9.10059 6.59961 -9.5 14.2002 -9.60059 14.9004c7.10059 -4.2002 7.7002 -4 39.9004 -4z" />
    <glyph glyph-name="dev" unicode="&#xf6cc;" 
d="M120.12 239.71c3.87012 -2.90039 5.82031 -7.25977 5.83008 -13.0596v-69.6504c0 -5.80957 -1.94043 -10.1602 -5.82031 -13.0596c-3.87988 -2.90039 -7.76953 -4.35059 -11.6494 -4.35059h-17.4502v104.47h17.4395c3.87988 0 7.77051 -1.44922 11.6504 -4.34961z
M404.1 416c24.2002 0 43.8408 -19.5898 43.9004 -43.7998v-360.4c-0.0595703 -24.21 -19.6904 -43.7998 -43.9004 -43.7998h-360.199c-24.2002 0 -43.8408 19.5898 -43.9004 43.7998v360.4c0.0595703 24.21 19.7002 43.7998 43.9004 43.7998h360.199zM154.2 156.81
l-0.00976562 70.9307c-0.0107422 18.8193 -11.9307 47.2793 -47.3701 47.2793h-47.3799v-165.46h46.3994c36.75 -0.0595703 48.3604 28.4404 48.3604 47.25zM254.88 245.47l0.00976562 29.5205h-63.1895c-11.1504 -0.280273 -19.9805 -9.54004 -19.71 -20.6904v-125.109
c0.279297 -11.1602 9.55957 -19.9805 20.7197 -19.6904h62.1797v29.5703h-53.29v38.4102h32.5703v29.5693h-32.5703v38.4199h53.2803zM358.52 130.18l38.4609 144.801h-32.5801l-29.5703 -113.721l-29.71 113.721h-32.5703l38.5303 -144.801
c10.5898 -24.6299 34.2402 -30.75 47.4395 0z" />
    <glyph glyph-name="fantasy-flight-games" unicode="&#xf6dc;" horiz-adv-x="512" 
d="M256 415.14l223.14 -223.14l-223.14 -223.14l-223.14 223.14zM88.3398 192.17c11.3447 -11.2461 29.7705 -29.4893 41.1299 -40.7197c20.1602 19.8799 40.46 39.8994 61.8506 60.9902c12.0596 -12.5801 24.5195 -25.5703 36.54 -38.1104
c12.0293 11.6895 23.7393 23.0596 35.6895 34.6602c-6.99023 7.4502 -32.1494 32.8301 -35.0898 35.7793c-1.91016 1.9209 -2.29004 3.2207 -0.120117 5.35059c15.5801 15.2295 39.21 17.79 56.9805 5.09961c7.98926 -5.70996 14.2998 -11.6396 48.5098 -43.9502
c10.8203 11.1504 22.2295 22.8506 33.5 34.6904c0.490234 0.520508 0.0996094 2.63965 -0.580078 3.37988c-0.0898438 0.100586 -37.5195 40.6006 -62.1504 59c-33.5801 25.0801 -78.3193 23.0605 -119.77 -18.6895c-84.5703 -85.1807 -94.5303 -95.4805 -96.4902 -97.4805z
M323.16 90.5703c18.8203 18.79 80.3301 80.6396 100.5 101.5c-13.7305 13.4492 -27.1797 26.6299 -40.8604 40.0293c-20.0098 -19.7393 -40.2402 -39.6895 -61.25 -60.4199c-12.3301 12.8301 -24.8799 25.8799 -37.25 38.75
c-1.25977 -0.689453 -1.64941 -0.80957 -1.91016 -1.06934c-10.7295 -10.7705 -21.4199 -21.5801 -32.21 -32.29c-2.22949 -2.20996 -0.519531 -3.35059 0.800781 -4.69043c10.5791 -10.7402 21.1797 -21.4502 31.7695 -32.1797
c3.5498 -3.60059 3.54004 -3.85059 -0.139648 -7.24023c-16.8008 -15.4697 -40.8408 -16.54 -59.3203 -1.7998c-7.62012 6.08008 -11.6602 10.1797 -44.6797 42.0898c-11.5801 -11.8896 -23.3203 -23.9404 -35.3701 -36.3096
c33.5498 -34.7607 50.8496 -53.3408 72.9297 -66.8408c28.9004 -17.6699 71.5 -14.96 106.99 20.4707zM256 448l256 -256l-256 -256l-256 256zM16 192l240 -240l240 240l-240 240z" />
    <glyph glyph-name="penny-arcade" unicode="&#xf704;" horiz-adv-x="640" 
d="M421.91 283.73c7.33984 -16.2705 2.29004 -5.07031 24.6299 -54.6807l-39.7305 -10.6094c13.7002 59.2295 10.6104 45.8398 15.1006 65.29zM215.82 232.62c32.5 8.99023 41.9492 -37.6396 -0.350586 -47.4297c-14.2002 -3.77051 -6.64941 -1.75 -34.8193 -9.34082
l-4.45996 46.1904c28.3193 7.5498 19.4395 5.17969 39.6299 10.5801zM541.98 258.81c75.7998 -37.9092 98 -76.3193 97.9893 -104.47c2.10059 -78.8496 -183.3 -130.33 -399.89 -84.8301c0.540039 -13 -8.00977 -24.6494 -20.5801 -28.0195
c-125.54 -33.54 -117.35 -31.75 -122.53 -31.7598c-14.3701 -0.0107422 -26.4102 10.8896 -27.7998 25.1992l-4.2998 44.4805c-0.0683594 0.724609 -0.125 1.90332 -0.125 2.63184c0 10.5811 8.01758 22.2461 17.8945 26.0381l-1.73926 17.8799
c-50.2305 28.2598 -80.9004 61.8701 -80.9004 95.3701c0 72.9199 144.26 113.4 309.41 98.3701c2.68945 7.54395 11.1514 15.3438 18.8896 17.4102c96.8701 25.9092 65.3203 17.4795 135.59 36.2295c13.1602 3.50977 26.9307 -2.95996 32.6201 -15.3301zM255.14 149.7
c17.5 4.0498 40.2363 19.1562 50.75 33.7197c21.6006 32.5898 14.1104 105.561 -42.5498 104.43c-16.04 -0.229492 -8.07031 0.890625 -186.22 -46.6494l4.34961 -44.5l20.1201 5.38965l11.1104 -114.64l-20.0205 -5.35059l4.30078 -44.5195l115.31 30.7803
l-4.50977 44.5098l-20.5303 -5.50977l-2.45996 23.5498l48.4404 12.9102zM454.32 133.08l108.55 28.96l-4.2998 44.4795l-20.79 -5.55957l-66.6699 145.47c-70.5801 -18.8301 -42.2305 -11.25 -135.591 -36.2393l4.2002 -44.4805l17.1504 4.55957l-33.0801 -126.47
l-20.9902 -5.58984l4.45996 -44.4297l112.851 30.0693l-4.05078 39.54l-19.1992 -5.12012l4.09961 17.54l57.7598 15.4209l6.61035 -14.6807l-14.9004 -3.97949z" />
    <glyph glyph-name="wizards-of-the-coast" unicode="&#xf730;" horiz-adv-x="640" 
d="M219.19 102.31c7.44922 5.80078 16.2598 0.680664 21.7295 -7.0791c7.08984 -10.1201 6.24023 -18.1602 -0.259766 -23.04c-7.62012 -6.24023 -17.0898 0.129883 -21.7305 6.5498c-10.8096 15.1299 -1.63965 22.1895 0.260742 23.5693zM555.94 26.3701
c1.30957 4.4502 3.92969 10.21 3.93945 20.1699c0 34.04 -41.6299 64.4102 -100.03 68.0801c-53.1592 3.39941 -120.46 -15.4502 -184.35 -73.8506l-0.790039 0.260742c1.58008 10.4697 -0.780273 16.2295 -3.40039 21.21l0.260742 1.56934
c64.4199 51.3203 134.069 66.5107 188.8 60.4902c61.0098 -6.54004 104.479 -39.54 101.34 -78.0303c-0.790039 -9.68945 -2.88965 -15.71 -4.97949 -19.8994c-1.34082 -1.66992 -1.13086 -1.7002 -0.790039 0zM392.28 207.58
c-0.530273 7.07031 3.13965 11.7803 6.7998 15.46c3.66992 3.91992 14.9297 10.4697 14.9297 10.4697s-1.2998 -26.4502 -2.08984 -29.8496c-1.04004 -3.92969 -4.96973 -6.81055 -10.4697 -6.5498c-4.98047 0.259766 -8.37988 3.39941 -9.16992 10.4697zM342.26 358.68
c147.17 0 275.48 -86.6797 291.21 -196.939c0 0 -3.66992 -1.31055 -9.68945 -4.4502c0 -0.259766 1.0498 -10.7402 0.259766 -16.5c-0.259766 -1.83008 -1.0498 -1.0498 -1.0498 0c-0.270508 5.24023 -1.57031 11.5303 -2.36035 14.9297
c-4.70996 -2.60938 -10.21 -6.54004 -15.9697 -11.7793c0 0 4.70996 -10.21 4.70996 -25.9209c0 -21.21 -8.37988 -32.9893 -16.5 -37.9697l-0.259766 0.520508c9.16992 9.16992 12.5693 21.4795 12.5693 31.9492c0 13.8701 -6.80957 33.25 -14.3994 41.3701
c0 0 4.4502 -8.12012 6.80957 -17.8096c0 0 -21.21 -21.4697 -26.9697 -62.3203c0 0 -3.66992 9.16992 -10.7402 16.2402c0 0 12.0498 -15.4502 12.0498 -38.2305c0 -19.3799 -12.8398 -37.4395 -27.5 -48.1797c-0.989258 0 -0.790039 -0.169922 -0.790039 0.790039
c15.71 12.8301 22.2607 28.0205 22.2607 46.3506c0 38.2295 -49.2305 80.3896 -130.15 80.3896c-96.1104 0 -181.74 -58.1299 -236.99 -128.05l-1.0498 0.259766c-40.3203 120.979 -135.64 185.66 -196.13 202.16c-2.09961 0.519531 -1.83984 0.790039 -0.790039 1.30957
c12.3096 14.4004 136.96 151.88 341.47 151.88zM243.02 69.0596c16.8408 14.5908 4.99023 30.7705 4.71094 31.1602c-4.08008 5.99023 -16.3105 16.8506 -31.1602 5.5c-10.9502 -8.37988 -11.6406 -22.8896 -4.19043 -32.4697
c6.44043 -8.26953 19.5801 -13.1797 30.6396 -4.19043zM245.11 205.49l1.83008 -8.11035l-3.6709 4.4502l-14.1396 -26.71l24.6201 -28.7998l12.5703 6.01953l-11.7803 70.96zM263.7 87.9102c3.41016 2.35938 7.33984 4.97949 9.67969 6.57031l-0.259766 0.259766
c-1.56055 -0.780273 -3.11035 -1.0498 -12.5703 15.9697v0.259766c6.87012 5.16016 8.45996 4.89062 11.5205 5.5l0.259766 0.260742c-1.31055 3.66992 -1.31055 3.66992 -1.83008 5.5h-0.259766c-3.95996 -3.31055 -1.4707 -1.58008 -11.5205 -7.86035h-0.259766
c-1.83008 3.13965 -4.19043 7.33008 -5.75977 9.68945v1.31055c4.4502 3.91992 10.2197 6.7998 12.3096 7.58984c2.87988 1.0498 4.19043 0.520508 5.24023 0.259766l0.259766 0.520508c-1.30957 1.83008 -2.08984 2.87988 -3.39941 4.70996l-0.520508 0.259766
c-9.9502 -5.5 -17.54 -9.9502 -25.3994 -15.71l0.259766 -0.519531c1.30957 0.259766 3.13965 -0.260742 4.4502 -2.62012c15.04 -25.0801 19.5898 -27.5908 17.54 -31.6904zM318.96 120.38v0.25c-1.99023 0 -2.34961 -1.37012 -14.6602 30.6396v0.260742
c4.95996 1.85938 8.78027 4.37988 12.3105 2.62012l0.259766 0.519531l-3.13965 4.98047l-0.520508 0.259766c-2.22949 -0.929688 -20.4697 -8.00977 -27.7598 -12.5703l-0.259766 -0.519531l1.0498 -5.76074h0.519531c1.0498 3.68066 9.7998 7.33008 9.9502 7.33008
l0.259766 -0.259766c12.9404 -29.7598 13.0703 -29.8799 11.7803 -32.4697l0.259766 -0.259766c3.93066 2.09961 6.81055 3.40918 9.9502 4.97949zM363.73 136.88c-0.780273 0.520508 -2.09082 1.31055 -2.63086 3.92969c-1.56934 6.02051 -4.70996 20.1709 -6.2793 26.4502
c-0.530273 1.57031 -0.530273 3.14062 0.519531 4.4502l-0.259766 0.259766c-3.41016 -0.529297 -6.29004 -1.30957 -10.7402 -2.35938v-0.260742c1.57031 -0.529297 2.10059 -2.09961 2.62012 -3.92969l2.62012 -9.42969l-0.259766 -0.259766
c-3.40039 -1.05078 -8.90039 -2.62012 -12.8301 -3.93066h-0.259766c-0.780273 2.10059 -1.83008 5.75977 -3.14062 9.69043l0.259766 4.70996l-0.259766 0.259766c-4.71973 -1.30957 -7.59961 -2.34961 -10.7402 -3.40039v-0.519531
c1.05078 0 2.10059 -1.30957 2.62012 -3.13965c1.0498 -3.40039 8.12012 -24.0908 9.16992 -27.2305c0.790039 -2.09961 0.790039 -3.66992 -0.259766 -4.97949l0.259766 -0.260742c3.14062 1.31055 6.54004 2.87988 10.21 3.93066v0.519531
c-1.0498 0.259766 -2.08984 0.780273 -2.87988 3.13965c-1.0498 3.93066 -3.39941 11.2607 -4.18945 13.8809l0.259766 0.259766c3.92969 1.30957 9.42969 3.13965 12.8301 3.92969l0.259766 -0.259766c0.530273 -2.09961 2.62012 -10.2197 3.66992 -13.6201
l-0.519531 -4.4502l0.259766 -0.259766c4.4502 1.57031 5.5 1.83008 9.69043 2.87988zM395.94 143.69c0.529297 1.8291 1.0498 3.65918 1.5791 6.04004h-0.259766c-2.0293 -4.06055 -15.0898 -5.09082 -16.2402 -4.71094l-0.259766 0.260742
c-0.519531 3.13965 -1.83008 10.4795 -2.08984 12.5693l0.259766 0.260742c8.06055 0.899414 5.40039 1.0293 10.21 0h0.260742c0 3.40918 0.259766 3.66992 0.259766 5.23926h-0.259766c-5.98047 -2.2998 -1.2207 -0.679688 -10.7402 -2.35938l-0.259766 0.259766
c-0.520508 3.40039 -1.31055 8.37988 -1.57031 9.9502l0.259766 0.259766c12.9004 2.41016 15.1006 0.349609 16.2402 -0.790039l0.259766 0.259766c-0.780273 2.36035 -1.0498 3.14062 -1.57031 5.5l-0.259766 0.260742
c-4.71973 -0.260742 -15.71 -1.05078 -24.8799 -2.62012l-0.790039 -0.520508c1.83008 -0.790039 2.36035 -1.83984 2.62012 -3.66992c1.58008 -7.59961 3.41016 -18.3301 4.98047 -26.1895l-0.790039 -4.19043l0.259766 -0.259766
c8.37988 1.83008 17.8096 3.66992 22.5195 4.18945zM406.68 188.2c3.14062 1.56934 7.33008 5.5 7.33008 5.50977c1.95996 -4.58008 0.970703 -2.70996 4.19043 -7.86035c10.1494 -0.459961 8.60938 0.0205078 20.4297 -1.0498l0.790039 4.70996
s-4.18945 0 -5.75977 1.83008c-1.0498 1.31055 -1.31055 3.14062 -1.57031 5.5c0 2.36035 0.270508 16.5 0.790039 20.6904c0.259766 4.18945 2.08984 20.4199 2.08984 23.04c0.260742 2.62012 1.0498 8.91016 0.260742 12.0498
c-4.82031 19.2803 -24.4307 17.8096 -50.0205 16.2402l-5.24023 -16.2402l2.62012 -2.87988c16.5498 16.5498 37.6201 4.56934 29.5898 -5.75977c-5.18945 -6.9209 -19.7393 -8.90039 -28.54 -17.0205c-6.47949 -6.49023 -12.2393 -20.9004 -5.5 -31.6904
c6.12988 -11.0391 17.29 -9.96973 17.54 -9.94922c2.87988 0 6.55078 0.519531 11 2.87988zM443.86 166.99c0 1.83984 0.269531 4.18945 0.269531 5.25l-0.259766 0.519531c-14.3604 8.98047 -26.8604 0.919922 -28.7998 -9.9502
c-2.83984 -16.0898 15.3594 -25.46 25.6602 -18.5898l0.519531 0.520508c0 0.259766 1.30957 4.4502 1.83008 6.2793l-0.259766 0.260742c-6.39062 -9.58008 -23.3203 -6.87012 -20.6904 10.21c1.91016 12.6602 15.3799 16.0801 21.7305 5.5zM449.63 254.72
c0 0 4.96973 -0.790039 4.99023 -3.66016c0 -2.08984 -4.98047 -55.25 -4.98047 -55.25c-0.109375 -1.48926 -0.339844 -6.80957 -7.58984 -6.80957l-0.790039 -4.70996c18.3906 -2.83008 19.3701 -3.04004 36.9199 -7.33008l0.520508 4.70996
c-13.0498 3.91992 -9.74023 7.37012 -4.4502 46.0898c1.09961 0.870117 8.62012 7.14062 20.6904 0.790039l11.2598 11.2598s-9.69043 8.90039 -14.9307 7.33008c-5.23926 -1.30957 -15.4492 -10.7393 -15.4492 -10.7393l1.56934 17.54
c-8.10938 4.0498 -27.0693 7.3291 -27.7598 7.3291v-6.5498zM460.62 140.28c9.42969 -2.35059 16.2402 2.62012 18.8496 11.5195c2.08984 7.60059 -1.56934 16.7598 -10.7393 19.3799c-6.54004 2.10059 -15.7109 -0.779297 -18.8506 -10.21
c-3.39941 -9.68945 2.62012 -18.5996 10.7402 -20.6895zM502.78 130.59c-0.780273 1.31055 -1.04004 2.10059 -0.799805 3.91016c1.22949 27.0098 1.5293 24.6602 1.0498 25.1396c-2.08984 0.790039 -5.5 2.09082 -7.58984 2.87988l-0.520508 -0.259766v-2.08984
c-3.92969 -6.01953 -10.4795 -15.4502 -13.8799 -20.1602l-2.62012 -1.83008v-0.259766c2.08984 -0.259766 4.70996 -1.30957 6.02051 -1.57031v0.260742l0.790039 3.39941c0.789062 1.0498 2.35938 3.66992 3.66992 5.5c0.40918 0 2.25 -0.549805 7.06934 -2.35938
c0.330078 -0.320312 0.330078 0.649414 -0.259766 -7.59082l-1.57031 -1.8291v-0.260742c1.57031 -0.519531 6.28027 -2.35938 8.64062 -2.87988zM498.07 220.41c-13.2207 -21.1504 -9.39062 -51.6006 9.66992 -52.9004c5.75977 -0.259766 9.42969 3.93066 9.68945 3.66992
l-2.08984 -6.80957c8.91016 -4.21973 11.4404 -5.29004 17.8105 -8.63965l1.83008 4.44922c-6.14062 3.51074 -1.29004 11.25 24.6191 84.3203c-6.13965 6.45996 -10.2998 10.0596 -22.5195 20.4297l-1.83008 -3.66992c1.62988 -1.35938 6.79004 -5.00977 4.4502 -11.2598
l-7.58984 -26.1904c-3.28027 12.79 -22.79 14.8701 -34.04 -3.39941zM527.4 141.07l2.35938 3.39941v0.520508c-3.41016 6.83008 -11.9395 7.41992 -14.6602 2.35938c-1.83984 -3.40918 0.260742 -7.06934 1.83008 -9.68945
c1.57031 -2.87988 3.14062 -6.29004 2.08984 -8.37988c-2.31934 -4.62988 -8.94922 -0.680664 -8.37988 4.97949l-0.790039 -0.259766c-2.09961 -4.7998 -1.83008 -4.00977 -1.83008 -4.70996c3.05078 -6.09961 12.8105 -7.12988 15.4502 -0.790039
c1.57031 3.15039 0.520508 6.80957 -1.0498 9.42969c-1.83008 3.40039 -4.18945 6.29004 -2.87988 8.37988c1.51953 2.65039 7.86035 0.470703 7.86035 -5.23926zM548.61 127.71l1.30957 3.91016l-0.259766 0.259766c-2.36035 2.08984 -8.64062 6.54004 -12.3105 8.90039
h-0.259766l-3.13965 -3.40039v-0.259766c4.7998 -0.320312 3.37988 0.149414 6.01953 -1.83008v-0.259766c-2.62012 -4.9707 -6.0293 -11.2607 -9.16992 -17.0205l-2.08984 -1.30957l-0.259766 -0.259766l5.75977 -4.4502l0.259766 0.259766
c-0.259766 0.530273 -0.519531 1.57031 0.790039 3.92969c2.87988 5.77051 6.28027 12.0508 8.64062 16.2402h0.259766c3.54004 -2.57031 2.49023 -1.43945 4.4502 -4.70996zM575.84 171.97l7.85059 10.46s-9.4209 18.8604 -23.04 16.5
c-20.8408 -4.0293 -3.15039 -34.21 -2.09082 -38.2295c4.33008 -15.1299 -16.3193 -12.5605 -13.3496 5.24023l-2.87988 2.08984l-4.98047 -14.4004s11.7803 -11.2598 20.1602 -10.4697c8.12012 0.790039 13.8799 6.29004 13.8799 16.5
c0 8.37988 -7.85938 22.7803 -7.85938 27.7598c0 6.86035 12.2695 4.75977 11.5195 -4.97949c-0.259766 -2.61035 -1.2998 -5.23047 -2.08984 -7.59082zM611.46 182.18c0.780273 -2.35938 1.57031 -1.83008 0.790039 0.270508
c-32.4697 98.9795 -132.76 138.78 -199.8 139.83c-50.54 0.779297 -89.5605 -11.79 -131.98 -35.8799l20.6904 61.0098l-33.7803 -65.7305l-8.89941 20.9502c3.13965 1.04004 6.2793 2.08984 6.2793 2.08984l-2.62012 8.64062s-3.13965 -0.780273 -7.33008 -2.09082
l-12.0498 28.2803l13.6201 -61.0098c-5.12012 2.55957 -19.0996 6.83008 -6.5498 19.3799l-2.62012 11c-6.97949 -2.21973 -13.2295 -3.62012 -32.21 -9.68945l-23.0801 11.5l59.1797 -42.6807l-4.70996 -2.08984l-17.2793 13.8799
c2.23926 -5.13965 3.2998 -12.1699 4.70996 -19.6396l-28.54 -13.0898l-30.1104 36.1396l-17.2803 -9.16992l13.6201 -42.4199l-11.2598 -4.98047l94.2695 29.3301l-3.66992 -10.4697l-0.519531 3.13965l-13.0898 -3.39941l4.97949 -24.6201l-4.4502 -12.3105
l-25.6592 30.6406l-39.8008 -10.21l18.8506 -58.9199c-60.1299 62.3994 -67.7002 66.3994 -61.7998 75.6797c2.09961 2.87988 7.85938 7.07031 7.85938 7.07031l-4.18945 7.06934c-26.7803 -18.3496 -27.8398 -19.1494 -58.4004 -42.6797l4.98047 -6.01953
s8.12012 5.75977 13.6201 5.5c7.81934 -0.350586 1.76953 2.93945 113.659 -98.7305l11.7803 8.37988l-27.7598 93.4805l35.8799 -42.1602l-4.70996 -13.8799l41.9004 88.5098c34.6699 -80.5098 29.1494 -66.9502 32.9893 -78.8203l-33.5195 67.2998l-2.36035 -4.44922
c1.2998 -1.30078 -0.919922 3.05957 22.7803 -59.4404c3.22949 -8.88965 -1.10059 -9.88965 -5.5 -12.8301l2.36035 -4.70996c15.3594 6.79004 22.9395 9.54004 39.0195 14.4004l-1.0498 4.97949c-8.89062 -1.33008 -10.1006 0.169922 -12.0498 4.4502
c-1.05078 2.09961 -14.1504 40.0703 -20.4307 58.6602l-10.21 4.97949l-2.35938 8.12012l61.54 -36.6602l-13.0908 -43.21c12.1904 3.26074 27.0303 6.74023 49.4902 9.9502l-0.259766 26.71l-4.98047 -1.0498c-0.669922 -13.7998 -6.0293 -22.0801 -19.6396 -22.7803
l22.2598 80.3906c-27.6201 -0.450195 -59.2695 -7.19043 -66.7695 -8.90039l3.92969 -16.5l-25.1396 19.6396l91.3896 20.6904l-85.6299 -9.16992c38.4902 22.5195 79.3398 39.0195 132.76 37.9697c131.46 -2.08984 180.95 -99.2402 191.95 -129.62zM203.48 295.57
l2.35938 -8.64062c7.82031 2.61035 10.8604 2.36035 11.2598 2.36035l-9.42969 7.58984c-2.36035 -0.790039 -4.18945 -1.30957 -4.18945 -1.30957zM347.24 257.07l-11.5303 -37.71l-21.7295 17.0195c6.7998 25.5 31.6895 21.29 33.2598 20.6904zM318.43 380.93
c224.94 0 321.83 -143.76 321.57 -227.55c0 -11 -0.269531 -17.5498 -0.790039 -19.6396c-0.259766 -2.10059 -1.0498 -0.790039 -1.0498 0.519531v9.9502c0 106.58 -121.51 223.37 -301.67 223.37c-61.2705 0 -103.69 -12.0498 -110.24 -13.8799l-1.57031 0.259766
c-6.80957 7.58984 -12.8301 9.69043 -21.21 11.7803v0.790039c8.91016 2.34961 56.5605 14.3994 114.96 14.3994zM529.49 211.25c-8.61035 -34.4502 -13.6504 -35.3496 -18.3301 -35.3604c-7.33008 0 -6.81055 9.43066 -6.02051 14.9307
c0.879883 9.72949 7.40039 34.6494 17.0205 33.5195c7.33008 -0.780273 8.63965 -7.33008 7.33008 -13.0898zM467.96 168.3c3.40039 -0.780273 7.84961 -4.4502 5.23047 -14.3896c-2.88086 -11.2598 -8.11035 -11.79 -11.7803 -10.7402
c-5.5 1.31055 -7.85059 7.84961 -6.02051 14.6602c3.14062 11.2598 9.9502 11.2598 12.5703 10.4697zM491 147.35v0.270508c1.0498 1.83008 5.5 8.63965 6.5498 9.9502c-0.269531 -3.66992 -0.790039 -10.2207 -0.790039 -12.0508
c-2.62012 0.780273 -3.92969 1.31055 -5.75977 1.83008z" />
    <glyph glyph-name="think-peaks" unicode="&#xf731;" horiz-adv-x="576" 
d="M465.4 38.5996l-206.2 353.801l-204.2 -352.101l-32 0.299805l236.2 407.4l206.2 -353.9l55.0996 95l32 -0.299805zM110.1 82.7002l149.601 257.899l235.8 -404.6l-32.5 0.0996094l-203.4 349.101l-117.399 -202.5h-32.1006z" />
    <glyph glyph-name="reacteurope" unicode="&#xf75d;" horiz-adv-x="576" 
d="M250.6 236.26l2 6.7998l-5.69922 4.30078l7.19922 0.0996094l2.30078 6.7998l2.2998 -6.7998l7.09961 -0.0996094l-5.7002 -4.30078l2.10059 -6.7998l-5.7998 4.10059zM314.3 236.26l1.90039 6.7998l-5.7002 4.30078l7.2002 0.0996094l2.2998 6.7998l2.2998 -6.7998
l7.2002 -0.0996094l-5.7002 -4.30078l2.10059 -6.7998l-5.80078 4.10059zM223 185.76c4.90039 0 3.7998 -3.89941 3.7998 -13.7598c0 -10.2998 -6.7002 -14.0996 -16.7998 -14.0996h-0.200195c-10.0996 0 -16.7998 3.69922 -16.7998 14.0996v40.0596
c0 9.90039 6.7002 14.1006 16.7998 14.1006h0.200195c10.0996 0 16.7998 -4.2002 16.7998 -14.1006c0 -8.39941 0.900391 -12.1992 -3.7998 -12.2998h-3.40039c-4.5 0 -3.7998 3.2998 -3.7998 10.5c0 4.7002 -2.2998 6.10059 -5.7998 6.10059
s-5.7998 -1.40039 -5.7998 -6.10059v-36.5996c0 -4.7002 2.2998 -6.10059 5.7998 -6.10059s5.7998 1.40039 5.7998 6.10059c0 8.09961 -1 12.0996 3.7998 12.0996h3.40039zM142.3 168.36c2.5 0 3.7998 -1.30078 3.7998 -3.80078v-2.09961
c0 -2.5 -1.2998 -3.7998 -3.7998 -3.7998h-21.8994c-2.5 0 -3.80078 1.2998 -3.80078 3.7998v59.0996c0 2.5 1.30078 3.90039 3.7002 3.80078h21.7002c2.5 0 3.7998 -1.30078 3.7998 -3.80078v-2.09961c0 -2.5 -1.2998 -3.7998 -3.7998 -3.7998h-14.4004v-18.2998h11.4004
c2.5 0 3.7998 -1.30078 3.7998 -3.80078v-2.09961c0 -2.5 -1.2998 -3.7998 -3.7998 -3.7998h-11.4004v-19.2998h14.7002zM100.3 186.86l8.10059 -23.9004c0.799805 -2.59961 -0.400391 -4.40039 -3.2002 -4.40039h-3.2998
c-0.0820312 -0.00585938 -0.21582 -0.0107422 -0.297852 -0.0107422c-1.81543 0 -3.6084 1.43848 -4.00293 3.21094l-7.39941 23.5h-5.60059v-22.8994c0 -2.5 -1.2998 -3.80078 -3.7998 -3.80078h-3.39941c-2.5 0 -3.80078 1.30078 -3.80078 3.80078v59.0996
c0 2.5 1.30078 3.7998 3.80078 3.7998h13.3994c10.1006 0 16.7998 -4 16.7998 -14.0996v-11.9004c0 -6.39941 -2.69922 -10.3994 -7.2998 -12.3994zM96.5 200.86v8.69922c0 4.80078 -2.5 6.10059 -6.09961 6.10059h-5.80078v-20.9004h5.80078
c3.59961 0 6.09961 1.2998 6.09961 6.10059zM176 222l11.2002 -59.2002c0.5 -2.7002 -0.799805 -4.09961 -3.40039 -4.09961h-3.5c-0.100586 -0.00976562 -0.264648 -0.0185547 -0.366211 -0.0185547c-1.94531 0 -3.61816 1.57617 -3.7334 3.51855l-1.7998 11.2998h-12.2002
l-1.7998 -11.2998c-0.116211 -1.94238 -1.78809 -3.51855 -3.7334 -3.51855c-0.101562 0 -0.265625 0.00878906 -0.367188 0.0185547h-3c-2.5 0 -3.89941 1.39941 -3.39941 4.09961l11 59.2002c0.135742 1.88477 1.78027 3.41504 3.66992 3.41504
c0.0908203 0 0.239258 -0.00683594 0.330078 -0.0146484h6.89941c0.110352 0.0117188 0.290039 0.0205078 0.401367 0.0205078c1.89844 0 3.60059 -1.53223 3.79883 -3.4209zM163.7 182.7h9.39941l-4.69922 29.7002zM253 162.5c0 -2.45996 -1.2998 -3.83984 -3.7998 -3.7998
h-3.40039c-2.5 0 -3.7998 1.2998 -3.7998 3.7998v53.2002h-7.2998c-2.5 0 -3.7998 1.2998 -3.7998 3.7998v2.09961c0 2.5 1.2998 3.80078 3.7998 3.80078h25.7998c2.5 0 3.7998 -1.30078 3.7998 -3.80078v-2.09961c0 -2.5 -1.2998 -3.7998 -3.7998 -3.7998h-7.5v-53.2002z
M501 163.3c0.0449219 0.00390625 0.119141 -0.0322266 0.164062 -0.0322266c1.01562 0 1.84082 -0.824219 1.84082 -1.83984c0 -0.0351562 -0.00292969 -0.0927734 -0.00488281 -0.12793v-0.799805c0.00195312 -0.0273438 0.00292969 -0.0722656 0.00292969 -0.100586
c0 -0.999023 -0.810547 -1.80957 -1.81055 -1.80957c-0.0527344 0 -0.139648 0.00488281 -0.192383 0.00976562h-22.5c-0.0527344 -0.00488281 -0.139648 -0.00976562 -0.192383 -0.00976562c-1 0 -1.81055 0.810547 -1.81055 1.80957
c0 0.0283203 0.000976562 0.0732422 0.00292969 0.100586v63c-0.00878906 0.0625 -0.0166016 0.166016 -0.0166016 0.229492c0 0.893555 0.725586 1.62012 1.62012 1.62012c0.111328 0 0.289062 -0.0224609 0.396484 -0.0498047h22.2002
c0.0644531 0.00878906 0.169922 0.015625 0.235352 0.015625c0.977539 0 1.77051 -0.792969 1.77051 -1.76953c0 -0.0400391 -0.00292969 -0.105469 -0.00585938 -0.145508v-0.800781c0.00195312 -0.03125 0.00292969 -0.0820312 0.00292969 -0.113281
c0 -1.04297 -0.84668 -1.88965 -1.88965 -1.88965c-0.03125 0 -0.0820312 0.000976562 -0.113281 0.00292969h-19.1006v-25.7998h16.1006c0.03125 0.00195312 0.0820312 0.00390625 0.113281 0.00390625c1.04297 0 1.88965 -0.84668 1.88965 -1.89062
c0 -0.03125 -0.000976562 -0.0820312 -0.00292969 -0.113281v-0.799805c0.00195312 -0.03125 0.00292969 -0.0820312 0.00292969 -0.113281c0 -1.04297 -0.84668 -1.88965 -1.88965 -1.88965c-0.03125 0 -0.0820312 0.000976562 -0.113281 0.00292969h-16.1006v-26.7002
h19.4004zM407.9 226.2c10.0996 0 15.2998 -4.74023 15.2998 -14.1006v-40.0996c0 -9.2998 -5.2002 -14.0996 -15.2998 -14.0996h-0.800781c-10.0996 0 -15.2998 4.7998 -15.2998 14.0996v40.0996c0 9.40039 5.2002 14.1006 15.2998 14.1006h0.800781zM418.1 173.8v36.6006
c0 7.89941 -3 11.0996 -10.5 11.0996s-10.5 -3.2002 -10.5 -11.0996v-36.6006c0 -8 3 -11.0996 10.5 -11.0996s10.4004 3.09961 10.5 11.0996zM371.6 188.3l10.6006 -27.2998c0.5 -1.2998 -0.100586 -2.2998 -1.5 -2.2998h-1.5
c-0.0351562 -0.00195312 -0.0927734 -0.00390625 -0.128906 -0.00390625c-0.886719 0 -1.85938 0.673828 -2.1709 1.50391l-10.4004 27.2002h-11.5996v-26.9004c0.00390625 -0.0458984 0.0078125 -0.12207 0.0078125 -0.167969
c0 -0.960938 -0.779297 -1.74023 -1.74023 -1.74023c-0.0458984 0 -0.12207 0.00390625 -0.167969 0.0078125h-1.2002c-0.0527344 -0.00488281 -0.139648 -0.00976562 -0.192383 -0.00976562c-0.999023 0 -1.81055 0.810547 -1.81055 1.80957
c0 0.0283203 0.00195312 0.0732422 0.00292969 0.100586v63c-0.000976562 0.0273438 -0.00292969 0.0722656 -0.00292969 0.100586c0 0.999023 0.811523 1.80957 1.81055 1.80957c0.0527344 0 0.139648 -0.00488281 0.192383 -0.00976562h13.7002
c10.0996 0 15.2998 -4.7002 15.2998 -14.1006v-9.7002c0 -7.19922 -3.09961 -11.6992 -9.2002 -13.2998zM365.2 192.2c7.5 0 10.5 3.16016 10.5 11v6.39941c0 8 -3 11.1006 -10.5 11.1006h-10.2002v-28.5h10.2002zM451.1 225.3c10.1006 0 15.3008 -4.7002 15.3008 -14.0996
v-10.5c0 -9.2998 -5.2002 -14.1006 -15.3008 -14.1006h-10.5996v-26.0996c0.00488281 -0.0458984 0.0078125 -0.12207 0.0078125 -0.167969c0 -0.960938 -0.779297 -1.74023 -1.73926 -1.74023c-0.046875 0 -0.12207 0.00390625 -0.168945 0.0078125h-1.19922
c-0.0537109 -0.00488281 -0.139648 -0.00976562 -0.193359 -0.00976562c-0.999023 0 -1.80957 0.810547 -1.80957 1.80957c0 0.0283203 0.000976562 0.0732422 0.00292969 0.100586v63c-0.00976562 0.0625 -0.0166016 0.166016 -0.0166016 0.229492
c0 0.893555 0.725586 1.62012 1.62012 1.62012c0.111328 0 0.288086 -0.0224609 0.396484 -0.0498047h13.6992zM461.3 202.5v7.09961c0 7.90039 -3 11.1006 -10.5 11h-10.2002v-29.1992h10.2002c7.5 0 10.5 3.19922 10.5 11.0996zM259.5 140l7.09961 -0.0996094
l-5.69922 -4.30078l2.09961 -6.7998l-5.7998 4.10059l-5.7998 -4.10059l2.09961 6.7998l-5.7002 4.30078l7.10059 0.0996094l2.2998 6.7998zM487.1 276.1c122.301 -46.0996 118.401 -132.54 -33.8984 -176.34c13.3994 -49.7002 18.0996 -101.899 0.0996094 -133.8
c-3.7998 -6.7002 -16.7998 -27.7002 -47.5996 -27.7002c-41.5 0 -110.2 41.6006 -182.101 142c-42.7998 3.5 -72.1992 10.1006 -84.5996 13c-20.5 -82.2998 -6.7998 -125.3 15.5 -137.899c1.2002 -0.700195 38.4004 -27.2002 120.9 52.7998
c3.39941 -3.5 6.79883 -6.90039 10.1982 -10.2002c-63.0996 -61.2002 -110.199 -71 -138.199 -55.2002c-32.4004 18.2998 -42.8008 72 -22.3008 153.9c-18.8994 5 -121.6 33.2002 -122.1 92.7998c-0.400391 40.9004 49.7998 74.7002 120.3 95
c-13.3994 49.5996 -18.2002 101.8 -0.0996094 133.8c3.7998 6.74023 16.7998 27.7402 47.5996 27.7402c41.6006 0 110.3 -41.6396 182.2 -142.14c23.6113 -1.88379 61.5127 -7.70801 84.5996 -13c20.5 82 6.90039 125.1 -15.5 137.8
c-1.2998 0.700195 -38.3994 27.2002 -120.899 -52.7998c-3.40039 3.5 -6.80078 6.89941 -10.2002 10.1992c52.2998 50.9404 103.7 74.6006 138.2 55.2402c33.8994 -19.2002 41.8994 -75.8994 22.2998 -153.899c9.98535 -2.61523 25.9346 -7.67773 35.5996 -11.3008z
M135.901 411.16c-23.1006 -40.7998 1 -121.562 1.19922 -122.961c22.9912 5.78516 60.8018 12.3262 84.4004 14.5996c12.7793 18.6787 35.4922 47.4404 50.7002 64.2002c3.39941 -3.33301 6.7998 -6.74609 10.2002 -10.2393
c-12.5371 -13.7451 -31.4434 -37.2207 -42.2002 -52.3994c14.8213 1.11914 38.9141 2.02734 53.7783 2.02734c11.082 0 29.0566 -0.504883 40.1211 -1.12793c-64.5 86.6006 -126.5 126.2 -163.3 126.2c-23 0 -32 -15.2002 -34.8994 -20.2998zM440.701 -27.1406
c3.2998 6 21.5 38.5996 -1.2002 123c-4.09961 -1.10059 -37.0996 -9.90039 -84.4004 -14.6006c-12.7578 -18.6943 -35.4717 -47.4551 -50.6992 -64.2002c-3.40039 3.2998 -6.80078 6.7002 -10.2002 10.2002c12.5371 13.7461 31.4424 37.2207 42.2002 52.4004
c-14.7715 -1.14258 -38.7842 -2.06934 -53.5996 -2.06934c-11.1328 0 -29.1875 0.524414 -40.3008 1.16895c64.5996 -86.7998 126.6 -126.2 163.3 -126.2c23.1006 0 32 15.2002 34.9004 20.3008zM449.801 111.459c25.6006 7.2998 85.9004 27.4004 105.7 62.5
c1.40039 2.5 33.5 50.5 -72.5996 90.4004c-9.36914 3.51562 -24.8252 8.44336 -34.5 11c-3.60059 -12.9004 -7.90039 -26.1006 -12.8008 -39.5c-3.15723 -0.430664 -7.14453 -2.93945 -8.89941 -5.60059l-0.100586 0.100586
c-1.6416 1.55762 -4.68848 3.48438 -6.7998 4.2998c5.7002 15 10.6006 29.7998 14.6006 44.2002c-7.2002 1.69922 -31.8008 7.59961 -72.2002 11.6992c16.7002 -24.5 27.8994 -44.0996 34.2998 -55.5c-3.50781 -1.14648 -8.16699 -4.46094 -10.4004 -7.39941
c-13.5996 16.3994 -11 19.8994 -42.5 64.5c-13.752 0.96582 -36.1016 1.75 -49.8877 1.75c-17.2871 0 -45.292 -1.23145 -62.5117 -2.75c-16.9004 -25 -28.2998 -45.2002 -34.7998 -56.9004c-3.49707 -1.49023 -8.06738 -5.25391 -10.2002 -8.39941
c-0.914062 2.88965 -3.78125 6.47363 -6.40039 8c6.10059 11.3994 16.9004 31 32.7998 55.2998c-39.5996 -4.60059 -65 -11.2002 -72 -13c4.30078 -14.1006 9.40039 -28.6006 15.2002 -43.2998c-0.71582 -0.522461 -1.74609 -1.50781 -2.2998 -2.2002
c-1.5 1.89941 -4 5.2998 -14.4004 5.2998c-4.69922 12.2998 -8.7998 24.5 -12.3994 36.4004c-138.8 -40.3604 -158.4 -121.36 1.5 -164c3.59961 12.8994 7.7998 26 12.7002 39.3994c0.269531 -0.0146484 0.708008 -0.0273438 0.978516 -0.0273438
c1.68359 0 4.33594 0.460938 5.9209 1.02734c3 -1.2002 5.2002 -1 8.40039 -1c-5.5 -14.5996 -10.2002 -28.8994 -14.1006 -42.8994c19.7119 -4.56055 52.0576 -9.80176 72.2002 -11.7002c-16.2998 23.8994 -27.5 43.3994 -33.7998 54.5996
c8.7002 0 10.7002 1.60059 12.5996 3.2002c0.794922 -0.480469 2.13965 -1.15234 3 -1.5c15.3008 -26.7002 28.9004 -46.5996 36.8008 -57.7998c13.751 -0.96582 36.1006 -1.75 49.8857 -1.75c17.2871 0 45.2939 1.23145 62.5137 2.75
c16.5 24.2998 27.7002 44 33.9004 55.2002c7.2998 0 9.7998 3 10.8994 4.19922c1.5332 -1.11426 4.2207 -2.54785 6 -3.19922c-15 -28 -28.6992 -48.9004 -32.1992 -54.2002c20.1172 2.22656 52.373 8.05078 72 13c-4.10059 13.7998 -9 27.8994 -14.7002 42.2002
c1.65723 0.743164 4.07617 2.35645 5.39941 3.59961l0.100586 0.0996094c2.07227 -3.14648 6.8125 -5.7002 10.5811 -5.7002c0.0322266 0 0.0859375 0 0.119141 0.000976562c4.69922 -12.3008 8.7998 -24.5 12.3994 -36.4004zM335.401 225.459
c0.0556641 0.00585938 0.145508 0.0107422 0.201172 0.0107422c1.05566 0 1.95117 -0.856445 1.99805 -1.91113v-51.5c0 -9.5 -5 -14.0996 -15.0996 -14.0996h-0.400391c-10.0996 0 -15.0996 4.5 -15.0996 14.0996v51.5
c-0.00195312 0.0283203 -0.00292969 0.0732422 -0.00292969 0.100586c0 0.999023 0.810547 1.81055 1.81055 1.81055c0.0527344 0 0.139648 -0.00488281 0.192383 -0.0107422h1.2002c0.0615234 0.00878906 0.162109 0.0146484 0.224609 0.0146484
c0.933594 0 1.69043 -0.756836 1.69043 -1.68945c0 -0.0625 -0.00683594 -0.163086 -0.015625 -0.225586v-49.7998c0 -8 2.60059 -11.0996 10.1006 -11.0996s10.0996 3.2002 10.0996 11.0996v49.7998c-0.00390625 0.046875 -0.0078125 0.12207 -0.0078125 0.168945
c0 0.959961 0.779297 1.73926 1.74023 1.73926c0.0458984 0 0.121094 -0.00292969 0.167969 -0.0078125h1.2002zM321.701 139.999l7.09961 -0.0996094l-5.7002 -4.30078l2.10059 -6.7998l-5.7998 4.10059l-5.80078 -4.10059l2.10059 6.7998l-5.7002 4.30078
l7.09961 0.0996094l2.30078 6.7998zM290.601 132.599l7.10059 -0.0996094l-5.7002 -4.2998l2.09961 -6.7998l-5.7998 4.09961l-5.7998 -4.09961l2.09961 6.7998l-5.69922 4.2998l7.09961 0.0996094l2.2998 6.80078zM295.701 163.399
c0.0507812 0.00488281 0.133789 -0.03125 0.185547 -0.03125c1.00977 0 1.83008 -0.819336 1.83008 -1.83008c0 -0.0664062 -0.00683594 -0.172852 -0.015625 -0.239258v-0.799805c0.00292969 -0.0400391 0.00585938 -0.105469 0.00585938 -0.145508
c0 -0.977539 -0.792969 -1.77051 -1.77051 -1.77051c-0.0654297 0 -0.170898 0.00683594 -0.235352 0.015625h-22.5c-0.0537109 -0.00488281 -0.139648 -0.00976562 -0.193359 -0.00976562c-0.999023 0 -1.80957 0.810547 -1.80957 1.80957
c0 0.0283203 0.000976562 0.0732422 0.00292969 0.100586v63c-0.00195312 0.0273438 -0.00292969 0.0722656 -0.00292969 0.100586c0 0.999023 0.810547 1.80957 1.80957 1.80957c0.0537109 0 0.139648 -0.00488281 0.193359 -0.00976562h22.2002
c0.0644531 0.00878906 0.169922 0.015625 0.235352 0.015625c0.977539 0 1.77051 -0.792969 1.77051 -1.77051c0 -0.0400391 -0.00292969 -0.105469 -0.00585938 -0.145508v-0.799805c0.00195312 -0.03125 0.00292969 -0.0820312 0.00292969 -0.113281
c0 -1.04395 -0.84668 -1.89062 -1.88965 -1.89062c-0.03125 0 -0.0820312 0.00195312 -0.113281 0.00390625h-19.1006v-25.7998h16.1006c0.03125 0.00195312 0.0820312 0.00292969 0.113281 0.00292969c1.04297 0 1.88965 -0.84668 1.88965 -1.88965
c0 -0.03125 -0.000976562 -0.0820312 -0.00292969 -0.113281v-0.800781c0.00195312 -0.03125 0.00292969 -0.0820312 0.00292969 -0.113281c0 -1.04297 -0.84668 -1.88965 -1.88965 -1.88965c-0.03125 0 -0.0820312 0.000976562 -0.113281 0.00292969h-16.1006v-26.6992
h19.4004zM288.301 262.799l2.2998 -6.7998l7.10059 -0.0996094l-5.7002 -4.30078l2.09961 -6.7998l-5.7998 4.10059l-5.7998 -4.10059l2.09961 6.7998l-5.69922 4.30078l7.09961 0.0996094z" />
    <glyph glyph-name="adobe" unicode="&#xf778;" horiz-adv-x="512" 
d="M315.5 384h170.9v-384zM196.5 384l-170.9 -384v384h170.9zM256 241.9l107.5 -241.9h-73l-30.7002 76.7998h-78.7002z" />
    <glyph glyph-name="artstation" unicode="&#xf77a;" horiz-adv-x="512" 
d="M2 70.5996h315.1l59.2002 -102.6h-285.399h-0.0146484c-17.4814 0 -38.0381 12.6787 -45.8857 28.2998zM501.8 98c19 -29.4004 -0.0996094 -55.9004 -2 -59.0996l-40.7002 -70.5l-257.3 447.6h88.4004h0.0117188c17.0596 0 37.3936 -12.2305 45.3877 -27.2998zM275 143.5
h-231l115.5 200z" />
    <glyph glyph-name="atlassian" unicode="&#xf77b;" horiz-adv-x="512" 
d="M152.2 211.6c66.2998 -70.7998 89.0996 -189.3 51.2002 -267.1c-2.40039 -5.2002 -7.60059 -8.5 -13.4004 -8.40039h-175c-11 0 -18.4004 11.7002 -13.4004 21.7002l125.801 251c5.09961 10.5 17.0996 11 24.7998 2.7998zM244.4 439.9
c6.7998 10.8994 20.2998 10.6992 25.5996 0.0996094c5.90039 -11.7002 240.4 -482.3 240.4 -482.3c5 -9.90039 -2.2002 -21.7002 -13.4004 -21.7002h-174.2c-5.7002 0 -10.8994 3.2998 -13.3994 8.40039c-73.5 146.899 -187.301 302.1 -65 495.5z" />
    <glyph glyph-name="canadian-maple-leaf" unicode="&#xf785;" horiz-adv-x="512" 
d="M383.8 96.2998c-5 -5 -10 -7.5 -5 -22.5s10 -35.0996 10 -35.0996s-95.2002 20.0996 -105.2 22.5996c-8.89941 0.900391 -18.3994 -2.39941 -18.3994 -12.5c0 -10.0996 5.7998 -112.8 5.7998 -112.8h-30s5.7998 102.8 5.7998 112.8s-9.59961 13.4004 -18.2998 12.5
c-10.0996 -2.5 -105.3 -22.5996 -105.3 -22.5996s5 20.0996 10.0996 35.0996c4.90039 15 0 17.5 -5.09961 22.5c-2.60059 2.5 -105.2 92.4004 -105.2 92.4004l17.5 7.59961c10 4.90039 7.40039 11.4004 5 17.4004c-2.5 7.59961 -20.0996 67.2998 -20.0996 67.2998
s47.5996 -10 57.6992 -12.5c7.5 -2.40039 10 2.5 12.5 7.5s15 32.2998 15 32.2998s52.6006 -59.7998 55.1006 -62.2998c10.0996 -7.5 20.0996 0 17.5996 10c0 10 -27.5996 129.6 -27.5996 129.6s30.0996 -17.3994 40.0996 -22.3994c7.60059 -5 12.6006 -5 17.6006 5
c5 7.5 42.5 79.7998 42.5 79.7998s37.5996 -72.2998 42.6992 -79.7998c5 -10 10.1006 -10 17.6006 -5c10 5 40.0996 22.3994 40.0996 22.3994s-27.5996 -119.6 -27.5996 -129.6c-2.5 -10 7.59961 -17.5 17.5996 -10c2.5 2.40039 55.1006 62.2998 55.1006 62.2998
s12.5 -27.3994 15 -32.3994s5 -9.90039 12.5 -7.5c10 2.5 57.6992 12.5 57.6992 12.5s-17.6992 -59.7002 -20.0996 -67.3008c-2.40039 -5.89941 -5 -12.5 5 -17.3994l17.5 -7.5s-102.7 -89.9004 -105.2 -92.4004z" />
    <glyph glyph-name="centos" unicode="&#xf789;" 
d="M289.6 350.5l31.6006 -31.7002l-76.2998 -76.5v108.2h44.6992zM127.2 318.8l31.5996 31.7002h44.7002v-108.2zM168.7 360.4l55.5 55.5996l55.5 -55.5996h-44.7002v-127.9l-10.7998 -10.7998l-10.7998 10.7998v127.9h-44.7002zM194.9 192.3l-10.8008 -10.7998h-128.6
v-44.7998l-55.5 55.5996l55.5 55.6006v-44.8008h128.6zM274.2 213l76.2998 76.5l31.5996 -31.7002v-44.7998h-107.899zM447.5 192.3l-55.5 -55.5996v44.7998h-127.7l-10.7998 10.7998l10.7998 10.7998h127.7v44.8008zM65.4004 271.8v78.7002h79.3994l-31.5996 -31.7002
l90.2998 -90.5v-15.2998h-15.2998l-90.2998 90.5zM382.1 350.5v-78.7002l-31.5996 31.7002l-90.2998 -90.5h-15.2998v15.2998l90.2998 90.5l-31.6006 31.7002h78.5zM203.5 34.0996v-0.0996094h-44.7002l-31.5996 31.7002l76.2998 76.5v-108.101zM65.4004 213v44.7998
l32.5 31.7002l76.2998 -76.5h-108.8zM382.1 112.8v-78.7002h-78.5l31.6006 31.7002l-90.2998 90.5v15.2998h15.2998l90.2998 -90.5zM382.1 171.6v-44.7998l-31.5996 -31.7002l-76.2998 76.5h107.899zM321.2 65.7998l-31.6006 -31.5996h-44.6992v108.1zM97.9004 95.0996
l-32.5 31.7002v44.7998h108.8zM279.7 24.2002l-55.5 -55.6006l-55.5 55.6006h44.7002v127.899l10.7998 10.8008l10.7998 -10.8008v-127.899h44.7002zM113.2 65.7998l31.5996 -31.7002h-79.3994v78.7002l32.5 -31.7002l90.2998 90.5h15.2998v-15.2998z" />
    <glyph glyph-name="confluence" unicode="&#xf78d;" horiz-adv-x="512" 
d="M2.2998 35.7998c42.2998 66.9004 125.2 233.2 373.101 112.601c39.6992 -19.1006 83.6992 -39.9004 105.899 -50.3008c8 -3.69922 11.7002 -13.1992 8.10059 -21.2998l-50.4004 -114.1c-0.0996094 -0.100586 -0.0996094 -0.299805 -0.200195 -0.400391
c-3.89941 -8.09961 -13.5996 -11.5996 -21.7002 -7.7002c-200.399 95.2002 -213.8 111.5 -280.899 -0.699219c0 0 -0.100586 -0.100586 -0.100586 -0.200195c-4.69922 -7.7002 -14.6992 -10 -22.3994 -5.2998l-105.9 65.1992c-7.59961 4.7002 -10 14.6006 -5.5 22.2002z
M509.7 347.9c-42.6006 -67.5 -125.4 -232.9 -373.4 -112.9c-39.7002 19.2002 -83.7998 40 -106 50.4004c-8 3.69922 -11.7002 13.1992 -8.09961 21.2998l50.5 114.1c0.0996094 0.100586 0.0996094 0.299805 0.200195 0.400391
c3.89941 8.09961 13.5996 11.5996 21.6992 7.7002c199.5 -94.7002 213.301 -111.7 280.601 0.899414c0.200195 0.400391 0.399414 0.700195 0.599609 1c5 7.5 15.1006 9.40039 22.6006 4.40039l105.8 -65.1006c7.59961 -4.69922 10 -14.5996 5.5 -22.1992z" />
    <glyph glyph-name="dhl" unicode="&#xf790;" horiz-adv-x="640" 
d="M238 146.8l22.2998 30.2002h58.7002l-22.2998 -30.2002h-58.7002zM0 165.1h86.5l-4.7002 -6.39941h-81.7998v6.39941zM172.9 177h68.1992c-5.69922 -7.7998 -24.0996 -30.2998 -57.1992 -30.2998h-100.101l41.1006 55.7998h51c5.59961 0 5.59961 -2.2002 2.7998 -5.90039
c-2.7998 -3.69922 -7.60059 -10.2998 -10.4004 -14.0996c-1.39941 -1.90039 -4.09961 -5.5 4.60059 -5.5zM490.4 183.9h-62.2002l39.2998 53.3994h62.2002zM95.2998 177l-4.7002 -6.40039h-90.5996v6.40039h95.2998zM206.3 203.6
c2.7998 3.7002 2.90039 5.90039 -2.7002 5.90039h-111.399l20.3994 27.7998h117.9c29.9004 0 37.5996 -23.5996 29.2002 -35c-6.2002 -8.39941 -13.5 -18.3994 -13.5 -18.3994h-45.6006c-8.69922 0 -6 3.5 -4.59961 5.5c2.7998 3.7998 7.5 10.3994 10.2998 14.1992zM0 146.8
v6.40039h77.7998l-4.7002 -6.40039h-73.0996zM323 146.8c0 0 22.2002 30.2002 22.2998 30.2002h58.7002l-22.2998 -30.2002h-58.7002zM545 146.7l4.7002 6.39941h90.2998v-6.39941h-95zM567.3 177h72.7002v-6.40039h-77.4004zM553.8 158.7l4.7002 6.39941h81.5v-6.39941
h-86.2002zM389.6 237.3h58.7002l-39.2998 -53.3994h-143.6l39.2998 53.3994h58.7002l-22.5 -30.5996h26.1992zM423.1 177h133.4l-22.2998 -30.2998h-94.2998c-24.1006 0 -30.6006 11.5996 -23.2002 21.5996c2.09961 2.7998 6.39941 8.7002 6.39941 8.7002z" />
    <glyph glyph-name="diaspora" unicode="&#xf791;" horiz-adv-x="512" 
d="M251.64 93.4502c-1.39941 0 -88 -119.9 -88.6992 -119.9c-0.700195 0 -86.6006 60.4502 -86.9404 61.2002s86.5996 125.7 86.5996 127.4c0 2.19922 -129.6 44 -137.6 47.0996c-1.2998 0.5 31.4004 101.8 31.7002 102.1c0.599609 0.700195 144.399 -47 145.5 -47
c0.399414 0 0.899414 0.600586 1 1.30078c0.399414 2 1 148.6 1.7002 149.6c0.799805 1.2002 104.5 0.700195 105.1 0.299805c1.5 -1 3.5 -156.1 6.09961 -156.1c1.40039 0 138.7 47 139.301 46.2998c0.799805 -0.900391 31.8994 -102.2 31.5 -102.6
c-0.900391 -0.900391 -140.2 -47.1006 -140.601 -48.8008c-0.299805 -1.39941 82.7998 -122.1 82.5 -122.899s-85.5 -63.5 -86.2998 -63.5c-1 0.200195 -89 125.5 -90.9004 125.5h0.0400391z" />
    <glyph glyph-name="fedex" unicode="&#xf797;" horiz-adv-x="640" 
d="M586 163.5l54 -60.5h-64.4004l-22.2998 25l-22.0996 -25h-212.2v11.9004h-0.5c-7.90039 -11.7002 -20.7998 -18.6006 -34.9004 -18.6006c-32.6992 0 -56.3994 26.4004 -60.0996 56.9004h-85.5c0 -23.5 31.0996 -35.5 45.7998 -14.6006h42
c-27.5996 -67.6992 -130.2 -49.3994 -130.2 23.7002c0 6.40039 0.800781 12.5 2.30078 18.2002h-48.9004v-77.5h-49v184.4h109v-41.1006h-60v-26.2002h54.7998v-24.1992c24.5 43.5996 103.9 45.3994 121.9 -14c7.5 25.5 28.8994 44.8994 57.2998 44.8994
c13.9004 0 25.7998 -3.7998 35.4004 -14.7998h0.5v75.5h151.199v-48.0996h-56.0996v-16h118.7l22.5 -24.8008l21.7002 24.8008h62.3994zM139.3 180.1h46.5c-4.7998 25.6006 -40.3994 26.3008 -46.5 0zM292.7 131.2c34.5 0 32.5996 62.7998 0 62.7998
c-34 0 -34.6006 -62.7998 0 -62.7998zM460.5 112.1v29.6006h-56.0996v44.7002h56.0996v28.0996h-55.5v33.9004h56.0996v30.1992h-95v-166.5h94.4004zM414.6 151.9h56.1006v-45.6006l50.7002 57l-50.7002 57v-44h-56.1006v-24.3994zM553.2 141.6l26.2998 -29.5h40.5
l-46 51.4004l45.4004 51h-38.5l-25.6006 -29.2998l-26.5996 29.2998h-39.7002l45.5996 -51.2002l-45.5996 -51.2002h38.0996z" />
    <glyph glyph-name="fedora" unicode="&#xf798;" 
d="M225 416c123.7 -0.299805 223.7 -100.9 223.4 -224.6c-0.300781 -123.7 -100.9 -223.7 -224.601 -223.4l-170.2 0.400391v0c-29.5879 0 -53.6006 24.0127 -53.6006 53.5996c0 0.0830078 0.000976562 0.216797 0.000976562 0.299805l0.400391 170.3
c0.399414 123.7 100.899 223.7 224.6 223.4zM394.8 258.8c-0.0771484 6.26953 -1.33203 16.3047 -2.7998 22.4004l-55.2002 56.0996v-1.59961c0 -5.10059 -1.5 -9.60059 -3.7998 -14.2998zM331 353.7c1.65332 -2.31348 3.53516 -6.43555 4.2002 -9.2002l54.2998 -54.5996
c-8.27539 24.8252 -34.4834 53.4082 -58.5 63.7998zM118.1 200.8c-4.54785 -0.369141 -11.8057 -1.66895 -16.1992 -2.89941l8.5 -8.5c1.68457 3.44336 5.13477 8.55078 7.69922 11.3994zM97 196.6c-3.91211 -1.08984 -10.0498 -3.41895 -13.7002 -5.19922l27 -27.2002
c-1.30469 3.32617 -2.37988 8.92676 -2.39941 12.5l0.899414 8zM78.7998 189.2c-3.21484 -1.79492 -8.23242 -5.02051 -11.2002 -7.2002l35.3008 -35.9004c3.70801 1.84668 10.0254 3.95215 14.0996 4.7002zM63.5996 179.4
c-3.06738 -2.29395 -7.5918 -6.50488 -10.0996 -9.40039l34.9004 -34.5996c2.66113 2.6377 7.36523 6.44629 10.5 8.5zM50.2998 167.1c-2.89941 -3.2998 -5.7998 -6.69922 -8.59961 -10.5l35.7998 -35.8994c1.74121 3.40527 5.19141 8.5127 7.7002 11.3994zM39.2998 152.8
c-2.07715 -3.18457 -5.0791 -8.56055 -6.7002 -12l39.5 -39.7998c0.306641 4.3584 1.91895 11.168 3.60059 15.2002zM30.5 136.5c-1.7998 -4.90039 -3.2998 -9.59961 -4.7002 -14.5l52.7002 -53.5c-3.42578 6.82812 -6.42773 18.5654 -6.7002 26.2002zM22.5996 93.5
c0.0380859 -6.14551 1.33789 -15.957 2.90039 -21.9004l55.4004 -55.6992v1.09961c0.0341797 4.18848 1.64746 10.5947 3.59961 14.2998zM27.9004 62.7998c8.29785 -24.8047 34.5059 -53.3867 58.5 -63.7998c-1.61816 2.33008 -3.5 6.45117 -4.2002 9.2002zM22.5996 99.7998
l64.4004 -64.2002c2.30469 2.8877 6.74023 6.78613 9.90039 8.7002l-72.2002 72.5c-1.08105 -4.62988 -2.02148 -12.2461 -2.10059 -17zM275.9 151.6c32.5996 -0.0996094 32.6992 49.2002 0.199219 49.4004l-33.5996 0.0996094
c-4.91309 0.0224609 -8.90039 4.02734 -8.90039 8.94043v0.0595703l0.100586 47c0.0996094 40.5 38.5996 60.8008 66 54.9004c15.3994 -3.90039 30.2998 8.40039 30.2998 23.9004c0 12.0996 -8.7002 22.1992 -19.9004 24
c-5.39062 1.26953 -14.2617 2.30078 -19.8008 2.30078c-0.110352 0 -0.289062 -0.000976562 -0.398438 -0.000976562c-0.116211 0 -0.304688 0.000976562 -0.420898 0.000976562c-57.96 0 -105.081 -47.041 -105.18 -105.001l-0.0996094 -56l-42.6006 0.0996094
c-32.5996 0.100586 -32.6992 -49.2002 -0.0996094 -49.2998l33.5996 -0.0996094c4.40039 0 8.90039 -4.5 8.90039 -9l-0.0996094 -47c-0.00585938 -30.8574 -25.0537 -55.9004 -55.9102 -55.9004h-0.19043c-9.39941 0 -9.39941 1.59961 -15.7002 1.59961
c-13.3691 -0.208008 -24.3457 -11.2295 -24.5 -24.5996c0 -15.5 14.2002 -24.2002 19.9004 -24.2002c61.2998 -12.8994 125.5 33.6006 125.7 102.9l0.0996094 56zM299.4 151.9c4.50781 0.442383 11.7207 1.74219 16.0996 2.89941l-8.5 8.5
c-1.48047 -3.55762 -4.88477 -8.66504 -7.59961 -11.3994zM320.4 156.1c3.9248 1.09082 10.0625 3.46484 13.6992 5.30078l-27 27.1992c1.30566 -3.32617 2.38086 -8.92578 2.40039 -12.5l-0.900391 -8.09961zM338.4 163.5c4 2.2002 8.09961 4.7002 11.8994 7.2002
l-36.2002 35.8994c-4.09961 -2.2998 -8.7998 -3.59961 -13.6992 -4.69922zM353.9 173.3c2.92188 2.33301 7.44727 6.36426 10.0996 9l-34.9004 35c-2.63672 -2.66797 -7.34082 -6.47656 -10.5 -8.5zM367.1 185.6c2.52539 2.77441 6.37793 7.47852 8.60059 10.5
l-35.7998 35.9004c-1.78125 -3.37891 -5.23047 -8.48633 -7.7002 -11.4004zM378.1 199.9c2.10938 3.16602 5.11133 8.54199 6.7002 12l-39.5 39.7998c-0.305664 -4.3584 -1.91895 -11.168 -3.59961 -15.2002zM391.6 230.8l-53.0996 53.4004
c3.69434 -6.76172 6.875 -18.499 7.09961 -26.2002l41.3008 -41.5c1.50879 3.87695 3.61426 10.2832 4.69922 14.2998zM392.6 236.4c1.05957 4.52246 2.08984 11.959 2.30078 16.5996l-64.3008 64.7002c-2.18359 -3.12988 -6.61816 -7.25098 -9.89941 -9.2002z" />
    <glyph glyph-name="figma" unicode="&#xf799;" horiz-adv-x="384" 
d="M277 277.3h-85.4004v-256c-0.0273438 -47.085 -38.2637 -85.2998 -85.3496 -85.2998c-47.1133 0 -85.3496 38.2363 -85.3496 85.3496s38.2363 85.3506 85.3496 85.3506h0.0498047c-47.1133 0 -85.3496 38.2363 -85.3496 85.3496s38.2363 85.3506 85.3496 85.3506
c-47.085 0 -85.2998 38.2139 -85.2998 85.2998c0 47.085 38.2148 85.2998 85.2998 85.2998h170.7c47.1133 0 85.3496 -38.2363 85.3496 -85.3496s-38.2363 -85.3506 -85.3496 -85.3506zM277 277.3c47.0801 -0.00488281 85.2949 -38.2197 85.2998 -85.2998
c0 -47.0859 -38.2139 -85.2998 -85.2998 -85.2998s-85.2998 38.2139 -85.2998 85.2998s38.2139 85.2998 85.2998 85.2998z" />
    <glyph glyph-name="intercom" unicode="&#xf7af;" 
d="M392 416c30.9004 0 56 -25.0996 56 -56v-336c0 -30.9004 -25.0996 -56 -56 -56h-336c-30.9004 0 -56 25.0996 -56 56v336c0 30.9004 25.0996 56 56 56h336zM283.7 333.9v-199.5c0 -19.8008 29.8994 -19.8008 29.8994 0v199.5c0 19.7998 -29.8994 19.7998 -29.8994 0z
M209.1 341.4v-216.5c0 -19.8008 29.9004 -19.8008 29.9004 0v216.5c0 19.7998 -29.9004 19.7998 -29.9004 0zM134.4 333.9v-199.5c0 -19.8008 29.8994 -19.8008 29.8994 0v199.5c0 19.7998 -29.8994 19.7998 -29.8994 0zM59.7002 304v-134.3
c0 -19.7998 29.8994 -19.7998 29.8994 0v134.3c0 19.7998 -29.8994 19.7998 -29.8994 0zM383.1 76.2002c14.9004 12.8994 -4.5 35.5996 -19.3994 22.7002c-63.2002 -53.9004 -213.4 -55.3008 -279.3 0c-15 12.7998 -34.4004 -9.90039 -19.4004 -22.7002
c76.4004 -65.4004 245.3 -63 318.1 0zM388.3 169.7v134.3c0 19.7998 -29.8994 19.7998 -29.8994 0v-134.3c0 -19.7998 29.8994 -19.7998 29.8994 0z" />
    <glyph glyph-name="invision" unicode="&#xf7b0;" 
d="M407.4 416c22.3994 0 40.5996 -18.2002 40.5996 -40.5996v-366.801c0 -22.3994 -18.2002 -40.5996 -40.5996 -40.5996h-366.801c-22.3994 0 -40.5996 18.2002 -40.5996 40.5996v366.801c0 22.3994 18.2002 40.5996 40.5996 40.5996h366.801zM176.1 302.4
c-0.599609 35.0996 -53.5996 34.7998 -53.6992 -0.400391c0 -15 12.1992 -27 27.0996 -27c4.2002 0.0996094 27 4 26.5996 27.4004zM332.8 71c23.7998 0 42.7002 15.2998 53.2002 52l-17.9004 6.7002c-14.2998 -39.5 -31.7998 -32.4004 -31.7998 -16.9004
c0.299805 8.10059 0.700195 7.7002 14.9004 58.7998c26.0996 85.8008 -61.2998 113.5 -101.8 38l8.89941 40.5h-68.7998l-9.7002 -35.5996h32.2998l-19.7998 -79.4004c-16.5 -36.6992 -57.3994 -44.0996 -57.3994 -23.1992c0.299805 11.2998 -0.700195 4.5 32.8994 138.199
h-76.3994l-9.7002 -35.5996h31.7998c-22.0996 -90.0996 -22.9004 -89.7998 -23 -104.1c0 -48.7002 63.0996 -56.1006 94.5996 -4.30078l-8.09961 -32.5h45.0996l25.8008 103.301c14.6992 59.6992 74 47.0996 59.8994 0.699219c-9.09961 -32.5996 -40.5996 -106.6 25 -106.6z
" />
    <glyph glyph-name="jira" unicode="&#xf7b1;" horiz-adv-x="496" 
d="M490 206.3c8 -7.89941 8 -20.7002 0 -28.5996c-225.8 -225 137.9 136.3 -241.5 -241.7c-180.7 180.1 -109.7 109.3 -242.5 241.6c-7.90039 8 -7.90039 20.8008 0 28.7002c0 0 77 76.7998 242.5 241.7c72.0996 -71.7998 168.6 -169 241.5 -241.7zM248.5 116.3l76 75.7002
l-76 75.7002l-76 -75.7002z" />
    <glyph glyph-name="mendeley" unicode="&#xf7b3;" horiz-adv-x="640" 
d="M624.6 122.8c23.1006 -22.7002 17.8008 -73.5 0 -88.2998c-36.1992 -38.9004 -100 -18.2002 -104.899 35.2002c-1 11.7002 1.09961 23 5.7002 33c47.2998 103.7 -185.9 106.1 -146.5 8.2002c0.0996094 -0.100586 0.199219 -0.200195 0.299805 -0.400391
c26.5996 -42.5996 -6.7002 -97.2998 -58.7998 -95.2002c-52 -2.2002 -85.6006 52.4004 -58.8008 95.2002c0.100586 0.200195 0.200195 0.299805 0.300781 0.400391c39.3994 97.8994 -193.801 95.5 -146.5 -8.2002c20.3994 -44.9004 -14.1006 -93.7002 -61.2002 -87.7998
c-61.9004 7.7998 -62.5 82.8994 -42.6006 102.6c16 16 31.8008 24.7998 53 22.5c43.3008 1 49.7002 34.9004 37.5 98.7998c-22.6992 57.5 14.5 131.601 87.4004 130.8c76.9004 -0.699219 82.7998 -82 130.9 -82c49.1992 0 53.5 81.3008 130.899 82
c72.5 0.700195 110.2 -73.2998 87.4004 -130.8c-12.2002 -63.8994 -5.7998 -97.7998 37.5 -98.7998c18.7002 2 36.0996 -4.7998 48.3994 -17.2002zM320.7 141.9c43.5996 0 62.7998 37.7998 62.7998 62.7998c0 34.7002 -28.0996 62.7998 -62.7998 62.7998h-0.600586
c-34.5996 0 -62.7998 -28.0996 -62.7998 -62.7998c0 -25.2998 19.4004 -62.7998 62.7998 -62.7998h0.600586z" />
    <glyph glyph-name="raspberry-pi" unicode="&#xf7bb;" horiz-adv-x="407" 
d="M372 215.5c28.7002 -17.2002 54.5996 -72.5996 14 -117.7c-2.59961 -14.0996 -7.09961 -24.2002 -11 -35.3994c-5.90039 -45.2002 -44.4004 -66.3008 -54.5996 -68.8008c-14.9004 -11.1992 -30.7002 -21.7998 -52.2002 -29.1992
c-20.2002 -20.6006 -42.1006 -28.4004 -64.2002 -28.4004h-1c-22 0 -44 7.7998 -64.2998 28.4004c-21.4004 7.39941 -37.2998 18 -52.2002 29.1992c-10.0996 2.5 -48.7002 23.6006 -54.5996 68.8008c-3.90039 11.1992 -8.40039 21.2998 -11 35.3994
c-40.5 45 -14.6006 100.5 14.1992 117.7l3.7002 6.5c-0.0996094 46.4004 21.4004 65.2998 46.5 79.7002c-7.59961 2 -15.3994 3.7002 -17.5996 13.2002c-13.1006 3.39941 -15.7998 9.39941 -17.1006 15.7998c-3.39941 2.2998 -14.7998 8.7002 -13.5996 19.7002
c-6.2998 4.39941 -9.90039 10.0996 -8.09961 18.0996c-6.90039 7.5 -8.7002 13.7002 -5.80078 19.4004c-8.2998 10.1992 -4.59961 15.5 -1.09961 20.8994c-6.2002 11.2002 -0.799805 23.2002 16.5 21.2002c6.90039 10.0996 21.9004 7.7998 24.2002 7.7998
c2.5 3.2998 6 6 16.5 4.7002c6.7998 6.09961 14.3994 5.09961 22.2998 2.09961c3.2002 2.5 6.09961 3.40039 8.7002 3.5c5 0.100586 9.2998 -2.89941 13.8994 -4.2998c11.3008 3.60059 13.8008 -1.39941 19.4004 -3.39941c12.2998 2.59961 16.0996 -3 22 -8.90039
l6.90039 0.0996094c18.5996 -10.7998 27.7998 -32.7998 31.0996 -44.0996c3.2998 11.2998 12.5 33.2998 31.0996 44.0996l6.90039 -0.0996094c5.90039 5.90039 9.7002 11.5 22 8.90039c5.5 2.09961 8.09961 7 19.4004 3.39941
c7.09961 2.2002 13.2998 8.10059 22.5996 0.799805c7.90039 2.90039 15.5 4 22.2998 -2.09961c10.5 1.2998 13.9004 -1.5 16.5 -4.7002c2.2998 0 17.2998 2.2998 24.2002 -7.7998c17.2998 2 22.7998 -10 16.5996 -21.2002c3.5 -5.2998 7.2002 -10.5996 -1.09961 -20.8994
c2.90039 -5.7002 1.09961 -11.9004 -5.7998 -19.4004c1.89941 -8 -1.7002 -13.7002 -8.10059 -18.0996c1.2002 -11 -10.1992 -17.4004 -13.5996 -19.7002c-1.2998 -6.40039 -4 -12.5 -17.0996 -15.7998c-2.2002 -9.60059 -10 -11.2002 -17.6006 -13.2002
c25.1006 -14.4004 46.6006 -33.2998 46.5 -79.7002zM349.8 223.5c1.5 48.7002 -36.3994 75.4004 -82.0996 67.9004c-16.7998 -2.80078 80.5996 -86.6006 82.0996 -67.9004zM306.8 130.4c24.5 15.7998 28.9004 51.5996 9.90039 80
c-19 28.3994 -54.2998 38.5996 -78.7998 22.7998s-28.9004 -51.6006 -9.90039 -80c19 -28.4004 54.2998 -38.6006 78.7998 -22.7998zM238.9 418.7c-16.6006 -15.9004 -40.1006 -55.9004 -5.80078 -71.7998c29 23.5 63.6006 40.6992 102 53.5
c-49.2998 -25.1006 -78 -45.3008 -93.6992 -62.6006c8.09961 -31.7002 50 -33.2002 65.3994 -32.2998c-3.09961 1.40039 -5.7998 3.09961 -6.7002 5.7998c3.80078 2.7002 17.5 0.299805 27 5.60059c-3.69922 0.699219 -5.39941 1.39941 -7.09961 4.09961
c9 2.90039 18.7002 5.2998 24.4004 10c-3.10059 0 -6 -0.599609 -10 2.09961c8.09961 4.30078 16.6992 7.7002 23.3994 14.2002c-4.2002 0.100586 -8.7002 0.100586 -10 1.60059c7.40039 4.5 13.6006 9.5 18.7998 15c-5.7998 -0.700195 -8.2998 -0.100586 -9.69922 0.899414
c5.59961 5.60059 12.5996 10.4004 16 17.2998c-4.40039 -1.5 -8.30078 -2.09961 -11.2002 0.100586c1.89941 4.2998 10 6.7002 14.7002 16.5996c-4.60059 -0.399414 -9.40039 -1 -10.4004 0c2.09961 8.5 5.7002 13.2002 9.2998 18.2002
c-9.7998 0.200195 -24.5996 0 -23.8994 0.799805l6 6.10059c-9.5 2.5 -19.3008 -0.400391 -26.4004 -2.60059c-3.2002 2.5 0 5.60059 3.90039 8.7998c-8.10059 -1 -15.5 -2.89941 -22.1006 -5.39941c-3.59961 3.09961 2.2998 6.2998 5.10059 9.39941
c-12.5 -2.2998 -17.8008 -5.59961 -23.1006 -8.89941c-3.7998 3.59961 -0.200195 6.7002 2.40039 9.7998c-9.40039 -3.5 -14.2998 -7.90039 -19.4004 -12.2998c-1.7998 2.2998 -4.39941 4 -1.2002 9.59961c-6.69922 -3.7998 -11.7998 -8.2998 -15.5 -13.2998
c-4.19922 2.59961 -2.5 6.09961 -2.5 9.40039c-7 -5.60059 -11.3994 -11.5 -16.7998 -17.3008c-1.09961 0.800781 -2.09961 3.40039 -2.89941 7.60059zM204.5 304.1c-27.2002 0.700195 -53.4004 -19.8994 -53.4004 -31.7998
c-0.0996094 -14.5996 21.5 -29.3994 53.6006 -29.7998c32.7998 -0.200195 53.7002 11.9004 53.7998 26.9004c0.0996094 16.8994 -29.7998 35 -54 34.6992zM81.5 316.9c9.59961 -5.2002 23.2002 -2.80078 27.2002 -5.60059
c-0.900391 -2.59961 -3.60059 -4.39941 -6.7002 -5.7998c15.4004 -0.900391 57.4004 0.5 65.4004 32.2998c-15.7002 17.2998 -44.4004 37.6006 -93.7002 62.6006c38.3994 -12.8008 73 -30 102 -53.5c34.0996 15.8994 10.5996 55.8994 -6 71.7998
c-0.900391 -4.2002 -1.7998 -6.7998 -2.90039 -7.60059c-5.39941 5.80078 -9.7998 11.7002 -16.7998 17.3008c0 -3.2002 1.59961 -6.80078 -2.5 -9.40039c-3.7002 5 -8.7998 9.5 -15.5 13.2998c3.2002 -5.59961 0.5 -7.2998 -1.2002 -9.59961
c-5.09961 4.39941 -10 8.89941 -19.3994 12.2998c2.59961 -3.09961 6.19922 -6.2002 2.39941 -9.7998c-5.2998 3.2998 -10.5996 6.59961 -23.0996 8.89941c2.7998 -3.09961 8.59961 -6.2998 5.09961 -9.39941c-6.7002 2.5 -14 4.2998 -22.0996 5.39941
c3.7998 -3.19922 7.09961 -6.2998 3.89941 -8.7998c-7.09961 2.2002 -16.8994 5.10059 -26.3994 2.60059l6 -6.10059c0.700195 -0.799805 -14.1006 -0.700195 -23.9004 -0.799805c3.5 -4.90039 7.2002 -9.7002 9.2998 -18.2002c-1 -1 -5.7998 -0.399414 -10.3994 0
c4.7002 -9.89941 12.7998 -12.3994 14.7002 -16.5996c-2.90039 -2.10059 -6.90039 -1.60059 -11.2002 -0.100586c3.2998 -6.89941 10.3994 -11.6992 16 -17.2998c-1.40039 -1 -3.90039 -1.59961 -9.7002 -0.899414c5.2002 -5.5 11.4004 -10.5 18.7998 -15
c-1.2998 -1.60059 -5.7998 -1.5 -10 -1.60059c6.7002 -6.5 15.2998 -9.89941 23.4004 -14.2002c-4 -2.7998 -6.90039 -2.09961 -10 -2.09961c5.7002 -4.7002 15.3994 -7.2002 24.3994 -10c-1.69922 -2.59961 -3.39941 -3.40039 -7.09961 -4.09961zM141.6 292.8
c-45.5996 7.60059 -83.5996 -19.2002 -82.0996 -67.8994c1.5 -18.6006 98.9004 65.0996 82.0996 67.8994zM38.2002 106c21.5996 -9.5 39.0996 105.3 12.5996 98.2998c-43.8994 -24.5996 -36.2998 -79.5 -12.5996 -98.2998zM129.2 7.7998
c14.0996 10.4004 6.39941 45.7002 -10.5 65.7002c-19.4004 22.2002 -44.6006 35.4004 -60.9004 25.5996c-10.8994 -8.19922 -12.8994 -36 2.60059 -63.3994c23 -32.6006 55.5 -35.7998 68.7998 -27.9004zM102.8 127.5c24.4004 -15.7998 59.7002 -5.59961 78.7998 22.7998
c19 28.4004 14.6006 64.2002 -9.89941 80s-59.7998 5.60059 -78.7998 -22.7998s-14.6006 -64.2002 9.89941 -80zM205 -48c28.4004 -0.5 57.7002 24.4004 57.2002 35.4004c-0.100586 11.3994 -32 19.8994 -55.7002 18.8994c-23.5 0.600586 -59.7002 -9.2998 -59.2998 -22
c-0.400391 -8.59961 28.3994 -33.5 57.7998 -32.2998zM263.9 76.9004v0.599609c-0.200195 29.5996 -26.8008 53.5996 -59.4004 53.4004c-32.5996 -0.200195 -59 -24.3008 -58.7998 -54v-0.600586c0.200195 -29.5996 26.7998 -53.5996 59.3994 -53.3994
c32.6006 0.199219 59 24.2998 58.8008 54zM346.1 34.2002c18.4004 23.2002 12.2002 62 1.7002 72.2998c-15.5996 11.9004 -38 -3.2998 -58.8994 -26.5996c-18.3008 -21.1006 -28.4004 -59.6006 -15.1006 -72c12.7002 -9.60059 47 -8.30078 72.2998 26.2998zM369 107.4
c23.7002 18.6992 31.2998 73.5996 -12.5996 98.2998c-26.4004 7 -8.90039 -107.7 12.5996 -98.2998z" />
    <glyph glyph-name="redhat" unicode="&#xf7bc;" horiz-adv-x="512" 
d="M341.52 162.59v-0.149414c33.6504 0 82.3408 6.93945 82.3408 47c0.219727 6.73926 0.859375 1.81934 -20.8799 96.2393c-4.62012 19.1504 -8.68066 27.8398 -42.3105 44.6504c-26.0898 13.3398 -82.9199 35.3701 -99.7295 35.3701
c-15.6602 0 -20.2002 -20.1699 -38.8701 -20.1699c-18 0 -31.3105 15.0596 -48.1201 15.0596c-16.1406 0 -26.6602 -11 -34.7803 -33.6201c-27.5 -77.5498 -26.2803 -74.2695 -26.1201 -78.2695c0 -24.7998 97.6406 -106.11 228.47 -106.11zM429.07 193.19
l-0.0703125 -0.0302734c4.65039 -22 4.65039 -24.3506 4.65039 -27.25c0 -37.6602 -42.3301 -58.5605 -98 -58.5605c-125.74 -0.0800781 -235.91 73.6504 -235.91 122.33v0.0771484c0 5.65332 1.81836 14.4531 4.05957 19.6436
c-45.2402 -2.26074 -103.8 -10.3301 -103.8 -62.0303c0 -84.6699 200.63 -189 359.49 -189c121.79 0 152.51 55.0801 152.51 98.5801c0 34.21 -29.5898 73.0498 -82.9297 96.2402z" />
    <glyph glyph-name="sketch" unicode="&#xf7c6;" horiz-adv-x="512" 
d="M27.5 285.8l78.9004 105.8l-6.90039 -130.699h-90.5zM396.3 402.3l7.10059 -133.5l-135.7 147.2zM112.2 229.7l122.6 -239.7l-224.899 261.7h91.0996zM114.2 260.9l142.1 154.1l60.4004 -65.5996l81.5 -88.5h-284zM411.5 251.8v-0.0996094h90.9004l-224.801 -261.7z
M415.4 379l87.8994 -118.1h-90.2998l-6.09961 113.399l-0.900391 17.2998zM113.5 354.5l2.59961 47.7998l128.601 13.7002l-135.8 -147.1zM401.2 251.8l-144.9 -283.8l-102.7 200.9l-42.3994 82.8994h290z" />
    <glyph glyph-name="sourcetree" unicode="&#xf7d3;" 
d="M427.2 245c-0.0947266 -81.5225 -63.1279 -168.031 -140.7 -193.1v-101.601c0 -7.89355 -6.40625 -14.2998 -14.2998 -14.2998v0h-96.4004c-7.89355 0 -14.2998 6.40625 -14.2998 14.2998v101.7c-77.5566 25.0537 -140.5 111.535 -140.5 193.037v0.363281
c0.200195 112 91.0996 202.8 203.2 202.6c112.1 0 203 -90.9004 203 -203zM155.6 245c0 -91 137.2 -89.9004 137.301 0c0 90.7998 -137.301 90.7998 -137.301 0z" />
    <glyph glyph-name="suse" unicode="&#xf7d6;" horiz-adv-x="640" 
d="M471.08 345.34c0 1 1.01953 0.759766 0.919922 0.660156c4.2002 -0.599609 92.2002 -13.7002 129.2 -35.2998c12.0996 -6.90039 20.7002 -21.5 34.5 -69.6006c0.700195 -2.7998 -2.7998 -5.09961 -3.60059 -5.69922
c-26.8994 -18.8008 -56.7998 -36.6006 -145.199 21.6992c11.0996 -26.6992 10.6992 -25.0996 11 -25.5c5.39941 -2.7998 56.2998 -28.6992 81.5996 -28.1992c20.4004 0.399414 42.2002 10.3994 50.9004 15.5996c0 0 4.5 2.7002 3.19922 -2.40039
c-0.5 -1.89941 -3.2998 -14.5996 -7 -17.6992c-1 -1 -36.5996 -28.4004 -103.1 -28c-42.7002 1 -76.7998 16.3994 -82.4004 -17.4004c-2.7998 -17.0996 6.10059 -37.5 18.9004 -55.7998h-48.5996c-15.9004 28.3994 -23.1006 68.2998 -79.8008 68.2998
c-51.5996 0 -48.3994 -50.7002 -42.6992 -68.2998h-45.9004c-18.7998 68.7998 -69.2002 98.5996 -102.4 104.3c-74.2998 12.7998 -113 -49.2002 -87 -98.4004c23.1006 -43.5996 81.4004 -44.0996 99.7002 -20.3994c19.2002 25 3.7998 62.8994 -28.5 65.7002
c-12.2998 1.09961 -25.2998 -4.60059 -25.5 -16.9004v-0.0595703c0 -10.9004 10 -13.8008 12 -14c7.2998 0.399414 8.90039 1.89941 11.7998 2.39941c5.2002 0.900391 16.8008 -1.7998 16.8008 -13.8994c0 -8.40039 -6.80078 -13.1006 -13.3008 -14.9004
c-4.2373 -1.46777 -11.3154 -2.67773 -15.7998 -2.7002c-17.2002 0 -41.2002 14.7998 -41.5 42.6006c-0.200195 15.6992 7.7002 30 21.6006 39.1992c15.8994 10.5 43.5996 14.1006 69.1992 -1.59961c31.5 -19.2998 39.7002 -57.0996 31.5 -82.9004
c-11.8994 -37.2998 -45.5996 -57.1992 -90 -53.2998c-31.5 2.7998 -60.6992 19.4004 -78.0996 44.4004c-6.32715 9.0332 -13.7197 25.0264 -16.5 35.7002c-7.12012 28.0596 0 58.0596 5.48047 71.3994c25.6992 63.6006 80.1992 97.2998 99.5996 109.7
c100.2 61.5996 171.1 59.0996 223 57.2998c61.2998 -2.2002 126.6 -23.2998 135.7 -26.2998c0 2 0.299805 20.2998 0.299805 20.2998zM531.48 272.54c-1.10059 -33.5 39.0996 -51.5996 63.2998 -28.9004c24.3994 22.9004 9 64 -24.4004 65.2002
c-0.380859 0.0136719 -0.999023 0.0253906 -1.37988 0.0253906c-20.0615 0 -36.8711 -16.2734 -37.5195 -36.3252zM570.08 297.84c14.0312 -0.413086 25.4199 -12.1406 25.4199 -26.1787c0 -0.282227 -0.00878906 -0.739258 -0.0195312 -1.02148
c-0.50293 -13.9795 -12.2646 -25.3262 -26.2539 -25.3262c-14.501 0 -26.2695 11.7695 -26.2695 26.2705s11.7686 26.2695 26.2695 26.2695c0.236328 0 0.618164 -0.00585938 0.853516 -0.0136719zM574.38 269.04c15.4004 0 15.4004 15.5996 0 15.5996
c-15.3994 0 -15.3994 -15.5996 0 -15.5996z" />
    <glyph glyph-name="ubuntu" unicode="&#xf7df;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM300.7 347c-8.7998 -15.2002 -3.60059 -34.7002 11.7002 -43.5996c15.1992 -8.80078 34.6992 -3.5 43.5 11.6992c8.7998 15.3008 3.59961 34.8008 -11.7002 43.6006
c-15.2002 8.7998 -34.7002 3.5 -43.5 -11.7002zM87.4004 160.1c17.5996 0 31.8994 14.3008 31.8994 31.9004s-14.2998 31.9004 -31.8994 31.9004c-17.6006 0 -31.9004 -14.3008 -31.9004 -31.9004s14.2998 -31.9004 31.9004 -31.9004zM115.5 157
c8.7002 -32.7002 29.0996 -60.7002 56.5 -79l23.7002 39.5996c-51.5 36.3008 -51.5 112.5 0 148.801l-23.7002 39.5996c-27.4004 -18.4004 -47.9004 -46.2998 -56.5 -79.0996c22.4004 -18 22.2998 -52 0 -69.9004zM344.2 25.2998
c15.2998 8.7998 20.5 28.2998 11.7002 43.6006c-8.80078 15.2998 -28.3008 20.5 -43.5 11.6992c-15.3008 -8.7998 -20.5 -28.2998 -11.7002 -43.5996s28.2002 -20.5 43.5 -11.7002zM344.5 94.7998c23 22.9004 38 53.9004 40.2998 88.4004l-46.0996 0.700195
c-5.5 -62.7002 -71.9004 -100.9 -128.9 -74.4004l-22.5 -40.2998c47.7998 -23.7002 91.5 -10.7998 96.7002 -9.40039c4.40039 28.4004 33.7998 45.2998 60.5 35zM338.6 200.1l46 0.600586c-2.19922 34.5996 -17.0996 65.5996 -40.1992 88.5
c-26.7002 -10.2998 -56.1006 6.7002 -60.5 35c-5.2002 1.39941 -48.8008 14.2998 -96.7002 -9.40039l22.5 -40.2998c57.5996 26.7998 123.5 -12.4004 128.899 -74.4004z" />
    <glyph glyph-name="ups" unicode="&#xf7e0;" horiz-adv-x="384" 
d="M103.2 145v123h32.5996v-141.6c-17.7002 -12.1006 -97.8994 -35.9004 -97.8994 39v102.6h32.6992v-104c0 -32.0996 27.4004 -22.5996 32.6006 -19zM4 373.18c93.5996 49.6006 259.1 61.6006 375.4 0v-220.899c0 -103.9 -75.3008 -135.2 -187.7 -184.101
c-112.8 48.9004 -187.7 80.4004 -187.7 184.101v220.899zM362.1 152.28v216.2c-109.3 10.1992 -238.6 4 -340.899 -89.8008v-126.399c0 -86.6006 53 -113.5 170.5 -165.3c117.2 51.6992 170.399 78.6992 170.399 165.3zM152.5 259.68
c23.7002 15.3203 104.4 31.8008 104.4 -65.5996c0 -75.9004 -47.3008 -85.7998 -71.7002 -78.5v-68.7002h-32.7002v212.8zM185.2 142.38c2 -0.799805 38.3994 -16.8994 38.3994 51c0 62 -30 53.5 -38.3994 49.2998v-100.3zM264.3 228.78
c-0.200195 41.0996 51.2002 53.8994 79.7002 31.8994v-28.3994c-17.9004 18.2998 -47.9004 18.0996 -48.5 -2.2002c-0.700195 -26.5996 55.0996 -21.7002 53.4004 -73.2002c-1.30078 -41.5996 -47 -55 -83.2002 -33.5v30.1006
c20.3994 -18.1006 51.3994 -18.6006 50.7998 4.89941c-0.599609 27.9004 -52.0996 23.1006 -52.2002 70.4004z" />
    <glyph glyph-name="usps" unicode="&#xf7e1;" horiz-adv-x="576" 
d="M460.3 206.3c-1.39941 -2.2002 -4.2998 -4.39941 -3.7998 0.100586c2.90039 11.5996 13.9004 30.5 4.40039 32c-17.8008 3.09961 -88.1006 -4.5 -88.1006 0c0 2.39941 26.7002 3.09961 37.9004 8.69922c9.39941 9.40039 10.7998 8 10.8994 8h27
c26.9004 0 37.5 -7.5 11.7002 -48.7998zM348.2 183.7c-62.2998 -21.2002 -124.8 -54.2002 -321.2 -151.5l52.4004 245.5c185 0 335.199 5.59961 337.899 -22.6006h-196.6l30.7002 -93.2998c35 16.7998 120.899 51.7002 172.6 53.9004
c21.7998 0.799805 30.5996 -2.90039 26.2002 -5.7998c-4.7002 -2.30078 -38 -4.90039 -102 -26.2002zM94.7002 352h454.3l-67.7002 -319.7h-423.1s402 157.3 406.399 160.2c0 0 35.7002 48 14.6006 67.7002c-6.5 6.59961 -16 6.59961 -52.4004 6.59961
c-2.09961 19.5 -78.7998 31.5 -332.1 85.2002z" />
    <glyph glyph-name="yarn" unicode="&#xf7e3;" horiz-adv-x="496" 
d="M393.9 102.8c-39 -9.2998 -48.4004 -32.0996 -104 -47.3994c0 0 -2.7002 -4 -10.4004 -5.80078c-13.4004 -3.2998 -63.9004 -6 -68.5 -6.09961c-12.4004 -0.0996094 -19.9004 3.2002 -22 8.2002c-6.40039 15.2998 9.2002 22 9.2002 22
c-8.10059 5 -9 9.89941 -9.7998 8.09961c-2.40039 -5.7998 -3.60059 -20.0996 -10.1006 -26.5c-8.7998 -8.89941 -25.5 -5.89941 -35.2998 -0.799805c-10.7998 5.7002 0.799805 19.2002 0.799805 19.2002s-5.7998 -3.40039 -10.5 3.59961
c-6 9.2998 -17.0996 37.2998 11.5 62c-1.2998 10.1006 -4.59961 53.7002 40.6006 85.6006c0 0 -20.6006 22.7998 -12.9004 43.2998c5 13.3994 7 13.2998 8.59961 13.8994c5.7002 2.2002 11.3008 4.60059 15.4004 9.10059c20.5996 22.2002 46.7998 18 46.7998 18
s12.4004 37.7998 23.9004 30.3994c3.5 -2.2998 16.2998 -30.5996 16.2998 -30.5996s13.5996 7.90039 15.0996 5c8.2002 -16 9.2002 -46.5 5.60059 -65.0996c-6.10059 -30.6006 -21.4004 -47.1006 -27.6006 -57.5c-1.39941 -2.40039 16.5 -10 27.8008 -41.3008
c10.3994 -28.5996 1.09961 -52.6992 2.7998 -55.2998c0.799805 -1.39941 13.7002 -0.799805 36.3994 13.2002c12.8008 7.90039 28.1006 16.9004 45.4004 17c16.7002 0.5 17.5996 -19.2002 4.90039 -22.2002zM496 192c0 -136.9 -111.1 -248 -248 -248s-248 111.1 -248 248
s111.1 248 248 248s248 -111.1 248 -248zM416.7 116.8c-1.7002 13.6006 -13.2002 23 -28 22.7998c-22 -0.299805 -40.5 -11.6992 -52.7998 -19.1992c-4.80078 -3 -8.90039 -5.2002 -12.4004 -6.80078c3.09961 44.5 -22.5 73.1006 -28.7002 79.4004
c7.7998 11.2998 18.4004 27.7998 23.4004 53.2002c4.2998 21.7002 3 55.5 -6.90039 74.5c-1.59961 3.09961 -7.39941 11.2002 -21 7.39941c-9.7002 20 -13 22.1006 -15.5996 23.8008c-1.10059 0.699219 -23.6006 16.3994 -41.4004 -28
c-12.2002 -0.900391 -31.2998 -5.30078 -47.5 -22.8008c-2 -2.19922 -5.89941 -3.7998 -10.0996 -5.39941h0.0996094c-8.39941 -3 -12.2998 -9.90039 -16.8994 -22.2998c-6.5 -17.4004 0.199219 -34.6006 6.7998 -45.7002c-17.7998 -15.9004 -37 -39.7998 -35.7002 -82.5
c-34 -36 -11.7998 -73 -5.59961 -79.6006c-1.60059 -11.0996 3.69922 -19.3994 12 -23.7998c12.5996 -6.7002 30.2998 -9.59961 43.8994 -2.7998c4.90039 -5.2002 13.7998 -10.0996 30 -10.0996c6.7998 0 58 2.89941 72.6006 6.5c6.7998 1.59961 11.5 4.5 14.5996 7.09961
c9.7998 3.09961 36.7998 12.2998 62.2002 28.7002c18 11.7002 24.2002 14.2002 37.5996 17.3994c12.9004 3.2002 21 15.1006 19.4004 28.2002z" />
    <glyph glyph-name="airbnb" unicode="&#xf834;" 
d="M224 74.8799h0.0595703c24.71 31.1797 39.5508 58.9297 45 83.1797c22.5508 88 -112.609 88 -90.0596 0c4.91992 -23.75 19.7598 -51.5098 45 -83.1797zM362.15 1.65039c35.6396 15.3496 50.1797 53.5693 37.0098 86.6396
c-25.4902 61.6104 -78.8398 168.47 -114.84 239.09c-16.9707 33.9297 -28.0303 59.8701 -60.3701 59.8701c-33.8203 0 -43.6299 -27.3301 -59.3799 -57.4004c-4.15039 -10.3799 -100.771 -202.399 -115.87 -241.56c-17.8105 -50.0303 21.2998 -98.5205 71.2998 -91.0898
c24.5996 2.22949 52.6201 18.8701 85.1504 54.9199c-29.2002 37.1104 -47.5 70.3096 -54.4307 99.5c-11.8799 53.9902 18.3604 100.5 73.2803 100.5c64.96 0 122.75 -69.9297 18.8496 -200c35.6309 -39.5898 77.2402 -68.7803 119.301 -50.4697zM409.15 137.77
c0 -0.679688 16.8496 -35.6895 16.8301 -39.5791c25.2393 -69.3301 -26.7207 -130.24 -89.6104 -130.19c-11.1104 0 -53.6904 -1.37988 -112.37 62.4004c-51.7598 -56.3408 -90.6602 -62.4004 -112.37 -62.4004c-62.8896 0 -114.85 60.8604 -89.6299 130.19
c0.889648 2.61914 11.1797 32.71 117.34 245.02c19.79 41.1201 39.1406 72.79 84.6602 72.79c49.1299 0 56.2695 -3.92969 185.15 -278.23z" />
    <glyph glyph-name="battle-net" unicode="&#xf835;" horiz-adv-x="512" 
d="M448.61 222.38c60.75 -36.25 71.9893 -73.8096 57.3193 -93.6895c-4.70996 -6.88086 -25.1797 -36.2402 -148 -31.6406c-21.8193 -30.3994 -45.25 -53.2695 -67.4697 -69.2695c28.54 -53.7803 54.2998 -85.0303 62.54 -91.7803c0 0 -3.44043 0.160156 -8.58008 3.37012
c-2.69434 1.61133 -6.61426 4.78809 -8.75 7.08984c-15.6299 16.1797 -35.5195 41.9404 -55.7002 74.1201c-43.9502 -28.1104 -81.1299 -29.0996 -88.4395 -9.4502c-4.83984 10.8301 1.5293 26.5 9.05957 39.3398c-31.3203 -17.5098 -61.7002 -26.8496 -86.7002 -21.1396
c-6.79004 1.54004 -17.6299 5.50977 -23.1992 18.2598c-4.52051 9.53027 -6.02051 24.2598 -0.150391 47.1406c9.07031 35.3398 37.5801 82.2998 47.3096 97.6992c3.75 -8.62988 -20.7793 40.1904 -26 93.1904c-89.1592 0 -110.56 -8.83984 -111.56 -9.21973
c1.54004 2.44922 7.86035 7.26953 17.7598 9.71973c22 5.47949 54.6406 9.84961 93 11.2295c-2.38965 52.0703 15.3398 84.7705 36 81.29h0.180664c11.3291 -1.2998 21.2598 -13.5801 28.5 -25.9297c0.669922 35.2002 7.7998 65.54 25 84.0703
c4.72949 5.14941 13.5693 12.5498 27.3994 11h0.0498047c10.5205 -0.850586 24 -6.91992 40.8398 -23.4707c25.6006 -25.0693 51.54 -71.9893 60.4805 -88.9297c37.25 -3.7002 68.7695 -12.5801 93.7695 -23.7998c32.3506 51.5898 46.4805 89.5303 48.2002 100.05
c0.640625 -1.25 2.93066 -8.41992 -0.450195 -20.25c-6.22949 -21.6201 -18.5791 -51.7197 -36.3398 -85.2998c45.79 -23.7305 65.3203 -55.0098 52.8506 -71.3301c-3.35059 -4.94043 -12.0498 -12.5498 -38.9199 -12.3701zM370.76 116.16
c70.4102 4.37988 79.6504 20.5703 78.5098 33.5c-1.87988 21.25 -21.1992 41.2598 -49.0596 58.8301c0.889648 -24.5605 -5.63965 -54.6201 -29.4502 -92.3301zM216.9 60.3096c-19.04 -30.46 9.19922 -39.5596 49.7998 -17.6992
c-7 12.0898 -13.9199 24.8594 -20.6006 38.1895c-9.66992 -7.37012 -19.4395 -14.2598 -29.1992 -20.4902zM431.9 231.66c36.2598 -1.23047 29.4199 27.8496 -9.64062 51.9502c-5.9707 -10.373 -16.1582 -26.9043 -22.7402 -36.9004
c11.2207 -4.70996 22.0908 -9.70996 32.3809 -15.0498zM279.18 50c28.3799 18.2002 60.1689 48.1201 84.7695 85.4297c18.46 27.96 26.1494 56.0205 25.4102 79.5703c-30.5801 17.3203 -89.3604 42.7197 -167.23 57.21c0.350586 18.4805 2.08984 19.8799 2.16016 20.3301
c10.9229 -1.33496 28.5693 -4.04492 39.3896 -6.0498c32.5664 -6.08984 84.2383 -20.2959 115.34 -31.71c-15.6191 33.1494 -41.4092 47.2197 -41.5195 47.2197c1.59961 0.160156 28.1299 -6 48.8604 -43.7197c8.42676 11.2061 16.2031 22.0293 23.3301 32.4697
c-29.96 15.46 -71.75 28.04 -116.32 30.71c-33.4502 1.99023 -61.6299 -5.38965 -81.6299 -17.8096c0.240234 -35.2607 7.66992 -98.96 34 -173.431c-16.8301 -9.12988 -17.7402 -7.87012 -18.6699 -8.25c-17.1924 40.7627 -37.2041 109.235 -44.6699 152.84
c-21.0908 -30.3994 -20.1406 -59.5 -20.1406 -59.5693c-0.919922 1.22949 -8.81934 27.4297 13.4707 64.2295c-13.5801 1.70996 -26.5508 2.9707 -38.8506 3.87988c1.57031 -33.6797 11.5703 -76.1494 31.5703 -116.069c14.8701 -29.71 35.1201 -50.3105 55.71 -61.4902
c30.4102 17.9199 81.0498 55.6504 132.75 115.92c14.9697 -9 16.1494 -11.71 16.5098 -12c-7.91309 -10.5332 -16.2227 -20.9033 -24.9287 -31.1104c-21.542 -25.1426 -59.6494 -62.7744 -85.0605 -84c37.5303 -3.38965 62.5303 12.1807 62.5303 12.25
c-0.860352 -1.67969 -20.0303 -21.6797 -63.2803 -20.4092c5.5 -12.9404 10.9902 -25.0908 16.5 -36.4404zM306.579 337c-1.58008 2.4502 -39.5801 58.8496 -56.4805 54.6104c-16.8994 1.09961 -36.21 -22.9805 -38.21 -75.2803
c21.1104 13.2402 50.1299 22.3301 94.6904 20.6699zM175.929 333.9c-3.7998 6.68945 -8.66992 12.4795 -14.4297 13.5693h-0.0898438c-24.79 1.41016 -24.75 -52.8301 -24.6699 -49.5898c13.6602 -0.00976562 27.8496 -0.410156 42.3994 -1.25977
c-1.62012 12.6602 -2.72949 25.1699 -3.20996 37.2803zM147.869 171.9c-30.7998 -61.5098 -19.8701 -76.6104 -19.6699 -76.8203c7.38965 -15.4902 38.1299 -20.25 84.9199 4.50977c-21.9502 11.7402 -44.4902 32.6104 -65.25 72.3105zM357.929 97.0996z" />
    <glyph glyph-name="bootstrap" unicode="&#xf836;" 
d="M292.3 136.07c0 -42.4102 -39.7197 -41.4307 -43.9199 -41.4307h-80.8896v81.6904h80.8896c42.5605 0 43.9199 -31.9004 43.9199 -40.2598zM242.15 209.2h-74.6602v72.1797h74.6602c34.9297 0 38.4395 -20.3496 38.4395 -35.8701
c0 -37.3096 -37.7695 -36.3096 -38.4395 -36.3096zM448 341.33v-298.66c-0.120117 -41.0977 -33.5723 -74.5498 -74.6699 -74.6699h-298.66c-41.0977 0.120117 -74.5498 33.5723 -74.6699 74.6699v298.66c0.120117 41.0977 33.5723 74.5498 74.6699 74.6699h298.66
c41.0977 -0.120117 74.5498 -33.5723 74.6699 -74.6699zM338.05 130.14c0 21.5703 -6.64941 58.29 -49.0498 67.3506v0.729492c22.9102 9.78027 37.3398 28.25 37.3398 55.6406c0 7 2 64.7793 -77.5996 64.7793h-127v-261.33c128.229 0 139.87 -1.67969 163.6 5.70996
c14.21 4.4209 52.71 17.9805 52.71 67.1201z" />
    <glyph glyph-name="buffer" unicode="&#xf837;" 
d="M427.84 67.3301l-196.5 -97.8203c-1.93848 -0.832031 -5.22461 -1.50684 -7.33496 -1.50684c-2.10938 0 -5.39551 0.674805 -7.33496 1.50684l-196.51 97.8203c-4 2 -4 5.28027 0 7.29004l47.0596 23.3799c1.94238 0.832031 5.23242 1.50684 7.3457 1.50684
c2.1123 0 5.40234 -0.674805 7.34473 -1.50684l134.76 -67c1.93848 -0.836914 5.22461 -1.51562 7.33496 -1.51562c2.11133 0 5.39746 0.678711 7.33496 1.51562l134.76 67c1.94043 0.832031 5.22949 1.50781 7.34082 1.50781s5.39941 -0.675781 7.33984 -1.50781
l47.0596 -23.4297c4.0498 -1.95996 4.0498 -5.24023 0 -7.24023zM427.84 203.86c4.0498 -2.01074 4.0498 -5.29004 0 -7.31055l-196.5 -97.7998c-1.93848 -0.832031 -5.22461 -1.50781 -7.33496 -1.50781c-2.10938 0 -5.39551 0.675781 -7.33496 1.50781l-196.51 97.7998
c-4 2.02051 -4 5.31055 0 7.31055l47.0596 23.4297c1.94238 0.832031 5.23242 1.50684 7.3457 1.50684c2.1123 0 5.40234 -0.674805 7.34473 -1.50684l134.76 -67.0801c1.93945 -0.828125 5.22559 -1.5 7.33496 -1.5s5.39551 0.671875 7.33496 1.5l134.76 67.0801
c1.94043 0.832031 5.22949 1.50781 7.34082 1.50781s5.39941 -0.675781 7.33984 -1.50781zM20.1602 317.58c-4.0498 1.86035 -4.0498 4.88965 0 6.74023l196.5 90.2793c1.9502 0.774414 5.23633 1.40332 7.33496 1.40332s5.38477 -0.628906 7.33496 -1.40332
l196.51 -90.2793c4 -1.85059 4 -4.87988 0 -6.74023l-196.51 -90.29c-1.95215 -0.765625 -5.23828 -1.3877 -7.33496 -1.3877s-5.38281 0.62207 -7.33496 1.3877z" />
    <glyph glyph-name="chromecast" unicode="&#xf838;" horiz-adv-x="512" 
d="M447.83 384h0.169922c23.5811 0 42.7197 -19.1387 42.7197 -42.7197v-298.561c0 -23.5811 -19.1387 -42.7197 -42.7197 -42.7197v0h-149.36v42.7197h149.19v298.561h-383.83v-63.9199h-42.7197v63.9199c0 23.5811 19.1387 42.7197 42.7197 42.7197h383.83z
M21.2803 64.4199c35.2783 0 63.9102 -28.6318 63.9102 -63.9102v-0.00976562h-63.9102v63.9199zM21.2803 149.7l0.0292969 -0.339844h0.330078c82.248 -0.105469 149 -66.9424 149 -149.19v-0.169922h-42.7197v0.339844v0.0302734c0 58.8594 -47.7705 106.63 -106.63 106.63
h-0.00976562v42.7002zM21.2803 234.97v-0.330078c129.46 -0.370117 234.34 -105.18 234.8 -234.64h-42.7197v0.5c-0.0800781 106 -86.0801 191.85 -192.08 191.75v42.7197z" />
    <glyph glyph-name="evernote" unicode="&#xf839;" horiz-adv-x="384" 
d="M120.82 315.79c1.59961 -22.3096 -17.5508 -21.5898 -21.6104 -21.5898c-68.9297 0 -73.6396 1 -83.5801 -3.33984c-0.55957 -0.220703 -0.740234 0 -0.370117 0.370117l108.53 110.319c0.379883 0.370117 0.599609 0.219727 0.379883 -0.370117
c-4.34961 -9.98926 -3.34961 -15.0898 -3.34961 -85.3896zM199.82 7.79004c-14.6807 37.0801 13 76.9297 52.5195 76.6201c17.4902 0 22.6006 -23.21 7.9502 -31.4199c-6.19043 -3.2998 -24.9502 -1.74023 -25.1396 -19.2002
c-0.0507812 -17.0898 19.6699 -25 31.1992 -24.8896h0.0107422c25.1934 0 45.6396 20.4463 45.6396 45.6396v0.00976562v0.0800781c0 11.6299 -7.79004 47.2197 -47.54 55.3398c-7.71973 1.54004 -65 6.35059 -68.3496 50.5205
c-3.74023 -16.9307 -17.4004 -63.4902 -43.1104 -69.0898c-8.74023 -1.94043 -69.6797 -7.64062 -112.92 36.7695c0 0 -18.5703 15.2305 -28.2305 57.9502c-3.37988 15.75 -9.2793 39.7002 -11.1396 62c0 18 11.1396 30.4502 25.0703 32.2002c81 0 90 -2.32031 101 7.7998
c9.81934 9.24023 7.7998 15.5 7.7998 102.78c1 8.2998 7.79004 30.8096 53.4102 24.1396c6 -0.860352 31.9102 -4.17969 37.4795 -30.6396l64.2607 -11.1504c20.4297 -3.70996 70.9395 -7 80.5996 -57.9404c22.6602 -121.09 8.91016 -238.46 7.7998 -238.46
c-15.9795 -114.38 -111.07 -108.85 -111.07 -108.85c-18.9492 0.230469 -54.25 9.40039 -67.2695 39.8301zM280.76 212.63c-1 -1.91992 -2.2002 -6 0.850586 -7c14.0898 -4.92969 39.75 -6.83984 45.8799 -5.53027c3.10938 0.25 3.0498 4.43066 2.47949 6.65039
c-3.5293 21.8496 -40.8301 26.5 -49.2393 5.91992z" />
    <glyph glyph-name="itch-io" unicode="&#xf83a;" horiz-adv-x="512" 
d="M71.9199 413.23c19.2197 1.66992 114.32 2.76953 184.08 2.76953s116.56 -0.400391 184 -2.73047c21.7197 -12.9297 64.5195 -62.0996 64.9199 -75v-21.3398c0 -27.0596 -25.25 -50.8398 -48.25 -50.8398c-27.54 0 -50.54 22.8799 -50.54 50
c0 -27.1494 -22.2295 -50 -49.7598 -50s-49 22.8799 -49 50c0 -27.1494 -23.5898 -50 -51.1602 -50h-0.5c-27.5703 0 -51.1602 22.8799 -51.1602 50c0 -27.1494 -21.4199 -50 -49 -50s-49.7598 22.8799 -49.7598 50c0 -27.1494 -22.9697 -50 -50.54 -50
c-22.96 0 -48.25 23.7803 -48.25 50.8398v21.3398c0.400391 12.8906 43.2002 62.0605 64.9199 74.9609zM204.24 278.84c9.14844 -15.9902 31.5527 -28.9785 49.9746 -28.9785c0.498047 0 1.30664 0.0126953 1.80469 0.0283203c28.7109 0 44.6602 16.4502 51.7607 28.9404
c22 -38.3398 77.8496 -38.7598 99.8496 -0.240234c13.1201 -23.0596 43.0801 -32.0996 56 -27.6602c3.57031 -37.1494 13.9004 -236.88 -17.75 -269.149c-77.6797 -18.1201 -299.76 -18.6699 -379.76 0c-31.4004 32.0195 -21.6006 229 -17.7305 269.149
c12.8301 -4.41016 42.8301 4.52051 56 27.6602c21.9502 -38.46 77.8506 -38.1494 99.8506 0.25zM162.66 225.07l-0.0205078 -0.0703125c-52.3193 0 -65.21 -77.4502 -83.8799 -144.45c-17.2598 -62.1494 5.52051 -63.6699 33.9404 -63.7295
c42.1494 1.56934 65.4902 32.1797 65.4902 62.79c53.6191 -8.79004 116.3 -6.43066 155.55 0c0 -30.6104 23.3398 -61.2207 65.4902 -62.79c28.4297 0.0595703 51.21 1.58008 33.9492 63.7295c-18.6494 66.9199 -31.54 144.45 -83.8701 144.45
c-16.46 0 -31.0898 0 -49.25 -19.71c-12.1377 1.23145 -31.8896 2.23047 -44.0898 2.23047c-12.1992 0 -31.9521 -0.999023 -44.0898 -2.23047c-18.1299 19.7803 -32.75 19.7803 -49.2197 19.7803zM256 177.21l-0.0595703 -0.00976562s44.3496 -40.7598 52.3496 -55.2402
l-29 1.16992v-25.2803c0 -1.15918 -11.6602 -0.699219 -23.3096 -0.15918c-1.99023 0 -23.3301 -1.39062 -23.3301 0.15918v25.3203l-29 -1.16992c7.96973 14.4404 52.3496 55.21 52.3496 55.21z" />
    <glyph glyph-name="salesforce" unicode="&#xf83b;" horiz-adv-x="640" 
d="M248.89 202.36h-26.3496c0.69043 5.15918 3.32031 14.1201 13.6396 14.1201c6.75 0 11.9707 -3.82031 12.71 -14.1201zM385.55 216.24c0.450195 0 14.1104 1.75977 14.1104 -20c0 -6.45996 -1.11035 -20 -14.1104 -20c-0.479492 0 -14.1094 -1.77051 -14.1094 20
c0 21.7695 13.6396 20 14.1094 20zM142.33 192.48c4.2002 3.60938 15.6104 2.71973 20.9297 1.64941v-16.9395c-5.85938 -1.1709 -16.2295 -2.75 -20.9297 0.949219c-1.20996 1 -3.29004 2.27051 -3.29004 7.05078
c-0.0078125 0.137695 -0.0146484 0.361328 -0.0146484 0.499023c0 2.31738 1.48047 5.36035 3.30469 6.79102zM640 216c0 -87.5801 -80 -154.39 -165.36 -136.43c-18.3701 -33 -70.7295 -70.75 -132.199 -41.6299c-41.1602 -96.0508 -177.891 -92.1807 -213.811 5.16992
c-119.72 -23.8906 -178.82 138.37 -75.2695 199.279c-34.75 79.4307 22.6396 173.61 114.31 173.61c33.834 -0.0214844 77.9883 -21.8389 98.5605 -48.7002c20.6992 21.4004 49.3994 34.8105 81.1494 34.8105c42.3398 0 79 -23.5205 98.7998 -58.5703
c92.8203 40.6797 193.82 -28.2305 193.82 -127.54zM120.45 184.2c0 11.7598 -11.6904 15.1699 -17.8701 17.1699c-5.27051 2.11035 -13.4102 3.50977 -13.4102 8.93945c0 9.45996 17 6.66016 25.1699 2.12012c0 0 1.16992 -0.709961 1.64062 0.470703
c0.239258 0.699219 2.35938 6.58008 2.58984 7.29004c0.0292969 0.0927734 0.0537109 0.24707 0.0537109 0.34375c0 0.441406 -0.337891 0.918945 -0.753906 1.06543c-12.3301 7.63086 -40.7002 8.51074 -40.7002 -12.6992c0 -12.46 11.4902 -15.4404 17.8799 -17.1699
c4.71973 -1.58008 13.1699 -3 13.1699 -8.7002c0 -4 -3.5293 -7.06055 -9.16992 -7.06055c-5.82617 0.00976562 -14.3379 2.85449 -19 6.35059c-0.469727 0.229492 -1.41992 0.709961 -1.64941 -0.709961l-2.40039 -7.4707
c-0.469727 -0.939453 0.230469 -1.17969 0.230469 -1.40918c1.75 -1.40039 10.2998 -6.59082 22.8193 -6.59082c13.1699 0 21.4004 7.06055 21.4004 18.1104v-0.0498047zM152.45 226.78c-10.1299 0 -18.6602 -3.16992 -21.4004 -5.18066
c-0.237305 -0.164062 -0.430664 -0.532227 -0.430664 -0.822266c0 -0.178711 0.0859375 -0.442383 0.19043 -0.586914l2.59082 -7.06055c0.114258 -0.399414 0.544922 -0.723633 0.960938 -0.723633c0.0605469 0 0.15918 0.0107422 0.21875 0.0234375
c0.650391 0 6.7998 4 16.9297 4c4 0 7.06055 -0.709961 9.18066 -2.35938c3.59961 -2.80078 3.05957 -8.29004 3.05957 -10.5801c-4.79004 0.299805 -19.1104 3.43945 -29.4102 -3.75977c-4.05762 -2.7832 -7.34961 -9.03418 -7.34961 -13.9541
c0 -0.162109 0.00390625 -0.424805 0.00976562 -0.585938c0 -5.90039 1.50977 -10.4004 6.58984 -14.3506c12.2402 -8.16016 36.2803 -2 38.1006 -1.41016c1.5791 0.320312 3.5293 0.660156 3.5293 1.87988v33.8809c0.0400391 4.60938 0.320312 21.6396 -22.7793 21.6396z
M199 247.76c0.000976562 0.0205078 0.00195312 0.0527344 0.00195312 0.0722656c0 0.613281 -0.49707 1.11035 -1.10938 1.11035c-0.0205078 0 -0.0527344 -0.000976562 -0.0722656 -0.00195312h-9.82031
c-0.0175781 0.000976562 -0.0449219 0.000976562 -0.0625 0.000976562c-0.612305 0 -1.10938 -0.49707 -1.10938 -1.10938c0 -0.0205078 0.000976562 -0.0527344 0.00195312 -0.0722656v-79c-0.000976562 -0.0195312 -0.00195312 -0.0517578 -0.00195312 -0.0712891
c0 -0.613281 0.49707 -1.11035 1.10938 -1.11035c0.0175781 0 0.0449219 0.000976562 0.0625 0.00195312h9.87988c0.0205078 -0.000976562 0.0527344 -0.00195312 0.0722656 -0.00195312c0.613281 0 1.11035 0.49707 1.11035 1.10938
c0 0.0205078 -0.000976562 0.0527344 -0.00292969 0.0722656zM254.75 218.83c-2.09961 2.30957 -6.79004 7.53027 -17.6504 7.53027c-3.50977 0 -14.1592 -0.230469 -20.6992 -8.94043c-6.35059 -7.62988 -6.58008 -18.1104 -6.58008 -21.4102
c0 -3.12012 0.149414 -14.2598 7.05957 -21.1699c2.63965 -2.91016 9.06055 -8.22949 22.8105 -8.22949c10.8193 0 16.4697 2.34961 18.5791 3.75977c0.470703 0.240234 0.710938 0.709961 0.240234 1.87988l-2.34961 6.83008
c-0.1875 0.402344 -0.699219 0.728516 -1.14258 0.728516c-0.0751953 0 -0.194336 -0.0126953 -0.267578 -0.0283203c-2.58984 -0.94043 -6.34961 -2.82031 -15.29 -2.82031c-17.4199 0 -16.8496 14.7402 -16.9404 16.7002h37.1709
c0.522461 0.0107422 1.04688 0.431641 1.16992 0.939453c-0.290039 0 2.06934 14.7002 -6.09082 24.2305h-0.0195312zM291.44 166.14c13.1699 0 21.4092 7.06055 21.4092 18.1104c0 11.7598 -11.6992 15.1699 -17.8799 17.1699
c-4.13965 1.66016 -13.4102 3.37988 -13.4102 8.94043c0 3.75977 3.29004 6.34961 8.4707 6.34961c4.87988 -0.0976562 12.3613 -1.99316 16.7002 -4.22949c4.33789 -2.2373 1.17969 -0.710938 1.64941 0.469727c0.230469 0.700195 2.35059 6.58008 2.58008 7.29004
c0.0292969 0.0927734 0.0537109 0.24707 0.0537109 0.34375c0 0.441406 -0.337891 0.918945 -0.753906 1.06641c-7.91016 4.89941 -16.7402 4.93945 -20.2295 4.93945c-12 0 -20.46 -7.29004 -20.46 -17.6396c0 -12.46 11.4795 -15.4404 17.8701 -17.1699
c6.10938 -2 13.1699 -3.26074 13.1699 -8.7002c0 -4 -3.52051 -7.06055 -9.16992 -7.06055c-5.82617 0.0126953 -14.3379 2.85742 -19 6.35059c-0.155273 0.132812 -0.447266 0.241211 -0.651367 0.241211c-0.526367 0 -0.973633 -0.426758 -0.999023 -0.951172
l-2.34961 -7.52051c-0.470703 -0.939453 0.229492 -1.17969 0.229492 -1.40918c1.71973 -1.40039 10.3301 -6.59082 22.79 -6.59082h-0.0195312zM357.09 224c0 0.709961 -0.240234 1.17969 -1.17969 1.17969h-11.7598c0 0.140625 0.939453 8.94043 4.46973 12.4707
c4.16016 4.14941 11.7598 1.63965 12 1.63965c1.16992 -0.469727 1.41016 0 1.63965 0.469727l2.83008 7.77051c0.700195 0.939453 0 1.16992 -0.240234 1.41016c-5.08984 2 -17.3496 2.86914 -24.46 -4.24023c-5.47949 -5.48047 -7 -13.9199 -8 -19.5205h-8.46973
c-0.600586 -0.0498047 -1.125 -0.578125 -1.16992 -1.17969l-1.41992 -7.75977c0 -0.700195 0.240234 -1.16992 1.17969 -1.16992h8.23047c-8.50977 -47.9004 -8.75 -50.21 -10.3506 -55.5205c-1.08008 -3.62012 -3.29004 -6.89941 -5.87988 -7.75977
c-0.0898438 0 -3.87988 -1.67969 -9.63965 0.240234c0 0 -0.94043 0.469727 -1.41016 -0.709961c-0.240234 -0.709961 -2.58984 -6.82031 -2.83008 -7.53027s0 -1.41016 0.469727 -1.41016c5.11035 -2 13 -1.76953 17.8809 0
c6.2793 2.28027 9.71973 7.88965 11.5293 12.9404c2.75 7.70996 2.81055 9.79004 11.7598 59.7393h12.2305c0.601562 0.0498047 1.13086 0.578125 1.17969 1.18066zM410.48 208c-0.560547 1.67969 -5.10059 18.1104 -25.1709 18.1104c-15.25 0 -23 -10 -25.1592 -18.1104
c-1 -3 -3.18066 -14 0 -23.5195c0.0898438 -0.300781 4.40918 -18.1201 25.1592 -18.1201c14.9502 0 22.9004 9.60938 25.1709 18.1201c3.20996 9.60938 1.00977 20.5195 0 23.5195zM455.88 224.7c-5 1.64941 -16.6201 1.89941 -22.1104 -5.41016v4.46973
c0.000976562 0.0175781 0.00195312 0.0449219 0.00195312 0.0625c0 0.612305 -0.49707 1.11035 -1.10938 1.11035c-0.0205078 0 -0.0527344 -0.000976562 -0.0722656 -0.00292969h-9.39941c-0.0205078 0.00195312 -0.0527344 0.00292969 -0.0722656 0.00292969
c-0.612305 0 -1.11035 -0.498047 -1.11035 -1.11035c0 -0.0175781 0.000976562 -0.0449219 0.00195312 -0.0625v-55.2793c-0.000976562 -0.0175781 -0.00195312 -0.0449219 -0.00195312 -0.0625c0 -0.618164 0.501953 -1.12012 1.12012 -1.12012
c0.0175781 0 0.0449219 0.000976562 0.0625 0.00195312h9.63965c0.0166016 -0.000976562 0.0449219 -0.00195312 0.0615234 -0.00195312c0.618164 0 1.12012 0.501953 1.12012 1.12012c0 0.0175781 -0.000976562 0.0449219 -0.00195312 0.0625v27.7695
c0 2.91016 0.0498047 11.3701 4.45996 15.0498c4.90039 4.90039 12 3.36035 13.4102 3.06055c0.555664 0.00976562 1.1875 0.430664 1.41016 0.939453c0.972656 2.15918 2.34375 5.74316 3.05957 8c0.0449219 0.113281 0.0800781 0.302734 0.0800781 0.423828
c0 0.356445 -0.246094 0.798828 -0.549805 0.986328v-0.00976562zM502.69 170.6l-2.12012 7.29004c-0.470703 1.18066 -1.41016 0.709961 -1.41016 0.709961c-4.23047 -1.81934 -10.1504 -1.88965 -11.29 -1.88965c-4.63965 0 -17.1699 1.12988 -17.1699 19.7598
c0 6.23047 1.84961 19.7607 16.4697 19.7607c0.245117 0.00585938 0.643555 0.0107422 0.888672 0.0107422c3.00586 0 7.76855 -0.744141 10.6318 -1.66113c2.8623 -0.916992 0.939453 -0.469727 1.17969 0.709961c0.939453 2.58984 1.63965 4.46973 2.58984 7.53027
c0.230469 0.939453 -0.469727 1.16992 -0.709961 1.16992c-11.5898 3.87012 -22.3398 2.5293 -27.7598 0c-1.58984 -0.740234 -16.2305 -6.49023 -16.2305 -27.5205c0 -2.89941 -0.580078 -30.1094 28.9404 -30.1094c4.42383 0.00878906 11.377 1.27637 15.5195 2.83008
c0.290039 0.214844 0.525391 0.682617 0.525391 1.04395c0 0.105469 -0.0244141 0.274414 -0.0546875 0.375977v-0.0107422zM556.56 210.12c-0.799805 3 -5.36914 16.2295 -22.3496 16.2295c-16 0 -23.5195 -10.1094 -25.6396 -18.5898
c-0.913086 -3.0166 -1.6543 -8.02441 -1.6543 -11.1768c0 -0.161133 0.00195312 -0.421875 0.00390625 -0.583008c0 -25.8701 18.8398 -29.4004 29.8799 -29.4004c10.8203 0 16.46 2.35059 18.5801 3.76074c0.469727 0.239258 0.709961 0.709961 0.240234 1.87988
l-2.36035 6.83008c-0.186523 0.402344 -0.698242 0.728516 -1.14258 0.728516c-0.0742188 0 -0.194336 -0.0126953 -0.267578 -0.0292969c-2.58984 -0.939453 -6.34961 -2.81934 -15.29 -2.81934c-17.4199 0 -16.8496 14.7402 -16.9297 16.7002h37.1602
c0.522461 0.0126953 1.05078 0.433594 1.17969 0.939453c-0.239258 0.00976562 0.94043 7.07031 -1.41016 15.54v-0.00976562zM533.27 216.47c5.11035 0 11.8506 -2.2002 12.7305 -14.1201h-26.3701c0.639648 5.12012 3.31055 14.1201 13.6396 14.1201z" />
    <glyph glyph-name="speaker-deck" unicode="&#xf83c;" horiz-adv-x="512" 
d="M213.86 152h-113.86c-55.2002 0 -100 44.7998 -100 100s44.7998 100 100 100h132.84c22.0801 0 40 -17.9199 40 -40s-17.9199 -40 -40 -40h-134.84c-26.4697 0 -26.4502 -40 0 -40h113.82c55.1992 0 100 -44.7998 100 -100s-44.8008 -100 -100 -100h-171.82
c-22.0801 0 -40 17.9199 -40 40s17.9199 40 40 40h173.86c26.4795 0 26.46 40 0 40zM298 32c23.5957 16.0176 46.4932 51.8574 51.1104 80h64.5498c10.8525 0.0927734 19.6602 8.97656 19.6602 19.8291v0.170898v120v0.170898c0 10.8525 -8.80762 19.7363 -19.6602 19.8291
h-117.24c8.29199 9.4834 15.0205 27.4033 15.0205 40s-6.72852 30.5166 -15.0205 40h136.93c43.4404 0 78.6504 -35.8203 78.6504 -80v-160c0 -44.1797 -35.21 -80 -78.6504 -80h-135.35z" />
    <glyph glyph-name="symfony" unicode="&#xf83d;" horiz-adv-x="512" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.74 296.46c15.3496 0.540039 19.7695 15.4404 19.5195 23.1299c-0.639648 18.0605 -19.6699 29.46 -44.8301 28.6504
c-1.89941 -0.0703125 -65.2598 3.46973 -102.43 -105.53c-10.0596 8.29004 -57.7695 65.1602 -110.58 25.8096c-18.9502 -14.1797 -31.4199 -47.9199 -2.9502 -79.6699c16.9502 -18.1396 26.7207 -25.3301 22.25 -39.8496c-9.14941 -29.79 -55.5596 -16.1602 -51 -1.38965
c1.36035 4.38965 3.49023 4.46973 6.28027 13.0693c7.74023 25.3203 -27.1104 37.75 -34.6201 13.6006c-4.32031 -14.0605 2.37988 -39.5107 38.3799 -50.6201c42.1602 -12.96 77.8203 10.0098 82.8799 39.9395c3.2002 18.75 -5.29004 32.6904 -20.7998 50.6201l-12.6299 14
c-7.66016 7.7002 -10.29 20.7002 -2.37012 30.7002c6.69043 8.45996 16.2002 12.0605 31.8105 7.83008c22.7695 -6.16992 32.9199 -21.9697 49.8496 -34.7197c-1.23047 -4 -10.04 -32.3398 -18.2305 -82c-12.1094 -63.4902 -21.3496 -98.3506 -45.3496 -118.351
c-4.83984 -3.48926 -11.7598 -8.63965 -22.1797 -9c-1.94043 -0.0595703 -14.1406 2.83984 -2.0498 12.5508c15.2393 8.3291 7.00977 34.75 -14.8809 34c-9.85938 -0.330078 -24.8691 -9.59082 -24.3096 -26.5908c0.580078 -17.5293 16.9297 -30.6895 41.5801 -29.8398
c13.1797 0.44043 42.5801 5.7998 71.5801 40.2598c39.8496 46.7207 47.4395 102.2 58.2002 161.721c51.6797 -6.11035 77.2393 17.8398 77.5996 35.7002c0.549805 24.2998 -28 23.46 -32 5.2998c-1.91992 -8.83984 13.4199 -16.8105 1.41992 -24.5605
c-8.49023 -5.5 -23.71 -9.37012 -45.1396 -6.21973c10.2998 56.8496 19.1094 112.56 58.8896 113.85c2.70996 0.150391 12.6396 -0.119141 12.8701 -6.66992c0.150391 -5.41016 -6.7998 -9.66992 -6.53027 -18.8496c0.370117 -10.4199 8.2998 -17.2803 19.7705 -16.8701z
" />
    <glyph glyph-name="waze" unicode="&#xf83f;" horiz-adv-x="512" 
d="M502.17 246.33c14.5205 -85.8604 -30.9395 -167.92 -113.17 -208.13c13 -34.1006 -12.4004 -70.2002 -48.3203 -70.2002c-27.0625 0.0214844 -50.166 21.9736 -51.5693 49c-6.44043 -0.19043 -64.2002 0 -76.3301 0.639648
c-1.10645 -27.3809 -24.2441 -49.6035 -51.6484 -49.6035c-0.588867 0 -1.54395 0.0195312 -2.13184 0.0439453c-33.8604 1.36035 -57.9502 34.8398 -47 67.9199c-37.21 13.1104 -72.54 34.8701 -99.6201 70.7998c-13 17.2803 -0.479492 41.7998 20.8398 41.7998
c46.3105 0 32.2207 54.1699 43.1504 110.261c18.4297 93.9395 116.75 157.14 211.72 157.14c102.48 0 197.15 -70.6699 214.08 -169.67zM373.51 59.7197c42 19.1807 81.3301 56.71 96.29 102.141c40.4805 123.09 -64.1494 228 -181.71 228
c-83.4502 0 -170.32 -55.4199 -186.07 -136c-9.5293 -48.9102 5 -131.351 -68.75 -131.351c24.9404 -33.1094 58.3301 -52.6201 93.7305 -64.0498c24.6602 21.7998 63.8701 15.4697 79.8301 -14.3398c14.2197 -1 79.1895 -1.17969 87.9004 -0.820312
c7.9502 15.5303 28.5635 28.1348 46.0107 28.1348c10.2002 0 24.8799 -5.24805 32.7686 -11.7148zM205.12 260.87c0 34.7402 50.8398 34.75 50.8398 0s-50.8398 -34.7402 -50.8398 0zM321.69 260.87c0 34.7402 50.8594 34.75 50.8594 0s-50.8594 -34.75 -50.8594 0z
M199.08 190.18c-3.44043 16.9404 22.1797 22.1807 25.6201 5.20996l0.0595703 -0.279297c4.14062 -21.4199 29.8506 -44 64.1201 -43.0703c35.6797 0.94043 59.25 22.21 64.1104 42.7695c4.45996 16.0508 28.5996 10.3604 25.4697 -6
c-5.22949 -22.1797 -31.21 -62 -91.46 -62.8994c-42.5498 0 -80.8799 27.8398 -87.9004 64.25z" />
    <glyph glyph-name="yammer" unicode="&#xf840;" horiz-adv-x="512" 
d="M421.78 295.83c-48.1602 -26.3896 -118.561 -58.1504 -130.2 -50s91.4395 80.3701 106.689 88.7695c0.920898 0.5 1.80078 0.970703 2.63086 1.40039c1.76562 0.521484 4.69336 0.945312 6.53516 0.945312c12.7295 0 23.0605 -10.3311 23.0605 -23.0596
c0 -6.14453 -3.90527 -14.2334 -8.71582 -18.0557zM421.78 78.6602c4.76855 -3.82324 8.63965 -11.8877 8.63965 -18c0 -12.7344 -10.335 -23.0703 -23.0703 -23.0703c-1.81641 0 -4.70605 0.412109 -6.44922 0.919922
c-0.830078 0.410156 -1.70996 0.900391 -2.63086 1.41016c-15.2695 8.38965 -118.25 80.6396 -106.689 88.7402c11.5596 8.09961 82.04 -23.6201 130.2 -50zM464.21 211c10.0947 -2.11328 18.2559 -12.1992 18.2559 -22.5117
c0 -10.7881 -8.63965 -20.9561 -19.2861 -22.6982c-54.9102 0.0195312 -131.93 6.00977 -138.21 18.7598c-6.2793 12.75 118.84 26.5098 136.24 26.5098c1.0498 0 2.0498 -0.0595703 3 -0.0595703zM31 351.35c-0.699219 2.10742 -1.2666 5.61914 -1.2666 7.83887
c0 13.7334 11.1455 24.8799 24.8799 24.8799c8.72949 0 18.8213 -6.41504 22.5264 -14.3184l81 -205.06h1.20996l77 203.529c3.22559 8.26074 13.041 14.9648 21.9092 14.9648c12.9834 0 23.5205 -10.5371 23.5205 -23.5195
c0 -1.89258 -0.438477 -4.90137 -0.979492 -6.71484l-109.6 -273.391c-18.5498 -47.2197 -37.1201 -79.5596 -93.29 -79.5596c-0.151367 -0.000976562 -0.395508 -0.000976562 -0.545898 -0.000976562c-6.4668 0 -16.8887 0.874023 -23.2646 1.95117
c-8.52051 2.44238 -15.4365 11.6201 -15.4365 20.4844c0 11.7637 9.54688 21.3105 21.3096 21.3105c0.28418 0 0.744141 -0.0117188 1.02734 -0.0253906c0.660156 -0.0595703 10.9102 -0.660156 13.8604 -0.660156c30.4697 0 43.7393 18.9404 58.0693 59.4102z" />
    <glyph glyph-name="git-alt" unicode="&#xf841;" 
d="M439.55 211.95c4.66504 -4.66602 8.45117 -13.8076 8.45117 -20.4053s-3.78613 -15.7393 -8.45117 -20.4053l-194.689 -194.689c-4.66602 -4.66211 -13.8047 -8.44629 -20.4004 -8.44629s-15.7344 3.78418 -20.4004 8.44629l-195.609 195.6
c-4.66504 4.66602 -8.45117 13.8076 -8.45117 20.4053s3.78613 15.7393 8.45117 20.4053l134.12 134.14l50.79 -50.8496c-5.95996 -14.2607 -2.16016 -36.4902 18.6396 -45v-123c-22.3203 -9.09082 -28.8203 -38.4004 -11.25 -56
c5.55176 -5.54883 16.4268 -10.0518 24.2754 -10.0518c7.84766 0 18.7236 4.50293 24.2744 10.0518c13.1807 13.1494 16.2197 42.46 -9.08008 55v121.85l46.3506 -46.29c-14.21 -34.4697 29.5098 -63.8301 56 -37.3398c25.71 25.6895 -1.24023 68.4902 -35.4707 56.6895
l-49.6592 49.6602c9.29004 26.9102 -16.3301 52.8203 -43.3906 43.6807l-51.5195 51.5195l40.6602 40.6299c4.66602 4.66309 13.8076 8.44727 20.4043 8.44727s15.7383 -3.78418 20.4053 -8.44727z" />
    <glyph glyph-name="stackpath" unicode="&#xf842;" 
d="M244.6 215.6c0 -8.5 -4.25977 -20.4893 -21.3398 -20.4893h-19.6094v41.4697h19.6094c17.1299 0 21.3398 -12.3604 21.3398 -20.9805zM448 416v-448h-448v448h448zM151.3 160.16c0 21.2402 -12.1201 34.54 -46.7197 44.8496c-20.5703 7.41016 -26 10.9102 -26 18.6299
c0 7.7207 7 14.6104 20.4102 14.6104c14.0898 0 20.79 -8.4502 20.79 -18.3496h30.7002l0.189453 0.569336c0.5 19.5703 -15.0596 41.6504 -51.1201 41.6504c-23.3701 0 -52.5498 -10.75 -52.5498 -38.29c0 -19.4004 9.25 -31.29 50.7402 -44.3701
c17.2598 -6.15039 21.9102 -10.4004 21.9102 -19.4795c0 -15.2002 -19.1309 -14.2305 -19.4707 -14.2305c-20.3994 0 -25.6494 9.09961 -25.6494 21.9004h-30.7998l-0.180664 -0.560547c-0.679688 -31.3203 28.3799 -45.2197 56.6299 -45.2197
c29.9805 0 51.1201 13.5498 51.1201 38.29zM276.68 215.79c0 25.2998 -18.4297 45.46 -53.4199 45.46h-51.7793v-138.18h32.1699v47.3594h19.6094c30.25 0 53.4199 15.9502 53.4199 45.3604zM297.94 123l49.0596 138.22h-31.0898l-47.9102 -138.22h29.9404zM404.46 261.22
h-31.0898l-47.9102 -138.22h29.9404z" />
    <glyph glyph-name="cotton-bureau" unicode="&#xf89e;" horiz-adv-x="512" 
d="M474.31 117.59h25.1807c-25.7998 -109.78 -111.4 -173.59 -239.67 -173.59c-154.63 -0.339844 -247.82 92.8604 -247.82 248.18c0 154.63 93 247.82 247.82 247.82c128.399 0 214.06 -63.5098 240.18 -173.61h-25.2598
c-24.8506 95.6104 -99.9199 148.811 -214.69 148.811c-141.85 0 -223.2 -81.3799 -223.2 -223.2c0 -137.93 76.6699 -218 211.101 -223v49.2002c0 48.1602 -26.5498 74.3896 -74.5498 74.3896c-62.1309 0 -99.4004 37.2803 -99.4004 99.4102
c0 61.3701 36.5195 98.2803 97.3799 99.0596c30.7402 64.6504 144.24 69.3203 177.24 0c60.8496 -0.779297 97.3799 -37.6895 97.3799 -99.0596c0 -62.0098 -37.2002 -99.21 -99.2002 -99.21c-47.9795 0 -74.3896 -26.3896 -74.3896 -74.3896v-49.1602
c107.67 3.75977 178.24 56.5 201.899 148.35zM357 265.67c3.7998 -21.0801 11.2695 -104.2 -71.79 -120.75c12.2598 -17.7402 32.9805 -27.3301 61.5898 -27.3301c47.9697 0 74.4004 26.4102 74.4004 74.4102c0 44.6699 -22.8301 70.2197 -64.2002 73.6699zM275.32 168.31
c72.7803 9.89062 58.5 86.9102 56.2295 97c-72.5596 -10 -58.6895 -86.6592 -56.2295 -97zM260 316l-0.179688 -0.259766c-28.3008 0 -49.1602 -9.66016 -61.5703 -27.3506c28.3701 -5.44922 49.3701 -20.5898 61.5996 -43.4492
c12.2305 22.8594 33.2305 37.9697 61.5908 43.4492c-12.4404 17.9404 -32.8301 27.6104 -61.4404 27.6104zM188.48 265.28h0.239258c-2.75 -10.0498 -16.1602 -87.1602 56.25 -97c2.41992 10.1895 16.6807 86.4297 -56.4893 97zM173.2 117.59l0.330078 0.0302734
c28.2998 0 49 9.66992 61.1396 27.2998c-73.0303 14.2197 -78.4004 83.5498 -71.6504 120.75c-41.3594 -3.66992 -64.2197 -29.3096 -64.2197 -73.6699c0 -48.0098 26.4004 -74.4102 74.4004 -74.4102zM226.41 105.2h0.269531
c14.4902 -7.60059 25.5605 -19.3301 33.5605 -33.8301c6.36523 12.2188 21.4092 27.374 33.5801 33.8301c-14.4902 8.00977 -26.0508 19.0596 -33.8203 33.5498c-6.4248 -12.1094 -21.4736 -27.1396 -33.5898 -33.5498z" />
    <glyph glyph-name="buy-n-large" unicode="&#xf8a6;" horiz-adv-x="576" 
d="M288 416c154.73 0 280.21 -100.32 280.21 -224s-125.479 -224 -280.21 -224s-280.21 100.32 -280.21 224s125.479 224 280.21 224zM202.61 58.8096c61.5498 0.600586 99.4697 24.3604 117.71 61.5205c-35.79 6.4502 -62.9307 37.3096 -62.9307 74.4502
c0 41.7695 34.3408 75.6494 76.6904 75.6494h0.0341797c4.80078 0 12.4951 -0.864258 17.1758 -1.92969c0.524414 1.86621 1.19629 4.93555 1.5 6.84961c6.92969 44.1904 -14.8496 72.8408 -78 72.8408h-133.44l-77.25 -290.74zM358 240.89l-9.4502 -36.75l-15 36.75
h-31.3398l-26.6299 -90.3096h37.8301l7.83008 35.6299l11.1895 -35.6299h35.4102l22.1602 90.3096h-32zM503.86 58.8096l21.1992 84.0605h-103.869l53.0498 205.36h-92.5l-21.3301 -82.3506c29.3799 -10.5996 50.3799 -38.4102 50.3799 -71.0596
c0 -41.7803 -34.3496 -75.6504 -76.6904 -75.6504h-0.0625c-3.16504 0 -8.27539 0.37207 -11.4072 0.830078l-15.8398 -61.1904h197.07zM211.7 178.61c16.1494 0 29.7002 -7.51074 24.1396 -29.8203c-5.83008 -23.4697 -21.7998 -26.6504 -37.9395 -26.6504h-24.7002
l13.7998 56.4707h24.7002zM233 278c18.0703 0 32.2305 1.29004 27.5801 -17.5703c-3.83008 -15.5 -21.21 -30.1396 -39.21 -30.1396h-21.3701l11.6602 47.71h21.3398z" />
    <glyph glyph-name="mdb" unicode="&#xf8ca;" horiz-adv-x="576" 
d="M17.3701 287.59h46.2998l42.3301 -117.33l40.7002 117.33h45.5098l12.79 -191.59h-45.5303l-4.79004 77.4297l-25.54 -77.4297h-44.71l-27.9297 79.8301l-5.58984 -79.8301h-43.9102zM298.37 287.59c0 0 93.4199 -1.58984 94.2002 -95.7998
c0.799805 -96.5898 -94.2002 -95.79 -94.2002 -95.79h-47.9004v191.59h47.9004zM297.17 141.13c0 0 47.5996 5.21973 46.7998 51.5205c-0.799805 46.2998 -46.7998 50.5693 -46.7998 50.5693v-102.09zM535.46 215.37c0 0 33.54 -11.96 33.54 -55.1006
c0 -68.6396 -87 -63.8496 -87 -63.8496h-45.5195v191.58h51.8994s49.7402 1.44043 55.0801 -34.3203c0.348633 -2.30371 0.630859 -6.06445 0.630859 -8.39453c0 -8.94336 -3.86621 -22.3457 -8.63086 -29.915zM483.56 247.31v-21.5898h12s5.43066 5.33984 4 12
c-2.42969 11.1807 -16 9.58984 -16 9.58984zM483.46 137.85c0 0 41.04 -4.92969 41.3701 20.7207c0.389648 27.1602 -41.1904 22.4297 -41.1904 22.4297h-0.0800781v-18.2305z" />
    <glyph glyph-name="orcid" unicode="&#xf8d2;" horiz-adv-x="512" 
d="M294.75 259.81c58.1299 0 84.6699 -35.2598 84.6699 -76.8994c0 -25.5703 -15.5 -76.9102 -83.1201 -76.9102h-47.4697v153.81h45.9199zM256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM175.21 79.2402v207.5h-29.8398v-207.5
h29.8398zM160.29 310.38c10.7646 0.0380859 19.5312 8.80566 19.5703 19.5703c0 10.8027 -8.76758 19.5693 -19.5703 19.5693s-19.5703 -8.7666 -19.5703 -19.5693s8.76758 -19.5703 19.5703 -19.5703v0zM300 79c68.3799 0 110 50.6104 110.04 103.89
c0 49.0205 -33.71 103.851 -110.44 103.851h-80.5996v-207.74h81z" />
    <glyph glyph-name="swift" unicode="&#xf8e1;" 
d="M448 291.91c0 -5.35059 -0.000976562 -10.7002 0.00878906 -16.0498v-183.771c-0.0292969 -4.50977 -0.0800781 -9.00977 -0.200195 -13.5098c-0.0966797 -8.1748 -1.25781 -21.3545 -2.58984 -29.4199c-1.38477 -8.11035 -5.51465 -20.6543 -9.21973 -28
c-7.66406 -15.0459 -26.0898 -33.4854 -41.1299 -41.1602c-7.34766 -3.69824 -19.8916 -7.82422 -28 -9.20996c-8.07129 -1.32715 -21.2607 -2.4873 -29.4404 -2.58984c-4.51953 -0.120117 -9.00977 -0.200195 -13.5195 -0.200195h-199.79
c-4.52051 0.0302734 -9.02051 0.0800781 -13.5205 0.200195c-8.17676 0.0976562 -21.3613 1.25781 -29.4297 2.58984c-8.1084 1.38379 -20.6523 5.50977 -28 9.20996c-15.0342 7.67676 -33.4609 26.1113 -41.1299 41.1504c-3.70508 7.3457 -7.83496 19.8896 -9.21973 28
c-1.3252 8.06543 -2.48145 21.2461 -2.58008 29.4199c-0.129883 4.50977 -0.209961 9 -0.209961 13.5098v199.83c0.0292969 4.51953 0.0800781 9.00977 0.209961 13.5195c0.0888672 8.16797 1.22754 21.3389 2.54004 29.4004c1.38672 8.10938 5.5166 20.6533 9.21973 28
c3.74121 7.34473 11.5146 18.0293 17.3496 23.8496c1.74023 1.7207 3.55078 3.39062 5.43066 5c4.6748 3.99805 12.9141 9.51758 18.3896 12.3203c2.2334 1.11328 4.50391 2.15332 6.81152 3.12012c5.67188 2.31348 15.1738 5.04688 21.21 6.09961
c6.04688 1.03516 15.9297 2.07422 22.0596 2.32031c2.45996 0.120117 4.91992 0.200195 7.37012 0.269531c4.51953 0.120117 9.00977 0.200195 13.5195 0.200195h199.75c4.52051 -0.0292969 9.01074 -0.0800781 13.5205 -0.200195
c8.17676 -0.0976562 21.3613 -1.25781 29.4297 -2.58984c8.11035 -1.38281 20.6543 -5.51367 28 -9.21973c15.0547 -7.66211 33.4941 -26.0977 41.1602 -41.1504c3.70117 -7.34668 7.83105 -19.8906 9.21973 -28c1.3252 -8.06543 2.48047 -21.2461 2.58008 -29.4199
c0.120117 -4.51953 0.200195 -9.00977 0.200195 -13.5195zM378.119 50.9102c4.91016 -9.58008 15.3604 41.1797 -23.1602 88.5801c0.490234 1.68945 1 3.35938 1.44043 5.08984c18.5996 74.0801 -26.79 161.67 -103.58 207.75
c33.6494 -45.6201 48.5293 -100.87 35.3096 -149.2c-0.970703 -3.50098 -2.83398 -9.08789 -4.16016 -12.4697c-1.72949 1.14941 -3.84961 2.41992 -6.72949 4c0 0 -76.3906 47.1699 -159.181 130.59c-2.16992 2.2002 44.1504 -66.25 96.7207 -121.74
c-24.7803 13.9004 -93.7803 64.1201 -137.48 104.12c4.60156 -7.57031 13.0146 -19.1738 18.7803 -25.8994c36.4902 -46.2207 84.0898 -103.37 141.09 -147.221c-40 -24.4902 -96.6396 -26.3994 -153 0c-11.4521 5.37598 -29 15.8457 -39.1699 23.3701
c21.3398 -33.9365 68.5098 -74.4219 105.29 -90.3701c53.3203 -22.9199 106.35 -21.3799 145.85 -0.379883l0.419922 0.25c1.77051 1 3.53027 2 5.25 3c19.0801 9.7998 56.3105 19.46 76.3105 -19.4697z" />
    <glyph glyph-name="umbraco" unicode="&#xf8e8;" horiz-adv-x="510" 
d="M255.35 440c136.99 -0.169922 247.83 -111.31 247.65 -248.28c-0.179688 -136.97 -111.15 -247.67 -248 -247.67c-137 0.0703125 -248.07 111.271 -248 248.271c0.139648 136.96 111.36 247.85 248.35 247.68zM400.35 174
c0.296875 4.31738 0.518555 11.3311 0.518555 15.6582c0 4.16406 -0.222656 10.9141 -0.498047 15.0693c-0.354492 12.1631 -1.97168 31.8213 -3.61035 43.8799c-1.87012 13.2197 -3.56934 22.3799 -5.38965 32c-1.02051 4.87988 -1.28027 6.39941 -1.83008 8.44922
c-0.489258 2.14746 -2.67285 3.89062 -4.875 3.89062h-0.0253906h-0.819336l-32 -5c-2.31934 -0.375977 -4.20117 -2.58691 -4.20117 -4.93555c0 -0.0175781 0.000976562 -0.046875 0.000976562 -0.0644531c-0.00878906 -0.106445 -0.0146484 -0.27832 -0.0146484 -0.384766
s0.00585938 -0.279297 0.0146484 -0.385742l1.68945 -8.7793c1.60645 -8.86719 3.23633 -20.0938 4.88965 -33.6807c1.35156 -11.5938 2.5166 -30.4775 2.59961 -42.1494c0.266602 -26.9072 -2.44336 -46.834 -8.12988 -59.7803
c-5.01953 -11.3809 -18.9746 -22.6836 -31.1504 -25.2305c-13.7178 -2.9043 -36.2324 -5.26074 -50.2549 -5.26074c-1.93652 0 -5.0791 0.0449219 -7.01465 0.101562h-10.25c-1.9668 -0.0576172 -5.15918 -0.104492 -7.12695 -0.104492
c-14.0098 0 -36.5059 2.34863 -50.2129 5.24414c-12.2217 2.49805 -26.248 13.7793 -31.3105 25.1797c-5.60645 12.9336 -8.31641 32.877 -8.12988 59.8301c0.0820312 11.6738 1.26562 30.5576 2.64062 42.1504c1.62012 13.6201 3.2334 24.8467 4.83984 33.6797
l1.7002 8.78027c0.0078125 0.105469 0.0146484 0.27832 0.0146484 0.384766s-0.00683594 0.279297 -0.0146484 0.384766v0.0126953c0 2.33398 -1.86426 4.56836 -4.16016 4.9873l-32 5h-0.69043c-2.18848 -0.0195312 -4.38379 -1.7627 -4.89941 -3.88965
c-0.540039 -2.03027 -0.820312 -3.57031 -1.82031 -8.4502c-1.83008 -9.41992 -3.52051 -18.6094 -5.40039 -32c-1.63184 -12.0586 -3.24414 -31.7168 -3.59961 -43.8799c-0.290039 -4.2334 -0.525391 -11.1123 -0.525391 -15.3545
c0 -4.24316 0.235352 -11.1221 0.525391 -15.3555c0.766602 -27.0928 5.43359 -48.7598 14 -65c8.57324 -16.2061 23.0801 -27.873 43.5195 -35c20.4404 -7.12695 48.9209 -10.6172 85.4414 -10.4697h4.59961c36.5605 -0.15332 65.0439 3.33691 85.4502 10.4707
c20.4336 7.12012 34.9365 18.7871 43.5098 35.001s13.2402 37.8809 14 65.001z" />
    <glyph glyph-name="firefox-browser" unicode="&#xf907;" horiz-adv-x="512" 
d="M130.63 324.51c0.160156 -0.00976562 0.0800781 -0.00976562 0 0zM482.05 279.16c15.2803 -36.7598 20.6709 -80.748 15.8213 -122.578c-0.370117 -3.15039 -0.700195 -6.29004 -1.11035 -9.41016c-19.6094 -115.04 -119.79 -202.62 -240.43 -202.62
c-134.71 0 -243.92 109.19 -243.92 243.891v1.23926c0.149414 2.70996 0.30957 5.41016 0.490234 8.12012c0.0498047 0.240234 0.0498047 0.480469 0.0498047 0.719727c0.439453 6.29004 0.870117 10.3105 1.43945 14c0.240234 1.91309 0.5 3.82617 0.780273 5.73926
c1.66992 12.2705 3.94043 22.21 4 22.4805c4.9502 22.2051 19.6123 55.3125 32.7305 73.8994v0c5.65527 8.06738 15.8564 20.3115 22.7695 27.3301c6.08203 6.21973 16.7627 15.3721 23.8398 20.4307c0.930664 0.629883 8.03027 4.83984 8.15039 4.30957
c-0.570312 -8.42969 -1.24023 -48.8301 8.42969 -61.0801h0.120117c14.1602 15.9199 33.6504 33.96 58.71 45.3701c-2.02344 -7.75098 -3.66504 -20.543 -3.66504 -28.5537c0 -8.74512 1.95117 -22.668 4.35547 -31.0762
c1.81641 -1.21777 4.64258 -3.35449 6.30957 -4.77051c3.71973 -3.14941 7.91992 -7.34961 16.7705 -16.0596c16.5498 -16.3096 59 -33.1797 59.0898 -35.1797c-0.400391 -6.08008 -21.8301 -27 -29.3301 -27c-69.3701 0 -80.6201 -41.9502 -80.6201 -41.9502
c3.07031 -35.3301 27.6699 -64.4102 57.5098 -79.75c1.36035 -0.730469 2.74023 -1.37012 4.12012 -2c2.36035 -1.04004 4.74023 -2.02051 7.16016 -2.92969c8.50586 -3.00977 22.7246 -5.75195 31.7402 -6.12012c121.569 -5.7002 145.13 145.34 57.3896 189.199
c22.4697 3.91016 45.8203 -5.12988 58.8203 -14.2793c-8.68652 15.1641 -27.7988 34.9346 -42.6602 44.1299c-0.993164 0.620117 -1.99316 1.21973 -3 1.7998c-1.55957 0.913086 -3.13965 1.79004 -4.74023 2.62988c-0.75 0.390625 -1.5 0.759766 -2.25 1.12988
c-1.65332 0.813477 -3.32031 1.59668 -5.00098 2.34961c-1.07031 0.469727 -2.16016 0.910156 -3.25 1.34961c-1.33984 0.580078 -2.68945 1.08008 -4.0498 1.58008c-1.86035 0.669922 -3.73047 1.2998 -5.62012 1.87012c-0.679688 0.209961 -1.33008 0.429688 -2 0.629883
c-9.20996 2.66309 -24.4668 4.82422 -34.0537 4.82422c-0.275391 0 -0.72168 -0.00195312 -0.996094 -0.00390625c-2 -0.0205078 -4 -0.100586 -6 -0.220703l-1.41992 -0.0996094c-12.1934 -0.852539 -31.0586 -5.78027 -42.1104 -11l-0.519531 -0.209961
c-0.536133 -0.18457 -1.43066 -0.334961 -1.99805 -0.334961c-2.40918 0 -5.00391 1.84863 -5.79199 4.125c-0.210938 0.575195 -0.381836 1.53906 -0.381836 2.15137c0 2.13965 1.55469 4.64746 3.47168 5.59863c12.6738 6.01074 34.3252 11.5342 48.3301 12.3301
c5.7793 35.3994 28.2695 91.0098 82.5 122.78l-0.100586 -0.140625l0.180664 0.100586l0.120117 0.0693359c0.0615234 0.0166016 0.165039 0.0302734 0.229492 0.0302734s0.167969 -0.0136719 0.230469 -0.0302734c0.303711 -0.0380859 0.550781 -0.318359 0.550781 -0.625
c0 -0.00976562 -0.000976562 -0.0253906 -0.000976562 -0.0351562c0.698242 -2.77051 2.3291 -7.08008 3.63965 -9.61914c0.830078 -1.70996 1.69043 -3.40039 2.69043 -5.05078c1.87988 -3.21973 3.80957 -6.2793 5.73926 -9.33008
c38.2002 -60.3594 84.9707 -88.0791 112.551 -156.829c-0.0507812 0.269531 -0.0507812 0.40918 -0.0507812 0.40918c-3.0293 20.1201 -10.9795 47.1104 -24.6992 74c16.8594 -8.72949 38.3301 -36.2295 48.9395 -61.7295z" />
    <glyph glyph-name="ideal" unicode="&#xf913;" horiz-adv-x="576" 
d="M125.61 282.52c27.0693 -0.0107422 49.0488 -21.9893 49.0596 -49.0596v-0.00976562c0 -27.0869 -21.9834 -49.0703 -49.0703 -49.0703c-27.0859 0 -49.0693 21.9834 -49.0693 49.0703s21.9834 49.0693 49.0693 49.0693h0.0107422zM86.1504 22.1602v140.52h78.9395
v-140.52h-78.9395zM237.61 233.76c0 -20.4502 -8.99023 -23.2598 -18.7402 -23.2598h-14.0498v45.79h14.0498c8.74023 0 18.7402 -2.53027 18.7402 -22.5303zM439.3 187.76h57.0898c-1.7793 -98.4795 -52.1094 -165.64 -196.72 -165.64h-94.8301v165.62h14
c25.9805 0 41.5 17.1895 41.5 46c0 27.9102 -15.8994 45.2598 -41.5 45.2598h-14v82.8096h94.8301c88.9404 0 186.83 -26.8896 196.07 -151.31h-33.6904v68.5703h-22.75v-91.3105zM329.55 187.76l-0.0400391 22.7402h-33.5098v12.5h30v22.6904h-30v10.5791h31.7305v22.7305
h-54.4307v-91.2402h56.25zM404.21 187.76l23.6699 -0.0195312l-27.5303 91.3398h-32.3496l-27.5303 -91.3203h23.6602l5.17969 17.6699h29.7402zM299.65 416c218.35 0 250.97 -140 251 -223.48c0 -144.789 -89.1504 -224.52 -251 -224.52h-267.65v448h267.65z
M299.65 -10.9199c148.899 0 229.899 69.3496 229.899 203.439c0 137.801 -87.7998 202.41 -229.899 202.41h-246.58v-405.85h246.58zM383.51 253.93h1.37012l7.52051 -25.8096h-16.4004z" />
    <glyph glyph-name="microblog" unicode="&#xf91a;" 
d="M399.36 85.7695l0.149414 0.0605469c-12.0234 -13.6182 -21.7812 -39.4141 -21.7812 -57.5811c0 -16.3584 8.10547 -40.1514 18.0918 -53.1094c0.521484 -0.658203 0.944336 -1.87402 0.944336 -2.71387c0 -0.25293 -0.0419922 -0.658203 -0.0947266 -0.90625
c-0.40332 -1.94336 -2.34277 -3.52051 -4.32715 -3.52051c-0.249023 0 -0.649414 0.0410156 -0.892578 0.0908203c-32.2803 7.17969 -61.3105 24.8301 -79.8906 49.9199c-1.18652 1.62598 -3.78516 2.94629 -5.79785 2.94629
c-0.658203 0 -1.69824 -0.172852 -2.32129 -0.385742c-21.1924 -7.41895 -56.6133 -13.4404 -79.0654 -13.4404h-0.375c-122.86 0 -222.46 91.4805 -222.46 204.43c0 112.95 99.5996 204.44 222.46 204.44s222.46 -91.4902 222.46 -204.44
c0 -47.4492 -17.6104 -91.0996 -47.0996 -125.79zM329.52 235.6c1.4209 1.07617 2.57422 3.36816 2.57422 5.15039c0 3.5625 -2.8916 6.47461 -6.4541 6.5l-71.8799 1.50977l-23.6602 67.9199c-0.836914 2.41113 -3.58789 4.36719 -6.13965 4.36719
s-5.30273 -1.95605 -6.13965 -4.36719l-23.6602 -67.9199l-71.8799 -1.50977c-3.51953 -0.0673828 -6.375 -2.97949 -6.375 -6.49902c0 -1.7832 1.15332 -4.10449 2.5752 -5.18066l57.2998 -43.4902l-20.79 -68.8604
c-0.152344 -0.505859 -0.276367 -1.3457 -0.276367 -1.87402c0 -3.59375 2.91699 -6.51074 6.51074 -6.51074c1.12598 0 2.79102 0.522461 3.71582 1.16504l59.0596 41.0801l59.0596 -41.0498c0.925781 -0.646484 2.59277 -1.1709 3.72168 -1.1709
c3.58789 0 6.5 2.91211 6.5 6.5c0 0.533203 -0.125977 1.38086 -0.28125 1.89062l-20.7803 68.8604z" />
    <glyph glyph-name="pied-piper-square" unicode="&#xf91e;" 
d="M32 29l-32 -60.2002l0.799805 328c0 65.9004 53.2002 119.2 119.2 119.2h327.2c-93 -28.9004 -189.9 -94.2002 -253.9 -168.6c-70.5996 -81.4004 -110.7 -137.4 -161.3 -218.4zM448 416c0 0 0 -328.8 0.0996094 -328.8c0 -65.9004 -53.2998 -119.2 -119.3 -119.2
h-328.399c18.5 25.5 61.6992 54 84.8994 66c35.5 18.0996 76.4004 28.5 105.3 56.2998c42.1006 40.5 47.8008 105 71 158.601c43.6006 100.3 186.4 167.1 186.4 167.1z" />
    <glyph glyph-name="unity" unicode="&#xf949;" horiz-adv-x="576" 
d="M498.11 241.6l-30 -49.5996l30 -49.6299l-52.8008 -191.62l-197.079 51.3604l-29.2402 50l-59.1699 -0.430664l-144.28 140.32l144.26 140.29l59.2002 -0.429688l29.2002 50.0596l197.109 51.3604zM223.77 323.8l-108.899 -108.13h173.13l86.5498 145.82zM223.77 60.1699
l150.78 -37.6895l-86.5498 145.81h-173.13zM416.77 46.1699l41.79 145.83l-41.8096 145.84l-86.5801 -145.84z" />
    <glyph glyph-name="dailymotion" unicode="&#xf952;" 
d="M298.93 181c6.01074 -3.36719 13.6152 -10.9834 16.9727 -17c3.36719 -5.95801 6.10059 -16.3477 6.10059 -23.1914c0 -0.0771484 -0.000976562 -0.202148 -0.000976562 -0.27832c-0.0332031 -13.6602 -4.58691 -25.084 -13.6602 -34.2705
s-20.4434 -13.7793 -34.1104 -13.7793c-13.4336 0 -24.5771 4.47949 -33.4307 13.4395s-13.2803 20.4932 -13.2803 34.5996c0 13.4336 4.53711 24.5742 13.6104 33.4209s20.2197 13.2695 33.4395 13.2695c0.174805 0.00195312 0.458984 0.00390625 0.633789 0.00390625
c6.99805 0 17.627 -2.7832 23.7256 -6.21387zM0.00195312 416h448v-448h-448v448zM374.712 42.7402l-0.0302734 264.349l-55.79 -12.0898v-77.9199c-7.81348 7.86035 -16.1465 13.5273 -25 17.001c-7.625 2.88086 -20.4277 5.21777 -28.5791 5.21777
c-0.320312 0 -0.839844 -0.00292969 -1.16016 -0.0078125c-17.6934 -0.00683594 -33.6006 -4.37305 -47.7207 -13.0996c-11.8623 -7.32227 -26.6152 -23.3516 -32.9297 -35.7803c-7.83984 -15.1064 -11.7598 -31.8467 -11.7598 -50.2197
c-0.00683594 -18.8066 3.85645 -35.7705 11.5898 -50.8906c6.26367 -12.4766 21.0205 -28.502 32.9395 -35.7695c14.2197 -8.7334 30.5166 -13.1006 48.8906 -13.1006c26.6602 0 45.2539 8.7334 55.7803 26.2002h0.669922v-23.8896h53.0996z" />
    <glyph glyph-name="instagram-square" unicode="&#xf955;" 
d="M224 245.34c29.4326 -0.0107422 53.3379 -23.9072 53.3604 -53.3398c0 -29.4434 -23.8965 -53.3398 -53.3408 -53.3398c-29.4434 0 -53.3398 23.8965 -53.3398 53.3398c0 29.4326 23.8877 53.3291 53.3203 53.3398zM348.71 286.34
c8.34961 -21.0703 6.46973 -71.0596 6.46973 -94.3398s1.91992 -73.3301 -6.42969 -94.3301c-4.75 -12.0371 -18.373 -25.6602 -30.4102 -30.4102c-21.0596 -8.35938 -70.9902 -6.42969 -94.2998 -6.42969s-73.3096 -1.86035 -94.3096 6.42969
c-12.0371 4.75 -25.6611 18.373 -30.4102 30.4102c-8.32031 21.0703 -6.4707 71.0605 -6.4707 94.3398c0 23.2803 -1.84961 73.3301 6.43066 94.3301c4.74902 12.0371 18.373 25.6602 30.4102 30.4102c21.0596 8.36035 71.0098 6.42969 94.3096 6.42969
s73.2998 1.86035 94.2998 -6.42969c12.0371 -4.75 25.6602 -18.373 30.4102 -30.4102zM224 110h0.0996094c45.209 0 81.9004 36.6914 81.9004 81.9004v0.0996094c0 45.2637 -36.7363 82 -82 82s-82 -36.7363 -82 -82s36.7363 -82 82 -82zM309.38 258.3
c10.5381 0.00585938 19.1299 8.52246 19.1299 19.0605v0.0800781c0 10.5645 -8.57422 19.1396 -19.1396 19.1396s-19.1396 -8.5752 -19.1396 -19.1396c0 -10.5654 8.57422 -19.1406 19.1396 -19.1406h0.00976562zM400 416c26.4961 0 48 -21.5039 48 -48v-352
c0 -26.4961 -21.5039 -48 -48 -48h-352c-26.4961 0 -48 21.5039 -48 48v352c0 26.4961 21.5039 48 48 48h352zM382.88 126c1.49023 26.4404 1.49023 105.56 0 131.88c-1.21973 25.6299 -7.17969 48.3506 -25.8496 67.0498c-18.6699 18.7002 -41.3701 24.5605 -67 25.8506
c-26.4102 1.48926 -105.59 1.48926 -132 0c-25.5303 -1.2207 -48.2207 -7.12012 -67 -25.7803c-18.7803 -18.6602 -24.5605 -41.3701 -25.8506 -67c-1.48926 -26.3896 -1.48926 -105.58 0 -132c1.2207 -25.5801 7.11035 -48.2998 25.8506 -67
c18.7393 -18.7002 41.3701 -24.5596 67 -25.8496c26.4102 -1.49023 105.59 -1.49023 132 0c25.5996 1.21973 48.29 7.18945 67 25.8496s24.5596 41.3701 25.8496 67z" />
    <glyph glyph-name="mixer" unicode="&#xf956;" horiz-adv-x="512" 
d="M114.57 371.93l128.319 -172.399c1.27148 -1.75781 2.30371 -4.94531 2.30371 -7.11523s-1.03223 -5.35742 -2.30371 -7.11523l-128.89 -173.24c-7.56738 -10.1514 -23.9863 -18.3916 -36.6484 -18.3916c-9.7998 0 -23.6211 5.36816 -30.8516 11.9824
c-17.8496 16.1797 -18.9697 43.5195 -4.74023 62.7695l92.3301 124.15l-91.7803 123c-14.25 19.25 -12.8291 46.5898 4.75 62.7695c7.23145 6.61719 21.0557 11.9873 30.8574 11.9873c12.665 0 29.0859 -8.24219 36.6533 -18.3975zM470.24 68.4199
c14.2295 -19.25 13.1094 -46.5898 -4.73047 -62.7695c-7.23145 -6.61719 -21.0557 -11.9873 -30.8574 -11.9873c-12.6641 0 -29.085 8.24121 -36.6523 18.3965l-128.57 173.5c-1.27148 1.75879 -2.30273 4.94629 -2.30273 7.11523
c0 2.16992 1.03125 5.35742 2.30273 7.11523l128 172.12c7.56738 10.1553 23.9883 18.3975 36.6533 18.3975c9.80176 0 23.626 -5.37109 30.8574 -11.9873c17.5791 -16.1807 18.9697 -43.5205 4.75 -62.7705l-91.7803 -123z" />
    <glyph glyph-name="shopify" unicode="&#xf957;" 
d="M388.32 343.9c0.399414 -2.40039 54.4395 -367.9 54.4395 -367.9l-125.689 -31.2002v432.73c8.00977 -8.01074 29.6201 -28.8301 29.6201 -28.8301s35.2295 -0.799805 37.2295 -0.799805c2.12891 -0.0986328 4.10059 -1.89062 4.40039 -4zM288.65 377.53
c9.20996 2.7998 13.6006 4.22461 14.8096 4.39941s3.17969 0.354492 4.40039 0.400391v-438.33l-302.58 52.4805s36.7998 281.819 38 291.819c1.58984 13.2002 2 13.6006 16 18c0.399414 0.400391 19.6094 6.41016 47.2295 14.8105
c2.82031 21.2197 13.21 48.4395 26.8203 70.0596c19.25 30.8301 43.25 48.0303 67.25 48.8301c12.4199 0.370117 22.8203 -3.62988 30.8203 -12.4004c0.399414 -0.799805 1.19922 -1.19922 1.59961 -2c0.947266 0.226562 2.50586 0.40918 3.47949 0.40918
c0.143555 0 0.376953 -0.00390625 0.520508 -0.00878906c18.4199 0 34 -10.8496 44.4404 -30.8604c2.3877 -4.69727 5.61719 -12.5869 7.20996 -17.6094zM233.41 360.31c0.399414 13.21 -1.2002 32.8301 -8.00977 47.2002
c-6.80078 -3.2002 -12.8105 -8.41016 -17.21 -12.8096c-11.21 -12.3701 -20.8203 -31.1807 -25.6201 -50c17.21 5.20996 34.8398 10.8096 50.8398 15.6094zM200.58 423.56c-36.8301 -0.799805 -69.25 -58.8398 -78.0098 -97.2295c13.1699 4 27.5801 8.40039 42 12.8096
c4.7998 24.4502 16.4102 50.0303 31.6201 66.4502c6 6 12.4092 11.21 18.8096 14.4102c-3.48047 1.97266 -9.55273 3.57324 -13.5537 3.57324c-0.239258 0 -0.626953 -0.00585938 -0.866211 -0.0136719zM154.15 203.39c-0.400391 4.81055 0 23.6104 29.6191 25.6201
c20.4209 1.60059 37.6309 -6.39941 37.6309 -6.39941l15.21 57.5996s-13.2305 6.41016 -39.2305 4.80957c-67.25 -4.40918 -97.6699 -51.2393 -94.4697 -97.6797c3.59961 -55.2402 58.8398 -53.2402 60.8398 -86.8594
c0.410156 -8.01074 -4.80957 -19.6201 -18.8096 -20.4209c-21.6201 -1.59961 -48.4404 18.8203 -48.4404 18.8203l-10.4004 -44s26.8203 -28.8203 75.6504 -25.6201c40.4297 2.41016 68.4502 34.8301 65.6504 82.4707c-4 60.4395 -71.6504 66.0498 -73.25 91.6592z
M249.42 365.12c8.80664 2.7998 16.8135 5.2002 24.0205 7.2002c-4.01074 12.4297 -12.8105 32.8301 -31.2305 36.4297c5.61035 -14.4102 7.20996 -31.6299 7.20996 -43.6299z" />
  </font>
</defs></svg>

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.ttf.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.eot.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.svg.







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
<?xml version="1.0" standalone="no"?>
<!--
Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
-->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata>
Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020
 By Robert Madole
Copyright (c) Font Awesome
</metadata>
<defs>
<font id="FontAwesome5Free-Regular" horiz-adv-x="512" >
  <font-face 
    font-family="Font Awesome 5 Free Regular"
    font-weight="400"
    font-stretch="normal"
    units-per-em="512"
    panose-1="2 0 5 3 0 0 0 0 0 0"
    ascent="448"
    descent="-64"
    bbox="-0.0663408 -64.0662 640.01 448.1"
    underline-thickness="25"
    underline-position="-50"
    unicode-range="U+0020-F5C8"
  />
    <missing-glyph />
    <glyph glyph-name="heart" unicode="&#xf004;" 
d="M458.4 383.7c75.2998 -63.4004 64.0996 -166.601 10.5996 -221.3l-175.4 -178.7c-10 -10.2002 -23.2998 -15.7998 -37.5996 -15.7998c-14.2002 0 -27.5996 5.69922 -37.5996 15.8994l-175.4 178.7c-53.5996 54.7002 -64.5996 157.9 10.5996 221.2
c57.8008 48.7002 147.101 41.2998 202.4 -15c55.2998 56.2998 144.6 63.5996 202.4 15zM434.8 196.2c36.2002 36.8994 43.7998 107.7 -7.2998 150.8c-38.7002 32.5996 -98.7002 27.9004 -136.5 -10.5996l-35 -35.7002l-35 35.7002
c-37.5996 38.2998 -97.5996 43.1992 -136.5 10.5c-51.2002 -43.1006 -43.7998 -113.5 -7.2998 -150.7l175.399 -178.7c2.40039 -2.40039 4.40039 -2.40039 6.80078 0z" />
    <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="576" 
d="M528.1 276.5c26.2002 -3.7998 36.7002 -36.0996 17.7002 -54.5996l-105.7 -103l25 -145.5c4.5 -26.3008 -23.1992 -45.9004 -46.3994 -33.7002l-130.7 68.7002l-130.7 -68.7002c-23.2002 -12.2998 -50.8994 7.39941 -46.3994 33.7002l25 145.5l-105.7 103
c-19 18.5 -8.5 50.7998 17.7002 54.5996l146.1 21.2998l65.2998 132.4c11.7998 23.8994 45.7002 23.5996 57.4004 0l65.2998 -132.4zM388.6 135.7l100.601 98l-139 20.2002l-62.2002 126l-62.2002 -126l-139 -20.2002l100.601 -98l-23.7002 -138.4l124.3 65.2998
l124.3 -65.2998z" />
    <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="448" 
d="M313.6 144c74.2002 0 134.4 -60.2002 134.4 -134.4v-25.5996c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v25.5996c0 74.2002 60.2002 134.4 134.4 134.4c28.7998 0 42.5 -16 89.5996 -16s60.9004 16 89.5996 16zM400 -16v25.5996
c0 47.6006 -38.7998 86.4004 -86.4004 86.4004c-14.6992 0 -37.8994 -16 -89.5996 -16c-51.2998 0 -75 16 -89.5996 16c-47.6006 0 -86.4004 -38.7998 -86.4004 -86.4004v-25.5996h352zM224 160c-79.5 0 -144 64.5 -144 144s64.5 144 144 144s144 -64.5 144 -144
s-64.5 -144 -144 -144zM224 400c-52.9004 0 -96 -43.0996 -96 -96s43.0996 -96 96 -96s96 43.0996 96 96s-43.0996 96 -96 96z" />
    <glyph glyph-name="clock" unicode="&#xf017;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM317.8 96.4004l-84.8994 61.6992
c-3.10059 2.30078 -4.90039 5.90039 -4.90039 9.7002v164.2c0 6.59961 5.40039 12 12 12h32c6.59961 0 12 -5.40039 12 -12v-141.7l66.7998 -48.5996c5.40039 -3.90039 6.5 -11.4004 2.60059 -16.7998l-18.8008 -25.9004c-3.89941 -5.2998 -11.3994 -6.5 -16.7998 -2.59961z
" />
    <glyph glyph-name="list-alt" unicode="&#xf022;" 
d="M464 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h416zM458 16c3.31152 0 6 2.68848 6 6v340c0 3.31152 -2.68848 6 -6 6h-404c-3.31152 0 -6 -2.68848 -6 -6v-340
c0 -3.31152 2.68848 -6 6 -6h404zM416 108v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM416 204v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12
v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM416 300v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM164 288c0 -19.8818 -16.1182 -36 -36 -36
s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36zM164 192c0 -19.8818 -16.1182 -36 -36 -36s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36zM164 96c0 -19.8818 -16.1182 -36 -36 -36s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36z" />
    <glyph glyph-name="flag" unicode="&#xf024;" 
d="M336.174 368c35.4668 0 73.0195 12.6914 108.922 28.1797c31.6406 13.6514 66.9043 -9.65723 66.9043 -44.1162v-239.919c0 -16.1953 -8.1543 -31.3057 -21.7129 -40.1631c-26.5762 -17.3643 -70.0693 -39.9814 -128.548 -39.9814c-68.6084 0 -112.781 32 -161.913 32
c-56.5674 0 -89.957 -11.2803 -127.826 -28.5566v-83.4434c0 -8.83691 -7.16309 -16 -16 -16h-16c-8.83691 0 -16 7.16309 -16 16v406.438c-14.3428 8.2998 -24 23.7979 -24 41.5615c0 27.5693 23.2422 49.71 51.2012 47.8965
c22.9658 -1.49023 41.8662 -19.4717 44.4805 -42.3379c0.177734 -1.52441 0.321289 -4.00781 0.321289 -5.54199c0 -4.30176 -1.10352 -11.1035 -2.46289 -15.1846c22.418 8.68555 49.4199 15.168 80.7207 15.168c68.6084 0 112.781 -32 161.913 -32zM464 112v240
c-31.5059 -14.6338 -84.5547 -32 -127.826 -32c-59.9111 0 -101.968 32 -161.913 32c-41.4365 0 -80.4766 -16.5879 -102.261 -32v-232c31.4473 14.5967 84.4648 24 127.826 24c59.9111 0 101.968 -32 161.913 -32c41.4365 0 80.4775 16.5879 102.261 32z" />
    <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="384" 
d="M336 448c26.5098 0 48 -21.4902 48 -48v-464l-192 112l-192 -112v464c0 26.5098 21.4902 48 48 48h288zM336 19.5703v374.434c0 3.31348 -2.68555 5.99609 -6 5.99609h-276c-3.31152 0 -6 -2.68848 -6 -6v-374.43l144 84z" />
    <glyph glyph-name="image" unicode="&#xf03e;" 
d="M464 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h416zM458 48c3.31152 0 6 2.68848 6 6v276c0 3.31152 -2.68848 6 -6 6h-404c-3.31152 0 -6 -2.68848 -6 -6v-276
c0 -3.31152 2.68848 -6 6 -6h404zM128 296c22.0908 0 40 -17.9092 40 -40s-17.9092 -40 -40 -40s-40 17.9092 -40 40s17.9092 40 40 40zM96 96v48l39.5137 39.5146c4.6875 4.68652 12.2852 4.68652 16.9717 0l39.5146 -39.5146l119.514 119.515
c4.6875 4.68652 12.2852 4.68652 16.9717 0l87.5146 -87.5146v-80h-320z" />
    <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="576" 
d="M402.3 103.1l32 32c5 5 13.7002 1.5 13.7002 -5.69922v-145.4c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h273.5c7.09961 0 10.7002 -8.59961 5.7002 -13.7002l-32 -32c-1.5 -1.5 -3.5 -2.2998 -5.7002 -2.2998h-241.5v-352h352
v113.5c0 2.09961 0.799805 4.09961 2.2998 5.59961zM558.9 304.9l-262.601 -262.601l-90.3994 -10c-26.2002 -2.89941 -48.5 19.2002 -45.6006 45.6006l10 90.3994l262.601 262.601c22.8994 22.8994 59.8994 22.8994 82.6992 0l43.2002 -43.2002
c22.9004 -22.9004 22.9004 -60 0.100586 -82.7998zM460.1 274l-58.0996 58.0996l-185.8 -185.899l-7.2998 -65.2998l65.2998 7.2998zM524.9 353.7l-43.2002 43.2002c-4.10059 4.09961 -10.7998 4.09961 -14.7998 0l-30.9004 -30.9004l58.0996 -58.0996l30.9004 30.8994
c4 4.2002 4 10.7998 -0.0996094 14.9004z" />
    <glyph glyph-name="times-circle" unicode="&#xf057;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM357.8 254.2l-62.2002 -62.2002l62.2002 -62.2002
c4.7002 -4.7002 4.7002 -12.2998 0 -17l-22.5996 -22.5996c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-62.2002 62.2002l-62.2002 -62.2002c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-22.5996 22.5996c-4.7002 4.7002 -4.7002 12.2998 0 17l62.2002 62.2002l-62.2002 62.2002
c-4.7002 4.7002 -4.7002 12.2998 0 17l22.5996 22.5996c4.7002 4.7002 12.2998 4.7002 17 0l62.2002 -62.2002l62.2002 62.2002c4.7002 4.7002 12.2998 4.7002 17 0l22.5996 -22.5996c4.7002 -4.7002 4.7002 -12.2998 0 -17z" />
    <glyph glyph-name="check-circle" unicode="&#xf058;" 
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 392c-110.549 0 -200 -89.4678 -200 -200c0 -110.549 89.4678 -200 200 -200c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200z
M396.204 261.733c4.66699 -4.70508 4.63672 -12.3037 -0.0673828 -16.9717l-172.589 -171.204c-4.70508 -4.66797 -12.3027 -4.63672 -16.9697 0.0683594l-90.7812 91.5156c-4.66797 4.70605 -4.63672 12.3047 0.0683594 16.9717l22.7188 22.5361
c4.70508 4.66699 12.3027 4.63574 16.9697 -0.0693359l59.792 -60.2773l141.353 140.216c4.70508 4.66797 12.3027 4.6377 16.9697 -0.0673828z" />
    <glyph glyph-name="question-circle" unicode="&#xf059;" 
d="M256 440c136.957 0 248 -111.083 248 -248c0 -136.997 -111.043 -248 -248 -248s-248 111.003 -248 248c0 136.917 111.043 248 248 248zM256 -8c110.569 0 200 89.4697 200 200c0 110.529 -89.5088 200 -200 200c-110.528 0 -200 -89.5049 -200 -200
c0 -110.569 89.4678 -200 200 -200zM363.244 247.2c0 -67.0518 -72.4209 -68.084 -72.4209 -92.8633v-6.33691c0 -6.62695 -5.37305 -12 -12 -12h-45.6475c-6.62695 0 -12 5.37305 -12 12v8.65918c0 35.7451 27.1006 50.0342 47.5791 61.5156
c17.5615 9.84473 28.3242 16.541 28.3242 29.5791c0 17.2461 -21.999 28.6934 -39.7842 28.6934c-23.1885 0 -33.8936 -10.9775 -48.9424 -29.9697c-4.05664 -5.11914 -11.46 -6.07031 -16.666 -2.12402l-27.8232 21.0986
c-5.10742 3.87207 -6.25098 11.0654 -2.64453 16.3633c23.627 34.6934 53.7217 54.1846 100.575 54.1846c49.0713 0 101.45 -38.3037 101.45 -88.7998zM298 80c0 -23.1592 -18.8408 -42 -42 -42s-42 18.8408 -42 42s18.8408 42 42 42s42 -18.8408 42 -42z" />
    <glyph glyph-name="eye" unicode="&#xf06e;" horiz-adv-x="576" 
d="M288 304c0.0927734 0 0.244141 0.000976562 0.336914 0.000976562c61.6641 0 111.71 -50.0469 111.71 -111.711c0 -61.6631 -50.0459 -111.71 -111.71 -111.71s-111.71 50.0469 -111.71 111.71c0 8.71289 1.95898 22.5781 4.37305 30.9502
c6.93066 -3.94141 19.0273 -7.18457 27 -7.24023c30.9121 0 56 25.0879 56 56c-0.0556641 7.97266 -3.29883 20.0693 -7.24023 27c8.42383 2.62207 22.4189 4.8623 31.2402 5zM572.52 206.6c1.9209 -3.79883 3.47949 -10.3379 3.47949 -14.5947
s-1.55859 -10.7959 -3.47949 -14.5947c-54.1992 -105.771 -161.59 -177.41 -284.52 -177.41s-230.29 71.5898 -284.52 177.4c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947c54.1992 105.771 161.59 177.41 284.52 177.41
s230.29 -71.5898 284.52 -177.4zM288 48c98.6602 0 189.1 55 237.93 144c-48.8398 89 -139.27 144 -237.93 144s-189.09 -55 -237.93 -144c48.8398 -89 139.279 -144 237.93 -144z" />
    <glyph glyph-name="eye-slash" unicode="&#xf070;" horiz-adv-x="640" 
d="M634 -23c3.31738 -2.65137 6.00977 -8.25098 6.00977 -12.498c0 -3.10449 -1.57715 -7.58984 -3.51953 -10.0117l-10 -12.4902c-2.65234 -3.31152 -8.24707 -6 -12.4902 -6c-3.09961 0 -7.58008 1.57227 -10 3.50977l-598 467.49
c-3.31738 2.65137 -6.00977 8.25098 -6.00977 12.498c0 3.10449 1.57715 7.58984 3.51953 10.0117l10 12.4902c2.65234 3.31152 8.24707 6 12.4902 6c3.09961 0 7.58008 -1.57227 10 -3.50977zM296.79 301.53c6.33496 1.35059 16.7324 2.45801 23.21 2.46973
c60.4805 0 109.36 -47.9102 111.58 -107.85zM343.21 82.46c-6.33496 -1.34375 -16.7334 -2.44629 -23.21 -2.45996c-60.4697 0 -109.35 47.9102 -111.58 107.84zM320 336c-19.8799 0 -39.2803 -2.7998 -58.2197 -7.09961l-46.4102 36.29
c32.9199 11.8096 67.9297 18.8096 104.63 18.8096c122.93 0 230.29 -71.5898 284.57 -177.4c1.91992 -3.79883 3.47949 -10.3379 3.47949 -14.5947s-1.55957 -10.7959 -3.47949 -14.5947c-11.7197 -22.7598 -35.4189 -56.4092 -52.9004 -75.1104l-37.7402 29.5
c14.333 15.0156 34.0449 41.9854 44 60.2002c-48.8398 89 -139.279 144 -237.93 144zM320 48c19.8896 0 39.2803 2.7998 58.2197 7.08984l46.4102 -36.2803c-32.9199 -11.7598 -67.9297 -18.8096 -104.63 -18.8096c-122.92 0 -230.28 71.5898 -284.51 177.4
c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947c11.7168 22.7568 35.4111 56.4014 52.8896 75.1006l37.7402 -29.5c-14.3467 -15.0107 -34.0811 -41.9756 -44.0498 -60.1904c48.8496 -89 139.279 -144 237.93 -144z" />
    <glyph glyph-name="calendar-alt" unicode="&#xf073;" horiz-adv-x="448" 
d="M148 160h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM256 172c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40
c6.59961 0 12 -5.40039 12 -12v-40zM352 172c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM256 76c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40
c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM160 76c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM352 76c0 -6.59961 -5.40039 -12 -12 -12h-40
c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40
c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="comment" unicode="&#xf075;" 
d="M256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-32.7998 0 -64 5.2002 -92.9004 14.2998c-29.0996 -20.5996 -77.5996 -46.2998 -139.1 -46.2998c-9.59961 0 -18.2998 5.7002 -22.0996 14.5c-3.80078 8.7998 -2 19 4.59961 26
c0.5 0.400391 31.5 33.7998 46.4004 73.2002c-33 35.0996 -52.9004 78.7002 -52.9004 126.3c0 114.9 114.6 208 256 208zM256 48c114.7 0 208 71.7998 208 160s-93.2998 160 -208 160s-208 -71.7998 -208 -160c0 -42.2002 21.7002 -74.0996 39.7998 -93.4004
l20.6006 -21.7998l-10.6006 -28.0996c-5.5 -14.5 -12.5996 -28.1006 -19.8994 -40.2002c23.5996 7.59961 43.1992 18.9004 57.5 29l19.5 13.7998l22.6992 -7.2002c25.3008 -8 51.7002 -12.0996 78.4004 -12.0996z" />
    <glyph glyph-name="folder" unicode="&#xf07b;" 
d="M464 320c26.5098 0 48 -21.4902 48 -48v-224c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h146.74c8.49023 0 16.6299 -3.37012 22.6299 -9.37012l54.6299 -54.6299h192zM464 48v224h-198.62
c-8.49023 0 -16.6299 3.37012 -22.6299 9.37012l-54.6299 54.6299h-140.12v-288h416z" />
    <glyph glyph-name="folder-open" unicode="&#xf07c;" horiz-adv-x="576" 
d="M527.9 224c37.6992 0 60.6992 -41.5 40.6992 -73.4004l-79.8994 -128c-8.7998 -14.0996 -24.2002 -22.5996 -40.7002 -22.5996h-400c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h160l64 -64h160c26.5 0 48 -21.5 48 -48v-48h47.9004zM48 330v-233.4l62.9004 104.2
c8.69922 14.4004 24.2998 23.2002 41.0996 23.2002h280v42c0 3.2998 -2.7002 6 -6 6h-173.9l-64 64h-134.1c-3.2998 0 -6 -2.7002 -6 -6zM448 48l80 128h-378.8l-77.2002 -128h376z" />
    <glyph glyph-name="chart-bar" unicode="&#xf080;" 
d="M396.8 96c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v230.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-230.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM204.8 96
c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v198.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-198.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM300.8 96
c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v134.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-134.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM496 48c8.83984 0 16 -7.16016 16 -16v-16
c0 -8.83984 -7.16016 -16 -16 -16h-464c-17.6699 0 -32 14.3301 -32 32v336c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-320h448zM108.8 96c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v70.4004c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004
c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-70.4004c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004z" />
    <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="576" 
d="M532 61.7998c15.2998 -30.7002 37.4004 -54.5 37.7998 -54.7998c6.2998 -6.7002 8 -16.5 4.40039 -25c-3.7002 -8.5 -12 -14 -21.2002 -14c-53.5996 0 -96.7002 20.2998 -125.2 38.7998c-19 -4.39941 -39 -6.7998 -59.7998 -6.7998
c-86.2002 0 -159.9 40.4004 -191.3 97.7998c-9.7002 1.2002 -19.2002 2.7998 -28.4004 4.90039c-28.5 -18.6006 -71.7002 -38.7998 -125.2 -38.7998c-9.19922 0 -17.5996 5.5 -21.1992 14c-3.7002 8.5 -1.90039 18.2998 4.39941 25
c0.400391 0.399414 22.4004 24.1992 37.7002 54.8994c-27.5 27.2002 -44 61.2002 -44 98.2002c0 88.4004 93.0996 160 208 160c86.2998 0 160.3 -40.5 191.8 -98.0996c99.7002 -11.8008 176.2 -77.9004 176.2 -157.9c0 -37.0996 -16.5 -71.0996 -44 -98.2002zM139.2 154.1
l19.7998 -4.5c16 -3.69922 32.5 -5.59961 49 -5.59961c86.7002 0 160 51.2998 160 112s-73.2998 112 -160 112s-160 -51.2998 -160 -112c0 -28.7002 16.2002 -50.5996 29.7002 -64l24.7998 -24.5l-15.5 -31.0996c-2.59961 -5.10059 -5.2998 -10.1006 -8 -14.8008
c14.5996 5.10059 29 12.3008 43.0996 21.4004zM498.3 96c13.5 13.4004 29.7002 35.2998 29.7002 64c0 49.2002 -48.2998 91.5 -112.7 106c0.299805 -3.2998 0.700195 -6.59961 0.700195 -10c0 -80.9004 -78 -147.5 -179.3 -158.3
c29.0996 -29.6006 77.2998 -49.7002 131.3 -49.7002c16.5 0 33 1.90039 49 5.59961l19.9004 4.60059l17.0996 -11.1006c14.0996 -9.09961 28.5 -16.2998 43.0996 -21.3994c-2.69922 4.7002 -5.39941 9.7002 -8 14.7998l-15.5 31.0996z" />
    <glyph glyph-name="star-half" unicode="&#xf089;" horiz-adv-x="576" 
d="M288 62.7002v-54.2998l-130.7 -68.6006c-23.3994 -12.2998 -50.8994 7.60059 -46.3994 33.7002l25 145.5l-105.7 103c-19 18.5 -8.5 50.7998 17.7002 54.5996l146.1 21.2002l65.2998 132.4c5.90039 11.8994 17.2998 17.7998 28.7002 17.7998v-68.0996l-62.2002 -126
l-139 -20.2002l100.601 -98l-23.7002 -138.4z" />
    <glyph glyph-name="lemon" unicode="&#xf094;" 
d="M484.112 420.111c28.1221 -28.123 35.9434 -68.0039 19.0215 -97.0547c-23.0576 -39.584 50.1436 -163.384 -82.3311 -295.86c-132.301 -132.298 -256.435 -59.3594 -295.857 -82.3291c-29.0459 -16.917 -68.9219 -9.11426 -97.0576 19.0205
c-28.1221 28.1221 -35.9434 68.0029 -19.0215 97.0547c23.0566 39.5859 -50.1436 163.386 82.3301 295.86c132.308 132.309 256.407 59.3496 295.862 82.332c29.0498 16.9219 68.9307 9.09863 97.0537 -19.0234zM461.707 347.217
c13.5166 23.2031 -27.7578 63.7314 -50.4883 50.4912c-66.6025 -38.7939 -165.646 45.5898 -286.081 -74.8457c-120.444 -120.445 -36.0449 -219.472 -74.8447 -286.08c-13.542 -23.2471 27.8145 -63.6953 50.4932 -50.4883
c66.6006 38.7949 165.636 -45.5996 286.076 74.8428c120.444 120.445 36.0449 219.472 74.8447 286.08zM291.846 338.481c1.37012 -10.96 -6.40332 -20.957 -17.3643 -22.3271c-54.8467 -6.85547 -135.779 -87.7871 -142.636 -142.636
c-1.37305 -10.9883 -11.3984 -18.7334 -22.3262 -17.3643c-10.9609 1.37012 -18.7344 11.3652 -17.3643 22.3262c9.16211 73.2852 104.167 168.215 177.364 177.364c10.9531 1.36816 20.9561 -6.40234 22.3262 -17.3633z" />
    <glyph glyph-name="credit-card" unicode="&#xf09d;" horiz-adv-x="576" 
d="M527.9 416c26.5996 0 48.0996 -21.5 48.0996 -48v-352c0 -26.5 -21.5 -48 -48.0996 -48h-479.801c-26.5996 0 -48.0996 21.5 -48.0996 48v352c0 26.5 21.5 48 48.0996 48h479.801zM54.0996 368c-3.2998 0 -6 -2.7002 -6 -6v-42h479.801v42c0 3.2998 -2.7002 6 -6 6
h-467.801zM521.9 16c3.2998 0 6 2.7002 6 6v170h-479.801v-170c0 -3.2998 2.7002 -6 6 -6h467.801zM192 116v-40c0 -6.59961 -5.40039 -12 -12 -12h-72c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h72c6.59961 0 12 -5.40039 12 -12zM384 116v-40
c0 -6.59961 -5.40039 -12 -12 -12h-136c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h136c6.59961 0 12 -5.40039 12 -12z" />
    <glyph glyph-name="hdd" unicode="&#xf0a0;" horiz-adv-x="576" 
d="M567.403 212.358c5.59668 -8.04688 8.59668 -17.6113 8.59668 -27.4121v-136.946c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v136.946c0 8.30957 3.85156 20.5898 8.59668 27.4121l105.08 151.053
c7.90625 11.3652 25.5596 20.5889 39.4033 20.5889h0.000976562h269.838h0.000976562c13.8438 0 31.4971 -9.22363 39.4033 -20.5889zM153.081 336l-77.9131 -112h425.664l-77.9131 112h-269.838zM528 48v128h-480v-128h480zM496 112c0 -17.6729 -14.3271 -32 -32 -32
s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32zM400 112c0 -17.6729 -14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32z" />
    <glyph glyph-name="hand-point-right" unicode="&#xf0a4;" 
d="M428.8 310.4c45.0996 0 83.2002 -38.1016 83.2002 -83.2002c0 -45.6162 -37.7646 -83.2002 -83.2002 -83.2002h-35.6475c-1.41602 -6.36719 -4.96875 -16.252 -7.92969 -22.0645c2.50586 -22.0059 -3.50293 -44.9775 -15.9844 -62.791
c-1.14062 -52.4863 -37.3984 -91.1445 -99.9404 -91.1445h-21.2988c-60.0635 0 -98.5117 40 -127.2 40h-2.67871c-5.74707 -4.95215 -13.5361 -8 -22.1201 -8h-64c-17.6729 0 -32 12.8936 -32 28.7998v230.4c0 15.9062 14.3271 28.7998 32 28.7998h64.001
c8.58398 0 16.373 -3.04785 22.1201 -8h2.67871c6.96387 0 14.8623 6.19336 30.1816 23.6689l0.128906 0.148438l0.130859 0.145508c8.85645 9.93652 18.1162 20.8398 25.8506 33.2529c18.7051 30.2471 30.3936 78.7842 75.707 78.7842c56.9277 0 92 -35.2861 92 -83.2002
v-0.0839844c0 -6.21777 -0.974609 -16.2148 -2.17578 -22.3154h86.1768zM428.8 192c18.9756 0 35.2002 16.2246 35.2002 35.2002c0 18.7002 -16.7754 35.2002 -35.2002 35.2002h-158.399c0 17.3242 26.3994 35.1992 26.3994 70.3994c0 26.4004 -20.625 35.2002 -44 35.2002
c-8.79395 0 -20.4443 -32.7119 -34.9258 -56.0996c-9.07422 -14.5752 -19.5244 -27.2256 -30.7988 -39.875c-16.1094 -18.374 -33.8359 -36.6328 -59.0752 -39.5967v-176.753c42.79 -3.7627 74.5088 -39.6758 120 -39.6758h21.2988
c40.5244 0 57.124 22.1973 50.6006 61.3252c14.6113 8.00098 24.1514 33.9785 12.9248 53.625c19.3652 18.2246 17.7871 46.3809 4.9502 61.0498h91.0254zM88 64c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24z" />
    <glyph glyph-name="hand-point-left" unicode="&#xf0a5;" 
d="M0 227.2c0 45.0986 38.1006 83.2002 83.2002 83.2002h86.1758c-1.3623 6.91016 -2.17578 14.374 -2.17578 22.3994c0 47.9141 35.0723 83.2002 92 83.2002c45.3135 0 57.002 -48.5371 75.7061 -78.7852c7.73438 -12.4121 16.9951 -23.3154 25.8506 -33.2529
l0.130859 -0.145508l0.128906 -0.148438c15.3213 -17.4746 23.2197 -23.668 30.1836 -23.668h2.67871c5.74707 4.95215 13.5361 8 22.1201 8h64c17.6729 0 32 -12.8936 32 -28.7998v-230.4c0 -15.9062 -14.3271 -28.7998 -32 -28.7998h-64
c-8.58398 0 -16.373 3.04785 -22.1201 8h-2.67871c-28.6885 0 -67.1367 -40 -127.2 -40h-21.2988c-62.542 0 -98.8008 38.6582 -99.9404 91.1445c-12.4814 17.8135 -18.4922 40.7852 -15.9844 62.791c-2.96094 5.8125 -6.51367 15.6973 -7.92969 22.0645h-35.6465
c-45.4355 0 -83.2002 37.584 -83.2002 83.2002zM48 227.2c0 -18.9756 16.2246 -35.2002 35.2002 -35.2002h91.0244c-12.8369 -14.6689 -14.415 -42.8252 4.9502 -61.0498c-11.2256 -19.6465 -1.68652 -45.624 12.9248 -53.625
c-6.52246 -39.1279 10.0771 -61.3252 50.6016 -61.3252h21.2988c45.4912 0 77.21 35.9131 120 39.6768v176.752c-25.2393 2.96289 -42.9658 21.2227 -59.0752 39.5967c-11.2744 12.6494 -21.7246 25.2998 -30.7988 39.875
c-14.4814 23.3877 -26.1318 56.0996 -34.9258 56.0996c-23.375 0 -44 -8.7998 -44 -35.2002c0 -35.2002 26.3994 -53.0752 26.3994 -70.3994h-158.399c-18.4248 0 -35.2002 -16.5 -35.2002 -35.2002zM448 88c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24
s24 10.7451 24 24s-10.7451 24 -24 24z" />
    <glyph glyph-name="hand-point-up" unicode="&#xf0a6;" horiz-adv-x="448" 
d="M105.6 364.8c0 45.0996 38.1016 83.2002 83.2002 83.2002c45.6162 0 83.2002 -37.7646 83.2002 -83.2002v-35.6465c6.36719 -1.41602 16.252 -4.96875 22.0645 -7.92969c22.0059 2.50684 44.9775 -3.50293 62.791 -15.9844
c52.4863 -1.14062 91.1445 -37.3984 91.1445 -99.9404v-21.2988c0 -60.0635 -40 -98.5117 -40 -127.2v-2.67871c4.95215 -5.74707 8 -13.5361 8 -22.1201v-64c0 -17.6729 -12.8936 -32 -28.7998 -32h-230.4c-15.9062 0 -28.7998 14.3271 -28.7998 32v64
c0 8.58398 3.04785 16.373 8 22.1201v2.67871c0 6.96387 -6.19336 14.8623 -23.6689 30.1816l-0.148438 0.128906l-0.145508 0.130859c-9.93652 8.85645 -20.8398 18.1162 -33.2529 25.8506c-30.2471 18.7051 -78.7842 30.3936 -78.7842 75.707
c0 56.9277 35.2861 92 83.2002 92h0.0839844c6.21777 0 16.2148 -0.974609 22.3154 -2.17578v86.1768zM224 364.8c0 18.9756 -16.2246 35.2002 -35.2002 35.2002c-18.7002 0 -35.2002 -16.7754 -35.2002 -35.2002v-158.399c-17.3242 0 -35.1992 26.3994 -70.3994 26.3994
c-26.4004 0 -35.2002 -20.625 -35.2002 -44c0 -8.79395 32.7119 -20.4443 56.0996 -34.9258c14.5752 -9.07422 27.2256 -19.5244 39.875 -30.7988c18.374 -16.1094 36.6328 -33.8359 39.5967 -59.0752h176.753c3.7627 42.79 39.6758 74.5088 39.6758 120v21.2988
c0 40.5244 -22.1973 57.124 -61.3252 50.6006c-8.00098 14.6113 -33.9785 24.1514 -53.625 12.9248c-18.2246 19.3652 -46.3809 17.7871 -61.0498 4.9502v91.0254zM352 24c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24z" />
    <glyph glyph-name="hand-point-down" unicode="&#xf0a7;" horiz-adv-x="448" 
d="M188.8 -64c-45.0986 0 -83.2002 38.1006 -83.2002 83.2002v86.1758c-6.91016 -1.3623 -14.374 -2.17578 -22.3994 -2.17578c-47.9141 0 -83.2002 35.0723 -83.2002 92c0 45.3135 48.5371 57.002 78.7852 75.707c12.4121 7.73438 23.3154 16.9951 33.2529 25.8506
l0.145508 0.130859l0.148438 0.128906c17.4746 15.3213 23.668 23.2197 23.668 30.1836v2.67871c-4.95215 5.74707 -8 13.5361 -8 22.1201v64c0 17.6729 12.8936 32 28.7998 32h230.4c15.9062 0 28.7998 -14.3271 28.7998 -32v-64.001
c0 -8.58398 -3.04785 -16.373 -8 -22.1201v-2.67871c0 -28.6885 40 -67.1367 40 -127.2v-21.2988c0 -62.542 -38.6582 -98.8008 -91.1445 -99.9404c-17.8135 -12.4814 -40.7852 -18.4922 -62.791 -15.9844c-5.8125 -2.96094 -15.6973 -6.51367 -22.0645 -7.92969v-35.6465
c0 -45.4355 -37.584 -83.2002 -83.2002 -83.2002zM188.8 -16c18.9756 0 35.2002 16.2246 35.2002 35.2002v91.0244c14.6689 -12.8369 42.8252 -14.415 61.0498 4.9502c19.6465 -11.2256 45.624 -1.68652 53.625 12.9248c39.1279 -6.52246 61.3252 10.0771 61.3252 50.6016
v21.2988c0 45.4912 -35.9131 77.21 -39.6768 120h-176.752c-2.96289 -25.2393 -21.2227 -42.9658 -39.5967 -59.0752c-12.6494 -11.2744 -25.2998 -21.7246 -39.875 -30.7988c-23.3877 -14.4814 -56.0996 -26.1318 -56.0996 -34.9258c0 -23.375 8.7998 -44 35.2002 -44
c35.2002 0 53.0752 26.3994 70.3994 26.3994v-158.399c0 -18.4248 16.5 -35.2002 35.2002 -35.2002zM328 384c0 -13.2549 10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24z" />
    <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="448" 
d="M433.941 382.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-80v-48c0 -26.5098 -21.4902 -48 -48 -48h-224c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h80v48c0 26.5098 21.4902 48 48 48
h172.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM266 -16c3.31152 0 6 2.68848 6 6v42h-96c-26.5098 0 -48 21.4902 -48 48v224h-74c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM394 80c3.31152 0 6 2.68848 6 6v202h-88
c-13.2549 0 -24 10.7451 -24 24v88h-106c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM400 336v9.63184v0.000976562c0 1.37207 -0.787109 3.27246 -1.75684 4.24219l-48.3682 48.3682c-1.12598 1.125 -2.65234 1.75684 -4.24316 1.75684h-9.63184
v-64h64z" />
    <glyph glyph-name="save" unicode="&#xf0c7;" horiz-adv-x="448" 
d="M433.941 318.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h268.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM272 368h-128v-80h128v80
zM394 16c3.31152 0 6 2.68848 6 6v259.632v0.000976562c0 1.37207 -0.787109 3.27246 -1.75684 4.24219l-78.2432 78.2432v-100.118c0 -13.2549 -10.7451 -24 -24 -24h-176c-13.2549 0 -24 10.7451 -24 24v104h-42c-3.31152 0 -6 -2.68848 -6 -6v-340
c0 -3.31152 2.68848 -6 6 -6h340zM224 216c48.5234 0 88 -39.4766 88 -88s-39.4766 -88 -88 -88s-88 39.4766 -88 88s39.4766 88 88 88zM224 88c22.0557 0 40 17.9443 40 40s-17.9443 40 -40 40s-40 -17.9443 -40 -40s17.9443 -40 40 -40z" />
    <glyph glyph-name="square" unicode="&#xf0c8;" horiz-adv-x="448" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM394 16c3.2998 0 6 2.7002 6 6v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340z" />
    <glyph glyph-name="envelope" unicode="&#xf0e0;" 
d="M464 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h416zM464 336h-416v-40.8047c22.4248 -18.2627 58.1797 -46.6602 134.587 -106.49
c16.834 -13.2422 50.2051 -45.0762 73.4131 -44.7012c23.2119 -0.371094 56.5723 31.4541 73.4131 44.7012c76.4189 59.8389 112.165 88.2305 134.587 106.49v40.8047zM48 48h416v185.601c-22.915 -18.252 -55.4189 -43.8691 -104.947 -82.6523
c-22.5439 -17.748 -60.3359 -55.1787 -103.053 -54.9473c-42.9277 -0.231445 -81.2051 37.75 -103.062 54.9551c-49.5293 38.7842 -82.0244 64.3945 -104.938 82.6455v-185.602z" />
    <glyph glyph-name="lightbulb" unicode="&#xf0eb;" horiz-adv-x="352" 
d="M176 368c8.83984 0 16 -7.16016 16 -16s-7.16016 -16 -16 -16c-35.2803 0 -64 -28.7002 -64 -64c0 -8.83984 -7.16016 -16 -16 -16s-16 7.16016 -16 16c0 52.9404 43.0596 96 96 96zM96.0596 -11.1699l-0.0400391 43.1797h159.961l-0.0507812 -43.1797
c-0.00976562 -3.13965 -0.939453 -6.21973 -2.67969 -8.83984l-24.5098 -36.8398c-2.95996 -4.45996 -7.95996 -7.14062 -13.3203 -7.14062h-78.8496c-5.35059 0 -10.3506 2.68066 -13.3203 7.14062l-24.5098 36.8398c-1.75 2.62012 -2.68066 5.68945 -2.68066 8.83984z
M176 448c97.2002 0 176 -78.7998 176 -176c0 -44.3701 -16.4502 -84.8496 -43.5498 -115.79c-16.6406 -18.9795 -42.7402 -58.79 -52.4199 -92.1602v-0.0498047h-48v0.0996094c0.00390625 4.04199 0.999023 10.4482 2.21973 14.3008
c5.67969 17.9893 22.9902 64.8496 62.0996 109.46c20.4102 23.29 31.6504 53.1699 31.6504 84.1396c0 70.5801 -57.4199 128 -128 128c-68.2803 0 -128.15 -54.3604 -127.95 -128c0.0898438 -30.9902 11.0703 -60.71 31.6104 -84.1396
c39.3496 -44.9004 56.5801 -91.8604 62.1699 -109.67c1.42969 -4.56055 2.13965 -9.30078 2.15039 -14.0703v-0.120117h-48v0.0595703c-9.68066 33.3604 -35.7803 73.1709 -52.4209 92.1602c-27.1094 30.9307 -43.5596 71.4102 -43.5596 115.78
c0 93.0303 73.7197 176 176 176z" />
    <glyph glyph-name="bell" unicode="&#xf0f3;" horiz-adv-x="448" 
d="M439.39 85.71c6 -6.44043 8.66016 -14.1602 8.61035 -21.71c-0.0996094 -16.4004 -12.9805 -32 -32.0996 -32h-383.801c-19.1191 0 -31.9893 15.5996 -32.0996 32c-0.0498047 7.5498 2.61035 15.2598 8.61035 21.71c19.3193 20.7598 55.4697 51.9902 55.4697 154.29
c0 77.7002 54.4795 139.9 127.939 155.16v20.8398c0 17.6699 14.3203 32 31.9805 32s31.9805 -14.3301 31.9805 -32v-20.8398c73.46 -15.2598 127.939 -77.46 127.939 -155.16c0 -102.3 36.1504 -133.53 55.4697 -154.29zM67.5303 80h312.939
c-21.2197 27.96 -44.4199 74.3203 -44.5293 159.42c0 0.200195 0.0595703 0.379883 0.0595703 0.580078c0 61.8604 -50.1396 112 -112 112s-112 -50.1396 -112 -112c0 -0.200195 0.0595703 -0.379883 0.0595703 -0.580078
c-0.109375 -85.0898 -23.3096 -131.45 -44.5293 -159.42zM224 -64c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64z" />
    <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="448" 
d="M128 204v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12zM268 192c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40
c0 -6.62695 -5.37305 -12 -12 -12h-40zM192 108c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM268 96c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40
c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-40zM448 -28v-36h-448v36c0 6.62695 5.37305 12 12 12h19.5v378.965c0 11.6172 10.7451 21.0352 24 21.0352h88.5v40c0 13.2549 10.7451 24 24 24h112c13.2549 0 24 -10.7451 24 -24v-40h88.5
c13.2549 0 24 -9.41797 24 -21.0352v-378.965h19.5c6.62695 0 12 -5.37305 12 -12zM79.5 -15h112.5v67c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-67h112.5v351h-64.5v-24c0 -13.2549 -10.7451 -24 -24 -24h-112c-13.2549 0 -24 10.7451 -24 24v24
h-64.5v-351zM266 384h-26v26c0 3.31152 -2.68848 6 -6 6h-20c-3.31152 0 -6 -2.68848 -6 -6v-26h-26c-3.31152 0 -6 -2.68848 -6 -6v-20c0 -3.31152 2.68848 -6 6 -6h26v-26c0 -3.31152 2.68848 -6 6 -6h20c3.31152 0 6 2.68848 6 6v26h26c3.31152 0 6 2.68848 6 6v20
c0 3.31152 -2.68848 6 -6 6z" />
    <glyph glyph-name="plus-square" unicode="&#xf0fe;" horiz-adv-x="448" 
d="M352 208v-32c0 -6.59961 -5.40039 -12 -12 -12h-88v-88c0 -6.59961 -5.40039 -12 -12 -12h-32c-6.59961 0 -12 5.40039 -12 12v88h-88c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h88v88c0 6.59961 5.40039 12 12 12h32c6.59961 0 12 -5.40039 12 -12
v-88h88c6.59961 0 12 -5.40039 12 -12zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340
c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="circle" unicode="&#xf111;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200z" />
    <glyph glyph-name="smile" unicode="&#xf118;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM332 135.4c8.5 10.1992 23.7002 11.5 33.7998 3.09961c10.2002 -8.5 11.6006 -23.5996 3.10059 -33.7998
c-30 -36 -74.1006 -56.6006 -120.9 -56.6006s-90.9004 20.6006 -120.9 56.6006c-8.39941 10.2002 -7.09961 25.2998 3.10059 33.7998c10.0996 8.40039 25.2998 7.09961 33.7998 -3.09961c20.7998 -25.1006 51.5 -39.4004 84 -39.4004s63.2002 14.4004 84 39.4004z" />
    <glyph glyph-name="frown" unicode="&#xf119;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM248 144c40.2002 0 78 -17.7002 103.8 -48.5996c8.40039 -10.2002 7.10059 -25.3008 -3.09961 -33.8008
c-10.7002 -8.7998 -25.7002 -6.59961 -33.7998 3.10059c-16.6006 20 -41 31.3994 -66.9004 31.3994s-50.2998 -11.5 -66.9004 -31.3994c-8.5 -10.2002 -23.5996 -11.5 -33.7998 -3.10059c-10.2002 8.5 -11.5996 23.6006 -3.09961 33.8008
c25.7998 30.8994 63.5996 48.5996 103.8 48.5996z" />
    <glyph glyph-name="meh" unicode="&#xf11a;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM336 128c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-176c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h176z
" />
    <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="576" 
d="M528 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h480zM536 48v288c0 4.41113 -3.58887 8 -8 8h-480c-4.41113 0 -8 -3.58887 -8 -8v-288c0 -4.41113 3.58887 -8 8 -8
h480c4.41113 0 8 3.58887 8 8zM170 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM266 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28
c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM362 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM458 178c0 -6.62695 -5.37305 -12 -12 -12h-28
c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM122 96c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM506 96
c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM122 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28
c6.62695 0 12 -5.37305 12 -12v-28zM218 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM314 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28
c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM410 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM506 260c0 -6.62695 -5.37305 -12 -12 -12h-28
c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM408 102c0 -6.62695 -5.37305 -12 -12 -12h-216c-6.62695 0 -12 5.37305 -12 12v16c0 6.62695 5.37305 12 12 12h216c6.62695 0 12 -5.37305 12 -12v-16z" />
    <glyph glyph-name="calendar" unicode="&#xf133;" horiz-adv-x="448" 
d="M400 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12
v-52h48zM394 -16c3.2998 0 6 2.7002 6 6v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340z" />
    <glyph glyph-name="play-circle" unicode="&#xf144;" 
d="M371.7 210c16.3994 -9.2002 16.3994 -32.9004 0 -42l-176 -101c-15.9004 -8.7998 -35.7002 2.59961 -35.7002 21v208c0 18.5 19.9004 29.7998 35.7002 21zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192
c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200z" />
    <glyph glyph-name="minus-square" unicode="&#xf146;" horiz-adv-x="448" 
d="M108 164c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h232c6.59961 0 12 -5.40039 12 -12v-32c0 -6.59961 -5.40039 -12 -12 -12h-232zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352
c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="check-square" unicode="&#xf14a;" horiz-adv-x="448" 
d="M400 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352zM400 16v352h-352v-352h352zM364.136 257.724l-172.589 -171.204
c-4.70508 -4.66699 -12.3027 -4.63672 -16.9697 0.0683594l-90.7812 91.5156c-4.66699 4.70508 -4.63672 12.3037 0.0693359 16.9717l22.7188 22.5361c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0693359l59.792 -60.2773l141.353 140.217
c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0683594l22.5361 -22.7178c4.66699 -4.70605 4.63672 -12.3047 -0.0683594 -16.9717z" />
    <glyph glyph-name="share-square" unicode="&#xf14d;" horiz-adv-x="576" 
d="M561.938 289.94c18.75 -18.7402 18.75 -49.1406 0 -67.8809l-143.998 -144c-29.9727 -29.9727 -81.9404 -9.05273 -81.9404 33.9404v53.7998c-101.266 -7.83691 -99.625 -31.6406 -84.1104 -78.7598c14.2285 -43.0889 -33.4736 -79.248 -71.0195 -55.7402
c-51.6924 32.3057 -84.8701 83.0635 -84.8701 144.76c0 39.3408 12.2197 72.7402 36.3301 99.3008c19.8398 21.8398 47.7402 38.4697 82.9102 49.4199c36.7295 11.4395 78.3096 16.1094 120.76 17.9893v57.1982c0 42.9355 51.9258 63.9541 81.9404 33.9404zM384 112l144 144
l-144 144v-104.09c-110.86 -0.90332 -240 -10.5166 -240 -119.851c0 -52.1396 32.79 -85.6094 62.3096 -104.06c-39.8174 120.65 48.999 141.918 177.69 143.84v-103.84zM408.74 27.5068c6.14844 1.75684 15.5449 5.92383 20.9736 9.30273
c7.97656 4.95215 18.2861 -0.825195 18.2861 -10.2139v-42.5957c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h132c6.62695 0 12 -5.37305 12 -12v-4.48633c0 -4.91699 -2.9873 -9.36914 -7.56934 -11.1514
c-13.7021 -5.33105 -26.3955 -11.5371 -38.0498 -18.585c-1.59668 -0.974609 -4.41016 -1.77051 -6.28027 -1.77734h-86.1006c-3.31152 0 -6 -2.68848 -6 -6v-340c0 -3.31152 2.68848 -6 6 -6h340c3.31152 0 6 2.68848 6 6v25.9658c0 5.37012 3.5791 10.0596 8.74023 11.541
z" />
    <glyph glyph-name="compass" unicode="&#xf14e;" horiz-adv-x="496" 
d="M347.94 318.14c16.6592 7.61035 33.8096 -9.54004 26.1992 -26.1992l-65.9697 -144.341c-2.73047 -5.97363 -9.7959 -13.0391 -15.7695 -15.7695l-144.341 -65.9697c-16.6592 -7.61035 -33.8096 9.5498 -26.1992 26.1992l65.9697 144.341
c2.73047 5.97363 9.7959 13.0391 15.7695 15.7695zM270.58 169.42c12.4697 12.4697 12.4697 32.6904 0 45.1602s-32.6904 12.4697 -45.1602 0s-12.4697 -32.6904 0 -45.1602s32.6904 -12.4697 45.1602 0zM248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248
s-248 111.03 -248 248s111.03 248 248 248zM248 -8c110.28 0 200 89.7197 200 200s-89.7197 200 -200 200s-200 -89.7197 -200 -200s89.7197 -200 200 -200z" />
    <glyph glyph-name="caret-square-down" unicode="&#xf150;" horiz-adv-x="448" 
d="M125.1 240h197.801c10.6992 0 16.0996 -13 8.5 -20.5l-98.9004 -98.2998c-4.7002 -4.7002 -12.2002 -4.7002 -16.9004 0l-98.8994 98.2998c-7.7002 7.5 -2.2998 20.5 8.39941 20.5zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="caret-square-up" unicode="&#xf151;" horiz-adv-x="448" 
d="M322.9 144h-197.801c-10.6992 0 -16.0996 13 -8.5 20.5l98.9004 98.2998c4.7002 4.7002 12.2002 4.7002 16.9004 0l98.8994 -98.2998c7.7002 -7.5 2.2998 -20.5 -8.39941 -20.5zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="caret-square-right" unicode="&#xf152;" horiz-adv-x="448" 
d="M176 93.0996v197.801c0 10.6992 13 16.0996 20.5 8.5l98.2998 -98.9004c4.7002 -4.7002 4.7002 -12.2002 0 -16.9004l-98.2998 -98.8994c-7.5 -7.7002 -20.5 -2.2998 -20.5 8.39941zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="file" unicode="&#xf15b;" horiz-adv-x="384" 
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416z" />
    <glyph glyph-name="file-alt" unicode="&#xf15c;" horiz-adv-x="384" 
d="M288 200v-28c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12v28c0 6.59961 5.40039 12 12 12h168c6.59961 0 12 -5.40039 12 -12zM276 128c6.59961 0 12 -5.40039 12 -12v-28c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12
v28c0 6.59961 5.40039 12 12 12h168zM384 316.1v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996l83.9004 -83.9004c9 -8.90039 14.0996 -21.2002 14.0996 -33.9004z
M256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416h288z" />
    <glyph glyph-name="thumbs-up" unicode="&#xf164;" 
d="M466.27 161.31c4.6748 -22.6465 0.864258 -44.5371 -8.98926 -62.9893c2.95898 -23.8682 -4.02148 -48.5654 -17.3398 -66.9902c-0.954102 -55.9072 -35.8232 -95.3301 -112.94 -95.3301c-7 0 -15 0.00976562 -22.2197 0.00976562
c-102.742 0 -133.293 38.9395 -177.803 39.9404c-3.56934 -13.7764 -16.085 -23.9502 -30.9775 -23.9502h-64c-17.6729 0 -32 14.3271 -32 32v240c0 17.6729 14.3271 32 32 32h98.7598c19.1455 16.9531 46.0137 60.6533 68.7598 83.4004
c13.667 13.667 10.1533 108.6 71.7607 108.6c57.5801 0 95.2695 -31.9355 95.2695 -104.73c0 -18.4092 -3.92969 -33.7295 -8.84961 -46.5391h36.4795c48.6025 0 85.8203 -41.5654 85.8203 -85.5801c0 -19.1504 -4.95996 -34.9902 -13.7305 -49.8408zM404.52 107.48
c21.5811 20.3838 18.6992 51.0645 5.21094 65.6191c9.44922 0 22.3594 18.9102 22.2695 37.8105c-0.0898438 18.9102 -16.71 37.8203 -37.8203 37.8203h-103.989c0 37.8193 28.3594 55.3691 28.3594 94.5391c0 23.75 0 56.7305 -47.2695 56.7305
c-18.9102 -18.9102 -9.45996 -66.1797 -37.8203 -94.54c-26.5596 -26.5703 -66.1797 -97.46 -94.54 -97.46h-10.9199v-186.17c53.6113 0 100.001 -37.8203 171.64 -37.8203h37.8203c35.5117 0 60.8203 17.1201 53.1201 65.9004
c15.2002 8.16016 26.5 36.4395 13.9395 57.5703zM88 16c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24z" />
    <glyph glyph-name="thumbs-down" unicode="&#xf165;" 
d="M466.27 222.69c8.77051 -14.8506 13.7305 -30.6904 13.7305 -49.8408c0 -44.0146 -37.2178 -85.5801 -85.8203 -85.5801h-36.4795c4.91992 -12.8096 8.84961 -28.1299 8.84961 -46.5391c0 -72.7949 -37.6895 -104.73 -95.2695 -104.73
c-61.6074 0 -58.0938 94.9326 -71.7607 108.6c-22.7461 22.7471 -49.6133 66.4473 -68.7598 83.4004h-7.05176c-5.5332 -9.56152 -15.8662 -16 -27.708 -16h-64c-17.6729 0 -32 14.3271 -32 32v240c0 17.6729 14.3271 32 32 32h64c8.11328 0 15.5146 -3.02539 21.1553 -8
h10.8447c40.9971 0 73.1953 39.9902 176.78 39.9902c7.21973 0 15.2197 0.00976562 22.2197 0.00976562c77.1172 0 111.986 -39.4229 112.94 -95.3301c13.3184 -18.4248 20.2979 -43.1221 17.3398 -66.9902c9.85352 -18.4521 13.6641 -40.3428 8.98926 -62.9893zM64 152
c13.2549 0 24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24zM394.18 135.27c21.1104 0 37.7305 18.9102 37.8203 37.8203c0.0898438 18.9004 -12.8203 37.8105 -22.2695 37.8105c13.4883 14.5547 16.3701 45.2354 -5.21094 65.6191
c12.5605 21.1309 1.26074 49.4102 -13.9395 57.5703c7.7002 48.7803 -17.6084 65.9004 -53.1201 65.9004h-37.8203c-71.6387 0 -118.028 -37.8203 -171.64 -37.8203v-186.17h10.9199c28.3604 0 67.9805 -70.8896 94.54 -97.46
c28.3604 -28.3604 18.9102 -75.6299 37.8203 -94.54c47.2695 0 47.2695 32.9805 47.2695 56.7305c0 39.1699 -28.3594 56.7197 -28.3594 94.5391h103.989z" />
    <glyph glyph-name="sun" unicode="&#xf185;" 
d="M494.2 226.1c11.2002 -7.59961 17.7998 -20.0996 17.8994 -33.6992c0 -13.4004 -6.69922 -26 -17.7998 -33.5l-59.7998 -40.5l13.7002 -71c2.5 -13.2002 -1.60059 -26.8008 -11.1006 -36.3008s-22.8994 -13.7998 -36.2998 -11.0996l-70.8994 13.7002l-40.4004 -59.9004
c-7.5 -11.0996 -20.0996 -17.7998 -33.5 -17.7998s-26 6.7002 -33.5 17.9004l-40.4004 59.8994l-70.7998 -13.7002c-13.3994 -2.59961 -26.7998 1.60059 -36.2998 11.1006s-13.7002 23.0996 -11.0996 36.2998l13.6992 71l-59.7998 40.5
c-11.0996 7.5 -17.7998 20 -17.7998 33.5s6.59961 26 17.7998 33.5996l59.7998 40.5l-13.6992 71c-2.60059 13.2002 1.59961 26.7002 11.0996 36.3008c9.5 9.59961 23 13.6992 36.2998 11.1992l70.7998 -13.6992l40.4004 59.8994c15.0996 22.2998 51.9004 22.2998 67 0
l40.4004 -59.8994l70.8994 13.6992c13 2.60059 26.6006 -1.59961 36.2002 -11.0996c9.5 -9.59961 13.7002 -23.2002 11.0996 -36.4004l-13.6992 -71zM381.3 140.5l76.7998 52.0996l-76.7998 52l17.6006 91.1006l-91 -17.6006l-51.9004 76.9004l-51.7998 -76.7998
l-91 17.5996l17.5996 -91.2002l-76.7998 -52l76.7998 -52l-17.5996 -91.1992l90.8994 17.5996l51.9004 -77l51.9004 76.9004l91 -17.6006zM256 296c57.2998 0 104 -46.7002 104 -104s-46.7002 -104 -104 -104s-104 46.7002 -104 104s46.7002 104 104 104zM256 136
c30.9004 0 56 25.0996 56 56s-25.0996 56 -56 56s-56 -25.0996 -56 -56s25.0996 -56 56 -56z" />
    <glyph glyph-name="moon" unicode="&#xf186;" 
d="M279.135 -64c-141.424 0 -256 114.64 -256 256c0 141.425 114.641 256 256 256c13.0068 -0.00195312 33.9443 -1.91797 46.7354 -4.27734c44.0205 -8.13086 53.7666 -66.8691 15.0215 -88.9189c-41.374 -23.5439 -67.4336 -67.4121 -67.4336 -115.836
c0 -83.5234 75.9238 -146.475 158.272 -130.792c43.6904 8.32129 74.5186 -42.5693 46.248 -77.4004c-47.8613 -58.9717 -120.088 -94.7754 -198.844 -94.7754zM279.135 400c-114.875 0 -208 -93.125 -208 -208s93.125 -208 208 -208
c65.2314 0 123.439 30.0361 161.575 77.0244c-111.611 -21.2568 -215.252 64.0957 -215.252 177.943c0 67.5127 36.9326 126.392 91.6934 157.555c-12.3271 2.27637 -25.0312 3.47754 -38.0166 3.47754z" />
    <glyph glyph-name="caret-square-left" unicode="&#xf191;" horiz-adv-x="448" 
d="M272 290.9v-197.801c0 -10.6992 -13 -16.0996 -20.5 -8.5l-98.2998 98.9004c-4.7002 4.7002 -4.7002 12.2002 0 16.9004l98.2998 98.8994c7.5 7.7002 20.5 2.2998 20.5 -8.39941zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="dot-circle" unicode="&#xf192;" 
d="M256 392c-110.549 0 -200 -89.4678 -200 -200c0 -110.549 89.4678 -200 200 -200c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200zM256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248z
M256 272c44.1826 0 80 -35.8174 80 -80s-35.8174 -80 -80 -80s-80 35.8174 -80 80s35.8174 80 80 80z" />
    <glyph glyph-name="building" unicode="&#xf1ad;" horiz-adv-x="448" 
d="M128 300v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12zM268 288c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40
c0 -6.59961 -5.40039 -12 -12 -12h-40zM140 192c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM268 192c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40
c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM192 108c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM268 96c-6.59961 0 -12 5.40039 -12 12v40
c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM448 -28v-36h-448v36c0 6.59961 5.40039 12 12 12h19.5v440c0 13.2998 10.7002 24 24 24h337c13.2998 0 24 -10.7002 24 -24v-440h19.5
c6.59961 0 12 -5.40039 12 -12zM79.5 -15h112.5v67c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-67h112.5v414l-288.5 1z" />
    <glyph glyph-name="file-pdf" unicode="&#xf1c1;" horiz-adv-x="384" 
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM298.2 127.7c10.5 -10.5 8 -38.7002 -17.5 -38.7002c-14.7998 0 -36.9004 6.7998 -55.7998 17c-21.6006 -3.59961 -46 -12.7002 -68.4004 -20.0996c-50.0996 -86.4004 -79.4004 -47 -76.0996 -31.2002
c4 20 31 35.8994 51 46.2002c10.5 18.3994 25.3994 50.5 35.3994 74.3994c-7.39941 28.6006 -11.3994 51 -7 67.1006c4.7998 17.6992 38.4004 20.2998 42.6006 -5.90039c4.69922 -15.4004 -1.5 -39.9004 -5.40039 -56c8.09961 -21.2998 19.5996 -35.7998 36.7998 -46.2998
c17.4004 2.2002 52.2002 5.5 64.4004 -6.5zM100.1 49.9004c0 -0.700195 11.4004 4.69922 30.4004 35c-5.90039 -5.5 -25.2998 -21.3008 -30.4004 -35zM181.7 240.5c-2.5 0 -2.60059 -26.9004 1.7998 -40.7998c4.90039 8.7002 5.59961 40.7998 -1.7998 40.7998zM157.3 103.9
c15.9004 6.09961 34 14.8994 54.7998 19.1992c-11.1992 8.30078 -21.7998 20.4004 -30.0996 35.5c-6.7002 -17.6992 -15 -37.7998 -24.7002 -54.6992zM288.9 108.9c3.59961 2.39941 -2.2002 10.3994 -37.3008 7.7998c32.3008 -13.7998 37.3008 -7.7998 37.3008 -7.7998z" />
    <glyph glyph-name="file-word" unicode="&#xf1c2;" horiz-adv-x="384" 
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM268.1 192v0.200195h15.8008c7.7998 0 13.5 -7.2998 11.5996 -14.9004c-4.2998 -17 -13.7002 -54.0996 -34.5 -136c-1.2998 -5.39941 -6.09961 -9.09961 -11.5996 -9.09961h-24.7002
c-5.5 0 -10.2998 3.7998 -11.6006 9.09961c-5.2998 20.9004 -17.7998 71 -17.8994 71.4004l-2.90039 17.2998c-0.5 -5.2998 -1.5 -11.0996 -3 -17.2998l-17.8994 -71.4004c-1.30078 -5.39941 -6.10059 -9.09961 -11.6006 -9.09961h-25.2002
c-5.59961 0 -10.3994 3.7002 -11.6992 9.09961c-6.5 26.5 -25.2002 103.4 -33.2002 136c-1.7998 7.5 3.89941 14.7998 11.7002 14.7998h16.7998c5.7998 0 10.7002 -4.09961 11.7998 -9.69922c5 -25.7002 18.4004 -93.8008 19.0996 -99
c0.300781 -1.7002 0.400391 -3.10059 0.5 -4.2002c0.800781 7.5 0.400391 4.7002 24.8008 103.7c1.39941 5.2998 6.19922 9.09961 11.6992 9.09961h13.3008c5.59961 0 10.3994 -3.7998 11.6992 -9.2002c23.9004 -99.7002 22.8008 -94.3994 23.6006 -99.5
c0.299805 -1.7002 0.5 -3.09961 0.700195 -4.2998c0.599609 8.09961 0.399414 5.7998 21 103.5c1.09961 5.5 6 9.5 11.6992 9.5z" />
    <glyph glyph-name="file-excel" unicode="&#xf1c3;" horiz-adv-x="384" 
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM260 224c9.2002 0 15 -10 10.2998 -18c-16 -27.5 -45.5996 -76.9004 -46.2998 -78l46.4004 -78c4.59961 -8 -1.10059 -18 -10.4004 -18h-28.7998c-4.40039 0 -8.5 2.40039 -10.6006 6.2998
c-22.6992 41.7998 -13.6992 27.5 -28.5996 57.7002c-5.59961 -12.7002 -6.90039 -17.7002 -28.5996 -57.7002c-2.10059 -3.89941 -6.10059 -6.2998 -10.5 -6.2998h-28.9004c-9.2998 0 -15.0996 10 -10.4004 18l46.3008 78l-46.3008 78c-4.59961 8 1.10059 18 10.4004 18
h28.9004c4.39941 0 8.5 -2.40039 10.5996 -6.2998c21.7002 -40.4004 14.7002 -28.6006 28.5996 -57.7002c6.40039 15.2998 10.6006 24.5996 28.6006 57.7002c2.09961 3.89941 6.09961 6.2998 10.5 6.2998h28.7998z" />
    <glyph glyph-name="file-powerpoint" unicode="&#xf1c4;" horiz-adv-x="384" 
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM120 44v168c0 6.59961 5.40039 12 12 12h69.2002c36.7002 0 62.7998 -27 62.7998 -66.2998c0 -74.2998 -68.7002 -66.5 -95.5 -66.5v-47.2002c0 -6.59961 -5.40039 -12 -12 -12h-24.5c-6.59961 0 -12 5.40039 -12 12z
M168.5 131.4h23c7.90039 0 13.9004 2.39941 18.0996 7.19922c8.5 9.80078 8.40039 28.5 0.100586 37.8008c-4.10059 4.59961 -9.90039 7 -17.4004 7h-23.8994v-52h0.0996094z" />
    <glyph glyph-name="file-image" unicode="&#xf1c5;" horiz-adv-x="384" 
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM80 32v64l39.5 39.5c4.7002 4.7002 12.2998 4.7002 17 0l39.5 -39.5l87.5 87.5c4.7002 4.7002 12.2998 4.7002 17 0l23.5 -23.5v-128h-224zM128 272c26.5 0 48 -21.5 48 -48s-21.5 -48 -48 -48s-48 21.5 -48 48
s21.5 48 48 48z" />
    <glyph glyph-name="file-archive" unicode="&#xf1c6;" horiz-adv-x="384" 
d="M128.3 288h32v-32h-32v32zM192.3 384v-32h-32v32h32zM128.3 352h32v-32h-32v32zM192.3 320v-32h-32v32h32zM369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1
c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-48.2998v-16h-32v16h-79.7002v-416h288zM194.2 182.3l17.2998 -87.7002c6.40039 -32.3994 -18.4004 -62.5996 -51.5 -62.5996
c-33.2002 0 -58 30.4004 -51.4004 62.9004l19.7002 97.0996v32h32v-32h22.1006c5.7998 0 10.6992 -4.09961 11.7998 -9.7002zM160.3 57.9004c17.9004 0 32.4004 12.0996 32.4004 27c0 14.8994 -14.5 27 -32.4004 27c-17.8994 0 -32.3994 -12.1006 -32.3994 -27
c0 -14.9004 14.5 -27 32.3994 -27zM192.3 256v-32h-32v32h32z" />
    <glyph glyph-name="file-audio" unicode="&#xf1c7;" horiz-adv-x="384" 
d="M369.941 350.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM332.118 320
l-76.1182 76.1182v-76.1182h76.1182zM48 -16h288v288h-104c-13.2549 0 -24 10.7451 -24 24v104h-160v-416zM192 60.0244c0 -10.6914 -12.9258 -16.0459 -20.4854 -8.48535l-35.5146 35.9746h-28c-6.62695 0 -12 5.37305 -12 12v56c0 6.62695 5.37305 12 12 12h28
l35.5146 36.9473c7.56055 7.56055 20.4854 2.20605 20.4854 -8.48535v-135.951zM233.201 107.154c9.05078 9.29688 9.05957 24.1328 0.000976562 33.4385c-22.1494 22.752 12.2344 56.2461 34.3945 33.4814c27.1982 -27.9404 27.2119 -72.4443 0.000976562 -100.401
c-21.793 -22.3857 -56.9463 10.3154 -34.3965 33.4814z" />
    <glyph glyph-name="file-video" unicode="&#xf1c8;" horiz-adv-x="384" 
d="M369.941 350.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM332.118 320
l-76.1182 76.1182v-76.1182h76.1182zM48 -16h288v288h-104c-13.2549 0 -24 10.7451 -24 24v104h-160v-416zM276.687 195.303c10.0049 10.0049 27.3135 2.99707 27.3135 -11.3135v-111.976c0 -14.2939 -17.2959 -21.332 -27.3135 -11.3135l-52.6865 52.6738v-37.374
c0 -11.0459 -8.9541 -20 -20 -20h-104c-11.0459 0 -20 8.9541 -20 20v104c0 11.0459 8.9541 20 20 20h104c11.0459 0 20 -8.9541 20 -20v-37.374z" />
    <glyph glyph-name="file-code" unicode="&#xf1c9;" horiz-adv-x="384" 
d="M149.9 98.9004c3.5 -3.30078 3.69922 -8.90039 0.399414 -12.4004l-17.3994 -18.5996c-1.60059 -1.80078 -4 -2.80078 -6.40039 -2.80078c-2.2002 0 -4.40039 0.900391 -6 2.40039l-57.7002 54.0996c-3.7002 3.40039 -3.7002 9.30078 0 12.8008l57.7002 54.0996
c3.40039 3.2998 9 3.2002 12.4004 -0.400391l17.3994 -18.5996l0.200195 -0.200195c3.2002 -3.59961 2.7998 -9.2002 -0.799805 -12.3994l-32.7998 -28.9004l32.7998 -28.9004zM369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288
c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416h288zM209.6 234l24.4004 -7
c4.7002 -1.2998 7.40039 -6.2002 6 -10.9004l-54.7002 -188.199c-1.2998 -4.60059 -6.2002 -7.40039 -10.8994 -6l-24.4004 7.09961c-4.7002 1.2998 -7.40039 6.2002 -6 10.9004l54.7002 188.1c1.39941 4.7002 6.2002 7.40039 10.8994 6zM234.1 157.1
c-3.5 3.30078 -3.69922 8.90039 -0.399414 12.4004l17.3994 18.5996c3.30078 3.60059 8.90039 3.7002 12.4004 0.400391l57.7002 -54.0996c3.7002 -3.40039 3.7002 -9.30078 0 -12.8008l-57.7002 -54.0996c-3.5 -3.2998 -9.09961 -3.09961 -12.4004 0.400391
l-17.3994 18.5996l-0.200195 0.200195c-3.2002 3.59961 -2.7998 9.2002 0.799805 12.3994l32.7998 28.9004l-32.7998 28.9004z" />
    <glyph glyph-name="life-ring" unicode="&#xf1cd;" 
d="M256 -56c-136.967 0 -248 111.033 -248 248s111.033 248 248 248s248 -111.033 248 -248s-111.033 -248 -248 -248zM152.602 20.7197c63.2178 -38.3184 143.579 -38.3184 206.797 0l-53.4111 53.4111c-31.8467 -13.5215 -68.168 -13.5059 -99.9746 0zM336 192
c0 44.1123 -35.8877 80 -80 80s-80 -35.8877 -80 -80s35.8877 -80 80 -80s80 35.8877 80 80zM427.28 88.6016c38.3184 63.2178 38.3184 143.579 0 206.797l-53.4111 -53.4111c13.5215 -31.8467 13.5049 -68.168 0 -99.9746zM359.397 363.28
c-63.2168 38.3184 -143.578 38.3184 -206.796 0l53.4111 -53.4111c31.8457 13.5215 68.167 13.5049 99.9736 0zM84.7197 295.398c-38.3184 -63.2178 -38.3184 -143.579 0 -206.797l53.4111 53.4111c-13.5215 31.8467 -13.5059 68.168 0 99.9746z" />
    <glyph glyph-name="paper-plane" unicode="&#xf1d8;" 
d="M440 441.5c34.5996 19.9004 77.5996 -8.7998 71.5 -48.9004l-59.4004 -387.199c-2.2998 -14.5 -11.0996 -27.3008 -23.8994 -34.5c-7.2998 -4.10059 -15.4004 -6.2002 -23.6006 -6.2002c-6.19922 0 -12.3994 1.2002 -18.2998 3.59961l-111.899 46.2002l-43.8008 -59.0996
c-27.3994 -36.9004 -86.5996 -17.8008 -86.5996 28.5996v84.4004l-114.3 47.2998c-36.7998 15.0996 -40.1006 66 -5.7002 85.8994zM192 -16l36.5996 49.5l-36.5996 15.0996v-64.5996zM404.6 12.7002l59.4004 387.3l-416 -240l107.8 -44.5996l211.5 184.3
c14.2002 12.2998 34.4004 -5.7002 23.7002 -21.2002l-140.2 -202.3z" />
    <glyph glyph-name="futbol" unicode="&#xf1e3;" horiz-adv-x="496" 
d="M483.8 268.6c42.2998 -130.199 -29 -270.1 -159.2 -312.399c-25.5 -8.2998 -51.2998 -12.2002 -76.6992 -12.2002c-104.5 0 -201.7 66.5996 -235.7 171.4c-42.2998 130.199 29 270.1 159.2 312.399c25.5 8.2998 51.2998 12.2002 76.6992 12.2002
c104.5 0 201.7 -66.5996 235.7 -171.4zM409.3 74.9004c6.10059 8.39941 12.1006 16.8994 16.7998 26.1992c14.3008 28.1006 21.5 58.5 21.7002 89.2002l-38.8994 36.4004l-71.1006 -22.1006l-24.3994 -75.1992l43.6992 -60.9004zM409.3 310.3
c-24.5 33.4004 -58.7002 58.4004 -97.8994 71.4004l-47.4004 -26.2002v-73.7998l64.2002 -46.5l70.7002 22zM184.9 381.6c-39.9004 -13.2998 -73.5 -38.5 -97.8008 -71.8994l10.1006 -52.5l70.5996 -22l64.2002 46.5v73.7998zM139 68.5l43.5 61.7002l-24.2998 74.2998
l-71.1006 22.2002l-39 -36.4004c0.5 -55.7002 23.4004 -95.2002 37.8008 -115.3zM187.2 1.5c64.0996 -20.4004 115.5 -1.7998 121.7 0l22.3994 48.0996l-44.2998 61.7002h-78.5996l-43.6006 -61.7002z" />
    <glyph glyph-name="newspaper" unicode="&#xf1ea;" horiz-adv-x="576" 
d="M552 384c13.2549 0 24 -10.7451 24 -24v-336c0 -13.2549 -10.7451 -24 -24 -24h-496c-30.9277 0 -56 25.0723 -56 56v272c0 13.2549 10.7451 24 24 24h42.752c6.60547 18.623 24.3896 32 45.248 32h440zM48 56c0 -4.41113 3.58887 -8 8 -8s8 3.58887 8 8v248h-16v-248z
M528 48v288h-416v-280c0 -2.7168 -0.204102 -5.38574 -0.578125 -8h416.578zM172 168c-6.62695 0 -12 5.37305 -12 12v96c0 6.62695 5.37305 12 12 12h136c6.62695 0 12 -5.37305 12 -12v-96c0 -6.62695 -5.37305 -12 -12 -12h-136zM200 248v-40h80v40h-80zM160 108v24
c0 6.62695 5.37305 12 12 12h136c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-136c-6.62695 0 -12 5.37305 -12 12zM352 108v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-104
c-6.62695 0 -12 5.37305 -12 12zM352 252v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-104c-6.62695 0 -12 5.37305 -12 12zM352 180v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24
c0 -6.62695 -5.37305 -12 -12 -12h-104c-6.62695 0 -12 5.37305 -12 12z" />
    <glyph glyph-name="bell-slash" unicode="&#xf1f6;" horiz-adv-x="640" 
d="M633.99 -23.0195c6.91016 -5.52051 8.01953 -15.5908 2.5 -22.4902l-10 -12.4902c-5.53027 -6.88965 -15.5898 -8.00977 -22.4902 -2.49023l-598 467.51c-6.90039 5.52051 -8.01953 15.5908 -2.49023 22.4902l10 12.4902
c5.52051 6.90039 15.5898 8.00977 22.4902 2.49023zM163.53 80h182.84l61.3994 -48h-279.659c-19.1201 0 -31.9902 15.5996 -32.1006 32c-0.0498047 7.5498 2.61035 15.2598 8.61035 21.71c18.3701 19.7402 51.5703 49.6904 54.8398 140.42l45.4697 -35.5498
c-6.91992 -54.7803 -24.6895 -88.5498 -41.3994 -110.58zM320 352c-23.3496 0 -45 -7.17969 -62.9404 -19.4004l-38.1699 29.8408c19.6807 15.7793 43.1104 27.3096 69.1299 32.7197v20.8398c0 17.6699 14.3203 32 31.9805 32s31.9805 -14.3301 31.9805 -32v-20.8398
c73.46 -15.2598 127.939 -77.46 127.939 -155.16c0 -41.3604 6.03027 -70.7197 14.3398 -92.8496l-59.5293 46.54c-1.63086 13.96 -2.77051 28.8896 -2.79004 45.7295c0 0.200195 0.0595703 0.379883 0.0595703 0.580078c0 61.8604 -50.1396 112 -112 112zM320 -64
c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64z" />
    <glyph glyph-name="copyright" unicode="&#xf1f9;" 
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 -8c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200c-110.549 0 -200 -89.4688 -200 -200c0 -110.549 89.4678 -200 200 -200z
M363.351 93.0645c-9.61328 -9.71289 -45.5293 -41.3965 -104.064 -41.3965c-82.4297 0 -140.484 61.4248 -140.484 141.567c0 79.1514 60.2754 139.4 139.763 139.4c55.5303 0 88.7373 -26.6201 97.5928 -34.7783c2.13379 -1.96289 3.86523 -5.9082 3.86523 -8.80762
c0 -1.95508 -0.864258 -4.87402 -1.92969 -6.51465l-18.1543 -28.1133c-3.8418 -5.9502 -11.9668 -7.28223 -17.499 -2.9209c-8.5957 6.77637 -31.8145 22.5381 -61.708 22.5381c-48.3037 0 -77.916 -35.3301 -77.916 -80.082c0 -41.5889 26.8877 -83.6924 78.2764 -83.6924
c32.6572 0 56.8428 19.0391 65.7266 27.2256c5.26953 4.85645 13.5957 4.03906 17.8193 -1.73828l19.8652 -27.1699c1.28613 -1.74512 2.33008 -4.91992 2.33008 -7.08789c0 -2.72363 -1.56055 -6.5 -3.48242 -8.42969z" />
    <glyph glyph-name="closed-captioning" unicode="&#xf20a;" 
d="M464 384c26.5 0 48 -21.5 48 -48v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h416zM458 48c3.2998 0 6 2.7002 6 6v276c0 3.2998 -2.7002 6 -6 6h-404c-3.2998 0 -6 -2.7002 -6 -6v-276c0 -3.2998 2.7002 -6 6 -6h404z
M246.9 133.7c1.69922 -2.40039 1.5 -5.60059 -0.5 -7.7002c-53.6006 -56.7998 -172.801 -32.0996 -172.801 67.9004c0 97.2998 121.7 119.5 172.5 70.0996c2.10059 -2 2.5 -3.2002 1 -5.7002l-17.5 -30.5c-1.89941 -3.09961 -6.19922 -4 -9.09961 -1.7002
c-40.7998 32 -94.5996 14.9004 -94.5996 -31.1992c0 -48 51 -70.5 92.1992 -32.6006c2.80078 2.5 7.10059 2.10059 9.2002 -0.899414zM437.3 133.7c1.7002 -2.40039 1.5 -5.60059 -0.5 -7.7002c-53.5996 -56.9004 -172.8 -32.0996 -172.8 67.9004
c0 97.2998 121.7 119.5 172.5 70.0996c2.09961 -2 2.5 -3.2002 1 -5.7002l-17.5 -30.5c-1.90039 -3.09961 -6.2002 -4 -9.09961 -1.7002c-40.8008 32 -94.6006 14.9004 -94.6006 -31.1992c0 -48 51 -70.5 92.2002 -32.6006c2.7998 2.5 7.09961 2.10059 9.2002 -0.899414z
" />
    <glyph glyph-name="object-group" unicode="&#xf247;" 
d="M500 320h-12v-256h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-320v-12c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v256h-12
c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-12h320v12c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12zM448 384v-32h32v32h-32zM32 384v-32h32v32h-32zM64 0v32
h-32v-32h32zM480 0v32h-32v-32h32zM440 64v256h-12c-6.62695 0 -12 5.37305 -12 12v12h-320v-12c0 -6.62695 -5.37305 -12 -12 -12h-12v-256h12c6.62695 0 12 -5.37305 12 -12v-12h320v12c0 6.62695 5.37305 12 12 12h12zM404 256c6.62695 0 12 -5.37207 12 -12v-168
c0 -6.62793 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37207 -12 12v52h-84c-6.62695 0 -12 5.37207 -12 12v168c0 6.62793 5.37305 12 12 12h200c6.62695 0 12 -5.37207 12 -12v-52h84zM136 280v-112h144v112h-144zM376 104v112h-56v-76
c0 -6.62793 -5.37305 -12 -12 -12h-76v-24h144z" />
    <glyph glyph-name="object-ungroup" unicode="&#xf248;" horiz-adv-x="576" 
d="M564 224h-12v-160h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-224v-12c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v24h-88v-12
c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v160h-12c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-12h224v12c0 6.62695 5.37305 12 12 12h72
c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-12v-24h88v12c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12zM352 384v-32h32v32h-32zM352 128v-32h32v32h-32zM64 96v32h-32v-32h32zM64 352v32
h-32v-32h32zM96 136h224v12c0 6.62695 5.37305 12 12 12h12v160h-12c-6.62695 0 -12 5.37305 -12 12v12h-224v-12c0 -6.62695 -5.37305 -12 -12 -12h-12v-160h12c6.62695 0 12 -5.37305 12 -12v-12zM224 0v32h-32v-32h32zM504 64v160h-12c-6.62695 0 -12 5.37305 -12 12v12
h-88v-88h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-88v-24h12c6.62695 0 12 -5.37305 12 -12v-12h224v12c0 6.62695 5.37305 12 12 12h12zM544 0v32h-32v-32h32zM544 256v32h-32v-32h32z" />
    <glyph glyph-name="sticky-note" unicode="&#xf249;" horiz-adv-x="448" 
d="M448 99.8936c0 -10.9746 -6.29883 -26.1797 -14.0586 -33.9404l-83.8828 -83.8818c-7.75977 -7.76074 -22.9658 -14.0596 -33.9404 -14.0596h-268.118c-26.5098 0 -48 21.4902 -48 48v351.988c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48v-268.106z
M320 19.8936l76.1182 76.1182h-76.1182v-76.1182zM400 368h-352v-351.988h224v104c0 13.2549 10.7451 24 24 24h104v223.988z" />
    <glyph glyph-name="clone" unicode="&#xf24d;" 
d="M464 448c26.5098 0 48 -21.4902 48 -48v-320c0 -26.5098 -21.4902 -48 -48 -48h-48v-48c0 -26.5098 -21.4902 -48 -48 -48h-320c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h48v48c0 26.5098 21.4902 48 48 48h320zM362 -16c3.31152 0 6 2.68848 6 6
v42h-224c-26.5098 0 -48 21.4902 -48 48v224h-42c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h308zM458 80c3.31152 0 6 2.68848 6 6v308c0 3.31152 -2.68848 6 -6 6h-308c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h308z" />
    <glyph glyph-name="hourglass" unicode="&#xf254;" horiz-adv-x="384" 
d="M368 400c0 -80.0996 -31.8984 -165.619 -97.1797 -208c64.9912 -42.1934 97.1797 -127.436 97.1797 -208h4c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-360c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h4
c0 80.0996 31.8994 165.619 97.1797 208c-64.9912 42.1934 -97.1797 127.436 -97.1797 208h-4c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h360c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-4zM64 400
c0 -101.621 57.3066 -184 128 -184s128 82.3799 128 184h-256zM320 -16c0 101.62 -57.3076 184 -128 184s-128 -82.3799 -128 -184h256z" />
    <glyph glyph-name="hand-rock" unicode="&#xf255;" 
d="M408.864 368.948c48.8213 20.751 103.136 -15.0723 103.136 -67.9111v-114.443c0 -15.3955 -3.08887 -30.3906 -9.18262 -44.5674l-42.835 -99.6562c-4.99707 -11.625 -3.98242 -18.8574 -3.98242 -42.3701c0 -17.6729 -14.3271 -32 -32 -32h-252
c-17.6729 0 -32 14.3271 -32 32c0 27.3301 1.1416 29.2012 -3.11035 32.9033l-97.71 85.0811c-24.8994 21.6797 -39.1797 52.8926 -39.1797 85.6338v56.9531c0 47.4277 44.8457 82.0215 91.0459 71.1807c1.96094 55.751 63.5107 87.8262 110.671 60.8057
c29.1895 31.0713 78.8604 31.4473 108.334 -0.0214844c32.7051 18.6846 76.4121 10.3096 98.8135 -23.5879zM464 186.594v114.445c0 34.29 -52 33.8232 -52 0.676758c0 -8.83594 -7.16309 -16 -16 -16h-7c-8.83691 0 -16 7.16406 -16 16v26.751
c0 34.457 -52 33.707 -52 0.676758v-27.4287c0 -8.83594 -7.16309 -16 -16 -16h-7c-8.83691 0 -16 7.16406 -16 16v40.4658c0 34.3525 -52 33.8115 -52 0.677734v-41.1436c0 -8.83594 -7.16406 -16 -16 -16h-7c-8.83594 0 -16 7.16406 -16 16v26.751
c0 34.4023 -52 33.7744 -52 0.676758v-116.571c0 -8.83203 -7.16797 -16 -16 -16c-3.30664 0 -8.01367 1.7627 -10.5068 3.93359l-7 6.09473c-3.03223 2.64062 -5.49316 8.04688 -5.49316 12.0674v0v41.2275c0 34.2148 -52 33.8857 -52 0.677734v-56.9531
c0 -18.8555 8.27441 -36.874 22.7002 -49.4365l97.71 -85.0801c12.4502 -10.8398 19.5898 -26.4463 19.5898 -42.8164v-10.2861h220v7.07617c0 13.21 2.65332 26.0791 7.88281 38.25l42.835 99.6553c2.91602 6.75391 5.28223 18.207 5.28223 25.5635v0.0488281z" />
    <glyph glyph-name="hand-paper" unicode="&#xf256;" horiz-adv-x="448" 
d="M372.57 335.359c39.9062 5.63281 75.4297 -25.7393 75.4297 -66.3594v-131.564c-0.00195312 -12.7666 -2.33008 -33.2246 -5.19531 -45.666l-30.1836 -130.958c-3.34668 -14.5234 -16.2783 -24.8125 -31.1816 -24.8125h-222.897
c-9.10352 0 -20.7793 6.01758 -26.0615 13.4316l-119.97 168.415c-21.2441 29.8203 -14.8047 71.3574 14.5498 93.1533c18.7754 13.9395 42.1309 16.2979 62.083 8.87109v126.13c0 44.0547 41.125 75.5439 82.4053 64.9834c23.8926 48.1963 92.3535 50.2471 117.982 0.74707
c42.5186 11.1445 83.0391 -21.9346 83.0391 -65.5469v-10.8242zM399.997 137.437l-0.00195312 131.563c0 24.9492 -36.5703 25.5508 -36.5703 -0.691406v-76.3086c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v154.184
c0 25.501 -36.5703 26.3633 -36.5703 0.691406v-154.875c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v188.309c0 25.501 -36.5703 26.3545 -36.5703 0.691406v-189c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16
v153.309c0 25.501 -36.5713 26.3359 -36.5713 0.691406v-206.494c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832l-27.1279 38.0791c-14.3711 20.1709 -43.833 -2.33496 -29.3945 -22.6045l115.196 -161.697h201.92l27.3252 118.551
c2.63086 11.417 3.96484 23.1553 3.96484 34.8857z" />
    <glyph glyph-name="hand-scissors" unicode="&#xf257;" 
d="M256 -32c-44.9561 0 -77.3428 43.2627 -64.0244 85.8535c-21.6484 13.71 -34.0156 38.7617 -30.3408 65.0068h-87.6348c-40.8037 0 -74 32.8105 -74 73.1406c0 40.3291 33.1963 73.1396 74 73.1396l94 -9.14062l-78.8496 18.6787
c-38.3076 14.7422 -57.04 57.4707 -41.9424 95.1123c15.0303 37.4736 57.7549 55.7803 95.6416 41.2012l144.929 -55.7568c24.9551 30.5566 57.8086 43.9932 92.2178 24.7324l97.999 -54.8525c20.9746 -11.7393 34.0049 -33.8457 34.0049 -57.6904v-205.702
c0 -30.7422 -21.4404 -57.5576 -51.7979 -64.5537l-118.999 -27.4268c-4.97168 -1.14648 -10.0889 -1.72949 -15.2031 -1.72949zM256 16.0127l70 -0.000976562c1.23633 0 3.21777 0.225586 4.42285 0.501953l119.001 27.4277
c8.58203 1.97754 14.5762 9.29102 14.5762 17.7812v205.701c0 6.4873 -3.62109 12.542 -9.44922 15.8047l-98 54.8545c-8.13965 4.55566 -18.668 2.61914 -24.4873 -4.50781l-21.7646 -26.6475c-2.65039 -3.24512 -8.20215 -5.87891 -12.3926 -5.87891
c-1.64062 0 -4.21484 0.477539 -5.74609 1.06738l-166.549 64.0908c-32.6543 12.5664 -50.7744 -34.5771 -19.2227 -46.7168l155.357 -59.7852c5.66016 -2.17773 10.2539 -8.86816 10.2539 -14.9326v0v-11.6328c0 -8.83691 -7.16309 -16 -16 -16h-182
c-34.375 0 -34.4297 -50.2803 0 -50.2803h182c8.83691 0 16 -7.16309 16 -16v-6.85645c0 -8.83691 -7.16309 -16 -16 -16h-28c-25.1221 0 -25.1592 -36.5674 0 -36.5674h28c8.83691 0 16 -7.16211 16 -16v-6.85547c0 -8.83691 -7.16309 -16 -16 -16
c-25.1201 0 -25.1602 -36.5674 0 -36.5674z" />
    <glyph glyph-name="hand-lizard" unicode="&#xf258;" horiz-adv-x="576" 
d="M556.686 157.458c12.6357 -19.4863 19.3145 -42.0615 19.3145 -65.2871v-124.171h-224v71.582l-99.751 38.7871c-2.7832 1.08203 -5.70996 1.63086 -8.69727 1.63086h-131.552c-30.8789 0 -56 25.1211 -56 56c0 48.5234 39.4766 88 88 88h113.709l18.333 48h-196.042
c-44.1123 0 -80 35.8877 -80 80v8c0 30.8779 25.1211 56 56 56h293.917c24.5 0 47.084 -12.2725 60.4111 -32.8291zM528 16v76.1709v0.0478516c0 11.7461 -5.19141 29.2734 -11.5879 39.124l-146.358 225.715c-4.44336 6.85254 -11.9707 10.9424 -20.1367 10.9424h-293.917
c-4.41113 0 -8 -3.58887 -8 -8v-8c0 -17.6445 14.3555 -32 32 -32h213.471c25.2021 0 42.626 -25.293 33.6299 -48.8457l-24.5518 -64.2812c-7.05371 -18.4658 -25.0732 -30.873 -44.8398 -30.873h-113.709c-22.0557 0 -40 -17.9443 -40 -40c0 -4.41113 3.58887 -8 8 -8
h131.552h0.0517578c7.44141 0 19.1074 -2.19238 26.041 -4.89355l99.752 -38.7881c18.5898 -7.22852 30.6035 -24.7881 30.6035 -44.7363v-23.582h128z" />
    <glyph glyph-name="hand-spock" unicode="&#xf259;" 
d="M501.03 331.824c6.05762 -9.77832 10.9746 -27.0498 10.9746 -38.5518c0 -4.80664 -0.915039 -12.499 -2.04297 -17.1709l-57.623 -241.963c-12.748 -54.1729 -68.2627 -98.1387 -123.915 -98.1387h-0.345703h-107.455h-0.224609
c-33.8135 0 -81.2148 18.834 -105.807 42.041l-91.3652 85.9766c-12.8213 12.0469 -23.2266 36.1016 -23.2266 53.6943c0 16.1299 8.97266 38.7529 20.0273 50.499c5.31836 5.66406 29.875 29.3926 68.1152 21.8477l-24.3594 82.1973
c-1.68164 5.66406 -3.0459 15.0576 -3.0459 20.9668c0 37.5938 30.417 70.502 67.8955 73.4551c-0.204102 2.03125 -0.369141 5.33691 -0.369141 7.37891c0 31.627 24.8594 63.6895 55.4902 71.5684c43.248 10.9785 80.5645 -17.7012 89.6602 -53.0723l13.6836 -53.207
l4.64648 22.6602c6.76074 32.417 39.123 58.8115 72.2373 58.916c8.73438 0 56.625 -3.26953 70.7383 -54.0801c15.0664 0.710938 46.9199 -3.50977 66.3105 -35.0176zM463.271 287.219c7.86914 32.9844 -42.1211 45.2695 -50.0859 11.9219l-24.8008 -104.146
c-4.38867 -18.4141 -31.7783 -11.8926 -28.0557 6.2168l28.5479 139.166c7.39844 36.0703 -43.3076 45.0703 -50.1182 11.9629l-31.791 -154.971c-3.54883 -17.3086 -28.2832 -18.0469 -32.7109 -0.804688l-47.3262 184.035
c-8.43359 32.8105 -58.3691 20.2676 -49.8652 -12.8359l42.4414 -165.039c4.81641 -18.7207 -23.3711 -26.9121 -28.9648 -8.00781l-31.3438 105.779c-9.6875 32.6465 -59.1191 18.2578 -49.3867 -14.625l36.0137 -121.539
c5.61816 -18.9521 10.1777 -50.377 10.1777 -70.1436v-0.00878906c0 -6.54297 -8.05664 -10.9355 -13.4824 -5.82617l-51.123 48.1074c-24.7852 23.4082 -60.0527 -14.1875 -35.2793 -37.4902l91.3691 -85.9805c16.9629 -16.0068 49.6592 -28.998 72.9824 -28.998h0.154297
h107.455h0.216797c34.7402 0 69.3936 27.4443 77.3525 61.2598z" />
    <glyph glyph-name="hand-pointer" unicode="&#xf25a;" horiz-adv-x="448" 
d="M358.182 268.639c43.1934 16.6348 89.8184 -15.7949 89.8184 -62.6387v-84c-0.000976562 -4.25 -0.775391 -11.0615 -1.72754 -15.2041l-27.4297 -118.999c-6.98242 -30.2969 -33.7549 -51.7969 -64.5566 -51.7969h-178.286c-21.2588 0 -41.3682 10.4102 -53.791 27.8457
l-109.699 154.001c-21.2432 29.8193 -14.8047 71.3574 14.5498 93.1523c18.8115 13.9658 42.1748 16.2822 62.083 8.87207v161.129c0 36.9443 29.7363 67 66.2861 67s66.2861 -30.0557 66.2861 -67v-73.6338c20.4131 2.85742 41.4678 -3.94238 56.5947 -19.6289
c27.1934 12.8467 60.3799 5.66992 79.8721 -19.0986zM80.9854 168.303c-14.4004 20.2119 -43.8008 -2.38281 -29.3945 -22.6055l109.712 -154c3.43457 -4.81934 8.92871 -7.69727 14.6973 -7.69727h178.285c8.49219 0 15.8037 5.99414 17.7822 14.5762l27.4297 119.001
c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285v84c0 25.1602 -36.5713 25.1211 -36.5713 0c0 -8.83594 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16406 -16 16v21c0 25.1602 -36.5713 25.1201 -36.5713 0v-21c0 -8.83594 -7.16309 -16 -16 -16h-6.85938
c-8.83691 0 -16 7.16406 -16 16v35c0 25.1602 -36.5703 25.1201 -36.5703 0v-35c0 -8.83594 -7.16309 -16 -16 -16h-6.85742c-8.83691 0 -16 7.16406 -16 16v175c0 25.1602 -36.5713 25.1201 -36.5713 0v-241.493c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832z
M176.143 48v96c0 8.83691 6.26855 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16zM251.571 48v96c0 8.83691 6.26758 16 14 16h6c7.73145 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26855 -16 -14 -16h-6
c-7.73242 0 -14 7.16309 -14 16zM327 48v96c0 8.83691 6.26758 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16z" />
    <glyph glyph-name="hand-peace" unicode="&#xf25b;" horiz-adv-x="448" 
d="M362.146 256.024c42.5908 13.3184 85.8535 -19.0684 85.8535 -64.0244l-0.0117188 -70.001c-0.000976562 -4.25 -0.775391 -11.0615 -1.72949 -15.2031l-27.4268 -118.999c-6.99707 -30.3564 -33.8105 -51.7969 -64.5547 -51.7969h-205.702
c-23.8447 0 -45.9502 13.0303 -57.6904 34.0059l-54.8525 97.999c-19.2607 34.4092 -5.82422 67.2617 24.7324 92.2178l-55.7568 144.928c-14.5791 37.8867 3.72754 80.6113 41.2012 95.6416c37.6406 15.0977 80.3691 -3.63477 95.1123 -41.9424l18.6787 -78.8496
l-9.14062 94c0 40.8037 32.8096 74 73.1396 74s73.1406 -33.1963 73.1406 -74v-87.6348c26.2451 3.6748 51.2959 -8.69238 65.0068 -30.3408zM399.987 122l-0.000976562 70c0 25.1602 -36.5674 25.1201 -36.5674 0c0 -8.83691 -7.16309 -16 -16 -16h-6.85547
c-8.83789 0 -16 7.16309 -16 16v28c0 25.1592 -36.5674 25.1221 -36.5674 0v-28c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v182c0 34.4297 -50.2803 34.375 -50.2803 0v-182c0 -8.83691 -7.16309 -16 -16 -16h-11.6328v0
c-6.06445 0 -12.7549 4.59375 -14.9326 10.2539l-59.7842 155.357c-12.1396 31.5518 -59.2842 13.4326 -46.7168 -19.2227l64.0898 -166.549c0.589844 -1.53125 1.06738 -4.10547 1.06738 -5.74609c0 -4.19043 -2.63379 -9.74219 -5.87891 -12.3926l-26.6475 -21.7646
c-7.12695 -5.81934 -9.06445 -16.3467 -4.50781 -24.4873l54.8535 -98c3.26367 -5.82812 9.31934 -9.44922 15.8057 -9.44922h205.701c8.49121 0 15.8037 5.99414 17.7812 14.5762l27.4277 119.001c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285z" />
    <glyph glyph-name="registered" unicode="&#xf25d;" 
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 -8c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200c-110.549 0 -200 -89.4688 -200 -200c0 -110.549 89.4678 -200 200 -200z
M366.442 73.791c4.40332 -7.99219 -1.37012 -17.791 -10.5107 -17.791h-42.8096h-0.0126953c-3.97559 0 -8.71582 2.84961 -10.5801 6.36035l-47.5156 89.3027h-31.958v-83.6631c0 -6.61719 -5.38281 -12 -12 -12h-38.5674c-6.61719 0 -12 5.38281 -12 12v248.304
c0 6.61719 5.38281 12 12 12h78.667c71.251 0 101.498 -32.749 101.498 -85.252c0 -31.6123 -15.2148 -59.2969 -39.4824 -73.1758c3.02148 -4.61719 0.225586 0.199219 53.2715 -96.085zM256.933 208.094c20.9131 0 32.4307 11.5186 32.4316 32.4316
c0 19.5752 -6.5127 31.709 -38.9297 31.709h-27.377v-64.1406h33.875z" />
    <glyph glyph-name="calendar-plus" unicode="&#xf271;" horiz-adv-x="448" 
d="M336 156v-24c0 -6.59961 -5.40039 -12 -12 -12h-76v-76c0 -6.59961 -5.40039 -12 -12 -12h-24c-6.59961 0 -12 5.40039 -12 12v76h-76c-6.59961 0 -12 5.40039 -12 12v24c0 6.59961 5.40039 12 12 12h76v76c0 6.59961 5.40039 12 12 12h24c6.59961 0 12 -5.40039 12 -12
v-76h76c6.59961 0 12 -5.40039 12 -12zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40
c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="calendar-minus" unicode="&#xf272;" horiz-adv-x="448" 
d="M124 120c-6.59961 0 -12 5.40039 -12 12v24c0 6.59961 5.40039 12 12 12h200c6.59961 0 12 -5.40039 12 -12v-24c0 -6.59961 -5.40039 -12 -12 -12h-200zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52
c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="calendar-times" unicode="&#xf273;" horiz-adv-x="448" 
d="M311.7 73.2998l-17 -17c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-53.7002 53.7998l-53.7002 -53.6992c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-17 17c-4.7002 4.69922 -4.7002 12.2998 0 17l53.7002 53.6992l-53.7002 53.7002c-4.7002 4.7002 -4.7002 12.2998 0 17
l17 17c4.7002 4.7002 12.2998 4.7002 17 0l53.7002 -53.7002l53.7002 53.7002c4.7002 4.7002 12.2998 4.7002 17 0l17 -17c4.7002 -4.7002 4.7002 -12.2998 0 -17l-53.7998 -53.7998l53.6992 -53.7002c4.80078 -4.7002 4.80078 -12.2998 0.100586 -17zM448 336v-352
c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10
v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="calendar-check" unicode="&#xf274;" horiz-adv-x="448" 
d="M400 384c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h48v52c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-52h128v52c0 6.62695 5.37305 12 12 12h40
c6.62695 0 12 -5.37305 12 -12v-52h48zM394 -16c3.31152 0 6 2.68848 6 6v298h-352v-298c0 -3.31152 2.68848 -6 6 -6h340zM341.151 184.65l-142.31 -141.169c-4.70508 -4.66699 -12.3027 -4.6377 -16.9707 0.0673828l-75.0908 75.6992
c-4.66699 4.70508 -4.6377 12.3027 0.0673828 16.9707l22.7197 22.5361c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0693359l44.1035 -44.4609l111.072 110.182c4.70508 4.66699 12.3027 4.63672 16.9707 -0.0683594l22.5361 -22.7178
c4.66699 -4.70508 4.63672 -12.3027 -0.0683594 -16.9697z" />
    <glyph glyph-name="map" unicode="&#xf279;" horiz-adv-x="576" 
d="M560.02 416c8.4502 0 15.9805 -6.83008 15.9805 -16.0195v-346.32c0 -11.9609 -9.01367 -25.2705 -20.1201 -29.71l-151.83 -52.8105c-5.32617 -1.7334 -14.1953 -3.13965 -19.7969 -3.13965c-5.7373 0 -14.8105 1.47363 -20.2529 3.29004l-172 60.71l-170.05 -62.8398
c-1.99023 -0.790039 -4 -1.16016 -5.95996 -1.16016c-8.45996 0 -15.9902 6.83008 -15.9902 16.0195v346.32c0.00292969 11.959 9.0166 25.2686 20.1201 29.71l151.83 52.8105c6.43945 2.08984 13.1201 3.13965 19.8096 3.13965
c5.73242 -0.00195312 14.8008 -1.47168 20.2402 -3.28027l172 -60.7197h0.00976562l170.05 62.8398c1.98047 0.790039 4 1.16016 5.95996 1.16016zM224 357.58v-285.97l128 -45.1904v285.97zM48 29.9502l127.36 47.0801l0.639648 0.229492v286.2l-128 -44.5303v-288.979z
M528 65.0801v288.97l-127.36 -47.0693l-0.639648 -0.240234v-286.19z" />
    <glyph glyph-name="comment-alt" unicode="&#xf27a;" 
d="M448 448c35.2998 0 64 -28.7002 64 -64v-288c0 -35.2998 -28.7002 -64 -64 -64h-144l-124.9 -93.5996c-2.19922 -1.7002 -4.69922 -2.40039 -7.09961 -2.40039c-6.2002 0 -12 4.90039 -12 12v84h-96c-35.2998 0 -64 28.7002 -64 64v288c0 35.2998 28.7002 64 64 64h384z
M464 96v288c0 8.7998 -7.2002 16 -16 16h-384c-8.7998 0 -16 -7.2002 -16 -16v-288c0 -8.7998 7.2002 -16 16 -16h144v-60l67.2002 50.4004l12.7998 9.59961h160c8.7998 0 16 7.2002 16 16z" />
    <glyph glyph-name="pause-circle" unicode="&#xf28b;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM352 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-48
c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h48c8.7998 0 16 -7.2002 16 -16zM240 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-48c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h48c8.7998 0 16 -7.2002 16 -16z" />
    <glyph glyph-name="stop-circle" unicode="&#xf28d;" 
d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200zM352 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-160
c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h160c8.7998 0 16 -7.2002 16 -16z" />
    <glyph glyph-name="handshake" unicode="&#xf2b5;" horiz-adv-x="640" 
d="M519.2 320.1h120.8v-255.699h-64c-17.5 0 -31.7998 14.1992 -31.9004 31.6992h-57.8994c-1.7998 -8.19922 -5.2998 -16.0996 -10.9004 -23l-26.2002 -32.2998c-15.7998 -19.3994 -41.8994 -25.5 -64 -16.7998c-13.5 -16.5996 -30.5996 -24 -48.7998 -24
c-15.0996 0 -28.5996 5.09961 -41.0996 15.9004c-31.7998 -21.9004 -74.7002 -21.3008 -105.601 3.7998l-84.5996 76.3994h-9.09961c-0.100586 -17.5 -14.3008 -31.6992 -31.9004 -31.6992h-64v255.699h118l47.5996 47.6006c10.5 10.3994 24.8008 16.2998 39.6006 16.2998
h226.8v0c12.7812 0 30.5225 -7.30273 39.5996 -16.2998zM48 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16zM438 103.3c2.7002 3.40039 2.2002 8.5 -1.2002 11.2998l-108.2 87.8008l-8.19922 -7.5
c-40.3008 -36.8008 -86.7002 -11.8008 -101.5 4.39941c-26.7002 29 -25 74.4004 4.39941 101.3l38.7002 35.5h-56.7002c-2 -0.799805 -3.7002 -1.5 -5.7002 -2.2998l-61.6992 -61.5996h-41.9004v-128.101h27.7002l97.2998 -88
c16.0996 -13.0996 41.4004 -10.5 55.2998 6.60059l15.6006 19.2002l36.7998 -31.5c3 -2.40039 12 -4.90039 18 2.39941l30 36.5l23.8994 -19.3994c3.5 -2.80078 8.5 -2.2002 11.3008 1.19922zM544 144.1v128h-44.7002l-61.7002 61.6006
c-1.39941 1.5 -3.39941 2.2998 -5.5 2.2998l-83.6992 -0.200195c-10 0 -19.6006 -3.7002 -27 -10.5l-65.6006 -60.0996c-9.7002 -8.7998 -10.5 -24 -1.2002 -33.9004c8.90039 -9.39941 25.1006 -8.7002 34.6006 0l55.2002 50.6006c6.5 5.89941 16.5996 5.5 22.5996 -1
l10.9004 -11.7002c6 -6.5 5.5 -16.6006 -1 -22.6006l-12.5 -11.3994l102.699 -83.4004c2.80078 -2.2998 5.40039 -4.89941 7.7002 -7.7002h69.2002zM592 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16z
" />
    <glyph glyph-name="envelope-open" unicode="&#xf2b6;" 
d="M494.586 283.484c9.6123 -7.94824 17.4141 -24.5205 17.4141 -36.9932v-262.491c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v262.515c0 12.5166 7.84668 29.1279 17.5146 37.0771c4.08008 3.35449 110.688 89.0996 135.15 108.549
c22.6992 18.1426 60.1299 55.8594 103.335 55.8594c43.4365 0 81.2314 -38.1914 103.335 -55.8594c23.5283 -18.707 130.554 -104.773 135.251 -108.656zM464 -10v253.632v0.00488281c0 1.5791 -0.996094 3.66602 -2.22363 4.6582
c-15.8633 12.8232 -108.793 87.5752 -132.366 106.316c-17.5527 14.0195 -49.7168 45.3887 -73.4102 45.3887c-23.6016 0 -55.2451 -30.8799 -73.4102 -45.3887c-23.5713 -18.7393 -116.494 -93.4795 -132.364 -106.293
c-1.40918 -1.13965 -2.22559 -2.85254 -2.22559 -4.66504v-253.653c0 -3.31152 2.68848 -6 6 -6h404c3.31152 0 6 2.68848 6 6zM432.009 177.704c4.24902 -5.15918 3.46484 -12.7949 -1.74512 -16.9814c-28.9746 -23.2822 -59.2734 -47.5967 -70.9287 -56.8623
c-22.6992 -18.1436 -60.1299 -55.8604 -103.335 -55.8604c-43.4521 0 -81.2871 38.2373 -103.335 55.8604c-11.2793 8.9668 -41.7441 33.4131 -70.9268 56.8643c-5.20996 4.1875 -5.99316 11.8223 -1.74512 16.9814l15.2578 18.5283
c4.17773 5.07227 11.6572 5.84277 16.7793 1.72559c28.6182 -23.001 58.5654 -47.0352 70.5596 -56.5713c17.5527 -14.0195 49.7168 -45.3887 73.4102 -45.3887c23.6016 0 55.2461 30.8799 73.4102 45.3887c11.9941 9.53516 41.9434 33.5703 70.5625 56.5684
c5.12207 4.11621 12.6016 3.3457 16.7783 -1.72656z" />
    <glyph glyph-name="address-book" unicode="&#xf2b9;" horiz-adv-x="448" 
d="M436 288h-20v-64h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20v-64h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20v-48c0 -26.5 -21.5 -48 -48 -48h-320c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48
h320c26.5 0 48 -21.5 48 -48v-48h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM368 -16v416h-320v-416h320zM208 192c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM118.4 64
c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002c0 -10.6006 -10 -19.2002 -22.4004 -19.2002
h-179.199z" />
    <glyph glyph-name="address-card" unicode="&#xf2bb;" horiz-adv-x="576" 
d="M528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM528 16v352h-480v-352h480zM208 192c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64z
M118.4 64c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002
c0 -10.6006 -10 -19.2002 -22.4004 -19.2002h-179.199zM360 128c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 192c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112
c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 256c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112z" />
    <glyph glyph-name="user-circle" unicode="&#xf2bd;" horiz-adv-x="496" 
d="M248 344c53 0 96 -43 96 -96s-43 -96 -96 -96s-96 43 -96 96s43 96 96 96zM248 200c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8
c49.7002 0 95.0996 18.2998 130.1 48.4004c-14.8994 23 -40.3994 38.5 -69.5996 39.5c-20.7998 -6.5 -40.5996 -9.60059 -60.5 -9.60059s-39.7002 3.2002 -60.5 9.60059c-29.2002 -0.900391 -54.7002 -16.5 -69.5996 -39.5c35 -30.1006 80.3994 -48.4004 130.1 -48.4004z
M410.7 76.0996c23.3994 32.7002 37.2998 72.7002 37.2998 115.9c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -43.2002 13.9004 -83.2002 37.2998 -115.9c24.5 31.4004 62.2002 51.9004 105.101 51.9004c10.1992 0 26.0996 -9.59961 57.5996 -9.59961
c31.5996 0 47.4004 9.59961 57.5996 9.59961c43 0 80.7002 -20.5 105.101 -51.9004z" />
    <glyph glyph-name="id-badge" unicode="&#xf2c1;" horiz-adv-x="384" 
d="M336 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h288zM336 -16v416h-288v-416h288zM144 336c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16h96c8.7998 0 16 -7.2002 16 -16s-7.2002 -16 -16 -16
h-96zM192 160c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM102.4 32c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8
c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002c0 -10.6006 -10 -19.2002 -22.4004 -19.2002h-179.199z" />
    <glyph glyph-name="id-card" unicode="&#xf2c2;" horiz-adv-x="576" 
d="M528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM528 16v288h-480v-288h32.7998c-1 4.5 -0.799805 -3.59961 -0.799805 22.4004c0 31.7998 30.0996 57.5996 67.2002 57.5996
c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996c0 -26 0.0996094 -17.9004 -0.799805 -22.4004h224.8zM360 96c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16
c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 160c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 224c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112
c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM192 128c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64z" />
    <glyph glyph-name="window-maximize" unicode="&#xf2d0;" 
d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM464 22v234h-416v-234c0 -3.2998 2.7002 -6 6 -6h404c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="window-minimize" unicode="&#xf2d1;" 
d="M480 -32h-448c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32h448c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32z" />
    <glyph glyph-name="window-restore" unicode="&#xf2d2;" 
d="M464 448c26.5 0 48 -21.5 48 -48v-320c0 -26.5 -21.5 -48 -48 -48h-48v-48c0 -26.5 -21.5 -48 -48 -48h-320c-26.5 0 -48 21.5 -48 48v320c0 26.5 21.5 48 48 48h48v48c0 26.5 21.5 48 48 48h320zM368 -16v208h-320v-208h320zM464 80v320h-320v-48h224
c26.5 0 48 -21.5 48 -48v-224h48z" />
    <glyph glyph-name="snowflake" unicode="&#xf2dc;" horiz-adv-x="448" 
d="M440.1 92.7998c7.60059 -4.39941 10.1006 -14.2002 5.5 -21.7002l-7.89941 -13.8994c-4.40039 -7.7002 -14 -10.2998 -21.5 -5.90039l-39.2002 23l9.09961 -34.7002c2.30078 -8.5 -2.69922 -17.2998 -11.0996 -19.5996l-15.2002 -4.09961
c-8.39941 -2.30078 -17.0996 2.7998 -19.2998 11.2998l-21.2998 81l-71.9004 42.2002v-84.5l58.2998 -59.3008c6.10059 -6.19922 6.10059 -16.3994 0 -22.5996l-11.0996 -11.2998c-6.09961 -6.2002 -16.0996 -6.2002 -22.2002 0l-24.8994 25.3994v-46.0996
c0 -8.7998 -7 -16 -15.7002 -16h-15.7002c-8.7002 0 -15.7002 7.2002 -15.7002 16v45.9004l-24.8994 -25.4004c-6.10059 -6.2002 -16.1006 -6.2002 -22.2002 0l-11.1006 11.2998c-6.09961 6.2002 -6.09961 16.4004 0 22.6006l58.3008 59.2998v84.5l-71.9004 -42.2002
l-21.2998 -81c-2.2998 -8.5 -10.9004 -13.5996 -19.2998 -11.2998l-15.2002 4.09961c-8.40039 2.2998 -13.2998 11.1006 -11.1006 19.6006l9.10059 34.6992l-39.2002 -23c-7.5 -4.39941 -17.2002 -1.7998 -21.5 5.90039l-7.90039 13.9004
c-4.2998 7.69922 -1.69922 17.5 5.80078 21.8994l39.1992 23l-34.0996 9.2998c-8.40039 2.30078 -13.2998 11.1006 -11.0996 19.6006l4.09961 15.5c2.2998 8.5 10.9004 13.5996 19.2998 11.2998l79.7002 -21.7002l71.9004 42.2002l-71.9004 42.2002l-79.7002 -21.7002
c-8.39941 -2.2998 -17.0996 2.7998 -19.2998 11.2998l-4.09961 15.5c-2.30078 8.5 2.69922 17.2998 11.0996 19.6006l34.0996 9.09961l-39.1992 23c-7.60059 4.5 -10.1006 14.2002 -5.80078 21.9004l7.90039 13.8994c4.40039 7.7002 14 10.2998 21.5 5.90039l39.2002 -23
l-9.10059 34.7002c-2.2998 8.5 2.7002 17.2998 11.1006 19.5996l15.2002 4.09961c8.39941 2.30078 17.0996 -2.7998 19.2998 -11.2998l21.2998 -81l71.9004 -42.2002v84.5l-58.3008 59.3008c-6.09961 6.19922 -6.09961 16.3994 0 22.5996l11.5 11.2998
c6.10059 6.2002 16.1006 6.2002 22.2002 0l24.9004 -25.3994v46.0996c0 8.7998 7 16 15.7002 16h15.6992c8.7002 0 15.7002 -7.2002 15.7002 -16v-45.9004l24.9004 25.4004c6.09961 6.2002 16.0996 6.2002 22.2002 0l11.0996 -11.2998
c6.09961 -6.2002 6.09961 -16.4004 0 -22.6006l-58.2998 -59.2998v-84.5l71.8994 42.2002l21.3008 81c2.2998 8.5 10.8994 13.5996 19.2998 11.2998l15.2002 -4.09961c8.39941 -2.2998 13.2998 -11.1006 11.0996 -19.6006l-9.09961 -34.6992l39.1992 23
c7.5 4.39941 17.2002 1.7998 21.5 -5.90039l7.90039 -13.9004c4.2998 -7.69922 1.7002 -17.5 -5.7998 -21.8994l-39.2002 -23l34.0996 -9.2998c8.40039 -2.30078 13.3008 -11.1006 11.1006 -19.6006l-4.10059 -15.5c-2.2998 -8.5 -10.8994 -13.5996 -19.2998 -11.2998
l-79.7002 21.7002l-71.8994 -42.2002l71.7998 -42.2002l79.7002 21.7002c8.39941 2.2998 17.0996 -2.7998 19.2998 -11.2998l4.09961 -15.5c2.30078 -8.5 -2.69922 -17.2998 -11.0996 -19.6006l-34.0996 -9.2998z" />
    <glyph glyph-name="trash-alt" unicode="&#xf2ed;" horiz-adv-x="448" 
d="M268 32c-6.62402 0 -12 5.37598 -12 12v216c0 6.62402 5.37598 12 12 12h24c6.62402 0 12 -5.37598 12 -12v-216c0 -6.62402 -5.37598 -12 -12 -12h-24zM432 368c8.83203 0 16 -7.16797 16 -16v-16c0 -8.83203 -7.16797 -16 -16 -16h-16v-336
c0 -26.4961 -21.5039 -48 -48 -48h-288c-26.4961 0 -48 21.5039 -48 48v336h-16c-8.83203 0 -16 7.16797 -16 16v16c0 8.83203 7.16797 16 16 16h82.4102l34.0195 56.7002c7.71875 12.8613 26.1572 23.2998 41.1572 23.2998h0.00292969h100.82h0.0224609
c15 0 33.4385 -10.4385 41.1572 -23.2998l34 -56.7002h82.4102zM171.84 397.09l-17.4502 -29.0898h139.221l-17.46 29.0898c-0.96582 1.60645 -3.26953 2.91016 -5.14355 2.91016h-0.00683594h-94h-0.0166016c-1.87402 0 -4.17871 -1.30371 -5.14355 -2.91016zM368 -16v336
h-288v-336h288zM156 32c-6.62402 0 -12 5.37598 -12 12v216c0 6.62402 5.37598 12 12 12h24c6.62402 0 12 -5.37598 12 -12v-216c0 -6.62402 -5.37598 -12 -12 -12h-24z" />
    <glyph glyph-name="images" unicode="&#xf302;" horiz-adv-x="576" 
d="M480 32v-16c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256c0 26.5098 21.4902 48 48 48h16v-48h-10c-3.31152 0 -6 -2.68848 -6 -6v-244c0 -3.31152 2.68848 -6 6 -6h372c3.31152 0 6 2.68848 6 6v10h48zM522 368h-372
c-3.31152 0 -6 -2.68848 -6 -6v-244c0 -3.31152 2.68848 -6 6 -6h372c3.31152 0 6 2.68848 6 6v244c0 3.31152 -2.68848 6 -6 6zM528 416c26.5098 0 48 -21.4902 48 -48v-256c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256
c0 26.5098 21.4902 48 48 48h384zM264 304c0 -22.0908 -17.9092 -40 -40 -40s-40 17.9092 -40 40s17.9092 40 40 40s40 -17.9092 40 -40zM192 208l39.5146 39.5146c4.68652 4.68652 12.2842 4.68652 16.9717 0l39.5137 -39.5146l103.515 103.515
c4.68652 4.68652 12.2842 4.68652 16.9717 0l71.5137 -71.5146v-80h-288v48z" />
    <glyph glyph-name="clipboard" unicode="&#xf328;" horiz-adv-x="384" 
d="M336 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h80c0 35.2998 28.7002 64 64 64s64 -28.7002 64 -64h80zM192 408c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24
s-10.7002 24 -24 24zM336 -10v340c0 3.2998 -2.7002 6 -6 6h-42v-36c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12v36h-42c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h276c3.2998 0 6 2.7002 6 6z" />
    <glyph glyph-name="arrow-alt-circle-down" unicode="&#xf358;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM224 308c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-116
h67c10.7002 0 16.0996 -12.9004 8.5 -20.5l-99 -99c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-99 99c-7.5 7.59961 -2.2002 20.5 8.5 20.5h67v116z" />
    <glyph glyph-name="arrow-alt-circle-left" unicode="&#xf359;" 
d="M8 192c0 137 111 248 248 248s248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248zM456 192c0 110.5 -89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200s200 89.5 200 200zM384 212v-40c0 -6.59961 -5.40039 -12 -12 -12h-116v-67
c0 -10.7002 -12.9004 -16 -20.5 -8.5l-99 99c-4.7002 4.7002 -4.7002 12.2998 0 17l99 99c7.59961 7.59961 20.5 2.2002 20.5 -8.5v-67h116c6.59961 0 12 -5.40039 12 -12z" />
    <glyph glyph-name="arrow-alt-circle-right" unicode="&#xf35a;" 
d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200zM128 172v40c0 6.59961 5.40039 12 12 12h116v67
c0 10.7002 12.9004 16 20.5 8.5l99 -99c4.7002 -4.7002 4.7002 -12.2998 0 -17l-99 -99c-7.59961 -7.59961 -20.5 -2.2002 -20.5 8.5v67h-116c-6.59961 0 -12 5.40039 -12 12z" />
    <glyph glyph-name="arrow-alt-circle-up" unicode="&#xf35b;" 
d="M256 -56c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248s-111 -248 -248 -248zM256 392c-110.5 0 -200 -89.5 -200 -200s89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200zM276 64h-40c-6.59961 0 -12 5.40039 -12 12v116h-67
c-10.7002 0 -16 12.9004 -8.5 20.5l99 99c4.7002 4.7002 12.2998 4.7002 17 0l99 -99c7.59961 -7.59961 2.2002 -20.5 -8.5 -20.5h-67v-116c0 -6.59961 -5.40039 -12 -12 -12z" />
    <glyph glyph-name="gem" unicode="&#xf3a5;" horiz-adv-x="576" 
d="M464 448c4.09961 0 7.7998 -2 10.0996 -5.40039l99.9004 -147.199c2.90039 -4.40039 2.59961 -10.1006 -0.700195 -14.2002l-276 -340.8c-4.7998 -5.90039 -13.7998 -5.90039 -18.5996 0l-276 340.8c-3.2998 4 -3.60059 9.7998 -0.700195 14.2002l100 147.199
c2.2002 3.40039 6 5.40039 10 5.40039h352zM444.7 400h-56.7998l51.6992 -96h68.4004zM242.6 400l-51.5996 -96h194l-51.7002 96h-90.7002zM131.3 400l-63.2998 -96h68.4004l51.6992 96h-56.7998zM88.2998 256l119.7 -160l-68.2998 160h-51.4004zM191.2 256l96.7998 -243.3
l96.7998 243.3h-193.6zM368 96l119.6 160h-51.3994z" />
    <glyph glyph-name="money-bill-alt" unicode="&#xf3d1;" horiz-adv-x="640" 
d="M320 304c53.0195 0 96 -50.1396 96 -112c0 -61.8701 -43 -112 -96 -112c-53.0195 0 -96 50.1504 -96 112c0 61.8604 42.9805 112 96 112zM360 136v16c0 4.41992 -3.58008 8 -8 8h-16v88c0 4.41992 -3.58008 8 -8 8h-13.5801h-0.000976562
c-4.01074 0 -9.97266 -1.80566 -13.3086 -4.03027l-15.3301 -10.2197c-1.96777 -1.30957 -3.56445 -4.29004 -3.56445 -6.65332c0 -1.33691 0.601562 -3.32422 1.34375 -4.43652l8.88086 -13.3105c1.30859 -1.9668 4.29004 -3.56445 6.65332 -3.56445
c1.33691 0 3.32422 0.602539 4.43652 1.34473l0.469727 0.310547v-55.4404h-16c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h64c4.41992 0 8 3.58008 8 8zM608 384c17.6699 0 32 -14.3301 32 -32v-320c0 -17.6699 -14.3301 -32 -32 -32h-576
c-17.6699 0 -32 14.3301 -32 32v320c0 17.6699 14.3301 32 32 32h576zM592 112v160c-35.3496 0 -64 28.6504 -64 64h-416c0 -35.3496 -28.6504 -64 -64 -64v-160c35.3496 0 64 -28.6504 64 -64h416c0 35.3496 28.6504 64 64 64z" />
    <glyph glyph-name="window-close" unicode="&#xf410;" 
d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM464 22v340c0 3.2998 -2.7002 6 -6 6h-404c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h404c3.2998 0 6 2.7002 6 6z
M356.5 253.4l-61.4004 -61.4004l61.4004 -61.4004c4.59961 -4.59961 4.59961 -12.0996 0 -16.7998l-22.2998 -22.2998c-4.60059 -4.59961 -12.1006 -4.59961 -16.7998 0l-61.4004 61.4004l-61.4004 -61.4004c-4.59961 -4.59961 -12.0996 -4.59961 -16.7998 0
l-22.2998 22.2998c-4.59961 4.60059 -4.59961 12.1006 0 16.7998l61.4004 61.4004l-61.4004 61.4004c-4.59961 4.59961 -4.59961 12.0996 0 16.7998l22.2998 22.2998c4.60059 4.59961 12.1006 4.59961 16.7998 0l61.4004 -61.4004l61.4004 61.4004
c4.59961 4.59961 12.0996 4.59961 16.7998 0l22.2998 -22.2998c4.7002 -4.60059 4.7002 -12.1006 0 -16.7998z" />
    <glyph glyph-name="comment-dots" unicode="&#xf4ad;" 
d="M144 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM256 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM368 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32
s-32 14.2998 -32 32s14.2998 32 32 32zM256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-32.7998 0 -64 5.2002 -92.9004 14.2998c-29.0996 -20.5996 -77.5996 -46.2998 -139.1 -46.2998c-9.59961 0 -18.2998 5.7002 -22.0996 14.5
c-3.80078 8.7998 -2 19 4.59961 26c0.5 0.400391 31.5 33.7998 46.4004 73.2002c-33 35.0996 -52.9004 78.7002 -52.9004 126.3c0 114.9 114.6 208 256 208zM256 48c114.7 0 208 71.7998 208 160s-93.2998 160 -208 160s-208 -71.7998 -208 -160
c0 -42.2002 21.7002 -74.0996 39.7998 -93.4004l20.6006 -21.7998l-10.6006 -28.0996c-5.5 -14.5 -12.5996 -28.1006 -19.8994 -40.2002c23.5996 7.59961 43.1992 18.9004 57.5 29l19.5 13.7998l22.6992 -7.2002c25.3008 -8 51.7002 -12.0996 78.4004 -12.0996z" />
    <glyph glyph-name="smile-wink" unicode="&#xf4da;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM365.8 138.4c10.2002 -8.5 11.6006 -23.6006 3.10059 -33.8008
c-30 -36 -74.1006 -56.5996 -120.9 -56.5996s-90.9004 20.5996 -120.9 56.5996c-8.39941 10.2002 -7.09961 25.3008 3.10059 33.8008c10.0996 8.39941 25.2998 7.09961 33.7998 -3.10059c20.7998 -25.0996 51.5 -39.3994 84 -39.3994s63.2002 14.3994 84 39.3994
c8.5 10.2002 23.5996 11.6006 33.7998 3.10059zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 268c25.7002 0 55.9004 -16.9004 59.7002 -42.0996c1.7998 -11.1006 -11.2998 -18.2002 -19.7998 -10.8008l-9.5 8.5
c-14.8008 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-8.30078 -7.39941 -21.5 -0.399414 -19.8008 10.8008c4 25.1992 34.2002 42.0996 59.9004 42.0996z" />
    <glyph glyph-name="angry" unicode="&#xf556;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM248 136c33.5996 0 65.2002 -14.7998 86.7998 -40.5996
c8.40039 -10.2002 7.10059 -25.3008 -3.09961 -33.8008c-10.6006 -8.89941 -25.7002 -6.69922 -33.7998 3c-24.8008 29.7002 -75 29.7002 -99.8008 0c-8.5 -10.1992 -23.5996 -11.5 -33.7998 -3s-11.5996 23.6006 -3.09961 33.8008
c21.5996 25.7998 53.2002 40.5996 86.7998 40.5996zM200 208c0 -17.7002 -14.2998 -32.0996 -32 -32.0996s-32 14.2998 -32 32c0 6.19922 2.2002 11.6992 5.2998 16.5996l-28.2002 8.5c-12.6992 3.7998 -19.8994 17.2002 -16.0996 29.9004
c3.7998 12.6992 17.0996 20 29.9004 16.0996l80 -24c12.6992 -3.7998 19.8994 -17.2002 16.0996 -29.9004c-3.09961 -10.3994 -12.7002 -17.0996 -23 -17.0996zM399 262.9c3.7998 -12.7002 -3.40039 -26.1006 -16.0996 -29.8008l-28.2002 -8.5
c3.09961 -4.89941 5.2998 -10.3994 5.2998 -16.5996c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32c-10.2998 0 -19.9004 6.7002 -23 17.0996c-3.7998 12.7002 3.40039 26.1006 16.0996 29.9004l80 24c12.8008 3.7998 26.1006 -3.40039 29.9004 -16.0996z" />
    <glyph glyph-name="dizzy" unicode="&#xf567;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM214.2 209.9
c-7.90039 -7.90039 -20.5 -7.90039 -28.4004 -0.200195l-17.7998 17.7998l-17.7998 -17.7998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0c-7.80078 7.7998 -7.80078 20.5 0 28.2998l17.8994 17.9004l-17.8994 17.8994c-7.80078 7.7998 -7.80078 20.5 0 28.2998
c7.7998 7.80078 20.5 7.80078 28.2998 0l17.7998 -17.7998l17.9004 17.9004c7.7998 7.7998 20.5 7.7998 28.2998 0s7.7998 -20.5 0 -28.2998l-17.9004 -17.9004l17.9004 -17.7998c7.7998 -7.7998 7.7998 -20.5 0 -28.2998zM374.2 302.1
c7.7002 -7.7998 7.7002 -20.3994 0 -28.1992l-17.9004 -17.9004l17.7998 -18c7.80078 -7.7998 7.80078 -20.5 0 -28.2998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0l-17.7998 17.7998l-17.7998 -17.7998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0
c-7.80078 7.7998 -7.80078 20.5 0 28.2998l17.8994 17.9004l-17.8994 17.8994c-7.80078 7.7998 -7.80078 20.5 0 28.2998c7.7998 7.80078 20.5 7.80078 28.2998 0l17.7998 -17.7998l17.9004 17.7998c7.7998 7.80078 20.5 7.80078 28.2998 0zM248 176
c35.2998 0 64 -28.7002 64 -64s-28.7002 -64 -64 -64s-64 28.7002 -64 64s28.7002 64 64 64z" />
    <glyph glyph-name="flushed" unicode="&#xf579;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM344 304c44.2002 0 80 -35.7998 80 -80s-35.7998 -80 -80 -80
s-80 35.7998 -80 80s35.7998 80 80 80zM344 176c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM344 248c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM232 224c0 -44.2002 -35.7998 -80 -80 -80
s-80 35.7998 -80 80s35.7998 80 80 80s80 -35.7998 80 -80zM152 176c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM152 248c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM312 104
c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-128c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h128z" />
    <glyph glyph-name="frown-open" unicode="&#xf57a;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM200 240c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32
s14.2998 32 32 32s32 -14.2998 32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM248 160c35.5996 0 88.7998 -21.2998 95.7998 -61.2002c2 -11.7998 -9.09961 -21.5996 -20.5 -18.0996
c-31.2002 9.59961 -59.3994 15.2998 -75.2998 15.2998s-44.0996 -5.7002 -75.2998 -15.2998c-11.5 -3.40039 -22.5 6.2998 -20.5 18.0996c7 39.9004 60.2002 61.2002 95.7998 61.2002z" />
    <glyph glyph-name="grimace" unicode="&#xf57f;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM344 192c26.5 0 48 -21.5 48 -48v-32c0 -26.5 -21.5 -48 -48 -48h-192c-26.5 0 -48 21.5 -48 48v32c0 26.5 21.5 48 48 48
h192zM176 96v24h-40v-8c0 -8.7998 7.2002 -16 16 -16h24zM176 136v24h-24c-8.7998 0 -16 -7.2002 -16 -16v-8h40zM240 96v24h-48v-24h48zM240 136v24h-48v-24h48zM304 96v24h-48v-24h48zM304 136v24h-48v-24h48zM360 112v8h-40v-24h24c8.7998 0 16 7.2002 16 16zM360 136v8
c0 8.7998 -7.2002 16 -16 16h-24v-24h40z" />
    <glyph glyph-name="grin" unicode="&#xf580;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 9.90039 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32z" />
    <glyph glyph-name="grin-alt" unicode="&#xf581;" horiz-adv-x="496" 
d="M200.3 200c-7.5 -11.4004 -24.5996 -12 -32.7002 0c-12.3994 18.7002 -15.1992 37.2998 -15.6992 56c0.599609 18.7002 3.2998 37.2998 15.6992 56c7.60059 11.4004 24.7002 12 32.7002 0c12.4004 -18.7002 15.2002 -37.2998 15.7002 -56
c-0.599609 -18.7002 -3.2998 -37.2998 -15.7002 -56zM328.3 200c-7.5 -11.4004 -24.5996 -12 -32.7002 0c-12.3994 18.7002 -15.1992 37.2998 -15.6992 56c0.599609 18.7002 3.2998 37.2998 15.6992 56c7.60059 11.4004 24.7002 12 32.7002 0
c12.4004 -18.7002 15.2002 -37.2998 15.7002 -56c-0.599609 -18.7002 -3.2998 -37.2998 -15.7002 -56zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200
s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006
s79.7002 4.7998 105.6 13.1006z" />
    <glyph glyph-name="grin-beam" unicode="&#xf582;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM117.7 216.3c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996
l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002zM277.7 216.3c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998
c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002z" />
    <glyph glyph-name="grin-beam-sweat" unicode="&#xf583;" horiz-adv-x="496" 
d="M440 288c-29.5 0 -53.2998 26.2998 -53.2998 58.7002c0 25 31.7002 75.5 46.2002 97.2998c3.5 5.2998 10.5996 5.2998 14.1992 0c14.5 -21.7998 46.2002 -72.2998 46.2002 -97.2998c0 -32.4004 -23.7998 -58.7002 -53.2998 -58.7002zM248 48
c-51.9004 0 -115.3 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-8 -47.0996 -71.3994 -80 -123.3 -80zM378.3 216.3
c-3.09961 -0.899414 -7.2002 0.100586 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998zM483.6 269.2c8 -24.2998 12.4004 -50.2002 12.4004 -77.2002c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248
c45.7002 0 88.4004 -12.5996 125.2 -34.2002c-10.9004 -21.5996 -15.5 -36.2002 -17.2002 -45.7002c-31.2002 20.1006 -68.2002 31.9004 -108 31.9004c-110.3 0 -200 -89.7002 -200 -200s89.7002 -200 200 -200s200 89.7002 200 200
c0 22.5 -3.90039 44.0996 -10.7998 64.2998c0.399414 0 21.7998 -2.7998 46.3994 12.9004zM168 258.6c-12.2998 0 -23.7998 -7.7998 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996z" />
    <glyph glyph-name="grin-hearts" unicode="&#xf584;" horiz-adv-x="496" 
d="M353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM200.8 192.3
l-70.2002 18.1006c-20.3994 5.2998 -31.8994 27 -24.1992 47.1992c6.69922 17.7002 26.6992 26.7002 44.8994 22l7.10059 -1.89941l2 7.09961c5.09961 18.1006 22.8994 30.9004 41.5 27.9004c21.3994 -3.40039 34.3994 -24.2002 28.7998 -44.5l-19.4004 -69.9004
c-1.2998 -4.5 -6 -7.2002 -10.5 -6zM389.6 257.6c7.7002 -20.1992 -3.7998 -41.7998 -24.1992 -47.0996l-70.2002 -18.2002c-4.60059 -1.2002 -9.2998 1.5 -10.5 6l-19.4004 69.9004c-5.59961 20.2998 7.40039 41.0996 28.7998 44.5c18.7002 3 36.5 -9.7998 41.5 -27.9004
l2 -7.09961l7.10059 1.89941c18.2002 4.7002 38.2002 -4.39941 44.8994 -22zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200
s89.7002 -200 200 -200z" />
    <glyph glyph-name="grin-squint" unicode="&#xf585;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 9.90039 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM118.9 184.2c-3.80078 4.39941 -3.90039 11 -0.100586 15.5l33.6006 40.2998
l-33.6006 40.2998c-3.7002 4.5 -3.7002 11 0.100586 15.5c3.89941 4.40039 10.1992 5.5 15.2998 2.5l80 -48c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998s-2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7002 -1.7002 -15.2998 2.5zM361.8 181.7
l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5.10059 2.90039 11.5 1.90039 15.2998 -2.5c3.80078 -4.5 3.90039 -11 0.100586 -15.5l-33.6006 -40.2998l33.6006 -40.2998c3.7002 -4.5 3.7002 -11 -0.100586 -15.5
c-3.59961 -4.2002 -9.89941 -5.7002 -15.2998 -2.5z" />
    <glyph glyph-name="grin-squint-tears" unicode="&#xf586;" 
d="M117.1 63.9004c6.30078 0.899414 11.7002 -4.5 10.9004 -10.9004c-3.7002 -25.7998 -13.7002 -84 -30.5996 -100.9c-22 -21.8994 -57.9004 -21.5 -80.3008 0.900391c-22.3994 22.4004 -22.7998 58.4004 -0.899414 80.2998
c16.8994 16.9004 75.0996 26.9004 100.899 30.6006zM75.9004 105.6c-19.6006 -3.89941 -35.1006 -8.09961 -47.3008 -12.1992c-39.2998 90.5996 -22.0996 199.899 52 274c48.5 48.3994 111.9 72.5996 175.4 72.5996c38.9004 0 77.7998 -9.2002 113.2 -27.4004
c-4 -12.1992 -8.2002 -28 -12 -48.2998c-30.4004 17.9004 -65 27.7002 -101.2 27.7002c-53.4004 0 -103.6 -20.7998 -141.4 -58.5996c-61.5996 -61.5 -74.2998 -153.4 -38.6992 -227.801zM428.2 293.2c20.2998 3.89941 36.2002 8 48.5 12
c47.8994 -93.2002 32.8994 -210.5 -45.2002 -288.601c-48.5 -48.3994 -111.9 -72.5996 -175.4 -72.5996c-33.6992 0 -67.2998 7 -98.6992 20.5996c4.19922 12.2002 8.2998 27.7002 12.1992 47.2002c26.6006 -12.7998 55.9004 -19.7998 86.4004 -19.7998
c53.4004 0 103.6 20.7998 141.4 58.5996c65.6992 65.7002 75.7998 166 30.7998 242.601zM394.9 320.1c-6.30078 -0.899414 -11.7002 4.5 -10.9004 10.9004c3.7002 25.7998 13.7002 84 30.5996 100.9c22 21.8994 57.9004 21.5 80.3008 -0.900391
c22.3994 -22.4004 22.7998 -58.4004 0.899414 -80.2998c-16.8994 -16.9004 -75.0996 -26.9004 -100.899 -30.6006zM207.9 211.8c3 -3 4.19922 -7.2998 3.19922 -11.5l-22.5996 -90.5c-1.40039 -5.39941 -6.2002 -9.09961 -11.7002 -9.09961h-0.899414
c-5.80078 0.5 -10.5 5.09961 -11 10.8994l-4.80078 52.3008l-52.2998 4.7998c-5.7998 0.5 -10.3994 5.2002 -10.8994 11c-0.400391 5.89941 3.39941 11.2002 9.09961 12.5996l90.5 22.7002c4.2002 1 8.40039 -0.200195 11.4004 -3.2002zM247.6 236.9
c-0.0996094 0 -6.39941 -1.80078 -11.3994 3.19922c-3 3 -4.2002 7.30078 -3.2002 11.4004l22.5996 90.5c1.40039 5.7002 7 9.2002 12.6006 9.09961c5.7998 -0.5 10.5 -5.09961 11 -10.8994l4.7998 -52.2998l52.2998 -4.80078c5.7998 -0.5 10.4004 -5.19922 10.9004 -11
c0.399414 -5.89941 -3.40039 -11.1992 -9.10059 -12.5996zM299.6 148.4c29.1006 29.0996 53 59.5996 65.3008 83.7998c4.89941 9.2998 17.5996 9.89941 23.3994 1.7002c27.7002 -38.9004 6.10059 -106.9 -30.5996 -143.7s-104.8 -58.2998 -143.7 -30.6006
c-8.2998 5.90039 -7.5 18.6006 1.7002 23.4004c24.2002 12.5 54.7998 36.2998 83.8994 65.4004z" />
    <glyph glyph-name="grin-stars" unicode="&#xf587;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM125.7 200.9l6.09961 34.8994l-25.3994 24.6006
c-4.60059 4.59961 -1.90039 12.2998 4.2998 13.1992l34.8994 5l15.5 31.6006c2.90039 5.7998 11 5.7998 13.9004 0l15.5 -31.6006l34.9004 -5c6.19922 -1 8.7998 -8.69922 4.2998 -13.1992l-25.4004 -24.6006l6 -34.8994c1 -6.2002 -5.39941 -11 -11 -7.90039
l-31.2998 16.2998l-31.2998 -16.2998c-5.60059 -3.09961 -12 1.7002 -11 7.90039zM385.4 273.6c6.19922 -1 8.89941 -8.59961 4.39941 -13.1992l-25.3994 -24.6006l6 -34.8994c1 -6.2002 -5.40039 -11 -11 -7.90039l-31.3008 16.2998l-31.2998 -16.2998
c-5.59961 -3.09961 -12 1.7002 -11 7.90039l6 34.8994l-25.3994 24.6006c-4.60059 4.59961 -1.90039 12.2998 4.2998 13.1992l34.8994 5l15.5 31.6006c2.90039 5.7998 11 5.7998 13.9004 0l15.5 -31.6006z" />
    <glyph glyph-name="grin-tears" unicode="&#xf588;" horiz-adv-x="640" 
d="M117.1 191.9c6.30078 0.899414 11.7002 -4.5 10.9004 -10.9004c-3.7002 -25.7998 -13.7002 -84 -30.5996 -100.9c-22 -21.8994 -57.9004 -21.5 -80.3008 0.900391c-22.3994 22.4004 -22.7998 58.4004 -0.899414 80.2998c16.8994 16.9004 75.0996 26.9004 100.899 30.6006
zM623.8 161.3c21.9004 -21.8994 21.5 -57.8994 -0.799805 -80.2002c-22.4004 -22.3994 -58.4004 -22.7998 -80.2998 -0.899414c-16.9004 16.8994 -26.9004 75.0996 -30.6006 100.899c-0.899414 6.30078 4.5 11.7002 10.8008 10.8008
c25.7998 -3.7002 84 -13.7002 100.899 -30.6006zM497.2 99.5996c12.3994 -37.2998 25.0996 -43.7998 28.2998 -46.5c-44.5996 -65.7998 -120 -109.1 -205.5 -109.1s-160.9 43.2998 -205.5 109.1c3.09961 2.60059 15.7998 9.10059 28.2998 46.5
c33.4004 -63.8994 100.3 -107.6 177.2 -107.6s143.8 43.7002 177.2 107.6zM122.7 223.5c-2.40039 0.299805 -5 2.5 -49.5 -6.90039c12.3994 125.4 118.1 223.4 246.8 223.4s234.4 -98 246.8 -223.5c-44.2998 9.40039 -47.3994 7.2002 -49.5 7
c-15.2002 95.2998 -97.7998 168.5 -197.3 168.5s-182.1 -73.2002 -197.3 -168.5zM320 48c-51.9004 0 -115.3 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996
c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-8 -47.0996 -71.3994 -80 -123.3 -80zM450.3 216.3c-3.09961 -0.899414 -7.2002 0.100586 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17
c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998zM240 258.6
c-12.2998 0 -23.7998 -7.7998 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004
c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996z" />
    <glyph glyph-name="grin-tongue" unicode="&#xf589;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0
l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200
s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996
s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998zM168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32
s14.2998 32 32 32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
    <glyph glyph-name="grin-tongue-squint" unicode="&#xf58a;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0
l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200
s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996
s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998zM377.1 295.8c3.80078 -4.39941 3.90039 -11 0.100586 -15.5l-33.6006 -40.2998
l33.6006 -40.2998c3.7002 -4.5 3.7002 -11 -0.100586 -15.5c-3.59961 -4.2002 -9.89941 -5.7002 -15.2998 -2.5l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5 3 11.5 1.90039 15.2998 -2.5zM214.2 250.3
c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998s-2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7002 -1.7002 -15.2998 2.5c-3.80078 4.5 -3.90039 11 -0.100586 15.5l33.6006 40.2998l-33.6006 40.2998c-3.7002 4.5 -3.7002 11 0.100586 15.5
c3.89941 4.5 10.2998 5.5 15.2998 2.5z" />
    <glyph glyph-name="grin-tongue-wink" unicode="&#xf58b;" horiz-adv-x="496" 
d="M152 268c25.7002 0 55.9004 -16.9004 59.7998 -42.0996c0.799805 -5 -1.7002 -10 -6.09961 -12.4004c-5.7002 -3.09961 -11.2002 -0.599609 -13.7002 1.59961l-9.5 8.5c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5
c-3.7998 -3.39941 -9.2998 -4 -13.7002 -1.59961c-4.39941 2.40039 -6.89941 7.40039 -6.09961 12.4004c3.89941 25.1992 34.0996 42.0996 59.7998 42.0996zM328 320c44.2002 0 80 -35.7998 80 -80s-35.7998 -80 -80 -80s-80 35.7998 -80 80s35.7998 80 80 80zM328 192
c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM328 264c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248z
M312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998
c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3
c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998
c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998z" />
    <glyph glyph-name="grin-wink" unicode="&#xf58c;" horiz-adv-x="496" 
d="M328 268c25.6904 0 55.8799 -16.9199 59.8701 -42.1201c1.72949 -11.0898 -11.3506 -18.2695 -19.8301 -10.8398l-9.5498 8.47949c-14.8105 13.1904 -46.1602 13.1904 -60.9707 0l-9.5498 -8.47949c-8.33008 -7.40039 -21.5801 -0.379883 -19.8301 10.8398
c3.98047 25.2002 34.1699 42.1201 59.8604 42.1201zM168 208c-17.6699 0 -32 14.3301 -32 32s14.3301 32 32 32s32 -14.3301 32 -32s-14.3301 -32 -32 -32zM353.55 143.36c10.04 3.13965 19.3906 -5.4502 17.71 -15.3408
c-7.92969 -47.1494 -71.3193 -80.0195 -123.26 -80.0195s-115.33 32.8701 -123.26 80.0195c-1.69043 9.9707 7.76953 18.4707 17.71 15.3408c25.9297 -8.31055 64.3994 -13.0605 105.55 -13.0605s79.6201 4.75977 105.55 13.0605zM248 440c136.97 0 248 -111.03 248 -248
s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM248 -8c110.28 0 200 89.7197 200 200s-89.7197 200 -200 200s-200 -89.7197 -200 -200s89.7197 -200 200 -200z" />
    <glyph glyph-name="kiss" unicode="&#xf596;" horiz-adv-x="496" 
d="M168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM304 140c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5
c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002
c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM248 440c137 0 248 -111 248 -248
s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z
" />
    <glyph glyph-name="kiss-beam" unicode="&#xf597;" horiz-adv-x="496" 
d="M168 296c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.299805 -3.7998 -2 -7.19922 -5.59961 -8.2998c-3.10059 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996c-12.3008 0 -23.8008 -7.89941 -31.5 -21.5996l-9.5 -17
c-1.80078 -3.2002 -5.80078 -4.7002 -9.30078 -3.7002c-3.59961 1.10059 -5.89941 4.60059 -5.59961 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8
c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM304 140c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5
c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002
c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM328 296
c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.299805 -3.7998 -2 -7.19922 -5.59961 -8.2998c-3.10059 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996c-12.3008 0 -23.8008 -7.89941 -31.5 -21.5996l-9.5 -17
c-1.80078 -3.2002 -5.80078 -4.7002 -9.30078 -3.7002c-3.59961 1.10059 -5.89941 4.60059 -5.59961 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004z" />
    <glyph glyph-name="kiss-wink-heart" unicode="&#xf598;" horiz-adv-x="504" 
d="M304 139.5c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002
c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002
c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM374.5 223c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-2.5 -2.2998 -7.90039 -4.7002 -13.7002 -1.59961c-4.39941 2.39941 -6.89941 7.39941 -6.09961 12.3994
c3.89941 25.2002 34.2002 42.1006 59.7998 42.1006s55.7998 -16.9004 59.7998 -42.1006c0.799805 -5 -1.7002 -10 -6.09961 -12.3994c-4.40039 -2.40039 -9.90039 -1.7002 -13.7002 1.59961zM136 239.5c0 17.7002 14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32
s-32 14.2998 -32 32zM501.1 45.5c9.2002 -23.9004 -4.39941 -49.4004 -28.5 -55.7002l-83 -21.5c-5.39941 -1.39941 -10.8994 1.7998 -12.3994 7.10059l-22.9004 82.5996c-6.59961 24 8.7998 48.5996 34 52.5996c22 3.5 43.1006 -11.5996 49 -33l2.2998 -8.39941
l8.40039 2.2002c21.5996 5.59961 45.0996 -5.10059 53.0996 -25.9004zM334 11.7002c17.7002 -64 10.9004 -39.5 13.4004 -46.7998c-30.5 -13.4004 -64 -20.9004 -99.4004 -20.9004c-137 0 -248 111 -248 248s111 248 248 248s248 -111 247.9 -248
c0 -31.7998 -6.2002 -62.0996 -17.1006 -90c-6 1.5 -12.2002 2.7998 -18.5996 2.90039c-5.60059 9.69922 -13.6006 17.5 -22.6006 23.8994c6.7002 19.9004 10.4004 41.1006 10.4004 63.2002c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200
c30.7998 0 59.9004 7.2002 86 19.7002z" />
    <glyph glyph-name="laugh" unicode="&#xf599;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 224c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM168 224
c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
    <glyph glyph-name="laugh-beam" unicode="&#xf59a;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 296c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.700195 -8.5 -10.7998 -11.8994 -14.8994 -4.5
l-9.5 17c-7.7002 13.7002 -19.2002 21.6006 -31.5 21.6006c-12.3008 0 -23.8008 -7.90039 -31.5 -21.6006l-9.5 -17c-4.10059 -7.39941 -15.6006 -4.09961 -14.9004 4.5c3.2998 42.1006 32.2002 71.4004 56 71.4004zM127 220.1c-4.2002 -7.39941 -15.7002 -4 -15.0996 4.5
c3.2998 42.1006 32.1992 71.4004 56 71.4004c23.7998 0 52.6992 -29.2998 56 -71.4004c0.699219 -8.5 -10.8008 -11.8994 -14.9004 -4.5l-9.5 17c-7.7002 13.7002 -19.2002 21.6006 -31.5 21.6006s-23.7998 -7.90039 -31.5 -21.6006zM362.4 160c8.19922 0 14.5 -7 13.5 -15
c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
    <glyph glyph-name="laugh-squint" unicode="&#xf59b;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM343.6 252l33.6006 -40.2998c8.59961 -10.4004 -3.90039 -24.7998 -15.4004 -18l-80 48
c-7.7998 4.7002 -7.7998 15.8994 0 20.5996l80 48c11.6006 6.7998 24 -7.7002 15.4004 -18zM134.2 193.7c-11.6006 -6.7998 -24.1006 7.59961 -15.4004 18l33.6006 40.2998l-33.6006 40.2998c-8.59961 10.2998 3.7998 24.9004 15.4004 18l80 -48
c7.7998 -4.7002 7.7998 -15.8994 0 -20.5996zM362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
    <glyph glyph-name="laugh-wink" unicode="&#xf59c;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 284c25.7002 0 55.9004 -16.9004 59.7002 -42.0996c1.7998 -11.1006 -11.2998 -18.2002 -19.7998 -10.8008
l-9.5 8.5c-14.8008 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-8.30078 -7.39941 -21.5 -0.399414 -19.8008 10.8008c4 25.1992 34.2002 42.0996 59.9004 42.0996zM168 224c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32z
M362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
    <glyph glyph-name="meh-blank" unicode="&#xf5a4;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32
s-32 14.2998 -32 32s14.2998 32 32 32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
    <glyph glyph-name="meh-rolling-eyes" unicode="&#xf5a5;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM336 296c39.7998 0 72 -32.2002 72 -72s-32.2002 -72 -72 -72
s-72 32.2002 -72 72s32.2002 72 72 72zM336 184c22.0996 0 40 17.9004 40 40c0 13.5996 -7.2998 25.0996 -17.7002 32.2998c1 -2.59961 1.7002 -5.39941 1.7002 -8.2998c0 -13.2998 -10.7002 -24 -24 -24s-24 10.7002 -24 24c0 3 0.700195 5.7002 1.7002 8.2998
c-10.4004 -7.2002 -17.7002 -18.7002 -17.7002 -32.2998c0 -22.0996 17.9004 -40 40 -40zM232 224c0 -39.7998 -32.2002 -72 -72 -72s-72 32.2002 -72 72s32.2002 72 72 72s72 -32.2002 72 -72zM120 224c0 -22.0996 17.9004 -40 40 -40s40 17.9004 40 40
c0 13.5996 -7.2998 25.0996 -17.7002 32.2998c1 -2.59961 1.7002 -5.39941 1.7002 -8.2998c0 -13.2998 -10.7002 -24 -24 -24s-24 10.7002 -24 24c0 3 0.700195 5.7002 1.7002 8.2998c-10.4004 -7.2002 -17.7002 -18.7002 -17.7002 -32.2998zM312 96
c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-128c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h128z" />
    <glyph glyph-name="sad-cry" unicode="&#xf5b3;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM392 53.5996c34.5996 35.9004 56 84.7002 56 138.4c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -53.7002 21.4004 -102.4 56 -138.4v114.4
c0 13.2002 10.7998 24 24 24s24 -10.7998 24 -24v-151.4c28.5 -15.5996 61.2002 -24.5996 96 -24.5996s67.5 9 96 24.5996v151.4c0 13.2002 10.7998 24 24 24s24 -10.7998 24 -24v-114.4zM205.8 213.5c-5.7998 -3.2002 -11.2002 -0.700195 -13.7002 1.59961l-9.5 8.5
c-14.7998 13.2002 -46.1992 13.2002 -61 0l-9.5 -8.5c-3.7998 -3.39941 -9.2998 -4 -13.6992 -1.59961c-4.40039 2.40039 -6.90039 7.40039 -6.10059 12.4004c3.90039 25.1992 34.2002 42.0996 59.7998 42.0996c25.6006 0 55.8008 -16.9004 59.8008 -42.0996
c0.799805 -5 -1.7002 -10 -6.10059 -12.4004zM344 268c25.7002 0 55.9004 -16.9004 59.7998 -42.0996c0.799805 -5 -1.7002 -10 -6.09961 -12.4004c-5.7002 -3.09961 -11.2002 -0.599609 -13.7002 1.59961l-9.5 8.5c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5
c-3.7998 -3.39941 -9.2002 -4 -13.7002 -1.59961c-4.39941 2.40039 -6.89941 7.40039 -6.09961 12.4004c3.89941 25.1992 34.0996 42.0996 59.7998 42.0996zM248 176c30.9004 0 56 -28.7002 56 -64s-25.0996 -64 -56 -64s-56 28.7002 -56 64s25.0996 64 56 64z" />
    <glyph glyph-name="sad-tear" unicode="&#xf5b4;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM256 144c38.0996 0 74 -16.7998 98.5 -46.0996
c8.5 -10.2002 7.09961 -25.3008 -3.09961 -33.8008c-10.6006 -8.7998 -25.7002 -6.69922 -33.8008 3.10059c-15.2998 18.2998 -37.7998 28.7998 -61.5996 28.7998c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM162.4 173.2c2.7998 3.7002 8.39941 3.7002 11.1992 0c11.4004 -15.2998 36.4004 -50.6006 36.4004 -68.1006
c0 -22.6992 -18.7998 -41.0996 -42 -41.0996s-42 18.4004 -42 41.0996c0 17.5 25 52.8008 36.4004 68.1006z" />
    <glyph glyph-name="smile-beam" unicode="&#xf5b8;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM332 135.4c8.5 10.1992 23.5996 11.5 33.7998 3.09961
c10.2002 -8.5 11.6006 -23.5996 3.10059 -33.7998c-30 -36 -74.1006 -56.6006 -120.9 -56.6006s-90.9004 20.6006 -120.9 56.6006c-8.39941 10.2002 -7.09961 25.2998 3.10059 33.7998c10.2002 8.40039 25.2998 7.09961 33.7998 -3.09961
c20.7998 -25.1006 51.5 -39.4004 84 -39.4004s63.2002 14.4004 84 39.4004zM136.5 237l-9.5 -17c-1.90039 -3.2002 -5.90039 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004
c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996zM328 296c23.7998 0 52.7002 -29.2998 56 -71.4004
c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002
c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004z" />
    <glyph glyph-name="surprise" unicode="&#xf5c2;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM248 168c35.2998 0 64 -28.7002 64 -64s-28.7002 -64 -64 -64
s-64 28.7002 -64 64s28.7002 64 64 64zM200 240c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
    <glyph glyph-name="tired" unicode="&#xf5c8;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM377.1 295.8c3.80078 -4.39941 3.90039 -11 0.100586 -15.5
l-33.6006 -40.2998l33.6006 -40.2998c3.7998 -4.5 3.7002 -11 -0.100586 -15.5c-3.5 -4.10059 -9.89941 -5.7002 -15.2998 -2.5l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5 2.90039 11.5 1.90039 15.2998 -2.5z
M220 240c0 -4.2002 -2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7998 -1.60059 -15.2998 2.5c-3.80078 4.5 -3.90039 11 -0.100586 15.5l33.6006 40.2998l-33.6006 40.2998c-3.7998 4.5 -3.7002 11 0.100586 15.5
c3.7998 4.40039 10.2998 5.5 15.2998 2.5l80 -48c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998zM248 176c45.4004 0 100.9 -38.2998 107.8 -93.2998c1.5 -11.9004 -7 -21.6006 -15.5 -17.9004c-22.7002 9.7002 -56.2998 15.2002 -92.2998 15.2002
s-69.5996 -5.5 -92.2998 -15.2002c-8.60059 -3.7002 -17 6.10059 -15.5 17.9004c6.89941 55 62.3994 93.2998 107.8 93.2998z" />
  </font>
</defs></svg>

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.ttf.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff2.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.eot.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.svg.





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
<?xml version="1.0" standalone="no"?>
<!--
Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
-->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata>
Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020
 By Robert Madole
Copyright (c) Font Awesome
</metadata>
<defs>
<font id="FontAwesome5Free-Solid" horiz-adv-x="512" >
  <font-face 
    font-family="Font Awesome 5 Free Solid"
    font-weight="900"
    font-stretch="normal"
    units-per-em="512"
    panose-1="2 0 5 3 0 0 0 0 0 0"
    ascent="448"
    descent="-64"
    bbox="-0.983398 -64.9834 640.104 448.427"
    underline-thickness="25"
    underline-position="-50"
    unicode-range="U+0020-F976"
  />
    <missing-glyph />
    <glyph glyph-name="glass-martini" unicode="&#xf000;" 
d="M502.05 390.4l-214.05 -214.04v-192.36h56c22.0898 0 40 -17.9102 40 -40c0 -4.41992 -3.58008 -8 -8 -8h-240c-4.41992 0 -8 3.58008 -8 8c0 22.0898 17.9102 40 40 40h56v192.36l-214.05 214.04c-21.25 21.2598 -6.2002 57.5996 23.8496 57.5996h444.4
c30.0498 0 45.0996 -36.3398 23.8496 -57.5996z" />
    <glyph glyph-name="music" unicode="&#xf001;" 
d="M470.38 446.49c2.59277 0.816406 6.90234 1.48047 9.62012 1.48047c17.6475 0 31.9834 -14.3232 32 -31.9707v-352c0 -35.3496 -43 -64 -96 -64s-96 28.6602 -96 64s43 64 96 64c8.95898 -0.0488281 23.2949 -1.80957 32 -3.92969v184.609l-256 -75v-233.68
c0 -35.3398 -43 -64 -96 -64s-96 28.6602 -96 64s43 64 96 64c8.95801 -0.0507812 23.2939 -1.80664 32 -3.91992v261.41c0.0078125 12.958 10.0479 26.626 22.4102 30.5098z" />
    <glyph glyph-name="search" unicode="&#xf002;" 
d="M505 5.2998c9.2998 -9.39941 9.2998 -24.5996 -0.0996094 -34l-28.3008 -28.2998c-9.2998 -9.40039 -24.5 -9.40039 -33.8994 0l-99.7002 99.7002c-4.5 4.5 -7 10.5996 -7 17v16.2998c-35.2998 -27.5996 -79.7002 -44 -128 -44c-114.9 0 -208 93.0996 -208 208
s93.0996 208 208 208s208 -93.0996 208 -208c0 -48.2998 -16.4004 -92.7002 -44 -128h16.2998c6.40039 0 12.5 -2.5 17 -7zM208 112c70.7998 0 128 57.2998 128 128c0 70.7998 -57.2998 128 -128 128c-70.7998 0 -128 -57.2998 -128 -128c0 -70.7998 57.2998 -128 128 -128z
" />
    <glyph glyph-name="heart" unicode="&#xf004;" 
d="M462.3 385.4c62.7998 -53.6006 66.1006 -149.801 9.7998 -207.9l-193.5 -199.8c-12.5 -12.9004 -32.7998 -12.9004 -45.2998 0l-193.5 199.8c-56.2002 58.0996 -52.8994 154.3 9.90039 207.9c54.7998 46.6992 136.399 38.2998 186.6 -13.6006l19.7002 -20.2998
l19.7002 20.2998c50.2998 51.9004 131.8 60.2998 186.6 13.6006z" />
    <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="576" 
d="M259.3 430.2c11.7998 23.8994 45.7002 23.5996 57.4004 0l65.2998 -132.4l146.1 -21.2998c26.2002 -3.7998 36.7002 -36.0996 17.7002 -54.5996l-105.7 -103l25 -145.5c4.5 -26.3008 -23.1992 -45.9004 -46.3994 -33.7002l-130.7 68.7002l-130.7 -68.7002
c-23.2002 -12.2998 -50.8994 7.39941 -46.3994 33.7002l25 145.5l-105.7 103c-19 18.5 -8.5 50.7998 17.7002 54.5996l146.1 21.2998z" />
    <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="448" 
d="M224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM313.6 160c74.2002 0 134.4 -60.2002 134.4 -134.4v-41.5996c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v41.5996
c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992z" />
    <glyph glyph-name="film" unicode="&#xf008;" 
d="M488 384c13.2998 0 24 -10.7002 24 -24v-336c0 -13.2998 -10.7002 -24 -24 -24h-8v20c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-20h-320v20c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-20h-8
c-13.2998 0 -24 10.7002 -24 24v336c0 13.2998 10.7002 24 24 24h8v-20c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v20h320v-20c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v20h8zM96 76v40c0 6.59961 -5.40039 12 -12 12h-40
c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM96 172v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM96 268v40
c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM368 60v96c0 6.59961 -5.40039 12 -12 12h-200c-6.59961 0 -12 -5.40039 -12 -12v-96c0 -6.59961 5.40039 -12 12 -12h200
c6.59961 0 12 5.40039 12 12zM368 228v96c0 6.59961 -5.40039 12 -12 12h-200c-6.59961 0 -12 -5.40039 -12 -12v-96c0 -6.59961 5.40039 -12 12 -12h200c6.59961 0 12 5.40039 12 12zM480 76v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40
c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM480 172v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM480 268v40c0 6.59961 -5.40039 12 -12 12h-40
c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12z" />
    <glyph glyph-name="th-large" unicode="&#xf009;" 
d="M296 416h192c13.2549 0 24 -10.7451 24 -24v-160c0 -13.2549 -10.7451 -24 -24 -24h-192c-13.2549 0 -24 10.7451 -24 24v160c0 13.2549 10.7451 24 24 24zM216 416c13.2549 0 24 -10.7451 24 -24v-160c0 -13.2549 -10.7451 -24 -24 -24h-192
c-13.2549 0 -24 10.7451 -24 24v160c0 13.2549 10.7451 24 24 24h192zM0 152c0 13.2549 10.7451 24 24 24h192c13.2549 0 24 -10.7451 24 -24v-160c0 -13.2549 -10.7451 -24 -24 -24h-192c-13.2549 0 -24 10.7451 -24 24v160zM296 -32c-13.2549 0 -24 10.7451 -24 24v160
c0 13.2549 10.7451 24 24 24h192c13.2549 0 24 -10.7451 24 -24v-160c0 -13.2549 -10.7451 -24 -24 -24h-192z" />
    <glyph glyph-name="th" unicode="&#xf00a;" 
d="M149.333 392v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h101.333c13.2549 0 24 -10.7451 24 -24zM330.667 152c0 -13.2549 -10.7451 -24 -24.001 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80
c0 13.2549 10.7451 24 24 24h101.334c13.2549 0 24 -10.7451 24 -24v-80zM362.667 392c0 13.2549 10.7451 24 24 24h101.333c13.2549 0 24 -10.7451 24 -24v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80zM330.667 312
c0 -13.2549 -10.7451 -24 -24.001 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h101.334c13.2549 0 24 -10.7451 24 -24v-80zM125.333 256c13.2549 0 24 -10.7451 24 -24v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333
c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h101.333zM0 72c0 13.2549 10.7451 24 24 24h101.333c13.2549 0 24 -10.7451 24 -24v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80zM386.667 128
c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h101.333c13.2549 0 24 -10.7451 24 -24v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333zM386.667 -32c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h101.333c13.2549 0 24 -10.7451 24 -24
v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333zM181.333 72c0 13.2549 10.7451 24 24 24h101.333c13.2549 0 24 -10.7451 24 -24v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80z" />
    <glyph glyph-name="th-list" unicode="&#xf00b;" 
d="M149.333 232v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h101.333c13.2549 0 24 -10.7451 24 -24zM0 72c0 13.2549 10.7451 24 24 24h101.333c13.2549 0 24 -10.7451 24 -24v-80
c0 -13.2549 -10.7451 -24 -24 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80zM125.333 416c13.2549 0 24 -10.7451 24 -24v-80c0 -13.2549 -10.7451 -24 -24 -24h-101.333c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h101.333zM205.333 -32
c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h282.667c13.2549 0 24 -10.7451 24 -24v-80c0 -13.2549 -10.7451 -24 -24 -24h-282.667zM181.333 392c0 13.2549 10.7451 24 24 24h282.667c13.2549 0 24 -10.7451 24 -24v-80
c0 -13.2549 -10.7451 -24 -24 -24h-282.667c-13.2549 0 -24 10.7451 -24 24v80zM205.333 128c-13.2549 0 -24 10.7451 -24 24v80c0 13.2549 10.7451 24 24 24h282.667c13.2549 0 24 -10.7451 24 -24v-80c0 -13.2549 -10.7451 -24 -24 -24h-282.667z" />
    <glyph glyph-name="check" unicode="&#xf00c;" 
d="M173.898 8.5957l-166.4 166.4c-9.99707 9.99707 -9.99707 26.2061 0 36.2041l36.2031 36.2041c9.99707 9.99805 26.207 9.99805 36.2041 0l112.095 -112.095l240.095 240.095c9.99707 9.99707 26.207 9.99707 36.2041 0l36.2031 -36.2041
c9.99707 -9.99707 9.99707 -26.2061 0 -36.2041l-294.4 -294.401c-9.99805 -9.99707 -26.207 -9.99707 -36.2031 0.000976562z" />
    <glyph glyph-name="times" unicode="&#xf00d;" horiz-adv-x="352" 
d="M242.72 192l100.07 -100.07c12.2803 -12.29 12.2803 -32.1992 0 -44.4795l-22.2402 -22.2402c-12.2803 -12.2803 -32.2002 -12.2803 -44.4795 0l-100.07 100.07l-100.07 -100.07c-12.2793 -12.2803 -32.1992 -12.2803 -44.4795 0l-22.2402 22.2402
c-12.2803 12.29 -12.2803 32.2002 0 44.4795l100.07 100.07l-100.07 100.07c-12.2803 12.29 -12.2803 32.1992 0 44.4795l22.2402 22.2402c12.29 12.2803 32.2002 12.2803 44.4795 0l100.07 -100.07l100.07 100.07c12.29 12.2803 32.1992 12.2803 44.4795 0
l22.2402 -22.2402c12.2803 -12.29 12.2803 -32.2002 0 -44.4795z" />
    <glyph glyph-name="search-plus" unicode="&#xf00e;" 
d="M304 256v-32c0 -6.59961 -5.40039 -12 -12 -12h-56v-56c0 -6.59961 -5.40039 -12 -12 -12h-32c-6.59961 0 -12 5.40039 -12 12v56h-56c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h56v56c0 6.59961 5.40039 12 12 12h32c6.59961 0 12 -5.40039 12 -12
v-56h56c6.59961 0 12 -5.40039 12 -12zM505 -28.7002l-28.2998 -28.2998c-9.40039 -9.40039 -24.6006 -9.40039 -33.9004 0l-99.7998 99.7002c-4.5 4.5 -7 10.5996 -7 17v16.2998c-35.2998 -27.5996 -79.7002 -44 -128 -44c-114.9 0 -208 93.0996 -208 208
s93.0996 208 208 208s208 -93.0996 208 -208c0 -48.2998 -16.4004 -92.7002 -44 -128h16.2998c6.40039 0 12.5 -2.5 17 -7l99.7002 -99.7002c9.2998 -9.39941 9.2998 -24.5996 0 -34zM344 240c0 75.2002 -60.7998 136 -136 136s-136 -60.7998 -136 -136
s60.7998 -136 136 -136s136 60.7998 136 136z" />
    <glyph glyph-name="search-minus" unicode="&#xf010;" 
d="M304 256v-32c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h168c6.59961 0 12 -5.40039 12 -12zM505 -28.7002l-28.2998 -28.2998c-9.40039 -9.40039 -24.6006 -9.40039 -33.9004 0l-99.7998 99.7002
c-4.5 4.5 -7 10.5996 -7 17v16.2998c-35.2998 -27.5996 -79.7002 -44 -128 -44c-114.9 0 -208 93.0996 -208 208s93.0996 208 208 208s208 -93.0996 208 -208c0 -48.2998 -16.4004 -92.7002 -44 -128h16.2998c6.40039 0 12.5 -2.5 17 -7l99.7002 -99.7002
c9.2998 -9.39941 9.2998 -24.5996 0 -34zM344 240c0 75.2002 -60.7998 136 -136 136s-136 -60.7998 -136 -136s60.7998 -136 136 -136s136 60.7998 136 136z" />
    <glyph glyph-name="power-off" unicode="&#xf011;" 
d="M400 393.9c63 -45 104 -118.601 104 -201.9c0 -136.8 -110.8 -247.7 -247.5 -248c-136.5 -0.299805 -248.3 111 -248.5 247.6c-0.0996094 83.3008 40.9004 157.101 103.8 202.2c11.7002 8.2998 28 4.7998 35 -7.7002l15.7998 -28.0996
c5.90039 -10.5 3.10059 -23.7998 -6.59961 -31c-41.5 -30.7998 -68 -79.5996 -68 -134.9c-0.0996094 -92.2998 74.5 -168.1 168 -168.1c91.5996 0 168.6 74.2002 168 169.1c-0.299805 51.8008 -24.7002 101.801 -68.0996 134c-9.7002 7.2002 -12.4004 20.5 -6.5 30.9004
l15.7998 28.0996c7 12.4004 23.2002 16.1006 34.7998 7.80078zM296 184c0 -13.2998 -10.7002 -24 -24 -24h-32c-13.2998 0 -24 10.7002 -24 24v240c0 13.2998 10.7002 24 24 24h32c13.2998 0 24 -10.7002 24 -24v-240z" />
    <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="640" 
d="M216 160c8.83984 0 16 -7.16016 16 -16v-192c0 -8.83984 -7.16016 -16 -16 -16h-48c-8.83984 0 -16 7.16016 -16 16v192c0 8.83984 7.16016 16 16 16h48zM88 64c8.83984 0 16 -7.16016 16 -16v-96c0 -8.83984 -7.16016 -16 -16 -16h-48c-8.83984 0 -16 7.16016 -16 16v96
c0 8.83984 7.16016 16 16 16h48zM344 256c8.83984 0 16 -7.16016 16 -16v-288c0 -8.83984 -7.16016 -16 -16 -16h-48c-8.83984 0 -16 7.16016 -16 16v288c0 8.83984 7.16016 16 16 16h48zM472 352c8.83984 0 16 -7.16016 16 -16v-384c0 -8.83984 -7.16016 -16 -16 -16h-48
c-8.83984 0 -16 7.16016 -16 16v384c0 8.83984 7.16016 16 16 16h48zM600 448c8.83984 0 16 -7.16016 16 -16v-480c0 -8.83984 -7.16016 -16 -16 -16h-48c-8.83984 0 -16 7.16016 -16 16v480c0 8.83984 7.16016 16 16 16h48z" />
    <glyph glyph-name="cog" unicode="&#xf013;" 
d="M487.4 132.3c4.89941 -2.7998 7.09961 -8.59961 5.59961 -14.0996c-11.0996 -35.7002 -30 -67.9004 -54.7002 -94.6006c-3.7998 -4.19922 -9.89941 -5.09961 -14.7998 -2.2998l-42.5996 24.6006c-18 -15.3008 -38.6006 -27.2002 -60.8008 -35.1006v-49.2002
c0 -5.59961 -3.89941 -10.5 -9.39941 -11.6992c-34.9004 -7.80078 -72.5 -8.2002 -109.2 0c-5.5 1.19922 -9.40039 6.09961 -9.40039 11.6992v49.2002c-22.2998 7.7998 -42.8994 19.7002 -60.7998 35.1006l-42.5996 -24.6006c-4.7998 -2.7998 -11 -1.7998 -14.7998 2.2998
c-24.7002 26.8008 -43.6006 59 -54.7002 94.6006c-1.60059 5.39941 0.599609 11.2002 5.5 14l42.5996 24.5996c-4.2998 23.2002 -4.2998 47 0 70.2002l-42.5996 24.5996c-4.90039 2.80078 -7.2002 8.60059 -5.5 14c11.0996 35.7002 30 67.9004 54.7002 94.6006
c3.7998 4.2002 9.89941 5.09961 14.7998 2.2998l42.5 -24.5996c18 15.2998 38.5996 27.1992 60.7998 35.0996v49.2002c0 5.59961 3.90039 10.5 9.40039 11.7002c34.8994 7.7998 72.5 8.19922 109.199 0c5.5 -1.2002 9.40039 -6.10059 9.40039 -11.7002v-49.1006
c22.2998 -7.7998 42.9004 -19.6992 60.7998 -35.0996l42.6006 24.5996c4.7998 2.80078 11 1.80078 14.7998 -2.2998c24.7002 -26.7998 43.5996 -59 54.7002 -94.5996c1.59961 -5.40039 -0.600586 -11.2002 -5.5 -14l-42.6006 -24.6006
c4.2998 -23.1992 4.2998 -47 0 -70.1992zM256 112c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80s35.9004 -80 80 -80z" />
    <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="576" 
d="M280.37 299.74c1.84863 1.49023 5.27539 2.69922 7.64941 2.69922c2.375 0 5.80176 -1.20898 7.65039 -2.69922l184.33 -151.74v-164c0 -8.83203 -7.16797 -16 -16 -16l-112.02 0.30957h-0.000976562c-8.83203 0 -16 7.16797 -16 16
c0 0.0146484 0 0.0371094 0.000976562 0.0507812v95.6396c0 8.83203 -7.16895 16 -16 16h-64c-8.83203 0 -16 -7.16797 -16 -16v-95.71v0c0 -8.78809 -7.13281 -15.9561 -15.9209 -16l-112.06 -0.290039c-8.83203 0 -16 7.16797 -16 16v163.89zM571.6 196.53
c2.44531 -1.98828 4.42969 -6.15918 4.42969 -9.31055c0 -2.37305 -1.22266 -5.78613 -2.72949 -7.62012l-25.5 -31c-1.98633 -2.40332 -6.13086 -4.35449 -9.24902 -4.35449c-2.38574 0 -5.81348 1.23438 -7.65039 2.75488l-235.23 193.74
c-1.84863 1.49023 -5.27539 2.69922 -7.65039 2.69922c-2.37402 0 -5.80078 -1.20898 -7.64941 -2.69922l-235.22 -193.74c-1.83691 -1.5166 -5.26074 -2.74805 -7.64258 -2.74805c-3.12793 0 -7.28027 1.96191 -9.26758 4.37793l-25.5 31
c-1.52051 1.83789 -2.75488 5.26562 -2.75488 7.65039c0 3.11914 1.95117 7.2627 4.35449 9.25l253.13 208.47c7.33594 6.03613 21 10.9355 30.5 10.9355c9.50098 0 23.1641 -4.89941 30.5 -10.9355l89.5303 -73.6602v72.6104c0 6.62402 5.37598 12 12 12h56
c6.62402 0 12 -5.37598 12 -12v-138.51z" />
    <glyph glyph-name="clock" unicode="&#xf017;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM348.49 127c1.94043 2.4209 3.51465 6.90332 3.51465 10.0059c0 4.24512 -2.69043 9.84277 -6.00488 12.4941l-58 42.5v144c0 8.83203 -7.16797 16 -16 16h-32
c-8.83203 0 -16 -7.16797 -16 -16v-155.55v-0.00488281c0 -10.6074 6.71973 -24.5957 15 -31.2256l67 -49.7197v0c2.41895 -1.93555 6.89746 -3.50586 9.99512 -3.50586c4.24512 0 9.84277 2.69043 12.4951 6.00586l20 25v0z" />
    <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="576" 
d="M573.19 45.3301c9.25977 -21.1904 -5.5 -45.3301 -27.7305 -45.3301h-196.84l-10.3105 97.6797c-0.859375 8.14062 -7.71973 14.3203 -15.9092 14.3203h-68.8008c-8.18945 0 -15.0498 -6.17969 -15.9092 -14.3203l-10.3105 -97.6797h-196.84
c-22.2305 0 -36.9902 24.1396 -27.7402 45.3301l139.79 320c4.96973 11.3799 15.7998 18.6699 27.7305 18.6699h97.5898l-2.4502 -23.1602c-0.5 -4.71973 3.20996 -8.83984 7.95996 -8.83984h29.1602c4.75 0 8.45996 4.12012 7.95996 8.83984l-2.4502 23.1602h97.5898
c11.9199 0 22.75 -7.29004 27.7207 -18.6699zM260.4 312.84l-4.59082 -43.5801c-0.75 -7.08984 4.80078 -13.2598 11.9307 -13.2598h40.54c7.12012 0 12.6797 6.16992 11.9297 13.2598l-4.59961 43.5801c-0.430664 4.07031 -3.87012 7.16016 -7.95996 7.16016h-39.29
h-0.00488281c-3.97363 0 -7.53809 -3.20801 -7.95508 -7.16016zM315.64 144c9.5 0 16.9102 8.23047 15.9102 17.6797l-5.06934 48c-0.860352 8.14062 -7.7207 14.3203 -15.9102 14.3203h-45.1504c-8.18945 0 -15.0498 -6.17969 -15.9102 -14.3203l-5.06934 -48
c-1 -9.44922 6.40918 -17.6797 15.9092 -17.6797h55.29z" />
    <glyph glyph-name="download" unicode="&#xf019;" 
d="M216 448h80c13.2998 0 24 -10.7002 24 -24v-168h87.7002c17.7998 0 26.7002 -21.5 14.0996 -34.0996l-152.1 -152.2c-7.5 -7.5 -19.7998 -7.5 -27.2998 0l-152.301 152.2c-12.5996 12.5996 -3.69922 34.0996 14.1006 34.0996h87.7998v168c0 13.2998 10.7002 24 24 24z
M512 72v-112c0 -13.2998 -10.7002 -24 -24 -24h-464c-13.2998 0 -24 10.7002 -24 24v112c0 13.2998 10.7002 24 24 24h146.7l49 -49c20.0996 -20.0996 52.5 -20.0996 72.5996 0l49 49h146.7c13.2998 0 24 -10.7002 24 -24zM388 -16c0 11 -9 20 -20 20s-20 -9 -20 -20
s9 -20 20 -20s20 9 20 20zM452 -16c0 11 -9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20s20 9 20 20z" />
    <glyph glyph-name="inbox" unicode="&#xf01c;" horiz-adv-x="576" 
d="M567.938 204.092c4.4502 -6.6748 8.06152 -18.6025 8.06152 -26.624v-0.000976562v-129.467c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v129.467v0.000976562c0 8.02148 3.61133 19.9492 8.06152 26.624l105.689 158.534
c7.86621 11.7988 25.7578 21.374 39.9385 21.374h268.621c14.1807 0 32.0732 -9.57617 39.9395 -21.374zM162.252 320l-85.334 -128h123.082l32 -64h112l32 64h123.082l-85.333 128h-251.497z" />
    <glyph glyph-name="redo" unicode="&#xf01e;" 
d="M500.33 448c6.62402 0 12 -5.37598 12 -12v-200.34c0 -6.62402 -5.37598 -12 -12 -12h-200.33c-6.62402 0 -12 5.37598 -12 12v47.4102v0.0136719c0 6.62402 5.37598 12 12 12c0.157227 0 0.413086 -0.00683594 0.570312 -0.0136719l101.529 -4.87012
c-28.8721 42.9609 -94.3145 77.8281 -146.076 77.8281c-97.1514 0 -176 -78.8486 -176 -176c0 -97.1523 78.8486 -176 176 -176c36.6543 0 88.7373 19.6504 116.257 43.8613c1.87207 1.63672 5.40918 2.96387 7.89551 2.96387c2.74316 0 6.54395 -1.57422 8.48438 -3.51367
l34 -34c1.94141 -1.94043 3.51758 -5.74316 3.51758 -8.48828c0 -2.96094 -1.79102 -6.9668 -3.99805 -8.94141c-38.9707 -35.2783 -113.264 -63.9102 -165.831 -63.9102h-0.348633c-136.9 0 -247.9 110.93 -248 247.81c-0.0996094 136.66 111.34 248.19 248 248.19
h0.272461c63.2246 0 147.739 -39.124 188.647 -87.3301l-4 82.7598c-0.0078125 0.157227 -0.0136719 0.413086 -0.0136719 0.570312c0 6.62402 5.37598 12 12 12h0.0136719h47.4102z" />
    <glyph glyph-name="sync" unicode="&#xf021;" 
d="M440.65 435.43c-0.0078125 0.157227 -0.0136719 0.413086 -0.0136719 0.570312c0 6.62012 5.37305 11.9961 11.9932 12h47.3701c6.62402 0 12 -5.37598 12 -12v-200.35c0 -6.62402 -5.37598 -12 -12 -12h-200.22c-6.62402 0 -12 5.37598 -12 12v47.4092v0.0136719
c0 6.62402 5.37598 12 12 12c0.157227 0 0.412109 -0.00585938 0.569336 -0.0136719l101.46 -4.85938c-28.8584 42.9248 -94.2598 77.7627 -145.984 77.7627c-76.4834 0 -153.099 -60.3467 -171.016 -134.703c-1.19727 -5.10547 -6.4248 -9.25391 -11.6699 -9.25977
h-49.0498c-6.62402 0 -12 5.37598 -12 12c0 0.606445 0.0898438 1.58301 0.200195 2.17969c21.6201 114.9 122.44 201.82 243.54 201.82h0.28418c63.2031 0 147.667 -39.1279 188.536 -87.3398zM255.83 16c76.4971 0 153.144 60.3633 171.03 134.74
c1.19727 5.10547 6.4248 9.25391 11.6699 9.25977h49.0498c6.62402 0 12 -5.37598 12 -12c0 -0.606445 -0.0898438 -1.58301 -0.200195 -2.17969c-21.6201 -114.9 -122.439 -201.82 -243.55 -201.82h-0.234375c-63.1289 0 -147.53 39.0518 -188.396 87.1699
l4.14941 -82.5703c0.00878906 -0.165039 0.015625 -0.433594 0.015625 -0.599609c0 -6.62402 -5.37598 -12 -12 -12h-0.015625h-47.3496c-6.62402 0 -12 5.37598 -12 12v200.33c0 6.62402 5.37598 12 12 12h200.2c6.62402 0 12 -5.37598 12 -12v-47.4004v-0.0136719
c0 -6.62402 -5.37598 -12 -12 -12c-0.157227 0 -0.413086 0.00683594 -0.570312 0.0136719l-101.8 4.87012c28.7998 -42.9453 94.1406 -77.7998 145.85 -77.7998h0.150391z" />
    <glyph glyph-name="list-alt" unicode="&#xf022;" 
d="M464 -32h-416c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48zM128 328c-22.0908 0 -40 -17.9092 -40 -40s17.9092 -40 40 -40s40 17.9092 40 40s-17.9092 40 -40 40zM128 232
c-22.0908 0 -40 -17.9092 -40 -40s17.9092 -40 40 -40s40 17.9092 40 40s-17.9092 40 -40 40zM128 136c-22.0908 0 -40 -17.9092 -40 -40s17.9092 -40 40 -40s40 17.9092 40 40s-17.9092 40 -40 40zM416 272v32c0 6.62695 -5.37305 12 -12 12h-200
c-6.62695 0 -12 -5.37305 -12 -12v-32c0 -6.62695 5.37305 -12 12 -12h200c6.62695 0 12 5.37305 12 12zM416 176v32c0 6.62695 -5.37305 12 -12 12h-200c-6.62695 0 -12 -5.37305 -12 -12v-32c0 -6.62695 5.37305 -12 12 -12h200c6.62695 0 12 5.37305 12 12zM416 80v32
c0 6.62695 -5.37305 12 -12 12h-200c-6.62695 0 -12 -5.37305 -12 -12v-32c0 -6.62695 5.37305 -12 12 -12h200c6.62695 0 12 5.37305 12 12z" />
    <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="448" 
d="M400 224c26.5 0 48 -21.5 48 -48v-192c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v192c0 26.5 21.5 48 48 48h24v72c0 83.7998 68.2002 152 152 152s152 -68.2002 152 -152v-72h24zM296 224v72c0 39.7002 -32.2998 72 -72 72s-72 -32.2998 -72 -72v-72h144
z" />
    <glyph glyph-name="flag" unicode="&#xf024;" 
d="M349.565 349.217c40.4951 0 82.6113 15.9062 116.949 31.8545c21.2168 9.85352 45.4854 -5.62305 45.4854 -29.0166v-243.1c0 -10.5264 -5.16016 -20.4072 -13.8428 -26.3584c-35.8379 -24.5635 -74.3359 -40.8574 -122.505 -40.8574
c-67.373 0 -111.629 34.7832 -165.218 34.7832c-50.8525 0 -86.124 -10.0586 -114.435 -22.1221v-94.4004c0 -13.2549 -10.7451 -24 -24 -24h-16c-13.2549 0 -24 10.7451 -24 24v386.055c-14.5029 10.1201 -24 26.9189 -24 45.9453
c0 31.7041 26.3447 57.2539 58.3379 55.9521c28.4678 -1.1582 51.7793 -23.9668 53.5508 -52.4033c0.0625 -0.980469 0.113281 -2.57324 0.113281 -3.55566c0 -5.71094 -1.65723 -14.6738 -3.69922 -20.0059c20.7363 7.62891 43.0898 12.0127 68.0449 12.0127
c67.373 0 111.63 -34.7832 165.218 -34.7832z" />
    <glyph glyph-name="headphones" unicode="&#xf025;" 
d="M256 416c141.504 0 256 -114.521 256 -256v-48c0 -10.917 -7.9248 -23.7402 -17.6904 -28.6221l-14.3818 -7.19141c-2.01074 -60.0889 -51.3486 -108.187 -111.928 -108.187h-24c-13.2549 0 -24 10.7451 -24 24v176c0 13.2549 10.7451 24 24 24h24
c31.3418 0 59.6709 -12.8789 80 -33.627v1.62695c0 105.869 -86.1309 192 -192 192s-192 -86.1309 -192 -192v-1.62695c20.3291 20.748 48.6582 33.627 80 33.627h24c13.2549 0 24 -10.7451 24 -24v-176c0 -13.2549 -10.7451 -24 -24 -24h-24
c-60.5791 0 -109.917 48.0967 -111.928 108.187l-14.3828 7.19141c-9.76465 4.88184 -17.6895 17.7051 -17.6895 28.6221v0v48c0 141.504 114.52 256 256 256z" />
    <glyph glyph-name="volume-off" unicode="&#xf026;" horiz-adv-x="256" 
d="M215 377c15 15 41 4.46973 41 -17v-336c0 -21.4697 -26 -32 -41 -17l-88.9404 89h-102.06c-13.248 0 -24 10.752 -24 24v144c0 13.248 10.752 24 24 24h102z" />
    <glyph glyph-name="volume-down" unicode="&#xf027;" horiz-adv-x="384" 
d="M215.03 375.96c15.0098 15 40.9697 4.49023 40.9697 -16.9795v-335.961c0 -21.4395 -25.9404 -32 -40.9697 -16.9697l-88.9707 88.9502h-102.06c-13.2598 0 -24 10.75 -24 24v144c0 13.2598 10.7402 24 24 24h102.06zM338.23 267.88
c28.2393 -15.5498 45.7793 -44.9902 45.7793 -76.8701s-17.54 -61.3301 -45.7695 -76.8799c-11.5605 -6.34961 -26.1807 -2.20996 -32.6104 9.4502c-6.38965 11.6104 -2.16016 26.2002 9.4502 32.6104c12.9004 7.08984 20.9199 20.4297 20.9199 34.8096
s-8.01953 27.7197 -20.9297 34.8203c-11.6104 6.41016 -15.8398 21 -9.4502 32.6094c6.41992 11.6104 21.0303 15.7803 32.6104 9.4502z" />
    <glyph glyph-name="volume-up" unicode="&#xf028;" horiz-adv-x="576" 
d="M215.03 376.95c15.0098 15.0098 40.9697 4.49023 40.9697 -16.9697v-335.961c0 -21.4395 -25.9404 -32 -40.9697 -16.9697l-88.9707 88.9502h-102.06c-13.2598 0 -24 10.75 -24 24v144c0 13.2598 10.7402 24 24 24h102.06zM448.35 428.03
c79.9199 -52.46 127.65 -140.7 127.65 -236.03s-47.7305 -183.58 -127.65 -236.04c-11.5801 -7.61035 -26.4697 -3.75977 -33.5098 6.9502c-7.33984 11.1602 -4.21973 26.1797 6.9502 33.5c66.2695 43.4902 105.82 116.6 105.82 195.58
c0 78.9795 -39.5508 152.09 -105.82 195.58c-11.1699 7.33008 -14.29 22.3398 -6.9502 33.5098c7.33008 11.1895 22.3398 14.2803 33.5098 6.9502zM480 192c0 -63.54 -32.0596 -121.94 -85.7695 -156.24c-12 -7.67969 -26.6104 -2.89941 -33.1201 7.45996
c-7.09082 11.29 -3.78027 26.2207 7.40918 33.3604c39.75 25.3896 63.4805 68.5303 63.4805 115.42s-23.7305 90.0303 -63.4805 115.42c-11.1895 7.15039 -14.5 22.0801 -7.40918 33.3604c7.08984 11.2793 21.9297 14.5996 33.1201 7.45996
c53.71 -34.2998 85.7695 -92.71 85.7695 -156.24zM338.23 268.87c28.2393 -15.54 45.7793 -44.9805 45.7793 -76.8604s-17.54 -61.3301 -45.7695 -76.8799c-11.5605 -6.34961 -26.1807 -2.20996 -32.6104 9.4502c-6.38965 11.6104 -2.16016 26.2002 9.4502 32.6104
c12.9004 7.08984 20.9199 20.4297 20.9199 34.8096c0 14.3701 -8.01953 27.7197 -20.9297 34.8096c-11.6104 6.41016 -15.8398 21 -9.4502 32.6104c6.41992 11.6104 21.0303 15.7803 32.6104 9.4502z" />
    <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="448" 
d="M0 224v192h192v-192h-192zM64 352v-64h64v64h-64zM256 416h192v-192h-192v192zM384 288v64h-64v-64h64zM0 -32v192h192v-192h-192zM64 96v-64h64v64h-64zM416 160h32v-128h-96v32h-32v-96h-64v192h96v-32h64v32zM416 0h32v-32h-32v32zM352 0h32v-32h-32v32z" />
    <glyph glyph-name="barcode" unicode="&#xf02a;" 
d="M0 0v384h18v-384h-18zM26.8574 0.273438v383.727h9.14258v-383.727h-9.14258zM54 0.273438v383.727h8.85742v-383.727h-8.85742zM98.8574 0.273438v383.727h8.85645v-383.727h-8.85645zM134.857 0.273438v383.727h17.7139v-383.727h-17.7139zM179.714 0.273438v383.727
h8.85742v-383.727h-8.85742zM197.714 0.273438v383.727h8.85742v-383.727h-8.85742zM215.714 0.273438v383.727h8.85742v-383.727h-8.85742zM251.429 0.273438v383.727h18v-383.727h-18zM296.286 0.273438v383.727h18v-383.727h-18zM332.285 0.273438v383.727h18.001
v-383.727h-18.001zM368.286 0.273438v383.727h18.001v-383.727h-18.001zM395.143 0.273438v383.727h18v-383.727h-18zM440.286 0.273438v383.727h26.8564v-383.727h-26.8564zM476 0.273438v383.727h9.14258v-383.727h-9.14258zM494 0v384h18v-384h-18z" />
    <glyph glyph-name="tag" unicode="&#xf02b;" 
d="M0 195.882v204.118c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586l211.883 -211.883c18.7441 -18.7441 18.7441 -49.1367 0 -67.8818l-204.118 -204.118c-18.7451 -18.7441 -49.1377 -18.7441 -67.8818 0l-211.883 211.883
c-7.75977 7.75977 -14.0586 22.9658 -14.0586 33.9404zM112 384c-26.5098 0 -48 -21.4902 -48 -48s21.4902 -48 48 -48s48 21.4902 48 48s-21.4902 48 -48 48z" />
    <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="640" 
d="M497.941 222.059c18.7441 -18.7441 18.7441 -49.1367 0 -67.8818l-204.118 -204.118c-18.7461 -18.7451 -49.1387 -18.7441 -67.8818 0l-211.883 211.883c-7.75977 7.75977 -14.0586 22.9658 -14.0586 33.9404v204.118c0 26.5098 21.4902 48 48 48h204.118
c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM112 288c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48s21.4902 -48 48 -48zM625.941 154.177l-204.118 -204.118c-18.7451 -18.7441 -49.1377 -18.7441 -67.8818 0l-0.360352 0.360352
l174.059 174.059c16.999 16.999 26.3604 39.6006 26.3604 63.6406s-9.3623 46.6406 -26.3604 63.6396l-196.242 196.242h48.7207c10.9746 0 26.1807 -6.29883 33.9404 -14.0586l211.883 -211.883c18.7441 -18.7441 18.7441 -49.1367 0 -67.8818z" />
    <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="448" 
d="M448 88c0 -7.5 -3.5 -14.2998 -8.90039 -18.5996c-4.19922 -15.4004 -4.19922 -59.3008 0 -74.7002c5.40039 -4.40039 8.90039 -11.2002 8.90039 -18.7002v-16c0 -13.2998 -10.7002 -24 -24 -24h-328c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h328
c13.2998 0 24 -10.7002 24 -24v-336zM128 314v-20c0 -3.2998 2.7002 -6 6 -6h212c3.2998 0 6 2.7002 6 6v20c0 3.2998 -2.7002 6 -6 6h-212c-3.2998 0 -6 -2.7002 -6 -6zM128 250v-20c0 -3.2998 2.7002 -6 6 -6h212c3.2998 0 6 2.7002 6 6v20c0 3.2998 -2.7002 6 -6 6h-212
c-3.2998 0 -6 -2.7002 -6 -6zM381.4 0c-1.90039 17.0996 -1.90039 46.9004 0 64h-285.4c-17.5996 0 -32 -14.4004 -32 -32c0 -17.7002 14.2998 -32 32 -32h285.4z" />
    <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="384" 
d="M0 -64v464c0 26.5098 21.4902 48 48 48h288c26.5098 0 48 -21.4902 48 -48v-464l-192 112z" />
    <glyph glyph-name="print" unicode="&#xf02f;" 
d="M448 256c35.3496 0 64 -28.6504 64 -64v-112c0 -8.83984 -7.16016 -16 -16 -16h-48v-96c0 -17.6699 -14.3301 -32 -32 -32h-320c-17.6699 0 -32 14.3301 -32 32v96h-48c-8.83984 0 -16 7.16016 -16 16v112c0 35.3496 28.6504 64 64 64v160c0 17.6699 14.3301 32 32 32
h274.74c8.49023 0 16.6299 -3.37012 22.6299 -9.37012l45.2598 -45.25c6 -6.00977 9.37012 -14.1396 9.37012 -22.6299v-114.75zM384 0v96h-256v-96h256zM384 224v96h-48c-8.83984 0 -16 7.16016 -16 16v48h-192v-160h256zM432 152c13.25 0 24 10.75 24 24
c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24z" />
    <glyph glyph-name="camera" unicode="&#xf030;" 
d="M512 304v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h88l12.2998 32.9004c7 18.6992 24.9004 31.0996 44.9004 31.0996h125.5c20 0 37.8994 -12.4004 44.8994 -31.0996l12.4004 -32.9004h88c26.5 0 48 -21.5 48 -48zM376 160
c0 66.2002 -53.7998 120 -120 120s-120 -53.7998 -120 -120s53.7998 -120 120 -120s120 53.7998 120 120zM344 160c0 -48.5 -39.5 -88 -88 -88s-88 39.5 -88 88s39.5 88 88 88s88 -39.5 88 -88z" />
    <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="448" 
d="M432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h19.5801l-23.2998 64h-152.561l-23.2998 -64h19.5801c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h23.4102l130.71 362.31c4.07422 11.9736 17.6465 21.6904 30.2939 21.6904h0.00585938h47.1602h0.00585938c12.6475 0 26.2197 -9.7168 30.2939 -21.6904
l130.71 -362.31h23.4102zM176.85 176h94.3008l-47.1504 129.49z" />
    <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="384" 
d="M333.49 210c34.4395 -27.54 55.5693 -71.1504 50.8301 -119.6c-6.86035 -70.6504 -70.2002 -122.4 -141 -122.4h-209.32c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16h31.8701v288h-31.8701c-8.83203 0 -16 7.16797 -16 16v48
c0 8.83203 7.16797 16 16 16h199.42c74.5801 0 134.45 -64.4902 127.07 -140.79c-2.01367 -20.25 -14.1094 -49.4639 -27 -65.21zM145.66 336v-96h87.7598c26.4961 0 48 21.5039 48 48s-21.5039 48 -48 48h-87.7598zM233.42 48c30.9121 0 56 25.0879 56 56
s-25.0879 56 -56 56h-87.7598v-112h87.7598z" />
    <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="320" 
d="M320 400v-32c0 -8.83203 -7.16797 -16 -16 -16h-62.7598l-80 -320h46.7598c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-192c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h62.7598l80 320h-46.7598
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h192c8.83203 0 16 -7.16797 16 -16z" />
    <glyph glyph-name="text-height" unicode="&#xf034;" horiz-adv-x="576" 
d="M304 416c8.83203 0 16 -7.16797 16 -16v-96c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32h-56v-304h40c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-160c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h40v304h-56v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v96c0 8.83203 7.16797 16 16 16h288zM560 80c15.6396 0 20.6396 -18 11.3096 -27.3096l-80 -80c-2.58594 -2.58496 -7.65332 -4.68262 -11.3096 -4.68262
s-8.72363 2.09766 -11.3096 4.68262l-80 80c-10.0107 10 -3 27.3096 11.3096 27.3096h48v224h-48c-15.6396 0 -20.6396 18 -11.3096 27.3096l80 80c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262l80 -80
c10.0205 -10 3 -27.3096 -11.3096 -27.3096h-48v-224h48z" />
    <glyph glyph-name="text-width" unicode="&#xf035;" horiz-adv-x="448" 
d="M432 416c8.83203 0 16 -7.16797 16 -16v-80c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v16h-120v-112h24c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h24v112h-120v-16c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v80c0 8.83203 7.16797 16 16 16h416zM363.31 155.31l80 -80c2.58496 -2.58594 4.68262 -7.65332 4.68262 -11.3096s-2.09766 -8.72363 -4.68262 -11.3096
l-80 -80c-10 -10.0205 -27.3096 -3 -27.3096 11.3096v48h-224v-48c0 -15.6396 -18 -20.6396 -27.3096 -11.3096l-80 80c-2.58496 2.58594 -4.68262 7.65332 -4.68262 11.3096s2.09766 8.72363 4.68262 11.3096l80 80c10 10.0107 27.3096 3 27.3096 -11.3096v-48h224v48
c0 15.6396 18 20.6396 27.3096 11.3096z" />
    <glyph glyph-name="align-left" unicode="&#xf036;" horiz-adv-x="448" 
d="M12.8301 96c-7.07715 0 -12.8301 5.74316 -12.8301 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h262.34h0.00976562c7.07715 0 12.8203 -5.74316 12.8203 -12.8203v-0.00976562v-38.3398v-0.00976562
c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-262.34zM12.8301 352c-7.07715 0 -12.8301 5.74316 -12.8301 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h262.34h0.00976562
c7.07715 0 12.8203 -5.74316 12.8203 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-262.34zM432 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16
v32c0 8.83203 7.16797 16 16 16h416zM432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" />
    <glyph glyph-name="align-center" unicode="&#xf037;" horiz-adv-x="448" 
d="M432 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16
v32c0 8.83203 7.16797 16 16 16h416zM108.1 352c-6.67871 0 -12.0996 5.4209 -12.0996 12.0996v39.8105c0 6.67383 5.41602 12.0898 12.0898 12.0898h0.00976562h231.811c6.67383 0 12.0898 -5.41602 12.0898 -12.0898v-39.8105v-0.00976562
c0 -6.67383 -5.41602 -12.0898 -12.0898 -12.0898v0h-231.811zM339.91 96h-231.811c-6.67871 0 -12.0996 5.4209 -12.0996 12.0996v39.8105c0 6.67383 5.41602 12.0898 12.0898 12.0898h0.00976562h231.811c6.67383 0 12.0898 -5.41602 12.0898 -12.0898v-39.8105
v-0.00976562c0 -6.67383 -5.41602 -12.0898 -12.0898 -12.0898v0z" />
    <glyph glyph-name="align-right" unicode="&#xf038;" horiz-adv-x="448" 
d="M16 224c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416zM432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16
v32c0 8.83203 7.16797 16 16 16h416zM435.17 416c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-262.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203
v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h262.34zM435.17 160c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-262.34
h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h262.34z" />
    <glyph glyph-name="align-justify" unicode="&#xf039;" horiz-adv-x="448" 
d="M432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM432 160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16
v32c0 8.83203 7.16797 16 16 16h416zM432 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM432 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16
h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" />
    <glyph glyph-name="list" unicode="&#xf03a;" 
d="M80 80c8.83203 0 16 -7.16797 16 -16v-64c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v64c0 8.83203 7.16797 16 16 16h64zM80 400c8.83203 0 16 -7.16797 16 -16v-64c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v64
c0 8.83203 7.16797 16 16 16h64zM80 240c8.83203 0 16 -7.16797 16 -16v-64c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v64c0 8.83203 7.16797 16 16 16h64zM496 64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 384c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 224c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320z" />
    <glyph glyph-name="outdent" unicode="&#xf03b;" horiz-adv-x="448" 
d="M100.69 84.71l-96 95.9805c-2.58496 2.58594 -4.68262 7.65332 -4.68262 11.3096s2.09766 8.72363 4.68262 11.3096l96 96c9.97949 10 27.3096 3.01074 27.3096 -11.3096v-191.98c0 -14.2393 -17.3096 -21.3096 -27.3096 -11.3096zM432 32c8.83203 0 16 -7.16797 16 -16
v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM435.17 160c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562
h-230.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h230.34zM435.17 288c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562
c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-230.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h230.34zM432 416c8.83203 0 16 -7.16797 16 -16
v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" />
    <glyph glyph-name="indent" unicode="&#xf03c;" horiz-adv-x="448" 
d="M27.3096 84.7002c-9.97949 -10 -27.3096 -3.00977 -27.3096 11.2998v192c0 14.2197 17.2695 21.3398 27.3096 11.3203l96 -96c2.58496 -2.58691 4.68262 -7.65332 4.68262 -11.3105c0 -3.65625 -2.09766 -8.72363 -4.68262 -11.3096zM432 32
c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416zM435.17 160c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562
c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-230.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h230.34zM435.17 288
c7.07715 0 12.8301 -5.74316 12.8301 -12.8203v-0.00976562v-38.3398v-0.00976562c0 -7.07715 -5.74316 -12.8203 -12.8203 -12.8203h-0.00976562h-230.34h-0.00976562c-7.07715 0 -12.8203 5.74316 -12.8203 12.8203v0.00976562v38.3398v0.00976562
c0 7.07715 5.74316 12.8203 12.8203 12.8203h0.00976562h230.34zM432 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" />
    <glyph glyph-name="video" unicode="&#xf03d;" horiz-adv-x="576" 
d="M336.2 384c26.3994 0 47.7998 -21.4004 47.7998 -47.7998v-288.4c0 -26.3994 -21.4004 -47.7998 -47.7998 -47.7998h-288.4c-26.3994 0 -47.7998 21.4004 -47.7998 47.7998v288.4c0 26.3994 21.4004 47.7998 47.7998 47.7998h288.4zM525.6 346.3
c21.3008 14.6006 50.4004 -0.399414 50.4004 -25.7998v-256.9c0 -25.5 -29.2002 -40.3994 -50.4004 -25.7998l-109.6 75.5v157.4z" />
    <glyph glyph-name="image" unicode="&#xf03e;" 
d="M464 0h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h416c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48zM112 328c-30.9277 0 -56 -25.0723 -56 -56s25.0723 -56 56 -56s56 25.0723 56 56s-25.0723 56 -56 56zM64 64h384
v112l-87.5146 87.5146c-4.68652 4.68652 -12.2842 4.68652 -16.9717 0l-135.514 -135.515l-55.5146 55.5146c-4.68652 4.68652 -12.2842 4.68652 -16.9717 0l-71.5137 -71.5146v-48z" />
    <glyph glyph-name="map-marker" unicode="&#xf041;" horiz-adv-x="384" 
d="M172.268 -53.6699c-145.298 210.639 -172.268 232.257 -172.268 309.67c0 106.039 85.9609 192 192 192s192 -85.9609 192 -192c0 -77.4131 -26.9697 -99.0312 -172.268 -309.67c-9.53516 -13.7744 -29.9307 -13.7734 -39.4648 0z" />
    <glyph glyph-name="adjust" unicode="&#xf042;" 
d="M8 192c0 136.967 111.034 248 248 248s248 -111.034 248 -248s-111.033 -248 -248 -248s-248 111.034 -248 248zM256 8c101.689 0 184 82.2949 184 184c0 101.689 -82.2949 184 -184 184v-368z" />
    <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="352" 
d="M205.22 425.91c46.9902 -158.48 146.78 -200.07 146.78 -311.82c0 -98.4395 -78.7197 -178.09 -176 -178.09s-176 79.6504 -176 178.09c0 111.19 100.01 154.061 146.78 311.82c9 30.1201 50.5 28.7803 58.4395 0zM176 0c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16
c-44.1104 0 -80 35.8896 -80 80c0 8.83984 -7.16016 16 -16 16s-16 -7.16016 -16 -16c0 -61.75 50.25 -112 112 -112z" />
    <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="576" 
d="M402.6 364.8l90.2002 -90.2002c3.7998 -3.7998 3.7998 -10 0 -13.7998l-218.399 -218.399l-92.8008 -10.3008c-12.3994 -1.39941 -22.8994 9.10059 -21.5 21.5l10.3008 92.8008l218.399 218.399c3.7998 3.7998 10 3.7998 13.7998 0zM564.6 387.7
c15.2002 -15.2002 15.2002 -39.9004 0 -55.2002l-35.3994 -35.4004c-3.7998 -3.7998 -10 -3.7998 -13.7998 0l-90.2002 90.2002c-3.7998 3.7998 -3.7998 10 0 13.7998l35.3994 35.4004c15.3008 15.2002 40 15.2002 55.2002 0zM384 101.8c0 3.2002 1.2998 6.2002 3.5 8.5
l40 40c7.59961 7.5 20.5 2.2002 20.5 -8.5v-157.8c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h285.8c10.7002 0 16.1006 -12.9004 8.5 -20.5l-40 -40c-2.2998 -2.2002 -5.2998 -3.5 -8.5 -3.5h-229.8v-320h320v101.8z" />
    <glyph glyph-name="step-backward" unicode="&#xf048;" horiz-adv-x="448" 
d="M64 -20v424c0 6.59961 5.40039 12 12 12h48c6.59961 0 12 -5.40039 12 -12v-176.4l195.5 181c20.5996 17.1006 52.5 2.80078 52.5 -24.5996v-384c0 -27.4004 -31.9004 -41.7002 -52.5 -24.5996l-195.5 179.899v-175.3c0 -6.59961 -5.40039 -12 -12 -12h-48
c-6.59961 0 -12 5.40039 -12 12z" />
    <glyph glyph-name="fast-backward" unicode="&#xf049;" 
d="M0 12v360c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-151.9l171.5 156.5c20.5996 17.1006 52.5 2.80078 52.5 -24.5996v-131.9l171.5 156.5c20.5996 17.1006 52.5 2.80078 52.5 -24.5996v-320c0 -27.4004 -31.9004 -41.7002 -52.5 -24.5996
l-171.5 155.3v-130.7c0 -27.4004 -31.9004 -41.7002 -52.5 -24.5996l-171.5 155.3v-150.7c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12z" />
    <glyph glyph-name="backward" unicode="&#xf04a;" 
d="M11.5 167.4c-15.2998 12.7998 -15.2998 36.3994 0 49.1992l192 160c20.5996 17.2002 52.5 2.80078 52.5 -24.5996v-320c0 -27.4004 -31.9004 -41.7998 -52.5 -24.5996zM267.5 167.4c-15.2998 12.7998 -15.2998 36.3994 0 49.1992l192 160
c20.5996 17.2002 52.5 2.80078 52.5 -24.5996v-320c0 -27.4004 -31.9004 -41.7998 -52.5 -24.5996z" />
    <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="448" 
d="M424.4 233.3c31.5 -18.5 31.3994 -64.0996 0 -82.5996l-352 -208c-31.7002 -18.7998 -72.4004 3.7998 -72.4004 41.2998v416.1c0 41.8008 43.7998 58.2002 72.4004 41.3008z" />
    <glyph glyph-name="pause" unicode="&#xf04c;" horiz-adv-x="448" 
d="M144 -31h-96c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h96c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48zM448 17c0 -26.5 -21.5 -48 -48 -48h-96c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h96c26.5 0 48 -21.5 48 -48v-352z" />
    <glyph glyph-name="stop" unicode="&#xf04d;" horiz-adv-x="448" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352z" />
    <glyph glyph-name="forward" unicode="&#xf04e;" 
d="M500.5 216.6c15.2998 -12.7998 15.2998 -36.3994 0 -49.1992l-192 -160c-20.5996 -17.2002 -52.5 -2.80078 -52.5 24.5996v320c0 27.4004 31.9004 41.7002 52.5 24.5996zM244.5 216.6c15.2998 -12.7998 15.2998 -36.3994 0 -49.1992l-192 -160
c-20.5996 -17.2002 -52.5 -2.80078 -52.5 24.5996v320c0 27.4004 31.9004 41.7002 52.5 24.5996z" />
    <glyph glyph-name="fast-forward" unicode="&#xf050;" 
d="M512 372v-360c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v151.9l-171.5 -156.5c-20.5996 -17.2002 -52.5 -2.80078 -52.5 24.5996v131.9l-171.5 -156.5c-20.5996 -17.2002 -52.5 -2.80078 -52.5 24.5996v320
c0 27.4004 31.9004 41.7002 52.5 24.5996l171.5 -155.399v130.8c0 27.4004 31.9004 41.7002 52.5 24.5996l171.5 -155.399v150.8c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12z" />
    <glyph glyph-name="step-forward" unicode="&#xf051;" horiz-adv-x="448" 
d="M384 404v-424c0 -6.59961 -5.40039 -12 -12 -12h-48c-6.59961 0 -12 5.40039 -12 12v176.4l-195.5 -181c-20.5996 -17.1006 -52.5 -2.80078 -52.5 24.5996v384c0 27.4004 31.9004 41.7002 52.5 24.5996l195.5 -179.899v175.3c0 6.59961 5.40039 12 12 12h48
c6.59961 0 12 -5.40039 12 -12z" />
    <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="448" 
d="M448 64v-64c0 -17.6729 -14.3271 -32 -32 -32h-384c-17.6729 0 -32 14.3271 -32 32v64c0 17.6729 14.3271 32 32 32h384c17.6729 0 32 -14.3271 32 -32zM48.0527 128c-41.7285 0 -63.5273 49.7324 -35.3828 80.4346l175.946 192.008
c19.0156 20.7432 51.7529 20.7422 70.7666 0l175.939 -192.008c28.1973 -30.7607 6.26758 -80.4346 -35.3828 -80.4346h-351.887z" />
    <glyph glyph-name="chevron-left" unicode="&#xf053;" horiz-adv-x="320" 
d="M34.5195 208.97l194.351 194.34c9.37012 9.37012 24.5703 9.37012 33.9395 0l22.6709 -22.6699c9.35938 -9.35938 9.36914 -24.5195 0.0390625 -33.8994l-154.029 -154.74l154.02 -154.75c9.33984 -9.37988 9.32031 -24.54 -0.0400391 -33.9004l-22.6699 -22.6699
c-9.37012 -9.37012 -24.5693 -9.37012 -33.9395 0l-194.341 194.351c-9.36914 9.37012 -9.36914 24.5693 0 33.9395z" />
    <glyph glyph-name="chevron-right" unicode="&#xf054;" horiz-adv-x="320" 
d="M285.476 175.029l-194.344 -194.344c-9.37305 -9.37207 -24.5684 -9.37207 -33.9404 0l-22.667 22.667c-9.35742 9.35742 -9.375 24.5225 -0.0400391 33.9014l154.021 154.746l-154.021 154.745c-9.33496 9.37891 -9.31738 24.5439 0.0400391 33.9014l22.667 22.667
c9.37305 9.37207 24.5684 9.37207 33.9404 0l194.343 -194.344c9.37305 -9.37207 9.37305 -24.5674 0.000976562 -33.9404z" />
    <glyph glyph-name="plus-circle" unicode="&#xf055;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM400 164v56c0 6.59961 -5.40039 12 -12 12h-92v92c0 6.59961 -5.40039 12 -12 12h-56c-6.59961 0 -12 -5.40039 -12 -12v-92h-92c-6.59961 0 -12 -5.40039 -12 -12v-56
c0 -6.59961 5.40039 -12 12 -12h92v-92c0 -6.59961 5.40039 -12 12 -12h56c6.59961 0 12 5.40039 12 12v92h92c6.59961 0 12 5.40039 12 12z" />
    <glyph glyph-name="minus-circle" unicode="&#xf056;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM124 152h264c6.59961 0 12 5.40039 12 12v56c0 6.59961 -5.40039 12 -12 12h-264c-6.59961 0 -12 -5.40039 -12 -12v-56c0 -6.59961 5.40039 -12 12 -12z" />
    <glyph glyph-name="times-circle" unicode="&#xf057;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM377.6 126.9l-65.5996 65.0996l65.7002 65c4.7002 4.7002 4.7002 12.2998 0 17l-39.6006 39.5996c-4.69922 4.7002 -12.2998 4.7002 -17 0l-65.0996 -65.5996l-65 65.7002
c-4.7002 4.7002 -12.2998 4.7002 -17 0l-39.5996 -39.6006c-4.7002 -4.69922 -4.7002 -12.2998 0 -17l65.5996 -65.0996l-65.5996 -65c-4.7002 -4.7002 -4.7002 -12.2998 0 -17l39.5 -39.5996c4.69922 -4.7002 12.2998 -4.7002 17 0l65.0996 65.5996l65 -65.5996
c4.7002 -4.7002 12.2998 -4.7002 17 0l39.5996 39.5c4.7002 4.69922 4.7002 12.2998 0 17z" />
    <glyph glyph-name="check-circle" unicode="&#xf058;" 
d="M504 192c0 -136.967 -111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248s248 -111.033 248 -248zM227.314 60.6855l184 184c6.24707 6.24805 6.24707 16.3799 0 22.6279l-22.6279 22.627c-6.24707 6.24902 -16.3789 6.24902 -22.6279 0
l-150.059 -150.059l-70.0586 70.0596c-6.24805 6.24805 -16.3799 6.24805 -22.6279 0l-22.6279 -22.627c-6.24707 -6.24805 -6.24707 -16.3799 0 -22.6279l104 -104c6.24902 -6.24805 16.3799 -6.24805 22.6289 -0.000976562z" />
    <glyph glyph-name="question-circle" unicode="&#xf059;" 
d="M504 192c0 -136.997 -111.043 -248 -248 -248s-248 111.003 -248 248c0 136.917 111.043 248 248 248s248 -111.083 248 -248zM262.655 358c-54.4971 0 -89.2549 -22.957 -116.549 -63.7578c-3.53613 -5.28613 -2.35352 -12.415 2.71484 -16.2578l34.6982 -26.3105
c5.20508 -3.94727 12.6211 -3.00781 16.665 2.12207c17.8643 22.6582 30.1133 35.7969 57.3037 35.7969c20.4287 0 45.6973 -13.1475 45.6973 -32.958c0 -14.9756 -12.3623 -22.667 -32.5332 -33.9756c-23.5244 -13.1875 -54.6523 -29.6006 -54.6523 -70.6592v-4
c0 -6.62695 5.37305 -12 12 -12h56c6.62695 0 12 5.37305 12 12v1.33301c0 28.4619 83.1855 29.6475 83.1855 106.667c0 58.002 -60.1641 102 -116.53 102zM256 110c-25.3652 0 -46 -20.6348 -46 -46c0 -25.3643 20.6348 -46 46 -46s46 20.6357 46 46
c0 25.3652 -20.6348 46 -46 46z" />
    <glyph glyph-name="info-circle" unicode="&#xf05a;" 
d="M256 440c136.957 0 248 -111.083 248 -248c0 -136.997 -111.043 -248 -248 -248s-248 111.003 -248 248c0 136.917 111.043 248 248 248zM256 330c-23.1963 0 -42 -18.8037 -42 -42s18.8037 -42 42 -42s42 18.8037 42 42s-18.8037 42 -42 42zM312 76v24
c0 6.62695 -5.37305 12 -12 12h-12v100c0 6.62695 -5.37305 12 -12 12h-64c-6.62695 0 -12 -5.37305 -12 -12v-24c0 -6.62695 5.37305 -12 12 -12h12v-64h-12c-6.62695 0 -12 -5.37305 -12 -12v-24c0 -6.62695 5.37305 -12 12 -12h88c6.62695 0 12 5.37305 12 12z" />
    <glyph glyph-name="crosshairs" unicode="&#xf05b;" 
d="M500 224c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-30.3643c-13.9121 -93.6748 -87.9609 -167.724 -181.636 -181.636v-30.3643c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v30.3643
c-93.6748 13.9121 -167.724 87.9609 -181.636 181.636h-30.3643c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h30.3643c13.9121 93.6748 87.9609 167.724 181.636 181.636v30.3643c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-30.3643
c93.6748 -13.9121 167.724 -87.9609 181.636 -181.636h30.3643zM288 43.3662c58.2432 12.417 104.232 58.46 116.634 116.634h-40.6338c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40.6338c-12.417 58.2432 -58.46 104.232 -116.634 116.634v-40.6338
c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40.6338c-58.2432 -12.417 -104.232 -58.46 -116.634 -116.634h40.6338c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-40.6338
c12.417 -58.2432 58.46 -104.232 116.634 -116.634v40.6338c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40.6338zM288 192c0 -17.6729 -14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32z" />
    <glyph glyph-name="ban" unicode="&#xf05e;" 
d="M256 440c136.967 0 248 -111.034 248 -248s-111.034 -248 -248 -248s-248 111.033 -248 248s111.034 248 248 248zM386.108 322.108c-65.4121 65.4102 -165.435 70.0312 -235.639 20.6758l256.315 -256.313c49.3232 70.1562 44.7705 170.189 -20.6768 235.638z
M125.892 61.8916c65.4121 -65.4111 165.436 -70.0312 235.639 -20.6758l-256.315 256.313c-49.3232 -70.1562 -44.7705 -170.189 20.6768 -235.638z" />
    <glyph glyph-name="arrow-left" unicode="&#xf060;" horiz-adv-x="448" 
d="M257.5 2.90039l-22.2002 -22.2002c-9.39941 -9.40039 -24.5996 -9.40039 -33.8994 0l-194.4 194.3c-9.40039 9.40039 -9.40039 24.5996 0 33.9004l194.4 194.399c9.39941 9.40039 24.5996 9.40039 33.8994 0l22.2002 -22.2002c9.5 -9.5 9.2998 -25 -0.400391 -34.2998
l-120.5 -114.8h287.4c13.2998 0 24 -10.7002 24 -24v-32c0 -13.2998 -10.7002 -24 -24 -24h-287.4l120.5 -114.8c9.80078 -9.2998 10 -24.7998 0.400391 -34.2998z" />
    <glyph glyph-name="arrow-right" unicode="&#xf061;" horiz-adv-x="448" 
d="M190.5 381.1l22.2002 22.2002c9.39941 9.40039 24.5996 9.40039 33.8994 0l194.4 -194.3c9.40039 -9.40039 9.40039 -24.5996 0 -33.9004l-194.4 -194.399c-9.39941 -9.40039 -24.5996 -9.40039 -33.8994 0l-22.2002 22.2002c-9.5 9.5 -9.2998 25 0.400391 34.2998
l120.5 114.8h-287.4c-13.2998 0 -24 10.7002 -24 24v32c0 13.2998 10.7002 24 24 24h287.4l-120.5 114.8c-9.80078 9.2998 -10 24.7998 -0.400391 34.2998z" />
    <glyph glyph-name="arrow-up" unicode="&#xf062;" horiz-adv-x="448" 
d="M34.9004 158.5l-22.2002 22.2002c-9.40039 9.39941 -9.40039 24.5996 0 33.8994l194.3 194.4c9.40039 9.40039 24.5996 9.40039 33.9004 0l194.3 -194.3c9.39941 -9.40039 9.39941 -24.6006 0 -33.9004l-22.2002 -22.2002c-9.5 -9.5 -25 -9.2998 -34.2998 0.400391
l-114.7 120.4v-287.4c0 -13.2998 -10.7002 -24 -24 -24h-32c-13.2998 0 -24 10.7002 -24 24v287.4l-114.8 -120.5c-9.2998 -9.80078 -24.7998 -10 -34.2998 -0.400391z" />
    <glyph glyph-name="arrow-down" unicode="&#xf063;" horiz-adv-x="448" 
d="M413.1 225.5l22.2002 -22.2002c9.40039 -9.39941 9.40039 -24.5996 0 -33.8994l-194.3 -194.4c-9.40039 -9.40039 -24.5996 -9.40039 -33.9004 0l-194.399 194.4c-9.40039 9.39941 -9.40039 24.5996 0 33.8994l22.2002 22.2002c9.5 9.5 25 9.2998 34.2998 -0.400391
l114.8 -120.5v287.4c0 13.2998 10.7002 24 24 24h32c13.2998 0 24 -10.7002 24 -24v-287.4l114.8 120.5c9.2998 9.80078 24.7998 10 34.2998 0.400391z" />
    <glyph glyph-name="share" unicode="&#xf064;" 
d="M503.691 258.164c11.0859 -9.5752 11.0703 -26.7656 0 -36.3281l-176.005 -152c-15.3867 -13.2891 -39.6865 -2.53613 -39.6865 18.1641v87.915c-155.083 -2.23145 -221.934 -40.7295 -176.59 -185.742c5.03418 -16.0977 -14.4238 -28.5615 -28.0771 -18.6309
c-43.752 31.8232 -83.333 92.6914 -83.333 154.132c0 152.227 127.371 184.419 288 186.258v80.0537c0 20.668 24.2812 31.4688 39.6865 18.1641z" />
    <glyph glyph-name="expand" unicode="&#xf065;" horiz-adv-x="448" 
d="M0 268v124c0 13.2998 10.7002 24 24 24h124c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-84v-84c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12zM288 404c0 6.59961 5.40039 12 12 12h124c13.2998 0 24 -10.7002 24 -24
v-124c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v84h-84c-6.59961 0 -12 5.40039 -12 12v40zM436 128c6.59961 0 12 -5.40039 12 -12v-124c0 -13.2998 -10.7002 -24 -24 -24h-124c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h84
v84c0 6.59961 5.40039 12 12 12h40zM160 -20c0 -6.59961 -5.40039 -12 -12 -12h-124c-13.2998 0 -24 10.7002 -24 24v124c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-84h84c6.59961 0 12 -5.40039 12 -12v-40z" />
    <glyph glyph-name="compress" unicode="&#xf066;" horiz-adv-x="448" 
d="M436 256h-124c-13.2998 0 -24 10.7002 -24 24v124c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-84h84c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM160 280c0 -13.2998 -10.7002 -24 -24 -24h-124
c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h84v84c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-124zM160 -20c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v84h-84c-6.59961 0 -12 5.40039 -12 12v40
c0 6.59961 5.40039 12 12 12h124c13.2998 0 24 -10.7002 24 -24v-124zM352 -20c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v124c0 13.2998 10.7002 24 24 24h124c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-84v-84z" />
    <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="448" 
d="M416 240c17.6699 0 32 -14.3301 32 -32v-32c0 -17.6699 -14.3301 -32 -32 -32h-144v-144c0 -17.6699 -14.3301 -32 -32 -32h-32c-17.6699 0 -32 14.3301 -32 32v144h-144c-17.6699 0 -32 14.3301 -32 32v32c0 17.6699 14.3301 32 32 32h144v144
c0 17.6699 14.3301 32 32 32h32c17.6699 0 32 -14.3301 32 -32v-144h144z" />
    <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="448" 
d="M416 240c17.6699 0 32 -14.3301 32 -32v-32c0 -17.6699 -14.3301 -32 -32 -32h-384c-17.6699 0 -32 14.3301 -32 32v32c0 17.6699 14.3301 32 32 32h384z" />
    <glyph glyph-name="asterisk" unicode="&#xf069;" 
d="M478.21 113.907c11.7949 -6.47754 15.96 -21.3828 9.23242 -33.0361l-19.4805 -33.7412c-6.72754 -11.6533 -21.7207 -15.499 -33.2266 -8.52246l-138.735 84.1104l3.47559 -162.204c0.288086 -13.4531 -10.5391 -24.5137 -23.9941 -24.5137h-38.9619
c-13.4551 0 -24.2822 11.0605 -23.9941 24.5137l3.47461 162.204l-138.735 -84.1113c-11.5059 -6.97656 -26.499 -3.13086 -33.2266 8.52246l-19.4805 33.7412c-6.72852 11.6533 -2.5625 26.5596 9.23242 33.0371l142.21 78.0928l-142.209 78.0918
c-11.7949 6.47754 -15.9609 21.3838 -9.2334 33.0371l19.4805 33.7412c6.72754 11.6533 21.7207 15.499 33.2266 8.52246l138.735 -84.1104l-3.47363 162.204c-0.289062 13.4531 10.5381 24.5137 23.9932 24.5137h38.9609c13.4561 0 24.2822 -11.0605 23.9941 -24.5137
l-3.47461 -162.204l138.735 84.1113c11.5068 6.97656 26.499 3.13086 33.2266 -8.52246l19.4805 -33.7412c6.72852 -11.6533 2.5625 -26.5596 -9.23242 -33.0371l-142.21 -78.0928z" />
    <glyph glyph-name="exclamation-circle" unicode="&#xf06a;" 
d="M504 192c0 -136.997 -111.043 -248 -248 -248s-248 111.003 -248 248c0 136.917 111.043 248 248 248s248 -111.083 248 -248zM256 142c-25.4053 0 -46 -20.5947 -46 -46s20.5947 -46 46 -46s46 20.5947 46 46s-20.5947 46 -46 46zM212.327 307.346l7.41797 -136
c0.34668 -6.36328 5.6084 -11.3457 11.9814 -11.3457h48.5469c6.37305 0 11.6348 4.98242 11.9814 11.3457l7.41797 136c0.375 6.87402 -5.09766 12.6543 -11.9814 12.6543h-63.3838c-6.88379 0 -12.3555 -5.78027 -11.9805 -12.6543z" />
    <glyph glyph-name="gift" unicode="&#xf06b;" 
d="M32 0v128h192v-160h-160c-17.7002 0 -32 14.2998 -32 32zM288 -32v160h192v-128c0 -17.7002 -14.2998 -32 -32 -32h-160zM480 288c17.7002 0 32 -14.2998 32 -32v-80c0 -8.7998 -7.2002 -16 -16 -16h-480c-8.7998 0 -16 7.2002 -16 16v80c0 17.7002 14.2998 32 32 32
h44.0996c-6.2998 12.0996 -10.0996 25.5 -10.0996 40c0 48.5 39.5 88 88 88c41.5996 0 68.5 -21.2998 103 -68.2998c34.5 47 61.4004 68.2998 103 68.2998c48.5 0 88 -39.5 88 -88c0 -14.5 -3.90039 -27.9004 -10.0996 -40h42.0996zM153.9 288h86.0996
c-51.5 76.7002 -66.2002 80 -86.0996 80c-22.1006 0 -40 -17.9004 -40 -40s17.8994 -40 40 -40zM360 288c22.0996 0 40 17.9004 40 40s-17.9004 40 -40 40c-20.4004 0 -34.7002 -3.5 -86.0996 -80h86.0996z" />
    <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="576" 
d="M546.2 438.3c19 -42.3994 29.7998 -94.3994 29.7998 -144.6c0 -172.4 -110.5 -313.2 -267.5 -324.601c-80.9004 -8.59961 -142.5 33.3008 -174.9 77.2002c-51 -42.7002 -70.3994 -87 -71.8994 -90.5996c-6.7998 -16.2002 -25.4004 -24.1006 -41.7998 -17.2998
c-16.3008 6.69922 -24.1006 25.2998 -17.5 41.5996c23.5996 57.9004 130.199 212 381.6 212c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16c-130.6 0 -222.7 -38.7998 -286.5 -84.5c-0.700195 6.7998 -1.5 13.5 -1.5 20.5c0 106 86 192 192 192h80
c63.4004 0 118.9 33.5996 149.9 87.5c6.69922 11.7998 22.6992 11.2998 28.2998 -1.2002z" />
    <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="384" 
d="M216 424.14c0 -103.14 168 -125.85 168 -296.14c0 -105.87 -86.1299 -192 -192 -192s-192 86.1299 -192 192c0 58.6699 27.7998 106.84 54.5703 134.96c14.96 15.7305 41.4297 5.2002 41.4297 -16.5v-85.5098c0 -35.1699 27.9805 -64.4902 63.1504 -64.9404
c35.7393 -0.469727 64.8496 28.3604 64.8496 63.9902c0 88 -176 96.1504 -52.1504 277.18c13.5 19.7305 44.1504 10.7607 44.1504 -13.04z" />
    <glyph glyph-name="eye" unicode="&#xf06e;" horiz-adv-x="576" 
d="M572.52 206.6c1.9209 -3.79883 3.47949 -10.3379 3.47949 -14.5947s-1.55859 -10.7959 -3.47949 -14.5947c-54.1992 -105.771 -161.59 -177.41 -284.52 -177.41s-230.29 71.5898 -284.52 177.4c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947
s1.55859 10.7959 3.47949 14.5947c54.1992 105.771 161.59 177.41 284.52 177.41s230.29 -71.5898 284.52 -177.4zM288 48h0.0703125c79.4492 0 143.93 64.4805 143.93 143.93v0.0703125c0 79.4883 -64.5117 144 -144 144s-144 -64.5117 -144 -144s64.5117 -144 144 -144z
M288 288h0.225586c52.8701 0 95.7803 -42.9092 95.7803 -95.7793c0 -52.8711 -42.9102 -95.7803 -95.7803 -95.7803c-52.8711 0 -95.7803 42.9092 -95.7803 95.7803c0 7.04785 1.49805 18.2871 3.34473 25.0889c6.9834 -5.13867 19.6895 -9.30957 28.3604 -9.30957
c26.4131 0 47.8496 21.4365 47.8496 47.8496c0 8.6709 -4.1709 21.377 -9.30957 28.3604c6.84375 1.99219 18.1826 3.69043 25.3096 3.79004z" />
    <glyph glyph-name="eye-slash" unicode="&#xf070;" horiz-adv-x="640" 
d="M320 48c7.24121 0.0673828 18.8896 1.23633 26 2.61035l51.8896 -40.1504c-25.0195 -6.45996 -50.9795 -10.46 -77.8896 -10.46c-122.93 0 -230.29 71.5898 -284.52 177.4c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947
c10.2393 20 22.9297 38.29 36.7197 55.5898l104.899 -81.0693c5.65039 -74.4004 67.0508 -133.11 142.9 -133.11zM633.82 -10.0996c3.41309 -2.65234 6.18359 -8.3125 6.18359 -12.6357c0 -3.02734 -1.50684 -7.42383 -3.36426 -9.81445l-19.6396 -25.2705
c-2.65234 -3.41211 -8.31152 -6.18262 -12.6338 -6.18262c-3.03125 0 -7.43359 1.51172 -9.82617 3.37305l-588.36 454.729c-3.41016 2.65234 -6.17773 8.31055 -6.17773 12.6309c0 3.0293 1.50879 7.42773 3.36816 9.81934l19.6299 25.2705
c2.65234 3.41211 8.31152 6.18262 12.6338 6.18262c3.03125 0 7.43359 -1.51172 9.82617 -3.37305l127.22 -98.3301c38.0117 20.7578 104.011 37.6475 147.32 37.7002c122.93 0 230.29 -71.5898 284.52 -177.4c1.9209 -3.79883 3.47949 -10.3379 3.47949 -14.5947
s-1.55859 -10.7959 -3.47949 -14.5947c-16.7666 -32.6758 -53.166 -78.4033 -81.25 -102.07zM450.1 131.9c8.61035 18.3203 13.9004 38.4697 13.9004 60.0996v0.0800781c0 79.4434 -64.4766 143.92 -143.92 143.92h-0.0800781
c-28.4697 -0.0214844 -69.3047 -14.8545 -91.1504 -33.1104l73.6104 -56.8896c0.726562 2.71387 1.41602 7.19336 1.54004 10c-0.015625 8.62891 -4.18652 21.2666 -9.30957 28.21c7.17969 2.09668 19.0781 3.79785 26.5576 3.79785
c52.3076 0 94.7598 -42.4521 94.7598 -94.7598c0 -0.344727 -0.00292969 -0.90332 -0.0078125 -1.24805c-0.112305 -8.43457 -2.44238 -21.749 -5.2002 -29.7197z" />
    <glyph glyph-name="exclamation-triangle" unicode="&#xf071;" horiz-adv-x="576" 
d="M569.517 7.9873c18.458 -31.9941 -4.71094 -71.9873 -41.5762 -71.9873h-479.887c-36.9365 0 -59.999 40.0547 -41.5771 71.9873l239.946 416.027c18.4668 32.0098 64.7197 31.9512 83.1543 0zM288 94c-25.4053 0 -46 -20.5947 -46 -46s20.5947 -46 46 -46
s46 20.5947 46 46s-20.5947 46 -46 46zM244.327 259.346l7.41797 -136c0.34668 -6.36328 5.6084 -11.3457 11.9814 -11.3457h48.5469c6.37305 0 11.6348 4.98242 11.9814 11.3457l7.41797 136c0.375 6.87402 -5.09766 12.6543 -11.9814 12.6543h-63.3838
c-6.88379 0 -12.3555 -5.78027 -11.9805 -12.6543z" />
    <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="576" 
d="M480 256c35.3496 0 96 -28.6504 96 -64s-60.6504 -64 -96 -64h-114.29l-105.11 -183.94c-2.84961 -4.97949 -8.14941 -8.05957 -13.8896 -8.05957h-65.5c-10.6299 0 -18.2998 10.1797 -15.3799 20.4004l49.0303 171.6h-102.86l-43.2002 -57.5996
c-3.01953 -4.03027 -7.75977 -6.40039 -12.7998 -6.40039h-39.9902c-10.4102 0 -18.0498 9.78027 -15.5195 19.8799l31.5098 108.12l-31.5098 108.12c-2.53027 10.0996 5.10938 19.8799 15.5195 19.8799h39.9902c5.03027 0 9.78027 -2.37012 12.7998 -6.40039
l43.2002 -57.5996h102.86l-49.0303 171.61c-2.91992 10.2197 4.75 20.3896 15.3799 20.3896h65.5h0.000976562c5.12598 0 11.3525 -3.61133 13.8994 -8.05957l105.1 -183.94h114.29z" />
    <glyph glyph-name="calendar-alt" unicode="&#xf073;" horiz-adv-x="448" 
d="M0 -16v272h448v-272c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48zM320 180v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12zM320 52v-40
c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12zM192 180v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v40c0 6.59961 -5.40039 12 -12 12h-40
c-6.59961 0 -12 -5.40039 -12 -12zM192 52v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12zM64 180v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v40
c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12zM64 52v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12zM400 384c26.5 0 48 -21.5 48 -48v-48h-448v48
c0 26.5 21.5 48 48 48h48v48c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-48h128v48c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-48h48z" />
    <glyph glyph-name="random" unicode="&#xf074;" 
d="M504.971 88.9707c9.37305 -9.37305 9.37305 -24.5684 0 -33.9404l-80 -79.9844c-15.0098 -15.0098 -40.9707 -4.49023 -40.9707 16.9707v39.9834h-58.7852c-2.87793 0 -6.80859 1.70801 -8.77246 3.81152l-70.5566 75.5967l53.333 57.1426l52.7812 -56.5508h32v39.9814
c0 21.4375 25.9434 31.9971 40.9707 16.9707zM12 272c-6.62695 0 -12 5.37305 -12 12v56c0 6.62695 5.37305 12 12 12h110.785h0.000976562c2.87793 0 6.80762 -1.70801 8.77148 -3.81152l70.5566 -75.5967l-53.333 -57.1426l-52.7812 56.5508h-84zM384 272h-32
l-220.442 -236.188c-2.26953 -2.43066 -5.44629 -3.81152 -8.77246 -3.81152h-110.785c-6.62695 0 -12 5.37305 -12 12v56c0 6.62695 5.37305 12 12 12h84l220.442 236.188c1.96387 2.10352 5.89453 3.81152 8.77246 3.81152h58.7852v39.9814
c0 21.4365 25.9434 31.9971 40.9707 16.9697l80 -79.9814c9.37305 -9.37207 9.37305 -24.5674 0 -33.9404l-80 -79.9844c-15.0098 -15.0088 -40.9707 -4.48926 -40.9707 16.9707v39.9844z" />
    <glyph glyph-name="comment" unicode="&#xf075;" 
d="M256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-38.4004 0 -74.7002 7.09961 -107.4 19.4004c-24.5996 -19.6006 -74.2998 -51.4004 -140.6 -51.4004c-3.2002 0 -6 1.7998 -7.2998 4.7998s-0.700195 6.40039 1.5 8.7002
c0.5 0.5 42.2998 45.4004 54.7998 95.7998c-35.5996 35.7002 -57 81.1006 -57 130.7c0 114.9 114.6 208 256 208z" />
    <glyph glyph-name="magnet" unicode="&#xf076;" 
d="M164.07 299.9h-152.07c-6.62402 0 -12 5.37598 -12 12v80c0 19.8721 16.1279 36 36 36h104c19.8721 0 36 -16.1279 36 -36v-80c0 -0.03125 0.000976562 -0.0800781 0.000976562 -0.110352c0 -6.56348 -5.32715 -11.8896 -11.8906 -11.8896h-0.0400391zM512 311.9
c0 -6.56348 -5.32715 -11.9014 -11.8896 -11.9014c-0.0302734 0 -0.0800781 0.000976562 -0.110352 0.000976562h-152c-6.62402 0 -12 5.37598 -12 12v80c0 19.8721 16.1279 36 36 36h104c19.8721 0 36 -16.1279 36 -36v-80.0996zM348 267.9h151.85h0.000976562
c6.62402 0 12 -5.37598 12 -12c0 -0.0283203 0 -0.0732422 -0.000976562 -0.100586c-0.199219 -20.2002 -0.599609 -40.3994 0 -53.2002c0 -150.699 -134.42 -246.699 -255 -246.699s-256.75 96 -256.75 246.6c0.600586 13 0.100586 31.9004 0 53.2998v0.100586
c0 6.62402 5.37598 12 12 12v0h151.9c6.62402 0 12 -5.37598 12 -12v-52c0 -127.9 160 -128.101 160 0v52c0 6.62402 5.37598 12 12 12z" />
    <glyph glyph-name="chevron-up" unicode="&#xf077;" horiz-adv-x="448" 
d="M240.971 317.476l194.344 -194.343c9.37207 -9.37305 9.37207 -24.5684 0 -33.9404l-22.667 -22.667c-9.35742 -9.35742 -24.5225 -9.375 -33.9014 -0.0400391l-154.746 154.02l-154.745 -154.021c-9.37891 -9.33496 -24.5439 -9.31738 -33.9014 0.0400391
l-22.667 22.667c-9.37207 9.37305 -9.37207 24.5684 0 33.9404l194.344 194.343c9.37207 9.37305 24.5674 9.37305 33.9404 0.000976562z" />
    <glyph glyph-name="chevron-down" unicode="&#xf078;" horiz-adv-x="448" 
d="M207.029 66.5244l-194.344 194.344c-9.37207 9.37305 -9.37207 24.5684 0 33.9404l22.667 22.667c9.35742 9.35742 24.5225 9.375 33.9014 0.0400391l154.746 -154.021l154.745 154.021c9.37891 9.33496 24.5439 9.31738 33.9014 -0.0400391l22.667 -22.667
c9.37207 -9.37305 9.37207 -24.5684 0 -33.9404l-194.343 -194.344c-9.37305 -9.37207 -24.5684 -9.37207 -33.9414 0z" />
    <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="640" 
d="M629.657 104.402l-100.687 -100.687c-9.37305 -9.37207 -24.5674 -9.37207 -33.9404 0l-100.688 100.687c-9.37305 9.37305 -9.37305 24.5684 0 33.9404l10.8232 10.8232c9.56152 9.56152 25.1328 9.33984 34.4189 -0.492188l40.415 -42.792v182.118h-187.549
c-5.4873 0 -13.0908 3.14941 -16.9707 7.0293l-16 16c-15.1191 15.1201 -4.41113 40.9707 16.9707 40.9707h243.549c13.2549 0 24 -10.7451 24 -24v-222.118l40.416 42.792c9.28516 9.83105 24.8564 10.0537 34.4189 0.492188l10.8232 -10.8232
c9.37207 -9.37207 9.37207 -24.5684 -0.000976562 -33.9404zM364.519 88.9707l16.001 -16c15.1191 -15.1201 4.41113 -40.9707 -16.9707 -40.9707h-243.549c-13.2549 0 -24 10.7451 -24 24v222.119l-40.416 -42.793c-9.28613 -9.83105 -24.8574 -10.0527 -34.4189 -0.491211
l-10.8223 10.8223c-9.37305 9.37207 -9.37305 24.5674 0 33.9404l100.688 100.687c9.37207 9.37305 24.5674 9.37305 33.9404 0l100.687 -100.686c9.37305 -9.37207 9.37305 -24.5674 0 -33.9404l-10.8223 -10.8223c-9.5625 -9.5625 -25.1328 -9.33984 -34.4189 0.491211
l-40.416 42.792v-182.119h187.548h0.000976562c5.4873 0 13.0898 -3.14941 16.9697 -7.0293z" />
    <glyph glyph-name="shopping-cart" unicode="&#xf07a;" horiz-adv-x="576" 
d="M528.12 146.681c-2.4834 -10.9268 -12.1973 -18.6807 -23.4033 -18.6807h-293.145l6.54492 -32h268.418c15.4004 0 26.8154 -14.3008 23.4033 -29.3193l-5.51758 -24.2754c18.6914 -9.07324 31.5791 -28.2334 31.5791 -50.4053c0 -30.9277 -25.0723 -56 -56 -56
s-56 25.0723 -56 56c0 15.6738 6.44727 29.835 16.8232 40h-209.647c10.377 -10.165 16.8242 -24.3262 16.8242 -40c0 -30.9277 -25.0723 -56 -56 -56s-56 25.0723 -56 56c0 20.7783 11.3252 38.9004 28.1309 48.5654l-70.248 343.435h-69.8828
c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24h102.529c11.4004 0 21.2285 -8.02148 23.5127 -19.1904l9.16602 -44.8096h392.782c15.4004 0 26.8154 -14.3008 23.4023 -29.3193z" />
    <glyph glyph-name="folder" unicode="&#xf07b;" 
d="M464 320c26.5098 0 48 -21.4902 48 -48v-224c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h160l64 -64h192z" />
    <glyph glyph-name="folder-open" unicode="&#xf07c;" horiz-adv-x="576" 
d="M572.694 155.907l-72.4248 -124.155c-10.2236 -17.5273 -34.9883 -31.752 -55.2793 -31.752h-0.000976562h-399.964c-18.5234 0 -30.0645 20.0928 -20.7314 36.0928l72.4238 124.155c10.2246 17.5273 34.9902 31.752 55.2822 31.752v0h399.964
c18.5234 0 30.0645 -20.0928 20.7305 -36.0928zM152 224c-34.0107 0 -65.7861 -18.25 -82.9229 -47.6279l-69.0771 -118.418v278.046c0 26.5098 21.4902 48 48 48h160l64 -64h160c26.5098 0 48 -21.4902 48 -48v-48h-328z" />
    <glyph glyph-name="chart-bar" unicode="&#xf080;" 
d="M332.8 128c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v134.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h38.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-134.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-38.4004zM428.8 128
c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v230.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h38.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-230.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-38.4004zM140.8 128
c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v70.4004c0 6.39941 6.40039 12.7998 12.7998 12.7998h38.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-70.4004c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-38.4004zM236.8 128
c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v198.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h38.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-198.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-38.4004zM496 64c8.83984 0 16 -7.16016 16 -16v-32
c0 -8.83984 -7.16016 -16 -16 -16h-464c-17.6699 0 -32 14.3301 -32 32v336c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-304h432z" />
    <glyph glyph-name="camera-retro" unicode="&#xf083;" 
d="M48 416h416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48zM48 384c-8.7998 0 -16 -7.2002 -16 -16v-10c0 -3.2998 2.7002 -6 6 -6h116c3.2998 0 6 2.7002 6 6v20c0 3.2998 -2.7002 6 -6 6h-106z
M474 288c3.2998 0 6 2.7002 6 6v74c0 8.7998 -7.2002 16 -16 16h-252.8c-2 0 -3.90039 -1 -5 -2.7002l-30.2002 -45.2998h-138c-3.2998 0 -6 -2.7002 -6 -6v-36c0 -3.2998 2.7002 -6 6 -6h436zM256 24c66.2002 0 120 53.7998 120 120s-53.7998 120 -120 120
s-120 -53.7998 -120 -120s53.7998 -120 120 -120zM256 232c48.5 0 88 -39.5 88 -88s-39.5 -88 -88 -88s-88 39.5 -88 88s39.5 88 88 88zM208 128c8.7998 0 16 7.2002 16 16c0 17.5996 14.4004 32 32 32c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16
c-35.2998 0 -64 -28.7002 -64 -64c0 -8.7998 7.2002 -16 16 -16z" />
    <glyph glyph-name="key" unicode="&#xf084;" 
d="M512 271.999c0 -97.2021 -78.7979 -175.999 -176 -175.999c-11.2197 0 -22.1904 1.06152 -32.8271 3.06934l-24.0117 -27.0146c-3.95215 -4.44629 -11.9883 -8.05469 -17.9375 -8.05469h-0.000976562h-37.2227v-40c0 -13.2549 -10.7451 -24 -24 -24h-40v-40
c0 -13.2549 -10.7451 -24 -24 -24h-112c-13.2549 0 -24 10.7451 -24 24v78.0586c0 6.36523 2.5293 12.4707 7.0293 16.9717l161.802 161.802c-5.72266 17.3535 -8.83105 35.8965 -8.83105 55.168c0 97.2021 78.7969 175.999 175.999 176
c97.4893 0.000976562 176.001 -78.5107 176.001 -176.001zM336 320c0 -26.5098 21.4902 -48 48 -48s48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48z" />
    <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="640" 
d="M512.1 257l-8.19922 -14.2998c-3 -5.2998 -9.40039 -7.5 -15.1006 -5.40039c-11.7998 4.40039 -22.5996 10.7002 -32.0996 18.6006c-4.60059 3.7998 -5.7998 10.5 -2.7998 15.6992l8.19922 14.3008c-6.89941 8 -12.2998 17.2998 -15.8994 27.3994h-16.5
c-6 0 -11.2002 4.2998 -12.2002 10.2998c-2 12 -2.09961 24.6006 0 37.1006c1 6 6.2002 10.3994 12.2002 10.3994h16.5c3.59961 10.1006 9 19.4004 15.8994 27.4004l-8.19922 14.2998c-3 5.2002 -1.90039 11.9004 2.7998 15.7002
c9.5 7.90039 20.3994 14.2002 32.0996 18.5996c5.7002 2.10059 12.1006 -0.0996094 15.1006 -5.39941l8.19922 -14.2998c10.5 1.89941 21.2002 1.89941 31.7002 0l8.2002 14.2998c3 5.2998 9.40039 7.5 15.0996 5.39941c11.8008 -4.39941 22.6006 -10.6992 32.1006 -18.5996
c4.59961 -3.7998 5.7998 -10.5 2.7998 -15.7002l-8.2002 -14.2998c6.90039 -8 12.2998 -17.2998 15.9004 -27.4004h16.5c6 0 11.2002 -4.2998 12.2002 -10.2998c2 -12 2.09961 -24.5996 0 -37.0996c-1 -6 -6.2002 -10.4004 -12.2002 -10.4004h-16.5
c-3.60059 -10.0996 -9 -19.3994 -15.9004 -27.3994l8.2002 -14.3008c3 -5.19922 1.90039 -11.8994 -2.7998 -15.6992c-9.5 -7.90039 -20.4004 -14.2002 -32.1006 -18.6006c-5.69922 -2.09961 -12.0996 0.100586 -15.0996 5.40039l-8.2002 14.2998
c-10.3994 -1.90039 -21.2002 -1.90039 -31.7002 0zM501.6 315.8c38.5 -29.5996 82.4004 14.2998 52.8008 52.7998c-38.5 29.7002 -82.4004 -14.2998 -52.8008 -52.7998zM386.3 161.9l33.7002 -16.8008c10.0996 -5.7998 14.5 -18.0996 10.5 -29.0996
c-8.90039 -24.2002 -26.4004 -46.4004 -42.5996 -65.7998c-7.40039 -8.90039 -20.2002 -11.1006 -30.3008 -5.2998l-29.0996 16.7998c-16 -13.7002 -34.5996 -24.6006 -54.9004 -31.7002v-33.5996c0 -11.6006 -8.2998 -21.6006 -19.6992 -23.6006
c-24.6006 -4.2002 -50.4004 -4.39941 -75.9004 0c-11.5 2 -20 11.9004 -20 23.6006v33.5996c-20.2998 7.2002 -38.9004 18 -54.9004 31.7002l-29.0996 -16.7002c-10 -5.7998 -22.9004 -3.59961 -30.2998 5.2998c-16.2002 19.4004 -33.2998 41.6006 -42.2002 65.7002
c-4 10.9004 0.400391 23.2002 10.5 29.0996l33.2998 16.8008c-3.89941 20.8994 -3.89941 42.3994 0 63.3994l-33.2998 16.9004c-10.0996 5.7998 -14.5996 18.0996 -10.5 29c8.90039 24.2002 26 46.3994 42.2002 65.7998c7.39941 8.90039 20.2002 11.0996 30.2998 5.2998
l29.0996 -16.7998c16 13.7002 34.6006 24.5996 54.9004 31.7002v33.7002c0 11.5 8.2002 21.5 19.5996 23.5c24.6006 4.19922 50.5 4.39941 76 0.0996094c11.5 -2 20 -11.9004 20 -23.5996v-33.6006c20.3008 -7.2002 38.9004 -18 54.9004 -31.7002l29.0996 16.8008
c10 5.7998 22.9004 3.59961 30.3008 -5.30078c16.1992 -19.3994 33.1992 -41.5996 42.0996 -65.7998c4 -10.8994 0.0996094 -23.2002 -10 -29.0996l-33.7002 -16.7998c3.90039 -21 3.90039 -42.5 0 -63.5zM268.7 140.8c59.2002 77 -28.7002 164.9 -105.7 105.7
c-59.2002 -77 28.7002 -164.9 105.7 -105.7zM512.1 -41.9004l-8.19922 -14.2998c-3 -5.2998 -9.40039 -7.5 -15.1006 -5.39941c-11.7998 4.39941 -22.5996 10.6992 -32.0996 18.5996c-4.60059 3.7998 -5.7998 10.5 -2.7998 15.7002l8.19922 14.2998
c-6.89941 8 -12.2998 17.2998 -15.8994 27.4004h-16.5c-6 0 -11.2002 4.2998 -12.2002 10.2998c-2 12 -2.09961 24.5996 0 37.0996c1 6 6.2002 10.4004 12.2002 10.4004h16.5c3.59961 10.0996 9 19.3994 15.8994 27.3994l-8.19922 14.3008
c-3 5.19922 -1.90039 11.8994 2.7998 15.6992c9.5 7.90039 20.3994 14.2002 32.0996 18.6006c5.7002 2.09961 12.1006 -0.100586 15.1006 -5.40039l8.19922 -14.2998c10.5 1.90039 21.2002 1.90039 31.7002 0l8.2002 14.2998c3 5.2998 9.40039 7.5 15.0996 5.40039
c11.8008 -4.40039 22.6006 -10.7002 32.1006 -18.6006c4.59961 -3.7998 5.7998 -10.5 2.7998 -15.6992l-8.2002 -14.3008c6.90039 -8 12.2998 -17.2998 15.9004 -27.3994h16.5c6 0 11.2002 -4.2998 12.2002 -10.2998c2 -12 2.09961 -24.6006 0 -37.1006
c-1 -6 -6.2002 -10.3994 -12.2002 -10.3994h-16.5c-3.60059 -10.1006 -9 -19.4004 -15.9004 -27.4004l8.2002 -14.2998c3 -5.2002 1.90039 -11.9004 -2.7998 -15.7002c-9.5 -7.90039 -20.4004 -14.2002 -32.1006 -18.5996
c-5.69922 -2.10059 -12.0996 0.0996094 -15.0996 5.39941l-8.2002 14.2998c-10.3994 -1.89941 -21.2002 -1.89941 -31.7002 0zM501.6 17c38.5 -29.5996 82.4004 14.2998 52.8008 52.7998c-38.5 29.6006 -82.4004 -14.2998 -52.8008 -52.7998z" />
    <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="576" 
d="M416 256c0 -88.4004 -93.0996 -160 -208 -160c-41 0 -79.0996 9.2998 -111.3 25c-21.7998 -12.7002 -52.1006 -25 -88.7002 -25c-3.2002 0 -6 1.7998 -7.2998 4.7998s-0.700195 6.40039 1.5 8.7002c0.299805 0.299805 22.3994 24.2998 35.7998 54.5
c-23.9004 26.0996 -38 57.7002 -38 92c0 88.4004 93.0996 160 208 160s208 -71.5996 208 -160zM538 36c13.4004 -30.2998 35.5 -54.2002 35.7998 -54.5c2.2002 -2.40039 2.7998 -5.7998 1.5 -8.7002c-1.2002 -2.89941 -4.09961 -4.7998 -7.2998 -4.7998
c-36.5996 0 -66.9004 12.2998 -88.7002 25c-32.2002 -15.7998 -70.2998 -25 -111.3 -25c-86.2002 0 -160.2 40.4004 -191.7 97.9004c10.4004 -1.10059 20.9004 -1.90039 31.7002 -1.90039c132.3 0 240 86.0996 240 192c0 6.7998 -0.400391 13.5 -1.2998 20.0996
c75.7998 -23.8994 129.3 -81.1992 129.3 -148.1c0 -34.2998 -14.0996 -66 -38 -92z" />
    <glyph glyph-name="star-half" unicode="&#xf089;" horiz-adv-x="576" 
d="M288 448v-439.6l-130.7 -68.6006c-23.3994 -12.2998 -50.8994 7.60059 -46.3994 33.7002l25 145.5l-105.7 103c-19 18.5 -8.5 50.7998 17.7002 54.5996l146.1 21.2002l65.2998 132.4c5.90039 11.8994 17.2998 17.7998 28.7002 17.7998z" />
    <glyph glyph-name="thumbtack" unicode="&#xf08d;" horiz-adv-x="384" 
d="M298.028 233.733c47.9893 -22.3135 85.9717 -62.5508 85.9727 -113.733c0 -13.2549 -10.7451 -24 -24 -24h-136v-104.007c0 -1.04297 -0.378906 -2.64551 -0.844727 -3.57812l-24 -48c-2.94727 -5.89258 -11.3701 -5.88184 -14.3115 0l-24 48
c-0.555664 1.11133 -0.844727 2.33594 -0.844727 3.57812v104.007h-136c-13.2549 0 -24 10.7451 -24 24c0 50.7393 37.4648 91.1797 85.9717 113.733l12.2354 118.267h-42.207c-13.2549 0 -24 10.7451 -24 24v48c0 13.2549 10.7451 24 24 24h272
c13.2549 0 24 -10.7451 24 -24v-48c0 -13.2549 -10.7451 -24 -24 -24h-42.207z" />
    <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="576" 
d="M552 384c13.2998 0 24 -10.7002 24 -24v-56c0 -35.7002 -22.5996 -72.4004 -61.9004 -100.7c-31.3994 -22.7002 -69.6992 -37.0996 -110 -41.7002c-31.3994 -52.0996 -68.0996 -73.5996 -68.0996 -73.5996v-72h48c35.2998 0 64 -20.7002 64 -56v-12
c0 -6.59961 -5.40039 -12 -12 -12h-296c-6.59961 0 -12 5.40039 -12 12v12c0 35.2998 28.7002 56 64 56h48v72s-36.7002 21.5 -68.0996 73.5996c-40.2002 4.60059 -78.5 19 -110 41.7002c-39.4004 28.2998 -61.9004 65 -61.9004 100.7v56c0 13.2998 10.7002 24 24 24h104v40
c0 13.2998 10.7002 24 24 24h272c13.2998 0 24 -10.7002 24 -24v-40h104zM99.2998 255.2c12.5 -9 26.6006 -16.2002 41.7002 -21.4004c-7 25 -11.7998 53.6006 -12.7998 86.2002h-64.2002v-16c0 -11.5996 10.9004 -31.2002 35.2998 -48.7998zM512 304v16h-64.2998
c-1 -32.5996 -5.7998 -61.2002 -12.7998 -86.2002c15.0996 5.2002 29.2998 12.4004 41.7998 21.4004c17.5996 12.7002 35.2998 32.7002 35.2998 48.7998z" />
    <glyph glyph-name="upload" unicode="&#xf093;" 
d="M296 64h-80c-13.2998 0 -24 10.7002 -24 24v168h-87.7002c-17.7998 0 -26.7002 21.5 -14.0996 34.0996l152.1 152.2c7.5 7.5 19.7998 7.5 27.2998 0l152.2 -152.2c12.6006 -12.5996 3.7002 -34.0996 -14.0996 -34.0996h-87.7002v-168c0 -13.2998 -10.7002 -24 -24 -24z
M512 72v-112c0 -13.2998 -10.7002 -24 -24 -24h-464c-13.2998 0 -24 10.7002 -24 24v112c0 13.2998 10.7002 24 24 24h136v-8c0 -30.9004 25.0996 -56 56 -56h80c30.9004 0 56 25.0996 56 56v8h136c13.2998 0 24 -10.7002 24 -24zM388 -16c0 11 -9 20 -20 20s-20 -9 -20 -20
s9 -20 20 -20s20 9 20 20zM452 -16c0 11 -9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20s20 9 20 20z" />
    <glyph glyph-name="lemon" unicode="&#xf094;" 
d="M489.038 425.037c23.0938 -23.0938 28.8916 -54.3906 16.833 -75.0928c-34.3115 -58.9043 53.0762 -181.249 -86.7461 -321.071s-262.167 -52.4326 -321.068 -86.7432c-20.7031 -12.0586 -52 -6.2627 -75.0947 16.832c-23.0928 23.0938 -28.8916 54.3906 -16.833 75.0928
c34.3125 58.9043 -53.0781 181.247 86.7451 321.07s262.167 52.4336 321.073 86.7461c20.7012 12.0586 51.9971 6.25879 75.0908 -16.834zM243.881 352.478c8.57227 2.14355 13.7832 10.8291 11.6416 19.4023c-2.14258 8.57324 -10.8281 13.7852 -19.4033 11.6426
c-69.8027 -17.4521 -154.218 -101.949 -171.643 -171.643c-2.1416 -8.57324 3.07031 -17.2588 11.6426 -19.4033c1.30273 -0.324219 2.6084 -0.480469 3.89258 -0.480469c7.16895 0 13.6943 4.85352 15.5117 12.124c14.5498 58.2031 90.1689 133.811 148.357 148.357z" />
    <glyph glyph-name="phone" unicode="&#xf095;" 
d="M493.4 423.4c10.8994 -2.5 18.5996 -12.2002 18.5996 -23.4004c0 -256.5 -207.9 -464 -464 -464c-11.2998 0 -20.9004 7.7998 -23.4004 18.5996l-24 104c-2.59961 11.3008 3.30078 22.9004 14 27.6006l112 48c9.80078 4.2002 21.2002 1.39941 28 -6.90039
l49.6006 -60.5996c78.2998 36.7002 141.2 100.5 177.2 177.2l-60.6006 49.5996c-8.2998 6.7002 -11.0996 18.2002 -6.89941 28l48 112c4.59961 10.5996 16.1992 16.5 27.5 13.9004z" />
    <glyph glyph-name="phone-square" unicode="&#xf098;" horiz-adv-x="448" 
d="M400 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352zM94 32c160.055 0 290 129.708 290 290v0c0 6.58691 -5.20898 13.1338 -11.6279 14.6143l-65 14.998
c-0.918945 0.211914 -2.42969 0.383789 -3.37305 0.383789c-5.45996 0 -11.6367 -4.07324 -13.7871 -9.09082l-30 -69.998c-0.668945 -1.5625 -1.21191 -4.20898 -1.21191 -5.9082c0 -3.92383 2.46387 -9.125 5.50098 -11.6104l37.8857 -30.9971
c-22.4834 -47.9219 -61.8369 -87.8164 -110.78 -110.779l-30.9971 37.8848c-2.48535 3.03711 -7.68652 5.50195 -11.6104 5.50195c-1.69922 0 -4.3457 -0.543945 -5.9082 -1.21289l-69.998 -29.999c-5.01855 -2.15039 -9.09082 -8.32715 -9.09082 -13.7871
c0 -0.943359 0.171875 -2.4541 0.383789 -3.37305l14.998 -65c1.55957 -6.75391 7.58301 -11.627 14.6162 -11.627z" />
    <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="448" 
d="M400 192c26.5 0 48 -21.5 48 -48v-160c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v160c0 26.5 21.5 48 48 48h24v102.5c0 84 67.5 153.2 151.5 153.5s152.5 -68 152.5 -152v-16c0 -13.2998 -10.7002 -24 -24 -24h-32c-13.2998 0 -24 10.7002 -24 24v16
c0 39.9004 -32.7002 72.4004 -72.7002 72c-39.5996 -0.400391 -71.2998 -33.2998 -71.2998 -72.9004v-103.1h248z" />
    <glyph glyph-name="credit-card" unicode="&#xf09d;" horiz-adv-x="576" 
d="M0 16v176h576v-176c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48zM192 84v-40c0 -6.59961 5.40039 -12 12 -12h136c6.59961 0 12 5.40039 12 12v40c0 6.59961 -5.40039 12 -12 12h-136c-6.59961 0 -12 -5.40039 -12 -12zM64 84v-40
c0 -6.59961 5.40039 -12 12 -12h72c6.59961 0 12 5.40039 12 12v40c0 6.59961 -5.40039 12 -12 12h-72c-6.59961 0 -12 -5.40039 -12 -12zM576 368v-48h-576v48c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48z" />
    <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="448" 
d="M128.081 32.041c0 -35.3691 -28.6719 -64.041 -64.041 -64.041s-64.04 28.6719 -64.04 64.041s28.6719 64.041 64.041 64.041s64.04 -28.6729 64.04 -64.041zM303.741 -15.209c0.494141 -9.13477 -6.84668 -16.791 -15.9951 -16.79h-48.0693
c-8.41406 0 -15.4707 6.49023 -16.0176 14.8867c-7.29883 112.07 -96.9404 201.488 -208.772 208.772c-8.39648 0.545898 -14.8867 7.60254 -14.8867 16.0176v48.0693c0 9.14746 7.65625 16.4883 16.791 15.9941c154.765 -8.36328 278.596 -132.351 286.95 -286.95z
M447.99 -15.4971c0.324219 -9.03027 -6.97168 -16.5029 -16.0049 -16.5039h-48.0684c-8.62598 0 -15.6455 6.83496 -15.999 15.4531c-7.83789 191.148 -161.286 344.626 -352.465 352.465c-8.61816 0.354492 -15.4531 7.37402 -15.4531 15.999v48.0684
c0 9.03418 7.47266 16.3301 16.5029 16.0059c234.962 -8.43555 423.093 -197.667 431.487 -431.487z" />
    <glyph glyph-name="hdd" unicode="&#xf0a0;" horiz-adv-x="576" 
d="M576 144v-96c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v96c0 26.5098 21.4902 48 48 48h480c26.5098 0 48 -21.4902 48 -48zM528 224h-480h-0.0693359c-8.81738 0 -22.5742 -2.76172 -30.708 -6.16504l96.5283 144.791
c7.86621 11.7988 25.7578 21.374 39.9385 21.374h268.621c14.1807 0 32.0732 -9.57617 39.9395 -21.374l96.5273 -144.791c-8.13379 3.40332 -21.8906 6.16504 -30.708 6.16504h-0.0693359zM480 128c-17.6729 0 -32 -14.3271 -32 -32s14.3271 -32 32 -32s32 14.3271 32 32
s-14.3271 32 -32 32zM384 128c-17.6729 0 -32 -14.3271 -32 -32s14.3271 -32 32 -32s32 14.3271 32 32s-14.3271 32 -32 32z" />
    <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="576" 
d="M576 208c0 -23.6299 -12.9502 -44.04 -32.0098 -55.1299v-152.87c0 -9.21973 -7.08008 -32 -32 -32c-6.19336 0.00585938 -15.1445 3.15039 -19.9805 7.01953l-85.0293 68.0303c-42.7002 34.1406 -96.3203 52.9502 -150.98 52.9502h-28.0801
c-2.79004 -10.21 -4.41016 -20.8896 -4.41016 -32c0 -29.0801 9.75 -55.9199 26.1504 -77.4404c15.79 -20.7197 0.149414 -50.5596 -25.9004 -50.5596h-74.2793c-11.8809 0 -23.2109 6.37012 -28.4004 17.0596c-16.2998 33.5908 -25.5605 71.1709 -25.5605 110.94
c0 10.8604 0.790039 21.5195 2.18066 32h-33.7002c-35.3496 0 -64 28.6504 -64 64v96c0 35.3496 28.6504 64 64 64h192c54.6602 0 108.28 18.8096 150.99 52.9502l85.0293 68.0303c5.79004 4.63965 12.8604 7.01953 19.9805 7.01953c25.0195 0 32 -23.2598 32 -32.0098
v-152.87c19.0498 -11.0801 32 -31.4902 32 -55.1201zM480 66.5801v282.84l-33.0498 -26.4395c-54 -43.2002 -121.83 -66.9805 -190.95 -66.9805v-96c69.1201 0 136.95 -23.7803 190.95 -66.9805z" />
    <glyph glyph-name="certificate" unicode="&#xf0a3;" 
d="M458.622 192.08l45.9844 -45.0039c13.7012 -12.9727 7.32227 -36.0371 -10.6641 -40.3389l-62.6504 -15.9902l17.6611 -62.0146c4.99023 -17.834 -11.8252 -34.665 -29.6611 -29.6719l-61.9941 17.667l-15.9834 -62.6709
c-4.33887 -18.1533 -27.8252 -24.1553 -40.3252 -10.668l-44.9893 46.001l-44.9912 -46.001c-12.6289 -13.3496 -35.8857 -7.90625 -40.3252 10.668l-15.9834 62.6709l-61.9941 -17.667c-17.832 -4.99121 -34.6523 11.833 -29.6611 29.6719l17.6611 62.0146
l-62.6504 15.9902c-17.9795 4.2998 -24.3721 27.3613 -10.6641 40.3389l45.9854 45.0039l-45.9854 45.0049c-13.7012 12.9707 -7.32227 36.0371 10.665 40.3379l62.6504 15.9902l-17.6611 62.0146c-4.99023 17.834 11.8242 34.665 29.6611 29.6709l61.9951 -17.667
l15.9834 62.6709c4.27832 17.9023 27.6953 24.0195 40.3252 10.6689l44.9893 -46.3418l44.9902 46.3428c12.7744 13.5039 36.0947 7.03027 40.3252 -10.6689l15.9834 -62.6709l61.9941 17.667c17.832 4.99219 34.6523 -11.833 29.6611 -29.6709l-17.6611 -62.0146
l62.6504 -15.9902c17.9795 -4.2998 24.3721 -27.3623 10.6641 -40.3389z" />
    <glyph glyph-name="hand-point-right" unicode="&#xf0a4;" 
d="M512 248.348c0 -23.625 -20.6504 -43.8252 -44.7998 -43.8252h-99.8516c16.3408 -17.0488 18.3467 -49.7666 -6.29883 -70.9443c14.2881 -22.8291 2.14746 -53.0176 -16.4502 -62.3154c8.97461 -49.1406 -21.9453 -71.2627 -72.5996 -71.2627
c-2.74609 0 -13.2764 0.203125 -16 0.195312c-61.9707 -0.167969 -76.8936 31.0645 -123.731 38.3145c-11.6729 1.80762 -20.2686 11.8916 -20.2686 23.7041v171.525l0.00195312 0.000976562c0.0107422 18.3662 10.6074 35.8887 28.4639 43.8447
c28.8857 12.9941 95.4131 49.0381 107.534 77.3232c7.79688 18.1934 21.3838 29.084 40 29.0918c34.2217 0.0136719 57.752 -35.0977 44.1191 -66.9082c-3.58301 -8.3584 -8.3125 -16.6699 -14.1533 -24.918h149.234c23.4502 0 44.7998 -20.543 44.7998 -43.8262zM96 248
v-192c0 -13.2549 -10.7451 -24 -24 -24h-48c-13.2549 0 -24 10.7451 -24 24v192c0 13.2549 10.7451 24 24 24h48c13.2549 0 24 -10.7451 24 -24zM68 80c0 11.0459 -8.9541 20 -20 20s-20 -8.9541 -20 -20s8.9541 -20 20 -20s20 8.9541 20 20z" />
    <glyph glyph-name="hand-point-left" unicode="&#xf0a5;" 
d="M44.7998 292.174h149.234c-5.84082 8.24805 -10.5703 16.5586 -14.1533 24.918c-13.6328 31.8105 9.89746 66.9219 44.1191 66.9082c18.6162 -0.0078125 32.2031 -10.8975 40 -29.0918c12.1221 -28.2861 78.6484 -64.3291 107.534 -77.3232
c17.8564 -7.95605 28.4531 -25.4785 28.4639 -43.8447l0.00195312 -0.000976562v-171.526c0 -11.8115 -8.5957 -21.8965 -20.2686 -23.7031c-46.8379 -7.25 -61.7607 -38.4824 -123.731 -38.3145c-2.72363 0.00683594 -13.2539 -0.195312 -16 -0.195312
c-50.6543 0 -81.5742 22.1221 -72.5996 71.2627c-18.5977 9.29688 -30.7383 39.4863 -16.4502 62.3154c-24.6455 21.1768 -22.6396 53.8955 -6.29883 70.9443h-99.8516c-24.1494 0 -44.7998 20.2002 -44.7998 43.8252c0 23.2832 21.3496 43.8262 44.7998 43.8262zM440 272
h48c13.2549 0 24 -10.7451 24 -24v-192c0 -13.2549 -10.7451 -24 -24 -24h-48c-13.2549 0 -24 10.7451 -24 24v192c0 13.2549 10.7451 24 24 24zM464 60c11.0459 0 20 8.9541 20 20s-8.9541 20 -20 20s-20 -8.9541 -20 -20s8.9541 -20 20 -20z" />
    <glyph glyph-name="hand-point-up" unicode="&#xf0a6;" horiz-adv-x="384" 
d="M135.652 448c23.625 0 43.8252 -20.6504 43.8252 -44.7998v-99.8516c17.0488 16.3408 49.7666 18.3467 70.9443 -6.29883c22.8291 14.2881 53.0176 2.14746 62.3154 -16.4502c49.1406 8.97461 71.2627 -21.9453 71.2627 -72.5996
c0 -2.74609 -0.203125 -13.2764 -0.195312 -16c0.167969 -61.9707 -31.0645 -76.8936 -38.3145 -123.731c-1.80762 -11.6729 -11.8916 -20.2686 -23.7041 -20.2686h-171.525l-0.000976562 0.00195312c-18.3662 0.0107422 -35.8887 10.6074 -43.8447 28.4639
c-12.9941 28.8857 -49.0381 95.4121 -77.3232 107.534c-18.1943 7.79688 -29.084 21.3838 -29.0918 40c-0.0136719 34.2217 35.0977 57.752 66.9082 44.1191c8.3584 -3.58301 16.6699 -8.3125 24.918 -14.1533v149.234c0 23.4502 20.543 44.7998 43.8262 44.7998zM136 32
h192c13.2549 0 24 -10.7451 24 -24v-48c0 -13.2549 -10.7451 -24 -24 -24h-192c-13.2549 0 -24 10.7451 -24 24v48c0 13.2549 10.7451 24 24 24zM304 4c-11.0459 0 -20 -8.9541 -20 -20s8.9541 -20 20 -20s20 8.9541 20 20s-8.9541 20 -20 20z" />
    <glyph glyph-name="hand-point-down" unicode="&#xf0a7;" horiz-adv-x="384" 
d="M91.8262 -19.2002v149.234c-8.24805 -5.84082 -16.5586 -10.5703 -24.918 -14.1533c-31.8105 -13.6328 -66.9219 9.89746 -66.9082 44.1191c0.0078125 18.6162 10.8975 32.2031 29.0918 40c28.2861 12.1221 64.3291 78.6484 77.3232 107.534
c7.95605 17.8564 25.4785 28.4531 43.8447 28.4639l0.000976562 0.00195312h171.526c11.8115 0 21.8965 -8.5957 23.7031 -20.2686c7.25 -46.8379 38.4824 -61.7607 38.3145 -123.731c-0.00683594 -2.72363 0.195312 -13.2539 0.195312 -16
c0 -50.6543 -22.1221 -81.5742 -71.2627 -72.5996c-9.29688 -18.5977 -39.4863 -30.7383 -62.3154 -16.4502c-21.1768 -24.6455 -53.8955 -22.6396 -70.9443 -6.29883v-99.8516c0 -24.1494 -20.2002 -44.7998 -43.8252 -44.7998
c-23.2832 0 -43.8262 21.3496 -43.8262 44.7998zM112 376v48c0 13.2549 10.7451 24 24 24h192c13.2549 0 24 -10.7451 24 -24v-48c0 -13.2549 -10.7451 -24 -24 -24h-192c-13.2549 0 -24 10.7451 -24 24zM324 400c0 11.0459 -8.9541 20 -20 20s-20 -8.9541 -20 -20
s8.9541 -20 20 -20s20 8.9541 20 20z" />
    <glyph glyph-name="arrow-circle-left" unicode="&#xf0a8;" 
d="M256 -56c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248s-111 -248 -248 -248zM284.9 87.5996l-75.5 72.4004h182.6c13.2998 0 24 10.7002 24 24v16c0 13.2998 -10.7002 24 -24 24h-182.6l75.5 72.4004c9.69922 9.2998 9.89941 24.7998 0.399414 34.2998
l-11 10.8994c-9.39941 9.40039 -24.5996 9.40039 -33.8994 0l-132.7 -132.6c-9.40039 -9.40039 -9.40039 -24.5996 0 -33.9004l132.7 -132.699c9.39941 -9.40039 24.5996 -9.40039 33.8994 0l11 10.8994c9.5 9.5 9.2998 25 -0.399414 34.2998z" />
    <glyph glyph-name="arrow-circle-right" unicode="&#xf0a9;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM227.1 296.4l75.5 -72.4004h-182.6c-13.2998 0 -24 -10.7002 -24 -24v-16c0 -13.2998 10.7002 -24 24 -24h182.6l-75.5 -72.4004
c-9.69922 -9.2998 -9.89941 -24.7998 -0.399414 -34.2998l11 -10.8994c9.39941 -9.40039 24.5996 -9.40039 33.8994 0l132.7 132.6c9.40039 9.40039 9.40039 24.5996 0 33.9004l-132.7 132.8c-9.39941 9.39941 -24.5996 9.39941 -33.8994 0l-11 -10.9004
c-9.5 -9.59961 -9.2998 -25.0996 0.399414 -34.3994z" />
    <glyph glyph-name="arrow-circle-up" unicode="&#xf0aa;" 
d="M8 192c0 137 111 248 248 248s248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248zM151.6 163.1l72.4004 75.5v-182.6c0 -13.2998 10.7002 -24 24 -24h16c13.2998 0 24 10.7002 24 24v182.6l72.4004 -75.5c9.2998 -9.69922 24.7998 -9.89941 34.2998 -0.399414
l10.8994 11c9.40039 9.39941 9.40039 24.5996 0 33.8994l-132.6 132.7c-9.40039 9.40039 -24.5996 9.40039 -33.9004 0l-132.8 -132.7c-9.39941 -9.39941 -9.39941 -24.5996 0 -33.8994l10.9004 -11c9.59961 -9.5 25.0996 -9.2998 34.3994 0.399414z" />
    <glyph glyph-name="arrow-circle-down" unicode="&#xf0ab;" 
d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM360.4 220.9l-72.4004 -75.5v182.6c0 13.2998 -10.7002 24 -24 24h-16c-13.2998 0 -24 -10.7002 -24 -24v-182.6l-72.4004 75.5
c-9.2998 9.69922 -24.7998 9.89941 -34.2998 0.399414l-10.8994 -11c-9.40039 -9.39941 -9.40039 -24.5996 0 -33.8994l132.6 -132.7c9.40039 -9.40039 24.5996 -9.40039 33.9004 0l132.699 132.7c9.40039 9.39941 9.40039 24.5996 0 33.8994l-10.8994 11
c-9.5 9.5 -25 9.2998 -34.2998 -0.399414z" />
    <glyph glyph-name="globe" unicode="&#xf0ac;" horiz-adv-x="496" 
d="M336.5 288h-177c14.5 89.2998 48.7002 152 88.5 152s74 -62.7002 88.5 -152zM152 192c0 22.2002 1.2002 43.5 3.2998 64h185.3c2.10059 -20.5 3.30078 -41.7998 3.30078 -64s-1.2002 -43.5 -3.30078 -64h-185.3c-2.09961 20.5 -3.2998 41.7998 -3.2998 64zM476.7 288
h-108c-8.7998 56.9004 -25.6006 107.8 -50 141.6c71.5 -21.1992 129.399 -73.6992 158 -141.6zM177.2 429.6c-24.4004 -33.7998 -41.2002 -84.6992 -49.9004 -141.6h-108c28.5 67.9004 86.5 120.4 157.9 141.6zM487.4 256c5.39941 -20.5 8.5 -41.7998 8.5 -64
s-3.10059 -43.5 -8.60059 -64h-114.6c2.09961 21 3.2998 42.5 3.2998 64s-1.2002 43 -3.2998 64h114.7zM120 192c0 -21.5 1.2002 -43 3.2002 -64h-114.601c-5.39941 20.5 -8.59961 41.7998 -8.59961 64s3.2002 43.5 8.59961 64h114.7
c-2.09961 -21 -3.2998 -42.5 -3.2998 -64zM159.5 96h177c-14.5 -89.2998 -48.7002 -152 -88.5 -152s-74 62.7002 -88.5 152zM318.8 -45.5996c24.4004 33.7998 41.2002 84.6992 50 141.6h108c-28.5996 -67.9004 -86.5996 -120.4 -158 -141.6zM19.2998 96h108
c8.7998 -56.9004 25.6006 -107.8 50 -141.6c-71.5 21.1992 -129.399 73.6992 -158 141.6z" />
    <glyph glyph-name="wrench" unicode="&#xf0ad;" 
d="M507.73 338.9c11.7891 -47.4102 -0.84082 -99.6602 -37.9102 -136.73c-39.9004 -39.9004 -97.25 -50.9297 -147.37 -34.2197l-213.21 -213.21c-24.9902 -24.9902 -65.5098 -24.9902 -90.5 0s-24.9902 65.5098 0 90.5l213.39 213.39
c-16.5 50.1006 -5.58984 107.561 34.0498 147.2c37.0303 37.0195 89.2002 49.6699 136.58 37.9297c9.08984 -2.25977 12.2803 -13.54 5.66016 -20.1602l-74.3604 -74.3594l11.3105 -67.8799l67.8799 -11.3105l74.3604 74.3604
c6.58008 6.58008 17.8799 3.51953 20.1201 -5.50977zM64 -24c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24z" />
    <glyph glyph-name="tasks" unicode="&#xf0ae;" 
d="M139.61 412.5l17 -16.5c1.90234 -1.94531 3.44727 -5.7334 3.44727 -8.4541c0 -2.7627 -1.58496 -6.5918 -3.53809 -8.5459l-72.1992 -72.1904l-15.5898 -15.6191c-2.04297 -1.94238 -5.9873 -3.51758 -8.80566 -3.51758c-2.81738 0 -6.7627 1.5752 -8.80469 3.51758
l-47.5898 47.3994c-1.94824 1.94141 -3.5293 5.75 -3.5293 8.5c0 2.75098 1.58105 6.55859 3.5293 8.5l15.7002 15.7197c1.94141 1.94824 5.74902 3.53027 8.5 3.53027c2.75 0 6.55762 -1.58203 8.5 -3.53027l22.6992 -22.1191l63.6807 63.3096
c1.94141 1.94824 5.74902 3.5293 8.5 3.5293c2.75 0 6.55859 -1.58105 8.5 -3.5293zM139.61 253.31l16.9795 -17c1.89648 -1.93164 3.43457 -5.69727 3.43457 -8.4043c0 -2.74805 -1.5791 -6.55371 -3.52441 -8.49512l-72.2002 -72.2197l-15.7002 -15.6904
c-2.04102 -1.94141 -5.9834 -3.5166 -8.7998 -3.5166s-6.75879 1.5752 -8.7998 3.5166l-47.4697 47.5c-1.94824 1.94141 -3.5293 5.74902 -3.5293 8.5s1.58105 6.55859 3.5293 8.5l15.7002 15.6904c1.94141 1.94824 5.74902 3.5293 8.5 3.5293
c2.75 0 6.55762 -1.58105 8.5 -3.5293l22.6992 -22.1006l63.6807 63.7197c1.94141 1.94824 5.74902 3.53027 8.5 3.53027c2.75 0 6.55859 -1.58203 8.5 -3.53027zM64 80c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48c-26.4697 0 -48.5898 21.5 -48.5898 48
s22.0996 48 48.5898 48zM496 64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288zM496 384c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288zM496 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288z" />
    <glyph glyph-name="filter" unicode="&#xf0b0;" 
d="M487.976 448c21.3623 0 32.0459 -25.8965 16.9717 -40.9707l-184.947 -184.971v-262.039c0 -19.5127 -21.9805 -30.71 -37.7627 -19.6611l-80 55.9795c-6.41602 4.49219 -10.2373 11.8311 -10.2373 19.6621v206.059l-184.942 184.971
c-15.1045 15.1045 -4.34766 40.9707 16.9707 40.9707h463.947z" />
    <glyph glyph-name="briefcase" unicode="&#xf0b1;" 
d="M320 112v48h192v-144c0 -25.5996 -22.4004 -48 -48 -48h-416c-25.5996 0 -48 22.4004 -48 48v144h192v-48c0 -8.83984 7.16016 -16 16 -16h96c8.83984 0 16 7.16016 16 16zM464 320c25.5996 0 48 -22.4004 48 -48v-80h-512v80c0 25.5996 22.4004 48 48 48h80v48
c0 25.5996 22.4004 48 48 48h160c25.5996 0 48 -22.4004 48 -48v-48h80zM320 320v32h-128v-32h128z" />
    <glyph glyph-name="arrows-alt" unicode="&#xf0b2;" 
d="M352.201 22.2246l-79.1963 -79.1953c-9.37305 -9.37305 -24.5684 -9.37305 -33.9404 0l-79.1963 79.1953c-15.1191 15.1191 -4.41113 40.9717 16.9707 40.9707h51.1621l-0.000976562 100.805h-100.804v-51.1621c0 -21.3818 -25.8516 -32.0898 -40.9717 -16.9707
l-79.1953 79.1963c-9.37305 9.37207 -9.37305 24.5684 0 33.9404l79.1953 79.1963c15.1191 15.1191 40.9717 4.41113 40.9717 -16.9717v-51.2285h100.804v100.804h-51.2305c-21.3818 0 -32.0898 25.8516 -16.9707 40.9717l79.1963 79.1953
c9.37305 9.37305 24.5684 9.37305 33.9404 0l79.1963 -79.1953c15.1191 -15.1191 4.41113 -40.9717 -16.9707 -40.9717h-51.1621v-100.804h100.804v51.1621c0 21.3818 25.8516 32.0898 40.9707 16.9707l79.1953 -79.1963c9.37305 -9.37207 9.37305 -24.5684 0 -33.9404
l-79.1953 -79.1963c-15.1191 -15.1191 -40.9717 -4.41113 -40.9707 16.9717v51.2285h-100.803v-100.804h51.2305c21.3818 0 32.0898 -25.8516 16.9707 -40.9717z" />
    <glyph glyph-name="users" unicode="&#xf0c0;" horiz-adv-x="640" 
d="M96 224c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM544 224c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM576 192c35.2998 0 64 -28.7002 64 -64v-32
c0 -17.7002 -14.2998 -32 -32 -32h-66c-6.2002 47.4004 -34.7998 87.2998 -75.0996 109.4c11.5996 11.5 27.5 18.5996 45.0996 18.5996h64zM320 192c-61.9004 0 -112 50.0996 -112 112s50.0996 112 112 112s112 -50.0996 112 -112s-50.0996 -112 -112 -112zM396.8 160
c63.6006 0 115.2 -51.5996 115.2 -115.2v-28.7998c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v28.7998c0 63.6006 51.5996 115.2 115.2 115.2h8.2998c20.9004 -10 43.9004 -16 68.5 -16s47.7002 6 68.5 16h8.2998zM173.1 173.4
c-40.2998 -22.1006 -68.8994 -62 -75.1992 -109.4h-65.9004c-17.7002 0 -32 14.2998 -32 32v32c0 35.2998 28.7002 64 64 64h64c17.5996 0 33.5 -7.09961 45.0996 -18.5996z" />
    <glyph glyph-name="link" unicode="&#xf0c1;" 
d="M326.612 262.609c59.7471 -59.8096 58.9268 -155.698 0.359375 -214.591c-0.109375 -0.119141 -0.239258 -0.25 -0.359375 -0.369141l-67.2002 -67.2002c-59.2705 -59.2705 -155.699 -59.2627 -214.96 0c-59.2705 59.2598 -59.2705 155.7 0 214.96l37.1055 37.1055
c9.84082 9.84082 26.7861 3.30078 27.2939 -10.6055c0.648438 -17.7227 3.82617 -35.5273 9.69043 -52.7207c1.98633 -5.82227 0.567383 -12.2627 -3.7832 -16.6123l-13.0869 -13.0869c-28.0254 -28.0264 -28.9053 -73.6602 -1.15527 -101.96
c28.0244 -28.5791 74.0859 -28.749 102.325 -0.510742l67.2002 67.1904c28.1914 28.1914 28.0732 73.7568 0 101.83c-3.70117 3.69434 -7.42871 6.56348 -10.3408 8.56934c-3.66504 2.51562 -6.77734 8.16309 -6.94727 12.6055
c-0.395508 10.5674 3.34766 21.4561 11.6982 29.8057l21.0537 21.0557c5.52148 5.52051 14.1826 6.19922 20.584 1.73047c6.08301 -4.24707 15.2764 -11.9512 20.5225 -17.1963zM467.547 403.551c59.2705 -59.2598 59.2705 -155.7 -0.000976562 -214.959l-37.1055 -37.1055
c-9.84082 -9.83984 -26.7852 -3.30078 -27.2939 10.6055c-0.648438 17.7227 -3.82617 35.5273 -9.69043 52.7217c-1.98633 5.82129 -0.567383 12.2617 3.7832 16.6113l13.0869 13.0869c28.0264 28.0264 28.9053 73.6602 1.15527 101.96
c-28.0254 28.5791 -74.0869 28.749 -102.325 0.510742l-67.2002 -67.1904c-28.1914 -28.1914 -28.0732 -73.7568 0 -101.83c3.70117 -3.69434 7.42871 -6.56348 10.3408 -8.56934c3.66504 -2.51562 6.77734 -8.16309 6.94727 -12.6055
c0.395508 -10.5674 -3.34766 -21.4561 -11.6982 -29.8057l-21.0537 -21.0557c-5.52051 -5.51953 -14.1826 -6.19922 -20.584 -1.73047c-6.08203 4.24609 -15.2754 11.9502 -20.5215 17.1953c-59.7471 59.8096 -58.9258 155.698 -0.359375 214.591
c0.109375 0.119141 0.239258 0.25 0.359375 0.369141l67.2002 67.2002c59.2705 59.2705 155.699 59.2627 214.96 0z" />
    <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="640" 
d="M537.6 221.4c58.4004 -11.8008 102.4 -63.5 102.4 -125.4c0 -70.7002 -57.2998 -128 -128 -128h-368c-79.5 0 -144 64.5 -144 144c0 62.7998 40.2002 116.2 96.2002 135.9c-0.100586 2.69922 -0.200195 5.39941 -0.200195 8.09961c0 88.4004 71.5996 160 160 160
c59.2998 0 111 -32.2002 138.7 -80.2002c15.2002 10.2002 33.5996 16.2002 53.2998 16.2002c53 0 96 -43 96 -96c0 -12.2002 -2.2998 -23.9004 -6.40039 -34.5996z" />
    <glyph glyph-name="flask" unicode="&#xf0c3;" horiz-adv-x="448" 
d="M437.2 44.5c29.2998 -47 -4.40039 -108.5 -60.1006 -108.5h-306.199c-55.6006 0 -89.4004 61.4004 -60.1006 108.5l117.2 188.5v151h-8c-13.2998 0 -24 10.7002 -24 24v16c0 13.2998 10.7002 24 24 24h208c13.2998 0 24 -10.7002 24 -24v-16
c0 -13.2998 -10.7002 -24 -24 -24h-8v-151zM137.9 128h172l-48.2002 77.5996c-3.60059 5.2002 -5.7998 11.5 -5.7998 18.4004v160h-64v-160c0 -6.7998 -2.10059 -13.2002 -5.80078 -18.4004z" />
    <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="448" 
d="M278.06 192l166.421 -166.43c4.68945 -4.69043 4.68945 -12.29 0 -16.9707c-32.8008 -32.7998 -85.9902 -32.7998 -118.79 0l-115.511 115.521l-24.8594 -24.8604c4.30957 -10.9199 6.67969 -22.8096 6.67969 -35.2598c0 -53.0195 -42.9805 -96 -96 -96
s-96 42.9805 -96 96s42.9805 96 96 96c4.53027 0 8.99023 -0.320312 13.3604 -0.929688l32.9297 32.9297l-32.9297 32.9297c-4.37012 -0.609375 -8.82031 -0.929688 -13.3604 -0.929688c-53.0195 0 -96 42.9805 -96 96s42.9805 96 96 96s96 -42.9805 96 -96
c0 -12.4502 -2.37012 -24.3398 -6.67969 -35.2598l24.8594 -24.8604l115.511 115.521c32.7998 32.7998 85.9893 32.7998 118.79 0c4.68945 -4.68066 4.68945 -12.2803 0 -16.9707zM96 288c17.6396 0 32 14.3604 32 32s-14.3604 32 -32 32s-32 -14.3604 -32 -32
s14.3604 -32 32 -32zM96 32c17.6396 0 32 14.3604 32 32s-14.3604 32 -32 32s-32 -14.3604 -32 -32s14.3604 -32 32 -32z" />
    <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="448" 
d="M320 0v-40c0 -13.2549 -10.7451 -24 -24 -24h-272c-13.2549 0 -24 10.7451 -24 24v368c0 13.2549 10.7451 24 24 24h72v-296c0 -30.8789 25.1211 -56 56 -56h168zM320 344c0 -13.2002 10.7998 -24 24 -24h104v-264c0 -13.2549 -10.7451 -24 -24 -24h-272
c-13.2549 0 -24 10.7451 -24 24v368c0 13.2549 10.7451 24 24 24h168v-104zM440.971 375.029c3.87988 -3.88086 7.0293 -11.4834 7.0293 -16.9707v-6.05859h-96v96h6.05859c5.4873 0 13.0898 -3.14941 16.9707 -7.0293z" />
    <glyph glyph-name="paperclip" unicode="&#xf0c6;" horiz-adv-x="448" 
d="M43.2461 -18.1416c-58.4297 60.2891 -57.3408 157.511 1.38574 217.581l209.76 214.561c44.3164 45.332 116.352 45.3359 160.672 0c43.8896 -44.8936 43.9424 -117.329 0 -162.276l-182.85 -186.852c-29.8545 -30.5371 -78.6328 -30.1113 -107.981 0.998047
c-28.2754 29.9697 -27.3682 77.4727 1.45117 106.953l143.743 146.835c6.18262 6.31348 16.3125 6.42188 22.626 0.241211l22.8613 -22.3799c6.31445 -6.18164 6.42188 -16.3115 0.241211 -22.626l-143.729 -146.82c-4.93164 -5.04492 -5.23535 -13.4287 -0.647461 -18.292
c4.37207 -4.63379 11.2451 -4.71094 15.6875 -0.165039l182.85 186.851c19.6123 20.0625 19.6123 52.7256 -0.0117188 72.7979c-19.1885 19.627 -49.957 19.6377 -69.1533 0l-209.762 -214.56c-34.7627 -35.5605 -35.2988 -93.1201 -1.19043 -128.313
c34.0098 -35.0928 88.9844 -35.1367 123.058 -0.285156l172.061 175.999c6.17676 6.31836 16.3066 6.43262 22.626 0.255859l22.877 -22.3643c6.31836 -6.17676 6.43359 -16.3066 0.255859 -22.626l-172.061 -175.998c-59.5752 -60.9385 -155.942 -60.2158 -214.77 0.485352
z" />
    <glyph glyph-name="save" unicode="&#xf0c7;" horiz-adv-x="448" 
d="M433.941 318.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h268.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM224 32
c35.3457 0 64 28.6543 64 64s-28.6543 64 -64 64s-64 -28.6543 -64 -64s28.6543 -64 64 -64zM320 336.52c0 2.74316 -1.5752 6.5459 -3.51465 8.48535l-3.48047 3.48047c-2.25 2.25098 -5.30176 3.51465 -8.48535 3.51465h-228.52c-6.62695 0 -12 -5.37305 -12 -12v-104
c0 -6.62695 5.37305 -12 12 -12h232c6.62695 0 12 5.37305 12 12v100.52z" />
    <glyph glyph-name="square" unicode="&#xf0c8;" horiz-adv-x="448" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352z" />
    <glyph glyph-name="bars" unicode="&#xf0c9;" horiz-adv-x="448" 
d="M16 316c-8.83691 0 -16 7.16309 -16 16v40c0 8.83691 7.16309 16 16 16h416c8.83691 0 16 -7.16309 16 -16v-40c0 -8.83691 -7.16309 -16 -16 -16h-416zM16 156c-8.83691 0 -16 7.16309 -16 16v40c0 8.83691 7.16309 16 16 16h416c8.83691 0 16 -7.16309 16 -16v-40
c0 -8.83691 -7.16309 -16 -16 -16h-416zM16 -4c-8.83691 0 -16 7.16309 -16 16v40c0 8.83691 7.16309 16 16 16h416c8.83691 0 16 -7.16309 16 -16v-40c0 -8.83691 -7.16309 -16 -16 -16h-416z" />
    <glyph glyph-name="list-ul" unicode="&#xf0ca;" 
d="M48 400c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48s-48 21.5039 -48 48s21.5039 48 48 48zM48 240c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48s-48 21.5039 -48 48s21.5039 48 48 48zM48 80c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48
s-48 21.5039 -48 48s21.5039 48 48 48zM496 64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 384c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16
h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320z" />
    <glyph glyph-name="list-ol" unicode="&#xf0cb;" 
d="M61.7695 47c19.6104 -5.12012 28.7002 -20.5 28.7305 -34.8799c0 -21.3701 -14.3398 -44.1201 -48.5 -44.1201c-16.6201 0 -29.29 4.75 -37 9.44043c-5.82031 4.21973 -6.34961 9.80957 -2.62988 15.9395l5.58984 9.31055c3.86035 6.61914 9.11035 7 15.5996 3.11914
c4.10352 -1.68652 11.0342 -3.08496 15.4707 -3.11914c10.1602 0 14.3594 3.5 14.3594 8.21973c0 6.64941 -5.60938 9.08984 -15.9395 9.08984h-4.73047c-5.95996 0 -9.25 2.12012 -12.25 7.87988l-1.0498 1.92969c-2.4502 4.75 -1.2002 9.81055 2.7998 14.8809l5.61035 7
c2.85742 3.55664 7.78516 9.07129 11 12.3096h-22.8301c-4.41602 0 -8 3.58398 -8 8v16c0 4.41602 3.58398 8 8 8h57c7.5 0 11.3398 -4 11.3398 -11.3496v-3.31055c0.0107422 -0.245117 0.0205078 -0.644531 0.0205078 -0.890625
c0 -4.20801 -2.28027 -10.166 -5.09082 -13.2988zM496 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 384c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM496 64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-320c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h320zM16 288
c-4.41602 0 -8 3.58398 -8 8v16c0 4.41602 3.58398 8 8 8h16v64h-8c-4.4082 0.0078125 -7.98535 3.5918 -7.98535 8c0 1.04297 0.378906 2.64746 0.845703 3.58008l8 16c1.21777 2.43457 4.41699 4.41504 7.13965 4.41992h24c4.41602 0 8 -3.58398 8 -8v-88h16
c4.41602 0 8 -3.58398 8 -8v-16c0 -4.41602 -3.58398 -8 -8 -8h-64zM12.0898 128c-7.00977 0 -12.0898 4 -12.0898 11.4102v4c0 47.2803 51 56.3994 50.9697 69.1201c0 7.18945 -5.9502 8.75 -9.2793 8.75h-0.0546875c-3.02832 0 -7.24219 -1.7207 -9.40527 -3.83984
c-5.12012 -4.91016 -10.5107 -7 -16.1201 -2.44043l-8.58008 6.87988c-5.7998 4.53027 -7.16992 9.78027 -2.7998 15.3701c6.65918 8.75 19.0996 18.75 40.46 18.75c19.4697 0 44.4697 -10.5 44.4697 -39.5596c0 -37.7607 -45.0498 -46.1504 -48.3398 -56.4404h38.6797
c4.41602 0 8 -3.58398 8 -8v-16c0 -4.41602 -3.58398 -8 -8 -8h-67.9102z" />
    <glyph glyph-name="strikethrough" unicode="&#xf0cc;" 
d="M496 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-480c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h102.29c-11.6797 16.5303 -19.7803 35.4697 -21.7803 56.3604c-0.319336 3.29297 -0.579102 8.65137 -0.579102 11.96
c0 68.2158 55.3633 123.624 123.579 123.68h68h0.0117188c43.6865 0 94.9863 -31.7188 114.509 -70.7998l0.529297 -1c0.930664 -1.86328 1.68652 -5.06641 1.68652 -7.14844c0 -5.45898 -3.96289 -11.8711 -8.8457 -14.3115l-42.9404 -21.4707
c-1.86426 -0.931641 -5.06836 -1.6875 -7.15234 -1.6875c-5.45605 0 -11.8652 3.95996 -14.3076 8.83789c-7.61133 15.2246 -27.6025 27.5801 -44.624 27.5801h-0.0361328h-66.79c-24.0391 -0.000976562 -43.5488 -19.5107 -43.5488 -43.5498
c0 -17.749 13.7666 -36.3945 30.7295 -41.6201l87.1699 -26.8301h202.1zM315.76 128h94.3906c2.21191 -6.56152 4.60352 -17.4746 5.33984 -24.3604c0.319336 -3.29297 0.579102 -8.65137 0.579102 -11.96c0 -68.2158 -55.3633 -123.624 -123.579 -123.68h-68h-0.0117188
c-43.6865 0 -94.9863 31.7188 -114.509 70.7998l-0.529297 1c-0.930664 1.86328 -1.68652 5.06641 -1.68652 7.14844c0 5.45898 3.96289 11.8711 8.8457 14.3115l42.9404 21.4707c1.86426 0.931641 5.06836 1.6875 7.15234 1.6875
c5.45605 0 11.8652 -3.95996 14.3076 -8.83789c7.61133 -15.2246 27.6025 -27.5801 44.624 -27.5801h0.0361328h66.79c24.0176 0.0224609 43.5273 19.5322 43.5498 43.5498c-0.00976562 13.1572 -9.07715 29.4863 -20.2402 36.4502z" />
    <glyph glyph-name="underline" unicode="&#xf0cd;" horiz-adv-x="448" 
d="M32 384c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h144c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32v-160c0 -44.1602 35.8398 -80 80 -80s80 35.8398 80 80v160h-32c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h144c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32v-160c0 -88.2197 -71.7803 -160 -160 -160s-160 71.7803 -160 160v160h-32zM432 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h416z" />
    <glyph glyph-name="table" unicode="&#xf0ce;" 
d="M464 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h416zM224 32v96h-160v-96h160zM224 192v96h-160v-96h160zM448 32v96h-160v-96h160zM448 192v96h-160v-96h160z" />
    <glyph glyph-name="magic" unicode="&#xf0d0;" 
d="M224 352l-16 32l-32 16l32 16l16 32l16 -32l32 -16l-32 -16zM80 288l-26.6602 53.3301l-53.3398 26.6699l53.3398 26.6699l26.6602 53.3301l26.6602 -53.3301l53.3398 -26.6699l-53.3398 -26.6699zM432 160l26.6602 -53.3301l53.3398 -26.6699l-53.3398 -26.6699
l-26.6602 -53.3301l-26.6602 53.3301l-53.3398 26.6699l53.3398 26.6699zM502.62 353.77c12.5 -12.4893 12.5 -32.7598 0 -45.2393l-363.14 -363.15c-6.25 -6.25 -14.4404 -9.37012 -22.6309 -9.37012c-8.17969 0 -16.3691 3.12012 -22.6191 9.37012l-84.8506 84.8506
c-12.5 12.4893 -12.5 32.75 0 45.25l363.14 363.14c6.25 6.25977 14.4404 9.37988 22.6309 9.37988c8.18945 0 16.3799 -3.12012 22.6191 -9.37988zM359.45 244.54l86.5996 86.5996l-50.9102 50.9102l-86.5996 -86.5996z" />
    <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="640" 
d="M624 96c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-48c0 -53 -43 -96 -96 -96s-96 43 -96 96h-128c0 -53 -43 -96 -96 -96s-96 43 -96 96h-16c-26.5 0 -48 21.5 -48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48 -21.5 48 -48v-48h44.0996
c12.7002 0 24.9004 -5.09961 33.9004 -14.0996l99.9004 -99.9004c9 -9 14.0996 -21.2002 14.0996 -33.9004v-108.1h16zM160 -16c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM480 -16c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48
s21.5 -48 48 -48zM560 192v12.0996l-99.9004 99.9004h-44.0996v-112h144z" />
    <glyph glyph-name="money-bill" unicode="&#xf0d6;" horiz-adv-x="640" 
d="M608 384c17.6699 0 32 -14.3301 32 -32v-320c0 -17.6699 -14.3301 -32 -32 -32h-576c-17.6699 0 -32 14.3301 -32 32v320c0 17.6699 14.3301 32 32 32h576zM48 48h64c0 35.3496 -28.6504 64 -64 64v-64zM48 272c35.3496 0 64 28.6504 64 64h-64v-64zM320 96
c44.1699 0 80 42.9697 80 96c0 53.0195 -35.8203 96 -80 96s-80 -42.9805 -80 -96c0 -53.0098 35.8096 -96 80 -96zM592 48v64c-35.3496 0 -64 -28.6504 -64 -64h64zM592 272v64h-64c0 -35.3496 28.6504 -64 64 -64z" />
    <glyph glyph-name="caret-down" unicode="&#xf0d7;" horiz-adv-x="320" 
d="M31.2998 256h257.3c17.8008 0 26.7002 -21.5 14.1006 -34.0996l-128.601 -128.7c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0l-128.6 128.7c-12.6006 12.5996 -3.7002 34.0996 14.0996 34.0996z" />
    <glyph glyph-name="caret-up" unicode="&#xf0d8;" horiz-adv-x="320" 
d="M288.662 96h-257.324c-17.8184 0 -26.7412 21.543 -14.1416 34.1416l128.662 128.662c7.80957 7.81055 20.4736 7.81055 28.2832 0l128.662 -128.662c12.6006 -12.5986 3.67676 -34.1416 -14.1416 -34.1416z" />
    <glyph glyph-name="caret-left" unicode="&#xf0d9;" horiz-adv-x="192" 
d="M192 320.662v-257.324c0 -17.8184 -21.543 -26.7412 -34.1416 -14.1416l-128.662 128.662c-7.81055 7.80957 -7.81055 20.4736 0 28.2832l128.662 128.662c12.5986 12.6006 34.1416 3.67676 34.1416 -14.1416z" />
    <glyph glyph-name="caret-right" unicode="&#xf0da;" horiz-adv-x="192" 
d="M0 63.3379v257.324c0 17.8184 21.543 26.7412 34.1416 14.1416l128.662 -128.662c7.81055 -7.80957 7.81055 -20.4736 0 -28.2832l-128.662 -128.662c-12.5986 -12.6006 -34.1416 -3.67676 -34.1416 14.1416z" />
    <glyph glyph-name="columns" unicode="&#xf0db;" 
d="M464 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h416zM224 32v256h-160v-256h160zM448 32v256h-160v-256h160z" />
    <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="320" 
d="M41 160h238c21.4004 0 32.0996 -25.9004 17 -41l-119 -119c-9.40039 -9.40039 -24.5996 -9.40039 -33.9004 0l-119.1 119c-15.0996 15.0996 -4.40039 41 17 41zM296 265c15.0996 -15.0996 4.40039 -41 -17 -41h-238c-21.4004 0 -32.0996 25.9004 -17 41l119.1 119
c9.30078 9.40039 24.5 9.40039 33.9004 0z" />
    <glyph glyph-name="sort-down" unicode="&#xf0dd;" horiz-adv-x="320" 
d="M41 160h238c21.4004 0 32.0996 -25.9004 17 -41l-119 -119c-9.40039 -9.40039 -24.5996 -9.40039 -33.9004 0l-119.1 119c-15.0996 15.0996 -4.40039 41 17 41z" />
    <glyph glyph-name="sort-up" unicode="&#xf0de;" horiz-adv-x="320" 
d="M279 224h-238c-21.4004 0 -32.0996 25.9004 -17 41l119 119c9.40039 9.40039 24.5996 9.40039 33.9004 0l119 -119c15.1992 -15.0996 4.5 -41 -16.9004 -41z" />
    <glyph glyph-name="envelope" unicode="&#xf0e0;" 
d="M502.3 257.2c3.90039 3.09961 9.7002 0.200195 9.7002 -4.7002v-204.5c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v204.4c0 5 5.7002 7.7998 9.7002 4.69922c22.3994 -17.3994 52.0996 -39.5 154.1 -113.6
c21.1006 -15.4004 56.7002 -47.7998 92.2002 -47.5996c35.7002 -0.300781 72 32.7998 92.2998 47.5996c102 74.0996 131.601 96.2998 154 113.7zM256 128c-23.2002 -0.400391 -56.5996 29.2002 -73.4004 41.4004c-132.699 96.2998 -142.8 104.8 -173.399 128.699
c-5.7998 4.60059 -9.2002 11.5 -9.2002 18.9004v19c0 26.5 21.5 48 48 48h416c26.5 0 48 -21.5 48 -48v-19c0 -7.40039 -3.40039 -14.4004 -9.2002 -18.9004c-30.5996 -24 -40.7002 -32.3994 -173.399 -128.699c-16.8008 -12.2002 -50.2002 -41.8008 -73.4004 -41.4004z" />
    <glyph glyph-name="undo" unicode="&#xf0e2;" 
d="M212.333 223.667h-200.333c-6.62695 0 -12 5.37305 -12 12v200.333c0 6.62695 5.37305 12 12 12h48c6.62695 0 12 -5.37305 12 -12v-78.1123c45.7734 50.833 112.26 82.6426 186.175 82.1055c136.906 -0.994141 246.448 -111.623 246.157 -248.532
c-0.291016 -136.719 -111.212 -247.461 -247.999 -247.461c-64.0889 0 -122.496 24.3135 -166.51 64.2148c-5.09961 4.62207 -5.33398 12.5537 -0.466797 17.4199l33.9668 33.9668c4.47363 4.47461 11.6621 4.71777 16.4004 0.525391
c31.0361 -27.4629 71.8564 -44.127 116.609 -44.127c97.2676 0 176 78.7158 176 176c0 97.2666 -78.7158 176 -176 176c-58.4961 0 -110.28 -28.4756 -142.274 -72.333h98.2744c6.62695 0 12 -5.37305 12 -12v-48c0 -6.62695 -5.37305 -12 -12 -12z" />
    <glyph glyph-name="gavel" unicode="&#xf0e3;" 
d="M504.971 248.638c9.37207 -9.37305 9.37207 -24.5684 0 -33.9404l-124.451 -124.451c-9.37109 -9.37305 -24.5674 -9.37305 -33.9404 0l-22.627 22.627c-9.37305 9.37207 -9.37305 24.5684 0 33.9414l5.65723 5.65625l-39.5986 39.5986l-81.04 -81.04l5.65723 -5.65723
c12.4971 -12.4971 12.4971 -32.7578 0 -45.2549l-114.745 -114.745c-12.4971 -12.4971 -32.7578 -12.4971 -45.2549 0l-45.2549 45.2549c-12.4971 12.4971 -12.4971 32.7578 0 45.2549l114.744 114.746c12.4971 12.4971 32.7578 12.4971 45.2549 0l5.65723 -5.65723
l81.04 81.04l-39.5986 39.5986l-5.65625 -5.65723c-9.37207 -9.37305 -24.5684 -9.37305 -33.9414 0l-22.627 22.627c-9.37305 9.37207 -9.37305 24.5684 0 33.9404l124.451 124.451c9.37207 9.37305 24.5674 9.37305 33.9404 0l22.627 -22.6279
c9.37305 -9.37207 9.37305 -24.5674 0 -33.9404l-5.65625 -5.65723l113.138 -113.137l5.65723 5.65625c9.37207 9.37305 24.5674 9.37305 33.9404 0z" />
    <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="320" 
d="M296 288c18.5 0 30 -20.0996 20.7002 -36l-176 -304c-4.40039 -7.59961 -12.4004 -12 -20.7998 -12c-15.3008 0 -26.9004 14.2998 -23.3008 29.5l46.1006 194.5h-118.7c-14.5 0 -25.7002 12.7998 -23.7998 27.2002l32 240
c1.59961 11.8994 11.7998 20.7998 23.7998 20.7998h144c15.7002 0 27.2002 -15 23.2002 -30.2002l-42.6006 -129.8h115.4z" />
    <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="640" 
d="M128 96c17.6699 0 32 -14.3301 32 -32v-96c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32v96c0 17.6699 14.3301 32 32 32h96zM104 176v-48h-48v57.5898c0 21.1797 17.2305 38.4102 38.4102 38.4102h201.59v64h-40c-17.6699 0 -32 14.3301 -32 32
v96c0 17.6699 14.3301 32 32 32h128c17.6699 0 32 -14.3301 32 -32v-96c0 -17.6699 -14.3301 -32 -32 -32h-40v-64h201.59c21.1797 0 38.4102 -17.2402 38.4102 -38.4102v-57.5898h-48v48h-192v-48h-48v48h-192zM368 96c17.6699 0 32 -14.3301 32 -32v-96
c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32v96c0 17.6699 14.3301 32 32 32h96zM608 96c17.6699 0 32 -14.3301 32 -32v-96c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32v96c0 17.6699 14.3301 32 32 32h96z" />
    <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="576" 
d="M575.7 167.2c2.2002 -10.1006 -8.40039 -21.4004 -18.7002 -11.4004c-51.5 54.4004 -107.6 52.5 -158.6 -37c-5.30078 -9.5 -14.9004 -8.59961 -19.7002 0c-2.5 4.40039 -32.2002 73.2002 -90.7002 73.2002c-45.7998 0 -70.5 -37.7998 -90.7002 -73.2002
c-4.7998 -8.59961 -14.3994 -9.5 -19.7002 0c-50.8994 89.4004 -106.6 92 -158.6 37c-10.2002 -9.89941 -20.9004 1.2998 -18.7002 11.4004c29.2002 136.3 138 218.2 255.7 230.899v17.9004c0 17.7002 14.2998 32 32 32s32 -14.2998 32 -32v-17.9004
c117.3 -12.6992 227.1 -94.5996 255.7 -230.899zM256 146.3c9.59961 8.90039 19.7002 13.6006 32 13.7002c12.2002 0 22.9004 -5.7002 32 -13.5996v-130.301c0 -44.0996 -35.9004 -80 -80 -80c-33.7998 0 -64.2002 21.4004 -75.4004 53.3008
c-5.89941 16.5996 2.80078 34.8994 19.5 40.7998c16.7002 5.89941 34.9004 -2.7998 40.8008 -19.5c1.89941 -5.40039 7.2998 -10.7002 15.0996 -10.7002c8.7998 0 16 7.2002 16 16v130.3z" />
    <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="448" 
d="M128 264v-232h-104c-13.2549 0 -24 10.7451 -24 24v336c0 13.2549 10.7451 24 24 24h80.6104c11.084 19.1104 31.7529 32 55.3896 32s44.3057 -12.8896 55.3896 -32h80.6104c13.2549 0 24 -10.7451 24 -24v-72h-136c-30.8779 0 -56 -25.1211 -56 -56zM160 408
c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24zM344 160h104v-200c0 -13.2549 -10.7451 -24 -24 -24h-240c-13.2549 0 -24 10.7451 -24 24v304c0 13.2549 10.7451 24 24 24h136v-104c0 -13.2002 10.7998 -24 24 -24z
M448 198.059v-6.05859h-96v96h6.05859c5.4873 0 13.0898 -3.14941 16.9707 -7.0293l65.9404 -65.9404c3.88086 -3.88086 7.03027 -11.4834 7.03027 -16.9717z" />
    <glyph glyph-name="lightbulb" unicode="&#xf0eb;" horiz-adv-x="352" 
d="M96.0596 -6.34961l-0.0498047 38.3496h159.98l-0.0400391 -38.3496c-0.00585938 -5.3291 -2.40723 -13.2549 -5.36035 -17.6904l-17.0898 -25.6904c-5.24023 -7.88184 -17.1748 -14.2793 -26.6396 -14.2793h-61.71c-9.46582 0 -21.4004 6.39746 -26.6406 14.2793
l-17.0898 25.6904c-3.49023 5.24023 -5.34961 11.4004 -5.36035 17.6904zM0 272c0 93.0303 73.4404 175.69 175.45 176c97.46 0.299805 176.55 -78.6104 176.55 -176c0 -44.3701 -16.4502 -84.8496 -43.5596 -115.78c-16.5205 -18.8496 -42.3604 -58.2295 -52.21 -91.4502
c-0.0400391 -0.269531 -0.0703125 -0.519531 -0.110352 -0.779297h-160.24c-0.0400391 0.259766 -0.0703125 0.519531 -0.110352 0.779297c-9.84961 33.2207 -35.6895 72.6006 -52.21 91.4502c-27.1094 30.9307 -43.5596 71.4102 -43.5596 115.78zM176 352
c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16c-61.7598 0 -112 -50.2402 -112 -112c0 -8.83984 7.16016 -16 16 -16s16 7.16016 16 16c0 44.1104 35.8896 80 80 80z" />
    <glyph glyph-name="user-md" unicode="&#xf0f0;" horiz-adv-x="448" 
d="M224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM104 24c0 13.2998 10.7002 24 24 24s24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24zM320 159.4c71.2002 -3.5 128 -61.8008 128 -133.801
v-44.7998c0 -24.7002 -20.0996 -44.7998 -44.7998 -44.7998h-358.4c-24.7002 0 -44.7998 20.0996 -44.7998 44.7998v44.7998c0 66.6006 48.5 121.4 112.1 132.101v-80.4004c-23.0996 -6.89941 -40 -28.0996 -40 -53.3994c0 -30.9004 25.1006 -56 56 -56
c30.9004 0 56 25.0996 56 56c0 25.2998 -16.8994 46.5 -40 53.3994v81.6006c7.7002 -1 15.2002 -2.60059 22.6006 -5.2002c18 -6.2998 37.2998 -9.7998 57.3994 -9.7998c20.1006 0 39.4004 3.5 57.4004 9.7998c2.2002 0.799805 4.40039 1.2002 6.59961 1.89941v-45.1992
c-36.5 -7.5 -64 -39.8008 -64 -78.4004v-43.7998c0 -8.10059 5.90039 -14.7998 13.8008 -15.9004l31.1992 -4.2002c4.30078 -0.799805 8.5 2 9.40039 6.30078l3.09961 15.6992c0.800781 4.30078 -2 8.5 -6.2998 9.40039l-19.2998 3.90039v26.6992
c0 67 96 64.7002 96 1.90039v-28.5l-19.2998 -3.90039c-4.40039 -0.799805 -7.2002 -5.09961 -6.2998 -9.39941l3.09961 -15.7002c0.900391 -4.40039 5.09961 -7.2002 9.40039 -6.2998l32.1992 6.39941c7.5 1.5 12.9004 8.10059 12.9004 15.7002v41.7002
c0 38.5996 -27.5 71 -64 78.4004v49z" />
    <glyph glyph-name="stethoscope" unicode="&#xf0f1;" 
d="M447.1 336c35.7002 0.5 64.9004 -28.2998 64.9004 -64c0 -23.7002 -12.9004 -44.2998 -32 -55.4004v-112.6c0 -92.5996 -79 -168 -176 -168c-95.4004 0 -173.3 72.7998 -175.9 163.2c-73 14.7998 -128.1 79.5 -128.1 156.8v155.4c0 11.5 8.09961 21.2998 19.2998 23.5996
l62.7998 12.4004c13 2.59961 25.6006 -5.80078 28.2002 -18.8008l3.10059 -15.6992c2.59961 -13 -5.80078 -25.6006 -18.8008 -28.2002l-30.6992 -6.10059v-122.5c0 -53.2998 43.5 -96.5 96.8994 -96c52.9004 0.5 95.1006 44.3008 95.1006 97.2002v121.4l-30.7002 6.09961
c-13 2.60059 -21.4004 15.2002 -18.7998 28.2002l3.19922 15.7002c2.60059 13 15.2002 21.3994 28.2002 18.7998l62.9004 -12.5996c11.2002 -2.2002 19.2998 -12.1006 19.2998 -23.5v-155.4c0 -77.2002 -55 -141.8 -127.8 -156.8
c2.7002 -55.1006 51.8994 -99.2002 111.899 -99.2002c61.8008 0 112 46.7002 112 104v112.6c-19.5 11.2002 -32.5 32.5 -32 56.8008c0.700195 34.1992 28.8008 62.0996 63 62.5996zM448 256c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16
s7.2002 -16 16 -16z" />
    <glyph glyph-name="suitcase" unicode="&#xf0f2;" 
d="M128 -32v400c0 26.5 21.5 48 48 48h160c26.5 0 48 -21.5 48 -48v-400h-256zM192 352v-32h128v32h-128zM512 272v-256c0 -26.5 -21.5 -48 -48 -48h-48v352h48c26.5 0 48 -21.5 48 -48zM96 -32h-48c-26.5 0 -48 21.5 -48 48v256c0 26.5 21.5 48 48 48h48v-352z" />
    <glyph glyph-name="bell" unicode="&#xf0f3;" horiz-adv-x="448" 
d="M224 -64c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64zM439.39 85.71c6 -6.44043 8.66016 -14.1602 8.61035 -21.71c-0.0996094 -16.4004 -12.9805 -32 -32.0996 -32h-383.801c-19.1191 0 -31.9893 15.5996 -32.0996 32
c-0.0498047 7.5498 2.61035 15.2598 8.61035 21.71c19.3193 20.7598 55.4697 51.9902 55.4697 154.29c0 77.7002 54.4795 139.9 127.939 155.16v20.8398c0 17.6699 14.3203 32 31.9805 32s31.9805 -14.3301 31.9805 -32v-20.8398
c73.46 -15.2598 127.939 -77.46 127.939 -155.16c0 -102.3 36.1504 -133.53 55.4697 -154.29z" />
    <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="640" 
d="M192 64c-53 0 -96 43 -96 96v232c0 13.2998 10.7002 24 24 24h392c70.5996 0 128 -57.4004 128 -128s-57.4004 -128 -128 -128h-32c0 -53 -43 -96 -96 -96h-192zM512 352h-32v-128h32c35.2998 0 64 28.7002 64 64s-28.7002 64 -64 64zM559.7 -32h-511.4
c-47.5996 0 -61 64 -36 64h583.3c25 0 11.8008 -64 -35.8994 -64z" />
    <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="448" 
d="M448 -44v-20h-448v20c0 6.62695 5.37305 12 12 12h20v360c0 13.2549 10.7451 24 24 24h88v72c0 13.2549 10.7451 24 24 24h112c13.2549 0 24 -10.7451 24 -24v-72h88c13.2549 0 24 -10.7451 24 -24v-360h20c6.62695 0 12 -5.37305 12 -12zM308 256h-40
c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12v40c0 6.62695 -5.37305 12 -12 12zM140 192h40c6.62695 0 12 5.37305 12 12v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40
c0 -6.62695 5.37305 -12 12 -12zM244 64h-40c-6.62695 0 -12 -5.37305 -12 -12v-84h64v84c0 6.62695 -5.37305 12 -12 12zM308 160h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12v40c0 6.62695 -5.37305 12 -12 12
zM192 148c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12v40zM182 352h26v-26c0 -3.31152 2.68848 -6 6 -6h20c3.31152 0 6 2.68848 6 6v26h26c3.31152 0 6 2.68848 6 6v20
c0 3.31152 -2.68848 6 -6 6h-26v26c0 3.31152 -2.68848 6 -6 6h-20c-3.31152 0 -6 -2.68848 -6 -6v-26h-26c-3.31152 0 -6 -2.68848 -6 -6v-20c0 -3.31152 2.68848 -6 6 -6z" />
    <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="640" 
d="M624 96c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-48c0 -53 -43 -96 -96 -96s-96 43 -96 96h-128c0 -53 -43 -96 -96 -96s-96 43 -96 96h-16c-26.5 0 -48 21.5 -48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48 -21.5 48 -48v-48h44.0996
c12.7002 0 24.9004 -5.09961 33.9004 -14.0996l99.9004 -99.9004c9 -9 14.0996 -21.2002 14.0996 -33.9004v-108.1h16zM160 -16c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM304 232v48c0 4.40039 -3.59961 8 -8 8h-56v56
c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8v-56h-56c-4.40039 0 -8 -3.59961 -8 -8v-48c0 -4.40039 3.59961 -8 8 -8h56v-56c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8v56h56c4.40039 0 8 3.59961 8 8zM480 -16c26.5 0 48 21.5 48 48
s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM560 192v12.0996l-99.9004 99.9004h-44.0996v-112h144z" />
    <glyph glyph-name="medkit" unicode="&#xf0fa;" 
d="M96 -32v352h32v48c0 26.5098 21.4902 48 48 48h160c26.5098 0 48 -21.4902 48 -48v-48h32v-352h-320zM192 352v-32h128v32h-128zM512 272v-256c0 -26.5098 -21.4902 -48 -48 -48h-16v352h16c26.5098 0 48 -21.4902 48 -48zM64 -32h-16c-26.5098 0 -48 21.4902 -48 48v256
c0 26.5098 21.4902 48 48 48h16v-352zM352 176c0 8.83691 -7.16309 16 -16 16h-48v48c0 8.83691 -7.16309 16 -16 16h-32c-8.83691 0 -16 -7.16309 -16 -16v-48h-48c-8.83691 0 -16 -7.16309 -16 -16v-32c0 -8.83691 7.16309 -16 16 -16h48v-48
c0 -8.83691 7.16309 -16 16 -16h32c8.83691 0 16 7.16309 16 16v48h48c8.83691 0 16 7.16309 16 16v32z" />
    <glyph glyph-name="fighter-jet" unicode="&#xf0fb;" horiz-adv-x="640" 
d="M544 224c96 -21.333 96 -26.583 96 -32s0 -10.667 -96 -32l-128 -16l-48 -16h-24l-116.842 -148h39.5088c11.666 0 21.333 -2.625 21.333 -6s-9.66602 -6 -21.333 -6h-114.667v12h16v164h-48l-66.666 -80h-34.667l-10.667 10.667v69.333h8v16h48v2.66699l-64 8v42.667
l64 8v2.66602h-48v16h-8v69.333l10.667 10.667h34.666l66.667 -80h48v164h-16v12h114.667c11.666 0 21.333 -2.625 21.333 -6s-9.66699 -6 -21.333 -6h-39.5088l116.842 -148h24l48 -16z" />
    <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="448" 
d="M368 352c44.1123 0 80 -35.8877 80 -80v-128.86c0 -31.5273 -18.6035 -60.2031 -47.3936 -73.0527l-80.6064 -35.9766v-42.1104c0 -13.2549 -10.7451 -24 -24 -24h-272c-13.2549 0 -24 10.7451 -24 24v400c0 13.2549 10.7451 24 24 24h272c13.2549 0 24 -10.7451 24 -24
v-40h48zM384 143.14v128.86c0 8.82227 -7.17773 16 -16 16h-48v-183.805l54.5215 24.334c5.22754 2.33789 9.47461 8.88379 9.47852 14.6104zM208 64c8.83594 0 16 7.16406 16 16v224c0 8.83594 -7.16406 16 -16 16s-16 -7.16406 -16 -16v-224
c0 -8.83594 7.16406 -16 16 -16zM112 64c8.83594 0 16 7.16406 16 16v224c0 8.83594 -7.16406 16 -16 16s-16 -7.16406 -16 -16v-224c0 -8.83594 7.16406 -16 16 -16z" />
    <glyph glyph-name="h-square" unicode="&#xf0fd;" horiz-adv-x="448" 
d="M448 368v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48zM336 320h-32c-8.83691 0 -16 -7.16309 -16 -16v-80h-128v80c0 8.83691 -7.16309 16 -16 16h-32
c-8.83691 0 -16 -7.16309 -16 -16v-224c0 -8.83691 7.16309 -16 16 -16h32c8.83691 0 16 7.16309 16 16v80h128v-80c0 -8.83691 7.16309 -16 16 -16h32c8.83691 0 16 7.16309 16 16v224c0 8.83691 -7.16309 16 -16 16z" />
    <glyph glyph-name="plus-square" unicode="&#xf0fe;" horiz-adv-x="448" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM368 164v56c0 6.59961 -5.40039 12 -12 12h-92v92c0 6.59961 -5.40039 12 -12 12h-56c-6.59961 0 -12 -5.40039 -12 -12v-92h-92
c-6.59961 0 -12 -5.40039 -12 -12v-56c0 -6.59961 5.40039 -12 12 -12h92v-92c0 -6.59961 5.40039 -12 12 -12h56c6.59961 0 12 5.40039 12 12v92h92c6.59961 0 12 5.40039 12 12z" />
    <glyph glyph-name="angle-double-left" unicode="&#xf100;" horiz-adv-x="448" 
d="M223.7 209l136 136c9.39941 9.40039 24.5996 9.40039 33.8994 0l22.6006 -22.5996c9.39941 -9.40039 9.39941 -24.6006 0 -33.9004l-96.2998 -96.5l96.3994 -96.4004c9.40039 -9.39941 9.40039 -24.5996 0 -33.8994l-22.5996 -22.7002
c-9.40039 -9.40039 -24.6006 -9.40039 -33.9004 0l-136 136c-9.5 9.40039 -9.5 24.5996 -0.0996094 34zM31.7002 175c-9.40039 9.40039 -9.40039 24.5996 0.0996094 34l136 136c9.2998 9.40039 24.5 9.40039 33.9004 0l22.5996 -22.7002
c9.40039 -9.2998 9.40039 -24.5 0 -33.8994l-96.3994 -96.4004l96.2998 -96.5c9.39941 -9.2998 9.39941 -24.5 0 -33.9004l-22.6006 -22.5996c-9.2998 -9.40039 -24.5 -9.40039 -33.8994 0z" />
    <glyph glyph-name="angle-double-right" unicode="&#xf101;" horiz-adv-x="448" 
d="M224.3 175l-136 -136c-9.39941 -9.40039 -24.5996 -9.40039 -33.8994 0l-22.6006 22.5996c-9.39941 9.40039 -9.39941 24.6006 0 33.9004l96.4004 96.4004l-96.4004 96.3994c-9.39941 9.40039 -9.39941 24.6006 0 33.9004l22.5 22.7998
c9.40039 9.40039 24.6006 9.40039 33.9004 0l136 -136c9.5 -9.40039 9.5 -24.5996 0.0996094 -34zM416.3 209c9.40039 -9.40039 9.40039 -24.5996 0 -33.7998l-136 -136c-9.2998 -9.40039 -24.5 -9.40039 -33.8994 0l-22.6006 22.5996
c-9.39941 9.2998 -9.39941 24.5 0 33.9004l96.4004 96.3994l-96.4004 96.4004c-9.39941 9.2998 -9.39941 24.5 0 33.9004l22.6006 22.5996c9.2998 9.40039 24.5 9.40039 33.8994 0z" />
    <glyph glyph-name="angle-double-up" unicode="&#xf102;" horiz-adv-x="320" 
d="M177 192.3l136 -136c9.40039 -9.39941 9.40039 -24.5996 0 -33.8994l-22.5996 -22.6006c-9.40039 -9.39941 -24.6006 -9.39941 -33.9004 0l-96.5 96.2998l-96.4004 -96.3994c-9.39941 -9.40039 -24.5996 -9.40039 -33.8994 0l-22.7002 22.5996
c-9.40039 9.40039 -9.40039 24.6006 0 33.9004l136 136c9.40039 9.5 24.5996 9.5 34 0.0996094zM143 384.3c9.40039 9.40039 24.5996 9.40039 33.7998 0l136 -136c9.40039 -9.2998 9.40039 -24.5 0 -33.8994l-22.5996 -22.6006c-9.2998 -9.39941 -24.5 -9.39941 -33.9004 0
l-96.3994 96.4004l-96.4004 -96.4004c-9.2998 -9.39941 -24.5 -9.39941 -33.9004 0l-22.5996 22.6006c-9.40039 9.2998 -9.40039 24.5 0 33.8994z" />
    <glyph glyph-name="angle-double-down" unicode="&#xf103;" horiz-adv-x="320" 
d="M143 191.7l-136 136c-9.40039 9.39941 -9.40039 24.5996 0 33.8994l22.5996 22.6006c9.40039 9.39941 24.6006 9.39941 33.9004 0l96.4004 -96.4004l96.3994 96.4004c9.40039 9.39941 24.6006 9.39941 33.9004 0l22.7998 -22.5
c9.40039 -9.40039 9.40039 -24.6006 0 -33.9004l-136 -136c-9.40039 -9.5 -24.5996 -9.5 -34 -0.0996094zM177 -0.299805c-9.40039 -9.40039 -24.5996 -9.40039 -34 0.0996094l-136 136c-9.40039 9.2998 -9.40039 24.5 0 33.9004l22.7002 22.5996
c9.2998 9.40039 24.5 9.40039 33.8994 0l96.4004 -96.3994l96.5 96.2998c9.2998 9.39941 24.5 9.39941 33.9004 0l22.5996 -22.6006c9.40039 -9.2998 9.40039 -24.5 0 -33.8994z" />
    <glyph glyph-name="angle-left" unicode="&#xf104;" horiz-adv-x="256" 
d="M31.7002 209l136 136c9.39941 9.40039 24.5996 9.40039 33.8994 0l22.6006 -22.5996c9.39941 -9.40039 9.39941 -24.6006 0 -33.9004l-96.2998 -96.5l96.3994 -96.4004c9.40039 -9.39941 9.40039 -24.5996 0 -33.8994l-22.5996 -22.7002
c-9.40039 -9.40039 -24.6006 -9.40039 -33.9004 0l-136 136c-9.5 9.40039 -9.5 24.5996 -0.0996094 34z" />
    <glyph glyph-name="angle-right" unicode="&#xf105;" horiz-adv-x="256" 
d="M224.3 175l-136 -136c-9.39941 -9.40039 -24.5996 -9.40039 -33.8994 0l-22.6006 22.5996c-9.39941 9.40039 -9.39941 24.6006 0 33.9004l96.4004 96.4004l-96.4004 96.3994c-9.39941 9.40039 -9.39941 24.6006 0 33.9004l22.5 22.7998
c9.40039 9.40039 24.6006 9.40039 33.9004 0l136 -136c9.5 -9.40039 9.5 -24.5996 0.0996094 -34z" />
    <glyph glyph-name="angle-up" unicode="&#xf106;" horiz-adv-x="320" 
d="M177 288.3l136 -136c9.40039 -9.39941 9.40039 -24.5996 0 -33.8994l-22.5996 -22.6006c-9.40039 -9.39941 -24.6006 -9.39941 -33.9004 0l-96.5 96.2998l-96.4004 -96.3994c-9.39941 -9.40039 -24.5996 -9.40039 -33.8994 0l-22.7002 22.5996
c-9.40039 9.40039 -9.40039 24.6006 0 33.9004l136 136c9.40039 9.5 24.5996 9.5 34 0.0996094z" />
    <glyph glyph-name="angle-down" unicode="&#xf107;" horiz-adv-x="320" 
d="M143 95.7002l-136 136c-9.40039 9.39941 -9.40039 24.5996 0 33.8994l22.5996 22.6006c9.40039 9.39941 24.6006 9.39941 33.9004 0l96.4004 -96.4004l96.3994 96.4004c9.40039 9.39941 24.6006 9.39941 33.9004 0l22.5996 -22.6006
c9.40039 -9.39941 9.40039 -24.5996 0 -33.8994l-136 -136c-9.2002 -9.40039 -24.3994 -9.40039 -33.7998 0z" />
    <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="576" 
d="M528 448c26.5 0 48 -21.5 48 -48v-320c0 -26.5 -21.5 -48 -48 -48h-192l16 -48h72c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24h-272c-13.2998 0 -24 10.7002 -24 24s10.7002 24 24 24h72l16 48h-192c-26.5 0 -48 21.5 -48 48v320c0 26.5 21.5 48 48 48h480z
M512 96v288h-448v-288h448z" />
    <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="640" 
d="M624 32c8.7998 0 16 -7.2002 16 -16v-16c0 -35.2002 -28.7998 -64 -64 -64h-512c-35.2002 0 -64 28.7998 -64 64v16c0 8.7998 7.2002 16 16 16h239.23c-0.25 -14.5303 14.0791 -32 32.7695 -32h60.7998c18.0303 0 32 12.1904 32.7402 32h242.46zM576 400v-336h-512v336
c0 26.4004 21.5996 48 48 48h416c26.4004 0 48 -21.5996 48 -48zM512 128v256h-384v-256h384z" />
    <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="448" 
d="M400 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h352zM224 -32c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="mobile" unicode="&#xf10b;" horiz-adv-x="320" 
d="M272 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-224c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h224zM160 -32c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="quote-left" unicode="&#xf10d;" 
d="M464 192c26.5 0 48 -21.5 48 -48v-128c0 -26.5 -21.5 -48 -48 -48h-128c-26.5 0 -48 21.5 -48 48v240c0 88.4004 71.5996 160 160 160h8c13.2998 0 24 -10.7002 24 -24v-48c0 -13.2998 -10.7002 -24 -24 -24h-8c-35.2998 0 -64 -28.7002 -64 -64v-64h80zM176 192
c26.5 0 48 -21.5 48 -48v-128c0 -26.5 -21.5 -48 -48 -48h-128c-26.5 0 -48 21.5 -48 48v240c0 88.4004 71.5996 160 160 160h8c13.2998 0 24 -10.7002 24 -24v-48c0 -13.2998 -10.7002 -24 -24 -24h-8c-35.2998 0 -64 -28.7002 -64 -64v-64h80z" />
    <glyph glyph-name="quote-right" unicode="&#xf10e;" 
d="M464 416c26.5 0 48 -21.5 48 -48v-240c0 -88.4004 -71.5996 -160 -160 -160h-8c-13.2998 0 -24 10.7002 -24 24v48c0 13.2998 10.7002 24 24 24h8c35.2998 0 64 28.7002 64 64v64h-80c-26.5 0 -48 21.5 -48 48v128c0 26.5 21.5 48 48 48h128zM176 416
c26.5 0 48 -21.5 48 -48v-240c0 -88.4004 -71.5996 -160 -160 -160h-8c-13.2998 0 -24 10.7002 -24 24v48c0 13.2998 10.7002 24 24 24h8c35.2998 0 64 28.7002 64 64v64h-80c-26.5 0 -48 21.5 -48 48v128c0 26.5 21.5 48 48 48h128z" />
    <glyph glyph-name="spinner" unicode="&#xf110;" 
d="M304 400c0 -26.5098 -21.4902 -48 -48 -48s-48 21.4902 -48 48s21.4902 48 48 48s48 -21.4902 48 -48zM256 32c26.5098 0 48 -21.4902 48 -48s-21.4902 -48 -48 -48s-48 21.4902 -48 48s21.4902 48 48 48zM464 240c26.5098 0 48 -21.4902 48 -48s-21.4902 -48 -48 -48
s-48 21.4902 -48 48s21.4902 48 48 48zM96 192c0 -26.5098 -21.4902 -48 -48 -48s-48 21.4902 -48 48s21.4902 48 48 48s48 -21.4902 48 -48zM108.922 92.9219c26.5088 0 48 -21.4912 48 -48c0 -26.5098 -21.4902 -48 -48 -48s-48 21.4902 -48 48s21.4902 48 48 48z
M403.078 92.9219c26.5098 0 48 -21.4912 48 -48c0 -26.5098 -21.4902 -48 -48 -48s-48 21.4902 -48 48s21.4902 48 48 48zM108.922 387.078c26.5088 0 48 -21.4902 48 -48s-21.4902 -48 -48 -48s-48 21.4902 -48 48s21.4902 48 48 48z" />
    <glyph glyph-name="circle" unicode="&#xf111;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248z" />
    <glyph glyph-name="smile" unicode="&#xf118;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM328 272c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32zM168 272c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32
s32 14.2998 32 32s-14.2998 32 -32 32zM362.8 101.8c13.5 16.2998 -11.2002 36.7002 -24.5996 20.5c-22.4004 -26.7998 -55.2002 -42.2002 -90.2002 -42.2002s-67.7998 15.3008 -90.2002 42.2002c-13.5996 16.2002 -38.2002 -4.2002 -24.5996 -20.5
c28.5 -34.2002 70.2998 -53.7998 114.8 -53.7998s86.2998 19.5996 114.8 53.7998z" />
    <glyph glyph-name="frown" unicode="&#xf119;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM328 272c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32zM168 272c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32
s32 14.2998 32 32s-14.2998 32 -32 32zM338.2 53.7998c13.5 -16.2998 38.0996 4.2002 24.5 20.4004c-28.4004 34.2002 -70.2998 53.7998 -114.7 53.7998s-86.2998 -19.5996 -114.8 -53.7002c-13.5 -16.2998 11.0996 -36.7998 24.5996 -20.5
c22.4004 26.7998 55.2998 42.2002 90.2002 42.2002s67.7998 -15.4004 90.2002 -42.2002z" />
    <glyph glyph-name="meh" unicode="&#xf11a;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM168 272c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32zM344 80c21.2002 0 21.2002 32 0 32h-192c-21.2002 0 -21.2002 -32 0 -32
h192zM328 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="640" 
d="M480.07 352c88.2939 -0.0263672 159.952 -71.7061 159.952 -160c0 -88.3203 -71.6797 -160 -160 -160c-37.1016 0 -88.291 21.5039 -114.263 48h-91.5195c-25.9717 -26.4961 -77.1611 -48 -114.263 -48c-88.3203 0 -160 71.6797 -160 160s71.6797 160 160 160h0.0224609
h320.07zM248 180v24c0 6.62402 -5.37598 12 -12 12h-52v52c0 6.62402 -5.37598 12 -12 12h-24c-6.62402 0 -12 -5.37598 -12 -12v-52h-52c-6.62402 0 -12 -5.37598 -12 -12v-24c0 -6.62402 5.37598 -12 12 -12h52v-52c0 -6.62402 5.37598 -12 12 -12h24
c6.62402 0 12 5.37598 12 12v52h52c6.62402 0 12 5.37598 12 12zM464 104c22.0801 0 40 17.9199 40 40s-17.9199 40 -40 40s-40 -17.9199 -40 -40s17.9199 -40 40 -40zM528 200c22.0801 0 40 17.9199 40 40s-17.9199 40 -40 40s-40 -17.9199 -40 -40s17.9199 -40 40 -40z
" />
    <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="576" 
d="M528 0h-480c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h480c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48zM128 268v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40
c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM224 268v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM320 268v40c0 6.62695 -5.37305 12 -12 12h-40
c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM416 268v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM512 268v40
c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM176 172v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40
c6.62695 0 12 5.37305 12 12zM272 172v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM368 172v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40
c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM464 172v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM128 76v40c0 6.62695 -5.37305 12 -12 12h-40
c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM416 76v40c0 6.62695 -5.37305 12 -12 12h-232c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h232c6.62695 0 12 5.37305 12 12zM512 76v40
c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12z" />
    <glyph glyph-name="flag-checkered" unicode="&#xf11e;" 
d="M243.2 258.1c24.2002 -6.69922 47.5996 -16.3994 73.5996 -22.1992v-68.2002c-24.2998 6.7002 -47.5 16.3994 -73.5996 22.2998v68.0996zM466.5 381.1c21.2002 9.80078 45.5 -5.69922 45.4004 -29v-243.1c0 -10.5996 -5.10059 -20.4004 -13.8008 -26.4004
c-35.7998 -24.5996 -74.2998 -40.8994 -122.5 -40.8994c-67.3994 0 -111.6 34.7998 -165.199 34.7998c-50.8008 0 -86.1006 -10 -114.4 -22.0996v-94.4004c0 -13.2998 -10.7002 -24 -24 -24h-16c-13.2998 0 -24 10.7002 -24 24v386.1c-14.5 10.1006 -24 26.9004 -24 45.9004
c0 31.7002 26.2998 57.2998 58.2998 56c28.5 -1.2002 51.7998 -24 53.6006 -52.4004c0.5 -8.39941 -0.800781 -16.2998 -3.60059 -23.5996c20.7002 7.59961 43 12 68 12c67.4004 0 111.7 -34.7998 165.2 -34.7998c40.5 0 82.7002 16 117 31.8994zM169.6 122.5v71.2998
c-26.0996 -2.39941 -47.3994 -8.09961 -73.5996 -17.3994v-70.5c23.5996 8.39941 47.7998 13.8994 73.5996 16.5996zM464 257v70.5c-21.2998 -8.90039 -46.5996 -17.7002 -73.5996 -22.5v-71.9004c-26 -4.19922 -49.9004 -2.59961 -73.6006 2.7002v68.4004
c-26.3994 4.59961 -49.8994 13.8994 -73.5996 21.2998v-67.4004c-25.2002 7 -46.6006 9.40039 -73.6006 5.7002v71.6006c-23.5 -2.2002 -40.3994 -9.80078 -73.5996 -22v-70.5c29 10.6992 51.2002 17.7998 73.5996 20.8994v-70c32.8008 3 53.9004 0.600586 73.6006 -3.7998
v-68.5c26.2998 -4.59961 49.7002 -13.9004 73.5996 -21.2998v67.3994c25.7002 -7.09961 46.6006 -9.2998 73.6006 -5.59961v-71.5996c25.0996 2.39941 48.5 11 73.5996 27.0996v70.5c-22.2002 -14.2002 -48.7998 -22.5996 -73.5996 -26v71.0996
c27.2998 4.40039 50 14.1006 73.5996 23.9004z" />
    <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="640" 
d="M257.981 175.029l-194.344 -194.344c-9.37305 -9.37207 -24.5684 -9.37207 -33.9404 0l-22.668 22.667c-9.35742 9.35742 -9.375 24.5225 -0.0400391 33.9014l154.021 154.746l-154.021 154.745c-9.33496 9.37891 -9.31738 24.5439 0.0400391 33.9014l22.667 22.667
c9.37305 9.37207 24.5684 9.37207 33.9404 0l194.344 -194.344c9.37207 -9.37207 9.37207 -24.5674 0 -33.9404zM640 -8c0 -13.2549 -10.7451 -24 -24 -24h-304c-13.2549 0 -24 10.7451 -24 24v32c0 13.2549 10.7451 24 24 24h304c13.2549 0 24 -10.7451 24 -24v-32z" />
    <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="640" 
d="M278.9 -63.5l-61 17.7002c-6.40039 1.7998 -10 8.5 -8.2002 14.8994l136.5 470.2c1.7998 6.40039 8.5 10 14.8994 8.2002l61 -17.7002c6.40039 -1.7998 10 -8.5 8.2002 -14.8994l-136.5 -470.2c-1.89941 -6.40039 -8.5 -10.1006 -14.8994 -8.2002zM164.9 48.7002
c-4.5 -4.90039 -12.1006 -5.10059 -17 -0.5l-144.101 135.1c-5.09961 4.7002 -5.09961 12.7998 0 17.5l144.101 135c4.89941 4.60059 12.5 4.2998 17 -0.5l43.5 -46.3994c4.69922 -4.90039 4.2998 -12.7002 -0.800781 -17.2002l-90.5996 -79.7002l90.5996 -79.7002
c5.10059 -4.5 5.40039 -12.2998 0.800781 -17.2002zM492.1 48.0996c-4.89941 -4.5 -12.5 -4.2998 -17 0.600586l-43.5 46.3994c-4.69922 4.90039 -4.2998 12.7002 0.800781 17.2002l90.5996 79.7002l-90.5996 79.7998c-5.10059 4.5 -5.40039 12.2998 -0.800781 17.2002
l43.5 46.4004c4.60059 4.7998 12.2002 5 17 0.5l144.101 -135.2c5.09961 -4.7002 5.09961 -12.7998 0 -17.5z" />
    <glyph glyph-name="reply-all" unicode="&#xf122;" horiz-adv-x="576" 
d="M136.309 258.164l176.005 151.985c15.4062 13.3047 39.6865 2.50293 39.6865 -18.1641v-82.7637c129.182 -10.2305 224 -52.2119 224 -183.548c0 -61.4404 -39.582 -122.309 -83.333 -154.132c-13.6533 -9.93066 -33.1113 2.5332 -28.0771 18.6309
c38.5117 123.162 -3.92188 169.482 -112.59 182.016v-84.1758c0 -20.7012 -24.2998 -31.4531 -39.6865 -18.1641l-176.005 151.987c-11.0703 9.56152 -11.0859 26.7529 0 36.3281zM8.30859 221.836c-11.0703 9.56152 -11.0859 26.7529 0 36.3281l176.005 151.985
c15.4062 13.3047 39.6865 2.50293 39.6865 -18.1641v-15.8174l-108.607 -93.7861c-10.7041 -9.23926 -19.3926 -28.2158 -19.3926 -42.3564v-0.0234375v-0.0244141c0 -14.1416 8.68848 -33.1191 19.3936 -42.3604l108.606 -93.7852v-15.8184
c0 -20.7002 -24.2998 -31.4531 -39.6865 -18.1641z" />
    <glyph glyph-name="location-arrow" unicode="&#xf124;" 
d="M444.52 444.48c38.3809 16 79.9609 -25.5801 63.9707 -63.9707l-191.9 -415.779c-22.3896 -47.9805 -92.75 -31.9805 -92.75 19.1895v175.91h-175.91c-51.1699 0 -67.1602 70.3604 -19.1895 92.75z" />
    <glyph glyph-name="crop" unicode="&#xf125;" 
d="M488 96c13.25 0 24 -10.7402 24 -24v-48c0 -13.25 -10.75 -24 -24 -24h-40v-40c0 -13.25 -10.75 -24 -24 -24h-48c-13.25 0 -24 10.75 -24 24v282.75l-146.75 -146.75h114.75v-96h-232c-13.25 0 -24 10.75 -24 24v264h-40c-13.25 0 -24 10.75 -24 24v48
c0 13.2598 10.75 24 24 24h40v40c0 13.2598 10.75 24 24 24h48c13.25 0 24 -10.7402 24 -24v-282.75l146.75 146.75h-114.75v96h210.75l59.3096 59.3096c6.25 6.25 16.3809 6.25 22.6309 0l22.6191 -22.6191c6.25 -6.25 6.25 -16.3809 0 -22.6309l-59.3096 -59.3096v-242.75
h40z" />
    <glyph glyph-name="code-branch" unicode="&#xf126;" horiz-adv-x="384" 
d="M384 304c0 -35.2002 -22.7998 -65.0996 -54.4004 -75.9004c-0.5 -28.0996 -7.59961 -50.5 -21.5996 -67.8994c-28.2002 -35 -76 -39.5 -118.2 -43.4004c-25.7002 -2.39941 -49.8994 -4.59961 -66.0996 -12.7998c-7.10059 -3.59961 -11.7998 -8.2002 -14.9004 -13.4004
c30 -11.5 51.2002 -40.5996 51.2002 -74.5996c0 -44.2002 -35.7998 -80 -80 -80s-80 35.7998 -80 80c0 35.7998 23.5 66.0996 56 76.4004v199.3c-32.5 10.2002 -56 40.5 -56 76.2998c0 44.2002 35.7998 80 80 80s80 -35.7998 80 -80c0 -35.7998 -23.5 -66.0996 -56 -76.2998
v-144c23.9004 11.5 53.0996 14.2998 81.2998 16.8994c35.9004 3.30078 69.7998 6.5 85.2002 25.7002c6.7998 8.40039 10.4004 20.7998 11 36.9004c-33.2002 9.7002 -57.5 40.3994 -57.5 76.7998c0 44.2002 35.7998 80 80 80s80 -35.7998 80 -80zM80 384
c-8.7998 0 -16 -7.2002 -16 -16s7.2002 -16 16 -16s16 7.2002 16 16s-7.2002 16 -16 16zM80 0c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM304 320c-8.7998 0 -16 -7.2002 -16 -16s7.2002 -16 16 -16s16 7.2002 16 16
s-7.2002 16 -16 16z" />
    <glyph glyph-name="unlink" unicode="&#xf127;" 
d="M304.083 42.0928c4.68555 -4.68555 4.68555 -12.2842 0 -16.9707l-44.6738 -44.6738c-59.2627 -59.2627 -155.693 -59.2666 -214.961 0c-59.2646 59.2646 -59.2646 155.695 0 214.96l44.6748 44.6748c4.68555 4.68555 12.2842 4.68555 16.9707 0l39.5986 -39.5977
c4.68555 -4.68652 4.68555 -12.2842 0 -16.9717l-44.6758 -44.6738c-28.0713 -28.0732 -28.0713 -73.75 0 -101.823c28.0723 -28.0713 73.75 -28.0723 101.824 0l44.6738 44.6748c4.68652 4.68555 12.2842 4.68555 16.9717 0zM247.515 302.309l-39.5967 39.5986
c-4.68555 4.68652 -4.68555 12.2852 0 16.9707l44.6738 44.6738c59.2666 59.2646 155.695 59.2646 214.961 0s59.2656 -155.694 0 -214.96l-44.6748 -44.6748c-4.68652 -4.68555 -12.2852 -4.68555 -16.9707 0l-39.5986 39.5977c-4.68555 4.6875 -4.68555 12.2852 0 16.9717
l44.6758 44.6738c28.0713 28.0732 28.0713 73.75 0 101.823c-28.0742 28.0723 -73.752 28.0742 -101.824 0l-44.6738 -44.6748c-4.6875 -4.68555 -12.2852 -4.68555 -16.9717 0zM482.343 -56.9707c-9.37207 -9.37207 -24.5674 -9.37207 -33.9404 0l-441.373 441.373
c-9.37305 9.37207 -9.37305 24.5674 0 33.9404l22.6279 22.6279c9.37207 9.37305 24.5674 9.37305 33.9404 0l441.372 -441.374c9.37305 -9.37207 9.37305 -24.5674 0 -33.9404z" />
    <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="384" 
d="M202.021 448c84.8809 0 175.482 -66.2559 175.481 -153.6c0 -115.982 -125.268 -117.768 -125.268 -160.627v-5.77344c0 -13.2549 -10.7451 -24 -24 -24h-72.4717c-13.2549 0 -24 10.7451 -24 24v9.78809c0 61.8291 46.876 86.5449 82.2998 106.405
c30.376 17.0293 48.9922 28.6113 48.9922 51.1641c0 29.832 -38.0518 49.6309 -68.8154 49.6309c-39.127 0 -57.708 -18.0684 -82.7568 -49.4492c-8.12109 -10.1738 -22.8809 -12.0127 -33.2529 -4.14844l-43.1387 32.709c-10.2705 7.78809 -12.541 22.2939 -5.17773 32.874
c40.5889 58.3232 92.2881 91.0264 172.107 91.0264zM192 74.541c38.1963 0 69.2715 -31.0742 69.2715 -69.2695c0 -38.1963 -31.0752 -69.2715 -69.2715 -69.2715s-69.2715 31.0752 -69.2715 69.2695c0 38.1963 31.0752 69.2715 69.2715 69.2715z" />
    <glyph glyph-name="info" unicode="&#xf129;" horiz-adv-x="192" 
d="M20 23.7715h20v144.457h-20c-11.0459 0 -20 8.9541 -20 20v47.7715c0 11.0459 8.9541 20 20 20h112c11.0459 0 20 -8.9541 20 -20v-212.229h20c11.0459 0 20 -8.9541 20 -20v-47.7715c0 -11.0459 -8.9541 -20 -20 -20h-152c-11.0459 0 -20 8.9541 -20 20v47.7715
c0 11.0459 8.9541 20 20 20zM96 448c39.7637 0 72 -32.2354 72 -72s-32.2354 -72 -72 -72s-72 32.2354 -72 72s32.2354 72 72 72z" />
    <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="192" 
d="M176 16c0 -44.1123 -35.8877 -80 -80 -80s-80 35.8877 -80 80s35.8877 80 80 80s80 -35.8877 80 -80zM25.2598 422.801c-0.68457 13.709 10.2441 25.1992 23.9707 25.1992h93.5391c13.7266 0 24.6553 -11.4902 23.9707 -25.1992l-13.6006 -272
c-0.638672 -12.7725 -11.1807 -22.8008 -23.9697 -22.8008h-66.3398c-12.7891 0 -23.3311 10.0283 -23.9697 22.8008z" />
    <glyph glyph-name="superscript" unicode="&#xf12b;" 
d="M496 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v96h-16c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32
c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-144h16zM336 384c8.83203 0 16 -7.16797 16 -16v-48c0 -8.83203 -7.16797 -16 -16 -16h-33.4805l-77.8096 -112l77.8096 -112h33.4805c8.83203 0 16 -7.16797 16 -16v-48
c0 -8.83203 -7.16797 -16 -16 -16h-67c-4.58984 0.0224609 -10.4404 3.10059 -13.0596 6.87012l-79.9004 115l-79.9004 -115c-2.63477 -3.79199 -8.52148 -6.87012 -13.1387 -6.87012h-0.000976562h-67c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16
h33.4805l77.8096 112l-77.8096 112h-33.4805c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16h67c4.58984 -0.0224609 10.4404 -3.10059 13.0596 -6.87012l79.9004 -115l79.9004 115c2.63477 3.79199 8.52148 6.87012 13.1387 6.87012h0.000976562h67z" />
    <glyph glyph-name="subscript" unicode="&#xf12c;" 
d="M496 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v96h-16c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32
c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-144h16zM336 384c8.83203 0 16 -7.16797 16 -16v-48c0 -8.83203 -7.16797 -16 -16 -16h-33.4805l-77.8096 -112l77.8096 -112h33.4805c8.83203 0 16 -7.16797 16 -16v-48
c0 -8.83203 -7.16797 -16 -16 -16h-67c-4.58984 0.0224609 -10.4404 3.10059 -13.0596 6.87012l-79.9004 115l-79.9004 -115c-2.63477 -3.79199 -8.52148 -6.87012 -13.1387 -6.87012h-0.000976562h-67c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16
h33.4805l77.8096 112l-77.8096 112h-33.4805c-8.83203 0 -16 7.16797 -16 16v48c0 8.83203 7.16797 16 16 16h67c4.58984 -0.0224609 10.4404 -3.10059 13.0596 -6.87012l79.9004 -115l79.9004 115c2.63477 3.79199 8.52148 6.87012 13.1387 6.87012h0.000976562h67z" />
    <glyph glyph-name="eraser" unicode="&#xf12d;" 
d="M497.941 174.059l-142.059 -142.059h144.117c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-356c-10.9756 0 -26.1816 6.29883 -33.9424 14.0586l-96 96c-18.7441 18.7451 -18.7441 49.1377 0 67.8828l256 256
c18.7471 18.7451 49.1387 18.7441 67.8838 0l160 -160c18.7441 -18.7451 18.7441 -49.1377 0 -67.8828zM195.314 236.686l-124.687 -124.686l80 -80h114.745l67.3135 67.3135z" />
    <glyph glyph-name="puzzle-piece" unicode="&#xf12e;" horiz-adv-x="576" 
d="M519.442 159.349c37.5957 0 56.5576 -31.5928 56.5576 -65.792c0 -33.5469 -19.2881 -61.5566 -54.9229 -61.5557c-39.8848 0 -50.3457 36.1523 -86.3086 36.1523c-60.5518 0 -25.8262 -120.102 -25.8262 -120.102c-51.5557 0 -181.23 -35.0732 -181.23 25.7305
c0 35.8271 36.2881 46.25 36.2881 85.9844c0 35.501 -28.1152 54.7178 -61.7881 54.7178c-34.3271 0 -63.5771 -18.8906 -63.5771 -56.3467c0 -41.3633 40 -58.998 40 -81.4707c0 -69.709 -178.635 -28.6621 -178.635 -28.6621v333.237s175.885 -40.9609 175.884 28.6621
c0 22.4727 -31.7109 40.3857 -31.7109 81.75c0 37.4551 31.7119 56.3457 66.3662 56.3457c33.3457 0 61.4609 -19.2158 61.4609 -54.7178c0 -39.7354 -36.2881 -50.1582 -36.2881 -85.9854c0 -83.2969 196.288 -3.29688 196.288 -3.29688
s-54.5908 -176.244 5.38379 -176.244c22.5586 0 40.5391 31.5928 82.0586 31.5928z" />
    <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="352" 
d="M176 96c-53.0195 0 -96 42.9805 -96 96v160c0 53.0195 42.9805 96 96 96s96 -42.9805 96 -96v-160c0 -53.0195 -42.9805 -96 -96 -96zM336 256c8.83984 0 16 -7.16016 16 -16v-48c0 -88.9004 -66.29 -162.47 -152 -174.23v-33.7695h56c8.83984 0 16 -7.16016 16 -16v-16
c0 -8.83984 -7.16016 -16 -16 -16h-160c-8.83984 0 -16 7.16016 -16 16v16c0 8.83984 7.16016 16 16 16h56v34.1504c-88.0303 12.1396 -152 92.0498 -152 181.689v40.1602c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-42.2998
c0 -66.8105 48.71 -126.59 115.21 -133.08c76.2998 -7.44043 140.79 52.5801 140.79 127.38v48c0 8.83984 7.16016 16 16 16h16z" />
    <glyph glyph-name="microphone-slash" unicode="&#xf131;" horiz-adv-x="640" 
d="M633.82 -10.0996c6.97949 -5.43066 8.22949 -15.4805 2.81934 -22.4502l-19.6396 -25.2705c-5.42969 -6.97949 -15.4805 -8.23926 -22.46 -2.80957l-588.36 454.729c-6.97949 5.43066 -8.22949 15.4805 -2.80957 22.4502l19.6396 25.2705
c5.41992 6.97949 15.4805 8.22949 22.46 2.80957l178.54 -137.99v45.3604c0 53.0195 42.9805 96 96 96c53.0205 0 96 -42.9805 96 -96v-160.01c0 -10.4502 -2.17969 -20.2705 -5.2793 -29.6699l26.5498 -20.5205c6.75977 15.4004 10.7197 32.2803 10.7197 50.2002v48
c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-48c0 -29.0098 -7.38965 -56.1299 -19.9805 -80.1396zM400 -16c8.83984 0 16 -7.16016 16 -16v-16c0 -8.83984 -7.16016 -16 -16 -16h-160c-8.83984 0 -16 7.16016 -16 16v16c0 8.83984 7.16016 16 16 16h56
v34.1504c-88.0303 12.1396 -152 92.0498 -152 181.689v6.85059l52.0303 -40.2305c12.4395 -53.2197 55.3301 -96.4004 111.18 -101.85c6.94043 -0.669922 13.6396 -0.200195 20.3496 0.199219l50.1104 -38.7295c-10.8203 -3.77051 -22.0098 -6.70996 -33.6699 -8.31055
v-33.7695h56z" />
    <glyph glyph-name="calendar" unicode="&#xf133;" horiz-adv-x="448" 
d="M12 256h424c6.59961 0 12 -5.40039 12 -12v-260c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v260c0 6.59961 5.40039 12 12 12zM448 300c0 -6.59961 -5.40039 -12 -12 -12h-424c-6.59961 0 -12 5.40039 -12 12v36c0 26.5 21.5 48 48 48h48v52
c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48v-36z" />
    <glyph glyph-name="fire-extinguisher" unicode="&#xf134;" horiz-adv-x="448" 
d="M434.027 421.671c7.31445 1.21875 13.9727 -4.4209 13.9727 -11.8369v-115.668c0 -7.41602 -6.6582 -13.0557 -13.9727 -11.8369l-168 28c-11.7305 1.95508 -10.0273 14.6973 -10.0273 17.6709h-40v-27.0303c41.4043 -10.6582 72 -48.2383 72 -92.9697v-248
c0 -13.2549 -10.7451 -24 -24 -24h-144c-13.2549 0 -24 10.7451 -24 24v246.795c0 44.8945 30.457 83.2666 72 94.1289v27.0762c-61.0361 0 -92.9424 7.00977 -121.711 -64.9141c-4.91699 -12.2949 -18.8789 -18.2959 -31.1963 -13.3701
c-12.3066 4.92285 -18.293 18.8906 -13.3701 31.1973c14.668 36.6709 38.0107 77.833 90.0498 90.8838c-14.1406 36.5273 12.793 76.2031 52.2275 76.2031c37.4463 0 64.3525 -36.1084 53.668 -72h58.332c0 4.2002 -1.30664 15.7822 10.0273 17.6709zM144 376
c8.82227 0 16 7.17773 16 16s-7.17773 16 -16 16s-16 -7.17773 -16 -16s7.17773 -16 16 -16z" />
    <glyph glyph-name="rocket" unicode="&#xf135;" 
d="M505.12 428.906c6.95508 -32.2031 6.95508 -57.4062 6.86133 -82.6094c0 -102.688 -55.4375 -164.781 -128.035 -211.094v-104.438c0 -16.3594 -11.8789 -35.5625 -26.5078 -42.8594l-98.7275 -49.3906c-2.81934 -1.27441 -7.61621 -2.40137 -10.707 -2.51562
c-13.2471 0.00195312 -24.002 10.7539 -24.0059 24v103.844l-22.4746 -22.4688c-13.1211 -13.1562 -34.1211 -11.1875 -45.2773 0l-50.9043 50.9062c-12.9961 12.9922 -11.3652 33.8887 0 45.25l22.4746 22.4688h-103.811c-13.2461 0.00195312 -24.001 10.7539 -24.0059 24
c0.111328 3.09082 1.23828 7.88574 2.51562 10.7031l49.4355 98.8125c7.33008 14.6094 26.5391 26.4688 42.8867 26.4844h104.215c46.2168 72.7969 108.122 128 211.354 128c25.0996 0 50.3086 0 82.5059 -6.90625c5.54883 -1.1875 11.0176 -6.65625 12.207 -12.1875z
M384.04 280c22.0732 0.0078125 39.9971 17.9277 40.0098 40c0 22.0801 -17.9199 40 -40 40s-40 -17.9199 -40 -40c0 -22.0742 17.916 -39.9951 39.9902 -40z" />
    <glyph glyph-name="chevron-circle-left" unicode="&#xf137;" 
d="M256 -56c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248s-111 -248 -248 -248zM142.1 175l135.5 -135.5c9.40039 -9.40039 24.6006 -9.40039 33.9004 0l17 17c9.40039 9.40039 9.40039 24.5996 0 33.9004l-101.6 101.6l101.6 101.6
c9.40039 9.40039 9.40039 24.6006 0 33.9004l-17 17c-9.40039 9.40039 -24.5996 9.40039 -33.9004 0l-135.5 -135.5c-9.39941 -9.40039 -9.39941 -24.5996 0 -34z" />
    <glyph glyph-name="chevron-circle-right" unicode="&#xf138;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM369.9 209l-135.5 135.5c-9.40039 9.40039 -24.6006 9.40039 -33.9004 0l-17 -17c-9.40039 -9.40039 -9.40039 -24.5996 0 -33.9004l101.6 -101.6l-101.6 -101.6
c-9.40039 -9.40039 -9.40039 -24.6006 0 -33.9004l17 -17c9.40039 -9.40039 24.5996 -9.40039 33.9004 0l135.5 135.5c9.39941 9.40039 9.39941 24.5996 0 34z" />
    <glyph glyph-name="chevron-circle-up" unicode="&#xf139;" 
d="M8 192c0 137 111 248 248 248s248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248zM239 305.9l-135.5 -135.5c-9.40039 -9.40039 -9.40039 -24.6006 0 -33.9004l17 -17c9.40039 -9.40039 24.5996 -9.40039 33.9004 0l101.6 101.6l101.6 -101.6
c9.40039 -9.40039 24.6006 -9.40039 33.9004 0l17 17c9.40039 9.40039 9.40039 24.5996 0 33.9004l-135.5 135.5c-9.40039 9.39941 -24.5996 9.39941 -34 0z" />
    <glyph glyph-name="chevron-circle-down" unicode="&#xf13a;" 
d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM273 78.0996l135.5 135.5c9.40039 9.40039 9.40039 24.6006 0 33.9004l-17 17c-9.40039 9.40039 -24.5996 9.40039 -33.9004 0l-101.6 -101.6l-101.6 101.6
c-9.40039 9.40039 -24.6006 9.40039 -33.9004 0l-17 -17c-9.40039 -9.40039 -9.40039 -24.5996 0 -33.9004l135.5 -135.5c9.40039 -9.39941 24.5996 -9.39941 34 0z" />
    <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="576" 
d="M12.9707 96c-10.6904 0 -16.0449 12.9258 -8.48535 20.4854l67.0283 67.0283c4.6875 4.68652 12.2852 4.68652 16.9717 0l67.0283 -67.0283c7.56055 -7.55957 2.20605 -20.4854 -8.48438 -20.4854h-35.1465c20.2969 -54.3359 85.1816 -86.6162 144.117 -94.0146v190.015
h-52c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h52v5.46973c-37.2842 13.1807 -64 48.7324 -64 90.5303c0 53.4746 43.7227 96.7393 97.3701 95.9902c52.2354 -0.728516 94.6348 -43.7627 94.6289 -96.002
c-0.00488281 -41.793 -26.7188 -77.3398 -64 -90.5186v-5.46973h52c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-52v-190.015c59.1543 7.42676 123.827 39.6973 144.117 94.0146h-35.1465c-10.6904 0 -16.0449 12.9248 -8.48438 20.4854
l67.0283 67.0283c4.6875 4.68652 12.2852 4.68652 16.9717 0l67.0283 -67.0283c7.56055 -7.55957 2.20605 -20.4854 -8.48438 -20.4854h-32.3945c-21.7822 -102.62 -136.406 -160 -242.635 -160c-106.056 0 -220.828 57.2646 -242.635 160h-32.3945zM288 384
c-17.6445 0 -32 -14.3555 -32 -32s14.3555 -32 32 -32s32 14.3555 32 32s-14.3555 32 -32 32z" />
    <glyph glyph-name="unlock-alt" unicode="&#xf13e;" horiz-adv-x="448" 
d="M400 192c26.5 0 48 -21.5 48 -48v-160c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v160c0 26.5 21.5 48 48 48h24v102.5c0 84 67.5 153.2 151.5 153.5s152.5 -68 152.5 -152v-16c0 -13.2998 -10.7002 -24 -24 -24h-32c-13.2998 0 -24 10.7002 -24 24v16
c0 39.9004 -32.7002 72.4004 -72.7002 72c-39.5996 -0.400391 -71.2998 -33.2998 -71.2998 -72.9004v-103.1h248zM264 40v48c0 22.0996 -17.9004 40 -40 40s-40 -17.9004 -40 -40v-48c0 -22.0996 17.9004 -40 40 -40s40 17.9004 40 40z" />
    <glyph glyph-name="bullseye" unicode="&#xf140;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM248 8c101.71 0 184 82.3096 184 184c0 101.71 -82.3096 184 -184 184c-101.71 0 -184 -82.3096 -184 -184c0 -101.71 82.3096 -184 184 -184zM248 320
c70.6904 0 128 -57.3096 128 -128s-57.3096 -128 -128 -128s-128 57.3096 -128 128s57.3096 128 128 128zM248 128c35.29 0 64 28.71 64 64s-28.71 64 -64 64s-64 -28.71 -64 -64s28.71 -64 64 -64z" />
    <glyph glyph-name="ellipsis-h" unicode="&#xf141;" 
d="M328 192c0 -39.7998 -32.2002 -72 -72 -72s-72 32.2002 -72 72s32.2002 72 72 72s72 -32.2002 72 -72zM432 264c39.7998 0 72 -32.2002 72 -72s-32.2002 -72 -72 -72s-72 32.2002 -72 72s32.2002 72 72 72zM80 264c39.7998 0 72 -32.2002 72 -72s-32.2002 -72 -72 -72
s-72 32.2002 -72 72s32.2002 72 72 72z" />
    <glyph glyph-name="ellipsis-v" unicode="&#xf142;" horiz-adv-x="192" 
d="M96 264c39.7998 0 72 -32.2002 72 -72s-32.2002 -72 -72 -72s-72 32.2002 -72 72s32.2002 72 72 72zM24 368c0 39.7998 32.2002 72 72 72s72 -32.2002 72 -72s-32.2002 -72 -72 -72s-72 32.2002 -72 72zM24 16c0 39.7998 32.2002 72 72 72s72 -32.2002 72 -72
s-32.2002 -72 -72 -72s-72 32.2002 -72 72z" />
    <glyph glyph-name="rss-square" unicode="&#xf143;" horiz-adv-x="448" 
d="M400 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352zM112 32c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48s21.4902 -48 48 -48zM269.533 32
c6.53516 0 11.7764 5.46777 11.4248 11.9941c-5.9668 110.428 -94.418 198.99 -204.964 204.964c-6.52637 0.351562 -11.9941 -4.88965 -11.9941 -11.4248v-34.335c0 -6.00977 4.63574 -11.0508 10.6328 -11.4414c79.8799 -5.20312 143.909 -69.0732 149.123 -149.123
c0.391602 -5.99805 5.43066 -10.6338 11.4424 -10.6338h34.335zM372.56 32c6.4541 0 11.6641 5.33789 11.4326 11.7871c-5.99512 167.014 -140.375 302.18 -308.205 308.205c-6.44922 0.231445 -11.7871 -4.97852 -11.7871 -11.4326v-34.334
c0 -6.16016 4.88184 -11.1748 11.0391 -11.4277c136.556 -5.59863 246.162 -115.225 251.76 -251.76c0.251953 -6.15625 5.2666 -11.0381 11.4268 -11.0381h34.334z" />
    <glyph glyph-name="play-circle" unicode="&#xf144;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM371.7 168c16.3994 9.09961 16.3994 32.7998 0 42l-176 107c-15.9004 8.7998 -35.7002 -2.59961 -35.7002 -21v-208c0 -18.5 19.9004 -29.7998 35.7002 -21z" />
    <glyph glyph-name="minus-square" unicode="&#xf146;" horiz-adv-x="448" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM92 152h264c6.59961 0 12 5.40039 12 12v56c0 6.59961 -5.40039 12 -12 12h-264c-6.59961 0 -12 -5.40039 -12 -12v-56
c0 -6.59961 5.40039 -12 12 -12z" />
    <glyph glyph-name="check-square" unicode="&#xf14a;" horiz-adv-x="448" 
d="M400 -32h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48zM195.314 66.0586l184 184c6.24707 6.24805 6.24707 16.3799 0 22.627l-22.6279 22.6279
c-6.24707 6.24707 -16.3789 6.24805 -22.6279 0l-150.059 -150.059l-70.0586 70.0596c-6.24805 6.24707 -16.3799 6.24707 -22.6279 0l-22.6279 -22.6279c-6.24707 -6.24707 -6.24707 -16.3789 0 -22.627l104 -104c6.24902 -6.25 16.3799 -6.25 22.6289 -0.000976562z" />
    <glyph glyph-name="pen-square" unicode="&#xf14b;" horiz-adv-x="448" 
d="M400 -32h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48zM238.1 270.1l-135.699 -135.699l-6.30078 -57.1006c-0.799805 -7.59961 5.60059 -14.0996 13.3008 -13.2998l57.0996 6.2998l135.7 135.7
c2.2998 2.2998 2.2998 6.09961 0 8.5l-55.5 55.5c-2.5 2.40039 -6.2998 2.40039 -8.60059 0.0996094zM345 282.9l-30.0996 30.0996c-9.40039 9.40039 -24.6006 9.40039 -33.9004 0l-23.0996 -23.0996c-2.30078 -2.30078 -2.30078 -6.10059 0 -8.5l55.5 -55.5
c2.2998 -2.30078 6.09961 -2.30078 8.5 0l23.0996 23.0996c9.2998 9.2998 9.2998 24.5 0 33.9004z" />
    <glyph glyph-name="share-square" unicode="&#xf14d;" horiz-adv-x="576" 
d="M568.482 270.552l-144.004 -135.984c-15.1787 -14.335 -40.4785 -3.70703 -40.4785 17.4473v71.9629c-144.575 -0.969727 -205.566 -35.1123 -164.775 -171.353c4.4834 -14.9727 -12.8457 -26.5674 -25.0059 -17.3301
c-38.9668 29.5996 -74.2188 86.2168 -74.2188 143.366c0 143.937 117.599 172.5 264 173.312v72.0156c0 21.1738 25.3174 31.7676 40.4785 17.4473l144.004 -135.987c10.0195 -9.46289 10.0273 -25.4248 0 -34.8965zM384 68.8721c0 7.34473 6.53027 12.9053 13.7998 11.8594
c2.81152 -0.405273 7.39844 -0.734375 10.2393 -0.734375c6.80469 0 17.5342 1.8418 23.9502 4.11133c7.81348 2.76367 16.0107 -3.01465 16.0107 -11.3027v-88.8057c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48
h121.033c12.5508 0 16.6748 -16.8301 5.54492 -22.6309c-18.7773 -9.78613 -36.0615 -22.1084 -51.0137 -37.6758c-1.95312 -2.03711 -5.82715 -3.69141 -8.64844 -3.69336h-50.916v-320h320v68.8721z" />
    <glyph glyph-name="compass" unicode="&#xf14e;" horiz-adv-x="496" 
d="M225.38 214.63c12.4902 12.4902 32.75 12.4902 45.25 0s12.5 -32.75 0 -45.25c-12.4902 -12.5 -32.7598 -12.5 -45.25 0c-12.5 12.4902 -12.5 32.75 0 45.25zM248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248z
M374.14 291.95c7.61035 16.6494 -9.54004 33.7998 -26.1895 26.2002l-144.34 -65.9707c-5.97461 -2.73047 -13.04 -9.7959 -15.7705 -15.7695l-65.9795 -144.351c-7.61035 -16.6494 9.5498 -33.8096 26.1992 -26.1992l144.341 65.9697
c5.97363 2.73047 13.0391 9.7959 15.7695 15.7695z" />
    <glyph glyph-name="caret-square-down" unicode="&#xf150;" horiz-adv-x="448" 
d="M448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM92.5 227.5l123 -123c4.7002 -4.7002 12.2998 -4.7002 17 0l123 123c7.59961 7.59961 2.2002 20.5 -8.5 20.5h-246
c-10.7002 0 -16.0996 -12.9004 -8.5 -20.5z" />
    <glyph glyph-name="caret-square-up" unicode="&#xf151;" horiz-adv-x="448" 
d="M0 16v352c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48zM355.515 156.485l-123.029 123.029c-4.68652 4.68652 -12.2842 4.68652 -16.9717 0l-123.028 -123.029
c-7.56055 -7.56055 -2.20605 -20.4854 8.48438 -20.4854h246.06c10.6904 0 16.0449 12.9258 8.48535 20.4854z" />
    <glyph glyph-name="caret-square-right" unicode="&#xf152;" horiz-adv-x="448" 
d="M48 416h352c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48zM188.485 60.4854l123.028 123.028c4.68652 4.68652 4.68652 12.2842 0 16.9717l-123.028 123.029
c-7.56055 7.56055 -20.4854 2.20605 -20.4854 -8.48438v-246.06c0 -10.6904 12.9258 -16.0449 20.4854 -8.48535z" />
    <glyph glyph-name="euro-sign" unicode="&#xf153;" horiz-adv-x="320" 
d="M310.706 34.2354l8.81836 -44.4902c1.23828 -6.24902 -2.62109 -12.3623 -8.78809 -13.957c-12.5391 -3.24414 -34.8008 -7.78809 -61.1016 -7.78809c-104.371 0 -182.496 65.3076 -207.521 155.64h-30.1143c-6.62695 0 -12 5.37305 -12 12v28.3604
c0 6.62695 5.37305 12 12 12h21.3877c-1 12.958 -0.828125 28.6377 0.181641 42.2451h-21.5693c-6.62695 0 -12 5.37305 -12 12v29.7549c0 6.62695 5.37305 12 12 12h33.0752c28.9551 83.748 107.376 144 204.56 144c21.0752 0 40.582 -2.91211 52.6865 -5.20703
c6.86035 -1.30078 11.1475 -8.17578 9.32617 -14.917l-11.9912 -44.3682c-1.65527 -6.125 -7.78613 -9.89062 -14.002 -8.62305c-9.28711 1.89551 -23.3652 4.14551 -37.8516 4.14551c-54.9287 0 -96.9854 -30.0391 -117.619 -75.0303h138.278
c7.66211 0 13.3613 -7.08203 11.7227 -14.5664l-6.51172 -29.7549c-1.13965 -5.20703 -6.3916 -9.43359 -11.7227 -9.43359v0h-146.593c-1.55176 -13.958 -1.34766 -27.917 -0.137695 -42.2451h134.237c7.68945 0 13.3936 -7.12891 11.708 -14.6309l-6.37305 -28.3604
c-1.16211 -5.17188 -6.40723 -9.36914 -11.708 -9.36914h-113.689c19.5322 -50.6582 64.6982 -85.4482 121.462 -85.4482c18.0039 0 34.7334 2.97363 45.4258 5.41211c6.58887 1.50391 13.1094 -2.73828 14.4238 -9.36816z" />
    <glyph glyph-name="pound-sign" unicode="&#xf154;" horiz-adv-x="320" 
d="M308 96c6.62695 0 12 -5.37305 12 -12v-104c0 -6.62695 -5.37305 -12 -12 -12h-296c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h36v128h-28c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h28v66.0391
c0 73.2188 58.0264 125.961 139.931 125.961c48.6455 0 85.1934 -22.5596 101.575 -34.9277c5.39844 -4.07617 6.35254 -11.8057 2.11914 -17.0811l-28.4932 -35.5137c-3.7998 -4.73535 -10.5371 -5.89746 -15.6875 -2.68457
c-11.7744 7.34375 -33.9941 18.8486 -57.6523 18.8486c-37.2305 0 -61.792 -24.8193 -61.792 -57.0859v-63.5557h84c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-84v-126.848h122.505v50.8477c0 6.62695 5.37305 12 12 12h45.4951z" />
    <glyph glyph-name="dollar-sign" unicode="&#xf155;" horiz-adv-x="288" 
d="M209.2 214.6c57.8994 -16.8994 94 -80.0996 72.5 -141.699c-15.4004 -44.1006 -59.1006 -71.8008 -105.7 -72.7002v-48.2002c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v48c-31.4004 0.0996094 -62 10.7998 -86.5 30
c-7.90039 6.09961 -8.90039 17.5996 -1.7998 24.5l34.7998 34c5.2002 5.09961 13.4004 6.09961 19.5 2c10 -6.7998 22 -10.5 34.2002 -10.5h66.2998c16.2998 0 29.5 13.2002 29.5 29.5c0 13 -8.7002 24.5996 -21.2002 28.2998l-102.5 30
c-44.3994 13 -79.5996 50.5 -83.7998 96.6006c-5.90039 64.8994 45.2998 119.6 109 119.6h2.5v48c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-48c31.4004 -0.0996094 62 -10.7998 86.5 -30c7.90039 -6.09961 8.90039 -17.5996 1.7998 -24.5l-34.7998 -34
c-5.2002 -5.09961 -13.4004 -6.09961 -19.5 -2c-10 6.7998 -22 10.5 -34.2002 10.5h-66.2998c-16.2998 0 -29.5 -13.2002 -29.5 -29.5c0 -13 8.7002 -24.7002 21.2002 -28.2998z" />
    <glyph glyph-name="rupee-sign" unicode="&#xf156;" horiz-adv-x="320" 
d="M308 352h-72.9424c5.97266 -9.75391 10.7666 -20.459 14.252 -32h58.6904c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-52.8105c-7.1748 -74.5107 -61.8193 -125.566 -138.318 -127.906l150.882 -139.275
c8.02734 -7.41016 2.78516 -20.8184 -8.13867 -20.8184h-82.5625c-2.58984 0 -6.23535 1.42578 -8.13867 3.18164l-165.052 152.356c-2.46094 2.27148 -3.86133 5.46875 -3.86133 8.81836v53.0117c0 6.62695 5.37305 12 12 12h84c41.7959 0 68.54 22.5459 74.7568 58.6318
h-158.757c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h146.25c-12.709 17.2939 -33.6621 27.252 -60.9697 27.252h-85.2803c-6.62695 0 -12 5.37305 -12 12v44.748c0 6.62695 5.37305 12 12 12h296c6.62695 0 12 -5.37305 12 -12v-40
c0 -6.62695 -5.37305 -12 -12 -12z" />
    <glyph glyph-name="yen-sign" unicode="&#xf157;" horiz-adv-x="384" 
d="M351.2 416c9.09961 0 14.8994 -9.7002 10.5996 -17.5996l-80.0996 -150.4h58.2998c6.59961 0 12 -5.40039 12 -12v-32c0 -6.59961 -5.40039 -12 -12 -12h-88.2002l-19.7998 -37.2002v-26.7998h108c6.59961 0 12 -5.40039 12 -12v-32c0 -6.59961 -5.40039 -12 -12 -12
h-108v-92c0 -6.59961 -5.40039 -12 -12 -12h-56c-6.59961 0 -12 5.40039 -12 12v92h-108c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h108v26.7998l-19.7998 37.2002h-88.2002c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h58.2998
l-80.0996 150.4c-4.2002 7.89941 1.5 17.5996 10.5996 17.5996h65.2002c4.59961 0 8.7998 -2.59961 10.7998 -6.7002l55.4004 -113.2c14.5 -34.6992 27.0996 -71.8994 27.0996 -71.8994h1.2998s12.6006 37.2002 27.1006 71.8994l55.3994 113.2
c2 4.10059 6.2002 6.7002 10.8008 6.7002h65.2998z" />
    <glyph glyph-name="ruble-sign" unicode="&#xf158;" horiz-adv-x="384" 
d="M239.36 128h-92.8008v-32h161.44c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-161.44v-52c0 -6.62695 -5.37305 -12 -12 -12h-58.5596c-6.62695 0 -12 5.37305 -12 12v52h-52c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h52
v32h-52c-6.62695 0 -12 5.37305 -12 12v45.3682c0 6.62695 5.37305 12 12 12h52v206.632c0 6.62695 5.37305 12 12 12h163.36c85.1201 0 144.64 -57.5996 144.64 -143.071c0 -85.4707 -59.5195 -144.929 -144.64 -144.929zM146.56 347.252v-149.884h77.4404
c48 0 76.1602 29.7285 76.1602 75.5605c0 45.2129 -28.1602 74.3232 -74.8799 74.3232h-78.7207z" />
    <glyph glyph-name="won-sign" unicode="&#xf159;" horiz-adv-x="576" 
d="M564 256h-62.7002l-7.39941 -32h70.0996c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-84.9004l-42.0996 -182.7c-1.2998 -5.39941 -6.09961 -9.2998 -11.7002 -9.2998h-56.7998c-5.59961 0 -10.4004 3.90039 -11.7002 9.2998l-42.3994 182.7
h-55.1006l-42.2998 -182.7c-1.2998 -5.39941 -6.09961 -9.2998 -11.7002 -9.2998h-56.7998c-5.59961 0 -10.5 3.90039 -11.7002 9.40039l-40.8994 182.6h-83.9004c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h69.5l-7.2002 32h-62.2998
c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h48l-18.0996 80.7002c-1.7002 7.5 4 14.5996 11.6992 14.5996h42.1006c5.7002 0 10.7002 -4 11.7998 -9.59961l17.5 -85.7002h108.7l20 86c1.2998 5.5 6.09961 9.2998 11.7002 9.2998h44
c5.59961 0 10.3994 -3.7998 11.6992 -9.2998l19.7002 -86h109.9l14.3994 85.7998c1.10059 5.5 6 9.5 11.7002 9.5h46.1006c7.69922 0 13.3994 -7.2002 11.6992 -14.7002l-18.5996 -80.5996h48c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM183.8 106
l12.6006 54h-38.8008l11 -54c5.10059 -25.2002 6.80078 -47.2002 6.80078 -47.2002h1.09961c0.5 0 1.09961 21.4004 7.2998 47.2002zM211.3 224l7.5 32h-80.7998l6.5 -32h66.7998zM274.2 224h25.3994l-2 8.59961c-1.89941 8 -3.5 16 -4.7998 23.4004h-11.7998
c-1.2998 -7.40039 -2.90039 -15.4004 -4.7998 -23.4004zM405.1 106l11.5 54h-39.0996l12.4004 -54c6.19922 -25.7998 6.69922 -47.2002 7.2998 -47.2002h1.09961s1.7002 22 6.7998 47.2002zM430.3 224l6.90039 32h-81.6006l7.30078 -32h67.3994z" />
    <glyph glyph-name="file" unicode="&#xf15b;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM384 326.1v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7l97.9004 -98
c4.5 -4.5 7 -10.5996 7 -16.9004z" />
    <glyph glyph-name="file-alt" unicode="&#xf15c;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM288 76v8c0 6.59961 -5.40039 12 -12 12h-168c-6.59961 0 -12 -5.40039 -12 -12v-8
c0 -6.59961 5.40039 -12 12 -12h168c6.59961 0 12 5.40039 12 12zM288 140v8c0 6.59961 -5.40039 12 -12 12h-168c-6.59961 0 -12 -5.40039 -12 -12v-8c0 -6.59961 5.40039 -12 12 -12h168c6.59961 0 12 5.40039 12 12zM288 212c0 6.59961 -5.40039 12 -12 12h-168
c-6.59961 0 -12 -5.40039 -12 -12v-8c0 -6.59961 5.40039 -12 12 -12h168c6.59961 0 12 5.40039 12 12v8zM384 326.1v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7l97.9004 -98c4.5 -4.5 7 -10.5996 7 -16.9004z" />
    <glyph glyph-name="sort-alpha-down" unicode="&#xf15d;" horiz-adv-x="448" 
d="M176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262l-80 96c-10.0703 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32
c8.83203 0 16 -7.16797 16 -16v-304h48zM416 160c8.83203 0 16 -7.16797 16 -16v-17.6299v-0.00292969c0 -7.93262 -4.81152 -18.6475 -10.7402 -23.917l-61.2598 -70.4502h56c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128
c-8.83203 0 -16 7.16797 -16 16v17.6299v0.00292969c0 7.93262 4.81152 18.6475 10.7402 23.917l61.2598 70.4502h-56c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128zM447.06 245.38c0.514648 -1.44043 0.931641 -3.85059 0.931641 -5.37988
c0 -8.82715 -7.16406 -15.9951 -15.9912 -16h-24.8398h-0.0449219c-6.42773 0 -13.249 4.96387 -15.2256 11.0801l-4.40918 12.9199h-71l-4.4209 -12.9199c-1.97559 -6.11621 -8.79688 -11.0801 -15.2246 -11.0801h-0.00488281h-24.8301
c-8.82715 0.00488281 -15.9912 7.17285 -15.9912 16c0 1.5293 0.416992 3.93945 0.931641 5.37988l59.2695 160c2.09277 5.8623 8.84375 10.6201 15.0684 10.6201h0.00195312h41.4395h0.00195312c6.22461 0 12.9756 -4.75781 15.0684 -10.6201zM335.61 304h32.7793
l-16.3896 48z" />
    <glyph glyph-name="sort-alpha-up" unicode="&#xf15e;" horiz-adv-x="448" 
d="M16 288c-14.2197 0 -21.3496 17.2598 -11.3096 27.3096l80 96c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262l80 -96c10.0703 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32
c-8.83203 0 -16 7.16797 -16 16v304h-48zM416 160c8.83203 0 16 -7.16797 16 -16v-17.6299v-0.00292969c0 -7.93262 -4.81152 -18.6475 -10.7402 -23.917l-61.2598 -70.4502h56c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128
c-8.83203 0 -16 7.16797 -16 16v17.6299v0.00292969c0 7.93262 4.81152 18.6475 10.7402 23.917l61.2598 70.4502h-56c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128zM447.06 245.38c0.514648 -1.44043 0.931641 -3.85059 0.931641 -5.37988
c0 -8.82715 -7.16406 -15.9951 -15.9912 -16h-24.8398h-0.0449219c-6.42773 0 -13.249 4.96387 -15.2256 11.0801l-4.40918 12.9199h-71l-4.4209 -12.9199c-1.97559 -6.11621 -8.79688 -11.0801 -15.2246 -11.0801h-0.00488281h-24.8301
c-8.82715 0.00488281 -15.9912 7.17285 -15.9912 16c0 1.5293 0.416992 3.93945 0.931641 5.37988l59.2695 160c2.09277 5.8623 8.84375 10.6201 15.0684 10.6201h0.00195312h41.4395h0.00195312c6.22461 0 12.9756 -4.75781 15.0684 -10.6201zM335.61 304h32.7793
l-16.3896 48z" />
    <glyph glyph-name="sort-amount-down" unicode="&#xf160;" 
d="M304 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h64zM176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96
c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262l-80 96c-10.0801 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32c8.83203 0 16 -7.16797 16 -16v-304h48zM432 288
c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-192c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h192zM368 160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h128zM496 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-256c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h256z" />
    <glyph glyph-name="sort-amount-up" unicode="&#xf161;" 
d="M304 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h64zM16 288c-14.2305 0 -21.3496 17.2598 -11.3096 27.3096l80 96c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262
s8.72363 -2.09766 11.3096 -4.68262l80 -96c10.0703 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v304h-48zM432 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16
h-192c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h192zM368 160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128zM496 416c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-256c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h256z" />
    <glyph glyph-name="sort-numeric-down" unicode="&#xf162;" horiz-adv-x="448" 
d="M304 352c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-112h16c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v64h-16zM330.15 189.09c53.4502 14.25 101.85 -25.8799 101.869 -77.0898v-10.7695c0 -70.3906 -28.25 -107.24 -86.25 -132
c-8.36914 -3.58008 -18.0293 1.2793 -20.8994 9.90918l-9.90039 20c-2.62012 7.87012 0.610352 16.9404 8.18066 20.3408c6.2793 2.71387 15.6201 8.49805 20.8496 12.9092c-47.6396 4.76074 -83.0996 51.4805 -68.8496 102.53c6.80762 23.4512 31.4473 47.7197 55 54.1699z
M352 92c11.04 0 20 8.95996 20 20s-8.95996 20 -20 20s-20 -8.95996 -20 -20s8.95996 -20 20 -20zM176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262
l-80 96c-10.0703 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32c8.83203 0 16 -7.16797 16 -16v-304h48z" />
    <glyph glyph-name="sort-numeric-up" unicode="&#xf163;" horiz-adv-x="448" 
d="M330.17 189.09c53.4502 14.25 101.83 -25.8799 101.85 -77.0898v-10.7695c0 -70.3906 -28.25 -107.24 -86.25 -132c-8.36914 -3.58008 -18.0293 1.2793 -20.8994 9.90918l-9.90039 20c-2.62012 7.87012 0.610352 16.9404 8.18066 20.3408
c6.2793 2.71387 15.6201 8.49805 20.8496 12.9092c-47.6396 4.76074 -83.0996 51.4805 -68.8301 102.53c6.80762 23.4512 31.4482 47.7197 55 54.1699zM352 92c11.04 0 20 8.95996 20 20s-8.95996 20 -20 20s-20 -8.95996 -20 -20s8.95996 -20 20 -20zM304 352
c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-112h16c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-96
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v64h-16zM107.31 411.31l80 -96c10.0703 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v304h-48
c-14.2197 0 -21.3496 17.2598 -11.3096 27.3096l80 96c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262z" />
    <glyph glyph-name="thumbs-up" unicode="&#xf164;" 
d="M104 224c13.2549 0 24 -10.7451 24 -24v-240c0 -13.2549 -10.7451 -24 -24 -24h-80c-13.2549 0 -24 10.7451 -24 24v240c0 13.2549 10.7451 24 24 24h80zM64 -24c13.2549 0 24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24zM384 366.548
c0 -42.416 -25.9697 -66.208 -33.2773 -94.5479h101.724c33.3965 0 59.3965 -27.7461 59.5527 -58.0977c0.0839844 -17.9385 -7.5459 -37.249 -19.4395 -49.1973l-0.109375 -0.110352c9.83594 -23.3369 8.23633 -56.0371 -9.30859 -79.4688
c8.68164 -25.8945 -0.0683594 -57.7041 -16.3818 -74.7568c4.29785 -17.5977 2.24414 -32.5752 -6.14746 -44.6318c-20.4102 -29.3242 -70.9961 -29.7373 -113.773 -29.7373l-2.84473 0.000976562c-48.2871 0.0166016 -87.8057 17.5977 -119.561 31.7246
c-15.957 7.09961 -36.8203 15.8877 -52.6504 16.1787c-6.54004 0.120117 -11.7832 5.45703 -11.7832 11.998v213.77c0 3.2002 1.28223 6.27148 3.55762 8.52148c39.6143 39.1436 56.6484 80.5869 89.1172 113.11c14.8037 14.832 20.1885 37.2363 25.3936 58.9023
c4.44629 18.501 13.749 57.7939 33.9316 57.7939c24 0 72 -8 72 -81.4521z" />
    <glyph glyph-name="thumbs-down" unicode="&#xf165;" 
d="M0 392c0 13.2549 10.7451 24 24 24h80c13.2549 0 24 -10.7451 24 -24v-240c0 -13.2549 -10.7451 -24 -24 -24h-80c-13.2549 0 -24 10.7451 -24 24v240zM40 192c0 -13.2549 10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24zM312 -64
c-20.1826 0 -29.4854 39.293 -33.9307 57.7949c-5.20605 21.666 -10.5889 44.0703 -25.3936 58.9023c-32.4688 32.5234 -49.5029 73.9668 -89.1172 113.11c-1.96387 1.94141 -3.55762 5.75879 -3.55762 8.52051v0.000976562v213.77
c0 6.54102 5.24316 11.8779 11.7832 11.998c15.8311 0.290039 36.6934 9.0791 52.6504 16.1787c31.7549 14.127 71.2744 31.708 119.561 31.7246h2.84375c42.7773 0 93.3633 -0.413086 113.774 -29.7373c8.3916 -12.0566 10.4453 -27.0342 6.14746 -44.6318
c16.3125 -17.0527 25.0635 -48.8633 16.3818 -74.7568c17.5439 -23.4316 19.1436 -56.1318 9.30859 -79.4688l0.109375 -0.110352c11.8936 -11.9492 19.5234 -31.2588 19.4395 -49.1973c-0.15625 -30.3516 -26.1572 -58.0977 -59.5527 -58.0977h-101.725
c7.30762 -28.3398 33.2773 -52.1318 33.2773 -94.5479c0 -73.4521 -48 -81.4521 -72 -81.4521z" />
    <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="256" 
d="M128 448c35.3457 0 64 -28.6543 64 -64s-28.6543 -64 -64 -64s-64 28.6543 -64 64s28.6543 64 64 64zM247.283 93.8213c3.78809 -15.1504 -7.69238 -29.8213 -23.2832 -29.8213h-56v-104c0 -13.2549 -10.7451 -24 -24 -24h-32c-13.2549 0 -24 10.7451 -24 24v104h-56
c-15.6172 0 -27.0654 14.6953 -23.2832 29.8213l48 192c2.50879 10.0342 12.9395 18.1787 23.2832 18.1787h11.3604c23.6895 -10.8936 50.5684 -10.4434 73.2793 0h11.3604c10.3438 0 20.7744 -8.14453 23.2832 -18.1787z" />
    <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="192" 
d="M96 448c35.3457 0 64 -28.6543 64 -64s-28.6543 -64 -64 -64s-64 28.6543 -64 64s28.6543 64 64 64zM144 304c26.5098 0 48 -21.4902 48 -48v-136c0 -13.2549 -10.7451 -24 -24 -24h-16v-136c0 -13.2549 -10.7451 -24 -24 -24h-64c-13.2549 0 -24 10.7451 -24 24v136h-16
c-13.2549 0 -24 10.7451 -24 24v136c0 26.5098 21.4902 48 48 48h11.3604c23.6895 -10.8936 50.5684 -10.4434 73.2793 0h11.3604z" />
    <glyph glyph-name="sun" unicode="&#xf185;" 
d="M256 288c52.9004 0 96 -43.0996 96 -96s-43.0996 -96 -96 -96s-96 43.0996 -96 96s43.0996 96 96 96zM502.4 207.5c12.7998 -6.40039 12.7998 -24.5996 -0.200195 -31.0996l-94.7002 -47.3008l33.5 -100.399c4.59961 -13.5 -8.2998 -26.4004 -21.9004 -21.9004
l-100.399 33.5l-47.2998 -94.7002c-6.40039 -12.7998 -24.6006 -12.7998 -31 0l-47.3008 94.7002l-100.399 -33.5c-13.5 -4.59961 -26.4004 8.2998 -21.9004 21.9004l33.5 100.5l-94.7002 47.2998c-12.7998 6.40039 -12.7998 24.5996 0 31l94.7002 47.4004l-33.5 100.399
c-4.59961 13.5 8.2998 26.4004 21.9004 21.9004l100.5 -33.5l47.2998 94.7002c6.40039 12.7998 24.5996 12.7998 31 0l47.4004 -94.8008l100.399 33.5c13.5 4.60059 26.4004 -8.2998 21.9004 -21.8994l-33.5 -100.4zM346.5 101.5c49.9004 49.9004 49.9004 131.1 0 181
s-131.1 49.9004 -181 0s-49.9004 -131.1 0 -181s131.1 -49.9004 181 0z" />
    <glyph glyph-name="moon" unicode="&#xf186;" 
d="M283.211 -64c-141.489 0 -256 114.691 -256 256c0 141.489 114.691 256 256 256c13.0176 -0.00195312 33.9727 -1.91895 46.7754 -4.28027c11.0059 -2.0332 13.4414 -16.7178 3.75586 -22.2295c-62.8359 -35.7588 -101.498 -102.172 -101.498 -174.395
c0 -125.378 114.059 -220.607 238.262 -196.954c10.9229 2.08008 18.6299 -10.6416 11.5625 -19.3496c-47.7783 -58.8672 -119.896 -94.792 -198.857 -94.792z" />
    <glyph glyph-name="archive" unicode="&#xf187;" 
d="M32 0v288h448v-288c0 -17.7002 -14.2998 -32 -32 -32h-384c-17.7002 0 -32 14.2998 -32 32zM192 212v-8c0 -6.59961 5.40039 -12 12 -12h104c6.59961 0 12 5.40039 12 12v8c0 6.59961 -5.40039 12 -12 12h-104c-6.59961 0 -12 -5.40039 -12 -12zM480 416
c17.7002 0 32 -14.2998 32 -32v-48c0 -8.7998 -7.2002 -16 -16 -16h-480c-8.7998 0 -16 7.2002 -16 16v48c0 17.7002 14.2998 32 32 32h448z" />
    <glyph glyph-name="bug" unicode="&#xf188;" 
d="M511.988 159.1c-0.478516 -17.4297 -15.2168 -31.0996 -32.6533 -31.0996h-55.335v-16c0 -21.8643 -4.88184 -42.584 -13.5996 -61.1445l60.2275 -60.2285c12.4961 -12.4971 12.4961 -32.7578 0 -45.2549c-12.498 -12.4971 -32.7588 -12.4961 -45.2559 0
l-54.7363 54.7363c-24.75 -20.0732 -56.2852 -32.1084 -90.6357 -32.1084v244c0 6.62695 -5.37305 12 -12 12h-24c-6.62695 0 -12 -5.37305 -12 -12v-244c-34.3506 0 -65.8857 12.0352 -90.6357 32.1084l-54.7363 -54.7363c-12.498 -12.4971 -32.7588 -12.4961 -45.2559 0
c-12.4961 12.4971 -12.4961 32.7578 0 45.2549l60.2275 60.2285c-8.71777 18.5605 -13.5996 39.2803 -13.5996 61.1445v16h-55.334c-17.4355 0 -32.1748 13.6699 -32.6533 31.0996c-0.49707 18.084 14.0156 32.9004 31.9873 32.9004h56v58.7451l-46.6279 46.6279
c-12.4961 12.4971 -12.4961 32.7578 0 45.2549c12.498 12.4971 32.7578 12.4971 45.2559 0l54.627 -54.6279h229.489l54.627 54.627c12.498 12.4971 32.7578 12.4971 45.2559 0c12.4961 -12.4971 12.4961 -32.7578 0 -45.2549l-46.627 -46.627v-58.7451h56
c17.9717 0 32.4844 -14.8164 31.9883 -32.9004zM257 448c61.8564 0 112 -50.1436 112 -112h-224c0 61.8564 50.1436 112 112 112z" />
    <glyph glyph-name="caret-square-left" unicode="&#xf191;" horiz-adv-x="448" 
d="M400 -32h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48zM259.515 323.515l-123.029 -123.029c-4.68652 -4.68652 -4.68652 -12.2842 0 -16.9717l123.028 -123.028
c7.56055 -7.56055 20.4854 -2.20605 20.4854 8.48438v246.06c0.000976562 10.6904 -12.9248 16.0449 -20.4844 8.48535z" />
    <glyph glyph-name="dot-circle" unicode="&#xf192;" 
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM336 192c0 44.1123 -35.8877 80 -80 80s-80 -35.8877 -80 -80s35.8877 -80 80 -80s80 35.8877 80 80z" />
    <glyph glyph-name="wheelchair" unicode="&#xf193;" 
d="M496.101 62.3311l14.2275 -28.6631c3.92871 -7.91504 0.697266 -17.5156 -7.21777 -21.4453l-65.4658 -32.8857c-16.0488 -7.9668 -35.5557 -1.19434 -43.1885 15.0547l-62.7773 133.608h-139.679c-15.9248 0 -29.4258 11.71 -31.6787 27.4746
c-33.8887 237.218 -31.9414 222.481 -32.3213 228.525c0 36.3584 30.3184 65.6348 67.0518 63.9287c33.2715 -1.54492 60.0479 -28.9043 60.9248 -62.2012c0.868164 -32.9326 -23.1514 -60.4229 -54.6074 -65.0381l4.66992 -32.6904h129.961c8.83691 0 16 -7.16309 16 -16
v-32c0 -8.83691 -7.16309 -16 -16 -16h-120.818l4.57227 -32h132.246c11.2168 0 24.1924 -8.24023 28.9619 -18.3916l57.5146 -122.407l36.1787 18.3486c7.91504 3.92871 17.5166 0.697266 21.4453 -7.21777zM311.358 96l25.752 -54.8076
c-27.3047 -61.8848 -89.2402 -105.192 -161.11 -105.192c-97.0469 0 -176 78.9531 -176 176c0 74.0371 45.9561 137.536 110.836 163.489c2.64453 -18.4736 5.77637 -40.3682 9.48828 -66.333c-33.6299 -19.3477 -56.3242 -55.6514 -56.3242 -97.1562
c0 -61.7568 50.2432 -112 112 -112c56.3242 0 103.064 41.7959 110.852 96h24.5068z" />
    <glyph glyph-name="lira-sign" unicode="&#xf195;" horiz-adv-x="384" 
d="M371.994 192c6.78613 0 12.2578 -5.62598 11.9971 -12.4082c-5.15332 -133.758 -94.3174 -211.592 -228.408 -211.592h-79.583c-6.62695 0 -12 5.37305 -12 12v193.442l-49.3975 -10.9775c-7.49316 -1.66602 -14.6025 4.03711 -14.6025 11.7139v40.9766
c0 5.31348 4.20996 10.5615 9.39746 11.7139l54.6025 12.1338v30.4395l-49.3975 -10.9775c-7.49316 -1.66602 -14.6025 4.03711 -14.6025 11.7139v40.9766c0 5.31348 4.20996 10.5615 9.39746 11.7139l54.6025 12.1338v68.9971c0 6.62695 5.37305 12 12 12h56
c6.62695 0 12 -5.37305 12 -12v-51.2188l129.397 28.7539c7.49316 1.66602 14.6025 -4.03711 14.6025 -11.7139v-40.9756c0 -5.31348 -4.20996 -10.5615 -9.39746 -11.7139l-134.603 -29.9121v-30.4385l129.397 28.7539c7.49316 1.66602 14.6025 -4.03711 14.6025 -11.7139
v-40.9766c0 -5.31348 -4.20996 -10.5615 -9.39746 -11.7139l-134.603 -29.9121v-159.219c86.1787 0 168 48 168 148.754c0 6.33398 5.63965 11.2461 11.9746 11.2461h48.0195z" />
    <glyph glyph-name="space-shuttle" unicode="&#xf197;" horiz-adv-x="640" 
d="M592.604 239.756c29.6787 -13.9111 47.3965 -31.7637 47.3965 -47.7559s-17.7178 -33.8447 -47.3965 -47.7559c-32.8682 -15.4082 -76.8262 -24.2441 -120.604 -24.2441h-285.674c-4.95215 -6.55469 -10.585 -11.9775 -16.7197 -16h206.394
c-146.843 -30.2529 -156.597 -136 -279.997 -136h-0.00292969v128h-16v-128c-26.5098 0 -48 28.6543 -48 64v64c-23.1807 0 -32 10.0166 -32 24v40c0 13.9678 8.80273 24 32 24v16c-23.1807 0 -32 10.0166 -32 24v40c0 13.9678 8.80273 24 32 24v64
c0 35.3457 21.4902 64 48 64v-128h16v128h0.00292969c123.4 0 133.154 -105.747 279.997 -136h-206.393c6.13477 -4.02246 11.7676 -9.44531 16.7197 -16h285.673c43.7773 0 87.7354 -8.83594 120.604 -24.2441zM488 152c31.9424 0 31.9092 80 0 80
c-4.41602 0 -8 -3.58398 -8 -8v-64c0 -4.41602 3.58398 -8 8 -8z" />
    <glyph glyph-name="envelope-square" unicode="&#xf199;" horiz-adv-x="448" 
d="M400 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352zM178.117 185.896c10.5156 -7.66895 31.3799 -26.1133 45.8828 -25.8955
c14.4912 -0.225586 35.3828 18.2393 45.8828 25.8936c90.6836 65.8145 89.7461 65.9697 114.117 84.9385v25.167c0 13.2549 -10.7451 24 -24 24h-272c-13.2549 0 -24 -10.7451 -24 -24v-25.167c24.3525 -18.9541 23.4287 -19.1201 114.117 -84.9365zM384 230.225
c-13.958 -10.793 -33.3252 -25.2334 -95.2832 -70.1982c-13.6826 -9.98438 -37.833 -32.1592 -64.7197 -32.0254c-26.7188 -0.134766 -50.5322 21.6689 -64.6943 32.0098c-61.9736 44.9785 -81.3447 59.4199 -95.3027 70.2139v-142.225c0 -13.2549 10.7451 -24 24 -24h272
c13.2549 0 24 10.7451 24 24v142.225z" />
    <glyph glyph-name="university" unicode="&#xf19c;" 
d="M496 320v-16c0 -4.41602 -3.58398 -8 -8 -8h-24v-12c0 -6.62695 -5.37305 -12 -12 -12h-392c-6.62695 0 -12 5.37305 -12 12v12h-24c-4.41602 0 -8 3.58398 -8 8v16c0 2.95215 2.21387 6.26367 4.94141 7.3916l232 88
c0.810547 0.335938 2.18066 0.608398 3.05859 0.608398s2.24805 -0.272461 3.05859 -0.608398l232 -88c2.72754 -1.12793 4.94141 -4.43945 4.94141 -7.3916zM472 16c13.2549 0 24 -10.7451 24 -24v-16c0 -4.41602 -3.58398 -8 -8 -8h-464c-4.41602 0 -8 3.58398 -8 8v16
c0 13.2549 10.7451 24 24 24h432zM96 256h64v-192h64v192h64v-192h64v192h64v-192h36c6.62695 0 12 -5.37305 12 -12v-20h-416v20c0 6.62695 5.37305 12 12 12h36v192z" />
    <glyph glyph-name="graduation-cap" unicode="&#xf19d;" horiz-adv-x="640" 
d="M622.34 294.8c23.5498 -7.24023 23.5498 -38.3594 0 -45.5996l-278.95 -85.7002c-20.3496 -6.25 -37.7295 -2.78027 -46.79 0l-195.569 60.0898c-12.25 -8.41992 -19.9307 -21.7002 -20.6904 -36.7197c9.19043 -5.62012 15.6602 -15.2998 15.6602 -26.8701
c0 -10.7803 -5.67969 -19.8496 -13.8604 -25.6504l25.5303 -114.88c2.21973 -9.98926 -5.37988 -19.4697 -15.6201 -19.4697h-56.1094c-10.2305 0 -17.8301 9.48047 -15.6104 19.4697l25.5303 114.88c-8.18066 5.80078 -13.8604 14.8701 -13.8604 25.6504
c0 11.8896 6.78027 21.8496 16.4102 27.3701c0.649414 17.6201 7.20996 33.71 17.8799 46.8994l-48.6299 14.9404c-23.54 7.23047 -23.54 38.3604 0 45.5898l278.95 85.7002c15.1895 4.66992 31.5898 4.66992 46.79 0zM352.79 132.91l145.03 44.5596l14.1797 -113.47
c0 -35.3496 -85.96 -64 -192 -64s-192 28.6504 -192 64l14.1797 113.46l145.021 -44.5498c12.75 -3.91992 37.0596 -8.75977 65.5898 0z" />
    <glyph glyph-name="language" unicode="&#xf1ab;" horiz-adv-x="640" 
d="M152.1 211.8l10.9004 -37.5h-38.0996l11.0996 37.5c3.5 12.1006 7.7998 33.2002 7.7998 33.2002h0.5s4.2998 -21.0996 7.7998 -33.2002zM616 352c13.2998 0 24 -10.7002 24 -24v-272c0 -13.2998 -10.7002 -24 -24 -24h-280v320h280zM592 232v16
c0 6.59961 -5.40039 12 -12 12h-64v16c0 6.59961 -5.40039 12 -12 12h-16c-6.59961 0 -12 -5.40039 -12 -12v-16h-64c-6.59961 0 -12 -5.40039 -12 -12v-16c0 -6.59961 5.40039 -12 12 -12h114.3c-6.2002 -14.2998 -16.5 -29 -30 -43.2002
c-6.59961 6.90039 -12.3994 13.9004 -17.3994 20.9004c-3.60059 5.09961 -10.6006 6.59961 -16 3.39941l-7.30078 -4.2998l-6.5 -3.89941c-5.89941 -3.5 -7.69922 -11.4004 -3.69922 -17.1006c6.09961 -8.7002 13.0996 -17.2998 21 -25.7002
c-8.10059 -6.2998 -16.8008 -12.2998 -26.1006 -18c-5.59961 -3.39941 -7.39941 -10.5996 -4.2002 -16.1992l7.90039 -13.9004c3.40039 -5.90039 10.9004 -7.7998 16.7002 -4.2998c12.7002 7.7998 24.5 16.2002 35.3994 24.8994
c10.9004 -8.7998 22.8008 -17.0996 35.4004 -24.8994c5.7998 -3.5 13.2998 -1.60059 16.7002 4.2998l7.89941 13.9004c3.2002 5.69922 1.40039 12.7998 -4.09961 16.1992c-9 5.5 -17.7002 11.6006 -26.0996 18c21 22.5 35.7998 46.3008 42.6992 69.9004h11.4004
c6.59961 0 12 5.40039 12 12zM0 328c0 13.2998 10.7002 24 24 24h280v-320h-280c-13.2998 0 -24 10.7002 -24 24v272zM58.9004 111.9c-2.60059 -7.80078 3.19922 -15.9004 11.3994 -15.9004h22.9004c5.2998 0 10 3.59961 11.5 8.7002l9.09961 31.7998h60.2002
l9.40039 -31.9004c1.40137 -4.74316 6.55273 -8.59668 11.5 -8.59961h22.8994c8.2998 0 14 8.09961 11.4004 15.9004l-57.5 169.1c-1.7002 4.7998 -6.2998 8.09961 -11.4004 8.09961h-32.5c-5.2002 0 -9.7002 -3.19922 -11.3994 -8.09961z" />
    <glyph glyph-name="fax" unicode="&#xf1ac;" 
d="M480 288c17.6641 0 32 -14.3359 32 -32v-288c0 -17.6641 -14.3359 -32 -32 -32h-320c-17.6641 0 -32 14.3359 -32 32v448c0 17.6641 14.3359 32 32 32h242.75c7.31348 -0.000976562 17.4473 -4.19922 22.6201 -9.37012l45.25 -45.25
c5.17676 -5.17285 9.37891 -15.3115 9.37988 -22.6299v-82.75zM288 16v32c0 8.83203 -7.16797 16 -16 16h-32c-8.83203 0 -16 -7.16797 -16 -16v-32c0 -8.83203 7.16797 -16 16 -16h32c8.83203 0 16 7.16797 16 16zM288 144v32c0 8.83203 -7.16797 16 -16 16h-32
c-8.83203 0 -16 -7.16797 -16 -16v-32c0 -8.83203 7.16797 -16 16 -16h32c8.83203 0 16 7.16797 16 16zM416 16v32c0 8.83203 -7.16797 16 -16 16h-32c-8.83203 0 -16 -7.16797 -16 -16v-32c0 -8.83203 7.16797 -16 16 -16h32c8.83203 0 16 7.16797 16 16zM416 144v32
c0 8.83203 -7.16797 16 -16 16h-32c-8.83203 0 -16 -7.16797 -16 -16v-32c0 -8.83203 7.16797 -16 16 -16h32c8.83203 0 16 7.16797 16 16zM416 256v64h-48c-8.83203 0 -16 7.16797 -16 16v48h-160v-128h224zM64 320c17.6641 0 32 -14.3359 32 -32v-320
c0 -17.6641 -14.3359 -32 -32 -32h-32c-17.6641 0 -32 14.3359 -32 32v320c0 17.6641 14.3359 32 32 32h32z" />
    <glyph glyph-name="building" unicode="&#xf1ad;" horiz-adv-x="448" 
d="M436 -32c6.62695 0 12 -5.37305 12 -12v-20h-448v20c0 6.62695 5.37305 12 12 12h20v456c0 13.2549 10.7451 24 24 24h336c13.2549 0 24 -10.7451 24 -24v-456h20zM128 372v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12v40
c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12zM128 276v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12zM180 128c6.62695 0 12 5.37305 12 12v40
c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40zM256 -32v84c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-84h64zM320 140v40c0 6.62695 -5.37305 12 -12 12h-40
c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM320 236v40c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12zM320 332v40
c0 6.62695 -5.37305 12 -12 12h-40c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h40c6.62695 0 12 5.37305 12 12z" />
    <glyph glyph-name="child" unicode="&#xf1ae;" horiz-adv-x="384" 
d="M120 376c0 39.7646 32.2354 72 72 72s72 -32.2354 72 -72c0 -39.7637 -32.2354 -72 -72 -72s-72 32.2363 -72 72zM374.627 374.627c12.4971 -12.4971 12.4971 -32.7568 0 -45.2539l-94.627 -94.627v-266.746c0 -17.6729 -14.3271 -32 -32 -32h-16
c-17.6729 0 -32 14.3271 -32 32v112h-16v-112c0 -17.6729 -14.3271 -32 -32 -32h-16c-17.6729 0 -32 14.3271 -32 32v266.746l-94.627 94.626c-12.4971 12.4971 -12.4971 32.7578 0 45.2549c12.4961 12.4971 32.7578 12.4971 45.2539 0l86.627 -86.627h101.491
l86.6279 86.627c12.4961 12.4971 32.7578 12.4971 45.2539 0z" />
    <glyph glyph-name="paw" unicode="&#xf1b0;" 
d="M256 224c79.4102 0 192 -122.76 192 -200.25c0 -34.9004 -26.8096 -55.75 -71.7402 -55.75c-48.4102 0 -80.75 25.0801 -120.26 25.0801c-39.1699 0 -71.4199 -25.0801 -120.26 -25.0801c-44.9307 0 -71.7402 20.8496 -71.7402 55.75c0 77.4902 112.59 200.25 192 200.25
zM108.72 236.61c10.4004 -34.6504 -4.76953 -68.3799 -33.8896 -75.3408c-29.1201 -6.95996 -61.1602 15.4805 -71.5605 50.1309c-10.3994 34.6494 4.77051 68.3799 33.8906 75.3398s61.1602 -15.4805 71.5596 -50.1299zM193.44 257.39
c-30.9307 -8.14941 -65.6201 20.4502 -77.46 63.8701c-11.8408 43.4199 3.63965 85.2207 34.5791 93.3604c30.9404 8.13965 65.6201 -20.4502 77.46 -63.8701c11.8408 -43.4199 -3.63965 -85.2197 -34.5791 -93.3604zM474.83 286.73
c29.1201 -6.96094 44.29 -40.6904 33.8896 -75.3408c-10.4102 -34.6494 -42.4395 -57.0898 -71.5596 -50.1299s-44.29 40.6904 -33.8906 75.3398c10.4102 34.6504 42.4404 57.0908 71.5605 50.1309zM318.56 257.39c-30.9395 8.14062 -46.4199 49.9404 -34.5791 93.3604
c11.8398 43.4199 46.5195 72.0195 77.46 63.8701c30.9395 -8.15039 46.4199 -49.9404 34.5791 -93.3604c-11.8398 -43.4199 -46.5195 -72.0098 -77.46 -63.8701z" />
    <glyph glyph-name="cube" unicode="&#xf1b2;" 
d="M239.1 441.7c10.9004 4.09961 22.9004 4.09961 33.7002 -0.100586l208 -78c18.7002 -7 31.1006 -24.8994 31.1006 -44.8994v-225.101c0 -18.0996 -10.2002 -34.7998 -26.5 -42.8994l-208 -104c-13.5 -6.7998 -29.4004 -6.7998 -42.9004 0l-208 104
c-16.2002 8.09961 -26.5 24.7002 -26.5 42.8994v225.101c0 20 12.4004 38 31.0996 45zM256 379.6l-192 -72v-1.09961l192 -78l192 78v1.09961zM288 23.5996l160 80v133.9l-160 -65v-148.9z" />
    <glyph glyph-name="cubes" unicode="&#xf1b3;" 
d="M488.6 197.8c14.1006 -5.2998 23.4004 -18.7002 23.4004 -33.7002v-110.1c0 -13.5996 -7.7002 -26.0996 -19.9004 -32.2002l-100 -50c-10.0996 -5.09961 -22.0996 -5.09961 -32.1992 0l-103.9 52l-103.9 -52c-10.0996 -5.09961 -22.0996 -5.09961 -32.1992 0l-100 50
c-12.2002 6.10059 -19.9004 18.6006 -19.9004 32.2002v110.1c0 15 9.2998 28.4004 23.2998 33.7002l96.6006 36.2002v108.5c0 15 9.2998 28.4004 23.3994 33.7002l100 37.5c8.2002 3.09961 17.2002 3.09961 25.2998 0l100 -37.5
c14.1006 -5.2998 23.4004 -18.7002 23.4004 -33.7002v-108.5zM358 233.2v73.2998l-85 -37v-68.2002zM154 343.9v-0.600586l102 -41.3994l102 41.3994v0.600586l-102 38.1992zM238 52.7998v75.4004l-85 -38.7998v-79.1006zM238 164.8v0.600586l-102 38.1992l-102 -38.1992
v-0.600586l102 -41.3994zM478 52.7998v75.4004l-85 -38.7998v-79.1006zM478 164.8v0.600586l-102 38.1992l-102 -38.1992v-0.600586l102 -41.3994z" />
    <glyph glyph-name="recycle" unicode="&#xf1b8;" 
d="M184.561 186.097c3.23242 -13.9971 -12.1221 -24.6348 -24.0674 -17.168l-40.7363 25.4551l-50.8672 -81.4014c-13.2832 -21.2559 2.07031 -48.9824 27.1221 -48.9824h51.9883c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-51.8848
c-75.334 0 -121.302 83.0479 -81.4082 146.88l50.8223 81.3877l-40.7256 25.4482c-12.0811 7.54688 -8.96582 25.9609 4.87891 29.1582l110.237 25.4502c8.61133 1.9873 17.2012 -3.38086 19.1895 -11.9902zM283.122 369.012
c-12.2842 19.6543 -41.5449 20.3193 -54.2568 -0.0214844l-17.9609 -28.7432c-3.5127 -5.62012 -10.916 -7.3291 -16.5361 -3.81738l-33.9189 21.1953c-5.62012 3.51172 -7.33008 10.9131 -3.82031 16.5332l17.9629 28.7656c37.6074 60.1709 125.295 60.0332 162.816 0
l41.2627 -66.082l40.6875 25.4238c12.0771 7.55176 27.2646 -3.32324 24.0674 -17.168l-25.4502 -110.236c-1.97363 -8.55273 -10.5166 -13.9893 -19.1885 -11.9902l-110.237 25.4502c-13.8789 3.20508 -16.9297 21.6299 -4.87891 29.1572l40.7402 25.457zM497.288 146.88
c39.9268 -63.8828 -6.13379 -146.88 -81.4082 -146.88h-95.8799v-47.9893c0 -14.3105 -17.3105 -21.3184 -27.3135 -11.3145l-80 79.9883c-6.24805 6.24805 -6.24805 16.3799 0 22.627l80 79.9814c10.0713 10.0703 27.3135 2.90039 27.3135 -11.3125v-47.9814h95.9844
c25.0791 0 40.3926 27.749 27.1357 48.96l-27.5645 44.1123c-3.51172 5.62109 -1.80176 13.0234 3.81836 16.5361l33.8613 21.1582c5.62207 3.51367 13.0264 1.80273 16.5381 -3.82031z" />
    <glyph glyph-name="car" unicode="&#xf1b9;" 
d="M499.99 272c7.80957 0 13.54 -7.33984 11.6494 -14.9102l-6 -24c-1.33008 -5.33984 -6.12988 -9.08984 -11.6396 -9.08984h-20.0703c13.4199 -11.7305 22.0703 -28.7803 22.0703 -48v-48c0 -16.1299 -6.16016 -30.6797 -16 -41.9297v-54.0703
c0 -17.6699 -14.3301 -32 -32 -32h-32c-17.6699 0 -32 14.3301 -32 32v32h-256v-32c0 -17.6699 -14.3301 -32 -32 -32h-32c-17.6699 0 -32 14.3301 -32 32v54.0703c-9.83984 11.2598 -16 25.8096 -16 41.9297v48c0 19.2197 8.65039 36.2695 22.0801 48h-20.0703
c-5.50977 0 -10.3096 3.75 -11.6396 9.08984l-6 24c-1.90039 7.57031 3.83008 14.9102 11.6396 14.9102h59.8604l16.6396 41.5996c17.1104 42.7705 57.9307 70.4004 103.99 70.4004h127c46.0703 0 86.8799 -27.6299 103.98 -70.4004l16.6396 -41.5996h59.8701z
M147.93 289.83l-19.9297 -49.8301h256l-19.9297 49.8301c-7.29004 18.2197 -24.9404 30.1699 -44.5703 30.1699h-127c-19.6299 0 -37.2803 -11.9502 -44.5703 -30.1699zM96 128.2c19.2002 0 48 -3.19043 48 15.9502c0 19.1396 -28.7998 47.8496 -48 47.8496
s-32 -12.7598 -32 -31.9004c0 -19.1396 12.7998 -31.8994 32 -31.8994zM416 128.2c19.2002 0 32 12.7598 32 31.8994c0 19.1406 -12.7998 31.9004 -32 31.9004s-48 -28.71 -48 -47.8496c0 -19.1406 28.7998 -15.9502 48 -15.9502z" />
    <glyph glyph-name="taxi" unicode="&#xf1ba;" 
d="M462 206.36c28.5898 -6.40039 50 -31.8301 50 -62.3604v-48c0 -23.6201 -12.9502 -44.0303 -32 -55.1201v-40.8799c0 -17.6699 -14.3301 -32 -32 -32h-32c-17.6699 0 -32 14.3301 -32 32v32h-256v-32c0 -17.6699 -14.3301 -32 -32 -32h-32c-17.6699 0 -32 14.3301 -32 32
v40.8799c-19.0498 11.0801 -32 31.4902 -32 55.1201v48c0 30.5303 21.4102 55.96 50 62.3604l22 84.8398c9.59961 35.2002 41.5996 60.7998 76.7998 60.7998h11.2002v32c0 17.6699 14.3301 32 32 32h128c17.6699 0 32 -14.3301 32 -32v-32h11.2002
c35.2002 0 67.2002 -25.5996 76.7998 -60.7998zM96 96c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM116.55 208h278.9l-17.3906 67.1396c-2.01953 7.37988 -9.37988 12.8604 -14.8496 12.8604h-214.4
c-5.46973 0 -12.8291 -5.48047 -15.0596 -13.6396zM416 96c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="tree" unicode="&#xf1bb;" horiz-adv-x="384" 
d="M378.31 69.5098c6 -6.79004 7.36035 -16.0898 3.56055 -24.2598c-3.75 -8.0498 -12 -13.25 -21.0098 -13.25h-136.86v-24.4502l30.29 -48.3994c5.32031 -10.6406 -2.41992 -23.1602 -14.3096 -23.1602h-95.9609c-11.8896 0 -19.6299 12.5195 -14.3096 23.1602
l30.29 48.3994v24.4502h-136.86c-9.00977 0 -17.2598 5.2002 -21.0098 13.25c-3.7998 8.16992 -2.43945 17.4697 3.56055 24.2598l79.8896 90.4902h-30.6299c-9.02051 0 -16.9805 5 -20.7803 13.0498c-3.79004 8.0498 -2.54004 17.2598 3.27051 24.04l78.1396 90.9102
h-28.8896c-9.10059 0 -17.3105 5.34961 -20.8701 13.6104c-3.51074 8.12988 -1.86035 17.5898 4.23926 24.0801l110.28 117.479c6.04004 6.4502 17.29 6.4502 23.3203 0l110.27 -117.479c6.10059 -6.49023 7.76074 -15.9502 4.24023 -24.0801
c-3.55957 -8.26074 -11.7598 -13.6104 -20.8604 -13.6104h-28.8896l78.1299 -90.8896c5.83008 -6.79004 7.08008 -16.0107 3.28027 -24.0508c-3.7998 -8.05957 -11.7705 -13.0596 -20.7803 -13.0596h-30.6299z" />
    <glyph glyph-name="database" unicode="&#xf1c0;" horiz-adv-x="448" 
d="M448 374.857v-45.7148c0 -40.2852 -100.333 -73.1426 -224 -73.1426s-224 32.8574 -224 73.1426v45.7148c0 40.2852 100.333 73.1426 224 73.1426s224 -32.8574 224 -73.1426zM448 272v-102.857c0 -40.2852 -100.333 -73.1426 -224 -73.1426s-224 32.8574 -224 73.1426
v102.857c48.125 -33.1426 136.208 -48.5723 224 -48.5723s175.874 15.4297 224 48.5723zM448 112v-102.857c0 -40.2852 -100.333 -73.1426 -224 -73.1426s-224 32.8574 -224 73.1426v102.857c48.125 -33.1426 136.208 -48.5723 224 -48.5723s175.874 15.4297 224 48.5723z
" />
    <glyph glyph-name="file-pdf" unicode="&#xf1c1;" horiz-adv-x="384" 
d="M181.9 191.9c-5 16 -4.90039 46.8994 -2 46.8994c8.39941 0 7.59961 -36.8994 2 -46.8994zM180.2 144.7c9.59961 -17.4004 21.7998 -31.2002 34.5 -40.7998c-23.9004 -4.7002 -44.6006 -14.9004 -62.9004 -21.9004c11.1006 19.4004 20.7002 42.5 28.4004 62.7002z
M86.0996 19.9004c5.80078 15.6992 28.2002 33.8994 34.9004 40.1992c-21.7002 -34.7998 -34.9004 -41 -34.9004 -40.1992zM248 288h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136
c0 -13.2002 10.7998 -24 24 -24zM240 116.2c-20 12.2002 -33.2998 29 -42.7002 53.7998c4.5 18.5 11.6006 46.5996 6.2002 64.2002c-4.7002 29.3994 -42.4004 26.5 -47.7998 6.7998c-5 -18.2998 -0.400391 -44.0996 8.09961 -77
c-11.5996 -27.5996 -28.7002 -64.5996 -40.7998 -85.7998c-0.0996094 0 -0.0996094 -0.100586 -0.200195 -0.100586c-27.0996 -13.8994 -73.5996 -44.5 -54.5 -68c5.60059 -6.89941 16 -10 21.5 -10c17.9004 0 35.7002 18 61.1006 61.8008
c25.7998 8.5 54.0996 19.0996 79 23.1992c21.6992 -11.7998 47.0996 -19.5 64 -19.5c29.1992 0 31.1992 32 19.6992 43.4004c-13.8994 13.5996 -54.2998 9.7002 -73.5996 7.2002zM377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6c6.40039 0 12.5 -2.5 17 -7z
M302.9 87.7002c0 0 -5.7002 -6.7998 -42.8008 9c40.3008 2.89941 46.9004 -6.2998 42.8008 -9z" />
    <glyph glyph-name="file-word" unicode="&#xf1c2;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM281.1 192c-5.59961 0 -10.5 -3.90039 -11.5 -9.5c-24.1992 -111.4 -21.7998 -118 -21.5996 -129.2
c-0.799805 5.40039 -5.59961 29 -29.5996 129.4c-1.30078 5.39941 -6.10059 9.2002 -11.7002 9.2002h-29.1006c-5.59961 0 -10.3994 -3.7002 -11.6992 -9.10059c-22.1006 -90 -27.8008 -112.5 -29.4004 -122.7c-0.900391 12.7002 -5.40039 44.2002 -21 122.2
c-1.09961 5.7002 -6.09961 9.7002 -11.7998 9.7002h-24.5c-7.7002 0 -13.4004 -7.09961 -11.7002 -14.5996l37.7998 -168c1.2002 -5.5 6.10059 -9.40039 11.7002 -9.40039h37.0996c5.5 0 10.3008 3.7998 11.6006 9.09961c23.2002 93.1006 24.5 96.2002 25.5996 110.5h0.5
c4.7998 -29.2998 -0.200195 -7 25.6006 -110.5c1.2998 -5.2998 6.09961 -9.09961 11.5996 -9.09961h38c5.59961 0 10.5 3.7998 11.7002 9.2998l38 168c1.7002 7.60059 -4 14.7002 -11.7002 14.7002h-23.9004zM384 326.1v-6.09961h-128v128h6.09961
c6.40039 0 12.5 -2.5 17 -7l97.9004 -98c4.5 -4.5 7 -10.5996 7 -16.9004z" />
    <glyph glyph-name="file-excel" unicode="&#xf1c3;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM284.1 205.5c5.10059 8 -0.599609 18.5 -10.0996 18.4004h-34.7998
c-4.40039 0 -8.5 -2.40039 -10.6006 -6.30078c-30.5 -56.7998 -36.5996 -68.5 -36.5996 -68.5c-16.5996 34.9004 -10.5 19.7002 -36.5996 68.5c-2.10059 3.90039 -6.2002 6.30078 -10.6006 6.30078h-34.7998c-9.5 0 -15.2998 -10.5 -10.0996 -18.5l60.2998 -93.5
l-60.2998 -93.5c-5.10059 -8 0.599609 -18.5 10.0996 -18.5h34.9004c4.39941 0 8.39941 2.39941 10.5 6.2998c26.5996 48.7998 30.1992 54 36.5996 68.7998c0 0 16.9004 -32.5 36.5 -68.7002c2.09961 -3.89941 6.2002 -6.2998 10.5996 -6.2998h34.9004
c9.5 0 15.2002 10.5 10.0996 18.5l-60.0996 93.5zM384 326.1v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7l97.9004 -98c4.5 -4.5 7 -10.5996 7 -16.9004z" />
    <glyph glyph-name="file-powerpoint" unicode="&#xf1c4;" horiz-adv-x="384" 
d="M193.7 176.8c8.7998 0 15.5 -2.7002 20.2998 -8.09961c9.59961 -10.9004 9.7998 -32.7002 -0.200195 -44.1006c-4.89941 -5.59961 -11.8994 -8.5 -21.0996 -8.5h-26.9004v60.7002h27.9004zM377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6
c6.40039 0 12.5 -2.5 17 -7zM224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM277 146.8c0 44.2002 -28.4004 77 -72.9004 77h-81
c-6.59961 0 -12 -5.39941 -12 -12v-199.8c0 -6.59961 5.40039 -12 12 -12h30.8008c6.59961 0 12 5.40039 12 12v57.2002c22.2998 0 111.1 -12.7002 111.1 77.5996z" />
    <glyph glyph-name="file-image" unicode="&#xf1c5;" horiz-adv-x="384" 
d="M384 326.059v-6.05859h-128v128h6.05859c5.4873 0 13.0898 -3.14941 16.9707 -7.0293l97.9404 -97.9404c3.88086 -3.88086 7.03027 -11.4834 7.03027 -16.9717zM248 288h136v-328c0 -13.2549 -10.7451 -24 -24 -24h-336c-13.2549 0 -24 10.7451 -24 24v464
c0 13.2549 10.7451 24 24 24h200v-136c0 -13.2002 10.7998 -24 24 -24zM112.545 272c-26.5088 0 -48 -21.4902 -48 -48s21.4902 -48 48 -48s48 21.4902 48 48s-21.4902 48 -48 48zM320.545 32v112l-39.5137 39.5146c-4.6875 4.68652 -12.2852 4.68652 -16.9717 0
l-103.515 -103.515l-39.5146 39.5146c-4.68652 4.68652 -11.7988 5.1709 -16.4854 0.485352l-39.5146 -39.5146l-0.485352 -48.4854h256z" />
    <glyph glyph-name="file-archive" unicode="&#xf1c6;" horiz-adv-x="384" 
d="M377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7zM128.4 112c17.8994 0 32.5 -12.0996 32.5 -27s-14.5 -27 -32.4004 -27s-32.5 12 -32.5 27c0 14.9004 14.5 27 32.4004 27zM224 312c0 -13.2002 10.7998 -24 24 -24h136
v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h104.4v-32h32v32h63.5996v-136zM95.9004 416v-32h32v32h-32zM128.2 32c33 0 57.7998 30.2002 51.3994 62.5996l-17.2998 87.7002
c-1.09961 5.60059 -6.09961 9.7002 -11.7998 9.7002h-22.0996v32h32v32h-32v32h32v32h-32v32h32v32h-32v-32h-32v-32h32v-32h-32v-32h32v-32h-32v-32l-19.6006 -97.0996c-6.59961 -32.5 18.2002 -62.9004 51.4004 -62.9004z" />
    <glyph glyph-name="file-audio" unicode="&#xf1c7;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM160 44v136c0 10.7002 -12.9004 16.0996 -20.5 8.5l-35.5 -36.5h-28c-6.59961 0 -12 -5.40039 -12 -12
v-56c0 -6.59961 5.40039 -12 12 -12h28l35.5 -36.5c7.59961 -7.5 20.5 -2.2002 20.5 8.5zM193.2 91.5996c-22.5 -23.0996 12.5996 -55.7998 34.3994 -33.5c27.2002 28 27.2002 72.5 0 100.4c-22.1992 22.7002 -56.5 -10.7002 -34.3994 -33.5
c9.09961 -9.2998 9.09961 -24.0996 0 -33.4004zM279.2 208.7c-22.1006 22.7998 -56.5 -10.7002 -34.4004 -33.5c36.2998 -37.2998 36.2002 -96.6006 0 -133.8c-22.5996 -23.2002 12.6006 -55.9004 34.4004 -33.5c54.3994 56 54.3994 144.899 0 200.8zM384 326.1v-6.09961
h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7l97.9004 -98c4.5 -4.5 7 -10.5996 7 -16.9004z" />
    <glyph glyph-name="file-video" unicode="&#xf1c8;" horiz-adv-x="384" 
d="M384 326.059v-6.05859h-128v128h6.05859c6.36523 0 12.4707 -2.5293 16.9717 -7.0293l97.9404 -97.9404c3.87988 -3.88086 7.0293 -11.4834 7.0293 -16.9717zM224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2549 -10.7451 -24 -24 -24h-336
c-13.2549 0 -24 10.7451 -24 24v464c0 13.2549 10.7451 24 24 24h200v-136zM320 167.984c0 21.4609 -25.96 31.9795 -40.9707 16.9697l-55.0293 -55.0127v38.0586c0 13.2549 -10.7451 24 -24 24h-112c-13.2549 0 -24 -10.7451 -24 -24v-112c0 -13.2549 10.7451 -24 24 -24
h112c13.2549 0 24 10.7451 24 24v38.0586l55.0293 -55.0088c15.0273 -15.0264 40.9707 -4.47363 40.9707 16.9717v111.963z" />
    <glyph glyph-name="file-code" unicode="&#xf1c9;" horiz-adv-x="384" 
d="M384 326.059v-6.05859h-128v128h6.05859c6.36523 0 12.4707 -2.5293 16.9717 -7.0293l97.9404 -97.9404c3.87988 -3.88086 7.0293 -11.4834 7.0293 -16.9717zM248 288h136v-328c0 -13.2549 -10.7451 -24 -24 -24h-336c-13.2549 0 -24 10.7451 -24 24v464
c0 13.2549 10.7451 24 24 24h200v-136c0 -13.2002 10.7998 -24 24 -24zM123.206 47.4951l19.5791 20.8838c0.805664 0.860352 1.45996 2.51465 1.45996 3.69336c0 1.34766 -0.820312 3.16309 -1.83203 4.05371l-40.7627 35.874l40.7627 35.874
c1.01172 0.890625 1.83203 2.70605 1.83203 4.05371c0 1.17871 -0.654297 2.83301 -1.45996 3.69336l-19.5791 20.8848c-0.882812 0.942383 -2.64844 1.70703 -3.93945 1.70703c-1.17871 0 -2.83398 -0.654297 -3.69336 -1.46094l-64.8662 -60.8115
c-0.942383 -0.883789 -1.70703 -2.64844 -1.70703 -3.93945c0 -1.29199 0.764648 -3.05664 1.70703 -3.94043l64.8662 -60.8115c0.859375 -0.806641 2.51465 -1.46094 3.69336 -1.46094c1.29102 0 3.05664 0.764648 3.93945 1.70703zM174.501 -2.98438
c0.407227 -0.118164 1.08203 -0.213867 1.50586 -0.213867c2.23926 0 4.56152 1.74512 5.18457 3.89551l61.4395 211.626c0.118164 0.407227 0.214844 1.08203 0.214844 1.50586c0 2.23828 -1.74512 4.56152 -3.89453 5.18555l-27.4521 7.9707
c-0.407227 0.117188 -1.08105 0.213867 -1.50488 0.213867c-2.23828 0 -4.5625 -1.74512 -5.1875 -3.89551l-61.4395 -211.626c-0.118164 -0.40625 -0.213867 -1.08105 -0.213867 -1.50391c0 -2.23926 1.74512 -4.56348 3.89453 -5.1875zM335.293 108.061
c0.942383 0.883789 1.70703 2.64844 1.70703 3.94043c0 1.29102 -0.764648 3.05566 -1.70605 3.93945l-64.8662 60.8115c-0.859375 0.806641 -2.51465 1.46094 -3.69336 1.46094c-1.29102 0 -3.05566 -0.764648 -3.93945 -1.70703l-19.5801 -20.8848
c-0.805664 -0.860352 -1.45996 -2.51465 -1.45996 -3.69336c0 -1.34766 0.820312 -3.16309 1.83203 -4.05371l40.7627 -35.874l-40.7637 -35.873c-1.01172 -0.890625 -1.83203 -2.70605 -1.83203 -4.05371c0 -1.17871 0.654297 -2.83301 1.45996 -3.69336l19.5801 -20.8848
c0.882812 -0.942383 2.64844 -1.70703 3.93945 -1.70703c1.17871 0 2.83398 0.654297 3.69336 1.46094z" />
    <glyph glyph-name="life-ring" unicode="&#xf1cd;" 
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM429.696 320.441c-10.6406 14.3398 -30.915 34.6143 -45.2549 45.2549l-63.3994 -63.3994c18.585 -11.0029 34.2676 -26.6963 45.2549 -45.2549zM256 96
c53.0186 0 96 42.9814 96 96s-42.9814 96 -96 96s-96 -42.9814 -96 -96s42.9814 -96 96 -96zM127.559 365.696c-14.3398 -10.6406 -34.6143 -30.915 -45.2549 -45.2549l63.3994 -63.3994c11.0029 18.585 26.6963 34.2676 45.2549 45.2549zM82.3037 63.5586
c10.6406 -14.3398 30.915 -34.6143 45.2549 -45.2549l63.3994 63.3994c-18.585 11.0029 -34.2676 26.6963 -45.2549 45.2549zM384.441 18.3037c14.3398 10.6406 34.6143 30.915 45.2549 45.2549l-63.3994 63.3994c-11.0029 -18.585 -26.6963 -34.2676 -45.2549 -45.2549z
" />
    <glyph glyph-name="circle-notch" unicode="&#xf1ce;" 
d="M288 408.944c0 15.5996 14.6777 27.167 29.7891 23.292c107.071 -27.457 186.211 -124.604 186.211 -240.236c0 -136.788 -110.745 -247.711 -247.466 -247.999c-137.054 -0.289062 -247.812 109.615 -248.531 246.667c-0.609375 116.126 78.5996 213.85 185.951 241.502
c15.2119 3.91895 30.0459 -7.52539 30.0459 -23.2344v-16.6475c0 -10.8047 -7.28125 -20.1621 -17.6885 -23.0693c-77.5254 -21.6543 -134.312 -92.749 -134.312 -177.219c0 -101.705 82.3105 -184 184 -184c101.705 0 184 82.3105 184 184
c0 84.4824 -56.7959 155.566 -134.314 177.219c-10.4043 2.90723 -17.6855 12.2627 -17.6855 23.0664v16.6592z" />
    <glyph glyph-name="paper-plane" unicode="&#xf1d8;" 
d="M476 444.8c17.2998 10 39 -4.59961 35.5996 -24.7998l-72 -432c-2.59961 -15.2998 -18.7998 -24.2002 -33 -18.2002l-124.6 52.2002l-63.5 -77.2998c-14 -17.1006 -42.5 -7.7998 -42.5 15.7998v80.5l240.9 293.5c4.69922 5.7002 -3.10059 13.2002 -8.60059 8.2998
l-287.3 -253.2l-106.3 44.6006c-18 7.59961 -20.2998 32.7998 -2.2002 43.2002z" />
    <glyph glyph-name="history" unicode="&#xf1da;" 
d="M504 192.469c0.25293 -136.64 -111.18 -248.372 -247.82 -248.468c-59.0146 -0.0419922 -113.223 20.5303 -155.821 54.9111c-11.0771 8.93945 -11.9053 25.541 -1.83984 35.6064l11.2676 11.2676c8.6084 8.6084 22.3525 9.55078 31.8906 1.9834
c31.3848 -24.9043 71.1045 -39.7695 114.323 -39.7695c101.705 0 184 82.3105 184 184c0 101.705 -82.3105 184 -184 184c-48.8145 0 -93.1494 -18.9688 -126.068 -49.9316l50.7539 -50.7539c10.0801 -10.0801 2.94141 -27.3145 -11.3125 -27.3145h-145.373
c-8.83691 0 -16 7.16309 -16 16v145.373c0 14.2539 17.2344 21.3926 27.3145 11.3135l49.3711 -49.3711c44.5234 42.5488 104.866 68.6846 171.314 68.6846c136.81 0 247.747 -110.78 248 -247.531zM323.088 113.685c-8.1377 -10.4629 -23.2158 -12.3467 -33.6787 -4.20996
l-65.4092 50.874v135.651c0 13.2549 10.7451 24 24 24h16c13.2549 0 24 -10.7451 24 -24v-104.349l40.7012 -31.6572c10.4629 -8.13672 12.3477 -23.2158 4.20996 -33.6787z" />
    <glyph glyph-name="heading" unicode="&#xf1dc;" 
d="M448 352v-320h32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-160c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32v128h-192v-128h32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-160
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32v320h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32v-128h192v128h-32c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32z" />
    <glyph glyph-name="paragraph" unicode="&#xf1dd;" horiz-adv-x="448" 
d="M448 400v-32c0 -8.83203 -7.16797 -16 -16 -16h-48v-368c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v368h-32v-368c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v112h-32c-88.3203 0 -160 71.6797 -160 160
s71.6797 160 160 160h240c8.83203 0 16 -7.16797 16 -16z" />
    <glyph glyph-name="sliders-h" unicode="&#xf1de;" 
d="M496 64c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-336v-16c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v16h-80c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h80v16c0 8.7998 7.2002 16 16 16h32
c8.7998 0 16 -7.2002 16 -16v-16h336zM496 224c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-80v-16c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v16h-336c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h336v16
c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-16h80zM496 384c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-208v-16c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v16h-208c-8.7998 0 -16 7.2002 -16 16v32
c0 8.7998 7.2002 16 16 16h208v16c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-16h208z" />
    <glyph glyph-name="share-alt" unicode="&#xf1e0;" horiz-adv-x="448" 
d="M352 128c53.0186 0 96 -42.9814 96 -96s-42.9814 -96 -96 -96s-96 42.9814 -96 96v0.0283203c0 5.8125 1.01953 15.1367 2.27637 20.8125l-102.486 64.0537c-16.4033 -13.0752 -37.1816 -20.8945 -59.79 -20.8945c-53.0186 0 -96 42.9814 -96 96s42.9814 96 96 96
c22.6084 0 43.3867 -7.81934 59.79 -20.8945l102.486 64.0537c-1.48633 6.71094 -2.27637 13.6826 -2.27637 20.8408c0 53.0186 42.9814 96 96 96s96 -42.9814 96 -96s-42.9814 -96 -96 -96c-22.6084 0 -43.3867 7.81934 -59.79 20.8965l-102.486 -64.0547
c1.25684 -5.68359 2.27637 -15.0205 2.27637 -20.8408c0 -5.82129 -1.01953 -15.1582 -2.27637 -20.8418l102.486 -64.0537c16.4033 13.0752 37.1816 20.8945 59.79 20.8945z" />
    <glyph glyph-name="share-alt-square" unicode="&#xf1e1;" horiz-adv-x="448" 
d="M448 368v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48zM304 152c-14.5615 0 -27.8232 -5.56055 -37.7832 -14.6709l-67.958 40.7744
c0.960938 3.77539 1.74121 10.001 1.74121 13.8975c0 3.89551 -0.780273 10.1211 -1.74121 13.8965l67.958 40.7744c9.95996 -9.11133 23.2217 -14.6719 37.7832 -14.6719c30.9277 0 56 25.0723 56 56s-25.0723 56 -56 56s-56 -25.0723 -56 -56
c0 -4.79688 0.605469 -9.45312 1.74023 -13.8975l-67.958 -40.7744c-9.95898 9.11133 -23.2207 14.6719 -37.7822 14.6719c-30.9277 0 -56 -25.0723 -56 -56s25.0723 -56 56 -56c14.5615 0 27.8232 5.56055 37.7832 14.6709l67.958 -40.7744
c-0.960938 -3.7666 -1.74023 -9.97656 -1.74023 -13.8623v-0.0351562c0 -30.9277 25.0723 -56 56 -56s56 25.0723 56 56c-0.000976562 30.9287 -25.0732 56.001 -56.001 56.001z" />
    <glyph glyph-name="bomb" unicode="&#xf1e2;" 
d="M440.5 359.5l-52 -52l26.5 -26.5c9.40039 -9.40039 9.40039 -24.5996 0 -33.9004l-17.4004 -17.3994c11.8008 -26.1006 18.4004 -55.1006 18.4004 -85.6006c0 -114.899 -93.0996 -208 -208 -208s-208 93 -208 207.9s93.0996 208 208 208
c30.5 0 59.5 -6.59961 85.5996 -18.4004l17.4004 17.4004c9.40039 9.40039 24.5996 9.40039 33.9004 0l26.5 -26.5l52 52zM500 388c6.59961 0 12 -5.40039 12 -12s-5.40039 -12 -12 -12h-24c-6.59961 0 -12 5.40039 -12 12s5.40039 12 12 12h24zM440 448
c6.59961 0 12 -5.40039 12 -12v-24c0 -6.59961 -5.40039 -12 -12 -12s-12 5.40039 -12 12v24c0 6.59961 5.40039 12 12 12zM473.9 393c-4.60059 -4.7002 -12.2002 -4.7002 -17 0c-4.7002 4.7002 -4.7002 12.2998 0 17l17 17c4.69922 4.7002 12.2998 4.7002 17 0
c4.69922 -4.7002 4.69922 -12.2998 0 -17zM406.1 393l-17 17c-4.69922 4.7002 -4.69922 12.2998 0 17c4.7002 4.7002 12.3008 4.7002 17 0l17 -17c4.7002 -4.7002 4.7002 -12.2998 0 -17c-4.69922 -4.7002 -12.2998 -4.7002 -17 0zM473.9 359l17 -17
c4.69922 -4.7002 4.69922 -12.2998 0 -17c-4.7002 -4.7002 -12.3008 -4.7002 -17 0l-17 17c-4.7002 4.7002 -4.7002 12.2998 0 17c4.69922 4.7002 12.2998 4.7002 17 0zM112 176c0 35.2998 28.7002 64 64 64c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16
c-52.9004 0 -96 -43.0996 -96 -96c0 -8.7998 7.2002 -16 16 -16s16 7.2002 16 16z" />
    <glyph glyph-name="futbol" unicode="&#xf1e3;" 
d="M504 192c0 -136.967 -111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248s248 -111.033 248 -248zM456 192l-0.00292969 0.282227l-26.0645 -22.7412l-62.6787 58.5l16.4541 84.3555l34.3027 -3.07227
c-24.8887 34.2158 -60.0039 60.0889 -100.709 73.1406l13.6514 -31.9385l-74.9531 -41.5264l-74.9531 41.5254l13.6514 31.9385c-40.6309 -13.0283 -75.7803 -38.8701 -100.709 -73.1406l34.5645 3.07324l16.1924 -84.3555l-62.6777 -58.5l-26.0645 22.7412
l-0.00292969 -0.282227c0 -43.0146 13.4971 -83.9521 38.4717 -117.991l7.7041 33.8975l85.1387 -10.4473l36.3008 -77.8262l-29.9023 -17.7861c40.2021 -13.1221 84.29 -13.1475 124.572 0l-29.9023 17.7861l36.3008 77.8262l85.1387 10.4473l7.7041 -33.8975
c24.9756 34.0391 38.4727 74.9766 38.4727 117.991zM207.898 122.429l-29.8945 91.3125l77.9961 56.5264l77.9961 -56.5264l-29.6221 -91.3125h-96.4756z" />
    <glyph glyph-name="tty" unicode="&#xf1e4;" 
d="M5.37012 344.178c138.532 138.532 362.936 138.326 501.262 0c6.07812 -6.07812 7.07422 -15.4961 2.58301 -22.6807l-43.2139 -69.1377c-2.97266 -4.75684 -9.9375 -8.61719 -15.5459 -8.61719c-1.94922 0 -5 0.587891 -6.81055 1.31152l-86.4219 34.5693
c-6.36133 2.54492 -11.5244 10.1719 -11.5244 17.0234c0 0.503906 0.0410156 1.32031 0.0908203 1.82227l5.95215 59.5312c-62.1455 22.4541 -130.636 21.9863 -191.483 0l5.95312 -59.5322c0.0507812 -0.501953 0.0908203 -1.32031 0.0908203 -1.8252
c0 -6.85156 -5.16309 -14.4766 -11.5244 -17.0205l-86.4238 -34.5684c-1.80957 -0.723633 -4.85938 -1.31152 -6.80859 -1.31152c-5.60938 0 -12.5742 3.86035 -15.5469 8.61719l-43.2109 69.1387c-1.53809 2.46094 -2.78711 6.81445 -2.78711 9.7168
c0 4.19141 2.40625 9.99902 5.37012 12.9629zM96 140c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM192 140c0 -6.62695 -5.37305 -12 -12 -12h-40
c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM288 140c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM384 140
c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM480 140c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40
c6.62695 0 12 -5.37305 12 -12v-40zM144 44c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM240 44c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40
c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM336 44c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM432 44c0 -6.62695 -5.37305 -12 -12 -12h-40
c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM96 -52c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM384 -52
c0 -6.62695 -5.37305 -12 -12 -12h-232c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h232c6.62695 0 12 -5.37305 12 -12v-40zM480 -52c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40
c6.62695 0 12 -5.37305 12 -12v-40z" />
    <glyph glyph-name="binoculars" unicode="&#xf1e5;" 
d="M416 400v-48h-96v48c0 8.83984 7.16016 16 16 16h64c8.83984 0 16 -7.16016 16 -16zM63.9102 288.01c0.479492 17.6201 14.2998 31.9902 31.9297 31.9902h96.1602v-160h-32v-160c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32v44
c3.45996 129.78 61.4004 150.16 63.9102 244.01zM448.09 288.01c2.50977 -93.8496 60.4502 -114.229 63.9102 -244.01v-44c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32v160h-32v160h96.1602c17.6299 0 31.4502 -14.3701 31.9297 -31.9902zM176 416
c8.83984 0 16 -7.16016 16 -16v-48h-96v48c0 8.83984 7.16016 16 16 16h64zM224 160v160h64v-160h-64z" />
    <glyph glyph-name="plug" unicode="&#xf1e6;" horiz-adv-x="384" 
d="M320 416v-96h-64v96c0 17.6641 14.3359 32 32 32s32 -14.3359 32 -32zM368 288c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-16v-32c-0.0107422 -72.1074 -57.3555 -142.354 -128 -156.8v-99.2002h-64v99.2002
c-70.6445 14.4463 -127.989 84.6924 -128 156.8v32h-16c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h352zM128 416v-96h-64v96c0 17.6641 14.3359 32 32 32s32 -14.3359 32 -32z" />
    <glyph glyph-name="newspaper" unicode="&#xf1ea;" horiz-adv-x="576" 
d="M552 384c13.2549 0 24 -10.7451 24 -24v-312c0 -26.5098 -21.4902 -48 -48 -48h-472c-30.9277 0 -56 25.0723 -56 56v272c0 13.2549 10.7451 24 24 24h40v8c0 13.2549 10.7451 24 24 24h464zM56 48c4.41602 0 8 3.58398 8 8v248h-16v-248c0 -4.41602 3.58398 -8 8 -8z
M292 64c6.62695 0 12 5.37305 12 12v8c0 6.62695 -5.37305 12 -12 12h-152c-6.62695 0 -12 -5.37305 -12 -12v-8c0 -6.62695 5.37305 -12 12 -12h152zM500 64c6.62695 0 12 5.37305 12 12v8c0 6.62695 -5.37305 12 -12 12h-152c-6.62695 0 -12 -5.37305 -12 -12v-8
c0 -6.62695 5.37305 -12 12 -12h152zM292 160c6.62695 0 12 5.37305 12 12v8c0 6.62695 -5.37305 12 -12 12h-152c-6.62695 0 -12 -5.37305 -12 -12v-8c0 -6.62695 5.37305 -12 12 -12h152zM500 160c6.62695 0 12 5.37305 12 12v8c0 6.62695 -5.37305 12 -12 12h-152
c-6.62695 0 -12 -5.37305 -12 -12v-8c0 -6.62695 5.37305 -12 12 -12h152zM500 256c6.62695 0 12 5.37305 12 12v40c0 6.62695 -5.37305 12 -12 12h-360c-6.62695 0 -12 -5.37305 -12 -12v-40c0 -6.62695 5.37305 -12 12 -12h360z" />
    <glyph glyph-name="wifi" unicode="&#xf1eb;" horiz-adv-x="640" 
d="M634.91 293.12c6.66016 -6.16016 6.79004 -16.5898 0.359375 -22.9805l-34.2393 -33.9697c-6.14062 -6.08984 -16.0205 -6.22949 -22.4004 -0.379883c-145.95 133.71 -371.33 133.68 -517.25 0c-6.37988 -5.84961 -16.2598 -5.71973 -22.3994 0.379883l-34.2402 33.9697
c-6.44043 6.39062 -6.31055 16.8203 0.349609 22.9805c177.101 163.81 452.65 163.87 629.82 0zM320 96c35.3496 0 64 -28.6504 64 -64s-28.6504 -64 -64 -64s-64 28.6504 -64 64s28.6504 64 64 64zM522.67 179.59c6.88965 -6.08984 7.12012 -16.6895 0.560547 -23.1494
l-34.4404 -33.9902c-6 -5.93066 -15.6602 -6.32031 -22.0498 -0.799805c-83.75 72.4092 -209.54 72.5693 -293.49 0c-6.38965 -5.52051 -16.0498 -5.12012 -22.0498 0.799805l-34.4404 33.9902c-6.5498 6.45996 -6.33008 17.0498 0.570312 23.1494
c115.13 101.82 290.08 101.93 405.34 0z" />
    <glyph glyph-name="calculator" unicode="&#xf1ec;" horiz-adv-x="448" 
d="M400 448c25.5996 0 48 -22.4004 48 -48v-416c0 -25.5996 -22.4004 -48 -48 -48h-352c-25.5996 0 -48 22.4004 -48 48v416c0 25.5996 22.4004 48 48 48h352zM128 12.7998v38.4004c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998zM128 140.8v38.4004c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998zM256 12.7998v38.4004c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998zM256 140.8v38.4004c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998zM384 12.7998v166.4c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-166.4c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998zM384 268.8v102.4c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-294.4
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-102.4c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h294.4c6.39941 0 12.7998 6.40039 12.7998 12.7998z" />
    <glyph glyph-name="bell-slash" unicode="&#xf1f6;" horiz-adv-x="640" 
d="M633.82 -10.0996c6.97949 -5.43066 8.22949 -15.4805 2.80957 -22.4502l-19.6396 -25.2705c-5.43066 -6.97949 -15.4805 -8.23926 -22.46 -2.80957l-588.351 454.729c-6.97949 5.43066 -8.22949 15.4805 -2.80957 22.4502l19.6396 25.2705
c5.41992 6.97949 15.4805 8.22949 22.46 2.80957l144.96 -112.04c22.9307 31.5 57.2607 54.1904 97.5898 62.5703v20.8398c0 17.6699 14.3203 32 31.9805 32s31.9805 -14.3301 31.9805 -32v-20.8301c73.46 -15.2598 127.939 -77.46 127.939 -155.16
c0 -102.3 36.1504 -133.529 55.4697 -154.29c6 -6.43945 8.66016 -14.1602 8.61035 -21.71c0 -1.39941 -0.610352 -2.67969 -0.799805 -4.05957zM157.23 196.46l212.789 -164.46h-241.92c-19.1191 0 -31.9893 15.5996 -32.0996 32
c-0.0498047 7.5498 2.61035 15.2598 8.61035 21.71c16.21 17.4199 44.0098 42.79 52.6201 110.75zM320 -64c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64z" />
    <glyph glyph-name="trash" unicode="&#xf1f8;" horiz-adv-x="448" 
d="M432 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h120l9.40039 18.7002c3.58984 7.3418 13.1357 13.2998 21.3086 13.2998h0.0908203h114.3h0.0175781
c8.20215 0 17.8262 -5.95801 21.4824 -13.2998l9.40039 -18.7002h120zM53.2002 -19l-21.2002 339h384l-21.2002 -339c-1.55469 -24.8369 -23.0146 -44.9971 -47.8994 -45h-245.801c-24.8848 0.00292969 -46.3447 20.1631 -47.8994 45z" />
    <glyph glyph-name="copyright" unicode="&#xf1f9;" 
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM373.134 93.2471c1.58203 1.85645 2.86621 5.34375 2.86621 7.7832c0 2.16309 -1.03613 5.33594 -2.31348 7.08301l-24.5469 33.5713
c-4.44824 6.08691 -13.376 6.61816 -18.5078 1.05371c-0.263672 -0.287109 -26.8467 -28.625 -65.5439 -28.625c-48.7627 0 -74.2773 40.0898 -74.2773 79.6914c0 42.5068 27.8008 76.082 73.916 76.082c35.3516 0 61.6475 -23.666 61.8809 -23.8799
c5.45996 -5.05566 14.1846 -3.97168 18.2334 2.29492l22.3799 34.6553c1.05957 1.64062 1.91992 4.55762 1.91992 6.51074c0 2.57812 -1.41504 6.21191 -3.15723 8.1123c-1.45703 1.58887 -36.4658 38.9043 -103.423 38.9043
c-81.7578 0 -143.762 -62.0986 -143.762 -143.401c0 -82.3066 59.792 -145.567 144.484 -145.567c70.0752 0 108.259 43.8643 109.851 45.7314z" />
    <glyph glyph-name="at" unicode="&#xf1fa;" 
d="M256 440c138.023 0 248 -87.6533 248 -224c0 -75.7979 -41.3906 -147.41 -150.299 -147.41c-30.0977 0 -61.1885 -0.000976562 -70.71 34.1035c-17.6221 -22.6963 -48.0068 -38.333 -74.9912 -38.333c-59.2148 0 -96 40.5664 -96 105.87
c0 89.2256 63.251 151.46 137.831 151.46c19.5225 0 45.2744 -3.87402 59.9707 -21.7754l0.00976562 0.0917969c0.751953 6.62012 6.76953 11.9932 13.4326 11.9932v0h44.9805c15.083 0 26.4287 -13.75 23.5625 -28.5586l-23.4336 -121.11
c-3.43359 -17.167 -3.87207 -29.5703 13.4766 -30.0244c37.0771 3.95117 58.1699 44.9072 58.1699 83.6934c0 102.381 -83.8613 160 -184 160c-101.458 0 -184 -82.542 -184 -184s82.542 -184 184 -184c35.3145 0 69.9199 10.2432 99.4102 29.1572
c10.1934 6.53809 23.7021 4.24219 31.373 -5.12891l10.1768 -12.4336c9.07324 -11.084 6.45312 -27.5566 -5.55176 -35.3721c-40.0664 -26.083 -87.2539 -40.2227 -135.408 -40.2227c-137.081 0 -248 110.941 -248 248c0 137.081 110.941 248 248 248zM234.32 135.57
c24.2861 0 58.1611 27.6689 58.1611 72.7295c0 25.5293 -13.3096 40.7705 -35.6016 40.7705c-27.8506 0 -58.6299 -27.7363 -58.6299 -72.7295c0 -25.1475 13.8213 -40.7705 36.0703 -40.7705z" />
    <glyph glyph-name="eye-dropper" unicode="&#xf1fb;" 
d="M50.75 114.75l126.63 126.61l128 -128l-126.64 -126.62c-12 -12 -28.2803 -18.7402 -45.25 -18.7402h-45.4902l-56 -32l-32 32l32 56v45.4902c0 16.9795 6.75 33.2598 18.75 45.2598zM483.88 419.88c37.5 -37.4902 37.5 -98.2695 -0.00976562 -135.75l-77.0898 -77.0898
l13.0996 -13.0996c9.37012 -9.37012 9.37012 -24.5703 0 -33.9404l-40.9697 -40.96c-9.29004 -9.30957 -24.5 -9.44043 -33.9404 0l-161.939 161.94c-9.37012 9.36914 -9.37012 24.5693 0 33.9395l40.9697 40.9697c9.29004 9.31055 24.5 9.44043 33.9404 0l13.0996 -13.0996
l77.0898 77.0898c37.4697 37.5 98.2803 37.5 135.75 0z" />
    <glyph glyph-name="paint-brush" unicode="&#xf1fc;" 
d="M167.02 138.66l88.0107 -73.3398c0.319336 -3.05078 0.969727 -6.02051 0.969727 -9.12988c0 -76.4209 -52.1396 -120.19 -128 -120.19c-90.0703 0 -128 72.3799 -128.01 154.73c9.79004 -6.68066 44.1396 -34.3506 55.25 -34.3506
c6.58984 0 12.2402 3.77051 14.5898 9.98047c20.6602 54.4395 57.0703 69.7197 97.1895 72.2998zM457.89 448c28.1104 0 54.1104 -20.6396 54.1104 -49.5498c0 -16.1406 -6.51953 -31.6406 -13.9004 -45.9902c-113.05 -210.99 -149.05 -256.46 -211.159 -256.46
c-7.75 0 -15.1807 1.23047 -22.3906 3.03027l-63.8193 53.1797c-5.48047 11.9404 -8.73047 25 -8.73047 38.7002c0 53.75 21.2695 58.04 225.68 240.64c10.8398 9.74023 25.0508 16.4502 40.21 16.4502z" />
    <glyph glyph-name="birthday-cake" unicode="&#xf1fd;" horiz-adv-x="448" 
d="M448 64c-28.0195 0 -31.2598 32 -74.5 32c-43.4297 0 -46.8252 -32 -74.75 -32c-27.6953 0 -31.4541 32 -74.75 32c-42.8418 0 -47.2178 -32 -74.5 -32c-28.1484 0 -31.2021 32 -74.75 32c-43.5469 0 -46.6533 -32 -74.75 -32v80c0 26.5 21.5 48 48 48h16v144h64v-144h64
v144h64v-144h64v144h64v-144h16c26.5 0 48 -21.5 48 -48v-80zM448 -64h-448v96c43.3564 0 46.7666 32 74.75 32c27.9512 0 31.2529 -32 74.75 -32c42.8428 0 47.2168 32 74.5 32c28.1484 0 31.2012 -32 74.75 -32c43.3574 0 46.7666 32 74.75 32
c27.4883 0 31.252 -32 74.5 -32v-96zM96 352c-17.75 0 -32 14.25 -32 32c0 31 32 23 32 64c12 0 32 -29.5 32 -56s-14.25 -40 -32 -40zM224 352c-17.75 0 -32 14.25 -32 32c0 31 32 23 32 64c12 0 32 -29.5 32 -56s-14.25 -40 -32 -40zM352 352c-17.75 0 -32 14.25 -32 32
c0 31 32 23 32 64c12 0 32 -29.5 32 -56s-14.25 -40 -32 -40z" />
    <glyph glyph-name="chart-area" unicode="&#xf1fe;" 
d="M500 64c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-488c-6.59961 0 -12 5.40039 -12 12v360c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-308h436zM372.7 288.5c6 4 14.2002 1.7998 17.3994 -4.7002l89.9004 -187.8h-384v104
l86.7998 144.7c4.40039 7.2998 14.7998 7.7998 19.9004 1l85.2998 -113.7z" />
    <glyph glyph-name="chart-pie" unicode="&#xf200;" horiz-adv-x="544" 
d="M527.79 160c9.5498 0 17.4004 -8.38965 16.0596 -17.8496c-7.80957 -55.25 -34.4297 -104.4 -73.1299 -140.86c-6.20996 -5.84961 -16.1494 -5.36035 -22.1895 0.679688l-158.03 158.03h237.29zM511.96 224.8c0.629883 -9.12012 -7.0498 -16.7998 -16.1904 -16.7998
h-223.77v223.76c0 9.14062 7.67969 16.8301 16.7998 16.2002c119.46 -8.24023 214.92 -103.7 223.16 -223.16zM224 160l155.86 -155.87c6.84961 -6.84961 6.33008 -18.4795 -1.57031 -24.0801c-38.29 -27.1602 -84.8604 -43.3994 -135.26 -44.0303
c-128.2 -1.60938 -238.53 103.471 -242.891 231.61c-4.23926 124.771 86.8506 228.88 206.021 245.72c9.4502 1.34082 17.8398 -6.50977 17.8398 -16.0596v-237.29z" />
    <glyph glyph-name="chart-line" unicode="&#xf201;" 
d="M496 64c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-464c-17.6699 0 -32 14.3301 -32 32v336c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-304h432zM464 352c8.83984 0 16 -7.16016 15.9902 -16v-118.05
c0 -21.3799 -25.8506 -32.0898 -40.9707 -16.9697l-32.3994 32.3994l-96 -96c-12.4902 -12.5 -32.75 -12.5 -45.25 0l-73.3701 73.3701l-46.0596 -46.0703c-6.25 -6.25 -16.3809 -6.25 -22.6309 0l-22.6191 22.6201c-6.25 6.25 -6.25 16.3799 0 22.6299l68.6895 68.6904
c12.4902 12.5 32.75 12.5 45.25 0l73.3701 -73.3701l73.3701 73.3799l-32.4004 32.4004c-15.1201 15.1201 -4.41016 40.9697 16.9707 40.9697h118.06z" />
    <glyph glyph-name="toggle-off" unicode="&#xf204;" horiz-adv-x="576" 
d="M384 384c106.039 0 192 -85.9609 192 -192s-85.9609 -192 -192 -192h-192c-106.039 0 -192 85.9609 -192 192s85.9609 192 192 192h192zM64 192c0 -70.751 57.2588 -128 128 -128c70.751 0 128 57.2588 128 128c0 70.751 -57.2588 128 -128 128
c-70.751 0 -128 -57.2588 -128 -128zM384 64c70.751 0 128 57.2598 128 128c0 70.751 -57.2588 128 -128 128h-48.9053c65.2363 -72.8799 65.2168 -183.142 0 -256h48.9053z" />
    <glyph glyph-name="toggle-on" unicode="&#xf205;" horiz-adv-x="576" 
d="M384 384c106 0 192 -86 192 -192s-86 -192 -192 -192h-192c-106 0 -192 86 -192 192s86 192 192 192h192zM384 64c70.7002 0 128 57.2002 128 128c0 70.7002 -57.2002 128 -128 128c-70.7002 0 -128 -57.2002 -128 -128c0 -70.7002 57.2002 -128 128 -128z" />
    <glyph glyph-name="bicycle" unicode="&#xf206;" horiz-adv-x="640" 
d="M512.509 255.999c70.9502 -0.276367 128.562 -59.0547 127.477 -129.996c-1.07422 -70.1934 -58.6494 -126.681 -129.255 -125.996c-68.8301 0.667969 -126.584 58.8857 -126.729 127.719c-0.078125 37.3564 15.8516 70.9893 41.3066 94.4375l-14.9375 24.0674
l-85.9619 -138.863c-3.88477 -6.27441 -13.0264 -11.3672 -20.4062 -11.3672h-52.0332c-14.209 -55.207 -64.3252 -96 -123.967 -96c-70.9473 0 -128.415 57.7207 -128 128.764c0.410156 70.2246 58.0918 127.406 128.317 127.236
c15.0879 -0.0371094 29.5586 -2.69043 42.9912 -7.51953l29.417 47.5195h-48.7256c-13.1191 0 -23.7627 10.5186 -23.9951 23.5635c-0.241211 13.4375 11.0947 24.4365 24.5361 24.4365h87.459c8.83691 0 16 -7.16309 16 -16v-16h113.544l-14.8955 24h-50.6494
c-8.83691 0 -16 7.16309 -16 16v16c0 8.83691 7.16309 16 16 16h64h0.000976562c7.36914 0 16.5049 -5.08203 20.3906 -11.3428l77.6807 -125.153c14.4053 5.54004 30.0625 8.55957 46.4355 8.49512zM186.75 182.228l-23.6641 -38.2275h43.3057
c-2.96875 14.5674 -9.91504 27.6992 -19.6416 38.2275zM128.002 48c32.7383 0 60.9297 19.7754 73.2998 48h-81.2998c-18.7891 0 -30.2871 20.6729 -20.4062 36.6318l45.5049 73.5088c-5.5127 1.20605 -11.2295 1.85938 -17.0986 1.85938c-44.1123 0 -80 -35.8877 -80 -80
s35.8877 -80 80 -80zM290.632 144l74.2861 120h-127.547l-24.7461 -39.9736c22.8271 -20.1328 38.4229 -48.2705 42.3828 -80.0264h35.624zM507.689 48.1143c46.0605 -2.43164 84.3115 34.3447 84.3125 79.8848c0 44.1123 -35.8877 80 -80 80h-0.0390625
c-5.55664 0 -14.4355 -1.11914 -19.8193 -2.49707l44.4688 -71.6426c4.66113 -7.50879 2.35156 -17.3721 -5.15625 -22.0322l-13.5938 -8.4375c-7.50879 -4.65918 -17.3721 -2.35156 -22.0322 5.15625l-44.4326 71.5859
c-12.7021 -14.7451 -20.1475 -34.1416 -19.3359 -55.2627c1.57812 -41.0635 34.5918 -74.5898 75.6279 -76.7549z" />
    <glyph glyph-name="bus" unicode="&#xf207;" 
d="M488 320c13.25 0 24 -10.7402 24 -24v-80c0 -13.25 -10.75 -24 -24 -24h-8v-166.4c0 -12.7998 -9.59961 -25.5996 -25.5996 -25.5996h-6.40039v-32c0 -17.6699 -14.3301 -32 -32 -32h-32c-17.6699 0 -32 14.3301 -32 32v32h-192v-32c0 -17.6699 -14.3301 -32 -32 -32h-32
c-17.6699 0 -32 14.3301 -32 32v32c-17.6699 0 -32 14.3301 -32 32v160h-8c-13.25 0 -24 10.75 -24 24v80c0 13.2598 10.75 24 24 24h8v48c0 44.7998 99.2002 80 224 80s224 -35.2002 224 -80v-48h8zM112 48c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32
s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM128 160h256c17.6699 0 32 14.3301 32 32v128c0 17.6699 -14.3301 32 -32 32h-256c-17.6699 0 -32 -14.3301 -32 -32v-128c0 -17.6699 14.3301 -32 32 -32zM400 48c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32
s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="closed-captioning" unicode="&#xf20a;" 
d="M464 384c26.5 0 48 -21.5 48 -48v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h416zM218.1 160.3c-41.1992 -37.8994 -92.1992 -15.3994 -92.2998 32.6006c0 46.0996 53.7998 63.1992 94.6006 31.1992
c2.89941 -2.2998 7.19922 -1.39941 9.09961 1.7002l17.5 30.5c1.5 2.5 1.09961 3.7002 -1 5.7002c-50.7998 49.4004 -172.5 27.2002 -172.5 -70.0996c0 -100 119.2 -124.7 172.8 -67.9004c2 2.09961 2.2002 5.2998 0.5 7.7002l-19.5 27.7002
c-2.09961 3 -6.39941 3.39941 -9.2002 0.899414zM408.5 160.3c-41.2002 -37.8994 -92.2002 -15.3994 -92.2002 32.6006c0 46.0996 53.7998 63.1992 94.6006 31.1992c2.89941 -2.2998 7.19922 -1.39941 9.09961 1.7002l17.5 30.5c1.5 2.5 1.09961 3.7002 -1 5.7002
c-50.7998 49.4004 -172.5 27.2002 -172.5 -70.0996c0 -100 119.2 -124.801 172.7 -67.9004c2 2.09961 2.2002 5.2998 0.5 7.7002l-19.5 27.7002c-2.10059 3 -6.40039 3.39941 -9.2002 0.899414z" />
    <glyph glyph-name="shekel-sign" unicode="&#xf20b;" horiz-adv-x="448" 
d="M248 280c0 30.9297 -25.0703 56 -56 56h-112v-352c0 -8.83984 -7.16016 -16 -16 -16h-48c-8.83984 0 -16 7.16016 -16 16v408c0 13.2598 10.75 24 24 24h168c75.1104 0 136 -60.8896 136 -136v-168c0 -8.83984 -7.16016 -16 -16 -16h-48c-8.83984 0 -16 7.16016 -16 16
v168zM432 416c8.83984 0 16 -7.16016 16 -16v-296c0 -75.1104 -60.8896 -136 -136 -136h-168c-13.25 0 -24 10.75 -24 24v280c0 8.83984 7.16016 16 16 16h48c8.83984 0 16 -7.16016 16 -16v-224h112c30.9297 0 56 25.0703 56 56v296c0 8.83984 7.16016 16 16 16h48z" />
    <glyph glyph-name="cart-plus" unicode="&#xf217;" horiz-adv-x="576" 
d="M504.717 128h-293.145l6.54492 -32h268.418c15.4004 0 26.8154 -14.3008 23.4033 -29.3193l-5.51758 -24.2754c18.6914 -9.07324 31.5791 -28.2334 31.5791 -50.4053c0 -31.2021 -25.5186 -56.4443 -56.8242 -55.9941
c-29.8232 0.428711 -54.3496 24.6309 -55.1543 54.4473c-0.44043 16.2871 6.08496 31.0488 16.8027 41.5479h-209.648c10.377 -10.166 16.8242 -24.3271 16.8242 -40.001c0 -31.8135 -26.5283 -57.4307 -58.6699 -55.9385c-28.54 1.3252 -51.751 24.3857 -53.251 52.917
c-1.1582 22.0342 10.4355 41.4551 28.0508 51.5869l-70.2471 343.435h-69.8828c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24h102.529c11.4004 0 21.2275 -8.02148 23.5127 -19.1904l9.16602 -44.8096h392.782
c15.4004 0 26.8154 -14.3008 23.4023 -29.3193l-47.2725 -208c-2.4834 -10.9268 -12.1973 -18.6807 -23.4033 -18.6807zM408 280h-48v40c0 8.83691 -7.16309 16 -16 16h-16c-8.83691 0 -16 -7.16309 -16 -16v-40h-48c-8.83691 0 -16 -7.16309 -16 -16v-16
c0 -8.83691 7.16309 -16 16 -16h48v-40c0 -8.83691 7.16309 -16 16 -16h16c8.83691 0 16 7.16309 16 16v40h48c8.83691 0 16 7.16309 16 16v16c0 8.83691 -7.16309 16 -16 16z" />
    <glyph glyph-name="cart-arrow-down" unicode="&#xf218;" horiz-adv-x="576" 
d="M504.717 128h-293.145l6.54492 -32h268.418c15.4004 0 26.8154 -14.3008 23.4033 -29.3193l-5.51758 -24.2754c18.6914 -9.07324 31.5791 -28.2334 31.5791 -50.4053c0 -31.2021 -25.5186 -56.4443 -56.8242 -55.9941
c-29.8232 0.428711 -54.3496 24.6309 -55.1543 54.4473c-0.44043 16.2871 6.08496 31.0488 16.8027 41.5479h-209.648c10.377 -10.166 16.8242 -24.3271 16.8242 -40.001c0 -31.8135 -26.5283 -57.4307 -58.6699 -55.9385c-28.54 1.3252 -51.751 24.3857 -53.251 52.917
c-1.1582 22.0342 10.4355 41.4551 28.0508 51.5869l-70.2471 343.435h-69.8828c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24h102.529c11.4004 0 21.2275 -8.02148 23.5127 -19.1904l9.16602 -44.8096h392.782
c15.4004 0 26.8154 -14.3008 23.4023 -29.3193l-47.2725 -208c-2.4834 -10.9268 -12.1973 -18.6807 -23.4033 -18.6807zM403.029 256h-43.0293v60c0 6.62695 -5.37305 12 -12 12h-24c-6.62695 0 -12 -5.37305 -12 -12v-60h-43.0293
c-10.6904 0 -16.0449 -12.9258 -8.48438 -20.4854l67.0283 -67.0283c4.68652 -4.68652 12.2842 -4.68652 16.9717 0l67.0283 67.0283c7.55957 7.55957 2.20508 20.4854 -8.48535 20.4854z" />
    <glyph glyph-name="ship" unicode="&#xf21a;" horiz-adv-x="640" 
d="M496.616 75.3613c17.8418 -44.3604 58.5664 -75.3613 119.384 -75.3613c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24c-61.0322 0 -107.505 20.6162 -143.258 59.3965c-14.4189 -34.8281 -48.7637 -59.3965 -88.7422 -59.3965h-128
c-39.9785 0 -74.3232 24.5684 -88.7422 59.3965c-35.7588 -38.7861 -82.2344 -59.3965 -143.258 -59.3965c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24c61.5869 0 101.828 31.7129 119.384 75.3613l-70.0117 70.0117
c-16.918 16.9189 -9.91699 45.7793 12.8359 53.0918l41.792 13.4336v140.102c0 17.6729 14.3271 32 32 32h64v40c0 13.2549 10.7451 24 24 24h144c13.2549 0 24 -10.7451 24 -24v-40h64c17.6729 0 32 -14.3271 32 -32v-140.102l41.792 -13.4336
c22.7783 -7.32129 29.7354 -36.1914 12.8359 -53.0918zM192 320v-87.5312l118.208 37.9951c2.63574 0.847656 7.02344 1.53516 9.79199 1.53516s7.15625 -0.6875 9.79199 -1.53516l118.208 -37.9951v87.5312h-256z" />
    <glyph glyph-name="user-secret" unicode="&#xf21b;" horiz-adv-x="448" 
d="M383.9 139.7c38.2998 -23.7002 64.0996 -65.7002 64.0996 -114.101v-44.7998c0 -24.7002 -20.0996 -44.7998 -44.7998 -44.7998h-358.4c-24.7002 0 -44.7998 20.0996 -44.7998 44.7998v44.7998c0 49.7002 27.2998 92.6006 67.4004 115.9l-25.8008 60.2002
c-4.5 10.5996 3.2002 22.2998 14.7002 22.2998h57.5c-11 18.9004 -17.7998 40.5996 -17.7998 64v0.299805c-39.2002 7.7998 -64 19.1006 -64 31.7002c0 13.2998 27.2998 25.0996 70 33c9.2002 32.7998 27.0996 65.7998 40.5996 82.7998
c9.5 11.9004 25.9004 15.6006 39.5 8.7998l27.6006 -13.7998c9 -4.5 19.5996 -4.5 28.5996 0l27.6006 13.7998c13.5996 6.80078 30 3.10059 39.5 -8.7998c13.5996 -17 31.3994 -50 40.5996 -82.7998c42.7998 -7.90039 70.0996 -19.7002 70.0996 -33
c0 -12.5996 -24.7998 -23.9004 -64 -31.7002v-0.299805c0 -23.4004 -6.7998 -45.0996 -17.7998 -64h58.5c11.2998 0 19 -11.2002 15 -21.7002zM176 -32l32 120l-24 40l-49.5996 32zM272 -32l41.5996 192l-49.5996 -32l-24 -40zM313.7 266.5
c0.799805 2.59961 6.2998 5.7002 6.39941 5.7998v10.7998c-28.2998 -3.69922 -61 -5.7998 -96 -5.7998s-67.6992 2.2002 -96 5.7998v-10.7998c0 -0.0996094 5.5 -3.2998 6.30078 -5.7998c3.7998 -11.9004 7 -24.5996 16.5 -33.4004c8 -7.39941 47 -25.1992 64 25
c2.89941 8.40039 15.5 8.40039 18.2998 0c16 -47.3994 53.8994 -34.2998 64 -25c9.5 8.80078 12.5996 21.5 16.5 33.4004z" />
    <glyph glyph-name="motorcycle" unicode="&#xf21c;" horiz-adv-x="640" 
d="M512.9 256c69.5996 -0.5 126.5 -57.2998 127.199 -126.9c0.600586 -71.5996 -57.5996 -129.8 -129.199 -129.1c-69.6006 0.599609 -126.301 57.5 -126.801 127.1c-0.299805 39.3008 17.2002 74.5 44.8008 98.2002l-12.5 20.7998
c-38.7002 -31.2998 -58.3008 -77.8994 -56.2002 -125c0.599609 -13.6992 -10.2998 -25.0996 -24 -25.0996h-84.2002c-14.2998 -55.2002 -64.4004 -96 -124 -96c-71.7002 0 -129.6 58.9004 -128 131c1.59961 67.4004 55.9004 122.5 123.2 124.9
c14.3994 0.5 28.2998 -1.30078 41.2998 -5.2002l11.2998 20.5c-9.09961 13.8994 -23.2998 24.7998 -47.7998 24.7998h-56c-13.0996 0 -23.7998 10.5 -24 23.5c-0.299805 13.5 11 24.5 24.5 24.5h55.5c55 0 82.2002 -16.9004 99.9004 -40h153.699l-19.1992 32h-66.4004
c-8.7998 0 -16 7.2002 -16 16v16c0 8.7998 7.2002 16 16 16h80c8.40039 0 16.2002 -4.40039 20.5996 -11.5996l22.8008 -38l37.5 41.6992c4.5 5 11 7.90039 17.7998 7.90039h45.2998c13.2998 0 24 -10.7002 24 -24v-32c0 -13.2998 -10.7002 -24 -24 -24h-82.4004
l32.9004 -54.9004c13.2998 4.60059 27.5 7 42.4004 6.90039zM128 48c32.7002 0 60.9004 19.7998 73.2998 48h-81.2998c-18.2002 0 -29.7998 19.5996 -21 35.5996l41.5 75.4004c-4.09961 0.700195 -8.2998 1 -12.5 1c-44.0996 0 -80 -35.9004 -80 -80s35.9004 -80 80 -80z
M591.9 123.6c2.39941 46.1006 -34.3008 84.4004 -79.9004 84.3008c-5.40039 0 -10.7002 -0.5 -15.9004 -1.60059l48.6006 -80.8994c4.5 -7.60059 2.09961 -17.5 -5.5 -22l-13.7002 -8.2002c-7.59961 -4.5 -17.5 -2.10059 -22 5.5l-49.4004 82.3994
c-13.6992 -14.2998 -22.0996 -33.6992 -22.0996 -55.0996c0 -45.5996 38.2998 -82.4004 84.4004 -79.9004c40.5 2.10059 73.2998 34.9004 75.5 75.5z" />
    <glyph glyph-name="street-view" unicode="&#xf21d;" 
d="M367.9 118.24c85.2295 -15.5801 144.1 -48.29 144.1 -86.2402c0 -53.0195 -114.62 -96 -256 -96s-256 42.9805 -256 96c0 37.9502 58.8701 70.6602 144.1 86.2402c4.62012 -5.2998 9.78027 -10.1006 15.9004 -13.6504v-22.9395
c-66.5195 -9.35059 -112 -28.0508 -112 -49.6504c0 -30.9297 93.1201 -56 208 -56s208 25.0703 208 56c0 21.5996 -45.4805 40.3096 -112 49.6504v22.9395c6.12012 3.5498 11.2803 8.35059 15.9004 13.6504zM256 320c-35.3496 0 -64 28.6504 -64 64s28.6504 64 64 64
s64 -28.6504 64 -64s-28.6504 -64 -64 -64zM192 128c-17.6699 0 -32 14.3301 -32 32v96c0 26.5098 21.4902 48 48 48h11.7998c11.0703 -5.03027 23.2598 -8 36.2002 -8s25.1299 2.96973 36.2002 8h11.7998c26.5098 0 48 -21.4902 48 -48v-96
c0 -17.6699 -14.3301 -32 -32 -32v-96c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v96z" />
    <glyph glyph-name="heartbeat" unicode="&#xf21e;" 
d="M320.2 204.2l22.0996 -44.2002h109.101l-182.601 -186.5c-7.09961 -7.2998 -18.5996 -7.2998 -25.7002 0l-182.5 186.5h94.1006l30 71.7002l56.8994 -126.3c5.5 -12.3008 22.9004 -12.7002 28.9004 -0.600586zM473.7 374.1
c48.7002 -49.7998 50.7998 -129.1 7.2998 -182.1h-118.9l-27.5996 55.2002c-5.90039 11.7998 -22.7002 11.7998 -28.5996 0l-49 -97.9004l-58.2002 129.3c-5.7998 12.8008 -24 12.5 -29.4004 -0.399414l-35.8994 -86.2002h-102.4c-43.5 53 -41.4004 132.3 7.2998 182.1
l2.40039 2.40039c51.5 52.7002 135.899 52.7002 187.399 0l27.9004 -28.5l27.9004 28.5996c51.5996 52.6006 135.899 52.6006 187.399 0z" />
    <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="288" 
d="M288 272c0 -68.5 -47.9004 -125.9 -112 -140.4v-51.5996h36c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-36v-36c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v36h-36c-6.59961 0 -12 5.40039 -12 12v40
c0 6.59961 5.40039 12 12 12h36v51.5996c-64.0996 14.5 -112 71.9004 -112 140.4c0 79.5 64.5 144 144 144s144 -64.5 144 -144zM64 272c0 -44.0996 35.9004 -80 80 -80s80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80z" />
    <glyph glyph-name="mars" unicode="&#xf222;" horiz-adv-x="384" 
d="M372 384c6.59961 0 12 -5.40039 12 -12v-79c0 -10.7002 -12.9004 -16.0996 -20.5 -8.5l-16.9004 16.9004l-80.6992 -80.7002c14 -22.2002 22.0996 -48.5 22.0996 -76.7002c0 -79.5 -64.5 -144 -144 -144s-144 64.5 -144 144s64.5 144 144 144
c28.2002 0 54.5 -8.09961 76.7002 -22.0996l80.7002 80.6992l-16.9004 16.9004c-7.5 7.59961 -2.2002 20.5 8.5 20.5h79zM144 64c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80s35.9004 -80 80 -80z" />
    <glyph glyph-name="mercury" unicode="&#xf223;" horiz-adv-x="288" 
d="M288 240c0 -68.5 -47.9004 -125.9 -112 -140.4v-51.5996h36c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-36v-36c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v36h-36c-6.59961 0 -12 5.40039 -12 12v40
c0 6.59961 5.40039 12 12 12h36v51.5996c-64.0996 14.5 -112 71.9004 -112 140.4c0 44.2002 19.9004 83.7002 51.2002 110c-2.5 1.90039 -4.90039 3.7998 -7.2002 5.7998c-24.7998 21.2002 -39.7998 48.7998 -43.2002 78.9004
c-0.899414 7.09961 4.7002 13.2998 11.9004 13.2998h40.5c5.7002 0 10.5996 -4.09961 11.7002 -9.7998c2.5 -12.5 9.59961 -24.2998 20.6992 -33.7998c15.4004 -13.2002 36.1006 -20.4004 58.4004 -20.4004s43 7.2002 58.2998 20.4004
c11.1006 9.5 18.2998 21.2998 20.7002 33.7998c1.09961 5.7002 6 9.7998 11.7998 9.7998h40.5c7.2002 0 12.7998 -6.2002 11.9004 -13.2998c-3.40039 -30 -18.5 -57.6006 -43.2002 -78.7998c-2.2998 -2 -4.7002 -4 -7.2002 -5.80078
c31.2998 -26.3994 51.2002 -65.8994 51.2002 -110.1zM64 240c0 -44.0996 35.9004 -80 80 -80s80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80z" />
    <glyph glyph-name="transgender" unicode="&#xf224;" horiz-adv-x="384" 
d="M372 448c6.59961 0 12 -5.40039 12 -12v-79c0 -10.7002 -12.9004 -16.0996 -20.5 -8.5l-16.9004 16.9004l-80.6992 -80.7002c14 -22.2002 22.0996 -48.5 22.0996 -76.7002c0 -68.5 -47.9004 -125.8 -112 -140.4v-27.5996h36c6.59961 0 12 -5.40039 12 -12v-40
c0 -6.59961 -5.40039 -12 -12 -12h-36v-28c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v28h-36c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h36v27.5996c-64.0996 14.5 -112 71.9004 -112 140.4c0 79.5 64.5 144 144 144
c28.2002 0 54.5 -8.09961 76.7002 -22.0996l80.7002 80.6992l-16.9004 16.9004c-7.5 7.59961 -2.2002 20.5 8.5 20.5h79zM144 128c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80s35.9004 -80 80 -80z" />
    <glyph glyph-name="transgender-alt" unicode="&#xf225;" horiz-adv-x="480" 
d="M468 448c6.59961 0 12 -5.40039 12 -12v-79c0 -10.7002 -12.9004 -16.0996 -20.5 -8.5l-16.9004 16.9004l-80.6992 -80.7002c14 -22.2002 22.0996 -48.5 22.0996 -76.7002c0 -68.5 -47.9004 -125.8 -112 -140.4v-27.5996h36c6.59961 0 12 -5.40039 12 -12v-40
c0 -6.59961 -5.40039 -12 -12 -12h-36v-28c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v28h-36c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h36v27.5996c-64.0996 14.5 -112 71.9004 -112 140.4
c0 28.2002 8.09961 54.5 22.2002 76.5996l-16.5 16.5l-19.7998 -19.7998c-4.7002 -4.7002 -12.3008 -4.7002 -17 0l-28.3008 28.2998c-4.69922 4.7002 -4.69922 12.3008 0 17l19.8008 19.8008l-19 19l-16.9004 -16.9004c-7.59961 -7.5 -20.5 -2.2002 -20.5 8.5v79
c0 6.59961 5.40039 12 12 12h79c10.7002 0 16.0996 -12.9004 8.40039 -20.4004l-16.9004 -16.8994l19 -19l19.7998 19.7998c4.7002 4.7002 12.2998 4.7002 17 0l28.2998 -28.2998c4.7002 -4.7002 4.7002 -12.2998 0 -17l-19.7998 -19.7998l16.5 -16.5
c22.2002 14 48.5 22.0996 76.7002 22.0996s54.5 -8.09961 76.7002 -22.0996l80.7002 80.6992l-16.9004 16.9004c-7.5 7.59961 -2.2002 20.5 8.5 20.5h79zM240 128c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80s35.9004 -80 80 -80z" />
    <glyph glyph-name="venus-double" unicode="&#xf226;" 
d="M288 272c0 -68.5 -47.9004 -125.9 -112 -140.4v-51.5996h36c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-36v-36c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v36h-36c-6.59961 0 -12 5.40039 -12 12v40
c0 6.59961 5.40039 12 12 12h36v51.5996c-64.0996 14.5 -112 71.9004 -112 140.4c0 79.5 64.5 144 144 144s144 -64.5 144 -144zM64 272c0 -44.0996 35.9004 -80 80 -80s80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80zM400 131.6v-51.5996h36
c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-36v-36c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v36h-36c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h36v51.5996
c-21.2002 4.80078 -40.5996 14.3008 -57.2002 27.3008c14 16.6992 25 36 32.1006 57.0996c14.5 -14.7998 34.6992 -24 57.0996 -24c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80c-22.2998 0 -42.5996 -9.2002 -57.0996 -24
c-7.10059 21.0996 -18 40.4004 -32.1006 57.0996c24.6006 19.3008 55.5 30.9004 89.2002 30.9004c79.5 0 144 -64.5 144 -144c0 -68.5 -47.9004 -125.9 -112 -140.4z" />
    <glyph glyph-name="mars-double" unicode="&#xf227;" 
d="M340 448c6.59961 0 12 -5.40039 12 -12v-79c0 -7.2002 -5.90039 -12 -12.0996 -12c-2.90039 0 -6 1.09961 -8.40039 3.5l-16.9004 16.9004l-48.6992 -48.7002c14 -22.2002 22.0996 -48.5 22.0996 -76.7002c0 -79.5 -64.5 -144 -144 -144s-144 64.5 -144 144
s64.5 144 144 144c28.2002 0 54.5 -8.09961 76.7002 -22.0996l48.7002 48.6992l-16.9004 16.9004c-7.5 7.59961 -2.2002 20.5 8.5 20.5h79zM144 160c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80s35.9004 -80 80 -80zM500 288.1
c6.59961 0 12 -5.39941 12 -12.0996v-79c0 -7.2002 -5.90039 -12 -12.0996 -12c-3 0 -6 1.09961 -8.40039 3.5l-16.9004 16.9004l-48.6992 -48.7002c14 -22.2002 22.0996 -48.5 22.0996 -76.7002c0 -79.5 -64.5 -144 -144 -144c-74.4004 0 -135.6 56.4004 -143.2 128.9
c21.7998 2 43.2998 8.19922 63.2998 18.3994c-0.0996094 -1 -0.0996094 -2.09961 -0.0996094 -3.2002c0 -44.0996 35.9004 -80 80 -80s80 35.9004 80 80c0 44.1006 -35.9004 80 -80 80c-1 0 -2.09961 -0.0996094 -3.2002 -0.0996094
c10.2002 20 16.2998 41.5 18.4004 63.2998c22.5 -2.39941 43.2998 -9.89941 61.5 -21.2998l48.7002 48.7002l-16.9004 16.8994c-7.5 7.60059 -2.2002 20.5 8.5 20.5h79z" />
    <glyph glyph-name="venus-mars" unicode="&#xf228;" horiz-adv-x="576" 
d="M564 448c6.59961 0 12 -5.40039 12 -12v-79c0 -7.2002 -5.90039 -12 -12.0996 -12c-3 0 -6 1.09961 -8.40039 3.5l-16.9004 16.9004l-48.6992 -48.7002c14 -22.2002 22.0996 -48.5 22.0996 -76.7002c0 -79.5 -64.5 -144 -144 -144
c-33.7002 0 -64.7002 11.5 -89.2002 30.9004c14.1006 16.6992 25 36 32.1006 57.0996c14.5 -14.7998 34.7998 -24 57.0996 -24c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80c-22.4004 0 -42.5996 -9.2002 -57.0996 -24
c-7.10059 21.0996 -18.1006 40.4004 -32.1006 57.0996c24.6006 19.3008 55.5 30.9004 89.2002 30.9004c28.2002 0 54.5 -8.09961 76.7002 -22.0996l48.7002 48.6992l-16.9004 16.9004c-7.5 7.59961 -2.2002 20.5 8.5 20.5h79zM144 384c79.5 0 144 -64.5 144 -144
c0 -68.5 -47.9004 -125.8 -112 -140.4v-51.5996h36c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-36v-36c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v36h-36c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12
h36v51.5996c-64.0996 14.5 -112 71.9004 -112 140.4c0 79.5 64.5 144 144 144zM144 160c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80s35.9004 -80 80 -80z" />
    <glyph glyph-name="mars-stroke" unicode="&#xf229;" horiz-adv-x="384" 
d="M372 384c6.59961 0 12 -5.40039 12.0996 -12v-78.9004c0 -10.6992 -12.8994 -16.0996 -20.5 -8.5l-16.8994 16.9004l-17.5 -17.5l14.0996 -14.0996c4.7002 -4.7002 4.7002 -12.3008 0 -17l-28.2998 -28.3008c-4.7002 -4.69922 -12.2998 -4.69922 -17 0l-14.0996 14.1006
l-18 -18c14 -22.2002 22.0996 -48.5 22.0996 -76.7002c0 -79.5 -64.5 -144 -144 -144s-144 64.5 -144 144s64.5 144 143.9 144c28.1992 0 54.5 -8.09961 76.6992 -22.0996l18 18l-14.0996 14.0996c-4.7002 4.7002 -4.7002 12.2998 0 17l28.2998 28.2002
c4.7002 4.7002 12.2998 4.7002 17 0l14.1006 -14.1006l17.5 17.5l-16.9004 16.9004c-7.5 7.59961 -2.2002 20.5 8.5 20.5h79zM144 64c44.0996 0 80 35.9004 80 80s-35.9004 80 -80 80s-80 -35.9004 -80 -80s35.9004 -80 80 -80z" />
    <glyph glyph-name="mars-stroke-v" unicode="&#xf22a;" horiz-adv-x="288" 
d="M245.8 213.8c56.2998 -56.2002 56.2998 -147.399 0 -203.6c-56.2002 -56.2002 -147.399 -56.2002 -203.6 0s-56.2002 147.399 0 203.6c19.8994 19.9004 44.2002 32.7998 69.7998 38.6006v25.3994h-20c-6.59961 0 -12 5.40039 -12 12v40c0 6.60059 5.40039 12 12 12h20
v24.7002h-23.9004c-10.6992 0 -16.0996 12.9004 -8.5 20.5l55.9004 55.9004c4.7002 4.69922 12.2998 4.69922 17 0l55.9004 -55.8008c7.5 -7.59961 2.19922 -20.5 -8.5 -20.5h-23.9004v-24.7998h20c6.59961 0 12 -5.39941 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20
v-25.3994c25.5996 -5.80078 49.9004 -18.7002 69.7998 -38.6006zM200.6 55.4004c31.2002 31.1992 31.2002 82 0 113.1c-31.1992 31.2002 -81.8994 31.2002 -113.1 0s-31.2002 -81.9004 0 -113.1c31.2002 -31.2002 81.9004 -31.2002 113.1 0z" />
    <glyph glyph-name="mars-stroke-h" unicode="&#xf22b;" horiz-adv-x="480" 
d="M476.2 200.5c4.7002 -4.7002 4.7002 -12.2998 0.0996094 -17l-55.8994 -55.9004c-7.60059 -7.5 -20.5 -2.19922 -20.5 8.5v23.9004h-23.9004v-20c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v20h-27.5996
c-5.80078 -25.5996 -18.7002 -49.9004 -38.6006 -69.7998c-56.2002 -56.2002 -147.399 -56.2002 -203.6 0s-56.2002 147.399 0 203.6s147.399 56.2002 203.6 0c19.9004 -19.8994 32.7998 -44.2002 38.6006 -69.7998h27.5996v20c0 6.59961 5.40039 12 12 12h40
c6.59961 0 12 -5.40039 12 -12v-20h23.7998v23.9004c0 10.6992 12.9004 16.0996 20.5 8.5zM200.6 135.4c31.2002 31.1992 31.2002 82 0 113.1c-31.1992 31.2002 -81.8994 31.2002 -113.1 0s-31.2002 -81.9004 0 -113.1c31.2002 -31.2002 81.9004 -31.2002 113.1 0z" />
    <glyph glyph-name="neuter" unicode="&#xf22c;" horiz-adv-x="288" 
d="M288 272c0 -68.5 -47.9004 -125.9 -112 -140.4v-151.6c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v151.6c-64.0996 14.5 -112 71.9004 -112 140.4c0 79.5 64.5 144 144 144s144 -64.5 144 -144zM144 192c44.0996 0 80 35.9004 80 80
s-35.9004 80 -80 80s-80 -35.9004 -80 -80s35.9004 -80 80 -80z" />
    <glyph glyph-name="genderless" unicode="&#xf22d;" horiz-adv-x="288" 
d="M144 272c-44.0996 0 -80 -35.9004 -80 -80s35.9004 -80 80 -80s80 35.9004 80 80s-35.9004 80 -80 80zM144 336c79.5 0 144 -64.5 144 -144s-64.5 -144 -144 -144s-144 64.5 -144 144s64.5 144 144 144z" />
    <glyph glyph-name="server" unicode="&#xf233;" 
d="M480 288h-448c-17.6729 0 -32 14.3271 -32 32v64c0 17.6729 14.3271 32 32 32h448c17.6729 0 32 -14.3271 32 -32v-64c0 -17.6729 -14.3271 -32 -32 -32zM432 376c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24zM368 376
c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24zM480 128h-448c-17.6729 0 -32 14.3271 -32 32v64c0 17.6729 14.3271 32 32 32h448c17.6729 0 32 -14.3271 32 -32v-64c0 -17.6729 -14.3271 -32 -32 -32zM432 216
c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24zM368 216c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24zM480 -32h-448c-17.6729 0 -32 14.3271 -32 32v64
c0 17.6729 14.3271 32 32 32h448c17.6729 0 32 -14.3271 32 -32v-64c0 -17.6729 -14.3271 -32 -32 -32zM432 56c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24zM368 56c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24
s24 10.7451 24 24s-10.7451 24 -24 24z" />
    <glyph glyph-name="user-plus" unicode="&#xf234;" horiz-adv-x="640" 
d="M624 240c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-64v-64c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v64h-64c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h64v64c0 8.7998 7.2002 16 16 16h32
c8.7998 0 16 -7.2002 16 -16v-64h64zM224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM313.6 160c74.2002 0 134.4 -60.2002 134.4 -134.4v-41.5996c0 -26.5 -21.5 -48 -48 -48h-352
c-26.5 0 -48 21.5 -48 48v41.5996c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992z" />
    <glyph glyph-name="user-times" unicode="&#xf235;" horiz-adv-x="640" 
d="M589.6 208l45.6006 -45.5996c6.2998 -6.30078 6.2998 -16.5 0 -22.8008l-22.7998 -22.7998c-6.30078 -6.2998 -16.5 -6.2998 -22.8008 0l-45.5996 45.6006l-45.5996 -45.6006c-6.30078 -6.2998 -16.5 -6.2998 -22.8008 0l-22.7998 22.7998
c-6.2998 6.30078 -6.2998 16.5 0 22.8008l45.6006 45.5996l-45.6006 45.5996c-6.2998 6.30078 -6.2998 16.5 0 22.8008l22.7998 22.7998c6.30078 6.2998 16.5 6.2998 22.8008 0l45.5996 -45.6006l45.5996 45.6006c6.30078 6.2998 16.5 6.2998 22.8008 0l22.7998 -22.7998
c6.2998 -6.30078 6.2998 -16.5 0 -22.8008zM224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM313.6 160c74.2002 0 134.4 -60.2002 134.4 -134.4v-41.5996c0 -26.5 -21.5 -48 -48 -48h-352
c-26.5 0 -48 21.5 -48 48v41.5996c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992z" />
    <glyph glyph-name="bed" unicode="&#xf236;" horiz-adv-x="640" 
d="M176 192c-44.1104 0 -80 35.8896 -80 80s35.8896 80 80 80s80 -35.8896 80 -80s-35.8896 -80 -80 -80zM528 320c61.8604 0 112 -50.1396 112 -112v-192c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v48h-512v-48c0 -8.83984 -7.16016 -16 -16 -16
h-32c-8.83984 0 -16 7.16016 -16 16v352c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-208h224v144c0 8.83984 7.16016 16 16 16h224z" />
    <glyph glyph-name="train" unicode="&#xf238;" horiz-adv-x="448" 
d="M448 352v-256c0 -51.8154 -61.624 -96 -130.022 -96l62.9805 -49.7207c5.94727 -4.69629 2.60352 -14.2793 -4.95801 -14.2793h-304c-7.57812 0 -10.8916 9.59375 -4.95703 14.2793l62.9795 49.7207c-68.2021 0 -130.022 44.0459 -130.022 96v256c0 53.0186 64 96 128 96
h192c65 0 128 -42.9814 128 -96zM400 216v112c0 13.2549 -10.7451 24 -24 24h-304c-13.2549 0 -24 -10.7451 -24 -24v-112c0 -13.2549 10.7451 -24 24 -24h304c13.2549 0 24 10.7451 24 24zM224 152c-30.9277 0 -56 -25.0723 -56 -56s25.0723 -56 56 -56s56 25.0723 56 56
s-25.0723 56 -56 56z" />
    <glyph glyph-name="subway" unicode="&#xf239;" horiz-adv-x="448" 
d="M448 352v-256c0 -51.8154 -61.624 -96 -130.022 -96l62.9805 -49.7207c5.94727 -4.69629 2.60352 -14.2793 -4.95801 -14.2793h-304c-7.57812 0 -10.8916 9.59375 -4.95703 14.2793l62.9795 49.7207c-68.2021 0 -130.022 44.0459 -130.022 96v256c0 53.0186 64 96 128 96
h192c65 0 128 -42.9814 128 -96zM200 216v112c0 13.2549 -10.7451 24 -24 24h-104c-13.2549 0 -24 -10.7451 -24 -24v-112c0 -13.2549 10.7451 -24 24 -24h104c13.2549 0 24 10.7451 24 24zM400 216v112c0 13.2549 -10.7451 24 -24 24h-104c-13.2549 0 -24 -10.7451 -24 -24
v-112c0 -13.2549 10.7451 -24 24 -24h104c13.2549 0 24 10.7451 24 24zM352 160c-26.5098 0 -48 -21.4902 -48 -48s21.4902 -48 48 -48s48 21.4902 48 48s-21.4902 48 -48 48zM96 160c-26.5098 0 -48 -21.4902 -48 -48s21.4902 -48 48 -48s48 21.4902 48 48
s-21.4902 48 -48 48z" />
    <glyph glyph-name="battery-full" unicode="&#xf240;" horiz-adv-x="640" 
d="M544 288h-480v-192h480v64h32v64h-32v64zM560 352c26.5098 0 48 -21.4902 48 -48v-16h8c13.2549 0 24 -10.7451 24 -24v-144c0 -13.2549 -10.7451 -24 -24 -24h-8v-16c0 -26.5098 -21.4902 -48 -48 -48h-512c-26.5098 0 -48 21.4902 -48 48v224
c0 26.5098 21.4902 48 48 48h512zM512 256v-128h-416v128h416z" />
    <glyph glyph-name="battery-three-quarters" unicode="&#xf241;" horiz-adv-x="640" 
d="M544 288h-480v-192h480v64h32v64h-32v64zM560 352c26.5098 0 48 -21.4902 48 -48v-16h8c13.2549 0 24 -10.7451 24 -24v-144c0 -13.2549 -10.7451 -24 -24 -24h-8v-16c0 -26.5098 -21.4902 -48 -48 -48h-512c-26.5098 0 -48 21.4902 -48 48v224
c0 26.5098 21.4902 48 48 48h512zM416 256v-128h-320v128h320z" />
    <glyph glyph-name="battery-half" unicode="&#xf242;" horiz-adv-x="640" 
d="M544 288h-480v-192h480v64h32v64h-32v64zM560 352c26.5098 0 48 -21.4902 48 -48v-16h8c13.2549 0 24 -10.7451 24 -24v-144c0 -13.2549 -10.7451 -24 -24 -24h-8v-16c0 -26.5098 -21.4902 -48 -48 -48h-512c-26.5098 0 -48 21.4902 -48 48v224
c0 26.5098 21.4902 48 48 48h512zM320 256v-128h-224v128h224z" />
    <glyph glyph-name="battery-quarter" unicode="&#xf243;" horiz-adv-x="640" 
d="M544 288h-480v-192h480v64h32v64h-32v64zM560 352c26.5098 0 48 -21.4902 48 -48v-16h8c13.2549 0 24 -10.7451 24 -24v-144c0 -13.2549 -10.7451 -24 -24 -24h-8v-16c0 -26.5098 -21.4902 -48 -48 -48h-512c-26.5098 0 -48 21.4902 -48 48v224
c0 26.5098 21.4902 48 48 48h512zM224 256v-128h-128v128h128z" />
    <glyph glyph-name="battery-empty" unicode="&#xf244;" horiz-adv-x="640" 
d="M544 288h-480v-192h480v64h32v64h-32v64zM560 352c26.5098 0 48 -21.4902 48 -48v-16h8c13.2549 0 24 -10.7451 24 -24v-144c0 -13.2549 -10.7451 -24 -24 -24h-8v-16c0 -26.5098 -21.4902 -48 -48 -48h-512c-26.5098 0 -48 21.4902 -48 48v224
c0 26.5098 21.4902 48 48 48h512z" />
    <glyph glyph-name="mouse-pointer" unicode="&#xf245;" horiz-adv-x="320" 
d="M302.189 118.874h-106.084l55.8301 -135.993c3.88965 -9.42773 -0.554688 -19.999 -9.44336 -23.999l-49.165 -21.4268c-9.16504 -4 -19.4434 0.571289 -23.332 9.71387l-53.0527 129.136l-86.6641 -89.1377c-11.5498 -11.877 -30.2783 -2.7207 -30.2783 12.8564v429.678
c0 16.3994 19.9209 24.3945 30.2773 12.8555l284.412 -292.542c11.4717 -11.1787 3.00684 -31.1406 -12.5 -31.1406z" />
    <glyph glyph-name="i-cursor" unicode="&#xf246;" horiz-adv-x="256" 
d="M256 395.952c0 -6.64648 -5.4043 -12.0098 -12.0498 -11.9922c-27.875 0.0712891 -83.9502 -3.20996 -83.9502 -48.1416v-111.818h36c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-36v-112c0 -44.9395 57.8887 -48.5527 83.8555 -48.2422
c6.68652 0.0800781 12.1445 -5.31055 12.1445 -11.998v-39.6445c0 -6.5957 -5.31836 -11.957 -11.9131 -12c-35.0654 -0.228516 -78.3525 0.62207 -116.087 37.8447c-38.4688 -37.9482 -83.6211 -38.3027 -116.158 -37.8936
c-6.56738 0.0820312 -11.8418 5.42969 -11.8418 11.999v39.9824c0 6.64648 5.4043 12.0098 12.0498 11.9932c27.875 -0.0722656 83.9502 3.02734 83.9502 47.959v112h-36c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h36v111.818
c0 44.9385 -57.8887 48.7344 -83.8555 48.4248c-6.68652 -0.0800781 -12.1445 5.31055 -12.1445 11.998v39.6445c0 6.5957 5.31836 11.957 11.9131 12c35.0654 0.228516 78.3525 -0.62207 116.087 -37.8447c38.4688 37.9482 83.6211 38.3027 116.158 37.8926
c6.56738 -0.0820312 11.8418 -5.42969 11.8418 -11.999v-39.9824z" />
    <glyph glyph-name="object-group" unicode="&#xf247;" 
d="M480 320v-288h20c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v20h-384v-20c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h20v320h-20
c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-20h384v20c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-20v-32zM96 172c0 -6.62695 5.37305 -12 12 -12h168
c6.62695 0 12 5.37305 12 12v136c0 6.62695 -5.37305 12 -12 12h-168c-6.62695 0 -12 -5.37305 -12 -12v-136zM416 76v136c0 6.62695 -5.37305 12 -12 12h-84v-72c0 -13.2549 -10.7451 -24 -24 -24h-72v-52c0 -6.62695 5.37305 -12 12 -12h168c6.62695 0 12 5.37305 12 12z
" />
    <glyph glyph-name="object-ungroup" unicode="&#xf248;" horiz-adv-x="576" 
d="M64 128v-26c0 -3.31152 -2.68848 -6 -6 -6h-52c-3.31152 0 -6 2.68848 -6 6v52c0 3.31152 2.68848 6 6 6h26v192h-26c-3.31152 0 -6 2.68848 -6 6v52c0 3.31152 2.68848 6 6 6h52c3.31152 0 6 -2.68848 6 -6v-26h288v26c0 3.31152 2.68848 6 6 6h52
c3.31152 0 6 -2.68848 6 -6v-52c0 -3.31152 -2.68848 -6 -6 -6h-26v-192h26c3.31152 0 6 -2.68848 6 -6v-52c0 -3.31152 -2.68848 -6 -6 -6h-52c-3.31152 0 -6 2.68848 -6 6v26h-288zM544 192v-160h26c3.31152 0 6 -2.68848 6 -6v-52c0 -3.31152 -2.68848 -6 -6 -6h-52
c-3.31152 0 -6 2.68848 -6 6v26h-288v-26c0 -3.31152 -2.68848 -6 -6 -6h-52c-3.31152 0 -6 2.68848 -6 6v52c0 3.31152 2.68848 6 6 6h26v72h136v-8c0 -13.2549 10.7451 -24 24 -24h64c13.2549 0 24 10.7451 24 24v64c0 13.2549 -10.7451 24 -24 24h-8v72h104v26
c0 3.31152 2.68848 6 6 6h52c3.31152 0 6 -2.68848 6 -6v-52c0 -3.31152 -2.68848 -6 -6 -6h-26v-32z" />
    <glyph glyph-name="sticky-note" unicode="&#xf249;" horiz-adv-x="448" 
d="M312 128c-13.2002 0 -24 -10.7998 -24 -24v-136h-264c-13.2998 0 -24 10.7002 -24 24v400c0 13.2998 10.7002 24 24 24h400c13.2998 0 24 -10.7002 24 -24v-264h-136zM441 73l-98 -98c-4.5 -4.5 -10.5996 -7 -17 -7h-6v128h128v-6.09961
c0 -6.30078 -2.5 -12.4004 -7 -16.9004z" />
    <glyph glyph-name="clone" unicode="&#xf24d;" 
d="M464 448c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h288zM176 32h208v-48c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v288
c0 26.5098 21.4902 48 48 48h48v-208c0 -44.1123 35.8877 -80 80 -80z" />
    <glyph glyph-name="balance-scale" unicode="&#xf24e;" horiz-adv-x="640" 
d="M256 112c0 -44.1797 -57.3096 -80 -128 -80s-128 35.8203 -128 80h0.0195312c0 15.6699 -2.0791 7.25 85.04 181.51c17.6807 35.3604 68.2207 35.29 85.8701 0c86.3906 -172.779 85.0508 -165.33 85.0508 -181.51h0.0195312zM128 272l-72 -144h144zM639.98 112
c0 -44.1797 -57.29 -80 -127.98 -80s-128 35.8203 -128 80h0.0195312c0 15.6699 -2.0791 7.25 85.04 181.51c17.6807 35.3604 68.2207 35.29 85.8701 0c86.3906 -172.779 85.0508 -165.33 85.0508 -181.51zM440 128h144l-72 144zM528 0c8.83984 0 16 -7.16016 16 -16v-32
c0 -8.83984 -7.16016 -16 -16 -16h-416c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h176v294.75c-23.5195 10.29 -41.1602 31.4902 -46.3896 57.25h-129.61c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h144.36
c14.5996 19.3203 37.5498 32 63.6396 32s49.04 -12.6797 63.6396 -32h144.36c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-129.61c-5.22949 -25.7695 -22.8799 -46.96 -46.3896 -57.25v-294.75h176z" />
    <glyph glyph-name="hourglass-start" unicode="&#xf251;" horiz-adv-x="384" 
d="M360 448c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24c0 -90.9648 -51.0156 -167.734 -120.842 -192c69.8262 -24.2656 120.842 -101.035 120.842 -192c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24h-336
c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24c0 90.9648 51.0156 167.734 120.842 192c-69.8262 24.2656 -120.842 101.035 -120.842 192c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24h336zM296 0c0 77.4834 -46.2139 144 -104 144
c-57.7959 0 -104 -66.542 -104 -144h208z" />
    <glyph glyph-name="hourglass-half" unicode="&#xf252;" horiz-adv-x="384" 
d="M360 448c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24c0 -90.9648 -51.0156 -167.734 -120.842 -192c69.8262 -24.2656 120.842 -101.035 120.842 -192c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24h-336
c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24c0 90.9648 51.0156 167.734 120.842 192c-69.8262 24.2656 -120.842 101.035 -120.842 192c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24h336zM284.922 64
c-17.0596 46.8037 -52.1006 80 -92.9219 80c-40.8242 0 -75.8613 -33.2031 -92.9199 -80h185.842zM284.941 320c7.07129 19.4131 11.0586 41.1953 11.0586 64h-208c0 -22.748 3.98828 -44.5479 11.0781 -64h185.863z" />
    <glyph glyph-name="hourglass-end" unicode="&#xf253;" horiz-adv-x="384" 
d="M360 384c0 -90.9648 -51.0156 -167.734 -120.842 -192c69.8262 -24.2656 120.842 -101.035 120.842 -192c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24h-336c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24
c0 90.9648 51.0156 167.734 120.842 192c-69.8262 24.2656 -120.842 101.035 -120.842 192c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24h336c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24zM192 240c57.4902 0 104 66.0547 104 144
h-208c0 -77.4824 46.2129 -144 104 -144z" />
    <glyph glyph-name="hourglass" unicode="&#xf254;" horiz-adv-x="384" 
d="M360 384c0 -90.9648 -51.0156 -167.734 -120.842 -192c69.8262 -24.2656 120.842 -101.035 120.842 -192c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24h-336c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24
c0 90.9648 51.0156 167.734 120.842 192c-69.8262 24.2656 -120.842 101.035 -120.842 192c-13.2549 0 -24 10.7451 -24 24v16c0 13.2549 10.7451 24 24 24h336c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24z" />
    <glyph glyph-name="hand-rock" unicode="&#xf255;" 
d="M464.8 368c26.2998 -0.400391 47.2002 -22.5 47.2002 -48.7998v-133.5c0 -12.7998 -2.5 -25.5 -7.5 -37.2998l-49 -116.301c-4.90039 -11.7998 -7.5 -24.5 -7.5 -37.2998v-2.89941c0 -13.3008 -10.7002 -24 -24 -24h-240c-13.2998 0 -24 10.6992 -24 24v6.69922
c0 13.7002 -5.90039 26.8008 -16.0996 35.9004l-111.7 99.2998c-20.5 18.2998 -32.2002 44.4004 -32.2002 71.7998v66.4004c0 26.7998 21.9004 48.4004 48.7998 48c26.2998 -0.5 47.2002 -22.5 47.2002 -48.7998v-48.1006l8 -7.09961v136
c0 26.7998 21.9004 48.4004 48.7998 48c26.2998 -0.5 47.2002 -22.5 47.2002 -48.7998v-31.2002h8v48c0 26.7998 21.9004 48.4004 48.7998 48c26.2998 -0.5 47.2002 -22.5 47.2002 -48.7998v-47.2002h8v32c0 26.7998 21.9004 48.4004 48.7998 48
c26.2998 -0.5 47.2002 -22.5 47.2002 -48.7998v-31.2002h8c0 26.7998 21.9004 48.4004 48.7998 48z" />
    <glyph glyph-name="hand-paper" unicode="&#xf256;" horiz-adv-x="448" 
d="M408.781 319.993c21.7305 -0.416016 39.2188 -18.1621 39.2178 -39.9932v-150.359c0 -12.2998 -2.28711 -32.001 -5.10449 -43.9746l-26.5078 -112.66c-5.10156 -21.6816 -24.4502 -37.0059 -46.7236 -37.0059h-197.59c-13.4922 0 -30.8838 8.85645 -38.8193 19.7676
l-125.601 172.705c-12.9932 17.8672 -9.04297 42.8838 8.82129 55.877c17.8682 12.9941 42.8848 9.04297 55.877 -8.82227l31.6484 -43.5195v235.992c0 21.8311 17.4883 39.5771 39.2188 39.9932c22.4248 0.428711 40.7812 -18.3535 40.7812 -40.7832v-175.21h8v216
c0 21.8311 17.4883 39.5771 39.2188 39.9932c22.4248 0.428711 40.7812 -18.3535 40.7812 -40.7832v-215.21h8v177c0 21.8311 17.4883 39.5771 39.2188 39.9932c22.4248 0.428711 40.7812 -18.3535 40.7812 -40.7832v-176.21h8v87.21
c0 22.4297 18.3564 41.2119 40.7812 40.7832z" />
    <glyph glyph-name="hand-scissors" unicode="&#xf257;" 
d="M216 8c0 22.0918 17.9092 40 40 40v8h-32c-22.0908 0 -40 17.9082 -40 40s17.9092 40 40 40h32v8h-208c-26.5098 0 -48 21.4902 -48 48s21.4902 48 48 48h208v13.5723l-177.551 69.7393c-24.6738 9.69434 -36.8184 37.5557 -27.125 62.2285
c9.69238 24.6738 37.5537 36.8174 62.2275 27.124l190.342 -74.7646l24.8721 31.0898c12.3066 15.3809 33.9785 19.5146 51.0811 9.74121l112 -64c11.125 -6.3584 20.1533 -21.917 20.1533 -34.7305v-240c0 -18.5615 -12.7695 -34.6855 -30.8379 -38.9365l-136 -32
c-2.49414 -0.586914 -6.59668 -1.06348 -9.1582 -1.06348h-0.00390625h-80c-22.0908 0 -40 17.9082 -40 40z" />
    <glyph glyph-name="hand-lizard" unicode="&#xf258;" horiz-adv-x="576" 
d="M384 -32v61.4609c0 7.28906 -4.99707 16.3711 -11.1543 20.2734l-111.748 70.8105c-6.49316 4.11523 -18.0029 7.45508 -25.6904 7.45508h-0.000976562h-147.406c-13.2549 0 -24 10.7451 -24 24v8c0 35.3457 28.6543 64 64 64h123.648
c11.7754 0 25.0088 8.82227 29.5371 19.6924l21.4102 51.3848c4.94141 11.8555 -3.77051 24.9229 -16.6143 24.9229h-229.981c-30.9277 0 -56 25.0723 -56 56v16c0 13.2549 10.7451 24 24 24h333.544c14.6035 0 32.7852 -10.0205 40.583 -22.3682l163.04 -258.146
c8.1875 -12.9639 14.833 -35.9297 14.833 -51.2627v-0.000976562v-116.222h-192z" />
    <glyph glyph-name="hand-spock" unicode="&#xf259;" 
d="M510.9 302.729l-68.2969 -286.823c-10.502 -44.1084 -55.8252 -79.9062 -101.166 -79.9062h-127.363c-29.7637 0 -71.5107 16.5547 -93.1855 36.9531l-108.298 101.92c-6.92383 6.53418 -12.542 19.5635 -12.542 29.083c0 22.0762 17.916 39.9922 39.9922 39.9922
c8.7334 0 20.9922 -4.84961 27.3623 -10.8252l60.5928 -57.0254v0c0 22.6758 -5.22852 58.7256 -11.6699 80.4668l-42.6885 144.075c-0.90918 3.06934 -1.64746 8.1582 -1.64746 11.3594c0 22.083 17.9229 40.0059 40.0059 40.0059
c16.4922 0 33.6768 -12.833 38.3594 -28.6465l37.1543 -125.395c0.975586 -3.29199 4.55469 -5.96484 7.98828 -5.96484c4.59863 0 8.33105 3.73242 8.33105 8.33105c0 0.582031 -0.117188 1.51172 -0.262695 2.0752l-50.3047 195.641
c-0.696289 2.70703 -1.26172 7.17285 -1.26172 9.96875c0 22.0781 17.918 39.9961 39.9961 39.9961c17.1152 0 34.4678 -13.4521 38.7344 -30.0273l56.0947 -218.158c1.11035 -4.31934 5.63184 -7.82617 10.0918 -7.82617c4.69238 0 9.26562 3.73047 10.208 8.32715
l37.6826 183.704c3.6416 17.6387 21.2139 31.9541 39.2246 31.9541c3.41309 0 8.82422 -0.835938 12.0781 -1.86426c19.8604 -6.2998 30.8623 -27.6738 26.6758 -48.085l-33.8389 -164.967c-0.0849609 -0.414062 -0.154297 -1.09375 -0.154297 -1.51758
c0 -4.16797 3.38281 -7.55176 7.55176 -7.55176c3.29297 0 6.58398 2.59961 7.34668 5.80273l29.3975 123.459c4.03906 16.9619 21.4688 30.7285 38.9053 30.7285c22.0771 0 39.9941 -17.917 39.9941 -39.9941c0 -2.59277 -0.487305 -6.74316 -1.08789 -9.26562z" />
    <glyph glyph-name="hand-pointer" unicode="&#xf25a;" horiz-adv-x="448" 
d="M448 208v-96c0 -3.08398 -0.356445 -6.15918 -1.06348 -9.16211l-32 -136c-4.25098 -18.0684 -20.375 -30.8379 -38.9365 -30.8379h-208c-11.2432 0 -25.7363 7.37988 -32.3496 16.4727l-127.997 176c-12.9932 17.8662 -9.04297 42.8838 8.82129 55.876
c17.8672 12.9941 42.8848 9.04297 55.877 -8.82227l31.6484 -43.5186v275.992c0 22.0908 17.9082 40 40 40s40 -17.9092 40 -40v-200h8v40c0 22.0908 17.9082 40 40 40s40 -17.9092 40 -40v-40h8v24c0 22.0908 17.9082 40 40 40s40 -17.9092 40 -40v-24h8
c0 22.0908 17.9082 40 40 40s40 -17.9092 40 -40zM192 128h-8v-96h8v96zM280 128h-8v-96h8v96zM368 128h-8v-96h8v96z" />
    <glyph glyph-name="hand-peace" unicode="&#xf25b;" horiz-adv-x="448" 
d="M408 232c22.0918 0 40 -17.9092 40 -40v-80v-0.00488281c0 -2.56152 -0.476562 -6.66406 -1.06348 -9.15723l-32 -136c-4.25098 -18.0684 -20.375 -30.8379 -38.9365 -30.8379h-240h-0.000976562c-12.8125 0 -28.3711 9.0293 -34.7275 20.1543l-64 112
c-9.77441 17.1025 -5.64062 38.7744 9.74023 51.0811l31.0898 24.8721l-74.7646 190.342c-9.69336 24.6738 2.4502 52.5342 27.124 62.2266c24.6729 9.69434 52.5332 -2.4502 62.2275 -27.125l69.7393 -177.551h13.5723v208c0 26.5098 21.4902 48 48 48s48 -21.4902 48 -48
v-208h8v32c0 22.0908 17.9082 40 40 40s40 -17.9092 40 -40v-32h8c0 22.0908 17.9082 40 40 40z" />
    <glyph glyph-name="trademark" unicode="&#xf25c;" horiz-adv-x="640" 
d="M260.6 352c6.60059 0 12 -5.40039 11.9004 -12v-43.0996c0 -6.60059 -5.40039 -12 -12 -12h-85.0996v-240.9c0 -6.59961 -5.40039 -12 -12 -12h-54.3008c-6.59961 0 -12 5.40039 -12 12v240.9h-85.0996c-6.59961 0 -12 5.39941 -12 12v43.0996
c0 6.59961 5.40039 12 12 12h248.6zM640 45c0.5 -7 -5 -13 -12 -13h-53.9004c-6.2998 0 -11.5996 4.90039 -12 11.2002l-9.09961 132.899c-1.7998 24.2002 0 53.7002 0 53.7002h-0.900391s-10.6992 -33.5996 -17.8994 -53.7002l-30.7002 -84.6992
c-1.7002 -4.7002 -6.2002 -7.90039 -11.2998 -7.90039h-50.2998c-5.10059 0 -9.60059 3.2002 -11.3008 7.90039l-30.6992 84.6992c-7.2002 20.1006 -17.9004 53.7002 -17.9004 53.7002h-0.900391s1.80078 -29.5 0 -53.7002l-9.09961 -132.899
c-0.5 -6.2998 -5.7002 -11.2002 -12 -11.2002h-54.5c-7.09961 0 -12.5996 6 -12 13l24.4004 296c0.599609 6.2002 5.7998 11 12 11h65.3994c5.10059 0 9.60059 -3.2998 11.2998 -8.09961l43.8008 -127.101c7.19922 -20.5996 16.0996 -52.7998 16.0996 -52.7998h0.900391
s8.89941 32.2002 16.0996 52.7998l43.7998 127.101c1.60059 4.7998 6.2002 8.09961 11.2998 8.09961h65.4004c6.2998 0 11.5 -4.7998 12 -11z" />
    <glyph glyph-name="registered" unicode="&#xf25d;" 
d="M285.363 240.525c0 -18.6006 -9.83105 -28.4316 -28.4316 -28.4316h-29.876v56.1406h23.3779c28.668 0 34.9297 -8.77344 34.9297 -27.709zM504 192c0 -136.967 -111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248s248 -111.033 248 -248z
M363.411 87.5859c-46.7295 84.8252 -43.2988 78.6357 -44.7021 80.9805c23.4316 15.1719 37.9453 42.9785 37.9453 74.4854c0 54.2441 -31.5 89.252 -105.498 89.252h-70.667c-13.2549 0 -24 -10.7451 -24 -24v-232.304c0 -13.2549 10.7451 -24 24 -24h22.5664
c13.2549 0 24 10.7451 24 24v71.6631h25.5566l44.1289 -82.9375c3.73828 -7.02441 13.2305 -12.7266 21.1875 -12.7266h24.4639c18.2617 0.000976562 29.8291 19.5908 21.0186 35.5869z" />
    <glyph glyph-name="tv" unicode="&#xf26c;" horiz-adv-x="640" 
d="M592 448c26.4961 0 48 -21.5039 48 -48v-320c0 -26.4961 -21.5039 -48 -48 -48h-240v-32h176c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h176v32h-240
c-26.4961 0 -48 21.5039 -48 48v320c0 26.4961 21.5039 48 48 48h544zM576 96v288h-512v-288h512z" />
    <glyph glyph-name="calendar-plus" unicode="&#xf271;" horiz-adv-x="448" 
d="M436 288h-424c-6.59961 0 -12 5.40039 -12 12v36c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48v-36
c0 -6.59961 -5.40039 -12 -12 -12zM12 256h424c6.59961 0 12 -5.40039 12 -12v-260c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v260c0 6.59961 5.40039 12 12 12zM328 116c0 6.59961 -5.40039 12 -12 12h-60v60c0 6.59961 -5.40039 12 -12 12h-40
c-6.59961 0 -12 -5.40039 -12 -12v-60h-60c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h60v-60c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12v60h60c6.59961 0 12 5.40039 12 12v40z" />
    <glyph glyph-name="calendar-minus" unicode="&#xf272;" horiz-adv-x="448" 
d="M436 288h-424c-6.59961 0 -12 5.40039 -12 12v36c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48v-36
c0 -6.59961 -5.40039 -12 -12 -12zM12 256h424c6.59961 0 12 -5.40039 12 -12v-260c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v260c0 6.59961 5.40039 12 12 12zM316 64c6.59961 0 12 5.40039 12 12v40c0 6.59961 -5.40039 12 -12 12h-184
c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h184z" />
    <glyph glyph-name="calendar-times" unicode="&#xf273;" horiz-adv-x="448" 
d="M436 288h-424c-6.59961 0 -12 5.40039 -12 12v36c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48v-36
c0 -6.59961 -5.40039 -12 -12 -12zM12 256h424c6.59961 0 12 -5.40039 12 -12v-260c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v260c0 6.59961 5.40039 12 12 12zM269.3 96l48.1006 48.0996c4.69922 4.7002 4.69922 12.3008 0 17l-28.3008 28.3008
c-4.69922 4.69922 -12.2998 4.69922 -17 0l-48.0996 -48.1006l-48.0996 48.1006c-4.7002 4.69922 -12.3008 4.69922 -17 0l-28.3008 -28.3008c-4.69922 -4.69922 -4.69922 -12.2998 0 -17l48.1006 -48.0996l-48.1006 -48.0996c-4.69922 -4.7002 -4.69922 -12.3008 0 -17
l28.3008 -28.3008c4.69922 -4.69922 12.2998 -4.69922 17 0l48.0996 48.1006l48.0996 -48.1006c4.7002 -4.69922 12.3008 -4.69922 17 0l28.3008 28.3008c4.69922 4.69922 4.69922 12.2998 0 17z" />
    <glyph glyph-name="calendar-check" unicode="&#xf274;" horiz-adv-x="448" 
d="M436 288h-424c-6.62695 0 -12 5.37305 -12 12v36c0 26.5098 21.4902 48 48 48h48v52c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-52h128v52c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-52h48c26.5098 0 48 -21.4902 48 -48v-36
c0 -6.62695 -5.37305 -12 -12 -12zM12 256h424c6.62695 0 12 -5.37305 12 -12v-260c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v260c0 6.62695 5.37305 12 12 12zM345.296 160.053l-28.1689 28.3984
c-4.66699 4.70508 -12.2646 4.73535 -16.9697 0.0673828l-106.037 -105.184l-45.9805 46.3516c-4.66699 4.70508 -12.2656 4.73633 -16.9707 0.0683594l-28.3965 -28.1699c-4.70508 -4.66699 -4.73633 -12.2646 -0.0683594 -16.9697l82.6006 -83.2695
c4.66699 -4.70508 12.2656 -4.73535 16.9707 -0.0673828l142.952 141.805c4.70508 4.66699 4.73633 12.2646 0.0683594 16.9697z" />
    <glyph glyph-name="industry" unicode="&#xf275;" 
d="M475.115 284.219c15.9541 10.1514 36.8848 -1.33105 36.8848 -20.248v-271.971c0 -13.2549 -10.7451 -24 -24 -24h-464c-13.2549 0 -24 10.7451 -24 24v400c0 13.2549 10.7451 24 24 24h112c13.2549 0 24 -10.7451 24 -24v-196.309l139.115 88.5273
c15.9541 10.1514 36.8848 -1.33203 36.8848 -20.248v-68.2793z" />
    <glyph glyph-name="map-pin" unicode="&#xf276;" horiz-adv-x="288" 
d="M112 131.06c10.3896 -1.91992 21.0596 -3.05957 32 -3.05957s21.6104 1.13965 32 3.05957v-156.689l-22.0098 -33.0205c-4.75 -7.11914 -15.2207 -7.11914 -19.9707 0l-22.0195 33.0205v156.689zM144 448c79.5303 0 144 -64.4697 144 -144s-64.4697 -144 -144 -144
s-144 64.4697 -144 144s64.4697 144 144 144zM144 372c6.62012 0 12 5.37988 12 12s-5.37988 12 -12 12c-50.7197 0 -92 -41.2695 -92 -92c0 -6.62012 5.37988 -12 12 -12s12 5.37988 12 12c0 37.5 30.5 68 68 68z" />
    <glyph glyph-name="map-signs" unicode="&#xf277;" 
d="M507.31 363.31c6.25 -6.25 6.25 -16.3691 0 -22.6299l-43.3096 -43.3096c-6.00977 -6 -14.1396 -9.37012 -22.6299 -9.37012h-385.37c-13.25 0 -24 10.75 -24 24v80c0 13.25 10.75 24 24 24h168v16c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-16
h153.37c8.49023 0 16.6299 -3.37012 22.6299 -9.37012zM224 -48v112h64v-112c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16zM456 224c13.25 0 24 -10.75 24 -24v-80c0 -13.25 -10.75 -24 -24 -24h-385.37
c-8.49023 0 -16.6299 3.37012 -22.6299 9.37012l-43.3096 43.3096c-6.25 6.25 -6.25 16.3799 0 22.6299l43.3096 43.3203c6.00977 6 14.1396 9.37012 22.6299 9.37012h153.37v32h64v-32h168z" />
    <glyph glyph-name="map" unicode="&#xf279;" horiz-adv-x="576" 
d="M0 330.34c0.00292969 11.959 9.0166 25.2686 20.1201 29.71l139.88 55.9502v-384l-138.06 -62.8398c-10.5107 -4.2002 -21.9404 3.54004 -21.9404 14.8594v346.32zM192 32v384l192 -64v-384zM554.06 414.84c10.5107 4.2002 21.9404 -3.54004 21.9404 -14.8594v-346.32
c0 -11.9609 -9.01367 -25.2705 -20.1201 -29.71l-139.88 -55.9502v384z" />
    <glyph glyph-name="comment-alt" unicode="&#xf27a;" 
d="M448 448c35.2998 0 64 -28.7002 64 -64v-288c0 -35.2998 -28.7002 -64 -64 -64h-144l-124.9 -93.7002c-7.89941 -5.7998 -19.0996 -0.0996094 -19.0996 9.7002v84h-96c-35.2998 0 -64 28.7002 -64 64v288c0 35.2998 28.7002 64 64 64h384z" />
    <glyph glyph-name="pause-circle" unicode="&#xf28b;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM240 112v160c0 8.7998 -7.2002 16 -16 16h-48c-8.7998 0 -16 -7.2002 -16 -16v-160c0 -8.7998 7.2002 -16 16 -16h48c8.7998 0 16 7.2002 16 16zM352 112v160
c0 8.7998 -7.2002 16 -16 16h-48c-8.7998 0 -16 -7.2002 -16 -16v-160c0 -8.7998 7.2002 -16 16 -16h48c8.7998 0 16 7.2002 16 16z" />
    <glyph glyph-name="stop-circle" unicode="&#xf28d;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM352 112v160c0 8.7998 -7.2002 16 -16 16h-160c-8.7998 0 -16 -7.2002 -16 -16v-160c0 -8.7998 7.2002 -16 16 -16h160c8.7998 0 16 7.2002 16 16z" />
    <glyph glyph-name="shopping-bag" unicode="&#xf290;" horiz-adv-x="448" 
d="M352 288h96v-272c0 -44.1826 -35.8174 -80 -80 -80h-288c-44.1826 0 -80 35.8174 -80 80v272h96v32c0 70.5801 57.4199 128 128 128c70.5791 0 128 -57.4199 128 -128v-32zM160 320v-32h128v32c0 35.29 -28.71 64 -64 64s-64 -28.71 -64 -64zM320 200
c13.2549 0 24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24zM128 200c13.2549 0 24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24z" />
    <glyph glyph-name="shopping-basket" unicode="&#xf291;" horiz-adv-x="576" 
d="M576 232v-16c0 -13.2549 -10.7451 -24 -24 -24h-8l-26.1133 -182.788c-3.37793 -23.6465 -23.6299 -41.2119 -47.5166 -41.2119h-364.74c-23.8867 0 -44.1387 17.5654 -47.5176 41.2119l-26.1123 182.788h-8c-13.2549 0 -24 10.7451 -24 24v16
c0 13.2549 10.7451 24 24 24h67.3408l106.78 146.821c10.3945 14.292 30.4072 17.4531 44.7012 7.05762c14.293 -10.3945 17.4531 -30.4082 7.05762 -44.7012l-79.4033 -109.178h235.047l-79.4033 109.179c-10.3955 14.292 -7.23438 34.3066 7.05859 44.7012
c14.291 10.3955 34.3066 7.23535 44.7012 -7.05762l106.779 -146.822h67.3408c13.2549 0 24 -10.7451 24 -24zM312 56v112c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24v-112c0 -13.2549 10.7451 -24 24 -24s24 10.7451 24 24zM424 56v112
c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24v-112c0 -13.2549 10.7451 -24 24 -24s24 10.7451 24 24zM200 56v112c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24v-112c0 -13.2549 10.7451 -24 24 -24s24 10.7451 24 24z" />
    <glyph glyph-name="hashtag" unicode="&#xf292;" horiz-adv-x="448" 
d="M440.667 265.891c-0.974609 -5.45898 -6.2666 -9.89062 -11.8135 -9.89062h-79.0957l-22.8564 -128h74.8096c7.4707 0 13.126 -6.75391 11.8135 -14.1094l-7.14355 -40c-0.974609 -5.45898 -6.2666 -9.89062 -11.8125 -9.89062h-79.0967l-15.377 -86.1094
c-0.974609 -5.45898 -6.2666 -9.89062 -11.8125 -9.89062h-40.6318c-7.47266 0 -13.127 6.75391 -11.8135 14.1094l14.623 81.8906h-98.6338l-15.3779 -86.1094c-0.974609 -5.45898 -6.26758 -9.89062 -11.8135 -9.89062h-40.6318
c-7.4707 0 -13.126 6.75391 -11.8125 14.1094l14.623 81.8906h-74.8105c-7.4707 0 -13.126 6.75391 -11.8125 14.1094l7.14258 40c0.974609 5.45898 6.2666 9.89062 11.8135 9.89062h79.0957l22.8564 128h-74.8096c-7.4707 0 -13.126 6.75391 -11.8135 14.1094l7.14355 40
c0.974609 5.45898 6.2666 9.89062 11.8125 9.89062h79.0967l15.377 86.1094c0.974609 5.45898 6.2666 9.89062 11.8125 9.89062h40.6318c7.47266 0 13.127 -6.75391 11.8135 -14.1094l-14.623 -81.8906h98.6348l15.377 86.1094
c0.974609 5.45898 6.26758 9.89062 11.8135 9.89062h40.6318c7.4707 0 13.126 -6.75391 11.8125 -14.1094l-14.623 -81.8906h74.8105c7.4707 0 13.126 -6.75391 11.8125 -14.1094zM261.889 128l22.8574 128h-98.6338l-22.8574 -128h98.6338z" />
    <glyph glyph-name="percent" unicode="&#xf295;" horiz-adv-x="448" 
d="M112 224c-61.9004 0 -112 50.0996 -112 112s50.0996 112 112 112s112 -50.0996 112 -112s-50.0996 -112 -112 -112zM112 384c-26.5 0 -48 -21.5 -48 -48s21.5 -48 48 -48s48 21.5 48 48s-21.5 48 -48 48zM336 160c61.9004 0 112 -50.0996 112 -112
s-50.0996 -112 -112 -112s-112 50.0996 -112 112s50.0996 112 112 112zM336 0c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM392.3 447.8l31.6006 0.100586c19.3994 0.0996094 30.8994 -21.8008 19.6992 -37.8008l-366.199 -463.699
c-3.94629 -5.62793 -12.7275 -10.1973 -19.6006 -10.2002l-33.3994 -0.100586c-19.5 0 -30.9004 21.9004 -19.7002 37.8008l368 463.699c4.5 6.40039 11.7998 10.2002 19.5996 10.2002z" />
    <glyph glyph-name="universal-access" unicode="&#xf29a;" 
d="M256 400c-114.971 0 -208 -93.0469 -208 -208c0 -114.971 93.0469 -208 208 -208c114.971 0 208 93.0469 208 208c0 114.971 -93.0469 208 -208 208zM256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248z
M256 384c106.039 0 192 -85.9609 192 -192s-85.9609 -192 -192 -192s-192 85.9609 -192 192s85.9609 192 192 192zM256 340c-19.8818 0 -36 -16.1182 -36 -36s16.1182 -36 36 -36s36 16.1182 36 36s-16.1182 36 -36 36zM373.741 241.977
c8.59961 2.03027 13.9258 10.6484 11.8965 19.249c-2.03027 8.60156 -10.6494 13.9258 -19.249 11.8955c-96.4912 -22.7832 -124.089 -22.8291 -220.774 0c-8.60254 2.03125 -17.2178 -3.29395 -19.249 -11.8955c-2.03125 -8.60059 3.29492 -17.2178 11.8945 -19.249
c28.7129 -6.7793 55.5127 -12.749 82.1416 -15.8066c-0.852539 -101.08 -12.3242 -123.08 -25.0371 -155.621c-3.61719 -9.25879 0.957031 -19.6982 10.2168 -23.3145c9.26465 -3.61914 19.7002 0.961914 23.3154 10.2168c8.72754 22.3408 17.0947 40.6982 22.2617 78.5488
h9.68555c5.1748 -37.9131 13.5566 -56.2412 22.2617 -78.5488c3.61621 -9.25977 14.0547 -13.834 23.3154 -10.2168c9.25977 3.61621 13.834 14.0547 10.2168 23.3145c-12.7305 32.5693 -24.1855 54.5986 -25.0371 155.621c26.6299 3.05859 53.4287 9.02832 82.1406 15.8066
z" />
    <glyph glyph-name="blind" unicode="&#xf29d;" horiz-adv-x="384" 
d="M380.15 -62.8369c-1.05664 -0.640625 -2.91602 -1.16113 -4.15137 -1.16113c-2.48438 0 -5.54785 1.72363 -6.83789 3.84766l-125.33 206.428c4.25684 1.68848 10.0615 5.9375 12.958 9.48438l126.048 -207.607c0.641602 -1.05664 1.16211 -2.91699 1.16211 -4.15234
c0 -2.48535 -1.72461 -5.5498 -3.84863 -6.83887zM142.803 133.662l62.8145 -153.537c6.69141 -16.3584 -1.14453 -35.042 -17.501 -41.7344c-16.3564 -6.69043 -35.04 1.1416 -41.7334 17.501l-36.1201 88.2852zM96 360c-24.3008 0 -44 19.6992 -44 44s19.6992 44 44 44
s44 -19.6992 44 -44s-19.6992 -44 -44 -44zM250.837 190.872c8.19336 -10.374 6.44434 -25.4922 -3.96582 -33.708c-9.33984 -7.37402 -24.5635 -7.61914 -33.708 3.96484l-102.3 129.217c-0.663086 0.836914 -2.06738 1.51562 -3.13477 1.51562
c-2.20801 0 -4 -1.79297 -4 -4.00098c0 -0.769531 0.387695 -1.88281 0.865234 -2.48535l31.4062 -39.8164v-107.196l-65.9258 -181.288c-6.04102 -16.6143 -24.4072 -25.1768 -41.0088 -19.1387c-16.6104 6.04004 -25.1787 24.4004 -19.1387 41.0098l54.0732 148.693
v140.698l-16 -20.5713v-79.7656c0 -13.0996 -10.4951 -23.748 -23.5361 -23.9961c-13.4531 -0.254883 -24.4639 11.0811 -24.4639 24.5361v95.6943l61.0557 78.5c4.72754 6.0791 11.7979 9.23633 18.9443 9.23926v0.0263672h32v-0.015625
c7.08691 -0.00390625 14.1035 -3.11719 18.8369 -9.1123z" />
    <glyph glyph-name="audio-description" unicode="&#xf29e;" 
d="M162.925 209.291l8.82227 -30.6553h-25.6064l9.04102 30.6523c1.27734 4.4209 2.65137 9.99414 3.87207 15.2451c1.2207 -5.25098 2.59473 -10.8232 3.87109 -15.2422zM329.399 241.39c28.6846 0 46.1748 -16.7656 46.1748 -49.0049
c0 -32.0977 -16.3994 -49.7754 -46.1748 -49.7754h-14.5234v98.7803h14.5234zM512 336v-288c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h416c26.5098 0 48 -21.4902 48 -48zM245.459 111.861l-57.0967 168
c-1.52734 4.49219 -6.61719 8.13867 -11.3623 8.13867h-35.8936c-4.74512 0 -9.83594 -3.64648 -11.3623 -8.13867l-57.0967 -168c-2.64453 -7.7832 3.1416 -15.8613 11.3613 -15.8613h29.1328c4.99219 0 10.1602 3.89453 11.5352 8.69336l8.57422 29.9053h51.3672
l8.79297 -29.9766c1.39648 -4.75977 6.55469 -8.62207 11.5146 -8.62207v0h29.1719c8.2207 0 14.0059 8.07812 11.3613 15.8613zM430.16 192.386c0 58.9775 -37.9189 95.6143 -98.96 95.6143h-57.3662c-6.62695 0 -12 -5.37305 -12 -12v-168c0 -6.62695 5.37305 -12 12 -12
h57.3662c61.041 0 98.96 36.9326 98.96 96.3857z" />
    <glyph glyph-name="phone-volume" unicode="&#xf2a0;" horiz-adv-x="384" 
d="M97.333 -58.9658c-129.874 129.874 -129.681 340.252 0 469.933c5.69824 5.69824 14.5273 6.63184 21.2627 2.42188l64.8174 -40.5127c4.45898 -2.78711 8.07812 -9.31641 8.07812 -14.5752c0 -1.82715 -0.550781 -4.68652 -1.22949 -6.38281l-32.4082 -81.0205
c-2.38477 -5.96484 -9.53418 -10.8047 -15.958 -10.8047c-0.473633 0 -1.23926 0.0380859 -1.71094 0.0849609l-55.8096 5.58008c-21.0508 -58.2607 -20.6123 -122.471 0 -179.515l55.8105 5.58105c0.47168 0.046875 1.2373 0.0849609 1.71094 0.0849609
c6.42383 0 13.5732 -4.83984 15.959 -10.8037l32.4072 -81.0225c0.678711 -1.69629 1.22949 -4.55566 1.22949 -6.38281c0 -5.25879 -3.61914 -11.7881 -8.07812 -14.5752l-64.8174 -40.5127c-2.30762 -1.44238 -6.38867 -2.6123 -9.10938 -2.6123
c-3.92969 0 -9.375 2.25488 -12.1543 5.03418zM247.126 352.527c11.832 -20.0469 11.832 -45.0088 0 -65.0557c-3.9502 -6.69238 -13.1084 -7.95898 -18.7178 -2.58105l-5.97559 5.72656c-3.91016 3.74805 -4.79297 9.62207 -2.26074 14.4102
c2.04883 3.87793 3.71094 10.5859 3.71094 14.9717c0 4.38672 -1.66211 11.0947 -3.71094 14.9727c-2.5332 4.78809 -1.64941 10.6621 2.26074 14.4102l5.97559 5.72656c5.60938 5.37793 14.7676 4.11133 18.7178 -2.58105zM338.913 443.714
c60.1396 -71.6035 60.0918 -175.882 0 -247.428c-4.47363 -5.32715 -12.5303 -5.74609 -17.5518 -0.933594l-5.79785 5.55762c-4.56055 4.37109 -4.97754 11.5293 -0.930664 16.3789c49.6875 59.5381 49.6465 145.933 0 205.422
c-4.04688 4.84961 -3.63086 12.0078 0.930664 16.3789l5.79785 5.55762c5.02148 4.8125 13.0781 4.39355 17.5518 -0.933594zM292.941 398.773c36.0498 -46.3223 36.1074 -111.149 0 -157.547c-4.39062 -5.64062 -12.6973 -6.25098 -17.8564 -1.30371l-5.81836 5.5791
c-4.39941 4.21875 -4.99805 11.0947 -1.28418 15.9307c26.5352 34.5645 26.5332 82.5723 0 117.135c-3.71387 4.83594 -3.11523 11.7109 1.28418 15.9307l5.81836 5.5791c5.15918 4.94727 13.4658 4.33691 17.8564 -1.30371z" />
    <glyph glyph-name="braille" unicode="&#xf2a1;" horiz-adv-x="640" 
d="M128 192c0 -35.3457 -28.6543 -64 -64 -64s-64 28.6543 -64 64s28.6543 64 64 64s64 -28.6543 64 -64zM64 64c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32zM64 416c35.3457 0 64 -28.6543 64 -64s-28.6543 -64 -64 -64
s-64 28.6543 -64 64s28.6543 64 64 64zM224 224c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32zM224 64c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32zM224 416
c35.3457 0 64 -28.6543 64 -64s-28.6543 -64 -64 -64s-64 28.6543 -64 64s28.6543 64 64 64zM448 224c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32zM448 64c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32
s-32 14.3271 -32 32s14.3271 32 32 32zM448 416c35.3457 0 64 -28.6543 64 -64s-28.6543 -64 -64 -64s-64 28.6543 -64 64s28.6543 64 64 64zM608 224c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32zM608 64
c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32zM608 384c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32z" />
    <glyph glyph-name="assistive-listening-systems" unicode="&#xf2a2;" 
d="M216 188c0 -15.4639 -12.5361 -28 -28 -28s-28 12.5361 -28 28c0 44.1123 35.8877 80 80 80s80 -35.8877 80 -80c0 -15.4639 -12.5361 -28 -28 -28s-28 12.5361 -28 28c0 13.2344 -10.7666 24 -24 24s-24 -10.7656 -24 -24zM240 364c97.0469 0 176 -78.9531 176 -176
c0 -95.9863 -71.4053 -109.798 -72 -144.226c-0.124023 -59.4463 -48.5254 -107.774 -108 -107.774c-15.4639 0 -28 12.5361 -28 28s12.5361 28 28 28c28.6729 0 52 23.3271 52 52l0.00292969 0.37793c0.988281 73.3115 71.9971 68.458 71.9971 143.622
c0 66.168 -53.832 120 -120 120s-120 -53.832 -120 -120c0 -15.4639 -12.5361 -28 -28 -28s-28 12.5361 -28 28c0 97.0469 78.9531 176 176 176zM160 128c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32zM32 0
c17.6729 0 32 -14.3271 32 -32s-14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32zM512 187.993c0 -15.4639 -12.5371 -28 -28.001 -28s-28 12.5361 -28 28c0 1.12695 -0.00683594 2.24512 -0.0332031 3.36328l-0.00292969 0.1875
c-1.4668 91.4404 -60.1709 172.599 -146.077 201.953c-14.6318 5.00098 -22.4414 20.917 -17.4414 35.5498c5.00098 14.6328 20.917 22.4404 35.5498 17.4424c108.163 -36.959 182.082 -139.015 183.961 -253.965c0.0332031 -1.50684 0.0449219 -3.01367 0.0449219 -4.53125
zM152.971 8.9707l-33.9404 -33.9404l-80 80l33.9404 33.9404z" />
    <glyph glyph-name="american-sign-language-interpreting" unicode="&#xf2a3;" horiz-adv-x="640" 
d="M290.547 258.961c-20.2949 10.1494 -44.1465 11.1992 -64.7393 3.88965c42.6064 0 71.208 -20.4746 85.5781 -50.5752c8.57617 -17.8994 -5.14746 -38.0713 -23.6172 -38.0713c18.4297 0 32.2119 -20.1357 23.6172 -38.0713
c-14.7246 -30.8457 -46.123 -50.8535 -80.2979 -50.8535c-0.556641 0 -94.4707 8.61426 -94.4707 8.61426l-66.4062 -33.3467c-9.38379 -4.69336 -19.8145 -0.378906 -23.8945 7.78125l-44.4561 88.9248c-4.16699 8.61523 -1.11133 18.8975 6.94531 23.6211l58.0723 33.0693
l41.1221 74.1953c6.38965 57.2451 34.7314 109.768 79.7432 146.727c11.3906 9.44824 28.3408 7.78125 37.5098 -3.61328c9.44629 -11.3936 7.78027 -28.0674 -3.6123 -37.5156c-12.5029 -10.5596 -23.6172 -22.5098 -32.5088 -35.5703
c21.6719 14.7285 46.6787 24.7324 74.1865 28.0674c14.7246 1.94434 28.0625 -8.33594 29.7295 -23.0654c1.94531 -14.7275 -8.33594 -28.0674 -23.0615 -29.7344c-16.1162 -1.94434 -31.1201 -7.50293 -44.1787 -15.2832c26.1143 5.71289 58.7119 3.1377 88.0791 -11.1152
c13.3359 -6.66895 18.8936 -22.5088 12.2246 -35.8486c-6.38965 -13.0596 -22.5039 -18.6162 -35.5645 -12.2256zM263.318 189.489c-6.1123 12.5049 -18.3379 20.2861 -32.2314 20.2861h-0.105469c-19.5732 0 -35.46 -15.8867 -35.46 -35.46
c0 -0.0302734 0 -0.0800781 0.000976562 -0.110352c0 -21.4277 17.8076 -35.5703 35.5645 -35.5703c13.8936 0 26.1191 7.78125 32.2314 20.2861c4.44531 9.44922 13.6133 15.0059 23.3389 15.2842c-9.72559 0.277344 -18.8936 5.83496 -23.3389 15.2842zM638.139 226.726
c4.16797 -8.61426 1.11133 -18.8965 -6.94531 -23.6201l-58.0713 -33.0693l-41.1221 -74.1963c-6.38965 -57.2451 -34.7314 -109.767 -79.7432 -146.726c-10.9316 -9.1123 -27.7988 -8.14453 -37.5098 3.6123c-9.44629 11.3945 -7.78027 28.0674 3.61328 37.5166
c12.5029 10.5586 23.6162 22.5088 32.5078 35.5703c-21.6719 -14.7295 -46.6787 -24.7324 -74.1865 -28.0674c-10.0205 -2.50586 -27.5518 5.64258 -29.7295 23.0645c-1.94531 14.7285 8.33594 28.0674 23.0615 29.7344c16.1162 1.94629 31.1201 7.50293 44.1787 15.2842
c-26.1143 -5.71289 -58.7119 -3.1377 -88.0791 11.1152c-13.3359 6.66895 -18.8936 22.5088 -12.2246 35.8477c6.38965 13.0605 22.5049 18.6191 35.5654 12.2266c20.2949 -10.1484 44.1465 -11.1982 64.7393 -3.88965c-42.6064 0 -71.208 20.4746 -85.5781 50.5762
c-8.57617 17.8984 5.14746 38.0713 23.6172 38.0713c-18.4297 0 -32.2109 20.1357 -23.6172 38.0703c14.0332 29.3965 44.0391 50.8877 81.9658 50.8545l92.8027 -8.61523l66.4062 33.3467c9.4082 4.7041 19.8281 0.354492 23.8936 -7.78027zM408.912 245.344
c-13.8936 0 -26.1191 -7.78027 -32.2314 -20.2861c-4.44531 -9.44824 -13.6133 -15.0059 -23.3389 -15.2832c9.72559 -0.27832 18.8936 -5.83594 23.3389 -15.2842c6.1123 -12.5049 18.3379 -20.2861 32.2314 -20.2861h0.105469c19.5732 0 35.46 15.8857 35.46 35.46
c0 0.0302734 0 0.0791016 -0.000976562 0.110352c0 21.4287 -17.8076 35.5693 -35.5645 35.5693z" />
    <glyph glyph-name="deaf" unicode="&#xf2a4;" 
d="M216 188c0 -15.4639 -12.5361 -28 -28 -28s-28 12.5361 -28 28c0 44.1123 35.8877 80 80 80s80 -35.8877 80 -80c0 -15.4639 -12.5361 -28 -28 -28s-28 12.5361 -28 28c0 13.2344 -10.7666 24 -24 24s-24 -10.7656 -24 -24zM240 364c97.0469 0 176 -78.9531 176 -176
c0 -95.9863 -71.4053 -109.798 -72 -144.226c-0.124023 -59.4463 -48.5254 -107.774 -108 -107.774c-15.4639 0 -28 12.5361 -28 28s12.5361 28 28 28c28.6729 0 52 23.3271 52 52l0.00292969 0.37793c0.988281 73.3115 71.9971 68.458 71.9971 143.622
c0 66.168 -53.832 120 -120 120s-120 -53.832 -120 -120c0 -15.4639 -12.5361 -28 -28 -28s-28 12.5361 -28 28c0 97.0469 78.9531 176 176 176zM508.485 416.201c4.68652 -4.68652 4.68652 -12.2842 0 -16.9727l-87.0303 -87.0283
c-4.68652 -4.68652 -12.2842 -4.68652 -16.9697 0l-28.2852 28.2852c-4.68652 4.68652 -4.68652 12.2842 0 16.9707l87.0283 87.0293c4.6875 4.68555 12.2842 4.68555 16.9717 0zM168.97 133.255l28.2861 -28.2842c4.68652 -4.68652 4.68652 -12.2852 0 -16.9707
l-148.484 -148.485c-4.6875 -4.68555 -12.2842 -4.68555 -16.9717 0l-28.2852 28.2842c-4.68555 4.6875 -4.68555 12.2852 0 16.9707l148.485 148.485c4.68555 4.68652 12.2842 4.68652 16.9697 0z" />
    <glyph glyph-name="sign-language" unicode="&#xf2a7;" horiz-adv-x="448" 
d="M91.4336 -35.9873c-0.306641 16.0186 13.1094 29.1289 29.1309 29.1289h62.293v5.71484h-125.864c-16.0215 0 -29.4375 13.1104 -29.1299 29.1289c0.296875 15.5234 12.9717 28.0146 28.5645 28.0146h126.43v5.71387h-153.722
c-16.0205 0 -29.4365 13.1113 -29.1299 29.1289c0.296875 15.5225 12.9727 28.0137 28.5664 28.0137h154.286v5.71387h-125.151c-16.0215 0 -29.4375 13.1104 -29.1299 29.1289c0.296875 15.5215 12.9727 28.0127 28.5654 28.0127h168.566l-31.085 22.6064
c-12.7617 9.28027 -15.583 27.1484 -6.30176 39.9121c9.28027 12.7607 27.1494 15.5811 39.9121 6.30176l123.36 -89.7148c7.79395 -5.66895 14.1201 -18.0908 14.1201 -27.7285v-141.136c0 -15.9102 -10.9463 -29.7305 -26.4326 -33.374l-80.4717 -18.9346
c-8.55176 -2.01172 -22.624 -3.64551 -31.4102 -3.64551h-107.4c-15.5928 0.000976562 -28.2686 12.4922 -28.5664 28.0137zM164.683 189.714l-36.3711 46.71c-9.5791 12.3027 -7.51172 29.9795 4.55371 39.75c12.4502 10.083 31.0371 7.55273 40.8799 -5.08789
l13.0039 -16.7002c-17.1426 -15.6484 -15.4092 -43.0244 3.16992 -56.5361l11.1875 -8.13574h-36.4238zM447.981 191.817c0.00976562 -0.311523 0.0175781 -0.81543 0.0175781 -1.12695c0 -9.24902 -5.92188 -21.3682 -13.2197 -27.0508l-61.0645 -47.5488v16.999
c0 13.4834 -6.51074 26.2686 -17.415 34.1982l-123.359 89.7139c-12.6357 9.18945 -29.1934 9.16113 -41.6904 0.904297l-52.0527 66.8486c-9.84375 12.6416 -7.74121 31.2822 5.08594 40.8809c12.4297 9.30273 30.0732 6.97559 39.6523 -5.32812l77.6758 -99.7539
l4.50879 3.51172l-94.4434 121.287c-9.84277 12.6416 -7.74121 31.2822 5.08594 40.8818c12.4307 9.30176 30.0732 6.97461 39.6533 -5.32812l94.79 -121.734l4.50879 3.51074l-76.8887 98.7451c-9.84277 12.6416 -7.74121 31.2822 5.08594 40.8809
c12.4297 9.30273 30.0732 6.97559 39.6533 -5.32715l103.562 -133.001l-1.26172 38.4141c-0.518555 15.7715 11.8457 28.9756 27.6191 29.4932c15.7705 0.517578 28.9746 -11.8477 29.4922 -27.6191z" />
    <glyph glyph-name="low-vision" unicode="&#xf2a8;" horiz-adv-x="576" 
d="M569.344 216.369c3.67383 -6.22461 6.65625 -17.1416 6.65625 -24.3691s-2.98242 -18.1455 -6.65723 -24.3701c-31.9746 -54.2607 -79.6484 -98.3232 -136.81 -126.301l0.00683594 -0.00878906l43.1201 -58.377c7.60156 -10.8594 4.95996 -25.8252 -5.90039 -33.4268
l-13.1133 -9.17773c-10.8594 -7.59863 -25.8223 -4.95801 -33.4238 5.90039l-251.836 356.544c-11.1797 -5.09375 -28.5518 -14.7539 -38.7764 -21.5635l189.979 -271.399c-9.52637 -1.00488 -25.0342 -1.82031 -34.6133 -1.82031
c-12.29 0 -32.1484 1.33984 -44.3262 2.99023l-40.6309 58.04h-0.00976562l-119.399 170.58c-8.64453 -9.25391 -21.3203 -25.3428 -28.2939 -35.9121l124.19 -177.417c-73.1172 25.4863 -134.358 76.0166 -172.858 141.349c-8.96484 15.2109 -8.76562 33.8643 0 48.7393
c0.0107422 0.0166016 0.0234375 0.0332031 0.0332031 0.0498047c33.5459 56.8984 82.7676 99.8506 136.79 126.242l-43.1309 58.3945c-7.60156 10.8604 -4.95996 25.8252 5.90039 33.4268l13.1143 9.17773c10.8584 7.59961 25.8213 4.95801 33.4229 -5.90039
l52.7705 -72.1689c26.3496 6.79004 53.9834 10.4092 82.4512 10.4092c119.81 0 224.96 -63.9492 281.344 -159.631zM390.026 102.06c21.1406 23.9658 33.9736 55.4365 33.9736 89.9404c0 75.1738 -60.8379 136 -136 136c-17.5117 0 -34.2422 -3.30566 -49.6084 -9.32324
l19.0684 -27.2363c25.9883 7.96289 54.7598 5.56836 79.5098 -7.68066h-0.0292969c-23.6504 0 -42.8203 -19.1699 -42.8203 -42.8193c0 -23.4717 18.9922 -42.8203 42.8203 -42.8203c23.6494 0 42.8193 19.1699 42.8193 42.8203v0.0292969
c18.9111 -35.3271 15.8818 -79.1123 -8.7998 -111.68z" />
    <glyph glyph-name="handshake" unicode="&#xf2b5;" horiz-adv-x="640" 
d="M434.7 384c8.5 0 16.7002 -3.40039 22.5996 -9.40039l54.6006 -54.5996v-193.5c-2.40039 2.7002 -5 5.2998 -7.90039 7.7002l-145.6 118.2l26.0996 23.8994c6.5 6 7 16.1006 1 22.6006c-5.90039 6.5 -16.0996 6.89941 -22.5996 1l-79.9004 -73.2002
c-0.0996094 -0.100586 -0.299805 -0.100586 -0.400391 -0.200195c-16.6992 -14.9004 -43.3994 -11.2002 -56.0996 2.7002c-14.2002 15.5 -14.5 40.3994 2.09961 56c0.100586 0.0996094 0.200195 0.299805 0.300781 0.399414l98.2998 90
c5.89941 5.40039 13.5996 8.40039 21.5996 8.40039h85.9004zM544 319.8h96v-255.899h-64c-17.7002 0 -32 14.2998 -32 32v223.899zM592 95.9004c8.7998 0 16 7.19922 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16zM0 64v255.8h96
v-223.8c0 -17.7002 -14.2998 -32 -32 -32h-64zM48 127.9c-8.7998 0 -16 -7.10059 -16 -16c0 -8.80078 7.2002 -16 16 -16s16 7.19922 16 16c0 8.7998 -7.2002 16 -16 16zM483.9 109.3c13.6992 -11.2002 15.7998 -31.2998 4.59961 -45.0996l-9.5 -11.7002
c-11.0996 -13.7998 -31.2998 -15.7998 -45 -4.7002l-5.40039 4.40039l-31.3994 -38.6006c-12.9004 -15.8994 -36.4004 -18.3994 -52.2998 -5.39941l-17.9004 15.5l-0.200195 -0.200195c-22.2998 -27.4004 -62.5996 -31.5996 -90 -9.2998l-90.5 81.8994h-18.2998v223.9
l54.7002 54.5996c6 6 14.0996 9.40039 22.5996 9.40039h83.7998l-81.7998 -74.9004c-29.2002 -26.7998 -31.2998 -72.2998 -4.39941 -101.699c26.5 -28.9004 72 -31.5 101.699 -4.40039l30 27.5z" />
    <glyph glyph-name="envelope-open" unicode="&#xf2b6;" 
d="M512 -16c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v263.276c0 12.8955 8.2373 29.8193 18.3867 37.7754c24.9131 19.5293 45.501 35.3652 164.2 121.512c16.8252 12.2666 50.21 41.7832 73.4131 41.4336
c23.1982 0.353516 56.5957 -29.1719 73.4131 -41.4326c118.687 -86.1377 139.303 -101.995 164.2 -121.513c10.1494 -7.95605 18.3867 -24.8799 18.3867 -37.7754v-263.276zM446.334 180.605c-2.5625 3.72754 -7.7002 4.59473 -11.3389 1.90625
c-22.8447 -16.873 -55.4619 -40.7051 -105.582 -77.0791c-16.8252 -12.2656 -50.21 -41.7803 -73.4131 -41.4297c-23.2109 -0.34375 -56.5586 29.1436 -73.4131 41.4297c-50.1143 36.3701 -82.7344 60.2041 -105.582 77.0791
c-3.63867 2.68848 -8.77637 1.82129 -11.3389 -1.90625l-9.07227 -13.1963c-0.777344 -1.13086 -1.4082 -3.16113 -1.4082 -4.5332c0 -2.22754 1.45508 -5.11035 3.24707 -6.43359c22.8877 -16.8994 55.4541 -40.6904 105.304 -76.8682
c20.2734 -14.7812 56.5234 -47.8135 92.2637 -47.5732c35.7236 -0.242188 71.9609 32.7715 92.2627 47.5732c49.8506 36.1787 82.418 59.9697 105.304 76.8682c1.79199 1.32324 3.24707 4.20605 3.24707 6.43359c0 1.37207 -0.630859 3.40234 -1.4082 4.5332z" />
    <glyph glyph-name="address-book" unicode="&#xf2b9;" horiz-adv-x="448" 
d="M436 288h-20v-64h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20v-64h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20v-48c0 -26.5 -21.5 -48 -48 -48h-320c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48
h320c26.5 0 48 -21.5 48 -48v-48h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM208 320c-35.2998 0 -64 -28.7002 -64 -64s28.7002 -64 64 -64s64 28.7002 64 64s-28.7002 64 -64 64zM320 83.2002v19.2002
c0 31.7998 -30.0996 57.5996 -67.2002 57.5996h-5c-12.2002 -5.09961 -25.7002 -8 -39.7998 -8s-27.5 2.90039 -39.7998 8h-5c-37.1006 0 -67.2002 -25.7998 -67.2002 -57.5996v-19.2002c0 -10.6006 10 -19.2002 22.4004 -19.2002h179.199
c12.4004 0 22.4004 8.59961 22.4004 19.2002z" />
    <glyph glyph-name="address-card" unicode="&#xf2bb;" horiz-adv-x="576" 
d="M528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM176 320c-35.2998 0 -64 -28.7002 -64 -64s28.7002 -64 64 -64s64 28.7002 64 64s-28.7002 64 -64 64zM288 83.2002v19.2002
c0 31.7998 -30.0996 57.5996 -67.2002 57.5996h-5c-12.2002 -5.09961 -25.7002 -8 -39.7998 -8s-27.5 2.90039 -39.7998 8h-5c-37.1006 0 -67.2002 -25.7998 -67.2002 -57.5996v-19.2002c0 -10.6006 10 -19.2002 22.4004 -19.2002h179.199
c12.4004 0 22.4004 8.59961 22.4004 19.2002zM512 136v16c0 4.40039 -3.59961 8 -8 8h-144c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8zM512 200v16c0 4.40039 -3.59961 8 -8 8h-144c-4.40039 0 -8 -3.59961 -8 -8v-16
c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8zM512 264v16c0 4.40039 -3.59961 8 -8 8h-144c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8z" />
    <glyph glyph-name="user-circle" unicode="&#xf2bd;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 344c-48.5996 0 -88 -39.4004 -88 -88s39.4004 -88 88 -88s88 39.4004 88 88s-39.4004 88 -88 88zM248 0c58.7002 0 111.3 26.5996 146.5 68.2002
c-18.7998 35.3994 -55.5996 59.7998 -98.5 59.7998c-2.40039 0 -4.7998 -0.400391 -7.09961 -1.09961c-12.9004 -4.2002 -26.6006 -6.90039 -40.9004 -6.90039s-27.9004 2.7002 -40.9004 6.90039c-2.2998 0.699219 -4.69922 1.09961 -7.09961 1.09961
c-42.9004 0 -79.7002 -24.4004 -98.5 -59.7998c35.2002 -41.6006 87.7998 -68.2002 146.5 -68.2002z" />
    <glyph glyph-name="id-badge" unicode="&#xf2c1;" horiz-adv-x="384" 
d="M336 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h288zM144 416c-8.7998 0 -16 -7.2002 -16 -16s7.2002 -16 16 -16h96c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16h-96zM192 288
c-35.2998 0 -64 -28.7002 -64 -64s28.7002 -64 64 -64s64 28.7002 64 64s-28.7002 64 -64 64zM304 51.2002v19.2002c0 31.7998 -30.0996 57.5996 -67.2002 57.5996h-5c-12.2002 -5.09961 -25.7002 -8 -39.7998 -8s-27.5 2.90039 -39.7998 8h-5
c-37.1006 0 -67.2002 -25.7998 -67.2002 -57.5996v-19.2002c0 -10.6006 10 -19.2002 22.4004 -19.2002h179.199c12.4004 0 22.4004 8.59961 22.4004 19.2002z" />
    <glyph glyph-name="id-card" unicode="&#xf2c2;" horiz-adv-x="576" 
d="M528 416c26.5 0 48 -21.5 48 -48v-16h-576v16c0 26.5 21.5 48 48 48h480zM0 16v304h576v-304c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48zM352 248v-16c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-144
c-4.40039 0 -8 -3.59961 -8 -8zM352 184v-16c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-144c-4.40039 0 -8 -3.59961 -8 -8zM352 120v-16c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8v16
c0 4.40039 -3.59961 8 -8 8h-144c-4.40039 0 -8 -3.59961 -8 -8zM176 256c-35.2998 0 -64 -28.7002 -64 -64s28.7002 -64 64 -64s64 28.7002 64 64s-28.7002 64 -64 64zM67.0996 51.7998c-3.19922 -9.7998 5.2002 -19.7998 15.6006 -19.7998h186.6
c10.4004 0 18.7998 9.90039 15.6006 19.7998c-8.40039 25.7002 -32.5 44.2002 -60.9004 44.2002h-8.2002c-12.2002 -5.09961 -25.7002 -8 -39.7998 -8s-27.5 2.90039 -39.7998 8h-8.2002c-28.4004 0 -52.5 -18.5 -60.9004 -44.2002z" />
    <glyph glyph-name="thermometer-full" unicode="&#xf2c7;" horiz-adv-x="256" 
d="M224 352v-203.347c19.9121 -22.5635 32 -52.1943 32 -84.6533c0 -70.6963 -57.3018 -128 -128 -128c-0.298828 0 -0.610352 0.000976562 -0.90918 0.00292969c-70.3018 0.488281 -127.448 58.3613 -127.089 128.664c0.164062 32.1973 12.2227 61.5771 31.998 83.9863
v203.347c0 53.0186 42.9814 96 96 96s96 -42.9814 96 -96zM128 -16c44.1123 0 80 35.8877 80 80c0 34.3379 -19.3701 52.1904 -32 66.502v221.498c0 26.4668 -21.5332 48 -48 48s-48 -21.5332 -48 -48v-221.498c-12.7334 -14.4277 -31.8262 -32.0996 -31.999 -66.0801
c-0.223633 -43.876 35.5635 -80.1162 79.4229 -80.4199zM192 64c0 -35.3457 -28.6543 -64 -64 -64s-64 28.6543 -64 64c0 23.6846 12.876 44.3486 32 55.417v232.583c0 17.6729 14.3271 32 32 32s32 -14.3271 32 -32v-232.583c19.124 -11.0684 32 -31.7324 32 -55.417z" />
    <glyph glyph-name="thermometer-three-quarters" unicode="&#xf2c8;" horiz-adv-x="256" 
d="M192 64c0 -35.3457 -28.6543 -64 -64 -64s-64 28.6543 -64 64c0 23.6846 12.876 44.3486 32 55.417v168.583c0 17.6729 14.3271 32 32 32s32 -14.3271 32 -32v-168.583c19.124 -11.0684 32 -31.7324 32 -55.417zM224 148.653c19.9121 -22.5635 32 -52.1943 32 -84.6533
c0 -70.6963 -57.3027 -128 -128 -128c-0.298828 0 -0.609375 0.000976562 -0.90918 0.00292969c-70.3018 0.488281 -127.448 58.3613 -127.089 128.664c0.164062 32.1982 12.2227 61.5781 31.998 83.9863v203.347c0 53.0186 42.9814 96 96 96s96 -42.9814 96 -96v-203.347z
M208 64c0 34.3389 -19.3701 52.1904 -32 66.502v221.498c0 26.4668 -21.5332 48 -48 48s-48 -21.5332 -48 -48v-221.498c-12.7324 -14.4277 -31.8252 -32.0996 -31.999 -66.0801c-0.223633 -43.876 35.5635 -80.1162 79.4229 -80.4199l0.576172 -0.00195312
c44.1123 0 80 35.8877 80 80z" />
    <glyph glyph-name="thermometer-half" unicode="&#xf2c9;" horiz-adv-x="256" 
d="M192 64c0 -35.3457 -28.6543 -64 -64 -64s-64 28.6543 -64 64c0 23.6846 12.876 44.3486 32 55.417v104.583c0 17.6729 14.3271 32 32 32s32 -14.3271 32 -32v-104.583c19.124 -11.0684 32 -31.7324 32 -55.417zM224 148.653c19.9121 -22.5635 32 -52.1943 32 -84.6533
c0 -70.6963 -57.3027 -128 -128 -128c-0.298828 0 -0.609375 0.000976562 -0.90918 0.00292969c-70.3018 0.488281 -127.448 58.3613 -127.089 128.664c0.164062 32.1982 12.2227 61.5781 31.998 83.9863v203.347c0 53.0186 42.9814 96 96 96s96 -42.9814 96 -96v-203.347z
M208 64c0 34.3389 -19.3701 52.1904 -32 66.502v221.498c0 26.4668 -21.5332 48 -48 48s-48 -21.5332 -48 -48v-221.498c-12.7324 -14.4277 -31.8252 -32.0996 -31.999 -66.0801c-0.223633 -43.876 35.5635 -80.1162 79.4229 -80.4199l0.576172 -0.00195312
c44.1123 0 80 35.8877 80 80z" />
    <glyph glyph-name="thermometer-quarter" unicode="&#xf2ca;" horiz-adv-x="256" 
d="M192 64c0 -35.3457 -28.6543 -64 -64 -64s-64 28.6543 -64 64c0 23.6846 12.876 44.3486 32 55.417v40.583c0 17.6729 14.3271 32 32 32s32 -14.3271 32 -32v-40.583c19.124 -11.0684 32 -31.7324 32 -55.417zM224 148.653c19.9121 -22.5635 32 -52.1943 32 -84.6533
c0 -70.6963 -57.3027 -128 -128 -128c-0.298828 0 -0.609375 0.000976562 -0.90918 0.00292969c-70.3018 0.488281 -127.448 58.3613 -127.089 128.664c0.164062 32.1982 12.2227 61.5781 31.998 83.9863v203.347c0 53.0186 42.9814 96 96 96s96 -42.9814 96 -96v-203.347z
M208 64c0 34.3389 -19.3701 52.1904 -32 66.502v221.498c0 26.4668 -21.5332 48 -48 48s-48 -21.5332 -48 -48v-221.498c-12.7324 -14.4277 -31.8252 -32.0996 -31.999 -66.0801c-0.223633 -43.876 35.5635 -80.1162 79.4229 -80.4199l0.576172 -0.00195312
c44.1123 0 80 35.8877 80 80z" />
    <glyph glyph-name="thermometer-empty" unicode="&#xf2cb;" horiz-adv-x="256" 
d="M192 64c0 -35.3457 -28.6543 -64 -64 -64s-64 28.6543 -64 64s28.6543 64 64 64s64 -28.6543 64 -64zM224 148.653c19.9121 -22.5635 32 -52.1943 32 -84.6533c0 -70.6963 -57.3027 -128 -128 -128c-0.298828 0 -0.609375 0.000976562 -0.90918 0.00292969
c-70.3018 0.488281 -127.448 58.3613 -127.089 128.664c0.164062 32.1982 12.2227 61.5781 31.998 83.9863v203.347c0 53.0186 42.9814 96 96 96s96 -42.9814 96 -96v-203.347zM208 64c0 34.3389 -19.3701 52.1904 -32 66.502v221.498c0 26.4668 -21.5332 48 -48 48
s-48 -21.5332 -48 -48v-221.498c-12.7324 -14.4277 -31.8252 -32.0996 -31.999 -66.0801c-0.223633 -43.876 35.5635 -80.1162 79.4229 -80.4199l0.576172 -0.00195312c44.1123 0 80 35.8877 80 80z" />
    <glyph glyph-name="shower" unicode="&#xf2cc;" 
d="M304 128c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM336 224c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM368 160c-8.83203 0 -16 7.16797 -16 16s7.16797 16 16 16
s16 -7.16797 16 -16s-7.16797 -16 -16 -16zM336 128c-8.83203 0 -16 7.16797 -16 16s7.16797 16 16 16s16 -7.16797 16 -16s-7.16797 -16 -16 -16zM304 192c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM432 224
c-8.83203 0 -16 7.16797 -16 16s7.16797 16 16 16s16 -7.16797 16 -16s-7.16797 -16 -16 -16zM384 208c0 8.83203 7.16797 16 16 16s16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16zM368 256c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16
s-16 7.16797 -16 16s7.16797 16 16 16zM464 224c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM496 256c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM432 192
c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM400 160c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM336 96c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16
s-16 7.16797 -16 16s7.16797 16 16 16zM304 64c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM368 128c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM389.65 346.35
c2.58691 -2.58691 4.6875 -7.65527 4.6875 -11.3145s-2.10059 -8.72852 -4.6875 -11.3154l-169.381 -169.37c-2.58691 -2.58691 -7.65527 -4.6875 -11.3145 -4.6875s-8.72852 2.10059 -11.3154 4.6875l-11.2998 11.3105c-2.58496 2.58594 -4.68262 7.65332 -4.68262 11.3096
c0 3.65723 2.09766 8.72363 4.68262 11.3105l5.66016 5.66992c-17.6602 17.9219 -31.9961 52.8887 -32 78.0498c0 19.2402 5.2998 37.0801 13.9297 52.8604l-10 10c-9.44434 9.47461 -27.9678 17.1641 -41.3457 17.1641c-2.10254 0 -5.5 -0.22168 -7.58398 -0.494141
c-30 -3.73047 -51 -31.7803 -51 -61.9307v-305.6c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v303.15c0 67.9395 55.4902 129.35 123.44 128.85c27.7246 -0.138672 66.1006 -16.1992 85.6592 -35.8496l10 -10
c15.8203 8.5498 33.6602 13.8496 52.9004 13.8496c25.1631 -0.000976562 60.1289 -14.3369 78.0498 -32l5.66992 5.66016c2.58691 2.58691 7.65625 4.6875 11.3154 4.6875s8.72754 -2.10059 11.3145 -4.6875z" />
    <glyph glyph-name="bath" unicode="&#xf2cd;" 
d="M32 64v48h448v-48c-0.0478516 -23.5742 -14.3848 -55.4229 -32 -71.0898v-40.9102c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v16h-256v-16c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v40.9102
c-17.6152 15.667 -31.9521 47.5156 -32 71.0898zM496 192c8.83203 0 16 -7.16797 16 -16v-16c0 -8.83203 -7.16797 -16 -16 -16h-480c-8.83203 0 -16 7.16797 -16 16v16c0 8.83203 7.16797 16 16 16h16v186.75v0.00585938c0 38.2256 31.0244 69.25 69.25 69.25
c15.835 0 37.7734 -9.08789 48.9697 -20.2861l19.2607 -19.2695c29.8994 13.1299 59.1094 7.60938 79.7295 -8.62012l0.169922 0.169922c2.58691 2.58496 7.65332 4.68262 11.3105 4.68262c3.65625 0 8.72266 -2.09766 11.3096 -4.68262l11.3096 -11.3096
c2.58789 -2.58691 4.68848 -7.65625 4.68848 -11.3154s-2.10059 -8.72852 -4.68848 -11.3154l-105.369 -105.369c-2.58691 -2.58789 -7.65625 -4.68848 -11.3154 -4.68848s-8.72852 2.10059 -11.3154 4.68848l-11.3096 11.3096
c-2.57617 2.58496 -4.66797 7.64551 -4.66797 11.2949s2.0918 8.70996 4.66797 11.2949l0.169922 0.169922c-16.2295 20.6201 -21.75 49.8506 -8.62012 79.7305l-19.2695 19.2598c-3.43652 3.42969 -10.165 6.21387 -15.0205 6.21387
c-11.71 0 -21.2344 -9.50391 -21.2598 -21.2139v-186.75h416z" />
    <glyph glyph-name="podcast" unicode="&#xf2ce;" horiz-adv-x="448" 
d="M267.429 -40.5635c-5.14258 -19.0098 -24.5703 -23.4365 -43.4287 -23.4365c-18.8574 0 -38.2861 4.42676 -43.4277 23.4365c-7.64551 28.4297 -20.5723 99.665 -20.5723 132.813c0 35.1562 31.1416 43.75 64 43.75s64 -8.59375 64 -43.75
c0 -32.9492 -12.8711 -104.179 -20.5713 -132.813zM156.867 159.446c2.6748 -2.61914 2.39941 -6.98535 -0.628906 -9.18555c-9.3125 -6.76465 -16.4609 -15.3418 -21.2354 -25.3623c-1.74219 -3.65723 -6.5 -4.6582 -9.45312 -1.8877
c-28.0176 26.2891 -45.5498 63.6279 -45.5498 104.989c0 80.7852 66.8691 146.247 148.163 143.941c76.1982 -2.16113 137.938 -64.1631 139.793 -140.369c1.04199 -42.7822 -16.6846 -81.5225 -45.5107 -108.565c-2.95215 -2.76855 -7.70801 -1.7627 -9.44922 1.8916
c-4.77441 10.0195 -11.9219 18.5977 -21.2344 25.3623c-3.02832 2.20117 -3.30273 6.56738 -0.62793 9.1875c17.8018 17.4355 28.8662 41.7246 28.8662 68.5518c0 54.1934 -45.1377 98.042 -99.793 95.9258c-49.7295 -1.9248 -90.0703 -42.1572 -92.124 -91.8809
c-1.17383 -28.4258 10.0908 -54.291 28.7842 -72.5986zM224 448c123.815 0 224 -100.205 224 -224c0 -90.1865 -52.7734 -165.727 -125.739 -201.407c-4.33203 -2.11914 -9.2666 1.54297 -8.53516 6.31055c2.55566 16.6416 4.625 33.1924 5.62402 47.2295
c48.4922 31.377 80.6504 85.9355 80.6504 147.867c0 97.2031 -79.207 176.253 -176.468 175.999c-96.2393 -0.250977 -174.938 -78.6621 -175.529 -174.899c-0.376953 -61.3311 30.7871 -115.541 78.1875 -147.347c1.52832 -1.02637 2.53125 -2.67578 2.67773 -4.51172
c1.06348 -13.3936 3.02344 -28.8271 5.40625 -44.3389c0.731445 -4.7666 -4.20215 -8.42871 -8.53516 -6.31055c-73.1377 35.7607 -125.739 111.416 -125.739 201.408c0 123.815 100.204 224 224 224zM224 288c35.3457 0 64 -28.6543 64 -64s-28.6543 -64 -64 -64
s-64 28.6543 -64 64s28.6543 64 64 64z" />
    <glyph glyph-name="window-maximize" unicode="&#xf2d0;" 
d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM448 256v84c0 6.59961 -5.40039 12 -12 12h-360c-6.59961 0 -12 -5.40039 -12 -12v-84h384z" />
    <glyph glyph-name="window-minimize" unicode="&#xf2d1;" 
d="M464 96c26.5 0 48 -21.5 48 -48v-32c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v32c0 26.5 21.5 48 48 48h416z" />
    <glyph glyph-name="window-restore" unicode="&#xf2d2;" 
d="M512 400v-288c0 -26.5 -21.5 -48 -48 -48h-48v208c0 44.0996 -35.9004 80 -80 80h-208v48c0 26.5 21.5 48 48 48h288c26.5 0 48 -21.5 48 -48zM384 272v-288c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h288
c26.5 0 48 -21.5 48 -48zM316 244c0 6.59961 -5.40039 12 -12 12h-228c-6.59961 0 -12 -5.40039 -12 -12v-52h252v52z" />
    <glyph glyph-name="microchip" unicode="&#xf2db;" 
d="M416 400v-416c0 -26.5098 -21.4902 -48 -48 -48h-224c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h224c26.5098 0 48 -21.4902 48 -48zM512 342v-12c0 -3.31152 -2.68848 -6 -6 -6h-18v-6c0 -3.31152 -2.68848 -6 -6 -6h-42v48h42
c3.31152 0 6 -2.68848 6 -6v-6h18c3.31152 0 6 -2.68848 6 -6zM512 246v-12c0 -3.31152 -2.68848 -6 -6 -6h-18v-6c0 -3.31152 -2.68848 -6 -6 -6h-42v48h42c3.31152 0 6 -2.68848 6 -6v-6h18c3.31152 0 6 -2.68848 6 -6zM512 150v-12c0 -3.31152 -2.68848 -6 -6 -6h-18v-6
c0 -3.31152 -2.68848 -6 -6 -6h-42v48h42c3.31152 0 6 -2.68848 6 -6v-6h18c3.31152 0 6 -2.68848 6 -6zM512 54v-12c0 -3.31152 -2.68848 -6 -6 -6h-18v-6c0 -3.31152 -2.68848 -6 -6 -6h-42v48h42c3.31152 0 6 -2.68848 6 -6v-6h18c3.31152 0 6 -2.68848 6 -6zM30 72h42
v-48h-42c-3.31152 0 -6 2.68848 -6 6v6h-18c-3.31152 0 -6 2.68848 -6 6v12c0 3.31152 2.68848 6 6 6h18v6c0 3.31152 2.68848 6 6 6zM30 168h42v-48h-42c-3.31152 0 -6 2.68848 -6 6v6h-18c-3.31152 0 -6 2.68848 -6 6v12c0 3.31152 2.68848 6 6 6h18v6
c0 3.31152 2.68848 6 6 6zM30 264h42v-48h-42c-3.31152 0 -6 2.68848 -6 6v6h-18c-3.31152 0 -6 2.68848 -6 6v12c0 3.31152 2.68848 6 6 6h18v6c0 3.31152 2.68848 6 6 6zM30 360h42v-48h-42c-3.31152 0 -6 2.68848 -6 6v6h-18c-3.31152 0 -6 2.68848 -6 6v12
c0 3.31152 2.68848 6 6 6h18v6c0 3.31152 2.68848 6 6 6z" />
    <glyph glyph-name="snowflake" unicode="&#xf2dc;" horiz-adv-x="448" 
d="M440.3 102.8c7.40039 -4.2002 9.90039 -13.7002 5.60059 -21l-15.5 -26.7998c-4.30078 -7.40039 -13.7002 -10 -21.1006 -5.7002l-33.7998 19.5l7 -26c2.2002 -8.2002 -2.7002 -16.7002 -10.9004 -18.8994l-14.8994 -4
c-8.2002 -2.2002 -16.7002 2.69922 -18.9004 10.8994l-19 70.7998l-62.7998 36.2002v-77.5l53.4004 -53.7002c6.19922 -6.19922 6.19922 -16.3994 0 -22.5996l-11.3008 -11.2998c-6.19922 -6.2002 -16.3994 -6.2002 -22.5996 0l-19.7002 19.7002v-40.4004
c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v40.2998l-19.7002 -19.7002c-6.19922 -6.19922 -16.3994 -6.19922 -22.5996 0l-11.2998 11.3008c-6.2998 6.19922 -6.2998 16.3994 0 22.5996l53.7002 53.7002v77.5l-62.8008 -36.2002l-19 -70.7998
c-2.19922 -8.2002 -10.6992 -13.1006 -18.8994 -10.9004l-14.9004 4c-8.2002 2.2002 -13.0996 10.7002 -10.8994 18.9004l7 26l-33.8008 -19.5c-7.39941 -4.2002 -16.7998 -1.7002 -21.0996 5.7002l-15.5 26.7998c-4.2002 7.39941 -1.7002 16.7998 5.7002 21.0996
l33.7998 19.6006l-26 7c-8.2002 2.19922 -13.0996 10.6992 -10.9004 18.8994l4 14.9004c2.2002 8.2002 10.7002 13.0996 18.9004 10.8994l70.7998 -19l63.7998 36.9004l-63.7998 36.9004l-70.7998 -19c-8.2002 -2.2002 -16.7002 2.69922 -18.9004 10.8994l-4 14.9004
c-2.19922 8.2998 2.7002 16.7998 11 19l26 7l-33.7998 19.5c-7.39941 4.2998 -10 13.7002 -5.7002 21.0996l15.5 26.7002c4.30078 7.40039 13.7002 10 21.1006 5.7002l33.7998 -19.5l-7 26c-2.2002 8.2002 2.7002 16.7002 10.9004 18.8994l14.8994 4
c8.2002 2.2002 16.7002 -2.69922 18.9004 -10.8994l19 -70.7998l62.7998 -36.2002v77.5l-53.7002 53.7002c-6.2998 6.19922 -6.2998 16.3994 0 22.5996l11.4004 11.2998c6.2002 6.2002 16.3994 6.2002 22.5996 0l19.7002 -19.7002v40.4004c0 8.7998 7.2002 16 16 16h32
c8.7998 0 16 -7.2002 16 -16v-40.4004l19.7998 19.7002c6.2002 6.2002 16.4004 6.2002 22.6006 0l11.2998 -11.2998c6.2002 -6.2002 6.2002 -16.4004 0 -22.5996l-53.7002 -53.7002v-77.5l62.7998 36.2002l19 70.7998c2.2002 8.2002 10.7002 13.0996 18.9004 10.8994
l14.8994 -4c8.2002 -2.19922 13.1006 -10.6992 10.9004 -18.8994l-7 -26l33.7998 19.5c7.40039 4.2002 16.7998 1.7002 21.1006 -5.7002l15.5 -26.7998c4.19922 -7.40039 1.69922 -16.7998 -5.7002 -21.1006l-33.7998 -19.5l26 -7
c8.19922 -2.19922 13.0996 -10.6992 10.8994 -18.8994l-4 -14.9004c-2.2002 -8.2002 -10.7002 -13.0996 -18.8994 -10.8994l-70.8008 19l-63.7998 -36.9004l63.9004 -37l70.7998 19c8.2002 2.2002 16.7002 -2.7002 18.9004 -10.9004l4 -14.8994
c2.19922 -8.2002 -2.7002 -16.7002 -10.9004 -18.9004l-26 -7z" />
    <glyph glyph-name="utensil-spoon" unicode="&#xf2e5;" 
d="M480.1 416.1c55.1006 -55 34.5 -164.899 -28.5 -227.8c-49.2998 -49.2998 -110 -55.0996 -160.399 -28.7998l-192.4 -214.4c-10.3994 -11.5996 -28.5 -12.0996 -39.5 -1.09961l-51.2998 51.2998c-11.0996 11 -10.5996 29 1 39.5l214.5 192.4
c-26.2998 50.3994 -20.5 111.1 28.7998 160.399c62.9004 63 172.8 83.6006 227.8 28.5z" />
    <glyph glyph-name="utensils" unicode="&#xf2e7;" horiz-adv-x="416" 
d="M207.9 432.8c0.799805 -4.7002 16.0996 -94.5 16.0996 -128.8c0 -52.2998 -27.7998 -89.5996 -68.9004 -104.6l12.9004 -238.101c0.700195 -13.7002 -10.2002 -25.2998 -24 -25.2998h-64c-13.7002 0 -24.7002 11.5 -24 25.2998l12.9004 238.101
c-41.2002 15 -68.9004 52.3994 -68.9004 104.6c0 34.4004 15.2998 124.1 16.0996 128.8c3.2002 20.2998 45.3008 20.6006 47.9004 -1.09961v-141.2c1.2998 -3.40039 15.0996 -3.2002 16 0c1.40039 25.2998 7.90039 139.2 8 141.8c3.2998 20.7998 44.7002 20.7998 47.9004 0
c0.199219 -2.7002 6.59961 -116.5 8 -141.8c0.899414 -3.2002 14.7998 -3.40039 16 0v141.2c2.59961 21.5996 44.7998 21.3994 48 1.09961zM327.1 147.1c-156.5 122.4 -17.5996 300.9 64.9004 300.9c13.2998 0 24 -10.7998 24 -24v-464c0 -13.2998 -10.7002 -24 -24 -24h-56
c-14 0 -25.0996 12 -23.9004 26z" />
    <glyph glyph-name="undo-alt" unicode="&#xf2ea;" 
d="M255.545 440c136.809 0.245117 248.456 -111.193 248.455 -248.002c-0.000976562 -136.965 -111.034 -247.998 -248 -247.998c-63.9258 0 -122.202 24.1865 -166.178 63.9082c-5.11328 4.61816 -5.35449 12.5605 -0.482422 17.4326l39.6621 39.6621
c4.46191 4.46094 11.625 4.71387 16.3682 0.552734c30.6328 -26.8779 69.5029 -41.5557 110.63 -41.5557c93.8164 0 167.236 75.9912 167.994 166.552c0.798828 95.4648 -77.0859 170.24 -169.484 169.442c-42.4287 -0.366211 -82.3662 -16.374 -113.229 -45.2734
l41.75 -41.75c15.1191 -15.1201 4.41113 -40.9707 -16.9717 -40.9707h-134.059c-13.2549 0 -24 10.7451 -24 24v134.059c0 21.3828 25.8506 32.0908 40.9707 16.9707l35.7139 -35.7139c44.4229 42.4512 104.592 68.5654 170.86 68.6846z" />
    <glyph glyph-name="trash-alt" unicode="&#xf2ed;" horiz-adv-x="448" 
d="M32 -16v336h384v-336c0 -26.4961 -21.5039 -48 -48 -48h-288c-26.4961 0 -48 21.5039 -48 48zM304 240v-224c0 -8.83203 7.16797 -16 16 -16s16 7.16797 16 16v224c0 8.83203 -7.16797 16 -16 16s-16 -7.16797 -16 -16zM208 240v-224c0 -8.83203 7.16797 -16 16 -16
s16 7.16797 16 16v224c0 8.83203 -7.16797 16 -16 16s-16 -7.16797 -16 -16zM112 240v-224c0 -8.83203 7.16797 -16 16 -16s16 7.16797 16 16v224c0 8.83203 -7.16797 16 -16 16s-16 -7.16797 -16 -16zM432 416c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h120l9.40039 18.7002c3.58984 7.3418 13.1357 13.2998 21.3086 13.2998h0.0908203h114.3h0.0175781c8.20215 0 17.8262 -5.95801 21.4824 -13.2998l9.40039 -18.7002
h120z" />
    <glyph glyph-name="sync-alt" unicode="&#xf2f1;" 
d="M370.72 314.72c-31.2617 29.2725 -71.832 45.3184 -114.872 45.2803c-77.458 -0.0683594 -144.328 -53.1777 -162.791 -126.85c-1.34375 -5.36328 -6.12207 -9.15039 -11.6504 -9.15039h-57.3037c-7.49707 0 -13.1934 6.80664 -11.8066 14.1758
c21.6367 114.9 122.518 201.824 243.704 201.824c66.4482 0 126.791 -26.1357 171.315 -68.6846l35.7148 35.7148c15.1191 15.1191 40.9697 4.41113 40.9697 -16.9717v-134.059c0 -13.2549 -10.7451 -24 -24 -24h-134.059c-21.3828 0 -32.0908 25.8506 -16.9717 40.9707z
M32 152h134.059c21.3828 0 32.0908 -25.8506 16.9717 -40.9707l-41.75 -41.75c31.2617 -29.2734 71.835 -45.3193 114.876 -45.2803c77.418 0.0703125 144.314 53.1436 162.787 126.849c1.34375 5.36328 6.12207 9.15039 11.6504 9.15039h57.3047
c7.49805 0 13.1934 -6.80664 11.8066 -14.1758c-21.6377 -114.898 -122.519 -201.822 -243.705 -201.822c-66.4482 0 -126.791 26.1357 -171.315 68.6846l-35.7148 -35.7148c-15.1191 -15.1191 -40.9697 -4.41113 -40.9697 16.9717v134.059c0 13.2549 10.7451 24 24 24z" />
    <glyph glyph-name="stopwatch" unicode="&#xf2f2;" horiz-adv-x="448" 
d="M432 144c0 -114.9 -93.0996 -208 -208 -208s-208 93.0996 -208 208c0 104 76.2998 190.2 176 205.5v34.5h-28c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h120c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-28v-34.5
c37.5 -5.7998 71.7002 -21.5996 99.7002 -44.5996l27.5 27.5c4.7002 4.69922 12.2998 4.69922 17 0l28.2998 -28.3008c4.7002 -4.69922 4.7002 -12.2998 0 -17l-29.4004 -29.3994l-0.599609 -0.600586c21.2002 -32.3994 33.5 -71.2998 33.5 -113.1zM256 108v151.5
c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-151.5c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12z" />
    <glyph glyph-name="sign-out-alt" unicode="&#xf2f5;" 
d="M497 175l-168 -168c-15 -15 -41 -4.5 -41 17v96h-136c-13.2998 0 -24 10.7002 -24 24v96c0 13.2998 10.7002 24 24 24h136v96c0 21.4004 25.9004 32 41 17l168 -168c9.2998 -9.40039 9.2998 -24.5996 0 -34zM192 12c0 -6.59961 -5.40039 -12 -12 -12h-84
c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h84c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-84c-17.7002 0 -32 -14.2998 -32 -32v-192c0 -17.7002 14.2998 -32 32 -32h84c6.59961 0 12 -5.40039 12 -12v-40z" />
    <glyph glyph-name="sign-in-alt" unicode="&#xf2f6;" 
d="M416 0h-84c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h84c17.7002 0 32 14.2998 32 32v192c0 17.7002 -14.2998 32 -32 32h-84c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h84c53 0 96 -43 96 -96v-192c0 -53 -43 -96 -96 -96z
M369 201c9.2998 -9.40039 9.2998 -24.5996 0 -34l-168 -168c-15 -15 -41 -4.5 -41 17v96h-136c-13.2998 0 -24 10.7002 -24 24v96c0 13.2998 10.7002 24 24 24h136v96c0 21.5 26 32 41 17z" />
    <glyph glyph-name="redo-alt" unicode="&#xf2f9;" 
d="M256.455 440c66.2686 -0.119141 126.437 -26.2334 170.859 -68.6846l35.7148 35.7148c15.1201 15.1191 40.9707 4.41113 40.9707 -16.9717v-134.059c0 -13.2549 -10.7451 -24 -24 -24h-134.059c-21.3828 0 -32.0908 25.8506 -16.9717 40.9707l41.75 41.75
c-30.8633 28.8994 -70.8008 44.9072 -113.229 45.2734c-92.3984 0.797852 -170.283 -73.9775 -169.484 -169.442c0.757812 -90.5605 74.1777 -166.552 167.994 -166.552c41.127 0 79.9971 14.6777 110.629 41.5557c4.74316 4.16113 11.9062 3.9082 16.3682 -0.552734
l39.6621 -39.6621c4.87207 -4.87207 4.63086 -12.8145 -0.482422 -17.4326c-43.9746 -39.7217 -102.251 -63.9082 -166.177 -63.9082c-136.966 0 -247.999 111.033 -248 247.998c-0.000976562 136.809 111.646 248.247 248.455 248.002z" />
    <glyph glyph-name="poo" unicode="&#xf2fe;" 
d="M451.4 78.9004c34.2998 -5.5 60.5996 -35 60.5996 -70.9004c0 -39.7998 -32.2002 -72 -72 -72h-368c-39.7998 0 -72 32.2002 -72 72c0 35.9004 26.2998 65.4004 60.5996 70.9004c-17.2998 13.0996 -28.5996 33.6992 -28.5996 57.0996c0 39.7998 32.2002 72 72 72h14.0996
c-13.3994 11.7002 -22.0996 28.7998 -22.0996 48c0 35.2998 28.7002 64 64 64h16c44.2002 0 80 35.7998 80 80c0 17.4004 -5.7002 33.4004 -15.0996 46.5c4.89941 0.799805 9.89941 1.5 15.0996 1.5c53 0 96 -43 96 -96c0 -11.2998 -2.2998 -21.9004 -5.90039 -32h5.90039
c35.2998 0 64 -28.7002 64 -64c0 -19.2002 -8.7002 -36.2998 -22.0996 -48h14.0996c39.7998 0 72 -32.2002 72 -72c0 -23.4004 -11.2998 -44 -28.5996 -57.0996zM192 192c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32z
M351.5 53c2 5.2998 -2 11 -7.7998 11h-175.4c-5.7998 0 -9.7998 -5.7002 -7.7998 -11c10.5 -27.9004 58.5 -53 95.5 -53s85 25.0996 95.5 53zM320 128c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="images" unicode="&#xf302;" horiz-adv-x="576" 
d="M480 32v-16c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256c0 26.5098 21.4902 48 48 48h16v-208c0 -44.1123 35.8877 -80 80 -80h336zM576 112c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256
c0 26.5098 21.4902 48 48 48h384c26.5098 0 48 -21.4902 48 -48v-256zM256 320c0 26.5098 -21.4902 48 -48 48s-48 -21.4902 -48 -48s21.4902 -48 48 -48s48 21.4902 48 48zM160 176v-48h352v112l-87.5137 87.5146c-4.6875 4.68652 -12.2852 4.68652 -16.9717 0
l-135.515 -135.515l-39.5137 39.5146c-4.6875 4.68652 -12.2852 4.68652 -16.9717 0z" />
    <glyph glyph-name="pencil-alt" unicode="&#xf303;" 
d="M497.9 305.9l-46.1006 -46.1006c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-111 111c-4.7002 4.7002 -4.7002 12.2998 0 17l46.1006 46.1006c18.6992 18.6992 49.0996 18.6992 67.8994 0l60.1006 -60.1006c18.7998 -18.7002 18.7998 -49.0996 0 -67.8994zM284.2 348.2
c4.7002 4.7002 12.2998 4.7002 17.0996 0l111 -111c4.7002 -4.7002 4.7002 -12.2998 0 -17l-262.6 -262.601l-121.5 -21.2998c-16.4004 -2.7998 -30.7002 11.4004 -27.7998 27.7998l21.1992 121.5zM124.1 108.1c5.5 -5.5 14.3008 -5.5 19.8008 0l154 154
c5.5 5.5 5.5 14.3008 0 19.8008s-14.3008 5.5 -19.8008 0l-154 -154c-5.5 -5.5 -5.5 -14.3008 0 -19.8008zM88 24v48h-36.2998l-11.2998 -64.5l31.0996 -31.0996l64.5 11.2998v36.2998h-48z" />
    <glyph glyph-name="pen" unicode="&#xf304;" 
d="M290.74 354.76l128.02 -128.02l-277.99 -277.99l-114.14 -12.5996c-15.2803 -1.69043 -28.1895 11.2295 -26.4902 26.5098l12.7002 114.22zM497.94 373.82c18.75 -18.75 18.75 -49.1504 0 -67.9102l-56.5508 -56.5498l-128.02 128.02l56.5498 56.5498
c18.75 18.75 49.1602 18.75 67.9102 0z" />
    <glyph glyph-name="pen-alt" unicode="&#xf305;" 
d="M497.94 373.83c18.75 -18.7598 18.75 -49.1602 0 -67.9102l-56.5508 -56.5498l-128.02 128.02l56.5498 56.5508c18.75 18.75 49.1602 18.75 67.9102 0zM251.14 394.36l84.8506 -84.8506l82.7695 -82.7695l-196.79 -196.79
c-44.8223 -44.8203 -132.335 -86.8428 -195.34 -93.7998c-15.2803 -1.69043 -28.1895 11.2295 -26.4902 26.5098l0.0302734 0.229492c7.00195 62.9189 49.0156 150.315 93.7803 195.08l151.56 151.55l-22.6299 22.6201l-101.82 -101.819
c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-22.6299 22.6299c-6.25 6.24023 -6.25 16.3701 0 22.6201l118.78 118.79c15.6201 15.6201 40.9395 15.6201 56.5596 0z" />
    <glyph glyph-name="long-arrow-alt-down" unicode="&#xf309;" horiz-adv-x="256" 
d="M168 102.059h46.0576c21.3828 0 32.0908 -25.8516 16.9717 -40.9707l-86.0596 -86.0586c-9.37207 -9.37305 -24.5674 -9.37305 -33.9404 0l-86.0596 86.0586c-15.1191 15.1201 -4.41113 40.9707 16.9717 40.9707h46.0586v301.941c0 6.62695 5.37305 12 12 12h56
c6.62695 0 12 -5.37305 12 -12v-301.941z" />
    <glyph glyph-name="long-arrow-alt-left" unicode="&#xf30a;" horiz-adv-x="448" 
d="M134.059 152v-46.0576c0 -21.3828 -25.8516 -32.0908 -40.9707 -16.9717l-86.0586 86.0596c-9.37305 9.37207 -9.37305 24.5674 0 33.9404l86.0586 86.0596c15.1201 15.1191 40.9707 4.41113 40.9707 -16.9717v-46.0586h301.941c6.62695 0 12 -5.37305 12 -12v-56
c0 -6.62695 -5.37305 -12 -12 -12h-301.941z" />
    <glyph glyph-name="long-arrow-alt-right" unicode="&#xf30b;" horiz-adv-x="448" 
d="M313.941 232v46.0576c0 21.3828 25.8516 32.0908 40.9707 16.9717l86.0586 -86.0596c9.37305 -9.37207 9.37305 -24.5674 0 -33.9404l-86.0586 -86.0596c-15.1201 -15.1191 -40.9707 -4.41113 -40.9707 16.9717v46.0586h-301.941c-6.62695 0 -12 5.37305 -12 12v56
c0 6.62695 5.37305 12 12 12h301.941z" />
    <glyph glyph-name="long-arrow-alt-up" unicode="&#xf30c;" horiz-adv-x="256" 
d="M88 281.941h-46.0576c-21.3828 0 -32.0908 25.8516 -16.9717 40.9707l86.0596 86.0586c9.37207 9.37305 24.5674 9.37305 33.9404 0l86.0596 -86.0586c15.1191 -15.1201 4.41113 -40.9707 -16.9717 -40.9707h-46.0586v-301.941c0 -6.62695 -5.37305 -12 -12 -12h-56
c-6.62695 0 -12 5.37305 -12 12v301.941z" />
    <glyph glyph-name="expand-arrows-alt" unicode="&#xf31e;" horiz-adv-x="448" 
d="M448 104v-112v-0.0605469c0 -13.2148 -10.7246 -23.9395 -23.9395 -23.9395h-0.0605469h-112c-21.3896 0 -32.0898 25.9004 -17 41l36.2002 36.2002l-107.2 107.2l-107.23 -107.301l36.2305 -36.0996c15.0898 -15.0996 4.38965 -41 -17 -41h-112h-0.0605469
c-13.2148 0 -23.9395 10.7246 -23.9395 23.9395v0.0605469v112c0 21.4004 25.8896 32.0996 41 17l36.1904 -36.2002l107.27 107.2l-107.28 107.3l-36.1797 -36.2998c-15.0996 -15.0996 -41 -4.40039 -41 17v112v0.0605469c0 13.2148 10.7246 23.9395 23.9395 23.9395
h0.0605469h112c21.3896 0 32.0898 -25.9004 17 -41l-36.2002 -36.2002l107.2 -107.2l107.23 107.301l-36.2305 36.0996c-15.0898 15.0996 -4.38965 41 17 41h112h0.0605469c13.2148 0 23.9395 -10.7246 23.9395 -23.9395v-0.0605469v-112
c0 -21.4004 -25.8896 -32.0996 -41 -17l-36.1904 36.2002l-107.27 -107.2l107.28 -107.3l36.1797 36.2002c15.0996 15.1992 41 4.5 41 -16.9004z" />
    <glyph glyph-name="clipboard" unicode="&#xf328;" horiz-adv-x="384" 
d="M384 336v-352c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h80c0 35.29 28.71 64 64 64s64 -28.71 64 -64h80c26.5098 0 48 -21.4902 48 -48zM192 408c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24
s24 10.7451 24 24s-10.7451 24 -24 24zM288 294v20c0 3.31152 -2.68848 6 -6 6h-180c-3.31152 0 -6 -2.68848 -6 -6v-20c0 -3.31152 2.68848 -6 6 -6h180c3.31152 0 6 2.68848 6 6z" />
    <glyph glyph-name="arrows-alt-h" unicode="&#xf337;" 
d="M377.941 278.059c0 21.3828 25.8516 32.0908 40.9707 16.9707l86.0586 -86.0596c9.37305 -9.37305 9.37305 -24.5674 0 -33.9404l-86.0586 -86.0596c-15.1201 -15.1191 -40.9707 -4.41113 -40.9707 16.9717v46.0586h-243.883v-46.0576
c0 -21.3828 -25.8516 -32.0908 -40.9707 -16.9717l-86.0586 86.0596c-9.37305 9.37305 -9.37305 24.5674 0 33.9404l86.0586 86.0596c15.1201 15.1191 40.9707 4.41113 40.9707 -16.9717v-46.0586h243.883v46.0586z" />
    <glyph glyph-name="arrows-alt-v" unicode="&#xf338;" horiz-adv-x="256" 
d="M214.059 70.0586c21.3828 0 32.0908 -25.8516 16.9707 -40.9707l-86.0596 -86.0586c-9.37305 -9.37305 -24.5674 -9.37305 -33.9404 0l-86.0596 86.0586c-15.1191 15.1201 -4.41113 40.9707 16.9717 40.9707h46.0586v243.883h-46.0576
c-21.3828 0 -32.0908 25.8516 -16.9717 40.9707l86.0596 86.0586c9.37305 9.37305 24.5674 9.37305 33.9404 0l86.0596 -86.0586c15.1191 -15.1201 4.41113 -40.9707 -16.9717 -40.9707h-46.0586v-243.883h46.0586z" />
    <glyph glyph-name="arrow-alt-circle-down" unicode="&#xf358;" 
d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM212 308v-116h-70.9004c-10.6992 0 -16.0996 -13 -8.5 -20.5l114.9 -114.3c4.7002 -4.7002 12.2002 -4.7002 16.9004 0l114.899 114.3c7.60059 7.59961 2.2002 20.5 -8.5 20.5
h-70.7998v116c0 6.59961 -5.40039 12 -12 12h-64c-6.59961 0 -12 -5.40039 -12 -12z" />
    <glyph glyph-name="arrow-alt-circle-left" unicode="&#xf359;" 
d="M256 -56c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248s-111 -248 -248 -248zM372 236h-116v70.9004c0 10.6992 -13 16.0996 -20.5 8.5l-114.3 -114.9c-4.7002 -4.7002 -4.7002 -12.2002 0 -16.9004l114.3 -114.899
c7.59961 -7.60059 20.5 -2.2002 20.5 8.5v70.7998h116c6.59961 0 12 5.40039 12 12v64c0 6.59961 -5.40039 12 -12 12z" />
    <glyph glyph-name="arrow-alt-circle-right" unicode="&#xf35a;" 
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM140 148h116v-70.9004c0 -10.6992 13 -16.0996 20.5 -8.5l114.3 114.9c4.7002 4.7002 4.7002 12.2002 0 16.9004l-114.3 115c-7.59961 7.59961 -20.5 2.19922 -20.5 -8.5
v-70.9004h-116c-6.59961 0 -12 -5.40039 -12 -12v-64c0 -6.59961 5.40039 -12 12 -12z" />
    <glyph glyph-name="arrow-alt-circle-up" unicode="&#xf35b;" 
d="M8 192c0 137 111 248 248 248s248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248zM300 76v116h70.9004c10.6992 0 16.0996 13 8.5 20.5l-114.9 114.3c-4.7002 4.7002 -12.2002 4.7002 -16.9004 0l-115 -114.3c-7.59961 -7.59961 -2.19922 -20.5 8.5 -20.5
h70.9004v-116c0 -6.59961 5.40039 -12 12 -12h64c6.59961 0 12 5.40039 12 12z" />
    <glyph glyph-name="external-link-alt" unicode="&#xf35d;" 
d="M432 128c8.83203 0 16 -7.16797 16 -16v-128c0 -26.4961 -21.5039 -48 -48 -48h-352c-26.4961 0 -48 21.5039 -48 48v352c0 26.4961 21.5039 48 48 48h160c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-144v-320h320v112
c0 8.83203 7.16797 16 16 16h32zM488 448c13.248 0 24 -10.752 24 -24v-128c0 -21.5 -26 -32 -41 -17l-35.7197 35.6797l-243.61 -243.68c-3.88281 -3.89648 -11.499 -7.05859 -17 -7.05859s-13.1172 3.16211 -17 7.05859l-22.6699 22.6299
c-3.89648 3.88281 -7.05859 11.499 -7.05859 17s3.16211 13.1172 7.05859 17l243.73 243.64l-35.7305 35.7305c-15.0498 15.0898 -4.37012 41 17 41h128z" />
    <glyph glyph-name="external-link-square-alt" unicode="&#xf360;" horiz-adv-x="448" 
d="M448 368v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48zM360 352h-111.971c-21.3135 0 -32.0801 -25.8613 -16.9717 -40.9707l31.9844 -31.9873l-195.527 -195.527
c-4.68555 -4.68555 -4.68555 -12.2832 0 -16.9707l31.0293 -31.0293c4.6875 -4.68555 12.2852 -4.68555 16.9707 0l195.526 195.526l31.9883 -31.9912c15.0283 -15.0264 40.9707 -4.47461 40.9707 16.9717v111.979c0 13.2549 -10.7451 24 -24 24z" />
    <glyph glyph-name="exchange-alt" unicode="&#xf362;" 
d="M0 280v16c0 13.2549 10.7451 24 24 24h360v48c0 21.3672 25.8994 32.042 40.9707 16.9707l80 -80c9.37207 -9.37305 9.37207 -24.5684 0 -33.9404l-80 -80c-15.0146 -15.0127 -40.9707 -4.48633 -40.9707 16.9697v48h-360c-13.2549 0 -24 10.7451 -24 24zM488 128
c13.2549 0 24 -10.7451 24 -24v-16c0 -13.2549 -10.7451 -24 -24 -24h-360v-48c0 -21.4365 -25.9434 -31.9971 -40.9707 -16.9697l-80 80c-9.37207 9.37207 -9.37207 24.5674 0 33.9404l80 80c15.1084 15.1094 40.9707 4.34375 40.9707 -16.9707v-48h360z" />
    <glyph glyph-name="cloud-download-alt" unicode="&#xf381;" horiz-adv-x="640" 
d="M537.6 221.4c58.4004 -11.8008 102.4 -63.5 102.4 -125.4c0 -70.7002 -57.2998 -128 -128 -128h-368c-79.5 0 -144 64.5 -144 144c0 62.7998 40.2002 116.2 96.2002 135.9c-0.100586 2.69922 -0.200195 5.39941 -0.200195 8.09961c0 88.4004 71.5996 160 160 160
c59.2998 0 111 -32.2002 138.7 -80.2002c15.2002 10.2002 33.5996 16.2002 53.2998 16.2002c53 0 96 -43 96 -96c0 -12.2002 -2.2998 -23.9004 -6.40039 -34.5996zM404.7 132.7c10.0996 10.0996 2.89941 27.2998 -11.2998 27.2998h-65.4004v112c0 8.7998 -7.2002 16 -16 16
h-48c-8.7998 0 -16 -7.2002 -16 -16v-112h-65.4004c-14.1992 0 -21.3994 -17.2002 -11.2998 -27.2998l105.4 -105.4c6.2002 -6.2002 16.3994 -6.2002 22.5996 0z" />
    <glyph glyph-name="cloud-upload-alt" unicode="&#xf382;" horiz-adv-x="640" 
d="M537.6 221.4c58.4004 -11.8008 102.4 -63.5 102.4 -125.4c0 -70.7002 -57.2998 -128 -128 -128h-368c-79.5 0 -144 64.5 -144 144c0 62.7998 40.2002 116.2 96.2002 135.9c-0.100586 2.69922 -0.200195 5.39941 -0.200195 8.09961c0 88.4004 71.5996 160 160 160
c59.2998 0 111 -32.2002 138.7 -80.2002c15.2002 10.2002 33.5996 16.2002 53.2998 16.2002c53 0 96 -43 96 -96c0 -12.2002 -2.2998 -23.9004 -6.40039 -34.5996zM393.4 160c14.1992 0 21.3994 17.2002 11.2998 27.2998l-105.4 105.4
c-6.2002 6.2002 -16.3994 6.2002 -22.5996 0l-105.4 -105.4c-10.0996 -10.0996 -3 -27.2998 11.2998 -27.2998h65.4004v-112c0 -8.7998 7.2002 -16 16 -16h48c8.7998 0 16 7.2002 16 16v112h65.4004z" />
    <glyph glyph-name="gem" unicode="&#xf3a5;" horiz-adv-x="576" 
d="M485.5 448l90.5 -160h-101.1l-69.2002 160h79.7998zM357.5 448l69.2002 -160h-277.4l69.2002 160h139zM90.5 448h79.7998l-69.2002 -160h-101.1zM0 256h100.7l123 -251.7c1.5 -3.09961 -2.7002 -5.89941 -5 -3.2998zM148.2 256h279.6l-137 -318.2
c-1 -2.39941 -4.5 -2.39941 -5.5 0zM352.3 4.2998l123 251.7h100.7l-218.7 -254.9c-2.2998 -2.69922 -6.5 0.100586 -5 3.2002z" />
    <glyph glyph-name="level-down-alt" unicode="&#xf3be;" horiz-adv-x="320" 
d="M313.553 55.6689l-103.966 -112.003c-9.48535 -10.2139 -25.6758 -10.2295 -35.1738 0l-103.975 112.003c-14.2061 15.2998 -3.37695 40.3311 17.5869 40.3311h63.9746v272h-83.9756h-0.00195312c-2.74316 0 -6.54395 1.5752 -8.4834 3.51465l-56 56
c-7.56055 7.55957 -2.20605 20.4854 8.48535 20.4854h195.976c13.2549 0 24 -10.7451 24 -24v-328h63.9658c20.8779 0 31.8516 -24.9688 17.5869 -40.3311z" />
    <glyph glyph-name="level-up-alt" unicode="&#xf3bf;" horiz-adv-x="320" 
d="M313.553 328.331c14.2646 -15.3623 3.29102 -40.3311 -17.5869 -40.3311h-63.9658v-328c0 -13.2549 -10.7451 -24 -24 -24h-195.976c-10.6914 0 -16.0459 12.9258 -8.48535 20.4854l56 56c1.93945 1.93945 5.74023 3.51465 8.4834 3.51465h0.00195312h83.9756v272
h-63.9746c-20.9639 0 -31.793 25.0312 -17.5869 40.3311l103.975 112.003c9.49805 10.2295 25.6885 10.2139 35.1738 0z" />
    <glyph glyph-name="lock-open" unicode="&#xf3c1;" horiz-adv-x="576" 
d="M423.5 448c84 0.299805 152.5 -68 152.5 -152v-80c0 -13.2998 -10.7002 -24 -24 -24h-32c-13.2998 0 -24 10.7002 -24 24v80c0 39.9004 -32.7002 72.4004 -72.7002 72c-39.5996 -0.400391 -71.2998 -33.2998 -71.2998 -72.9004v-71.0996h48c26.5 0 48 -21.5 48 -48v-192
c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v192c0 26.5 21.5 48 48 48h224v70.5c0 84 67.5 153.2 151.5 153.5z" />
    <glyph glyph-name="map-marker-alt" unicode="&#xf3c5;" horiz-adv-x="384" 
d="M172.268 -53.6699c-145.298 210.639 -172.268 232.257 -172.268 309.67c0 106.039 85.9609 192 192 192s192 -85.9609 192 -192c0 -77.4131 -26.9697 -99.0312 -172.268 -309.67c-9.53516 -13.7744 -29.9307 -13.7734 -39.4648 0zM192 176c44.1826 0 80 35.8174 80 80
s-35.8174 80 -80 80s-80 -35.8174 -80 -80s35.8174 -80 80 -80z" />
    <glyph glyph-name="microphone-alt" unicode="&#xf3c9;" horiz-adv-x="352" 
d="M336 256c8.83984 0 16 -7.16016 16 -16v-48c0 -88.9004 -66.29 -162.47 -152 -174.23v-33.7695h56c8.83984 0 16 -7.16016 16 -16v-16c0 -8.83984 -7.16016 -16 -16 -16h-160c-8.83984 0 -16 7.16016 -16 16v16c0 8.83984 7.16016 16 16 16h56v34.1504
c-88.0303 12.1396 -152 92.0498 -152 181.689v40.1602c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-42.2998c0 -66.8105 48.71 -126.59 115.21 -133.08c76.2998 -7.44043 140.79 52.5801 140.79 127.38v48c0 8.83984 7.16016 16 16 16h16zM176 96
c-53.0195 0 -96 42.9805 -96 96v160c0 53.0195 42.9805 96 96 96s96 -42.9805 96 -96h-85.3301c-5.88965 0 -10.6699 -3.58008 -10.6699 -8v-16c0 -4.41992 4.78027 -8 10.6699 -8h85.3301v-32h-85.3301c-5.88965 0 -10.6699 -3.58008 -10.6699 -8v-16
c0 -4.41992 4.78027 -8 10.6699 -8h85.3301v-32h-85.3301c-5.88965 0 -10.6699 -3.58008 -10.6699 -8v-16c0 -4.41992 4.78027 -8 10.6699 -8h85.3301c0 -53.0195 -42.9805 -96 -96 -96z" />
    <glyph glyph-name="mobile-alt" unicode="&#xf3cd;" horiz-adv-x="320" 
d="M272 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-224c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h224zM160 -32c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM272 76v312
c0 6.59961 -5.40039 12 -12 12h-200c-6.59961 0 -12 -5.40039 -12 -12v-312c0 -6.59961 5.40039 -12 12 -12h200c6.59961 0 12 5.40039 12 12z" />
    <glyph glyph-name="money-bill-alt" unicode="&#xf3d1;" horiz-adv-x="640" 
d="M352 160c4.41992 0 8 -3.58008 8 -8v-16c0 -4.41992 -3.58008 -8 -8 -8h-64c-4.41992 0 -8 3.58008 -8 8v16c0 4.41992 3.58008 8 8 8h16v55.4404l-0.469727 -0.310547c-1.1123 -0.741211 -3.09961 -1.34375 -4.43652 -1.34375
c-2.36328 0 -5.34375 1.59668 -6.65332 3.56348l-8.88086 13.3105c-0.741211 1.1123 -1.34375 3.09961 -1.34375 4.43555c0 2.36328 1.59668 5.34473 3.56445 6.6543l15.3301 10.2197c3.93945 2.62988 8.56934 4.03027 13.3096 4.03027h13.5801c4.41992 0 8 -3.58008 8 -8
v-88h16zM608 384c17.6699 0 32 -14.3301 32 -32v-320c0 -17.6699 -14.3301 -32 -32 -32h-576c-17.6699 0 -32 14.3301 -32 32v320c0 17.6699 14.3301 32 32 32h576zM48 48h64c0 35.3496 -28.6504 64 -64 64v-64zM48 272c35.3496 0 64 28.6504 64 64h-64v-64zM320 80
c53 0 96 50.1299 96 112c0 61.8604 -42.9805 112 -96 112s-96 -50.1396 -96 -112c0 -61.8496 42.9805 -112 96 -112zM592 48v64c-35.3496 0 -64 -28.6504 -64 -64h64zM592 272v64h-64c0 -35.3496 28.6504 -64 64 -64z" />
    <glyph glyph-name="phone-slash" unicode="&#xf3dd;" horiz-adv-x="640" 
d="M268.2 66.5996c11.5 5.40039 22.7002 11.6006 33.5996 18.1006l80 -61.7998c-76 -54.5 -169 -86.9004 -269.7 -86.9004c-11.2998 0 -20.8994 7.7998 -23.3994 18.5996l-24 104c-2.60059 11.4004 3.2002 22.9004 13.8994 27.5l112 48
c9.80078 4.2002 21.2002 1.40039 28 -6.89941zM633.8 -10.0996c7 -5.40039 8.2998 -15.5 2.90039 -22.3008l-19.6006 -25.2998c-5.5 -7 -15.5 -8.2002 -22.5 -2.7998l-588.399 454.7c-7 5.39941 -8.2002 15.3994 -2.7998 22.3994l19.5996 25.2002
c5.5 7 15.5 8.2002 22.5 2.7998l353.9 -273.5c18.0996 22.5 33.7998 46.7002 46 72.8008l-60.6006 49.5996c-8.2998 6.7002 -11.0996 18.2002 -6.89941 28l48 112c4.59961 10.5996 16.1992 16.5 27.5 13.9004l104 -24c10.8994 -2.5 18.5996 -12.2002 18.5996 -23.4004
c0 -108.9 -38.0996 -208.4 -100.9 -287.5z" />
    <glyph glyph-name="portrait" unicode="&#xf3e0;" horiz-adv-x="384" 
d="M336 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h288zM192 320c-35.2998 0 -64 -28.7002 -64 -64s28.7002 -64 64 -64s64 28.7002 64 64s-28.7002 64 -64 64zM304 83.2002v19.2002
c0 31.7998 -30.0996 57.5996 -67.2002 57.5996h-5c-12.2002 -5.09961 -25.7002 -8 -39.7998 -8s-27.5 2.90039 -39.7998 8h-5c-37.1006 0 -67.2002 -25.7998 -67.2002 -57.5996v-19.2002c0 -10.6006 10 -19.2002 22.4004 -19.2002h179.199
c12.4004 0 22.4004 8.59961 22.4004 19.2002z" />
    <glyph glyph-name="reply" unicode="&#xf3e5;" 
d="M8.30859 258.164l176.005 151.985c15.4053 13.3047 39.6865 2.50391 39.6865 -18.1641v-80.0537c160.629 -1.83887 288 -34.0312 288 -186.258c0 -61.4404 -39.5811 -122.309 -83.333 -154.132c-13.6533 -9.93066 -33.1113 2.5332 -28.0771 18.6309
c45.3438 145.012 -21.5068 183.51 -176.59 185.742v-87.915c0 -20.7002 -24.2998 -31.4531 -39.6865 -18.1641l-176.005 152c-11.0703 9.5625 -11.0859 26.7529 0 36.3281z" />
    <glyph glyph-name="shield-alt" unicode="&#xf3ed;" 
d="M466.5 364.3c17.7998 -7.39941 29.5 -24.8994 29.5 -44.2998c0 -221.3 -135.9 -344.6 -221.6 -380.3c-11.8008 -4.90039 -25.1006 -4.90039 -36.9004 0c-107 44.5996 -221.5 181.8 -221.5 380.3c0 19.4004 11.7002 36.9004 29.5996 44.2998l192 80
c4.89062 2.0293 13.1562 3.6748 18.4502 3.6748c5.29492 0 13.5596 -1.64551 18.4502 -3.6748zM256.1 1.7002c93.7002 46.5996 172.5 156.3 175.801 307.7l-175.9 73.2998z" />
    <glyph glyph-name="tablet-alt" unicode="&#xf3fa;" horiz-adv-x="448" 
d="M400 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h352zM224 -32c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM400 76v312
c0 6.59961 -5.40039 12 -12 12h-328c-6.59961 0 -12 -5.40039 -12 -12v-312c0 -6.59961 5.40039 -12 12 -12h328c6.59961 0 12 5.40039 12 12z" />
    <glyph glyph-name="tachometer-alt" unicode="&#xf3fd;" horiz-adv-x="576" 
d="M288 416c159.06 0 288 -128.94 288 -288c0 -52.7998 -14.25 -102.26 -39.0596 -144.8c-5.61035 -9.62012 -16.3008 -15.2002 -27.4404 -15.2002h-443c-11.1396 0 -21.8301 5.58008 -27.4404 15.2002c-24.8096 42.54 -39.0596 92 -39.0596 144.8
c0 159.06 128.94 288 288 288zM288 352c-17.6699 0 -31.9902 -14.3301 -31.9902 -32s14.3301 -32 32 -32c6.66992 0 12.5098 2.51953 17.6406 6.00977l9.21973 27.6699c0.80957 2.44043 2.33984 4.41016 3.4502 6.66992c-3.74023 13.5205 -15.6104 23.6504 -30.3203 23.6504
zM96 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM144 224c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM390.77 296.41c4.18066 12.5703 -2.59961 26.1699 -15.1699 30.3594
c-12.6299 4.28027 -26.1895 -2.60938 -30.3594 -15.1699l-61.3398 -184.01c-33.4004 -2.16016 -59.9004 -29.6494 -59.9004 -63.5898c0 -11.7197 3.37988 -22.5498 8.87988 -32h110.24c5.5 9.4502 8.87988 20.2803 8.87988 32c0 19.46 -8.87012 36.6699 -22.5596 48.4102z
M405.43 239.21c5.68066 -8.94043 15.1904 -15.21 26.5703 -15.2197c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32c-3.91992 0 -7.58008 -0.94043 -11.0498 -2.23047zM480 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z
" />
    <glyph glyph-name="ticket-alt" unicode="&#xf3ff;" horiz-adv-x="576" 
d="M128 288h320v-192h-320v192zM528 192c0 -26.5098 21.4902 -48 48 -48v-96c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v96c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48v96c0 26.5098 21.4902 48 48 48h480c26.5098 0 48 -21.4902 48 -48
v-96c-26.5098 0 -48 -21.4902 -48 -48zM480 296c0 13.2549 -10.7451 24 -24 24h-336c-13.2549 0 -24 -10.7451 -24 -24v-208c0 -13.2549 10.7451 -24 24 -24h336c13.2549 0 24 10.7451 24 24v208z" />
    <glyph glyph-name="user-alt" unicode="&#xf406;" 
d="M256 160c-79.5 0 -144 64.5 -144 144s64.5 144 144 144s144 -64.5 144 -144s-64.5 -144 -144 -144zM384 128c70.7002 0 128 -57.2998 128 -128v-16c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v16c0 70.7002 57.2998 128 128 128h55.0996
c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h55.0996z" />
    <glyph glyph-name="window-close" unicode="&#xf410;" 
d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM380.4 125.5l-67.1006 66.5l67.1006 66.5c4.7998 4.7998 4.7998 12.5996 0 17.4004l-40.5 40.5
c-4.80078 4.7998 -12.6006 4.7998 -17.4004 0l-66.5 -67.1006l-66.5 67.1006c-4.7998 4.7998 -12.5996 4.7998 -17.4004 0l-40.5 -40.5c-4.7998 -4.80078 -4.7998 -12.6006 0 -17.4004l67.1006 -66.5l-67.1006 -66.5c-4.7998 -4.7998 -4.7998 -12.5996 0 -17.4004
l40.5 -40.5c4.80078 -4.7998 12.6006 -4.7998 17.4004 0l66.5 67.1006l66.5 -67.1006c4.7998 -4.7998 12.5996 -4.7998 17.4004 0l40.5 40.5c4.7998 4.80078 4.7998 12.6006 0 17.4004z" />
    <glyph glyph-name="compress-alt" unicode="&#xf422;" horiz-adv-x="448" 
d="M4.68555 20.6855l99.3145 99.3145l-32.9219 31.0293c-15.1201 15.1201 -4.41211 40.9707 16.9697 40.9707h112c13.2549 0 23.9521 -10.7451 23.9521 -24v-112c0 -21.3818 -25.8027 -32.0898 -40.9219 -16.9707l-31.0781 32.9707l-99.3145 -99.3145
c-6.24707 -6.24707 -16.3789 -6.24707 -22.627 0l-25.373 25.373c-6.24707 6.24805 -6.24707 16.3799 0 22.627zM443.314 363.314l-99.3145 -99.3145l32.9219 -31.0293c15.1201 -15.1201 4.41211 -40.9707 -16.9697 -40.9707h-112c-13.2549 0 -23.9521 10.7451 -23.9521 24
v112c0 21.3818 25.8027 32.0898 40.9219 16.9707l31.0781 -32.9707l99.3145 99.3145c6.24707 6.24707 16.3789 6.24707 22.627 0l25.373 -25.373c6.24707 -6.24805 6.24707 -16.3799 0 -22.627z" />
    <glyph glyph-name="expand-alt" unicode="&#xf424;" horiz-adv-x="448" 
d="M212.686 132.686l-92.6855 -92.6855l32.9219 -31.0293c15.1201 -15.1201 4.41211 -40.9707 -16.9697 -40.9707h-112c-13.2549 0 -23.9521 10.7451 -23.9521 24v112c0 21.3818 25.8027 32.0898 40.9219 16.9707l31.0781 -32.9707l92.6855 92.6855
c6.24805 6.24805 16.3799 6.24805 22.6279 0l25.3721 -25.3721c6.24902 -6.24805 6.24902 -16.3789 0 -22.6279zM235.314 251.314l92.6855 92.6855l-32.9219 31.0293c-15.1201 15.1201 -4.41211 40.9707 16.9697 40.9707h112c13.2549 0 23.9521 -10.7451 23.9521 -24v-112
c0 -21.3818 -25.8027 -32.0898 -40.9219 -16.9707l-31.0781 32.9707l-92.6855 -92.6855c-6.24805 -6.24805 -16.3799 -6.24805 -22.6279 0l-25.3721 25.3721c-6.24902 6.24805 -6.24902 16.3789 0 22.6279z" />
    <glyph glyph-name="baseball-ball" unicode="&#xf433;" horiz-adv-x="496" 
d="M368.5 84.0996c12.9004 -26.6992 30.2998 -50.1992 51.4004 -70.5996c-44.6006 -43 -105.101 -69.5 -171.9 -69.5c-66.9004 0 -127.5 26.5996 -172 69.7002c21.2002 20.3994 38.5996 44 51.5 70.7002l-28.7998 13.8994c-11.1006 -23 -26.1006 -43.2998 -44.2998 -61
c-34 42.4004 -54.4004 96.1006 -54.4004 154.7s20.4004 112.3 54.4004 154.8c17.7998 -17.2998 32.5 -37.0996 43.5 -59.3994l28.6992 14.0996c-12.7998 25.9004 -30 48.9004 -50.6992 68.7998c44.5996 43.1006 105.199 69.7002 172.1 69.7002
c67 0 127.6 -26.7002 172.2 -69.7998c-20.7998 -20 -38 -43 -50.7998 -69l28.6992 -14.1006c11 22.4004 25.8008 42.2002 43.6006 59.5c33.7998 -42.3994 54.2002 -96.0996 54.2002 -154.6c0 -58.5996 -20.5 -112.4 -54.5 -154.9c-18.1006 17.7002 -33 38 -44.1006 60.9004z
M140.2 116.1c17.2998 53.9004 14.2998 108.2 -0.700195 153.801l-30.4004 -10c13.3008 -40.2002 15.5 -87.6006 0.600586 -134zM356.5 269.5c-15 -45.5 -18 -99.7998 -0.700195 -153.8l30.5 9.7998c-14.8994 46.5 -12.5996 93.9004 0.600586 134z" />
    <glyph glyph-name="basketball-ball" unicode="&#xf434;" horiz-adv-x="496" 
d="M212.3 437.7c-1.5 -50 -17 -95.4004 -44.7998 -131.2l-77.4004 77.4004c36 29.6992 78.4004 47.5 122.2 53.7998zM248 226l-46.2998 46.2998c37.2002 45.4004 57.5 103.8 58.7002 167.7c51.8994 -2.59961 103.1 -21.0996 145.5 -56.0996zM56.0996 349.9l77.4004 -77.4004
c-35.7002 -27.7998 -81.2002 -43.2998 -131.2 -44.7998c6.2998 43.7998 24.1006 86.2002 53.7998 122.2zM328.3 145.7l-46.2998 46.2998l157.9 157.9c35 -42.4004 53.5 -93.6006 56.0996 -145.5c-64 -1.30078 -122.4 -21.6006 -167.7 -58.7002zM248 158l46.2998 -46.2998
c-37.0996 -45.2998 -57.3994 -103.7 -58.7002 -167.7c-51.8994 2.59961 -103.1 21.2002 -145.5 56.0996zM439.9 34.0996l-77.4004 77.4004c35.7002 27.7002 81.0996 43.2002 131.2 44.7998c-6.2998 -43.7998 -24.1006 -86.2002 -53.7998 -122.2zM167.7 238.3
l46.2998 -46.2998l-157.9 -157.9c-35 42.4004 -53.5 93.6006 -56.0996 145.5c63.9004 1.10059 122.3 21.5 167.7 58.7002zM283.7 -53.7002c1.59961 50 17.0996 95.5 44.7998 131.2l77.4004 -77.4004c-36 -29.6992 -78.4004 -47.5 -122.2 -53.7998z" />
    <glyph glyph-name="bowling-ball" unicode="&#xf436;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM120 256c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM184 352c0 -17.7002 14.2998 -32 32 -32s32 14.2998 32 32
s-14.2998 32 -32 32s-32 -14.2998 -32 -32zM232 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="chess" unicode="&#xf439;" 
d="M74 240l-33.9102 90.3799c-0.5625 1.5 -1.01953 4.01758 -1.01953 5.62012c0 8.83203 7.16797 16 16 16h0.0195312h56.9102v32h-24c-4.41602 0 -8 3.58398 -8 8v16c0 4.41602 3.58398 8 8 8h24v24c0 4.41602 3.58398 8 8 8h16c4.41602 0 8 -3.58398 8 -8v-24h24
c4.41602 0 8 -3.58398 8 -8v-16c0 -4.41602 -3.58398 -8 -8 -8h-24v-32h56.8896h0.0195312c8.83203 0 16 -7.16797 16 -16c0 -1.60254 -0.456055 -4.12012 -1.01953 -5.62012l-33.8896 -90.3799h10c8.83203 0 16 -7.16797 16 -16v-16c0 -8.83203 -7.16797 -16 -16 -16
h-15.9404c0.116211 -35.8613 7.25684 -93.2051 15.9404 -128h-128c8.68359 34.7949 15.8242 92.1387 15.9404 128h-15.9404c-8.83203 0 -16 7.16797 -16 16v16c0 8.83203 7.16797 16 16 16h10zM247.16 -11.5801c4.87988 -2.44141 8.83984 -8.85156 8.83984 -14.3086
v-0.000976562v-22.1104c0 -8.83203 -7.16797 -16 -16 -16h-224c-8.83203 0 -16 7.16797 -16 16v22.1104c0.000976562 5.45898 3.96582 11.8701 8.84961 14.3096l23.1504 11.5801v16c0 8.83203 7.16797 16 16 16h160c8.83203 0 16 -7.16797 16 -16v-16zM339.93 146.2
l-24.5693 20.7998c-6.25684 5.28125 -11.3467 16.2119 -11.3604 24.4004v58.5996c0 3.31152 2.68848 6 6 6h26.3896c3.3125 0 6 -2.68848 6 -6v-26h24.71v26c0 3.31152 2.68848 6 6 6h53.8105c3.31152 0 6 -2.68848 6 -6v-26h24.71v26c0 3.31152 2.6875 6 6 6h26.3799
c3.31152 0 6 -2.68848 6 -6v-58.54v-0.03125c0 -8.19238 -5.07617 -19.1367 -11.3301 -24.4287l-24.5996 -20.79l3.29004 -82.21h-126.721zM384 144v-32h32v32c0 8.83203 -7.16797 16 -16 16s-16 -7.16797 -16 -16zM503.16 -11.5801
c4.87988 -2.44141 8.83984 -8.85156 8.83984 -14.3086v-0.000976562v-22.1104c0 -8.83203 -7.16797 -16 -16 -16h-192c-8.83203 0 -16 7.16797 -16 16v22.1104c0.000976562 5.45898 3.96582 11.8701 8.84961 14.3096l23.1504 11.5801v16c0 8.83203 7.16797 16 16 16h128
c8.83203 0 16 -7.16797 16 -16v-16z" />
    <glyph glyph-name="chess-bishop" unicode="&#xf43a;" horiz-adv-x="320" 
d="M8 160.12c0 73.3799 59.8096 181.08 112.6 225.37c-14 3.41992 -24.5996 15.5098 -24.5996 30.5098c0 17.6641 14.3359 32 32 32h64c17.6641 0 32 -14.3359 32 -32c0 -15.0498 -10.5996 -27.0898 -24.5996 -30.5098c24.3994 -20.4902 50.0693 -54.6807 70.8691 -92.5898
l-107.89 -107.931c-1.29199 -1.29297 -2.34082 -3.82617 -2.34082 -5.6543c0 -1.8291 1.04883 -4.3623 2.34082 -5.65527l11.3105 -11.3105c1.29297 -1.29199 3.82617 -2.34082 5.6543 -2.34082s4.3623 1.04883 5.65527 2.34082l100.31 100.33
c15.96 -35.46 26.6904 -71.9492 26.6904 -102.56c0 -51.6006 -22.1396 -73.8301 -56 -84.6006v-43.5195h-192v43.5195c-33.8604 10.7705 -56 32.9609 -56 84.6006zM304 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288z" />
    <glyph glyph-name="chess-board" unicode="&#xf43c;" 
d="M255.9 447.8v-64h-64v64h64zM0 383.83h64v-64h-64v64zM128 447.8v-64h-64v64h64zM192 191.9h64v-64h-64v64zM0 255.88h64v-64h-64v64zM383.85 447.8v-64h-64v64h64zM511.85 447.8v-64h-64v64h64zM128 191.9v-64h-64v64h64zM511.8 0h-64v64h64v-64zM511.8 128h-64v64h64
v-64zM383.85 -64v64h64v-64h-64zM511.85 255.88h-64v64h64v-64zM128 -64v64h64v-64h-64zM0 -64v64h64v-64h-64zM255.9 -64v64h64v-64h-64zM0 127.93h64v-64h-64v64zM319.88 319.85h-64v64h64v-64zM255.88 191.85v64h64v-64h-64zM191.88 63.8496h64v-64h-64v64z
M319.88 127.85v64h64v-64h-64zM319.88 255.8v64h64v-64h-64zM319.88 63.8701h64v-64h-64v64zM64 63.9502h64v-64h-64v64zM192 319.85h-64v64h64v-64zM383.92 63.9502v64h64v-64h-64zM255.92 255.88h-64v64h64v-64zM383.92 383.83h64v-64h-64v64zM255.92 127.93h64v-64h-64
v64zM191.92 255.88l0.0800781 -64h-64v64h63.9199zM383.84 191.88v64h64v-64h-64zM128 319.85v-64h-64v64h64zM128 127.93h64v-64h-64v64z" />
    <glyph glyph-name="chess-king" unicode="&#xf43f;" horiz-adv-x="448" 
d="M400 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-352c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h352zM416 288c17.6504 -0.0136719 31.9756 -14.3496 31.9756 -32c0 -2.69434 -0.652344 -6.96777 -1.45605 -9.54004
l-73.0791 -214.46h-298.881l-73.0791 214.46c-0.803711 2.57227 -1.45605 6.8457 -1.45605 9.54004c0 17.6504 14.3252 31.9863 31.9756 32h160v48h-40c-4.41602 0 -8 3.58398 -8 8v48c0 4.41602 3.58398 8 8 8h40v40c0 4.41602 3.58398 8 8 8h48c4.41602 0 8 -3.58398 8 -8
v-40h40c4.41602 0 8 -3.58398 8 -8v-48c0 -4.41602 -3.58398 -8 -8 -8h-40v-48h160z" />
    <glyph glyph-name="chess-knight" unicode="&#xf441;" horiz-adv-x="384" 
d="M19 175.53c-10.4883 4.66211 -19 17.7627 -19 29.2402v0.0195312v137.21v0.0585938c0 5.47461 3.13574 13.0635 7 16.9414l9 9l-14.21 28.4199c-0.988281 1.97266 -1.79004 5.36328 -1.79004 7.56934v0.0107422c0 6.62402 5.37598 12 12 12h147.94
c106 0 191.92 -86 191.92 -192v-192h-319.86v14.5195v0.0224609c0 27.2783 19.7969 59.3271 44.1904 71.5381l57.2197 28.6504c14.6445 7.32324 26.5303 26.5566 26.5303 42.9297v0.00976562v50.3301l-22.1201 -11.0801
c-5.45117 -2.72559 -11.0732 -9.7373 -12.5508 -15.6504l-9.21973 -30.6494c-2.4502 -8.15332 -10.8545 -17.3379 -18.7598 -20.5l-12.7803 -5.12012c-3.1582 -1.2627 -8.48145 -2.28809 -11.8828 -2.28809c-3.74902 0 -9.57129 1.23535 -12.9971 2.75781zM52 320
c-11.04 0 -20 -8.95996 -20 -20s8.95996 -20 20 -20s20 8.95996 20 20s-8.95996 20 -20 20zM368 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-352c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h352z" />
    <glyph glyph-name="chess-pawn" unicode="&#xf443;" horiz-adv-x="320" 
d="M105.1 224c-29.3896 18.3799 -49.0996 50.7803 -49.0996 88c0 57.4082 46.5918 104 104 104s104 -46.5918 104 -104c0 -37.2197 -19.71 -69.6201 -49.0996 -88h25.0996c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-16v-5.49023
c0 -44 4.11035 -86.5996 24 -122.51h-176c19.8604 35.9102 24 78.5098 24 122.51v5.49023h-16c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h25.0996zM304 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-288
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h288z" />
    <glyph glyph-name="chess-queen" unicode="&#xf445;" 
d="M256 336c-30.9121 0 -56 25.0879 -56 56s25.0879 56 56 56s56 -25.0879 56 -56s-25.0879 -56 -56 -56zM432 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-352c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h352zM504.87 263.84
c3.93457 -2.62109 7.12891 -8.58691 7.12891 -13.3154c0 -2.08496 -0.756836 -5.29004 -1.68945 -7.1543l-102.55 -211.37h-303.52l-102.55 211.33c-0.932617 1.86426 -1.68945 5.06934 -1.68945 7.1543c0 4.72852 3.19434 10.6943 7.12891 13.3154l28.5703 16
c7.35938 4.91016 16.8096 2.5498 22.0898 -4.54004c7.86035 -10.6357 24.9736 -19.2676 38.1992 -19.2676c0.922852 0 2.41992 0.0527344 3.34082 0.118164c25.6699 1.73926 44.6699 24.7998 44.6699 50.4893c0 7.39746 6.00293 13.4004 13.4004 13.4004v0h38.7695
c6.04004 0 11.6104 -3.99023 12.8604 -9.91016c4.42969 -21.0361 25.4717 -38.1094 46.9697 -38.1094s42.54 17.0732 46.9697 38.1094c1.25 5.91016 6.86035 9.91016 12.8604 9.91016h38.7695c7.39746 0 13.4004 -6.00293 13.4004 -13.4004
c0 -23.5293 15.7002 -45.46 38.8398 -49.75c2.48926 -0.484375 6.56738 -0.878906 9.10352 -0.878906c13.166 0 30.2471 8.56152 38.127 19.1094c5.37988 7.13965 14.8496 9.67969 22.29 4.67969z" />
    <glyph glyph-name="chess-rook" unicode="&#xf447;" horiz-adv-x="384" 
d="M368 416c8.83203 0 16 -7.16797 16 -16v-176l-64 -32c0 -47.7197 1.54004 -95 13.21 -160h-282.42c11.6699 65 13.21 111.67 13.21 160l-64 32v176c0 8.83203 7.16797 16 16 16h56.0996c8.83203 0 16 -7.16797 16 -16v-48h47.9004v48c0 8.83203 7.16797 16 16 16h80
c8.83203 0 16 -7.16797 16 -16v-48h48v48c0 8.83203 7.16797 16 16 16h56zM224 128v64c0 17.6641 -14.3359 32 -32 32s-32 -14.3359 -32 -32v-64h64zM368 0c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-352c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h352z" />
    <glyph glyph-name="dumbbell" unicode="&#xf44b;" horiz-adv-x="640" 
d="M104 352c13.2998 0 24 -10.7002 24 -24v-272c0 -13.2998 -10.7002 -24 -24 -24h-48c-13.2998 0 -24 10.7002 -24 24v104h-24c-4.40039 0 -8 3.59961 -8 8v48c0 4.40039 3.59961 8 8 8h24v104c0 13.2998 10.7002 24 24 24h48zM632 224c4.40039 0 8 -3.59961 8 -8v-48
c0 -4.40039 -3.59961 -8 -8 -8h-24v-104c0 -13.2998 -10.7002 -24 -24 -24h-48c-13.2998 0 -24 10.7002 -24 24v272c0 13.2998 10.7002 24 24 24h48c13.2998 0 24 -10.7002 24 -24v-104h24zM456 416c13.2998 0 24 -10.7002 24 -24v-400c0 -13.2998 -10.7002 -24 -24 -24h-48
c-13.2998 0 -24 10.7002 -24 24v168h-128v-168c0 -13.2998 -10.7002 -24 -24 -24h-48c-13.2998 0 -24 10.7002 -24 24v400c0 13.2998 10.7002 24 24 24h48c13.2998 0 24 -10.7002 24 -24v-168h128v168c0 13.2998 10.7002 24 24 24h48z" />
    <glyph glyph-name="football-ball" unicode="&#xf44e;" horiz-adv-x="496" 
d="M481.5 387.7c6.2998 -23.9004 13.7002 -61 14.5 -104.5l-156.6 156.8c43.5996 -0.900391 80.8994 -8.5 104.8 -14.9004c18.2002 -4.89941 32.5 -19.1992 37.2998 -37.3994zM14.5 -3.7002c-6.2998 23.9004 -13.7002 61 -14.5 104.5l156.6 -156.8
c-43.5996 0.900391 -80.8994 8.5 -104.8 14.9004c-18.2002 4.89941 -32.5 19.1992 -37.2998 37.3994zM4.2002 164.6c22.5996 152.7 138.899 252 271.399 271.4l216.301 -216.6c-22.7002 -152.7 -139 -252 -271.5 -271.4zM321.5 288.2l-28.2998 -28.5l-28.2998 28.2998
c-3.10059 3.09961 -8.2002 3.09961 -11.3008 0l-11.2998 -11.2998c-3.09961 -3.10059 -3.09961 -8.2002 0 -11.2998l28.2998 -28.3008l-22.5996 -22.5996l-28.2998 28.2998c-3.10059 3.10059 -8.2002 3.10059 -11.2998 0l-11.3008 -11.2998
c-3.09961 -3.09961 -3.09961 -8.2002 0 -11.2998l28.3008 -28.2998l-22.6006 -22.6006l-28.2998 28.2998c-3.09961 3.10059 -8.2002 3.10059 -11.2998 0l-11.2998 -11.2998c-3.10059 -3.09961 -3.10059 -8.2002 0 -11.2998l28.2998 -28.2002l-28.2998 -28.2998
c-3.10059 -3.09961 -3.10059 -8.2002 0 -11.2998l11.2998 -11.2998c3.09961 -3.10059 8.2002 -3.10059 11.2998 0l28.2998 28.2998l28.2998 -28.2998c3.10059 -3.10059 8.2002 -3.10059 11.3008 0l11.2998 11.2998c3.09961 3.09961 3.09961 8.2002 0 11.2998
l-28.2998 28.2998l22.5996 22.6006l28.2998 -28.3008c3.10059 -3.09961 8.2002 -3.09961 11.2998 0l11.3008 11.3008c3.09961 3.09961 3.09961 8.19922 0 11.2998l-28.3008 28.2998l22.6006 22.7002l28.2998 -28.2998c3.09961 -3.10059 8.2002 -3.10059 11.2998 0
l11.2998 11.2998c3.10059 3.09961 3.10059 8.2002 0 11.2998l-28.2998 28.2998l28.2998 28.2998c3.10059 3.10059 3.10059 8.2002 0 11.3008l-11.2998 11.2998c-3.09961 3.09961 -8.2002 3.09961 -11.2998 0z" />
    <glyph glyph-name="golf-ball" unicode="&#xf450;" horiz-adv-x="416" 
d="M96 32h224c0 -17.7002 -14.2998 -32 -32 -32h-16c-17.7002 0 -32 -14.2998 -32 -32v-20c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v20c0 17.7002 -14.2998 32 -32 32h-16c-17.7002 0 -32 14.2998 -32 32zM416 240
c0 -74.2002 -39 -139.2 -97.5 -176h-221c-58.5 36.7998 -97.5 101.8 -97.5 176c0 114.9 93.0996 208 208 208s208 -93.0996 208 -208zM235.9 196.1c18.2998 0 33.0996 14.8008 33.0996 33.1006c0 14.3994 -9.2998 26.2998 -22.0996 30.8994
c9.59961 -26.7998 -15.6006 -51.2998 -41.9004 -41.8994c4.59961 -12.7998 16.5 -22.1006 30.9004 -22.1006zM285 149.2c0 14.3994 -9.2998 26.2998 -22.0996 30.8994c9.59961 -26.7998 -15.6006 -51.2998 -41.9004 -41.8994
c4.59961 -12.7998 16.5 -22.1006 30.9004 -22.1006c18.2998 0 33.0996 14.9004 33.0996 33.1006zM349 213.2c0 14.3994 -9.2998 26.2998 -22.0996 30.8994c9.59961 -26.7998 -15.6006 -51.2998 -41.9004 -41.8994c4.59961 -12.7998 16.5 -22.1006 30.9004 -22.1006
c18.2998 0 33.0996 14.9004 33.0996 33.1006z" />
    <glyph glyph-name="hockey-puck" unicode="&#xf453;" 
d="M0 288c0 53 114.6 96 256 96s256 -43 256 -96s-114.6 -96 -256 -96s-256 43 -256 96zM0 205.8c113.5 -82.3994 398.6 -82.2998 512 0v-109.8c0 -53 -114.6 -96 -256 -96s-256 43 -256 96v109.8z" />
    <glyph glyph-name="quidditch" unicode="&#xf458;" horiz-adv-x="640" 
d="M256.5 231.2l86.7002 -109.2s-16.6006 -102.4 -76.6006 -150.1c-59.8994 -47.7002 -266.6 -34.1006 -266.6 -34.1006s3.7998 23.1006 11 55.4004l94.5996 112.2c4 4.69922 -0.899414 11.5996 -6.59961 9.5l-60.4004 -22.1006c14.4004 41.7002 32.7002 80 54.6006 97.5
c59.8994 47.7998 163.3 40.9004 163.3 40.9004zM494.5 96.2002c44 0 79.7998 -35.7002 79.7998 -79.9004c0 -44.0996 -35.7002 -79.8994 -79.7998 -79.8994s-79.7998 35.7998 -79.7998 79.8994c0 44.1006 35.7998 79.9004 79.7998 79.9004zM636.5 417
c5.5 -6.90039 4.40039 -17 -2.5 -22.5l-232.5 -177.9l34.0996 -42.8994c5.10059 -6.40039 1.7002 -15.9004 -6.2998 -17.6006l-58.7998 -12.3994l-86.7002 109.2l25.2998 54.5996c3.5 7.40039 13.5 8.59961 18.6006 2.2002l34.0996 -43l232.5 177.899
c6.90039 5.40039 16.9004 4.30078 22.4004 -2.59961z" />
    <glyph glyph-name="square-full" unicode="&#xf45c;" 
d="M512 -64h-512v512h512v-512z" />
    <glyph glyph-name="table-tennis" unicode="&#xf45d;" 
d="M496.2 151.5c-64.1006 43.2002 -149.5 27.9004 -195.601 -34.2002l-211.5 211.5l56 56.1006c83.9004 84.0996 220 84.0996 303.9 0c63 -63.1006 78.7002 -155.601 47.2002 -233.4zM278.3 71.7998c-3.7002 -12.7002 -6.2998 -25.8994 -6.2002 -39.7002
c0 -19.5 3.90039 -38.0996 11 -55.0996c-25.6992 2.7998 -50.5996 13.5996 -70.2998 33.2998l-35.7002 35.7002l-89.2998 -103.3c-7.5 -8.60059 -20.7002 -9.10059 -28.7002 -1l-53.3994 53.5c-8.10059 8.09961 -7.60059 21.2998 1 28.7998l103 89.4004l-34.5 34.5996
c-39 39.0996 -44.6006 98.7998 -17.2998 144.1zM416 128c53 0 96 -43 96 -96s-43 -96 -96 -96s-96 43 -96 96s43 96 96 96z" />
    <glyph glyph-name="volleyball-ball" unicode="&#xf45f;" 
d="M231.39 204.52c-60.8945 -37.4102 -126.348 -123.516 -146.1 -192.199c-20.248 19.1953 -45.7393 55.5283 -56.9004 81.0996c22.8008 94.4004 89.5 174.4 180.301 216.8c11.8887 -27.9648 22.0586 -75.3184 22.6992 -105.7zM194.49 338.92
c-84 -39.5 -149 -108.4 -182.4 -191.5c-19.7998 109.3 34 212.4 125 262.2c19.0098 -16.9424 44.7246 -48.6162 57.4004 -70.7002zM382.09 173.82c-30.1689 3.6709 -76.2686 18.5352 -102.899 33.1797c-1.9541 71.4844 -43.8428 171.263 -93.5 222.72
c47.2998 14 84.1992 10.2002 98.8994 8.5c70.2002 -66.8994 106.101 -164.6 97.5 -264.399zM257.39 164.32c49.7002 -26.8008 104 -40.8008 158.601 -40.9004c22.6787 0.140625 58.9219 4.7998 80.8994 10.4004c-6.55762 -27.2012 -25.4639 -67.4766 -42.1992 -89.9004
c-93 -27.2998 -195.5 -9.5 -277.5 47.7998c18.2803 24.2959 54.21 56.8213 80.1992 72.6006zM159.09 64.6201c53.6006 -37.2998 144 -78.2002 256.9 -62.1006c-38.1611 -32.3467 -109.732 -58.5986 -159.758 -58.5986c-38.5156 0 -96.416 16.3516 -129.242 36.499
c6.39941 29.7998 16.8994 58.2002 32.0996 84.2002zM339.39 425.22c95.9004 -34.2998 164.601 -125.6 164.601 -233.399c0 -2 -0.299805 -4 -0.299805 -6c-23.9658 -7.83887 -63.8799 -14.2012 -89.0947 -14.2012c-0.166992 0 -0.438477 0.000976562 -0.605469 0.000976562
c7.89941 92.3994 -19.2998 183.2 -74.6006 253.6z" />
    <glyph glyph-name="allergies" unicode="&#xf461;" horiz-adv-x="448" 
d="M416 336c17.5996 0 32 -14.4004 32 -32v-176.1c-0.200195 -14 -1.90039 -28.6006 -5.09961 -42.3008l-26.5 -112.699c-5.10059 -21.7002 -24.4004 -37 -46.7002 -37h-197.601c-15.2998 0 -29.7998 7.39941 -38.7998 19.7998l-125.6 172.7
c-13 17.8994 -9.10059 42.8994 8.7998 55.8994s42.9004 9.10059 55.9004 -8.7998l23.5996 -32.5v241c0 17.5996 14.4004 32 32 32s32 -14.4004 32 -32v-152c0 -4.40039 3.59961 -8 8 -8h16c4.40039 0 8 3.59961 8 8v184c0 17.5996 14.4004 32 32 32s32 -14.4004 32 -32v-184
c0 -4.40039 3.59961 -8 8 -8h16c4.40039 0 8 3.59961 8 8v152c0 17.5996 14.4004 32 32 32s32 -14.4004 32 -32v-152c0 -4.40039 3.59961 -8 8 -8h16c4.40039 0 8 3.59961 8 8v72c0 17.5996 14.4004 32 32 32zM176 32c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16
s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM176 128c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM240 0c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM240 96c8.7998 0 16 7.2002 16 16
s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM304 64c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM336 0c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM368 128
c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16z" />
    <glyph glyph-name="band-aid" unicode="&#xf462;" horiz-adv-x="640" 
d="M0 288c0 35.2998 28.7002 64 64 64h96v-320h-96c-35.2998 0 -64 28.7002 -64 64v192zM576 352c35.2998 0 64 -28.7002 64 -64v-192c0 -35.2998 -28.7002 -64 -64 -64h-96v320h96zM192 32v320h256v-320h-256zM368 264c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24
s24 10.7002 24 24s-10.7002 24 -24 24zM368 168c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24s-10.7002 24 -24 24zM272 264c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24s-10.7002 24 -24 24zM272 168
c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24s-10.7002 24 -24 24z" />
    <glyph glyph-name="box" unicode="&#xf466;" 
d="M509.5 263.4c0.799805 -2.40039 0.799805 -4.90039 1.2002 -7.40039h-238.7v192h141.4c20.6992 0 39 -13.2002 45.5 -32.7998zM240 448v-192h-238.7c0.400391 2.5 0.400391 5 1.2002 7.40039l50.5996 151.8c6.5 19.5996 24.8008 32.7998 45.5 32.7998h141.4zM0 224h512
v-240c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v240z" />
    <glyph glyph-name="boxes" unicode="&#xf468;" horiz-adv-x="576" 
d="M560 160c8.7998 0 16 -7.2002 16 -16v-192c0 -8.7998 -7.2002 -16 -16 -16h-224c-8.7998 0 -16 7.2002 -16 16v192c0 8.7998 7.2002 16 16 16h80v-96l32 21.2998l32 -21.2998v96h80zM176 224c-8.7998 0 -16 7.2002 -16 16v192c0 8.7998 7.2002 16 16 16h80v-96
l32 21.2998l32 -21.2998v96h80c8.7998 0 16 -7.2002 16 -16v-192c0 -8.7998 -7.2002 -16 -16 -16h-224zM240 160c8.7998 0 16 -7.2002 16 -16v-192c0 -8.7998 -7.2002 -16 -16 -16h-224c-8.7998 0 -16 7.2002 -16 16v192c0 8.7998 7.2002 16 16 16h80v-96l32 21.2998
l32 -21.2998v96h80z" />
    <glyph glyph-name="briefcase-medical" unicode="&#xf469;" 
d="M464 320c26.5 0 48 -21.5 48 -48v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h80v48c0 26.5 21.5 48 48 48h160c26.5 0 48 -21.5 48 -48v-48h80zM192 352v-32h128v32h-128zM352 104v48c0 4.40039 -3.59961 8 -8 8h-56v56
c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8v-56h-56c-4.40039 0 -8 -3.59961 -8 -8v-48c0 -4.40039 3.59961 -8 8 -8h56v-56c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8v56h56c4.40039 0 8 3.59961 8 8z" />
    <glyph glyph-name="burn" unicode="&#xf46a;" horiz-adv-x="384" 
d="M192 448c111.8 -100.9 192 -220.6 192 -300.5c0 -124.5 -79 -211.5 -192 -211.5s-192 87 -192 211.5c0 79.5996 79.7002 199.2 192 300.5zM192 0c56.5 0 96 39 96 94.7998c0 13.5 -4.59961 61.5 -96 161.2c-91.4004 -99.7002 -96 -147.7 -96 -161.2
c0 -55.7998 39.5 -94.7998 96 -94.7998z" />
    <glyph glyph-name="capsules" unicode="&#xf46b;" horiz-adv-x="576" 
d="M555.3 147.9c36.2002 -51.7002 23.7002 -123 -28 -159.2c-20 -14 -42.7998 -20.7002 -65.5 -20.7002c-36.0996 0 -71.5996 17 -93.7998 48.7998l-131.2 187.3c-5.5 7.90039 -9.5 16.4004 -12.7998 25v-149.1c0 -61.9004 -50.0996 -112 -112 -112s-112 50.0996 -112 112
v224c0 61.9004 50.0996 112 112 112c60 0 108.5 -47.2002 111.4 -106.5c7.7998 21 21.7998 40 41.5 53.7998c20 14 42.8994 20.7002 65.5 20.7002c36 0 71.5 -17 93.7998 -48.7998zM160 192v112c0 26.5 -21.5 48 -48 48s-48 -21.5 -48 -48v-112h96zM354.8 147.1
l82.5 57.7002l-65.5996 93.7002c-9.40039 13.5 -24.7998 21.5 -41.2998 21.5c-10.3008 0 -20.3008 -3.09961 -28.8008 -9.09961c-11 -7.7002 -18.3994 -19.3008 -20.6992 -32.5c-2.40039 -13.2002 0.599609 -26.6006 8.2998 -37.6006z" />
    <glyph glyph-name="clipboard-check" unicode="&#xf46c;" horiz-adv-x="384" 
d="M336 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h80c0 35.2998 28.7002 64 64 64s64 -28.7002 64 -64h80zM192 408c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24
s-10.7002 24 -24 24zM313.2 176.2c4.7002 4.7002 4.7998 12.2002 0.0996094 17l-28.2002 28.3994c-4.69922 4.7002 -12.2998 4.80078 -17 0.100586l-106 -105.2l-46 46.4004c-4.69922 4.69922 -12.2998 4.7998 -17 0.0996094l-28.3994 -28.2002
c-4.7002 -4.7002 -4.7998 -12.2998 -0.100586 -17l82.6006 -83.2998c4.7002 -4.7002 12.2998 -4.7998 17 -0.0996094z" />
    <glyph glyph-name="clipboard-list" unicode="&#xf46d;" horiz-adv-x="384" 
d="M336 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h80c0 35.2998 28.7002 64 64 64s64 -28.7002 64 -64h80zM96 24c13.2998 0 24 10.7002 24 24s-10.7002 24 -24 24s-24 -10.7002 -24 -24
s10.7002 -24 24 -24zM96 120c13.2998 0 24 10.7002 24 24s-10.7002 24 -24 24s-24 -10.7002 -24 -24s10.7002 -24 24 -24zM96 216c13.2998 0 24 10.7002 24 24s-10.7002 24 -24 24s-24 -10.7002 -24 -24s10.7002 -24 24 -24zM192 408c-13.2998 0 -24 -10.7002 -24 -24
s10.7002 -24 24 -24s24 10.7002 24 24s-10.7002 24 -24 24zM320 40v16c0 4.40039 -3.59961 8 -8 8h-144c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8zM320 136v16c0 4.40039 -3.59961 8 -8 8h-144
c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8zM320 232v16c0 4.40039 -3.59961 8 -8 8h-144c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h144c4.40039 0 8 3.59961 8 8z" />
    <glyph glyph-name="diagnoses" unicode="&#xf470;" horiz-adv-x="640" 
d="M496 192c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16s16 -7.2002 16 -16s-7.2002 -16 -16 -16zM320 272c-48.5 0 -88 39.5 -88 88s39.5 88 88 88s88 -39.5 88 -88s-39.5 -88 -88 -88zM59.7998 84l-17.7002 26.7002c-8.7998 13.2998 -7.59961 34.5996 10 45.0996
c7.40039 4.40039 17.5 10 28.7002 16c31.6006 -27.2998 79 -4.2002 79.2002 36c47.0996 17.7002 103 32.2002 160 32.2002c45.0996 0 89.2998 -9.2002 129.2 -21.7998c-11.7002 -52.9004 59.5996 -81.2002 87.7002 -35.1006
c21.3994 -10.3994 39.1992 -20.2998 51.0996 -27.3994c17.5996 -10.5 18.7998 -31.9004 10 -45.1006l-17.7998 -26.6992c-10.2002 -15.1006 -29.2998 -17.8008 -42.9004 -9.80078c-16.2002 9.60059 -56.2002 31.8008 -105.3 48.6006v-90.7002h-224v90.7998
c-49.0996 -16.8994 -89.0996 -39 -105.3 -48.5996c-13.6006 -8 -32.7002 -5.5 -42.9004 9.7998zM368 104c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24s-10.7002 24 -24 24zM272 200c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24
s24 10.7002 24 24s-10.7002 24 -24 24zM112 192c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16s16 -7.2002 16 -16s-7.2002 -16 -16 -16zM624 0c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-608c-8.7998 0 -16 7.2002 -16 16v32
c0 8.7998 7.2002 16 16 16h608z" />
    <glyph glyph-name="dna" unicode="&#xf471;" horiz-adv-x="448" 
d="M0.0996094 -46.0996c5.2002 42.8994 31.4004 153.899 159.9 238.1c-128.6 84.2002 -154.7 195.2 -159.9 238.1c-1.09961 9.5 6.40039 17.8008 16 17.8008l32.3008 0.0996094c8.09961 0.0996094 14.8994 -5.90039 16 -13.9004
c0.699219 -5 1.7998 -11.0996 3.39941 -18.0996h312.4c1.59961 7 2.7002 13.2002 3.39941 18.0996c1.10059 8 7.90039 13.9004 16 13.9004l32.4004 -0.0996094c9.59961 0 17 -8.30078 15.9004 -17.8008c-5.80078 -47.8994 -37.4004 -181.199 -209.5 -266.699
c-31.7002 -15.8008 -57.4004 -33.3008 -78.7002 -51.4004h127.6c-5.59961 4.7998 -10.7998 9.59961 -17 14.2002c21.4004 11.2002 40.9004 23 58.5 35.3994c93.2998 -78.6992 114.3 -169.8 118.9 -207.699c1.2002 -9.5 -6.2998 -17.8008 -15.9004 -17.8008
l-32.2998 -0.0996094c-8.09961 -0.0996094 -14.9004 5.90039 -16 13.9004c-0.599609 4.89941 -1.90039 11.1992 -3.5 18.0996h-312.3c-1.60059 -7 -2.7002 -13.2002 -3.40039 -18.0996c-1.09961 -8 -7.89941 -13.9004 -16 -13.9004l-32.2998 0.0996094
c-9.59961 0 -17 8.30078 -15.9004 17.8008zM224 228.4c25.0996 13.5996 46.4004 28.3994 64.2002 43.5996h-128.5c17.8994 -15.2002 39.2002 -29.9004 64.2998 -43.5996zM355.1 352h-262.1c5.7002 -10.4004 12.7002 -21.0996 21 -32h220.1
c8.2002 10.9004 15.2002 21.5996 21 32zM92.9004 32h261.6c-5.7998 10.4004 -12.9004 21.0996 -21.2002 32h-219.399c-8.2002 -10.9004 -15.2002 -21.5996 -21 -32z" />
    <glyph glyph-name="dolly" unicode="&#xf472;" horiz-adv-x="576" 
d="M294.2 170.3l-53 159.4c-2.7998 8.2998 1.7002 17.3994 10.0996 20.2002l61.6006 20.5l33.0996 -99.4004l60.7002 20.0996l-33.1006 99.4004l61.1006 20.4004c8.2998 2.7998 17.3994 -1.7002 20.2002 -10.1006l60.3994 -181.2
c2.7998 -8.2998 -1.7002 -17.3994 -10.0996 -20.1992l-161.5 -53.8008c-14.7998 11.3008 -31.5 19.7002 -49.5 24.7002zM575.2 121.6c2.7998 -8.39941 -1.7998 -17.3994 -10.1006 -20.1992l-213.3 -71.2002c-1.09961 -57.7998 -53.2002 -103.3 -113.399 -92.6006
c-39.4004 6.90039 -71.2002 39.8008 -77.3008 79.2002c-5.69922 36.9004 9.90039 70.1006 36 90.5l-92.1992 276.7h-88.9004c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h112c13.7998 0 26 -8.7998 30.4004 -21.9004l99.3994 -298.199
c29.9004 -0.600586 56.2998 -15 73.5 -37l213.5 71.1992c8.2998 2.80078 17.4004 -1.69922 20.2002 -10.0996zM256 -16c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48z" />
    <glyph glyph-name="dolly-flatbed" unicode="&#xf474;" horiz-adv-x="640" 
d="M208 128c-8.7998 0 -16 7.2002 -16 16v256c0 8.7998 7.2002 16 16 16h144v-128l48 32l48 -32v128h144c8.7998 0 16 -7.2002 16 -16v-256c0 -8.7998 -7.2002 -16 -16 -16h-384zM624 64c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-82.7998
c1.7002 -5 2.89941 -10.4004 2.89941 -16c0 -26.5 -21.5 -48 -48 -48s-48 21.5 -48 48c0 5.59961 1.10059 11 2.90039 16h-197.9c1.7002 -5 2.90039 -10.4004 2.90039 -16c0 -26.5 -21.5 -48 -48 -48s-48 21.5 -48 48c0 5.59961 1.09961 11 2.90039 16h-82.9004
c-8.7998 0 -16 7.2002 -16 16v368h-48c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h96c8.7998 0 16 -7.2002 16 -16v-368h496z" />
    <glyph glyph-name="file-medical" unicode="&#xf477;" horiz-adv-x="384" 
d="M377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7zM224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136z
M288 152c0 4.40039 -3.59961 8 -8 8h-56v56c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8v-56h-56c-4.40039 0 -8 -3.59961 -8 -8v-48c0 -4.40039 3.59961 -8 8 -8h56v-56c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8v56h56
c4.40039 0 8 3.59961 8 8v48z" />
    <glyph glyph-name="file-medical-alt" unicode="&#xf478;" horiz-adv-x="448" 
d="M288 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v168h70.0996l34.8008 -69.5c2.89941 -5.90039 11.3994 -5.90039 14.2998 0l56.7998 113.7l22.0996 -44.2002h89.9004c8.7998 0 16 7.2002 16 16
s-7.2002 16 -16 16h-70.2002l-34.7002 69.5c-2.89941 5.90039 -11.3994 5.90039 -14.2998 0l-56.7998 -113.7l-19.9004 39.7998c-1.39941 2.7002 -4.19922 4.40039 -7.19922 4.40039h-140.9c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h56v232
c0 13.2998 10.7002 24 24 24h200v-136zM441 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7z" />
    <glyph glyph-name="first-aid" unicode="&#xf479;" horiz-adv-x="576" 
d="M0 368c0 26.5 21.5 48 48 48h48v-448h-48c-26.5 0 -48 21.5 -48 48v352zM128 -32v448h320v-448h-320zM192 216v-48c0 -4.40039 3.59961 -8 8 -8h56v-56c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8v56h56c4.40039 0 8 3.59961 8 8v48
c0 4.40039 -3.59961 8 -8 8h-56v56c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8v-56h-56c-4.40039 0 -8 -3.59961 -8 -8zM528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-48v448h48z" />
    <glyph glyph-name="hospital-alt" unicode="&#xf47d;" horiz-adv-x="576" 
d="M544 352c17.7002 0 32 -14.2998 32 -32v-368c0 -8.7998 -7.2002 -16 -16 -16h-544c-8.7998 0 -16 7.2002 -16 16v368c0 17.7002 14.2998 32 32 32h128v64c0 17.7002 14.2998 32 32 32h192c17.7002 0 32 -14.2998 32 -32v-64h128zM160 12v40c0 6.59961 -5.40039 12 -12 12
h-40c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM160 140v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM320 12v40
c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM320 140v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40
c6.59961 0 12 5.40039 12 12zM336 310v20c0 3.2998 -2.7002 6 -6 6h-26v26c0 3.2998 -2.7002 6 -6 6h-20c-3.2998 0 -6 -2.7002 -6 -6v-26h-26c-3.2998 0 -6 -2.7002 -6 -6v-20c0 -3.2998 2.7002 -6 6 -6h26v-26c0 -3.2998 2.7002 -6 6 -6h20c3.2998 0 6 2.7002 6 6v26h26
c3.2998 0 6 2.7002 6 6zM480 12v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12zM480 140v40c0 6.59961 -5.40039 12 -12 12h-40c-6.59961 0 -12 -5.40039 -12 -12v-40
c0 -6.59961 5.40039 -12 12 -12h40c6.59961 0 12 5.40039 12 12z" />
    <glyph glyph-name="hospital-symbol" unicode="&#xf47e;" 
d="M256 448c141.4 0 256 -114.6 256 -256s-114.6 -256 -256 -256s-256 114.6 -256 256s114.6 256 256 256zM368 72v240c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8v-88h-96v88c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8v-240
c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8v88h96v-88c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8z" />
    <glyph glyph-name="id-card-alt" unicode="&#xf47f;" horiz-adv-x="576" 
d="M528 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h144v-96h192v96h144zM288 224c-35.2998 0 -64 -28.7002 -64 -64s28.7002 -64 64 -64s64 28.7002 64 64s-28.7002 64 -64 64zM381.3 0
c10.4004 0 18.7998 10 15.6006 19.7998c-8.40039 25.7002 -32.5 44.2002 -60.9004 44.2002h-8.2002c-12.2002 -5.09961 -25.7002 -8 -39.7998 -8s-27.5 2.90039 -39.7998 8h-8.2002c-28.5 0 -52.5996 -18.5996 -60.9004 -44.2002
c-3.19922 -9.7998 5.2002 -19.7998 15.6006 -19.7998h186.6zM352 416v-96h-128v96c0 17.7002 14.2998 32 32 32h64c17.7002 0 32 -14.2998 32 -32z" />
    <glyph glyph-name="notes-medical" unicode="&#xf481;" horiz-adv-x="384" 
d="M336 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h80c0 35.2998 28.7002 64 64 64s64 -28.7002 64 -64h80zM192 408c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24
s-10.7002 24 -24 24zM288 104v48c0 4.40039 -3.59961 8 -8 8h-56v56c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8v-56h-56c-4.40039 0 -8 -3.59961 -8 -8v-48c0 -4.40039 3.59961 -8 8 -8h56v-56c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8
v56h56c4.40039 0 8 3.59961 8 8zM288 296v16c0 4.40039 -3.59961 8 -8 8h-176c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h176c4.40039 0 8 3.59961 8 8z" />
    <glyph glyph-name="pallet" unicode="&#xf482;" horiz-adv-x="640" 
d="M144 192c-8.7998 0 -16 7.2002 -16 16v224c0 8.7998 7.2002 16 16 16h112v-128l64 32l64 -32v128h112c8.7998 0 16 -7.2002 16 -16v-224c0 -8.7998 -7.2002 -16 -16 -16h-352zM624 64h-48v-64h48c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-608
c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h48v64h-48c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h608c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16zM288 0v64h-160v-64h160zM512 0v64h-160v-64h160z" />
    <glyph glyph-name="pills" unicode="&#xf484;" horiz-adv-x="576" 
d="M112 416c61.9004 0 112 -50.0996 112 -112v-224c0 -61.9004 -50.0996 -112 -112 -112s-112 50.0996 -112 112v224c0 61.9004 50.0996 112 112 112zM160 192v112c0 26.5 -21.5 48 -48 48s-48 -21.5 -48 -48v-112h96zM299.7 221.7l210.8 -210.8
c3.5 -3.5 3.2002 -9.40039 -0.799805 -12.3008c-62.5 -45.2998 -150.101 -40.3994 -206.4 15.9004s-61.2002 143.9 -15.8994 206.4c2.89941 3.89941 8.7998 4.2998 12.2998 0.799805zM529.5 240.7c56.4004 -56.2998 61.2002 -143.8 15.9004 -206.4
c-2.90039 -3.89941 -8.80078 -4.2998 -12.3008 -0.799805l-210.8 210.8c-3.5 3.5 -3.2002 9.40039 0.799805 12.2998c62.5 45.3008 150.101 40.4004 206.4 -15.8994z" />
    <glyph glyph-name="prescription-bottle" unicode="&#xf485;" horiz-adv-x="384" 
d="M32 256v64h320v-352c0 -17.5996 -14.4004 -32 -32 -32h-256c-17.5996 0 -32 14.4004 -32 32v64h120c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-120v64h120c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-120v64h120c4.40039 0 8 3.59961 8 8v16
c0 4.40039 -3.59961 8 -8 8h-120zM360 448c13.2002 0 24 -10.7998 24 -24v-48c0 -13.2002 -10.7998 -24 -24 -24h-336c-13.2002 0 -24 10.7998 -24 24v48c0 13.2002 10.7998 24 24 24h336z" />
    <glyph glyph-name="prescription-bottle-alt" unicode="&#xf486;" horiz-adv-x="384" 
d="M360 448c13.2002 0 24 -10.7998 24 -24v-48c0 -13.2002 -10.7998 -24 -24 -24h-336c-13.2002 0 -24 10.7998 -24 24v48c0 13.2002 10.7998 24 24 24h336zM32 -32v352h320v-352c0 -17.5996 -14.4004 -32 -32 -32h-256c-17.5996 0 -32 14.4004 -32 32zM96 152v-48
c0 -4.40039 3.59961 -8 8 -8h56v-56c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8v56h56c4.40039 0 8 3.59961 8 8v48c0 4.40039 -3.59961 8 -8 8h-56v56c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8v-56h-56c-4.40039 0 -8 -3.59961 -8 -8z
" />
    <glyph glyph-name="procedures" unicode="&#xf487;" horiz-adv-x="640" 
d="M528 224c61.9004 0 112 -50.0996 112 -112v-160c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v48h-512v-48c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v352c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-240h192
v144c0 8.7998 7.2002 16 16 16h256zM136 352c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h140.9c3.09961 0 5.7998 -1.7002 7.19922 -4.40039l19.9004 -39.7998l49.7002 99.4004c5.89941 11.7998 22.7002 11.7998 28.5996 0l27.6006 -55.2002h102.1
c8.7998 0 16 -7.2002 16 -16s-7.2002 -16 -16 -16h-121.9l-22.0996 44.2002l-49.7002 -99.4004c-5.89941 -11.7998 -22.7002 -11.7998 -28.5996 0l-27.6006 55.2002h-126.1zM160 96c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64
s-28.7002 -64 -64 -64z" />
    <glyph glyph-name="shipping-fast" unicode="&#xf48b;" horiz-adv-x="640" 
d="M624 96c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-48c0 -53 -43 -96 -96 -96s-96 43 -96 96h-128c0 -53 -43 -96 -96 -96s-96 43 -96 96v128h152c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-208c-4.40039 0 -8 3.59961 -8 8v16
c0 4.40039 3.59961 8 8 8h240c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-208c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h240c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-272c-4.40039 0 -8 3.59961 -8 8v16
c0 4.40039 3.59961 8 8 8h56v48c0 26.5 21.5 48 48 48h256c26.5 0 48 -21.5 48 -48v-48h44.0996c12.7002 0 24.9004 -5.09961 33.9004 -14.0996l99.9004 -99.9004c9 -9 14.0996 -21.2002 14.0996 -33.9004v-108.1h16zM160 -16c26.5 0 48 21.5 48 48s-21.5 48 -48 48
s-48 -21.5 -48 -48s21.5 -48 48 -48zM480 -16c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM560 192v12.0996l-99.9004 99.9004h-44.0996v-112h144z" />
    <glyph glyph-name="smoking" unicode="&#xf48d;" horiz-adv-x="640" 
d="M632 96c4.40039 0 8 -3.59961 8 -8v-144c0 -4.40039 -3.59961 -8 -8 -8h-48c-4.40039 0 -8 3.59961 -8 8v144c0 4.40039 3.59961 8 8 8h48zM553.3 360.9c54.2998 -36.4004 86.7002 -97.1006 86.7002 -162.601v-30.2998c0 -4.40039 -3.59961 -8 -8 -8h-48
c-4.40039 0 -8 3.59961 -8 8v30.2998c0 50.2002 -25.2002 96.7002 -67.4004 124c-18.3994 12 -28.5996 33.4004 -28.5996 55.4004v62.2998c0 4.40039 3.59961 8 8 8h48c4.40039 0 8 -3.59961 8 -8v-62.2998c0 -6.7998 3.59961 -13 9.2998 -16.7998zM432 96
c8.7998 0 16 -7.2002 16 -16v-128c0 -8.7998 -7.2002 -16 -16 -16h-384c-26.5 0 -48 21.5 -48 48v64c0 26.5 21.5 48 48 48h384zM400 -16v64h-176v-64h176zM487.7 306.4c35.2998 -24.7002 56.2998 -64.8008 56.2998 -108.101v-30.2998c0 -4.40039 -3.59961 -8 -8 -8h-48
c-4.40039 0 -8 3.59961 -8 8v30.2998c0 27.4004 -13.2998 52.9004 -35.7002 68.6006c-35.7002 25.0996 -60.2998 63 -60.2998 106.699v66.4004c0 4.40039 3.59961 8 8 8h48c4.40039 0 8 -3.59961 8 -8v-62.2998c0 -29 15.7998 -54.7002 39.7002 -71.2998zM536 96
c4.40039 0 8 -3.59961 8 -8v-144c0 -4.40039 -3.59961 -8 -8 -8h-48c-4.40039 0 -8 3.59961 -8 8v144c0 4.40039 3.59961 8 8 8h48z" />
    <glyph glyph-name="syringe" unicode="&#xf48e;" 
d="M201.5 273.2l64.9004 65l135.699 -135.7l-181.899 -181.9c-17.5 -17.5996 -41.5 -25.5996 -65.4004 -23l-63.5996 7.10059l-66.2998 -66.2998c-3.10059 -3.10059 -8.2002 -3.10059 -11.3008 0l-11.2998 11.2998c-3.09961 3.09961 -3.09961 8.2002 0 11.2998
l66.4004 66.4004l-7.10059 63.5996c-2.59961 24.2998 5.7002 48.0996 23 65.4004l26.4004 26.3994l55.7998 -55.8994c3.10059 -3.10059 8.2002 -3.10059 11.2998 0l11.3008 11.2998c3.09961 3.09961 3.09961 8.2002 0 11.2998l-55.8008 55.7998l45.3008 45.2998
l55.6992 -55.7998c3.10059 -3.09961 8.2002 -3.09961 11.3008 0l11.2998 11.2998c3.09961 3.10059 3.09961 8.2002 0 11.3008zM509.7 366.5c3.09961 -3.2002 3.09961 -8.2002 0 -11.4004l-11.2998 -11.2998c-3.10059 -3.09961 -8.2002 -3.09961 -11.3008 0l-28.2998 28.2998
l-45.2998 -45.2998l73.5 -73.5c3.09961 -3.09961 3.09961 -8.2002 0 -11.2998l-33.9004 -34c-3.09961 -3.09961 -8.19922 -3.09961 -11.2998 0l-17 17l-135.7 135.9l-17 17c-3.09961 3.09961 -3.09961 8.19922 0 11.2998l33.9004 33.8994
c3.09961 3.10059 8.2002 3.10059 11.2998 0l17 -17l56.6006 -56.5996l45.2998 45.2998l-28.2998 28.2998c-3.10059 3.10059 -3.10059 8.2002 0 11.3008l11.2998 11.2998c3.09961 3.09961 8.2002 3.09961 11.2998 0z" />
    <glyph glyph-name="tablets" unicode="&#xf490;" horiz-adv-x="640" 
d="M160 256c81.0996 0 147.5 -58.5 160 -134.7c0.799805 -4.7998 -3.2998 -9.2998 -8.2998 -9.2998h-303.3c-5 0 -9.10059 4.5 -8.30078 9.2998c12.4004 76.2002 78.8008 134.7 159.9 134.7zM311.6 80c5 0 9.10059 -4.5 8.30078 -9.2998
c-12.4004 -76.2002 -78.8008 -134.7 -159.9 -134.7s-147.5 58.5 -159.9 134.7c-0.799805 4.7998 3.30078 9.2998 8.30078 9.2998h303.199zM593.4 401.4c56.5 -56.5 61.3994 -144.2 15.8994 -206.9c-2.7998 -4 -8.7998 -4.2998 -12.2998 -0.799805l-211.3 211.399
c-3.5 3.40039 -3.2002 9.40039 0.799805 12.3008c62.7002 45.3994 150.4 40.5 206.9 -16zM363 382.3l211.3 -211.3c3.5 -3.40039 3.2002 -9.40039 -0.799805 -12.2998c-62.7002 -45.5 -150.4 -40.6006 -206.9 15.8994c-56.3994 56.5 -61.2998 144.2 -15.8994 206.9
c2.7998 4 8.7998 4.2998 12.2998 0.799805z" />
    <glyph glyph-name="thermometer" unicode="&#xf491;" 
d="M476.8 427.6c49.4004 -40.6992 42.1006 -107.3 7.2002 -142.199l-254.2 -253.301h-99.8994l-89 -89c-9.30078 -9.39941 -24.5 -9.39941 -33.9004 0c-9.40039 9.30078 -9.40039 24.5 0 33.9004l89 89v100.9l45.2998 45.6992l50.1006 -50.1992
c3.09961 -3.10059 8.19922 -3.10059 11.2998 0l11.2998 11.2998c3.09961 3.09961 3.09961 8.2002 0 11.2998l-50.0996 50.2002l45.0996 45.3994l50.2998 -50.1992c3.10059 -3.10059 8.2002 -3.10059 11.2998 0l11.3008 11.2998c3.09961 3.09961 3.09961 8.2002 0 11.2998
l-50.3008 50.4004l45.1006 45.3994l50.3994 -50.5c3.10059 -3.09961 8.2002 -3.09961 11.3008 0l11.2998 11.2998c3.09961 3.10059 3.09961 8.2002 0 11.3008l-50.5 50.5l45.7002 46c36.3994 36.5 94.3994 40.8994 131.899 10.1992z" />
    <glyph glyph-name="vial" unicode="&#xf492;" horiz-adv-x="480" 
d="M477.7 261.9c3.09961 -3.10059 3.09961 -8.2002 0 -11.2002l-34 -33.9004c-3.10059 -3.09961 -8.2002 -3.09961 -11.2998 0l-11.2002 11.1006l-246.3 -245.7c-20.1006 -20.1006 -46.5 -30.1006 -72.9004 -30.1006c-28.9004 -0.0996094 -57.7998 11.9004 -78.4004 35.9004
c-35.6992 41.5 -29.3994 104.8 9.40039 143.5l242.4 241.9l-11.2002 11.0996c-3.10059 3.09961 -3.10059 8.2002 0 11.2998l34 33.9004c3.09961 3.09961 8.2002 3.09961 11.2998 0zM318 192l69.5 69.4004l-78.5 78.2998l-148 -147.7h157z" />
    <glyph glyph-name="vials" unicode="&#xf493;" horiz-adv-x="640" 
d="M72 384c-4.40039 0 -8 3.59961 -8 8v48c0 4.40039 3.59961 8 8 8h208c4.40039 0 8 -3.59961 8 -8v-48c0 -4.40039 -3.59961 -8 -8 -8h-24v-240c0 -44.0996 -35.9004 -80 -80 -80s-80 35.9004 -80 80v240h-24zM144 384v-96h64v96h-64zM624 0c8.7998 0 16 -7.2002 16 -16
v-32c0 -8.7998 -7.2002 -16 -16 -16h-608c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h608zM360 384c-4.40039 0 -8 3.59961 -8 8v48c0 4.40039 3.59961 8 8 8h208c4.40039 0 8 -3.59961 8 -8v-48c0 -4.40039 -3.59961 -8 -8 -8h-24v-240
c0 -44.0996 -35.9004 -80 -80 -80s-80 35.9004 -80 80v240h-24zM432 384v-96h64v96h-64z" />
    <glyph glyph-name="warehouse" unicode="&#xf494;" horiz-adv-x="640" 
d="M504 96c4.40039 0 8 -3.59961 8 -8v-48c0 -4.40039 -3.59961 -8 -8 -8h-367.7c-4.39941 0 -8 3.59961 -8 8l0.100586 48c0 4.40039 3.59961 8 8 8h367.6zM504 0c4.40039 0 8 -3.59961 8 -8v-48c0 -4.40039 -3.59961 -8 -8 -8h-368c-4.40039 0 -8 3.59961 -8 8
l0.0996094 48c0 4.40039 3.60059 8 8 8h367.9zM504 192c4.40039 0 8 -3.59961 8 -8v-48c0 -4.40039 -3.59961 -8 -8 -8h-367.5c-4.40039 0 -8 3.59961 -8 8l0.0996094 48c0 4.40039 3.60059 8 8 8h367.4zM610.5 331c17.7998 -7.5 29.5 -24.9004 29.5 -44.2998v-342.7
c0 -4.40039 -3.59961 -8 -8 -8h-80c-4.40039 0 -8 3.59961 -8 8v248c0 17.5996 -14.5996 32 -32.5996 32h-382.801c-18 0 -32.5996 -14.4004 -32.5996 -32v-248c0 -4.40039 -3.59961 -8 -8 -8h-80c-4.40039 0 -8 3.59961 -8 8v342.7c0 19.3994 11.7002 36.7998 29.5 44.2998
l272 113.3c4.89062 2.0293 13.1553 3.6748 18.4502 3.6748c5.29395 0 13.5596 -1.64551 18.4502 -3.6748z" />
    <glyph glyph-name="weight" unicode="&#xf496;" 
d="M448 384c35.29 0 64 -28.71 64 -64v-320c0 -35.29 -28.71 -64 -64 -64h-384c-35.29 0 -64 28.71 -64 64v320c0 35.29 28.71 64 64 64h25.9805c-16.4209 -28.2803 -25.9805 -61.0098 -25.9805 -96c0 -105.87 86.1299 -192 192 -192s192 86.1299 192 192
c0 34.9902 -9.55957 67.7197 -25.9805 96h25.9805zM256 128c-88.3701 0 -160 71.6299 -160 160s71.6299 160 160 160s160 -71.6299 160 -160s-71.6299 -160 -160 -160zM255.7 279.94c-21.9404 -0.170898 -39.7002 -17.96 -39.7002 -39.9404c0 -22.0898 17.9102 -40 40 -40
s40 17.9102 40 40c0 10.5498 -4.26953 20 -10.9502 27.1602l33.6699 78.5498c3.4707 8.11035 -0.290039 17.5205 -8.41016 21c-8.08984 3.50977 -17.5293 -0.240234 -21.0293 -8.41016z" />
    <glyph glyph-name="x-ray" unicode="&#xf497;" horiz-adv-x="640" 
d="M240 64c8.7998 0 16 -7.2002 16 -16s-7.2002 -16 -16 -16s-16 7.2002 -16 16s7.2002 16 16 16zM400 32c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16s16 -7.2002 16 -16s-7.2002 -16 -16 -16zM624 448c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16
h-608c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h608zM624 0c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-608c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h48v352h512v-352h48zM480 200v16c0 4.40039 -3.59961 8 -8 8
h-136v32h104c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-104v24c0 4.40039 -3.59961 8 -8 8h-16c-4.40039 0 -8 -3.59961 -8 -8v-24h-104c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h104v-32h-136c-4.40039 0 -8 -3.59961 -8 -8v-16
c0 -4.40039 3.59961 -8 8 -8h136v-32h-104c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h104v-32h-64c-26.5 0 -48 -21.5 -48 -48s21.5 -48 48 -48s48 21.5 48 48v16h64v-16c0 -26.5 21.5 -48 48 -48s48 21.5 48 48s-21.5 48 -48 48h-64v32h104
c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-104v32h136c4.40039 0 8 3.59961 8 8z" />
    <glyph glyph-name="box-open" unicode="&#xf49e;" horiz-adv-x="640" 
d="M425.7 192c4.5 0 9 0.599609 13.2998 1.90039l137 39.0996v-178c0 -14.5996 -10 -27.4004 -24.2002 -31l-216.399 -54.0996c-10.1006 -2.5 -20.8008 -2.5 -31 0l-216.2 54.0996c-14.2002 3.5 -24.2002 16.2998 -24.2002 31v178l137 -39.2002
c4.2998 -1.2998 8.7998 -1.89941 13.2998 -1.89941c16.9004 0 32.7998 9 41.5 23.5l64.2002 106.6l64.2998 -106.6c8.60059 -14.4004 24.5 -23.4004 41.4004 -23.4004zM638.3 304.2c4.5 -9.2002 -0.299805 -20.2002 -10.2002 -23.1006l-197.899 -56.5
c-7.10059 -2 -14.7002 1 -18.5 7.30078l-91.7002 152.1l250.1 31.9004c6.90039 0.899414 13.6006 -2.7002 16.7002 -8.90039zM53.2002 407c3.09961 6.2002 9.7002 9.7002 16.5996 8.90039l250.2 -31.9004l-91.7998 -152c-3.7998 -6.2998 -11.4004 -9.2998 -18.5 -7.2998
l-197.9 56.5c-9.7998 2.7998 -14.7002 13.7998 -10.0996 23z" />
    <glyph glyph-name="comment-dots" unicode="&#xf4ad;" 
d="M256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-38.4004 0 -74.7002 7.09961 -107.4 19.4004c-24.5996 -19.6006 -74.2998 -51.4004 -140.6 -51.4004c-3.2002 0 -6 1.7998 -7.2998 4.7998s-0.700195 6.40039 1.5 8.7002
c0.5 0.5 42.2998 45.4004 54.7998 95.7998c-35.5996 35.7002 -57 81.1006 -57 130.7c0 114.9 114.6 208 256 208zM128 176c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM256 176c17.7002 0 32 14.2998 32 32
s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM384 176c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="comment-slash" unicode="&#xf4b3;" horiz-adv-x="640" 
d="M64 208c0 18.5996 3.2998 36.5 8.90039 53.5996l325.5 -251.6c-24.7002 -6.40039 -51 -10 -78.4004 -10c-38.4004 0 -74.7002 7.09961 -107.4 19.4004c-24.5996 -19.6006 -74.2998 -51.4004 -140.6 -51.4004c-3.2002 0 -6 1.90039 -7.2998 4.7998
c-1.2998 3 -0.700195 6.40039 1.5 8.7002c0.5 0.599609 42.2002 45.5 54.7998 95.7998c-35.5996 35.7002 -57 81.1006 -57 130.7zM633.8 -10.0996c7 -5.40039 8.2998 -15.5 2.90039 -22.3008l-19.6006 -25.2998c-5.5 -7 -15.5 -8.2002 -22.5 -2.7998l-588.399 454.7
c-7 5.39941 -8.2002 15.3994 -2.7998 22.3994l19.5996 25.2002c5.5 7 15.5 8.2002 22.5 2.7998l105.1 -81.2998c45.2002 32.6006 104.301 52.7002 169.4 52.7002c141.4 0 256 -93.0996 256 -208c0 -49.2002 -21.4004 -94.0996 -56.5996 -129.7z" />
    <glyph glyph-name="couch" unicode="&#xf4b8;" horiz-adv-x="640" 
d="M160 224c0 35.2998 -28.7002 64 -64 64h-32c0 53 43 96 96 96h320c53 0 96 -43 96 -96h-32c-35.2998 0 -64 -28.7002 -64 -64v-64h-320v64zM576 256c35.2998 0 64 -28.7002 64 -64c0 -23.5996 -13 -44 -32 -55.0996v-120.9c0 -8.7998 -7.2002 -16 -16 -16h-64
c-8.7998 0 -16 7.2002 -16 16v16h-384v-16c0 -8.7998 -7.2002 -16 -16 -16h-64c-8.7998 0 -16 7.2002 -16 16v120.9c-19 11.0996 -32 31.5 -32 55.0996c0 35.2998 28.7002 64 64 64h32c17.7002 0 32 -14.2998 32 -32v-96h384v96c0 17.7002 14.2998 32 32 32h32z" />
    <glyph glyph-name="donate" unicode="&#xf4b9;" 
d="M256 32c-114.9 0 -208 93.0996 -208 208s93.0996 208 208 208s208 -93.0996 208 -208s-93.0996 -208 -208 -208zM233.8 350.6c-32.7002 -0.899414 -59 -28.3994 -59.0996 -62.3994c0 -27.7002 18 -52.4004 43.7002 -60.1006l62.2998 -18.6992
c7.09961 -2.10059 12.0996 -9.40039 12.0996 -17.6006c0 -10.0996 -7.2998 -18.2998 -16.2998 -18.2998h-38.9004c-6.39941 0 -12.3994 1.7002 -17.7998 5.09961c-4.5 2.80078 -10.2002 2.7002 -14 -1l-16.2998 -15.5c-5 -4.7998 -4.40039 -13 1.2002 -17.0996
c12.5 -9.2998 27.5 -14.5996 43 -15.4004v-17c0 -9.19922 7.39941 -16.5996 16.5996 -16.5996h11.1006c9.19922 0 16.5996 7.40039 16.5996 16.5996v16.8008c32.7002 0.899414 59.0996 28.3994 59.0996 62.3994c0 27.7002 -18 52.4004 -43.6992 60.1006l-62.3008 18.6992
c-7.09961 2.10059 -12.0996 9.40039 -12.0996 17.6006c0 10.0996 7.2998 18.2998 16.2998 18.2998h38.9004c6.39941 0 12.3994 -1.7002 17.7998 -5.09961c4.5 -2.80078 10.2002 -2.7002 14 1l16.2998 15.5c5 4.7998 4.40039 13 -1.2002 17.0996
c-12.5 9.2998 -27.5 14.5996 -43 15.4004v17c0 9.19922 -7.39941 16.5996 -16.5996 16.5996h-11.0996c-9.2002 0 -16.6006 -7.40039 -16.6006 -16.5996v-16.8008zM480 96c17.7002 0 32 -14.2998 32 -32v-96c0 -17.7002 -14.2998 -32 -32 -32h-448
c-17.7002 0 -32 14.2998 -32 32v96c0 17.7002 14.2998 32 32 32h32.4004c19.6992 -26 44.5996 -47.7002 73 -64h-63.8008c-5.2998 0 -9.59961 -3.59961 -9.59961 -8v-16c0 -4.40039 4.2998 -8 9.59961 -8h364.7c5.2998 0 9.60059 3.59961 9.60059 8v16
c0 4.40039 -4.30078 8 -9.60059 8h-63.7998c28.4004 16.2998 53.4004 38 73 64h32.5z" />
    <glyph glyph-name="dove" unicode="&#xf4ba;" 
d="M288 280.8c-50.7998 10.5 -96.5996 36.7998 -130.8 75.1006c11.2002 32.3994 27.7998 61.5996 48.8994 86.5c8.80078 10.5 25.7002 5.19922 27.8008 -8.30078c7 -45.8994 25.8994 -88.8994 54.0996 -125.199v-28.1006zM400 384h112l-32 -64v-160.1
c0 -88.4004 -71.5996 -159.9 -160 -159.9h-76.9004l-65.1992 -56.0996c-6.10059 -5.30078 -14.1006 -8.2002 -22.1006 -7.90039c-92.7998 3.7998 -135.8 49.4004 -153.2 76.2998c-6 9.2998 -1.19922 21.7002 9.5 24.4004l143.9 36
c-12.7998 9.59961 -25.7002 20.0996 -38.9004 32.7998c-51 49 -85.0996 115.1 -85.0996 185.9c0 41.3994 9.40039 80.5996 26 115.699c5.7998 12.3008 23.5 11.6006 29 -0.899414c40 -91.2002 128.6 -155.5 233 -161.7v59.4004c0 44.1992 35.7998 80.0996 80 80.0996z
M400 287.9c8.7998 0 16 7.19922 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16z" />
    <glyph glyph-name="hand-holding" unicode="&#xf4bd;" horiz-adv-x="576" 
d="M565.3 119.9c15.1006 -13.6006 13.9004 -36.8008 -1.2998 -48.9004l-151.2 -121c-11.3994 -9.09961 -25.5 -14 -40 -14h-356.8c-8.7998 0 -16 7.2002 -16 16v96c0 8.7998 7.2002 16 16 16h55.4004l46.5 37.7002c21 17 47.0996 26.2998 74.0996 26.2998h160
c19.5 0 34.9004 -17.4004 31.5996 -37.4004c-2.59961 -15.6992 -17.3994 -26.5996 -33.2998 -26.5996h-78.2998c-8.7998 0 -16 -7.2002 -16 -16s7.2002 -16 16 -16h118.3c14.6006 0 28.7002 4.90039 40 14l92.4004 73.9004c12.3994 10 30.7998 10.6992 42.5996 0z" />
    <glyph glyph-name="hand-holding-heart" unicode="&#xf4be;" horiz-adv-x="576" 
d="M275.3 197.5l-108.899 114.2c-31.6006 33.2002 -29.7002 88.2002 5.59961 118.8c30.7998 26.7002 76.7002 21.9004 104.9 -7.7998l11.0996 -11.6006l11.2002 11.7002c28.2002 29.6006 74.0996 34.4004 104.899 7.7002c35.4004 -30.5996 37.2002 -85.5996 5.60059 -118.8
l-108.9 -114.2c-7.09961 -7.40039 -18.5 -7.40039 -25.5 0zM565.3 119.9c15.1006 -13.6006 13.9004 -36.8008 -1.2998 -48.9004l-151.2 -121c-11.3994 -9.09961 -25.5 -14 -40 -14h-356.8c-8.7998 0 -16 7.2002 -16 16v96c0 8.7998 7.2002 16 16 16h55.4004l46.5 37.7002
c21 17 47.0996 26.2998 74.0996 26.2998h160c19.5 0 34.9004 -17.4004 31.5996 -37.4004c-2.59961 -15.6992 -17.3994 -26.5996 -33.2998 -26.5996h-78.2998c-8.7998 0 -16 -7.2002 -16 -16s7.2002 -16 16 -16h118.3c14.6006 0 28.7002 4.90039 40 14l92.4004 73.9004
c12.3994 10 30.7998 10.6992 42.5996 0z" />
    <glyph glyph-name="hand-holding-usd" unicode="&#xf4c0;" horiz-adv-x="576" 
d="M271.06 303.7c-24.0596 6.39941 -43.4297 24.7002 -46.5693 47.7002c-4.33984 32 20.6201 59.3994 53.5098 63v17.5996c0 8.7998 7.82031 16 17.3701 16h17.3701c9.5498 0 17.3701 -7.2002 17.3701 -16v-17.7197c10.2324 -1.05566 25.6982 -6.20801 34.5195 -11.5
c3.05469 -1.83984 5.53418 -6.22656 5.53418 -9.79199c0 -1.78516 -0.758789 -4.46777 -1.69434 -5.98828c-0.490234 -0.808594 -1.46191 -1.97266 -2.16992 -2.59961l-19 -17.5c-4.01953 -3.7002 -10.0693 -4.2002 -15.2998 -2
c-2.98145 1.20898 -8.0127 2.19434 -11.2305 2.19922h-35.5996c-5.03027 0 -9.12012 -3.7998 -9.12012 -8.39941c0.112305 -3.6416 3.08301 -7.27051 6.62988 -8.10059l54.2705 -14.2998c24.0996 -6.39941 43.4102 -24.7002 46.5596 -47.7002
c4.33984 -32 -20.5693 -59.3994 -53.5 -63v-17.5996c0 -8.7998 -7.83008 -16 -17.3799 -16h-17.3701c-9.54004 0 -17.3701 7.2002 -17.3701 16v17.7002c-10.2305 1.05566 -25.6904 6.20703 -34.5098 11.5c-3.06348 1.83594 -5.54883 6.22363 -5.54883 9.79492
c0 1.77051 0.74707 4.43359 1.66895 5.94531c0.510742 0.827148 1.51855 2.01953 2.25 2.65918l19 17.5c4.01953 3.7002 10.0596 4.2002 15.2998 2c2.9707 -1.20508 7.98438 -2.19043 11.1904 -2.19922h35.5996c5.03027 0 9.12012 3.7998 9.12012 8.39941
c-0.112305 3.6416 -3.08203 7.27051 -6.62988 8.10059zM565.27 119.9c5.92383 -5.26953 10.7432 -15.9814 10.7432 -23.9102c0 -8.49121 -5.38184 -19.6865 -12.0127 -24.9902l-151.23 -121c-9.67188 -7.72754 -27.5693 -14 -39.9492 -14h-0.0507812h-356.77
c-8.83203 0 -16 7.16797 -16 16v96c0 8.83203 7.16797 16 16 16h55.4004l46.5 37.71c17.8789 14.5059 51.0762 26.2842 74.0996 26.29h160v0c17.6309 0 31.9668 -14.3096 32 -31.9404v-0.120117c0 -1.48438 -0.206055 -3.87695 -0.459961 -5.33984
c-2.54004 -15.6992 -17.3496 -26.5996 -33.25 -26.5996h-78.29c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16h118.27h0.176758c12.3496 0 30.1904 6.27148 39.8232 14l92.4004 73.9004c12.4004 10 30.7998 10.6992 42.5996 0z" />
    <glyph glyph-name="hand-holding-water" unicode="&#xf4c1;" horiz-adv-x="576" 
d="M288 192c-53 0 -96 42.0996 -96 94c0 40 57.0996 120.7 83.2002 155.6c6.39941 8.5 19.2002 8.5 25.5996 0c26.1006 -34.8994 83.2002 -115.6 83.2002 -155.6c0 -51.9004 -43 -94 -96 -94zM565.3 119.9c15.1006 -13.6006 13.9004 -36.8008 -1.2998 -48.9004l-151.2 -121
c-11.3994 -9.09961 -25.5 -14 -40 -14h-356.8c-8.7998 0 -16 7.2002 -16 16v96c0 8.7998 7.2002 16 16 16h55.4004l46.5 37.7002c21 17 47.0996 26.2998 74.0996 26.2998h160c19.5 0 34.9004 -17.4004 31.5996 -37.4004
c-2.59961 -15.6992 -17.3994 -26.5996 -33.2998 -26.5996h-78.2998c-8.7998 0 -16 -7.2002 -16 -16s7.2002 -16 16 -16h118.3c14.6006 0 28.7002 4.90039 40 14l92.4004 73.9004c12.3994 10 30.7998 10.6992 42.5996 0z" />
    <glyph glyph-name="hands" unicode="&#xf4c2;" horiz-adv-x="640" 
d="M204.8 217.6l57.6006 -76.7998c16.5996 -22.2002 25.5996 -49.0996 25.5996 -76.7998v-112c0 -8.7998 -7.2002 -16 -16 -16h-131.7c-7.2002 0 -13.5 4.7002 -15.2998 11.5996c-2 7.80078 -5.40039 15.2002 -10.4004 21.7002l-104.1 134.3
c-6.7998 8.5 -10.5 19.1006 -10.5 30v218.4c0 17.7002 14.2998 32 32 32s32 -14.2998 32 -32v-148.4l89.7998 -107.8c6 -7.2998 16.9004 -7.7998 23.6006 -1.09961l12.7998 12.7998c5.59961 5.59961 6.2998 14.5 1.5 20.9004l-38.1006 50.7998
c-10.5996 14.0996 -7.69922 34.2002 6.40039 44.7998s34.2002 7.7002 44.7998 -6.40039zM608 384c17.7002 0 32 -14.2998 32 -32v-218.4c0 -10.8994 -3.7002 -21.5 -10.5 -30l-104.1 -134.3c-5 -6.5 -8.40039 -13.8994 -10.4004 -21.7002
c-1.7998 -6.89941 -8.2002 -11.5996 -15.2998 -11.5996h-131.7c-8.7998 0 -16 7.2002 -16 16v112c0 27.7002 9 54.5996 25.5996 76.7998l57.6006 76.7998c10.5996 14.1006 30.7002 17 44.7998 6.40039s17 -30.7002 6.40039 -44.7998l-38.1006 -50.7998
c-4.7998 -6.40039 -4.09961 -15.3008 1.5 -20.9004l12.7998 -12.7998c6.60059 -6.60059 17.6006 -6.10059 23.6006 1.09961l89.7998 107.8v148.4c0 17.7002 14.2998 32 32 32z" />
    <glyph glyph-name="hands-helping" unicode="&#xf4c4;" horiz-adv-x="640" 
d="M488 256c13.2998 0 24 -10.7002 24 -24v-48c0 -13.2998 -10.7002 -24 -24 -24h-8v-64c0 -17.7002 -14.2998 -32 -32 -32h-16c0 -35.2998 -28.7002 -64 -64 -64h-136.6l-103.4 -59.7002c-15.2998 -8.7998 -34.9004 -3.59961 -43.7002 11.7002l-80 138.6
c-8.89941 15.3008 -3.59961 34.9004 11.7002 43.7002l80 46.2002v47.2998c0 22.4004 11.7998 43.2998 31.0996 54.7998l64.9004 39v-121.6c0 -39.7002 32.2998 -72 72 -72s72 32.2998 72 72v56h152zM635.7 293.4c8.7998 -15.3008 3.59961 -34.8008 -11.7002 -43.7002
l-80 -46.2002v28.5c0 30.9004 -25.0996 56 -56 56h-184v-88c0 -22.0996 -17.9004 -40 -40 -40s-40 17.9004 -40 40v126.3c0 11 5.59961 21.2998 15 27.1006l33.5 20.8994c10.2002 6.2998 21.9004 9.7002 33.9004 9.7002h102.199l103.4 59.7002
c15.2998 8.7998 34.9004 3.59961 43.7002 -11.7002z" />
    <glyph glyph-name="parachute-box" unicode="&#xf4cd;" 
d="M511.9 273c1.09961 -9.2002 -6.80078 -17 -16.1006 -17h-8.7002l-136.8 -151.9c0.700195 -2.69922 1.60059 -5.19922 1.60059 -8.09961v-128c0 -17.7002 -14.3008 -32 -32 -32h-128c-17.7002 0 -32 14.2998 -32 32v128c0 2.90039 0.899414 5.5 1.59961 8.09961
l-136.7 151.9h-8.7002c-9.19922 0 -17.0996 7.90039 -16 17c9.10059 75.5 78.4004 132.3 158.301 158.7c-36.4004 -39.4004 -62.4004 -100.601 -62.4004 -175.7h-28.0996l116.6 -129.5c2.5 0.599609 4.7998 1.5 7.5 1.5h48v128h-112c0 115.2 68.9004 192 128 192
s128 -76.7998 128 -192h-112v-128h48c2.7002 0 5 -0.900391 7.5 -1.5l116.6 129.5h-28.0996c0 75.0996 -26 136.3 -62.4004 175.7c79.9004 -26.2998 149.2 -83.1006 158.301 -158.7z" />
    <glyph glyph-name="people-carry" unicode="&#xf4ce;" horiz-adv-x="640" 
d="M128 352c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM512 352c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM637.7 -20.0996c6.59961 -16.4004 -1.40039 -35 -17.7998 -41.6006
c-3.90039 -1.59961 -7.90039 -2.2998 -11.9004 -2.2998c-12.7002 0 -24.7002 7.59961 -29.7002 20.0996l-27.7002 69.2002l2 18.2002l41.1006 46.4004zM603.5 189.7c4.59961 -20 -0.799805 -41.2002 -14.4004 -56.7002l-67.1992 -75.9004l-10.1006 -92.5996
c-1.7998 -16.4004 -15.7002 -28.5 -31.7998 -28.5c-1.2002 0 -2.2998 0.0996094 -3.5 0.200195c-17.5 1.89941 -30.2002 17.7002 -28.2998 35.2998l10.0996 92.7998c1.5 13 6.90039 25.1006 15.6006 35l43.2998 49l-17.6006 70.2998l-6.7998 -20.3994
c-4.09961 -12.6006 -11.8994 -23.4004 -24.5 -32.6006l-51.0996 -32.5c-4.60059 -2.89941 -12.1006 -4.59961 -17.2002 -5h-160c-5.09961 0.400391 -12.5996 2.10059 -17.2002 5l-51.0996 32.5c-12.6006 9.2002 -20.4004 20.1006 -24.5 32.6006l-6.7998 20.3994
l-17.6006 -70.2998l43.2998 -49c8.7002 -9.89941 14.1006 -22 15.6006 -35l10.0996 -92.7998c1.90039 -17.5996 -10.7002 -33.4004 -28.2998 -35.2998c-1.2002 -0.100586 -2.2998 -0.200195 -3.5 -0.200195c-16.2002 0 -30 12.2002 -31.7998 28.5l-10.1006 92.5996
l-67.1992 75.9004c-13.7002 15.5 -19 36.7002 -14.4004 56.7002l18.4004 80.2002c4.59961 20 18.5996 36.7998 37.5 44.8994c18.5 8 38.8994 6.7002 56.0996 -3.2998c22.7002 -13.4004 39.7998 -34.4004 48.0996 -59.4004l11.3008 -33.8994l16.0996 -10.2002v96
c0 8.7998 7.2002 16 16 16h160c8.7998 0 16 -7.2002 16 -16v-96l16 10.2002l11.2998 33.8994c8.40039 24.9004 25.4004 46 48.1006 59.4004c17.0996 10 37.5996 11.2998 56.0996 3.2998c18.9004 -8.09961 32.9004 -24.8994 37.5 -44.8994zM46.2998 89.9004l41.1006 -46.4004
l2 -18.2002l-27.7002 -69.2002c-6.5 -16.0996 -24.7998 -24.3994 -41.6006 -17.7998c-16.3994 6.60059 -24.3994 25.2002 -17.7998 41.6006z" />
    <glyph glyph-name="piggy-bank" unicode="&#xf4d3;" horiz-adv-x="576" 
d="M560 224c8.7998 0 16 -7.2002 16 -16v-128c0 -8.7998 -7.2002 -16 -16 -16h-48.7002c-9 -11.9004 -19.5 -22.4004 -31.2998 -31.2998v-80.7002c0 -8.7998 -7.2002 -16 -16 -16h-64c-8.7998 0 -16 7.2002 -16 16v48h-128v-48c0 -8.7998 -7.2002 -16 -16 -16h-64
c-8.7998 0 -16 7.2002 -16 16v80.7002c-38.5996 29.2002 -64 75.0996 -64 127.3h-40c-33.2998 0 -59.9004 29.2002 -55.5 63.4004c3.59961 28.1992 29 48.5996 57.5 48.5996c3.2998 0 6 -2.7002 6 -6v-20c0 -3.2998 -2.7002 -6 -6 -6h-1
c-11.5996 0 -22.2998 -7.7998 -24.5 -19.2002c-3 -15.2998 8.7002 -28.7998 23.5 -28.7998h43.2002c14.8994 73 79.3994 128 156.8 128h128c7.90039 0 15.4004 -1.2002 23 -2.2998c17.5996 20.7998 43.5996 34.2998 73 34.2998h32l-18.9004 -75.5
c15.8008 -14.7998 28.6006 -32.5 37.4004 -52.5h29.5zM432 160c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM256 352c-16.4004 0 -32.2002 -2.2998 -47.4004 -6.2002c-0.0996094 2.10059 -0.599609 4.10059 -0.599609 6.2002
c0 53 43 96 96 96s96 -43 96 -96c0 -0.299805 -0.0996094 -0.5 -0.0996094 -0.799805c-5.2002 0.399414 -10.5 0.799805 -15.9004 0.799805h-128z" />
    <glyph glyph-name="ribbon" unicode="&#xf4d6;" horiz-adv-x="448" 
d="M6.09961 3.7002l117.2 130l79.2002 -87.9004l-91.7998 -101.899c-8 -8.80078 -21.4004 -10.5 -31.2998 -3.80078l-68.8008 27.9004c-12 8.09961 -14.0996 24.9004 -4.5 35.7002zM441.9 3.7002c9.69922 -10.7998 7.59961 -27.6006 -4.30078 -35.6006l-68.7998 -27.8994
c-9.89941 -6.7002 -23.2998 -5.10059 -31.2998 3.7998l-248.1 275.3c-48.6006 53.7998 -13 113.5 -11.5 116l43.5996 73.2002c4.2998 7.2002 9.90039 13.2998 16.7998 18c44 29.7002 130.7 27.5996 171.4 0c6.89941 -4.7002 12.5 -10.7998 16.7998 -18l43.7002 -73.5
c21.8994 -36.9004 17.2998 -83.5996 -11.4004 -115.5l-34.2002 -38l-79.0996 87.7002s52.7002 59 56 64.5996c-15.4004 8.40039 -40.2002 17.9004 -77.5 17.9004s-62.0996 -9.5 -77.5 -17.9004c3.40039 -5.5 295.4 -330.1 295.4 -330.1z" />
    <glyph glyph-name="route" unicode="&#xf4d7;" 
d="M416 128c52.9004 0 96 -43.0996 96 -96s-43.0996 -96 -96 -96h-277.8c13.5 16.2998 31.2998 39.2002 47.2998 64h230.5c17.5996 0 32 14.4004 32 32s-14.4004 32 -32 32h-96c-52.9004 0 -96 43.0996 -96 96s43.0996 96 96 96h45.2998
c-23.0996 32.5996 -45.2998 70.5 -45.2998 96c0 53 43 96 96 96s96 -43 96 -96s-96 -160 -96 -160h-96c-17.5996 0 -32 -14.4004 -32 -32s14.4004 -32 32 -32h96zM416 384c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32zM96 192
c53 0 96 -43 96 -96s-96 -160 -96 -160s-96 107 -96 160s43 96 96 96zM96 64c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="seedling" unicode="&#xf4d8;" 
d="M64 352c123.7 0 224 -100.3 224 -224v-144c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v144c-123.7 0 -224 100.3 -224 224h64zM448 416h64c0 -115.9 -88 -211.1 -200.7 -222.8c-10.7998 40.7002 -31.2998 77.3994 -59 107.6
c38.2998 68.7002 111.5 115.2 195.7 115.2z" />
    <glyph glyph-name="sign" unicode="&#xf4d9;" 
d="M496 384c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-368v-368c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v368h-48c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h48v48c0 8.7998 7.2002 16 16 16h32
c8.7998 0 16 -7.2002 16 -16v-48h368zM160 64v224h320v-224h-320z" />
    <glyph glyph-name="smile-wink" unicode="&#xf4da;" horiz-adv-x="496" 
d="M0 192c0 137 111 248 248 248s248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248zM200 240c0 17.7002 -14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32zM358.5 223.5l9.7002 -8.5c8.39941 -7.5 21.5 -0.299805 19.7998 10.7998
c-4 25.2002 -34.2002 42.1006 -59.9004 42.1006c-25.6992 0 -55.8994 -16.9004 -59.8994 -42.1006c-1.7998 -11.2002 11.5 -18.2002 19.7998 -10.7998l9.5 8.5c14.7998 13.2002 46.2002 13.2002 61 0zM157.8 122.2c-13.3994 16.2998 -38.0996 -4.10059 -24.5996 -20.4004
c28.5 -34.2002 70.2998 -53.7998 114.8 -53.7998s86.2998 19.5996 114.8 53.7002c13.5 16.2998 -11 36.7002 -24.5996 20.5c-22.4004 -26.7998 -55.2002 -42.2002 -90.2002 -42.2002s-67.7998 15.2998 -90.2002 42.2002z" />
    <glyph glyph-name="tape" unicode="&#xf4db;" horiz-adv-x="640" 
d="M224 256c35.2998 0 64 -28.7002 64 -64s-28.7002 -64 -64 -64s-64 28.7002 -64 64s28.7002 64 64 64zM624 32c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-400c-123.7 0 -224 100.3 -224 224s100.3 224 224 224s224 -100.3 224 -224
c0 -62.7002 -25.9004 -119.3 -67.4004 -160h243.4zM224 96c53 0 96 43 96 96s-43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96z" />
    <glyph glyph-name="truck-loading" unicode="&#xf4de;" horiz-adv-x="640" 
d="M50.2002 72.4004l-49.6006 185.5c-2.2998 8.5 2.80078 17.2998 11.3008 19.5996l77.2998 20.7002l24.7998 -92.7002l61.7998 16.5l-24.7998 92.7002l77.2002 20.7998c8.5 2.2998 17.2998 -2.7998 19.5996 -11.2998l49.7002 -185.5
c2.2998 -8.5 -2.7998 -17.2998 -11.2998 -19.6006l-216.4 -58c-8.5 -2.2998 -17.2998 2.80078 -19.5996 11.3008zM384 448h256v-400c0 -61.9004 -50.0996 -112 -112 -112c-60.4004 0 -109.2 47.9004 -111.6 107.7l-393.7 -107.4
c-4.2002 -1.2002 -8.60059 1.2998 -9.7998 5.60059l-12.6006 46.2998c-1.2002 4.2002 1.2998 8.59961 5.60059 9.7998l346.1 94.4004v323.6c0 17.7002 14.2998 32 32 32zM528 0c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48z" />
    <glyph glyph-name="truck-moving" unicode="&#xf4df;" horiz-adv-x="640" 
d="M621.3 210.7c12 -12 18.7002 -28.2002 18.7002 -45.2002v-85.5c0 -8.7998 -7.2002 -16 -16 -16h-17.5996c1 -5.2002 1.59961 -10.5 1.59961 -16c0 -44.2002 -35.7998 -80 -80 -80s-80 35.7998 -80 80c0 5.5 0.5 10.7998 1.59961 16h-163.199
c1 -5.2002 1.59961 -10.5 1.59961 -16c0 -44.2002 -35.7998 -80 -80 -80c-26.2998 0 -49.4004 12.7998 -64 32.4004c-14.5996 -19.5 -37.7002 -32.4004 -64 -32.4004c-44.2002 0 -80 35.7998 -80 80v336c0 17.7002 14.2998 32 32 32h416c17.7002 0 32 -14.2998 32 -32
v-96.0996h37.5c17 0 33.2998 -6.7002 45.2998 -18.7002zM80 16c17.5996 0 32 14.4004 32 32s-14.4004 32 -32 32s-32 -14.4004 -32 -32s14.4004 -32 32 -32zM208 16c17.5996 0 32 14.4004 32 32s-14.4004 32 -32 32s-32 -14.4004 -32 -32s14.4004 -32 32 -32zM480 240v-48
h92.0996l-43.2998 43.2998c-3 3 -7 4.7002 -11.2998 4.7002h-37.5zM528 16c17.5996 0 32 14.4004 32 32s-14.4004 32 -32 32s-32 -14.4004 -32 -32s14.4004 -32 32 -32z" />
    <glyph glyph-name="video-slash" unicode="&#xf4e2;" horiz-adv-x="640" 
d="M633.8 -10.0996c7 -5.40039 8.2998 -15.5 2.7998 -22.4004l-19.5996 -25.2998c-5.5 -7 -15.5 -8.2002 -22.5 -2.7998l-178.5 138l-373.3 288.6l-36.5 28.2002c-7 5.39941 -8.2002 15.3994 -2.7998 22.3994l19.5996 25.2002c5.5 7 15.5 8.2002 22.5 2.7998
l78.4004 -60.5996h244.3c26.3994 0 47.7998 -21.4004 47.7998 -47.7998v-178l32 -24.7002v137.2l109.6 75.5996c21.3008 14.6006 50.4004 -0.299805 50.4004 -25.7998v-257c0 -17.4004 -13.7998 -29.7002 -29.2002 -31.0996zM32 47.7998v245.5l365.8 -282.8
c-8.2002 -6.5 -18.3994 -10.5 -29.5996 -10.5h-288.4c-26.3994 0 -47.7998 21.4004 -47.7998 47.7998z" />
    <glyph glyph-name="wine-glass" unicode="&#xf4e3;" horiz-adv-x="288" 
d="M216 -16c22.0898 0 40 -17.9102 40 -40c0 -4.41992 -3.58008 -8 -8 -8h-208c-4.41992 0 -8 3.58008 -8 8c0 22.0898 17.9102 40 40 40h40v117.18c-68.4697 15.8906 -118.05 79.9102 -111.4 154.16l15.96 178.11c0.730469 8.24023 7.55078 14.5498 15.7002 14.5498h223.48
c8.16016 0 14.9697 -6.30957 15.71 -14.5498l15.9502 -178.101c6.64941 -74.25 -42.9307 -138.27 -111.4 -154.159v-117.19h40z" />
    <glyph glyph-name="user-alt-slash" unicode="&#xf4fa;" horiz-adv-x="640" 
d="M633.8 -10.0996c7 -5.40039 8.2998 -15.5 2.90039 -22.3008l-19.6006 -25.2998c-5.5 -7 -15.5 -8.2002 -22.5 -2.7998l-588.399 454.7c-7 5.39941 -8.2002 15.3994 -2.7998 22.3994l19.5996 25.2002c5.5 7 15.5 8.2002 22.5 2.7998l135.5 -104.8
c16 62.1006 71.9004 108.2 139 108.2c79.5 0 144 -64.5 144 -144c0 -54.0996 -30.2002 -100.7 -74.4004 -125.3zM198.4 128h47.3994l248.4 -192h-382.2c-26.5 0 -48 21.5 -48 48v9.59961c0 74.2002 60.2002 134.4 134.4 134.4z" />
    <glyph glyph-name="user-astronaut" unicode="&#xf4fb;" horiz-adv-x="448" 
d="M64 224c-8.7998 0 -16 7.2002 -16 16v96c0 8.7998 7.2002 16 16 16h13.5c24.7002 56.5 80.9004 96 146.5 96s121.8 -39.5 146.5 -96h13.5c8.7998 0 16 -7.2002 16 -16v-96c0 -8.7998 -7.2002 -16 -16 -16h-13.5c-24.7002 -56.5 -80.9004 -96 -146.5 -96
s-121.8 39.5 -146.5 96h-13.5zM104 312v-24c0 -53 43 -96 96 -96h48c53 0 96 43 96 96v24c0 22.0996 -21.5 40 -48 40h-144c-26.5 0 -48 -17.9004 -48 -40zM176 240l-12 36l-36 12l36 12l12 36l12 -36l36 -12l-36 -12zM327.6 126.6c67.5 -7.09961 120.4 -63.5996 120.4 -133
v-9.59961c0 -26.5 -21.5 -48 -48 -48h-80v64c0 17.7002 -14.2998 32 -32 32h-128c-17.7002 0 -32 -14.2998 -32 -32v-64h-80c-26.5 0 -48 21.5 -48 48v9.59961c0 69.4004 52.9004 125.9 120.4 133c29.8994 -19.2998 65.3994 -30.5996 103.6 -30.5996
s73.7002 11.2998 103.6 30.5996zM272 0c8.7998 0 16 -7.2002 16 -16s-7.2002 -16 -16 -16s-16 7.2002 -16 16s7.2002 16 16 16zM176 0c8.7998 0 16 -7.2002 16 -16v-48h-32v48c0 8.7998 7.2002 16 16 16z" />
    <glyph glyph-name="user-check" unicode="&#xf4fc;" horiz-adv-x="640" 
d="M224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM313.6 160c74.2002 0 134.4 -60.2002 134.4 -134.4v-41.5996c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v41.5996
c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992zM636.6 288.4c4.60059 -4.60059 4.5 -12.1006 -0.0996094 -16.8008l-141.3 -140.199c-4.7002 -4.60059 -12.2002 -4.60059 -16.7998 0.0996094
l-81.7002 82.2998c-4.60059 4.7002 -4.60059 12.2002 0.0996094 16.7998l28.1006 27.9004c4.69922 4.59961 12.1992 4.59961 16.7998 -0.0996094l45.5 -45.8008l104.8 104c4.7002 4.60059 12.2002 4.60059 16.7998 -0.0996094z" />
    <glyph glyph-name="user-clock" unicode="&#xf4fd;" horiz-adv-x="640" 
d="M496 224c79.5996 0 144 -64.4004 144 -144s-64.4004 -144 -144 -144s-144 64.4004 -144 144s64.4004 144 144 144zM560 73.7002v12.5996c0 5.2998 -4.40039 9.7002 -9.7002 9.7002h-38.2998v54.2998c0 5.2998 -4.40039 9.7002 -9.7002 9.7002h-12.5996
c-5.2998 0 -9.7002 -4.40039 -9.7002 -9.7002v-76.5996c0 -5.2998 4.40039 -9.7002 9.7002 -9.7002h60.5996c5.2998 0 9.7002 4.40039 9.7002 9.7002zM320 80c0 -59.5 29.7998 -112.1 75.0996 -144h-347.1c-26.5 0 -48 21.5 -48 48v41.5996
c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992c8.40039 0 16.6006 -1 24.6006 -2.5c-11.5 -23.4004 -18.2002 -49.7002 -18.2002 -77.5zM224 192c-70.7002 0 -128 57.2998 -128 128
s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128z" />
    <glyph glyph-name="user-cog" unicode="&#xf4fe;" horiz-adv-x="640" 
d="M610.5 74.7002l25.7998 -14.9004c2.90039 -1.7002 4.2998 -5.2002 3.2998 -8.5c-6.69922 -21.5996 -18.1992 -41.2002 -33.1992 -57.3994c-2.30078 -2.5 -6.10059 -3.10059 -9 -1.40039l-25.8008 14.9004c-10.8994 -9.30078 -23.3994 -16.5 -36.8994 -21.3008v-29.7998
c0 -3.39941 -2.40039 -6.39941 -5.7002 -7.09961c-21.2002 -4.7998 -43.9004 -5 -66.2002 0c-3.2998 0.700195 -5.7002 3.7002 -5.7002 7.09961v29.7998c-13.5 4.80078 -26 12 -36.8994 21.3008l-25.7998 -14.9004c-3 -1.7002 -6.7002 -1.09961 -9 1.40039
c-15 16.2998 -26.5 35.7998 -33.2002 57.3994c-1 3.2998 0.299805 6.7998 3.2998 8.5l25.7998 14.9004c-2.59961 14.0996 -2.59961 28.5 0 42.5996l-25.7998 14.9004c-2.90039 1.7002 -4.2998 5.2002 -3.2998 8.5c6.7002 21.5996 18.2002 41.2002 33.2002 57.3994
c2.2998 2.5 6.09961 3.10059 9 1.40039l25.7998 -14.9004c10.8994 9.30078 23.3994 16.5 36.8994 21.3008v29.7998c0 3.39941 2.40039 6.39941 5.7002 7.09961c21.2002 4.7998 43.9004 5 66.2002 0c3.2998 -0.700195 5.7002 -3.7002 5.7002 -7.09961v-29.7998
c13.5 -4.80078 26 -12 36.8994 -21.3008l25.8008 14.9004c3 1.7002 6.69922 1.09961 9 -1.40039c15 -16.1992 26.5 -35.7998 33.1992 -57.3994c1 -3.2998 -0.299805 -6.7998 -3.2998 -8.5l-25.7998 -14.9004c2.59961 -14.0996 2.59961 -28.5 0 -42.5996zM496 47.5
c26.7998 0 48.5 21.7998 48.5 48.5s-21.7998 48.5 -48.5 48.5s-48.5 -21.7998 -48.5 -48.5s21.7002 -48.5 48.5 -48.5zM224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM425.2 -34.5v-9.2002
c0 -4.09961 0.799805 -8 2 -11.7998c-7.7002 -5.2998 -17.1006 -8.5 -27.2002 -8.5h-352c-26.5 0 -48 21.5 -48 48v41.5996c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992
c3.90039 0 7.60059 -0.900391 11.4004 -1.2002c-1 -2.89941 -2.2998 -5.7998 -3.2002 -8.7002c-5.5 -17.6992 1.90039 -36.5 17.9004 -45.6992l7.89941 -4.60059c-0.0996094 -2.59961 -0.0996094 -5.2002 0 -7.7998l-7.89941 -4.59961
c-16 -9.30078 -23.4004 -28 -17.9004 -45.7002c7.90039 -25.7002 21.9004 -49.7998 40.2002 -69.6006c7.5 -8 18 -12.5996 28.9004 -12.5996c6.7998 0 13.5996 1.90039 19.5996 5.2998l7.90039 4.60059c2.19922 -1.30078 4.5 -2.7002 6.7998 -3.90039z" />
    <glyph glyph-name="user-edit" unicode="&#xf4ff;" horiz-adv-x="640" 
d="M224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM313.6 160c39.9004 0 75.4004 -17.7998 99.9004 -45.5l-77.2998 -77.2998l-7.90039 -7.90039l-1.2002 -11.0996l-6.7998 -60.9004
c-0.799805 -7.2998 0.200195 -14.5 2.60059 -21.2998h-274.9c-26.5 0 -48 21.5 -48 48v41.5996c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992zM358.9 14.7002l137.899 137.8l71.7002 -71.7002
l-137.9 -137.899l-60.8994 -6.80078c-10.1006 -1.19922 -18.7002 7.40039 -17.6006 17.6006zM633 179.1c9.2998 -9.39941 9.2998 -24.5 0 -33.8994l-41.7998 -41.7998l-71.7998 71.6992l4.09961 4.10059l37.7998 37.7998c9.2998 9.2998 24.5 9.2998 33.7998 0z" />
    <glyph glyph-name="user-friends" unicode="&#xf500;" horiz-adv-x="640" 
d="M192 192c-61.9004 0 -112 50.0996 -112 112s50.0996 112 112 112s112 -50.0996 112 -112s-50.0996 -112 -112 -112zM268.8 160c63.6006 0 115.2 -51.5996 115.2 -115.2v-28.7998c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v28.7998
c0 63.6006 51.5996 115.2 115.2 115.2h8.2998c20.9004 -10 43.9004 -16 68.5 -16s47.7002 6 68.5 16h8.2998zM480 192c-53 0 -96 43 -96 96s43 96 96 96s96 -43 96 -96s-43 -96 -96 -96zM528 160c61.9004 0 112 -50.0996 112 -112c0 -26.5 -21.5 -48 -48 -48h-176.6
c0.0996094 2.09961 0.599609 4.2002 0.599609 6.40039v38.3994c0 38.6006 -15.2998 73.5 -39.7002 99.7998c16.5 9.5 35.2998 15.4004 55.7002 15.4004h3.7998c13.9004 -4.7998 28.6006 -8 44.2002 -8s30.2998 3.2002 44.2002 8h3.7998z" />
    <glyph glyph-name="user-graduate" unicode="&#xf501;" horiz-adv-x="448" 
d="M319.4 127.4c71.5 -3.10059 128.6 -61.6006 128.6 -133.801v-9.59961c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v9.59961c0 72.2002 57.0996 130.7 128.6 133.801l95.4004 -95.4004zM13.5996 368.2c-18.0996 4.39941 -18.0996 27.2002 0 31.5996
l190.601 45.9004c13 3.09961 26.7002 3.09961 39.7002 0l190.399 -46c18.2002 -4.40039 18.2002 -27.1006 0 -31.5l-96.2998 -23.2002c8.7002 -17.2002 14 -36.4004 14 -57c0 -70.7002 -57.2998 -128 -128 -128s-128 57.2998 -128 128c0 20.5996 5.40039 39.7998 14 57
l-66 15.9004v-52.6006c7 -4.2002 12 -11.5 12 -20.2998c0 -8.40039 -4.59961 -15.4004 -11.0996 -19.7002l15.5996 -62.2998c1.7002 -6.90039 -2.09961 -14 -7.59961 -14h-41.8008c-5.5 0 -9.2998 7.09961 -7.59961 14l15.5996 62.2998
c-6.5 4.2998 -11.0996 11.2998 -11.0996 19.7002c0 8.7998 5 16.0996 12 20.2998v58.4004z" />
    <glyph glyph-name="user-lock" unicode="&#xf502;" horiz-adv-x="640" 
d="M224 192c-70.6562 0 -128 57.3438 -128 128s57.3438 128 128 128s128 -57.3438 128 -128s-57.3438 -128 -128 -128zM320 128v-160c0.0644531 -9.49707 4.05176 -23.833 8.90039 -32h-280.9c-26.4961 0 -48 21.5039 -48 48v41.5996
c0.0166016 74.1729 60.2275 134.384 134.4 134.4h16.6992c19.1514 -8.83203 51.8105 -16 72.9004 -16s53.749 7.16797 72.9004 16h16.6992c5 0 9.7002 -1 14.5 -1.5c-4.41016 -7.84082 -8.03906 -21.5049 -8.09961 -30.5zM608 160c17.6641 0 32 -14.3359 32 -32v-160
c0 -17.6641 -14.3359 -32 -32 -32h-224c-17.6641 0 -32 14.3359 -32 32v160c0 17.6641 14.3359 32 32 32h32v80c0 44.1602 35.8398 80 80 80s80 -35.8398 80 -80v-80h32zM496 16c17.6641 0 32 14.3359 32 32s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32z
M528 160v80c0 17.6641 -14.3359 32 -32 32s-32 -14.3359 -32 -32v-80h64z" />
    <glyph glyph-name="user-minus" unicode="&#xf503;" horiz-adv-x="640" 
d="M624 240c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-192c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h192zM224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128z
M313.6 160c74.2002 0 134.4 -60.2002 134.4 -134.4v-41.5996c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v41.5996c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992z" />
    <glyph glyph-name="user-ninja" unicode="&#xf504;" horiz-adv-x="448" 
d="M325.4 158.8c68.5996 -6.09961 122.6 -63 122.6 -133.2v-41.5996c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v41.5996c0 70.2002 54 127.101 122.6 133.2l101.4 -101.399zM32 256c0 33.4004 17.0996 62.7998 43.0996 80
c-26 17.2002 -43.0996 46.5996 -43.0996 80c32 0 60.0996 -15.7998 77.5 -39.7998c20.9004 42.3994 64.0996 71.7998 114.5 71.7998c70.7002 0 128 -57.2998 128 -128s-57.2998 -128 -128 -128c-58.7998 0 -107.7 39.7998 -122.8 93.7002
c-17.4004 -18.2002 -41.9004 -29.7002 -69.2002 -29.7002zM176 352c-17.7002 0 -32 -14.2998 -32 -32h160c0 17.7002 -14.2998 32 -32 32h-96z" />
    <glyph glyph-name="user-shield" unicode="&#xf505;" horiz-adv-x="640" 
d="M622.3 176.9c10.7002 -4.2002 17.7002 -14 17.7002 -24.9004c0 -124.5 -81.5996 -193.9 -132.9 -213.9c-4.19922 -1.59961 -12.5996 -3.69922 -22.1992 0c-64.2002 25.1006 -132.9 102.301 -132.9 213.9c0 10.9004 7 20.7002 17.7002 24.9004l115.2 45
c9.59961 3.69922 18.0996 1.59961 22.1992 0zM496 -14.4004c34.5996 16.4004 89.9004 64.7002 95.5 151.801l-95.5 37.2998v-189.101zM224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM320 152
c0 -95.2998 45.2002 -169.1 99.2002 -212c-5.90039 -2.5 -12.4004 -4 -19.2002 -4h-352c-26.5 0 -48 21.5 -48 48v41.5996c0 74.2002 60.2002 134.4 134.4 134.4h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16s50.7002 5.7998 72.9004 16h16.6992
c2.60059 0 5 -0.700195 7.5 -0.799805c-0.299805 -2.40039 -1.09961 -4.7002 -1.09961 -7.2002z" />
    <glyph glyph-name="user-slash" unicode="&#xf506;" horiz-adv-x="640" 
d="M633.8 -10.0996c7 -5.40039 8.2998 -15.5 2.90039 -22.3008l-19.6006 -25.2998c-5.5 -7 -15.5 -8.2002 -22.5 -2.7998l-588.399 454.7c-7 5.39941 -8.2002 15.3994 -2.7998 22.3994l19.5996 25.2002c5.5 7 15.5 8.2002 22.5 2.7998l147.6 -114
c5.40039 65.6006 59.8008 117.4 126.9 117.4c70.7002 0 128 -57.2998 128 -128c0 -55.7998 -35.9004 -102.7 -85.7002 -120.3zM96 25.5996c0 66.4004 48.2002 121.101 111.4 132.101l286.8 -221.7h-350.2c-26.5 0 -48 21.5 -48 48v41.5996z" />
    <glyph glyph-name="user-tag" unicode="&#xf507;" horiz-adv-x="640" 
d="M630.6 83.0996c12.5 -12.5 12.5 -32.6992 -0.0996094 -45.1992l-92.5 -92.5c-12.5 -12.5 -32.7998 -12.5 -45.2998 0l-90.2998 90.1992c-12 12 -18.7002 28.2002 -18.7002 45.2002v79.2002c0 17.7002 14.2998 32 32 32h79.2998c17 0 33.2998 -6.7002 45.2998 -18.7002z
M447.8 104.1c13.2998 0 24 10.8008 24 24c0 13.3008 -10.7002 24 -24 24s-24 -10.6992 -24 -24c0 -13.2998 10.7002 -24 24 -24zM224 192.1c-70.7002 0 -128 57.3008 -128 127.9c0 70.7002 57.2998 128 128 128s128 -57.2998 128 -127.9c0 -70.6992 -57.2998 -128 -128 -128
zM351.8 80.9004c0 -25.7002 10 -49.8008 28.1006 -67.9004l58 -58c-8.80078 -11.4004 -22.4004 -18.9004 -37.9004 -18.9004h-352c-26.5 0 -48 21.5 -48 48v41.6006c0 74.2002 60.2002 134.399 134.4 134.5h16.6992c22.3008 -10.2002 46.9004 -16 72.9004 -16
s50.7002 5.7998 72.9004 16h16.6992c13.3008 0 26 -2.60059 38.2002 -6.2002v-73.0996z" />
    <glyph glyph-name="user-tie" unicode="&#xf508;" horiz-adv-x="448" 
d="M224 192c-70.7002 0 -128 57.2998 -128 128s57.2998 128 128 128s128 -57.2998 128 -128s-57.2998 -128 -128 -128zM319.8 159.4c71.2998 -3.40039 128.2 -61.7002 128.2 -133.801v-41.5996c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v41.5996
c0 72.1006 56.9004 130.4 128.2 133.801l47.7998 -191.4l32 136l-32 56h96l-32 -56l32 -136z" />
    <glyph glyph-name="users-cog" unicode="&#xf509;" horiz-adv-x="640" 
d="M610.5 106.7l25.7998 -14.9004c2.90039 -1.7002 4.2998 -5.2002 3.2998 -8.5c-6.69922 -21.5996 -18.1992 -41.2002 -33.1992 -57.3994c-2.30078 -2.5 -6.10059 -3.10059 -9 -1.40039l-25.8008 14.9004c-10.8994 -9.30078 -23.3994 -16.5 -36.8994 -21.3008v-29.7998
c0 -3.39941 -2.40039 -6.39941 -5.7002 -7.09961c-21.2002 -4.7998 -43.9004 -5 -66.2002 0c-3.2998 0.700195 -5.7002 3.7002 -5.7002 7.09961v29.7998c-13.5 4.80078 -26 12 -36.8994 21.3008l-25.7998 -14.9004c-3 -1.7002 -6.7002 -1.09961 -9 1.40039
c-15 16.2998 -26.5 35.7998 -33.2002 57.3994c-1 3.2998 0.299805 6.7998 3.2998 8.5l25.7998 14.9004c-2.59961 14.0996 -2.59961 28.5 0 42.5996l-25.7998 14.9004c-2.90039 1.7002 -4.2998 5.2002 -3.2998 8.5c6.7002 21.5996 18.2002 41.2002 33.2002 57.3994
c2.2998 2.5 6.09961 3.10059 9 1.40039l25.7998 -14.9004c10.8994 9.30078 23.3994 16.5 36.8994 21.3008v29.7998c0 3.39941 2.40039 6.39941 5.7002 7.09961c21.2002 4.7998 43.9004 5 66.2002 0c3.2998 -0.700195 5.7002 -3.7002 5.7002 -7.09961v-29.7998
c13.5 -4.80078 26 -12 36.8994 -21.3008l25.8008 14.9004c3 1.7002 6.69922 1.09961 9 -1.40039c15 -16.1992 26.5 -35.7998 33.1992 -57.3994c1 -3.2998 -0.299805 -6.7998 -3.2998 -8.5l-25.7998 -14.9004c2.59961 -14.0996 2.59961 -28.5 0 -42.5996zM496 79.5
c26.7998 0 48.5 21.7998 48.5 48.5s-21.7998 48.5 -48.5 48.5s-48.5 -21.7998 -48.5 -48.5s21.7002 -48.5 48.5 -48.5zM96 224c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM320 192c-61.9004 0 -112 50.0996 -112 112
s50 111.9 111.9 111.9c61.8994 0 112 -50.1006 112 -112c0 -17.2002 -4.2002 -33.4004 -11.2002 -48c-0.799805 -0.5 -1.60059 -0.900391 -2.40039 -1.40039l-7.89941 4.59961c-5.90039 3.5 -12.7002 5.30078 -19.6006 5.30078c-11 0 -21.5 -4.60059 -28.8994 -12.6006
c-15.8008 -17.0996 -28 -37.5 -36.3008 -59.2002c-1.89941 -0.0996094 -3.69922 -0.599609 -5.59961 -0.599609zM425.2 -2.5v-9.2002c0 -7.5 2.5 -14.2998 6.2002 -20.2998h-255.4c-26.5 0 -48 21.5 -48 48v28.7998c0 63.6006 51.5996 115.2 115.3 115.2h8.2998
c20.9004 -10 43.9004 -16 68.5 -16c3.30078 0 6.5 0.400391 9.80078 0.599609c2.7998 -3.09961 6 -5.89941 9.7998 -8.09961l7.89941 -4.59961c-0.0996094 -2.60059 -0.0996094 -5.2002 0 -7.80078c-0.899414 -0.599609 -36.5 -15.7998 -25.7998 -50.2998
c7.90039 -25.7002 21.9004 -49.7998 40.2002 -69.5996c7.5 -8 18 -12.6006 28.9004 -12.6006c12.1992 0 19.2998 5 27.5 9.80078c2.19922 -1.30078 4.5 -2.7002 6.7998 -3.90039zM173.1 173.4c-40.2998 -22.1006 -68.8994 -62 -75.1992 -109.4h-65.9004
c-17.7002 0 -32 14.2998 -32 32v32c0 35.2998 28.7002 64 64 64h64c17.5996 0 33.5 -7.09961 45.0996 -18.5996z" />
    <glyph glyph-name="balance-scale-left" unicode="&#xf515;" horiz-adv-x="640" 
d="M528 0c8.83984 0 16 -7.16016 16.0098 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-224c-8.83984 0 -16 7.16016 -16 16v342.75c-4.55957 2 -8.91992 4.34961 -12.9902 7.12012l-142.05 -47.6299c-8.37988 -2.81055 -17.4502 1.7002 -20.2598 10.0801l-10.1699 30.3398
c-2.80957 8.37988 1.7002 17.4502 10.0801 20.2598l128.39 43.0498c-0.419922 3.32031 -1.00977 6.60059 -1.00977 10.0303c0 44.1797 35.8203 80 80 80c29.6904 0 55.2998 -16.3604 69.1104 -40.3701l117.92 39.5303c8.37988 2.80957 17.4502 -1.7002 20.2598 -10.0801
l10.1699 -30.3398c2.80957 -8.37988 -1.7002 -17.4502 -10.0801 -20.2598l-132 -44.2607c-7.28027 -21.25 -22.96 -38.5293 -43.3799 -47.4697v-294.75h176zM639.98 144c0 -44.1797 -57.29 -80 -127.98 -80s-128 35.8203 -128 80h0.0195312
c0 15.6699 -2.0791 7.25 85.04 181.51c17.6807 35.3604 68.2207 35.29 85.8701 0c86.3906 -172.779 85.0508 -165.33 85.0508 -181.51zM440 160h144l-72 144zM170.93 197.51c86.3906 -172.779 85.0508 -165.33 85.0508 -181.51h0.0195312c0 -44.1797 -57.3096 -80 -128 -80
s-128 35.8203 -128 80h0.0195312c0 15.6699 -2.0791 7.25 85.04 181.51c17.6807 35.3604 68.2207 35.29 85.8701 0zM56 32h144l-72 144z" />
    <glyph glyph-name="balance-scale-right" unicode="&#xf516;" horiz-adv-x="640" 
d="M96 -16c0 8.83984 7.16016 16 16 16h175.99v294.76c-20.4199 8.93066 -36.1006 26.2207 -43.3799 47.4707l-132 44.2598c-8.37012 2.80957 -12.8906 11.8799 -10.0801 20.2598l10.1699 30.3398c2.80957 8.37012 11.8799 12.8906 20.2598 10.0801l117.93 -39.54
c13.8105 24.0098 39.4199 40.3701 69.1104 40.3701c44.1797 0 80 -35.8203 80 -80c0 -3.42969 -0.589844 -6.70996 -1.00977 -10.0303l128.399 -43.0498c8.37012 -2.80957 12.8906 -11.8799 10.0801 -20.2598l-10.1699 -30.3398
c-2.80957 -8.37012 -11.8799 -12.8906 -20.2598 -10.0801l-142.05 47.6299c-4.07031 -2.77051 -8.43066 -5.12012 -12.9902 -7.12012v-342.75c0 -8.83984 -7.16016 -16 -16 -16h-224c-8.83984 0 -16 7.16016 -16 16v32zM0 144c0 16.1797 -1.32031 8.73047 85.0596 181.51
c17.6504 35.29 68.1904 35.3604 85.8701 0c87.1299 -174.26 85.0508 -165.84 85.0508 -181.51h0.0195312c0 -44.1797 -57.3096 -80 -128 -80s-128 35.8203 -128 80zM56 160h144l-72 144zM384.02 16c0 16.1797 -1.33984 8.73047 85.04 181.51
c17.6504 35.29 68.1904 35.3604 85.8701 0c87.1299 -174.26 85.0508 -165.84 85.0508 -181.51h0.0195312c0 -44.1797 -57.3096 -80 -128 -80s-128 35.8203 -128 80h0.0195312zM440 32h144l-72 144z" />
    <glyph glyph-name="blender" unicode="&#xf517;" 
d="M416 64c35.3496 0 64 -28.6504 64 -64v-32c0 -17.6699 -14.3301 -32 -32 -32h-320c-17.6699 0 -32 14.3301 -32 32v32c0 35.3496 28.6504 64 64 64h256zM288 -32c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM328 384
c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h157.82l-17.46 -64h-140.36c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h131.64l-17.46 -64h-114.18c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h105.46l-17.46 -64
h-256l-8.73047 96h-103.27c-26.5098 0 -48 21.4902 -48 48v160c0 26.5098 21.4902 48 48 48h464l-17.46 -64h-166.54zM64 256h81.46l-11.6396 128h-69.8203v-128z" />
    <glyph glyph-name="book-open" unicode="&#xf518;" horiz-adv-x="576" 
d="M542.22 415.95c18.4199 1.04004 33.7803 -12.9902 33.7705 -30.7002v-337.84c0 -16.2305 -13.1299 -29.7705 -30.0205 -30.6602c-49.4697 -2.59961 -149.52 -12.0996 -218.7 -46.9199c-10.6494 -5.36035 -23.2793 1.93945 -23.2793 13.4902v363.87
c0 5.2793 2.62988 10.3291 7.26953 13.1699c67.2402 41.1592 176.16 52.4795 230.96 55.5898zM264.73 360.36c4.64941 -2.85059 7.26953 -7.7002 7.26953 -12.9902v-364.12c0 -11.5195 -12.5898 -18.8096 -23.21 -13.46c-69.1797 34.8398 -169.28 44.3496 -218.771 46.9502
c-16.8896 0.879883 -30.0195 14.4199 -30.0195 30.6602v337.85c0 17.71 15.3604 31.7402 33.7803 30.7002c54.7998 -3.12012 163.72 -14.4307 230.95 -55.5898z" />
    <glyph glyph-name="broadcast-tower" unicode="&#xf519;" horiz-adv-x="640" 
d="M150.94 256c-7.01074 0 -13.46 4.5 -15.4004 11.2402c-4.90039 16.9697 -7.54004 34.6396 -7.54004 52.7598s2.63965 35.79 7.53027 52.7695c1.9502 6.74023 8.39941 11.2305 15.4102 11.2305h33.7295c11.0098 0 18.6201 -10.8301 14.8604 -21.1797
c-4.93066 -13.5801 -7.5498 -27.9805 -7.5498 -42.8203s2.61914 -29.2402 7.5498 -42.8203c3.75 -10.3496 -3.85059 -21.1797 -14.8604 -21.1797h-33.7295zM89.9199 424.66c-16.54 -31.1406 -49.6104 -115.97 0.169922 -209.29
c5.66016 -10.6299 -1.92969 -23.3701 -13.9502 -23.3701h-34.8398c-6.18945 0 -11.9902 3.50977 -14.6094 9.13965c-23.5703 50.5303 -26.6904 94.1104 -26.6904 118.86c0 42.3496 9.40039 82.46 25.8896 118.69c2.60059 5.71973 8.4707 9.30957 14.7402 9.30957h35.3301
c12.0098 0 19.5996 -12.7197 13.96 -23.3398zM614.06 438.71c16.5205 -36.2295 25.9404 -76.3496 25.9404 -118.71s-9.42969 -82.4805 -25.96 -118.71c-2.59961 -5.70996 -8.45996 -9.29004 -14.7305 -9.29004h-35.2295c-12.1104 0 -19.6299 12.8398 -13.9102 23.5195
c48.1396 89.8105 17.9902 174.94 -0.280273 209.23c-5.63965 10.5898 2.04004 23.25 14.0205 23.25h35.4199c6.26953 0 12.1299 -3.58008 14.7295 -9.29004zM489.06 384c7.01074 0 13.46 -4.49023 15.4004 -11.2402c4.90039 -16.9697 7.54004 -34.6396 7.54004 -52.7598
s-2.62988 -35.79 -7.53027 -52.7598c-1.9502 -6.75 -8.38965 -11.2402 -15.4102 -11.2402h-33.7295c-11.0098 0 -18.6201 10.8301 -14.8604 21.1797c4.93066 13.5801 7.5498 27.9805 7.5498 42.8203s-2.61914 29.2402 -7.5498 42.8203
c-3.75 10.3496 3.85059 21.1797 14.8604 21.1797h33.7295zM372.76 283.88l130.5 -313.41c3.39062 -8.14941 -0.459961 -17.5195 -8.60938 -20.9199l-29.5107 -12.3096c-8.14941 -3.40039 -17.5098 0.450195 -20.9092 8.60938l-49.2002 118.15h-150.07l-49.1904 -118.15
c-3.38965 -8.14941 -12.7598 -12.0098 -20.9092 -8.60938l-29.5107 12.3096c-8.14941 3.40039 -12.0098 12.7705 -8.60938 20.9199l130.5 313.41c-7.0498 10.29 -11.2002 22.71 -11.2002 36.1201c0 35.3496 28.6396 64 63.96 64c35.3301 0 63.96 -28.6504 63.96 -64
c0 -13.4102 -4.15039 -25.8301 -11.2002 -36.1201zM271.62 128h96.7598l-48.3799 116.19z" />
    <glyph glyph-name="broom" unicode="&#xf51a;" horiz-adv-x="640" 
d="M256.47 231.23l86.7305 -109.181s-16.6006 -102.359 -76.5703 -150.12c-59.9697 -47.7793 -266.63 -34.1201 -266.63 -34.1201s3.7998 23.1406 11 55.4307l94.6201 112.17c3.96973 4.7002 -0.870117 11.6201 -6.65039 9.5l-60.3994 -22.0898
c14.4395 41.6602 32.7197 80.04 54.5996 97.4697c59.9697 47.7598 163.3 40.9404 163.3 40.9404zM636.53 416.97c5.48926 -6.91016 4.33984 -16.96 -2.5498 -22.4395l-232.48 -177.8l34.0898 -42.9209c5.08008 -6.39941 1.66016 -15.9092 -6.33984 -17.5996
l-58.7998 -12.4502l-86.7305 109.181l25.3301 54.5498c3.4502 7.41992 13.5 8.62012 18.5898 2.20996l34.1406 -42.9697l232.479 177.8c6.89062 5.48926 16.9199 4.33984 22.4102 -2.56055z" />
    <glyph glyph-name="chalkboard" unicode="&#xf51b;" horiz-adv-x="640" 
d="M96 384v-352h-64v376c0 22.0596 17.9404 40 40 40h496c22.0596 0 40 -17.9404 40 -40v-376h-64v352h-448zM624 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-608c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h272v64h192v-64
h144z" />
    <glyph glyph-name="chalkboard-teacher" unicode="&#xf51c;" horiz-adv-x="640" 
d="M208 96c62.0596 0 112.33 -50.4805 112 -112.62c-0.139648 -26.2598 -21.7305 -47.3799 -48 -47.3799h-224c-26.2695 0 -47.8604 21.1201 -48 47.3799c-0.330078 62.1396 49.9404 112.62 112 112.62c2.38965 0 4.76953 -0.349609 7.0498 -1.08984
c12.9697 -4.20996 26.6006 -6.91016 40.9502 -6.91016s27.9805 2.7002 40.9404 6.91016c2.2793 0.740234 4.66992 1.08984 7.05957 1.08984zM160 128c-53.0195 0 -96 42.9805 -96 96s42.9805 96 96 96s96 -42.9805 96 -96s-42.9805 -96 -96 -96zM592 448
c26.4697 0 48 -22.25 48 -49.5898v-316.82c0 -27.3398 -21.5303 -49.5898 -48 -49.5898h-244.55c-6.57031 25.2695 -20.5898 47.3096 -39.6904 64h76.2402v64h128v-64h64v288h-352v-49.7998c-18.9004 11.0195 -40.5801 17.7998 -64 17.7998v46.4102
c0 27.3398 21.5303 49.5898 48 49.5898h384z" />
    <glyph glyph-name="church" unicode="&#xf51d;" horiz-adv-x="640" 
d="M464.46 201.32c9.63965 -5.78027 15.54 -16.2002 15.54 -27.4404v-237.88h-96v96c0 35.3496 -28.6504 64 -64 64s-64 -28.6504 -64 -64v-96h-96v237.88c0 10.0029 6.96191 22.2959 15.54 27.4404l112.46 67.4795v51.2002h-48c-8.83984 0 -16 7.16016 -16 16v32
c0 8.83984 7.16016 16 16 16h48v48c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-48h48c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-48v-51.2002zM0 52.04c0.00195312 11.6455 8.68945 24.8252 19.3896 29.4199l108.61 46.54
v-192h-112c-8.83984 0 -16 7.16016 -16 16v100.04zM620.61 81.46c11.7598 -5.0498 19.3896 -16.6201 19.3896 -29.4199v-100.04c0 -8.83984 -7.16016 -16 -16 -16h-112v192z" />
    <glyph glyph-name="coins" unicode="&#xf51e;" 
d="M0 42.7002c41.2998 -29.1006 116.8 -42.7002 192 -42.7002s150.7 13.5996 192 42.7002v-42.7002c0 -35.2998 -86 -64 -192 -64s-192 28.7002 -192 64v42.7002zM320 320c-106 0 -192 28.7002 -192 64s86 64 192 64s192 -28.7002 192 -64s-86 -64 -192 -64zM0 147.6
c41.2998 -34 116.9 -51.5996 192 -51.5996s150.7 17.5996 192 51.5996v-51.5996c0 -35.2998 -86 -64 -192 -64s-192 28.7002 -192 64v51.5996zM416 136.6v63.6006c38.7002 6.89941 72.7998 18.0996 96 34.5v-42.7002c0 -23.7002 -38.7002 -44.2998 -96 -55.4004zM192 288
c106 0 192 -35.7998 192 -80s-86 -80 -192 -80s-192 35.7998 -192 80s86 80 192 80zM411.3 231.7c-8.7998 23.7002 -30.5 42.8994 -60 57.2002c64.2002 3.19922 125.2 16.6992 160.7 41.7998v-42.7002c0 -24.2998 -40.7002 -45.5 -100.7 -56.2998z" />
    <glyph glyph-name="compact-disc" unicode="&#xf51f;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM88 192c0 88.2002 71.7998 160 160 160v32c-105.9 0 -192 -86.0996 -192 -192h32zM248 96c53 0 96 43 96 96s-43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96zM248 224
c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
    <glyph glyph-name="crow" unicode="&#xf520;" horiz-adv-x="640" 
d="M544 416c53.0195 0 96 -28.6504 96 -64l-96 -16v-80c0 -87.2598 -58.2598 -160.8 -137.97 -184.14l41.2393 -111.53c2.27051 -6.23047 -0.939453 -13.1104 -7.16992 -15.3799l-22.5498 -8.20996c-6.22949 -2.27051 -13.1094 0.939453 -15.3799 7.16992l-44.5098 120.38
c-1.90039 -0.0595703 -3.75 -0.290039 -5.66016 -0.290039h-39.0596l38.3291 -103.68c2.27051 -6.23047 -0.939453 -13.1104 -7.16992 -15.3799l-22.5498 -8.20996c-6.22949 -2.27051 -13.1094 0.939453 -15.3799 7.16992l-44.4102 120.1h-96.4902l-121.539 -60.7695
c-20.0908 -10.04 -43.7305 4.56934 -43.7305 27.0293c0.00195312 8.33984 5.41797 19.168 12.0898 24.1699l371.91 292.59v20.9805c0 44.1797 35.8203 80 80 80c26.0898 0 49.04 -12.6797 63.6396 -32h16.3604zM464 344c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24
s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24z" />
    <glyph glyph-name="crown" unicode="&#xf521;" horiz-adv-x="640" 
d="M528 0c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-416c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h416zM592 320c26.5 0 48 -21.5 48 -48s-21.5 -48 -48 -48c-2.59961 0 -5.2002 0.400391 -7.7002 0.799805l-72.2998 -192.8h-384
l-72.2998 192.8c-2.5 -0.399414 -5.10059 -0.799805 -7.7002 -0.799805c-26.5 0 -48 21.5 -48 48s21.5996 48 48.0996 48s48 -21.5 48 -48c0 -7.09961 -1.69922 -13.7998 -4.39941 -19.7998l72.2998 -43.4004c15.2998 -9.2002 35.2998 -4 44.2002 11.6006l81.5 142.6
c-10.7002 8.7998 -17.7002 22 -17.7002 37c0 26.5 21.5 48 48 48s48 -21.5 48 -48c0 -15 -7 -28.2002 -17.7002 -37l81.5 -142.6c8.90039 -15.6006 28.7998 -20.8008 44.2002 -11.6006l72.4004 43.4004c-2.80078 6.09961 -4.40039 12.7002 -4.40039 19.7998
c0 26.5 21.5 48 48 48z" />
    <glyph glyph-name="dice" unicode="&#xf522;" horiz-adv-x="640" 
d="M592 256c26.5098 0 48 -21.4902 48 -48v-224c0 -26.5098 -21.4902 -48 -48 -48h-224c-26.5098 0 -48 21.4902 -48 48v46.4199l136.26 136.26c24.1201 24.1201 29.6904 59.7305 17 89.3203h118.74zM480 72c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24
s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24zM433.63 258.7c19.1602 -19.1602 19.1602 -50.2305 0 -69.4004l-174.939 -174.93c-19.1602 -19.1602 -50.2305 -19.1602 -69.3906 0l-174.93 174.939c-19.1602 19.1602 -19.1602 50.2305 0 69.3906l174.939 174.93
c19.1602 19.1602 50.2305 19.1602 69.3906 0zM96 200c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24zM224 72c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24z
M224 200c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24zM224 328c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24zM352 200c13.25 0 24 10.75 24 24
c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24z" />
    <glyph glyph-name="dice-five" unicode="&#xf523;" horiz-adv-x="448" 
d="M384 416c35.3496 0 64 -28.6504 64 -64v-320c0 -35.3496 -28.6504 -64 -64 -64h-320c-35.3496 0 -64 28.6504 -64 64v320c0 35.3496 28.6504 64 64 64h320zM128 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM128 256
c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM224 160c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32
s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 256c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="dice-four" unicode="&#xf524;" horiz-adv-x="448" 
d="M384 416c35.3496 0 64 -28.6504 64 -64v-320c0 -35.3496 -28.6504 -64 -64 -64h-320c-35.3496 0 -64 28.6504 -64 64v320c0 35.3496 28.6504 64 64 64h320zM128 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM128 256
c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 256c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32
s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="dice-one" unicode="&#xf525;" horiz-adv-x="448" 
d="M384 416c35.3496 0 64 -28.6504 64 -64v-320c0 -35.3496 -28.6504 -64 -64 -64h-320c-35.3496 0 -64 28.6504 -64 64v320c0 35.3496 28.6504 64 64 64h320zM224 160c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="dice-six" unicode="&#xf526;" horiz-adv-x="448" 
d="M384 416c35.3496 0 64 -28.6504 64 -64v-320c0 -35.3496 -28.6504 -64 -64 -64h-320c-35.3496 0 -64 28.6504 -64 64v320c0 35.3496 28.6504 64 64 64h320zM128 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM128 160
c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM128 256c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32
s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 160c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 256c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="dice-three" unicode="&#xf527;" horiz-adv-x="448" 
d="M384 416c35.3496 0 64 -28.6504 64 -64v-320c0 -35.3496 -28.6504 -64 -64 -64h-320c-35.3496 0 -64 28.6504 -64 64v320c0 35.3496 28.6504 64 64 64h320zM128 256c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM224 160
c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="dice-two" unicode="&#xf528;" horiz-adv-x="448" 
d="M384 416c35.3496 0 64 -28.6504 64 -64v-320c0 -35.3496 -28.6504 -64 -64 -64h-320c-35.3496 0 -64 28.6504 -64 64v320c0 35.3496 28.6504 64 64 64h320zM128 256c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM320 64
c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="divide" unicode="&#xf529;" horiz-adv-x="448" 
d="M224 96c35.3496 0 64 -28.6504 64 -64s-28.6504 -64 -64 -64s-64 28.6504 -64 64s28.6504 64 64 64zM224 288c-35.3496 0 -64 28.6504 -64 64s28.6504 64 64 64s64 -28.6504 64 -64s-28.6504 -64 -64 -64zM416 240c17.6699 0 32 -14.3301 32 -32v-32
c0 -17.6699 -14.3301 -32 -32 -32h-384c-17.6699 0 -32 14.3301 -32 32v32c0 17.6699 14.3301 32 32 32h384z" />
    <glyph glyph-name="door-closed" unicode="&#xf52a;" horiz-adv-x="640" 
d="M624 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-608c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h111.99v397.2c0 28.0195 21.5293 50.7998 48 50.7998h288.01c26.4697 0 48 -22.7803 48 -50.7998v-397.2h112zM415.99 160
c17.6797 0 32.0098 14.3301 32 32c0 17.6699 -14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="door-open" unicode="&#xf52b;" horiz-adv-x="640" 
d="M624 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-144v384h-96v64h112c26.4697 0 48 -22.1904 48 -49.4502v-334.55h80zM312.24 446.99c20.2002 5.24023 39.7598 -10.5898 39.7598 -32.1699v-478.82h-336c-8.83984 0 -16 7.16016 -16 16v32
c0 8.83984 7.16016 16 16 16h80v365.08c0 15.2197 9.99023 28.4795 24.2402 32.1699zM264 160c13.25 0 24 14.3301 24 32s-10.75 32 -24 32s-24 -14.3301 -24 -32s10.75 -32 24 -32z" />
    <glyph glyph-name="equals" unicode="&#xf52c;" horiz-adv-x="448" 
d="M416 144c17.6699 0 32 -14.3301 32 -32v-32c0 -17.6699 -14.3301 -32 -32 -32h-384c-17.6699 0 -32 14.3301 -32 32v32c0 17.6699 14.3301 32 32 32h384zM416 336c17.6699 0 32 -14.3301 32 -32v-32c0 -17.6699 -14.3301 -32 -32 -32h-384c-17.6699 0 -32 14.3301 -32 32
v32c0 17.6699 14.3301 32 32 32h384z" />
    <glyph glyph-name="feather" unicode="&#xf52d;" 
d="M467.14 403.16c50.5703 -50.5205 61.7002 -124.9 16.2607 -199.36l-131.54 -43.7998h97.7793c-9.92969 -10.6797 3.68066 3.07031 -46.3096 -46.8604l-147.57 -49.1396h98.1904c-74.9502 -73.1104 -194.53 -70.6504 -246.83 -54.9404l-66.1006 -66.0293
c-9.37988 -9.37012 -24.5996 -9.37012 -33.9795 0s-9.37988 24.5693 0 33.9395l259.52 259.25c6.25 6.25 6.25 16.3799 0 22.6299s-16.3896 6.25 -22.6494 0l-178.44 -178.25c-6.75 60.3408 3.18066 150.78 63.6406 211.17c24.7695 24.7402 7.13965 7.14062 85.75 85.6602
c90.6094 90.5107 189.729 88.21 252.279 25.7305z" />
    <glyph glyph-name="frog" unicode="&#xf52e;" horiz-adv-x="576" 
d="M446.53 350.57c0 0 58.4297 -19.0605 98.9893 -41.2803c18.7607 -10.2803 30.4805 -29.8301 30.4805 -51.2305v-0.00292969c0 -18.8037 -13.3105 -41.5283 -29.71 -50.7266l-154.44 -86.6504l98.5205 -104.68h53.6299c17.6699 0 32 -14.3301 32 -32
c0 -8.83984 -7.16016 -16 -16 -16h-90.3799l-118.53 125.94c5.07031 54.1494 -29.9297 85.0596 -40.7998 93.21c-36.8496 27.6191 -88.29 27.6592 -125.13 0l-34.7803 -26.0908c-7.07031 -5.2998 -8.49023 -15.3291 -3.18945 -22.4092
c5.31934 -7.10059 15.3496 -8.5 22.4092 -3.19043l32.7607 24.5898c20.6895 15.5303 48.3496 20.8105 72.2393 10.8799c44.0605 -18.3193 57.8506 -70.3701 33.71 -106.6l-35.7998 -48.3301h79.4902c17.6699 0 32 -14.3301 32 -32c0 -8.83984 -7.16016 -16 -16 -16h-304
c-34.9199 0 -63.8896 28.0996 -64 63.0195c-0.5 166.86 126.75 304.021 289.46 319.44c6.82031 37.25 39.3096 65.54 78.54 65.54c39.1904 0 71.6699 -28.2305 78.5303 -65.4297zM368 312c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24
c-13.2598 0 -24 -10.7402 -24 -24c0 -13.25 10.7402 -24 24 -24z" />
    <glyph glyph-name="gas-pump" unicode="&#xf52f;" 
d="M336 0c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-320c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h320zM493.2 340.7c12 -12 18.7998 -28.2998 18.7998 -45.2998v-223.4c0 -42.2002 -36.5 -76 -79.5 -71.7002
c-37.5 3.90039 -64.5 38.2002 -64.5 75.9004v27.7998c0 22.0996 -17.9004 40 -40 40h-8v-112h-288v352c0 35.2998 28.7002 64 64 64h160c35.2998 0 64 -28.7002 64 -64v-192h8c48.5996 0 88 -39.4004 88 -88v-32c0 -13.2002 10.7998 -24 24 -24s24 10.7998 24 24v160.8
c-27.0996 3.90039 -48 27.1006 -48 55.2002v62.0996l-37.7002 37.7002c-6.2002 6.2002 -6.2002 16.4004 0 22.6006l11.2998 11.2998c6.2002 6.2002 16.4004 6.2002 22.6006 0zM256 256v128h-160v-128h160z" />
    <glyph glyph-name="glasses" unicode="&#xf530;" horiz-adv-x="576" 
d="M574.1 167.63c1.26074 -5.07031 1.90039 -10.2695 1.90039 -15.5v-70.25c0 -62.8896 -51.5801 -113.88 -115.2 -113.88h-37.1201c-60.2793 0 -110.37 45.9404 -114.87 105.37l-2.92969 38.6299h-35.75l-2.92969 -38.6299
c-4.50977 -59.4297 -54.6006 -105.37 -114.88 -105.37h-37.1201c-63.6201 0 -115.2 50.9902 -115.2 113.89v70.25c0.000976562 4.33984 0.852539 11.2793 1.90039 15.4902l45.3398 181.73c5.91016 23.6895 21.5898 44.0293 43 55.7998
c21.4395 11.7402 46.9697 14.1094 70.1895 6.33008l15.25 -5.08008c8.39062 -2.79004 12.9199 -11.8604 10.1201 -20.2402l-5.05957 -15.1797c-2.79004 -8.37988 -11.8506 -12.9102 -20.2305 -10.1201l-13.1699 4.38965
c-10.8701 3.62012 -22.9902 3.57031 -33.1494 -1.72949c-10.29 -5.36035 -17.5908 -14.5605 -20.3809 -25.8105l-38.46 -153.83c22.1904 6.81055 49.79 12.46 81.21 12.46c34.7803 0 73.9902 -7.00977 114.86 -26.75h73.1797
c40.8701 19.7207 80.0801 26.7402 114.851 26.7402c31.4102 0 59.0098 -5.64941 81.2002 -12.46l-38.46 153.82c-2.80078 11.2598 -10.0801 20.4502 -20.3701 25.8193c-10.1602 5.30078 -22.29 5.35059 -33.1602 1.73047l-13.1797 -4.38965
c-8.38086 -2.79004 -17.4404 1.73926 -20.2305 10.1201l-5.05957 15.1797c-2.80078 8.37988 1.72949 17.4502 10.1191 20.2402l15.25 5.08008c23.2207 7.7793 48.75 5.39941 70.1904 -6.33008c21.4102 -11.7607 37.0898 -32.1104 43 -55.8105zM203.38 78.21l3.12988 41.2197
c-22.6699 8.58984 -46.0693 12.9199 -69.9297 12.9199c-29.1602 0 -54.46 -6.42969 -72.5801 -12.9199v-37.54c0 -27.5098 22.9697 -49.8896 51.2002 -49.8896h37.1201c26.6602 0 49.0898 20.2998 51.0596 46.21zM512 81.8799l-0.00976562 37.54
c-18.1201 6.49023 -43.4307 12.9297 -72.5498 12.9297c-23.8701 0 -47.2803 -4.33008 -69.9502 -12.9199l3.12988 -41.2197c1.95996 -25.9102 24.3896 -46.21 51.0596 -46.21h37.1201c28.2305 0 51.2002 22.3701 51.2002 49.8799z" />
    <glyph glyph-name="greater-than" unicode="&#xf531;" horiz-adv-x="384" 
d="M365.52 238.15c11.2803 -5.25 18.4805 -16.5605 18.4902 -29.0107v-34.2295c-0.00195312 -11.2529 -8.28027 -24.2451 -18.4795 -29l-306.471 -142.91c-16.0195 -7.46973 -35.0596 -0.540039 -42.5293 15.4805l-13.5205 29
c-7.46973 16.0195 -0.540039 35.0596 15.4805 42.5293l218.47 101.891l-218.43 101.85c-16.0605 7.49023 -23.0107 26.5801 -15.5205 42.6396l13.5703 29.0801c7.49023 16.0605 26.5801 23.0107 42.6396 15.5205z" />
    <glyph glyph-name="greater-than-equal" unicode="&#xf532;" horiz-adv-x="448" 
d="M55.2197 340.31c-18.29 6 -27.7393 24.2607 -21.0996 40.79l12.0303 29.9199c6.63965 16.5303 26.8594 25.0605 45.1494 19.0605l301.72 -119.98c13.7705 -4.51953 22.9805 -16.6094 22.9805 -30.1699v-15.96c0 -13.5596 -9.20996 -25.6494 -22.9805 -30.1699
l-301.409 -119.859c-18.3906 -6.04004 -38.7002 2.54004 -45.3799 19.1494l-12.0908 30.0801c-6.67969 16.6104 2.81055 34.9697 21.2002 41l175.44 68.0498zM424 48c13.25 0 24 -10.7402 24 -24v-48c0 -13.25 -10.75 -24 -24 -24h-400c-13.25 0 -24 10.75 -24 24v48
c0 13.2598 10.75 24 24 24h400z" />
    <glyph glyph-name="helicopter" unicode="&#xf533;" horiz-adv-x="640" 
d="M304 64c-8.83105 0 -20.3018 5.73438 -25.5996 12.7998l-86.4004 115.2l-160 64l-31.5098 108.12c-2.53027 10.0996 5.10938 19.8799 15.5195 19.8799h39.9902c5.03027 0 9.78027 -2.37012 12.7998 -6.40039l43.2002 -57.5996h208v64h-176c-8.83984 0 -16 7.16016 -16 16
v32c0 8.83984 7.16016 16 16 16h416c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-176v-64c123.71 0 224 -100.29 224 -224c0 -17.6699 -14.3301 -32 -32 -32h-272zM416 252.49v-124.49h124.79c-12.7598 62.5596 -62.2402 111.7 -124.79 124.49z
M635.37 -10.8096c6.58984 -6.61035 6.04004 -17.5205 -0.980469 -23.6602c-33.1494 -29.0498 -53.5693 -29.5205 -68.4492 -29.5205h-325.94c-8.83984 0 -16 7.18066 -16 16.0303v32.0596c0 8.85059 7.16016 16.0303 16 16.0303h325.94
c10.7998 0 17.5498 4.48047 24.6396 11.25c6.40039 6.11035 16.3896 6.27051 22.6396 0.00976562z" />
    <glyph glyph-name="infinity" unicode="&#xf534;" horiz-adv-x="640" 
d="M471.1 352c93.1006 0 168.9 -71.7998 168.9 -160s-75.7998 -160 -168.9 -160c-66.0996 0 -117.8 41.2998 -151.1 78.5996c-33.2998 -37.2998 -85 -78.5996 -151.1 -78.5996c-93.1006 0 -168.9 71.7998 -168.9 160s75.7998 160 168.9 160
c66.0996 0 117.8 -41.2998 151.1 -78.5996c33.2998 37.2998 85 78.5996 151.1 78.5996zM168.9 128c38.0996 0 73.5996 36.4004 94 64c-20.6006 27.9004 -55.8008 64 -94 64c-40.2002 0 -72.9004 -28.7002 -72.9004 -64s32.7002 -64 72.9004 -64zM471.1 128
c40.2002 0 72.9004 28.7002 72.9004 64s-32.7002 64 -72.9004 64c-38.0996 0 -73.5996 -36.4004 -94 -64c20.6006 -27.9004 55.8008 -64 94 -64z" />
    <glyph glyph-name="kiwi-bird" unicode="&#xf535;" horiz-adv-x="576" 
d="M575.81 230.02c0.300781 -5.7793 0.160156 -246.02 0.160156 -246.02c0 -7.30957 -4.95996 -13.7002 -12.0498 -15.5c-1.30957 -0.339844 -2.63965 -0.5 -3.9502 -0.5c-5.75 0 -11.1895 3.11035 -14.0498 8.33984l-74.4102 136.44
c-7.04004 -0.470703 2.43066 -0.780273 -23.0498 -0.780273c-54.5996 0 -106.39 -19.25 -152.13 -49.0596c-12.46 -8.12012 -26.0996 -14.4502 -40.3398 -19.5107v-59.4297c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v49.1797
c-5.32031 -0.449219 -10.5605 -1.17969 -16 -1.17969c-16.6006 0 -32.6406 2.2998 -48 6.25977v-54.2598c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v73.9902c-57.3105 33.21 -95.9502 95.0596 -95.9902 166.01
c-0.0800781 145.76 129.3 182.88 147.31 186.94c57.1709 12.9199 111.221 0.259766 153.21 -28.7002c43.4902 -29.9902 94.9209 -46.2402 147.74 -46.2402h9.37012c60.6504 0 115.01 -45.4102 118.18 -105.98zM463.97 200c13.25 0 24 10.75 24 24
c0 13.2598 -10.75 24 -24 24s-24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24zM543.97 46.75v99.0596c-11.1299 -11.3799 -24.7393 -20.1494 -39.8594 -25.9795z" />
    <glyph glyph-name="less-than" unicode="&#xf536;" horiz-adv-x="384" 
d="M365.46 90.2598c16.0703 -7.49023 23.0205 -26.5801 15.5303 -42.6396l-13.5605 -29.0801c-7.48926 -16.0596 -26.5801 -23.0098 -42.6396 -15.5205l-306.31 142.83c-11.2705 5.25 -18.4805 16.5605 -18.4805 29v34.2402c0.00488281 11.252 8.2832 24.2432 18.4805 29
l306.46 142.91c16.0195 7.46973 35.0596 0.540039 42.5293 -15.4805l13.5205 -29c7.46973 -16.0195 0.540039 -35.0596 -15.4805 -42.5293l-218.47 -101.88z" />
    <glyph glyph-name="less-than-equal" unicode="&#xf537;" horiz-adv-x="448" 
d="M54.9805 233.8c-13.7705 4.52051 -22.9805 16.6104 -22.9805 30.1699v15.96c0 13.5703 9.20996 25.6602 22.9805 30.1807l301.71 119.96c18.29 6 38.5098 -2.53027 45.1494 -19.0605l12.0303 -29.9199c6.63965 -16.5195 -2.81055 -34.79 -21.1006 -40.79
l-175.56 -68.0898l175.44 -68.0498c18.3896 -6.03027 27.8896 -24.3906 21.21 -41l-12.0908 -30.0801c-6.66992 -16.6104 -26.9893 -25.1797 -45.3799 -19.1504zM424 48c13.25 0 24 -10.7402 24 -24v-48c0 -13.25 -10.75 -24 -24 -24h-400c-13.25 0 -24 10.75 -24 24v48
c0 13.2598 10.75 24 24 24h400z" />
    <glyph glyph-name="memory" unicode="&#xf538;" horiz-adv-x="640" 
d="M640 317.06c-18.5996 -6.60938 -32 -24.1895 -32 -45.0596s13.4004 -38.4502 32 -45.0596v-98.9404h-640v98.9404c18.5996 6.60938 32 24.1895 32 45.0596s-13.4004 38.4502 -32 45.0596v34.9404c0 17.6699 14.3301 32 32 32h576c17.6699 0 32 -14.3301 32 -32v-34.9404z
M224 192v128h-64v-128h64zM352 192v128h-64v-128h64zM480 192v128h-64v-128h64zM0 0v96h640v-96h-64v26.6699c0 8.83984 -7.16016 16 -16 16s-16 -7.16016 -16 -16v-26.6699h-128v26.6699c0 8.83984 -7.16016 16 -16 16s-16 -7.16016 -16 -16v-26.6699h-128v26.6699
c0 8.83984 -7.16016 16 -16 16s-16 -7.16016 -16 -16v-26.6699h-128v26.6699c0 8.83984 -7.16016 16 -16 16s-16 -7.16016 -16 -16v-26.6699h-64z" />
    <glyph glyph-name="microphone-alt-slash" unicode="&#xf539;" horiz-adv-x="640" 
d="M633.82 -10.0996c6.97949 -5.43066 8.22949 -15.4805 2.81934 -22.4502l-19.6396 -25.2705c-5.42969 -6.97949 -15.4805 -8.23926 -22.46 -2.80957l-588.36 454.729c-6.97949 5.43066 -8.22949 15.4805 -2.80957 22.4502l19.6396 25.2705
c5.41992 6.97949 15.4805 8.22949 22.46 2.80957l178.53 -138v45.3604c0 53.0195 42.9805 96 96 96s96 -42.9805 96 -96h-85.3301c-5.88965 0 -10.6699 -3.58008 -10.6699 -8v-16c0 -4.41992 4.78027 -8 10.6699 -8h85.3301v-32h-85.3301
c-5.88965 0 -10.6699 -3.58008 -10.6699 -8v-16c0 -4.41992 4.78027 -8 10.6699 -8h85.3301v-32h-85.0596l41.3994 -32h43.6699c0 -10.4502 -2.17969 -20.2705 -5.2793 -29.6699l26.5498 -20.5205c6.75977 15.4004 10.7197 32.2803 10.7197 50.2002v48
c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-48c0 -28.9805 -7.25977 -56.21 -19.7402 -80.3301zM400 -16c8.83984 0 16 -7.16016 16 -16v-16c0 -8.83984 -7.16016 -16 -16 -16h-160c-8.83984 0 -16 7.16016 -16 16v16c0 8.83984 7.16016 16 16 16h56
v34.1504c-88.0303 12.1396 -152 92.0498 -152 181.689v6.85059l52.0303 -40.2207c12.4395 -53.2197 55.3301 -96.3994 111.18 -101.85c6.94043 -0.669922 13.6396 -0.200195 20.3496 0.200195l50.4004 -38.96c-10.8604 -3.80078 -22.25 -6.45996 -33.96 -8.08008v-33.7803
h56z" />
    <glyph glyph-name="money-bill-wave" unicode="&#xf53a;" horiz-adv-x="640" 
d="M621.16 393.54c11.6094 -4.87012 18.8398 -16.8301 18.8496 -29.4697v-317.25c0 -18.4902 -15.04 -31.8105 -32.25 -31.8105c-3.39941 0 -6.87988 0.520508 -10.3496 1.62012c-30.8906 9.7998 -61.7598 13.7197 -92.6504 13.7197
c-123.17 0 -246.34 -62.3496 -369.51 -62.3496c-38.7998 0 -77.6201 6.19043 -116.41 22.4697c-11.6094 4.86035 -18.8398 16.8301 -18.8398 29.46v317.261c0 18.4893 15.04 31.8096 32.25 31.8096c3.40039 0 6.87988 -0.519531 10.3496 -1.62012
c30.8906 -9.7998 61.7607 -13.7197 92.6504 -13.7197c123.17 0 246.33 62.3496 369.5 62.3398c38.7998 0 77.6201 -6.19043 116.41 -22.46zM48 315.78v-60.4707c31 0 56.8398 22.1504 62.7197 51.54c-21.5996 1.36035 -42.5996 3.89062 -62.7197 8.93066zM48 30.7803
c20.1201 -7.31055 41.1797 -11.8105 63.71 -13.6201c-1.53027 34.1299 -29.3398 61.3994 -63.71 61.3994v-47.7793zM320 96c44.1699 0 80 42.9697 80 96c0 53.0195 -35.8203 96 -80 96s-80 -42.9805 -80 -96c0 -53.0098 35.8096 -96 80 -96zM592 68.2197v57.7207
c-26.8203 -3.40039 -48.4502 -23.2002 -54.3203 -49.2803c18.6104 -1.58984 36.8008 -4.0498 54.3203 -8.44043zM592 304.33v48.8896c-17.7197 6.43066 -36.2695 10.4902 -55.8096 12.6602c0.949219 -31.8496 24.9199 -57.6396 55.8096 -61.5498z" />
    <glyph glyph-name="money-bill-wave-alt" unicode="&#xf53b;" horiz-adv-x="640" 
d="M621.16 393.54c11.6094 -4.87012 18.8398 -16.8301 18.8496 -29.4697v-317.25c0 -18.4902 -15.04 -31.8105 -32.25 -31.8105c-3.39941 0 -6.87988 0.520508 -10.3496 1.62012c-30.8906 9.7998 -61.7598 13.7197 -92.6504 13.7197
c-123.17 0 -246.34 -62.3496 -369.51 -62.3496c-38.7998 0 -77.6201 6.19043 -116.41 22.4697c-11.6094 4.86035 -18.8398 16.8301 -18.8398 29.46v317.261c0 18.4893 15.04 31.8096 32.25 31.8096c3.40039 0 6.87988 -0.519531 10.3496 -1.62012
c30.8906 -9.7998 61.7607 -13.7197 92.6504 -13.7197c123.17 0 246.33 62.3496 369.5 62.3398c38.7998 0 77.6201 -6.19043 116.41 -22.46zM320 96c44.1699 0 80 42.9697 80 96c0 53.0195 -35.8203 96 -80 96s-80 -42.9805 -80 -96c0 -53.0098 35.8096 -96 80 -96z" />
    <glyph glyph-name="money-check" unicode="&#xf53c;" horiz-adv-x="640" 
d="M0 0v320h640v-320c0 -17.6699 -14.3301 -32 -32 -32h-576c-17.6699 0 -32 14.3301 -32 32zM448 208v-32c0 -8.83984 7.16016 -16 16 -16h96c8.83984 0 16 7.16016 16 16v32c0 8.83984 -7.16016 16 -16 16h-96c-8.83984 0 -16 -7.16016 -16 -16zM448 88v-16
c0 -4.41992 3.58008 -8 8 -8h112c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-112c-4.41992 0 -8 -3.58008 -8 -8zM64 184v-16c0 -4.41992 3.58008 -8 8 -8h304c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-304c-4.41992 0 -8 -3.58008 -8 -8z
M64 88v-16c0 -4.41992 3.58008 -8 8 -8h176c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-176c-4.41992 0 -8 -3.58008 -8 -8zM624 416c8.83984 0 16 -7.16016 16 -16v-48h-640v48c0 8.83984 7.16016 16 16 16h608z" />
    <glyph glyph-name="money-check-alt" unicode="&#xf53d;" horiz-adv-x="640" 
d="M608 416c17.6699 0 32 -14.3301 32 -32v-384c0 -17.6699 -14.3301 -32 -32 -32h-576c-17.6699 0 -32 14.3301 -32 32v384c0 17.6699 14.3301 32 32 32h576zM176 120.12c23.6201 0.629883 42.6699 20.54 42.6699 45.0703c0 19.9697 -12.9902 37.8096 -31.5801 43.3896
l-45 13.5c-5.16016 1.54004 -8.76953 6.78027 -8.76953 12.7295c0 7.27051 5.2998 13.1904 11.7998 13.1904h28.1104c4.55957 0 8.94922 -1.29004 12.8193 -3.71973c3.24023 -2.03027 7.36035 -1.91016 10.1299 0.729492l11.75 11.21
c3.53027 3.37012 3.33008 9.20996 -0.569336 12.1406c-9.10059 6.83984 -20.0801 10.7695 -31.3701 11.3496v16.29c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-16.1201c-23.6201 -0.629883 -42.6699 -20.5498 -42.6699 -45.0703
c0 -19.9697 12.9893 -37.8096 31.5801 -43.3896l45 -13.5c5.15918 -1.54004 8.76953 -6.78027 8.76953 -12.7295c0 -7.27051 -5.2998 -13.1904 -11.7998 -13.1904h-28.1104c-4.55957 0 -8.9502 1.2998 -12.8193 3.71973
c-3.24023 2.03027 -7.36035 1.91016 -10.1309 -0.729492l-11.75 -11.21c-3.5293 -3.37012 -3.3291 -9.20996 0.570312 -12.1406c9.10059 -6.83008 20.0801 -10.7695 31.3701 -11.3496v-16.29c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v16.1201zM416 136v16
c0 4.41992 -3.58008 8 -8 8h-112c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h112c4.41992 0 8 3.58008 8 8zM576 136v16c0 4.41992 -3.58008 8 -8 8h-80c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h80c4.41992 0 8 3.58008 8 8z
M576 232v16c0 4.41992 -3.58008 8 -8 8h-272c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h272c4.41992 0 8 3.58008 8 8z" />
    <glyph glyph-name="not-equal" unicode="&#xf53e;" horiz-adv-x="448" 
d="M416 240h-98.4199l-74.5303 -96h172.95c17.6699 0 32 -14.3301 32 -32v-32c0 -17.6699 -14.3301 -32 -32 -32h-247.48l-82.0898 -105.73c-5.37012 -7.00977 -15.4102 -8.34961 -22.4297 -2.96973l-25.4102 19.46c-7.00977 5.37988 -8.33984 15.4199 -2.96973 22.4307
l51.8701 66.8096h-55.4902c-17.6699 0 -32 14.3301 -32 32v32c0 17.6699 14.3301 32 32 32h130.03l74.5293 96h-204.56c-17.6699 0 -32 14.3301 -32 32v32c0 17.6699 14.3301 32 32 32h279.09l82.0801 105.73c5.37988 7.00977 15.4199 8.34961 22.4404 2.96973
l25.4092 -19.46c7.01074 -5.37012 8.34082 -15.4102 2.9707 -22.4307l-51.8701 -66.8096h23.8799c17.6699 0 32 -14.3301 32 -32v-32c0 -17.6699 -14.3301 -32 -32 -32z" />
    <glyph glyph-name="palette" unicode="&#xf53f;" 
d="M204.3 443c163.8 31.9004 307.2 -92.0996 307.7 -249.7c-0.0996094 -35.7002 -29.0996 -65.2998 -64.9004 -65.2998h-79.6992c-51 0 -84 -53 -60.9004 -98.4004c18.9004 -37.0996 -1.2998 -85.2998 -42.5 -91.6992c-127.1 -19.7002 -295.8 119.699 -258.8 306.699
c19.5996 99.1006 99.7002 179 199.1 198.4zM96 128c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM128 256c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM256 320
c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM384 256c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="parking" unicode="&#xf540;" horiz-adv-x="448" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM240 128c52.9004 0 96 43.0996 96 96s-43.0996 96 -96 96h-96c-8.7998 0 -16 -7.2002 -16 -16v-224c0 -8.7998 7.2002 -16 16 -16h32
c8.7998 0 16 7.2002 16 16v48h48zM240 256c17.5996 0 32 -14.4004 32 -32s-14.4004 -32 -32 -32h-48v64h48z" />
    <glyph glyph-name="percentage" unicode="&#xf541;" horiz-adv-x="384" 
d="M109.25 274.75c-24.9902 -25 -65.5098 -25 -90.5098 0c-24.9902 24.9902 -24.9902 65.5195 0 90.5098s65.5195 24.9902 90.5098 0s24.9902 -65.5195 0 -90.5098zM365.25 109.26c25 -25 25 -65.5195 0 -90.5098c-24.9902 -24.9902 -65.5195 -24.9902 -90.5098 0
s-24.9902 65.5195 0 90.5098s65.5195 24.9902 90.5098 0zM363.31 340.69c12.5 -12.5 12.5 -32.7607 0 -45.25l-274.75 -274.75c-12.4893 -12.5 -32.75 -12.5 -45.25 0l-22.6191 22.6191c-12.5 12.4902 -12.5 32.75 0 45.25l274.75 274.75c12.4893 12.5 32.75 12.5 45.25 0z
" />
    <glyph glyph-name="project-diagram" unicode="&#xf542;" horiz-adv-x="640" 
d="M384 128c17.6699 0 32 -14.3301 32 -32v-128c0 -17.6699 -14.3301 -32 -32 -32h-128c-17.6699 0 -32 14.3301 -32 32v128c0 17.6699 14.3301 32 32 32h128zM192 416v-32h224v-64h-224v-47.5098l64.2803 -112.49h-0.280273c-23.5996 0 -44.0195 -12.9805 -55.1201 -32.04
l-73.1602 128.04h-95.7197c-17.6699 0 -32 14.3301 -32 32v128c0 17.6699 14.3301 32 32 32h128c17.6699 0 32 -14.3301 32 -32zM608 448c17.6699 0 32 -14.3301 32 -32v-128c0 -17.6699 -14.3301 -32 -32 -32h-128c-17.6699 0 -32 14.3301 -32 32v128
c0 17.6699 14.3301 32 32 32h128z" />
    <glyph glyph-name="receipt" unicode="&#xf543;" horiz-adv-x="384" 
d="M358.4 444.8c10.5996 7.90039 25.5996 0.400391 25.5996 -12.7998v-480c0 -13.2002 -15.0996 -20.7002 -25.5996 -12.7998l-38.4004 44.7998l-54.4004 -44.7998c-2.35059 -1.78027 -6.65137 -3.22559 -9.59961 -3.22559s-7.24902 1.44531 -9.59961 3.22559
l-54.4004 44.7998l-54.4004 -44.7998c-2.35059 -1.78027 -6.65137 -3.22559 -9.59961 -3.22559s-7.24902 1.44531 -9.59961 3.22559l-54.4004 44.7998l-38.4004 -44.7998c-10.5996 -7.90039 -25.5996 -0.400391 -25.5996 12.7998v480c0 13.2002 15 20.7002 25.5996 12.7998
l38.4004 -44.7998l54.4004 44.7998c2.35059 1.78027 6.65137 3.22559 9.59961 3.22559s7.24902 -1.44531 9.59961 -3.22559l54.4004 -44.7998l54.4004 44.7998c2.35059 1.78027 6.65137 3.22559 9.59961 3.22559s7.24902 -1.44531 9.59961 -3.22559l54.4004 -44.7998z
M320 88v16c0 4.40039 -3.59961 8 -8 8h-240c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h240c4.40039 0 8 3.59961 8 8zM320 184v16c0 4.40039 -3.59961 8 -8 8h-240c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h240
c4.40039 0 8 3.59961 8 8zM320 280v16c0 4.40039 -3.59961 8 -8 8h-240c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h240c4.40039 0 8 3.59961 8 8z" />
    <glyph glyph-name="robot" unicode="&#xf544;" horiz-adv-x="640" 
d="M32 224h32v-192h-32h-0.0380859c-17.6436 0 -31.9619 14.3184 -31.9619 31.9619v0.0380859v128v0.0380859c0 17.6436 14.3184 31.9619 31.9619 31.9619h0.0380859zM544 272v-272c-0.0351562 -35.293 -28.707 -63.9648 -64 -64h-320
c-35.293 0.0351562 -63.9648 28.707 -64 64v272v0.0263672c0 44.1455 35.8281 79.9736 79.9736 79.9736h0.0263672h112v64c0 17.6641 14.3359 32 32 32s32 -14.3359 32 -32v-64h112h0.0263672c44.1455 0 79.9736 -35.8281 79.9736 -79.9736v-0.0263672zM264 192
c0 22.0801 -17.9199 40 -40 40s-40 -17.9199 -40 -40s17.9199 -40 40 -40h0.00292969c22.0781 0 39.9971 17.9189 39.9971 39.9971v0.00292969zM256 64h-64v-32h64v32zM352 64h-64v-32h64v32zM456 192c0 22.0801 -17.9199 40 -40 40s-40 -17.9199 -40 -40
s17.9199 -40 40 -40h0.00292969c22.0781 0 39.9971 17.9189 39.9971 39.9971v0.00292969zM448 64h-64v-32h64v32zM640 192v-128v-0.0380859c0 -17.6436 -14.3184 -31.9619 -31.9619 -31.9619h-0.0380859h-32v192h32h0.0380859c17.6436 0 31.9619 -14.3184 31.9619 -31.9619
v-0.0380859z" />
    <glyph glyph-name="ruler" unicode="&#xf545;" horiz-adv-x="640" 
d="M635.7 280.8c8.7998 -15 3.59961 -34.2002 -11.6006 -42.7998l-496.8 -281.9c-15.2002 -8.59961 -34.7002 -3.5 -43.5 11.5l-79.5996 135.601c-8.7998 15 -3.5 34.0996 11.7002 42.7998l69 39.0996l59.6992 -101.399c2.2002 -3.7998 7.10059 -5.10059 10.9004 -2.90039
l13.7998 7.7998c3.7998 2.2002 5.10059 7 2.90039 10.7002l-59.7002 101.7l55.2002 31.2998l27.8994 -47.5c2.2002 -3.7998 7.10059 -5.09961 10.9004 -2.89941l13.7998 7.7998c3.7998 2.2002 5.10059 6.89941 2.90039 10.7002l-27.9004 47.3994l55.2002 31.2998
l59.7002 -101.699c2.2002 -3.80078 7.09961 -5.10059 10.8994 -2.90039l13.8008 7.7998c3.7998 2.2002 5.09961 7 2.89941 10.7002l-59.7998 101.7l55.2002 31.2998l27.8994 -47.2998c2.2002 -3.7998 7.10059 -5.10059 10.9004 -2.90039l13.7998 7.7998
c3.7998 2.2002 5.10059 6.90039 2.90039 10.7002l-27.9004 47.4004l55.2002 31.2998l59.7002 -101.6c2.2002 -3.80078 7.09961 -5.10059 10.8994 -2.90039l13.8008 7.7998c3.7998 2.2002 5.09961 6.90039 2.89941 10.7002l-59.7002 101.7l69 39.0996
c15.2002 8.60059 34.7002 3.5 43.5 -11.5z" />
    <glyph glyph-name="ruler-combined" unicode="&#xf546;" 
d="M160 160v-41.3799l-158.43 -158.42c-0.660156 2.55957 -1.57031 5.03027 -1.57031 7.7998v448c0 17.6699 14.3301 32 32 32h96c17.6699 0 32 -14.3301 32 -32v-32h-56c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h56v-64h-56
c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h56v-64h-56c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h56zM480 96c17.6699 0 32 -14.3301 32 -32v-96c0 -17.6699 -14.3301 -32 -32 -32h-448
c-2.75977 0 -5.24023 0.910156 -7.7998 1.57031l158.43 158.43h41.3701v-56c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v56h64v-56c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v56h64v-56c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8
v56h32z" />
    <glyph glyph-name="ruler-horizontal" unicode="&#xf547;" horiz-adv-x="576" 
d="M544 320c17.6699 0 32 -14.3301 32 -32v-192c0 -17.6699 -14.3301 -32 -32 -32h-512c-17.6699 0 -32 14.3301 -32 32v192c0 17.6699 14.3301 32 32 32h48v-88c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v88h64v-88c0 -4.41992 3.58008 -8 8 -8h16
c4.41992 0 8 3.58008 8 8v88h64v-88c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v88h64v-88c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v88h64v-88c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v88h48z" />
    <glyph glyph-name="ruler-vertical" unicode="&#xf548;" horiz-adv-x="256" 
d="M168 32h88v-64c0 -17.6699 -14.3301 -32 -32 -32h-192c-17.6699 0 -32 14.3301 -32 32v448c0 17.6699 14.3301 32 32 32h192c17.6699 0 32 -14.3301 32 -32v-64h-88c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h88v-64h-88
c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h88v-64h-88c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h88v-64h-88c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8z" />
    <glyph glyph-name="school" unicode="&#xf549;" horiz-adv-x="640" 
d="M0 224c0 17.6699 14.3301 32 32 32h64v-320h-80c-8.83984 0 -16 7.16016 -16 16v272zM360 272c4.41992 0 8 -3.58008 8 -8v-16c0 -4.41992 -3.58008 -8 -8 -8h-48c-4.41992 0 -8 3.58008 -8 8v64c0 4.41992 3.58008 8 8 8h16c4.41992 0 8 -3.58008 8 -8v-40h24z
M497.75 335.96c8.90039 -5.92969 14.25 -15.9297 14.25 -26.6299v-373.33h-128v144c0 8.83984 -7.16016 16 -16 16h-96c-8.83984 0 -16 -7.16016 -16 -16v-144h-128v373.34c0.00195312 9.45117 6.38574 21.377 14.25 26.6201l160 106.67
c4.4502 2.96484 12.4023 5.37012 17.75 5.37012s13.2998 -2.40527 17.75 -5.37012zM320 192c44.1797 0 80 35.8203 80 80s-35.8203 80 -80 80s-80 -35.8203 -80 -80s35.8203 -80 80 -80zM608 256c17.6699 0 32 -14.3301 32 -32v-272c0 -8.83984 -7.16016 -16 -16 -16h-80
v320h64z" />
    <glyph glyph-name="screwdriver" unicode="&#xf54a;" 
d="M448 448l64 -64l-96 -128h-62.0596l-83.0303 -83.0303c-4.25 6.79004 -9.07031 13.2705 -14.8701 19.0703c-5.7998 5.80957 -12.2803 10.6201 -19.0703 14.8701l83.0303 83.0303v62.0596zM128 169.41c29.1104 29.1094 76.2998 29.1094 105.41 0
c29.1094 -29.1104 29.1094 -76.2998 0 -105.41l-117.08 -117.08c-14.5605 -14.5596 -38.1504 -14.5596 -52.71 0l-52.7002 52.7002c-14.5498 14.5596 -14.5498 38.1602 0 52.71z" />
    <glyph glyph-name="shoe-prints" unicode="&#xf54b;" horiz-adv-x="640" 
d="M192 288c-35.3496 0 -64 28.6504 -64 64s28.6504 64 64 64h32v-128h-32zM0 32c0 35.3496 28.6504 64 64 64h32v-128h-32c-35.3496 0 -64 28.6504 -64 64zM337.46 160c90.3604 0 174.54 -32 174.54 -96c0 -45.2197 -39.0996 -97.2998 -148.58 -120.82
c-31.9795 -6.87012 -64.8896 -8.50977 -97.5801 -6.19922c-27.2998 1.92969 -54.0996 7.76953 -80.3096 15.0498l-57.5303 15.9697v128c60.21 0 79.9404 15.6201 104.73 32c28.5693 18.8799 69.8193 32 104.729 32zM491.42 440.81
c109.48 -23.5098 148.58 -75.5898 148.58 -120.81c0 -64 -84.1797 -96 -174.54 -96c-34.9102 0 -76.1602 13.1201 -104.729 32c-24.79 16.3799 -44.5303 32 -104.73 32v128l57.5303 15.9697c26.21 7.27051 53.0098 13.1104 80.3096 15.04
c32.6904 2.32031 65.6006 0.669922 97.5801 -6.2002z" />
    <glyph glyph-name="skull" unicode="&#xf54c;" 
d="M256 448c141.4 0 256 -100.3 256 -224c0 -70.0996 -36.9004 -132.6 -94.5 -173.7c-9.7002 -6.89941 -15.2002 -18.2002 -13.5 -29.8994l9.40039 -66.2002c1.39941 -9.60059 -6 -18.2002 -15.7002 -18.2002h-77.7002v56c0 4.40039 -3.59961 8 -8 8h-16
c-4.40039 0 -8 -3.59961 -8 -8v-56h-64v56c0 4.40039 -3.59961 8 -8 8h-16c-4.40039 0 -8 -3.59961 -8 -8v-56h-77.7002c-9.7002 0 -17.0996 8.59961 -15.7002 18.2002l9.40039 66.2002c1.7002 11.7998 -3.90039 23 -13.5 29.8994
c-57.5996 41.1006 -94.5 103.601 -94.5 173.7c0 123.7 114.6 224 256 224zM160 128c35.2998 0 64 28.7002 64 64s-28.7002 64 -64 64s-64 -28.7002 -64 -64s28.7002 -64 64 -64zM352 128c35.2998 0 64 28.7002 64 64s-28.7002 64 -64 64s-64 -28.7002 -64 -64
s28.7002 -64 64 -64z" />
    <glyph glyph-name="smoking-ban" unicode="&#xf54d;" 
d="M96 144v64c0 8.7998 7.2002 16 16 16h21.5l96 -96h-117.5c-8.7998 0 -16 7.2002 -16 16zM256 448c141.4 0 256 -114.6 256 -256s-114.6 -256 -256 -256s-256 114.6 -256 256s114.6 256 256 256zM256 0c41.4004 0 79.7002 13.2998 111.1 35.7002l-267.399 267.399
c-22.4004 -31.3994 -35.7002 -69.6992 -35.7002 -111.1c0 -105.9 86.0996 -192 192 -192zM301.2 192l32 -32h50.7998v32h-82.7998zM412.3 80.9004c22.4004 31.3994 35.7002 69.6992 35.7002 111.1c0 105.9 -86.0996 192 -192 192
c-41.4004 0 -79.7002 -13.2998 -111.1 -35.7002l124.3 -124.3h130.8c8.7998 0 16 -7.2002 16 -16v-64c0 -8.7998 -7.2002 -16 -16 -16h-34.7998zM320.6 320c32.1006 0 58.7002 -23.7002 63.3008 -54.5996c0.699219 -4.90039 -3 -9.40039 -8 -9.40039h-16.2002
c-3.7002 0 -7 2.5 -7.7002 6.09961c-2.7998 14.7002 -15.7998 25.9004 -31.4004 25.9004c-32.0996 0 -58.6992 23.7002 -63.2998 54.5996c-0.700195 4.90039 3 9.40039 8 9.40039h16.2002c3.7002 0 7 -2.5 7.7002 -6.09961
c2.7998 -14.7002 15.7998 -25.9004 31.3994 -25.9004z" />
    <glyph glyph-name="store" unicode="&#xf54e;" horiz-adv-x="616" 
d="M602 329.4c33.5996 -53.6006 3.7998 -128 -59 -136.4c-4.5 -0.599609 -9 -0.900391 -13.7002 -0.900391c-29.5 0 -55.7002 13 -73.7998 33.1006c-18 -20.1006 -44.2002 -33.1006 -73.7998 -33.1006c-29.5 0 -55.7998 13 -73.7998 33.1006
c-18 -20.1006 -44.2002 -33.1006 -73.8008 -33.1006c-29.5 0 -55.7998 13 -73.7998 33.1006c-18 -20.1006 -44.2002 -33.1006 -73.7998 -33.1006c-4.59961 0 -9.2002 0.300781 -13.7002 0.900391c-62.5996 8.5 -92.2998 82.9004 -58.7998 136.4l64.9004 103.6
c5.7998 9.2998 16.0996 15 27.0996 15h404c11 0 21.2998 -5.7002 27.0996 -15zM529.5 160c6.09961 0 12.0996 0.400391 18.2002 1.2002c5.59961 0.700195 11 2 16.3994 3.59961v-196.8c0 -17.7002 -14.2998 -32 -32 -32h-448c-17.6992 0 -32 14.2998 -32 32v196.8
c5.30078 -1.5 10.8008 -2.7998 16.4004 -3.59961c5.90039 -0.799805 12 -1.2002 18 -1.2002c10 0 19.9004 1.59961 29.5 3.7998v-99.7998h384v99.7998c9.59961 -2.2998 19.5 -3.7998 29.5 -3.7998z" />
    <glyph glyph-name="store-alt" unicode="&#xf54f;" horiz-adv-x="640" 
d="M320 64v160h64v-256c0 -17.7002 -14.2998 -32 -32 -32h-256c-17.7002 0 -32 14.2998 -32 32v256h64v-160h192zM634.6 305.8c14.1006 -21.2998 -1.09961 -49.7998 -26.5996 -49.7998h-575.9c-25.5996 0 -40.7998 28.5 -26.5996 49.7998l85.2998 128
c5.90039 8.90039 15.9004 14.2002 26.6006 14.2002h405.199c10.7002 0 20.7002 -5.2998 26.7002 -14.2002zM512 -48v272h64v-272c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16z" />
    <glyph glyph-name="stream" unicode="&#xf550;" 
d="M16 320c-8.83984 0 -16 7.16016 -16 16v64c0 8.83984 7.16016 16 16 16h416c8.83984 0 16 -7.16016 16 -16v-64c0 -8.83984 -7.16016 -16 -16 -16h-416zM496 240c8.83984 0 16 -7.16016 16 -16v-64c0 -8.83984 -7.16016 -16 -16 -16h-416c-8.83984 0 -16 7.16016 -16 16
v64c0 8.83984 7.16016 16 16 16h416zM432 64c8.83984 0 16 -7.16016 16 -16v-64c0 -8.83984 -7.16016 -16 -16 -16h-416c-8.83984 0 -16 7.16016 -16 16v64c0 8.83984 7.16016 16 16 16h416z" />
    <glyph glyph-name="stroopwafel" unicode="&#xf551;" 
d="M188.12 237.26l45.25 -45.2598l-45.2598 -45.25l-45.25 45.25zM301.25 259.88l-45.25 -45.25l-45.25 45.2598l45.25 45.25zM210.75 124.12l45.25 45.25l45.2598 -45.25l-45.2598 -45.2598zM256 448c141.38 0 256 -114.62 256 -256s-114.62 -256 -256 -256
s-256 114.62 -256 256s114.62 256 256 256zM442.68 152.4c1.29199 1.29492 2.34082 3.83008 2.34082 5.65918c0 1.83008 -1.04883 4.36523 -2.34082 5.66016l-28.29 28.2803l28.2705 28.3096c3.12012 3.12012 3.12012 8.19043 0 11.3105l-11.3105 11.3096
c-3.11914 3.12012 -8.18945 3.12012 -11.3096 0l-28.29 -28.29l-45.25 45.2607l33.9404 33.9395l16.9697 -16.9697c3.12012 -3.12012 8.18945 -3.12012 11.3096 0l11.3105 11.3096c3.12012 3.12012 3.12012 8.19043 0 11.3105l-16.9707 16.9697l16.9707 16.9697
c3.12012 3.12012 3.12012 8.19043 0 11.3105l-11.3105 11.3096c-3.12012 3.12012 -8.18945 3.12012 -11.3096 0l-16.9697 -16.9697l-16.9707 16.9697c-3.12012 3.12012 -8.18945 3.12012 -11.3096 0l-11.3105 -11.3096c-3.11914 -3.12012 -3.11914 -8.19043 0 -11.3105
l16.9707 -16.9697l-33.9404 -33.9404l-45.2598 45.25l28.29 28.29c3.12012 3.12012 3.12012 8.19043 0 11.3105l-11.3105 11.3096c-3.11914 3.12012 -8.18945 3.12012 -11.3096 0l-28.29 -28.29l-28.3096 28.2705c-3.12012 3.12012 -8.19043 3.12012 -11.3105 0
l-11.3096 -11.3105c-3.12012 -3.11914 -3.12012 -8.18945 0 -11.3096l28.29 -28.29l-45.2607 -45.25l-33.9395 33.9404l16.9697 16.9697c3.12012 3.12012 3.12012 8.18945 0 11.3096l-11.3096 11.3105c-3.12012 3.12012 -8.19043 3.12012 -11.3105 0l-16.9697 -16.9707
l-16.9697 16.9707c-3.12012 3.12012 -8.19043 3.12012 -11.3105 0l-11.3096 -11.3105c-3.12012 -3.12012 -3.12012 -8.18945 0 -11.3096l16.9697 -16.9697l-16.9697 -16.9707c-3.12012 -3.12012 -3.12012 -8.18945 0 -11.3096l11.3096 -11.3105
c3.12012 -3.11914 8.19043 -3.11914 11.3105 0l16.9697 16.9707l33.9404 -33.9404l-45.25 -45.2598l-28.29 28.29c-3.12012 3.12012 -8.19043 3.12012 -11.3105 0l-11.3096 -11.3105c-3.12012 -3.11914 -3.12012 -8.18945 0 -11.3096l28.29 -28.29l-28.29 -28.29
c-3.12012 -3.12012 -3.12012 -8.19043 0 -11.3096l11.3398 -11.3301c3.12012 -3.12012 8.18945 -3.12012 11.3096 0l28.29 28.29l45.25 -45.25l-33.9395 -33.9404l-16.9707 16.9697c-3.11914 3.12012 -8.18945 3.12012 -11.3096 0l-11.3096 -11.3096
c-3.12012 -3.12012 -3.12012 -8.19043 0 -11.3105l16.9697 -16.9697l-16.9697 -16.9697c-3.12012 -3.12012 -3.12012 -8.19043 0 -11.3105l11.3096 -11.3096c3.12012 -3.12012 8.19043 -3.12012 11.3096 0l16.9707 16.9697l16.9697 -16.9697
c3.12012 -3.12012 8.19043 -3.12012 11.3096 0l11.3105 11.3096c3.12012 3.12012 3.12012 8.19043 0 11.3105l-16.9697 16.9697l33.9395 33.9404l45.25 -45.2598l-28.29 -28.29c-3.12012 -3.12012 -3.12012 -8.19043 0 -11.3105l11.3105 -11.3096
c3.11914 -3.12012 8.18945 -3.12012 11.3096 0l28.29 28.29l28.3096 -28.2705c3.12012 -3.12012 8.19043 -3.12012 11.3105 0l11.3096 11.3105c3.12012 3.11914 3.12012 8.18945 0 11.3096l-28.29 28.29l45.2607 45.2598l33.9395 -33.9395l-16.9697 -16.9707
c-3.12012 -3.11914 -3.12012 -8.18945 0 -11.3096l11.3096 -11.3096c3.12012 -3.12012 8.19043 -3.12012 11.3105 0l16.9697 16.9697l16.9697 -16.9697c3.12012 -3.12012 8.19043 -3.12012 11.3105 0l11.3096 11.3096c3.12012 3.12012 3.12012 8.19043 0 11.3096
l-16.9697 16.9707l16.9697 16.9697c3.12012 3.12012 3.12012 8.19043 0 11.3096l-11.3096 11.3105c-3.12012 3.12012 -8.19043 3.12012 -11.3105 0l-16.9697 -16.9697l-33.9404 33.9395l45.25 45.25l28.29 -28.29c3.12012 -3.12012 8.19043 -3.12012 11.3105 0zM278.63 192
l45.2598 45.2598l45.25 -45.2598l-45.25 -45.25z" />
    <glyph glyph-name="toolbox" unicode="&#xf552;" 
d="M502.63 233.37c6 -6 9.37012 -14.1396 9.37012 -22.6201v-82.75h-128v16c0 8.83984 -7.16016 16 -16 16h-32c-8.83984 0 -16 -7.16016 -16 -16v-16h-128v16c0 8.83984 -7.16016 16 -16 16h-32c-8.83984 0 -16 -7.16016 -16 -16v-16h-128v82.7402
c0 8.49023 3.37012 16.6299 9.37012 22.6299l45.25 45.2598c6.00977 6 14.1396 9.37012 22.6299 9.37012h50.75v80c0 26.5098 21.4902 48 48 48h160c26.5098 0 48 -21.4902 48 -48v-80.0098h50.75c8.49023 0 16.6299 -3.37012 22.6299 -9.37012zM320 288v64h-128v-64h128z
M384 80v16h128v-96c0 -17.6699 -14.3301 -32 -32 -32h-448c-17.6699 0 -32 14.3301 -32 32v96h128v-16c0 -8.83984 7.16016 -16 16 -16h32c8.83984 0 16 7.16016 16 16v16h128v-16c0 -8.83984 7.16016 -16 16 -16h32c8.83984 0 16 7.16016 16 16z" />
    <glyph glyph-name="tshirt" unicode="&#xf553;" horiz-adv-x="640" 
d="M631.2 351.5c7.89941 -3.90039 11.0996 -13.5996 7.09961 -21.5l-57.2998 -114.4c-4 -8 -13.5996 -11.1992 -21.5 -7.19922l-56.5996 27.6992c-10.6006 5.2002 -23 -2.59961 -23 -14.3994v-253.7c0 -17.7002 -14.3008 -32 -32 -32h-256c-17.7002 0 -32 14.2998 -32 32
v253.6c0 11.9004 -12.4004 19.6006 -23 14.4004l-56.6006 -27.7002c-7.89941 -3.89941 -17.5 -0.700195 -21.5 7.2002l-57.2002 114.5c-3.89941 7.90039 -0.699219 17.5 7.2002 21.5l194.7 96.5c20.0996 -27.7998 64.5996 -47.2002 116.5 -47.2002
s96.4004 19.4004 116.5 47.2002z" />
    <glyph glyph-name="walking" unicode="&#xf554;" horiz-adv-x="320" 
d="M208 352c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM302.5 202.9c15.7002 -7.90039 22 -27.3008 14.2998 -43c-7.89941 -15.8008 -26.8994 -22.2002 -42.5 -14.3008l-23.2998 11.8008c-15 7.59961 -26.4004 20.8994 -31.7002 37
l-5.5 16.5l-17.2002 -68.7002l45.5 -49.7002c7.2002 -7.7998 12.3008 -17.4004 14.9004 -27.7002l22.2002 -89c4.2998 -17.0996 -6.2002 -34.5 -23.2998 -38.7998c-17.1006 -4.2998 -34.5 6.2002 -38.8008 23.2998l-18.2998 73.2998
c-2.59961 10.3008 -7.7002 19.8008 -14.8994 27.7002l-59.9004 65.4004c-14.5 15.8994 -20.0996 38 -14.9004 58.7998l15.2002 60.7002l-26.7998 -10.7998c-7.2002 -2.90039 -13 -8.40039 -16.5 -15.4004l-6.7002 -13.5996
c-7.89941 -15.8008 -26.8994 -22.2002 -42.5 -14.3008c-15.7002 7.90039 -22 27.1006 -14.2002 42.9004l6.7002 13.5996c10.4004 21 28.1006 37.5 49.7002 46.2002c37.4004 15.1006 57.2998 25.2998 93.2998 25.2002c46.5 -0.0996094 87.5 -31.2998 102.2 -75.9004
l9.7002 -29.3994zM73.5996 62.2002l20.7002 51.5c8.7002 -11.9004 -7.89941 6.59961 47.4004 -53.7002l-13.5 -33.7998c-3.2998 -8.10059 -8.10059 -15.4004 -14.2002 -21.5l-59.4004 -59.4004c-12.5 -12.5 -32.6992 -12.5 -45.1992 0s-12.5 32.7998 0 45.2998l50 50.1006
c6.19922 6.09961 11 13.3994 14.1992 21.5z" />
    <glyph glyph-name="wallet" unicode="&#xf555;" 
d="M461.2 320c28.0195 0 50.7998 -21.5303 50.7998 -48v-256c0 -26.4697 -22.7803 -48 -50.7998 -48h-397.2c-35.3496 0 -64 28.6504 -64 64v320c0 35.3496 28.6504 64 64 64h368c26.5098 0 48 -21.4902 48 -48c0 -8.83984 -7.16016 -16 -16 -16h-384
c-8.83984 0 -16 -7.16016 -16 -16s7.16016 -16 16 -16h381.2zM416 112c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="angry" unicode="&#xf556;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM136 208c0 -17.7002 14.4004 -32 32.0996 -32c17.7002 0 32 14.2998 32 32c0 2.90039 -1 5.5 -1.69922 8.2002c0.599609 0 1.19922 -0.200195 1.69922 -0.200195
c6.90039 0 13.2002 4.5 15.3008 11.4004c2.59961 8.39941 -2.2002 17.3994 -10.7002 19.8994l-80 24c-8.5 2.5 -17.4004 -2.2002 -19.9004 -10.7002c-2.59961 -8.39941 2.2002 -17.3994 10.7002 -19.8994l31 -9.2998c-6.40039 -5.90039 -10.5 -14.1006 -10.5 -23.4004z
M304 53.7998c13.4004 -16.0996 38.2998 4 24.5 20.5c-20 24 -49.4004 37.7998 -80.5996 37.7998c-31.2002 0 -60.6006 -13.7998 -80.6006 -37.7998c-13.5996 -16.2998 11.1006 -36.7998 24.6006 -20.5c27.8994 33.4004 84.2998 33.4004 112.1 0zM380.6 240.7
c8.5 2.5 13.3008 11.3994 10.8008 19.8994c-2.5 8.40039 -11.5 13.2002 -19.9004 10.7002l-80 -24c-8.40039 -2.5 -13.2002 -11.3994 -10.7002 -19.8994c2.10059 -6.90039 8.40039 -11.4004 15.2998 -11.4004c0.600586 0 1.10059 0.0996094 1.7002 0.200195
c-0.799805 -2.60059 -1.7002 -5.2998 -1.7002 -8.2002c0 -17.7002 14.3008 -32 32 -32c17.7002 0 32 14.2998 32 32c0 9.2998 -4.19922 17.5996 -10.5 23.4004z" />
    <glyph glyph-name="archway" unicode="&#xf557;" horiz-adv-x="576" 
d="M560 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-159.98c-8.83984 0 -16 7.16016 -16 16v16l-0.0195312 160c0 53.0195 -42.9805 96 -96 96s-96 -42.9805 -96 -96v-176c0 -8.83984 -7.16016 -16 -16 -16h-159.98
c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h15.9805v352h512v-352h16zM560 448c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-544c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h544z" />
    <glyph glyph-name="atlas" unicode="&#xf558;" horiz-adv-x="448" 
d="M318.38 240c-5.28027 -31.2197 -25.5898 -57.1699 -53.2998 -70.4102c7.66992 19.0605 12.7197 43.3799 14.21 70.4102h39.0898zM318.38 272h-39.0898c-1.49023 27.0303 -6.53027 51.3496 -14.21 70.4102c27.71 -13.2402 48.0098 -39.1904 53.2998 -70.4102zM224 350.69
c7.69043 -7.4502 20.7695 -34.4307 23.4404 -78.6904h-46.8701c2.66016 44.2695 15.7393 71.2402 23.4297 78.6904zM182.92 342.41c-7.67969 -19.0605 -12.7197 -43.3799 -14.21 -70.4102h-39.0898c5.28027 31.2197 25.5898 57.1699 53.2998 70.4102zM182.92 169.59
c-27.71 13.2402 -48.0195 39.1904 -53.2998 70.4102h39.0898c1.49023 -27.0303 6.53027 -51.3496 14.21 -70.4102zM247.43 240c-2.66016 -44.2598 -15.7393 -71.2402 -23.4395 -78.6904c-7.69043 7.4502 -20.7705 34.4307 -23.4307 78.6904h46.8701zM448 89.5996
c0 -9.59961 -3.2002 -16 -9.59961 -19.1992c-3.2002 -12.8008 -3.2002 -57.6006 0 -73.6006c6.39941 -6.39941 9.59961 -12.7998 9.59961 -19.2002v-16c0 -16 -12.7998 -25.5996 -25.5996 -25.5996h-326.4c-54.4004 0 -96 41.5996 -96 96v320c0 54.4004 41.5996 96 96 96
h326.4c16 0 25.5996 -9.59961 25.5996 -25.5996v-332.801zM224 384c-70.6904 0 -128 -57.3096 -128 -128s57.3096 -128 128 -128s128 57.3096 128 128s-57.3096 128 -128 128zM384 0v64h-288c-16 0 -32 -12.7998 -32 -32s12.7998 -32 32 -32h288z" />
    <glyph glyph-name="award" unicode="&#xf559;" horiz-adv-x="384" 
d="M97.1201 85.3701c13.79 -13.7803 32.1104 -21.3701 51.6104 -21.3701c12.4395 0 24.4697 3.54004 35.3096 9.58008l-52.0498 -127.62c-4.39062 -10.7695 -18.4307 -13.4004 -26.4307 -4.95996l-36.2393 38.2803l-52.6904 -2.01074
c-11.6201 -0.439453 -19.8203 11.2607 -15.4297 22.0303l45.3701 111.24c7.55957 -5.87012 15.9199 -10.7705 25.4297 -13.3203c20.96 -5.60938 16.4297 -3.16016 25.1201 -11.8496zM382.8 -0.700195c4.39062 -10.7598 -3.80957 -22.4697 -15.4297 -22.0303
l-52.6904 2.01074l-36.25 -38.2803c-7.98926 -8.44043 -22.04 -5.80957 -26.4297 4.95996l-52.0498 127.62c10.8398 -6.03027 22.8701 -9.58008 35.3096 -9.58008c19.5 0 37.8301 7.58984 51.6201 21.3701c8.66992 8.66992 4.0498 6.20996 25.1201 11.8496
c9.50977 2.5498 17.8701 7.44043 25.4297 13.3203zM263 108c-13.2305 -13.4697 -33.8398 -15.8799 -49.7305 -5.82031c-5.37305 3.41211 -14.8994 6.18066 -21.2646 6.18066c-6.36426 0 -15.8916 -2.76855 -21.2646 -6.18066
c-15.9004 -10.0596 -36.5098 -7.64941 -49.7402 5.82031c-14.7305 15 -16.4004 14.04 -38.7803 20.1396c-13.8896 3.79004 -24.75 14.8408 -28.4697 28.9805c-7.48047 28.3994 -5.54004 24.9697 -25.9502 45.75c-10.1699 10.3604 -14.1396 25.4502 -10.4199 39.5898
c7.48047 28.4199 7.46973 24.46 0 52.8203c-3.72949 14.1396 0.25 29.2295 10.4199 39.5801c20.4102 20.7793 18.4805 17.3594 25.9502 45.75c3.71973 14.1396 14.5801 25.1895 28.4697 28.9795c27.8906 7.61035 24.5303 5.62988 44.9404 26.4102
c10.1699 10.3604 25 14.4004 38.8896 10.6104c27.9199 -7.61035 24.0303 -7.60059 51.9004 0c13.8896 3.79004 28.7197 -0.260742 38.8896 -10.6104c20.4297 -20.79 17.0703 -18.7998 44.9502 -26.4102c13.8896 -3.79004 24.75 -14.8398 28.4697 -28.9795
c7.48047 -28.3906 5.54004 -24.9707 25.9502 -45.75c10.1699 -10.3506 14.1396 -25.4404 10.4199 -39.5801c-7.47949 -28.4102 -7.46973 -24.4502 0 -52.8301c3.71973 -14.1406 -0.25 -29.2305 -10.4199 -39.5801c-20.4102 -20.7803 -18.4697 -17.3506 -25.9502 -45.75
c-3.71973 -14.1396 -14.5801 -25.1904 -28.4697 -28.9805c-21.7598 -5.92969 -23.5098 -4.58984 -38.79 -20.1396zM97.6602 272.04c0 -53.0303 42.2402 -96.0205 94.3398 -96.0205s94.3398 42.9902 94.3398 96.0205s-42.2402 96.0195 -94.3398 96.0195
s-94.3398 -42.9893 -94.3398 -96.0195z" />
    <glyph glyph-name="backspace" unicode="&#xf55a;" horiz-adv-x="640" 
d="M576 384c35.3496 0 64 -28.6504 64 -64v-256c0 -35.3496 -28.6504 -64 -64 -64h-370.75c-16.9697 0 -33.25 6.75 -45.25 18.75l-150.63 150.63c-12.5 12.4902 -12.5 32.75 0 45.25l150.63 150.62c10.3438 10.3496 30.6143 18.75 45.2471 18.75h0.0126953h370.74z
M491.31 129.94l-62.0596 62.0596l62.0596 62.0596c6.25 6.25 6.25 16.3809 0 22.6309l-22.6191 22.6191c-6.25 6.25 -16.3809 6.25 -22.6309 0l-62.0596 -62.0596l-62.0596 62.0596c-6.25 6.25 -16.3809 6.25 -22.6309 0l-22.6191 -22.6191
c-6.25 -6.25 -6.25 -16.3809 0 -22.6309l62.0596 -62.0596l-62.0596 -62.0596c-6.25 -6.25 -6.25 -16.3809 0 -22.6309l22.6191 -22.6191c6.25 -6.25 16.3809 -6.25 22.6309 0l62.0596 62.0596l62.0596 -62.0596c6.25 -6.25 16.3809 -6.25 22.6309 0l22.6191 22.6191
c6.25 6.25 6.25 16.3809 0 22.6309z" />
    <glyph glyph-name="bezier-curve" unicode="&#xf55b;" horiz-adv-x="640" 
d="M368 416c17.6699 0 32 -14.3301 32 -32v-96c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32v96c0 17.6699 14.3301 32 32 32h96zM208 360v-72c0 -9.4502 2.17969 -18.3604 5.87988 -26.4404c-34.2695 -24.3496 -59.7402 -59.9492 -71.04 -101.56
h-49.3994c13.6797 64.6797 54.1699 119.48 109.54 152h-79.7305c-9.5 -23.4404 -32.4102 -40 -59.25 -40c-35.3398 0 -64 28.6504 -64 64s28.6602 64 64 64c26.8398 0 49.75 -16.5596 59.25 -40h84.75zM160 128c17.6699 0 32 -14.3301 32 -32v-96
c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32v96c0 17.6699 14.3301 32 32 32h96zM576 400c35.3398 0 64 -28.6504 64 -64s-28.6602 -64 -64 -64c-26.8398 0 -49.75 16.5596 -59.25 40h-79.7305c55.3701 -32.5195 95.8604 -87.3203 109.54 -152
h-49.3994c-11.2998 41.6104 -36.7705 77.21 -71.04 101.56c3.68945 8.08008 5.87988 16.9902 5.87988 26.4404v72h84.75c9.5 23.4404 32.4102 40 59.25 40zM576 128c17.6699 0 32 -14.3301 32 -32v-96c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32
v96c0 17.6699 14.3301 32 32 32h96z" />
    <glyph glyph-name="bong" unicode="&#xf55c;" horiz-adv-x="448" 
d="M302.5 -64h-221c-23.1699 0 -44.4199 12.5801 -56 32.6602c-16.1904 28.0703 -25.5 60.5898 -25.5 95.3398c0 71.0303 38.6699 132.9 96 166.11v153.93l-15.9697 -0.0205078c-8.85059 -0.00976562 -16.0303 7.16016 -16.0205 16.0107l0.0400391 31.7295
c0.00976562 8.82031 7.16016 15.9707 15.9805 15.9805l223.939 0.259766c8.85059 0.00976562 16.0303 -7.16992 16.0205 -16.0195l-0.0400391 -31.7207c-0.00976562 -8.81934 -7.16016 -15.9697 -15.9805 -15.9795l-15.9697 -0.0205078v-154.16
c14.1201 -8.17969 27.0898 -18.1396 38.6504 -29.5098l39.4092 39.4102l-9.37988 9.37988c-6.25 6.25 -6.25 16.3799 0 22.6299l11.3105 11.3105c6.25 6.25 16.3799 6.25 22.6299 0l52.6895 -52.6904c6.25 -6.25 6.25 -16.3799 0 -22.6299l-11.2998 -11.3203
c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-9.37988 9.37988l-43.4404 -43.4395c17.3604 -28.8105 27.4404 -62.5 27.4404 -98.6201c0 -34.75 -9.30957 -67.2598 -25.5 -95.3398c-11.5703 -20.0801 -32.8203 -32.6602 -56 -32.6602zM120.06 188.57
c-24.8096 -14.3701 -44.1094 -35.7305 -56.5596 -60.5703h257c-12.4404 24.8398 -31.75 46.2002 -56.5596 60.5703l-23.9404 13.8701v181.76l-96 -0.110352v-181.649z" />
    <glyph glyph-name="brush" unicode="&#xf55d;" horiz-adv-x="384" 
d="M352 448c17.6699 0 32 -14.3301 32 -32v-224h-384v224c0 17.6699 14.3301 32 32 32h320zM0 128v32h384v-32c0 -35.3496 -28.6602 -64 -64 -64h-64v-64c0 -35.3496 -28.6602 -64 -64 -64s-64 28.6504 -64 64v64h-64c-35.3398 0 -64 28.6504 -64 64zM192 24
c-13.25 0 -24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24s24 10.75 24 24c0 13.2598 -10.75 24 -24 24z" />
    <glyph glyph-name="bus-alt" unicode="&#xf55e;" 
d="M488 320c13.25 0 24 -10.7402 24 -24v-80c0 -13.25 -10.75 -24 -24 -24h-8v-166.4c0 -12.7998 -9.59961 -25.5996 -25.5996 -25.5996h-6.40039v-32c0 -17.6699 -14.3301 -32 -32 -32h-32c-17.6699 0 -32 14.3301 -32 32v32h-192v-32c0 -17.6699 -14.3301 -32 -32 -32h-32
c-17.6699 0 -32 14.3301 -32 32v32c-17.6699 0 -32 14.3301 -32 32v160h-8c-13.25 0 -24 10.75 -24 24v80c0 13.2598 10.75 24 24 24h8v48c0 44.7998 99.2002 80 224 80s224 -35.2002 224 -80v-48h8zM160 376v-16c0 -4.41992 3.58008 -8 8 -8h176c4.41992 0 8 3.58008 8 8
v16c0 4.41992 -3.58008 8 -8 8h-176c-4.41992 0 -8 -3.58008 -8 -8zM112 48c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM240 160v160h-112c-17.6699 0 -32 -14.3301 -32 -32v-96c0 -17.6699 14.3301 -32 32 -32h112zM272 160
h112c17.6699 0 32 14.3301 32 32v96c0 17.6699 -14.3301 32 -32 32h-112v-160zM400 48c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="cannabis" unicode="&#xf55f;" 
d="M503.47 87.75c5.24023 -2.75977 8.52051 -8.20996 8.53027 -14.1504c0.00976562 -5.92969 -3.26953 -11.3691 -8.50977 -14.1494c-2.4502 -1.29004 -60.7705 -31.7197 -133.49 -31.7197c-6.12988 0 -11.96 0.0996094 -17.5 0.30957
c11.3604 -22.2305 16.5195 -38.3096 16.8096 -39.2197c1.80078 -5.68066 0.290039 -11.8906 -3.90918 -16.1104c-2.5918 -2.60059 -7.67578 -4.71094 -11.3467 -4.71094c-1.34277 0 -3.47168 0.322266 -4.75391 0.720703c-1.83008 0.580078 -37.7197 11.9902 -77.2998 39.29
v-64.0098c0 -4.41992 -3.58008 -8 -8 -8h-16c-4.41992 0 -8 3.58008 -8 8v64.0195c-39.5801 -27.2998 -75.4697 -38.7197 -77.2998 -39.2891c-1.28223 -0.398438 -3.41113 -0.72168 -4.75391 -0.72168c-3.6709 0 -8.75488 2.11035 -11.3467 4.71094
c-4.19922 4.2207 -5.70996 10.4307 -3.90918 16.1104c0.290039 0.910156 5.43945 16.9902 16.8096 39.2197c-5.54004 -0.209961 -11.3604 -0.30957 -17.5 -0.30957c-72.7305 0 -131.04 30.4297 -133.49 31.7197c-4.69629 2.48926 -8.50879 8.82422 -8.50879 14.1396
c0 5.32422 3.82129 11.6641 8.5293 14.1504c1.56934 0.820312 32.3896 16.8896 76.7793 25.8096c-64.25 75.1201 -84.0498 161.671 -84.9297 165.641c-0.210938 0.947266 -0.382812 2.50488 -0.382812 3.47559c0 3.65039 2.09375 8.71094 4.67285 11.2939
c3.03027 3.04004 7.12012 4.7002 11.3203 4.7002c1.14941 0 2.2998 -0.129883 3.43945 -0.379883c3.89062 -0.860352 86.5508 -19.5996 160.58 -79.7598c0 1.45996 -0.00976562 2.92969 -0.00976562 4.39941c0 118.79 59.9805 213.721 62.5303 217.7
c2.93945 4.58984 8.01953 7.37012 13.4697 7.37012h0.00195312c4.82812 0 10.8574 -3.30176 13.458 -7.37012c2.5498 -3.97949 62.5303 -98.9102 62.5303 -217.7c0 -1.46973 0 -2.93945 -0.00976562 -4.39941c74.0391 60.1699 156.699 78.9102 160.579 79.7598
c1.15039 0.259766 2.30078 0.379883 3.44043 0.379883c4.2002 0 8.29004 -1.66016 11.3203 -4.7002c3.85938 -3.87012 5.47949 -9.43945 4.2998 -14.7695c-0.879883 -3.96973 -20.6797 -90.5205 -84.9297 -165.641c44.3896 -8.91992 75.2197 -24.9893 76.7793 -25.8096z" />
    <glyph glyph-name="check-double" unicode="&#xf560;" 
d="M505 273.2c9.2998 -9.2998 9.2998 -24.5 -0.0996094 -34l-296 -296.2c-9.30078 -9.40039 -24.5 -9.40039 -33.9004 0l-168 168.1c-9.40039 9.40039 -9.40039 24.6006 0 34l39.7002 39.7002c9.2998 9.40039 24.5 9.40039 33.8994 0l111.4 -111.5l239.5 239.5
c9.2998 9.40039 24.5 9.40039 33.9004 0zM180.7 167.2l-112 112.2c-6.2002 6.19922 -6.2002 16.2998 0 22.5996l45.2998 45.2998c6.2002 6.2998 16.4004 6.2998 22.5996 0l55.4004 -55.5l151.5 151.5c6.2002 6.2998 16.4004 6.2998 22.5996 0l45.2002 -45.2998
c6.2002 -6.2002 6.2002 -16.2998 0 -22.5996l-208 -208.2c-6.2002 -6.2998 -16.3994 -6.2998 -22.5996 0z" />
    <glyph glyph-name="cocktail" unicode="&#xf561;" horiz-adv-x="576" 
d="M296 -16c22.0898 0 40 -17.9102 40 -40c0 -4.41992 -3.58008 -8 -8 -8h-240c-4.41992 0 -8 3.58008 -8 8c0 22.0898 17.9102 40 40 40h56v125.22l-168.74 168.73c-15.5195 15.5195 -4.5293 42.0498 17.4199 42.0498h366.641c21.9492 0 32.9395 -26.5303 17.4199 -42.0498
l-168.74 -168.73v-125.22h56zM432 448c79.5303 0 144 -64.4697 144 -144s-64.4697 -144 -144 -144c-27.4102 0 -52.7695 8.08008 -74.5801 21.3799l35.2598 35.2598c12.0303 -5.43945 25.2803 -8.63965 39.3203 -8.63965c52.9297 0 96 43.0596 96 96s-43.0703 96 -96 96
c-35.3701 0 -65.9902 -19.4502 -82.6396 -48h-52.54c19.8301 55.7998 72.5693 96 135.18 96z" />
    <glyph glyph-name="concierge-bell" unicode="&#xf562;" 
d="M288 317.46c108.51 -15.5703 192 -108.64 192 -221.46h-448c0 112.82 83.4902 205.89 192 221.46v18.54h-16c-8.83984 0 -16 7.16016 -16 16v16c0 8.83984 7.16016 16 16 16h96c8.83984 0 16 -7.16016 16 -16v-16c0 -8.83984 -7.16016 -16 -16 -16h-16v-18.54zM496 64
c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-480c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h480z" />
    <glyph glyph-name="cookie" unicode="&#xf563;" 
d="M510.37 193.21c4.37988 -27.6602 -0.110352 -56 -12.8203 -80.96l-35.0996 -68.8701c-10.7695 -21.1328 -36.6592 -47.0273 -57.79 -57.7998l-69.1201 -35.21c-24.8301 -12.6396 -53.0098 -17.1104 -80.5205 -12.75l-76.6992 12.1396
c-23.3896 3.70801 -55.9639 20.3066 -72.71 37.0498l-54.7607 54.75c-16.7959 16.8027 -33.4443 49.4844 -37.1592 72.9502l-12.0801 76.2705c-0.901367 5.68848 -1.63281 14.9805 -1.63281 20.7412c0 17.5723 6.47461 44.541 14.4521 60.1982l35.1006 68.8799
c10.7666 21.1357 36.6562 47.0303 57.79 57.8008l69.1201 35.21c24.8291 12.6494 53.0098 17.1201 80.5195 12.7598l76.7002 -12.1504c27.5303 -4.34961 52.9795 -17.3301 72.71 -37.0498l54.7598 -54.75c16.7969 -16.8027 33.4443 -49.4844 37.1602 -72.9502zM176 80
c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM208 240c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM368 112c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32
s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="cookie-bite" unicode="&#xf564;" 
d="M510.52 192.18c4.10059 -27.3301 -0.349609 -55.2695 -12.9092 -79.9102l-35.1006 -68.8799c-10.7656 -21.1367 -36.6562 -47.0361 -57.79 -57.8096l-69.1299 -35.21c-24.8301 -12.6504 -53.0195 -17.1201 -80.5303 -12.7598l-76.71 12.1494
c-23.3916 3.70801 -55.9658 20.3105 -72.71 37.0605l-54.7695 54.7598c-16.7969 16.8057 -33.4443 49.4912 -37.1602 72.96l-12.0801 76.2695c-0.900391 5.68945 -1.63184 14.9824 -1.63184 20.7422c0 17.5752 6.47461 44.5479 14.4521 60.208l35.0996 68.8799
c10.7646 21.1396 36.6543 47.0391 57.79 57.8105l69.1299 35.2197c24.5898 12.5205 52.46 16.96 79.7207 12.8203c0.859375 -69.96 57.6895 -126.45 127.859 -126.45c0 -70.1699 56.5 -127.01 126.47 -127.86zM176 80c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32
s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM208 240c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM368 112c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="crop-alt" unicode="&#xf565;" 
d="M488 96c13.25 0 24 -10.7402 24 -24v-48c0 -13.25 -10.75 -24 -24 -24h-40v-40c0 -13.25 -10.75 -24 -24 -24h-48c-13.25 0 -24 10.75 -24 24v328h-160v96h224c17.6699 0 32 -14.3301 32 -32v-256h40zM160 424v-328h160v-96h-224c-17.6699 0 -32 14.3301 -32 32v256h-40
c-13.25 0 -24 10.75 -24 24v48c0 13.2598 10.75 24 24 24h40v40c0 13.2598 10.75 24 24 24h48c13.25 0 24 -10.7402 24 -24z" />
    <glyph glyph-name="digital-tachograph" unicode="&#xf566;" horiz-adv-x="640" 
d="M608 352c17.6699 0 32 -14.3301 32 -32v-256c0 -17.6699 -14.3301 -32 -32 -32h-576c-17.6699 0 -32 14.3301 -32 32v256c0 17.6699 14.3301 32 32 32h576zM304 96v8c0 4.41992 -3.58008 8 -8 8h-224c-4.41992 0 -8 -3.58008 -8 -8v-8c0 -4.41992 3.58008 -8 8 -8h224
c4.41992 0 8 3.58008 8 8zM72 160c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-16zM136 160c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-16
c-4.41992 0 -8 -3.58008 -8 -8v-16zM200 160c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-16zM264 160c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8
h-16c-4.41992 0 -8 -3.58008 -8 -8v-16zM304 224v48c0 8.83984 -7.16016 16 -16 16h-208c-8.83984 0 -16 -7.16016 -16 -16v-48c0 -8.83984 7.16016 -16 16 -16h208c8.83984 0 16 7.16016 16 16zM576 96v8c0 4.41992 -3.58008 8 -8 8h-224c-4.41992 0 -8 -3.58008 -8 -8v-8
c0 -4.41992 3.58008 -8 8 -8h224c4.41992 0 8 3.58008 8 8z" />
    <glyph glyph-name="dizzy" unicode="&#xf567;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM152 233.4l28.7002 -28.7002c14.7002 -14.7998 37.7998 7.39941 22.5996 22.5996l-28.7002 28.7002l28.7002 28.7002c15 14.8994 -7.59961 37.5996 -22.5996 22.5996
l-28.7002 -28.7002l-28.7002 28.7002c-14.8994 15 -37.5996 -7.59961 -22.5996 -22.5996l28.7002 -28.7002l-28.7002 -28.7002c-15.2002 -15.0996 7.7998 -37.3994 22.5996 -22.5996zM248 32c35.2998 0 64 28.7002 64 64s-28.7002 64 -64 64s-64 -28.7002 -64 -64
s28.7002 -64 64 -64zM395.3 227.3l-28.7002 28.7002l28.7002 28.7002c15 14.8994 -7.59961 37.5996 -22.5996 22.5996l-28.7002 -28.7002l-28.7002 28.7002c-14.8994 15 -37.5996 -7.59961 -22.5996 -22.5996l28.7002 -28.7002l-28.7002 -28.7002
c-15.2002 -15.0996 7.7998 -37.3994 22.5996 -22.5996l28.7002 28.7002l28.7002 -28.7002c14.7002 -14.7998 37.7998 7.39941 22.5996 22.5996z" />
    <glyph glyph-name="drafting-compass" unicode="&#xf568;" 
d="M457.01 103.58l54.9805 -95.2305l-7.02051 -58.25c-1.2793 -10.5898 -12.3594 -16.9893 -22.1699 -12.7998l-53.9502 23.04l-54.3799 94.1904c29.9102 11.8701 57.4902 28.7197 82.54 49.0498zM499.5 198.14c-52.6201 -83.1299 -144.45 -134.14 -243.5 -134.14
c-35.3799 0 -69.8701 6.71973 -102.06 18.96l-70.8008 -122.63l-53.9492 -23.04c-9.81055 -4.19043 -20.8906 2.20996 -22.1709 12.7998l-7.01953 58.25l71.2803 123.46c-21.29 17.8105 -40.4102 38.3799 -55.9805 62.0205
c-4.99023 7.56934 -2.20996 17.9297 5.64062 22.4697l27.75 16.0703c7.40918 4.29004 16.5898 1.76953 21.3799 -5.33008c9.71973 -14.4102 21.1299 -27.3906 33.6797 -39l68.2998 118.31c-7.43945 13.6299 -12.0498 29.0303 -12.0498 45.6602c0 53.0195 42.9805 96 96 96
s96 -42.9805 96 -96c0 -16.6299 -4.61035 -32.0303 -12.0596 -45.6602l51.79 -89.71c-23.0508 -23.1699 -51.3809 -39.96 -82.6104 -48.9199l-51.0898 88.5c-0.69043 -0.0195312 -1.33984 -0.209961 -2.04004 -0.209961s-1.33984 0.19043 -2.04004 0.209961
l-67.3604 -116.68c22.1797 -7.28027 45.4805 -11.5303 69.4102 -11.5303c76.25 0 147.01 38.8496 188.12 102.38c4.64941 7.17969 13.7803 9.87012 21.2598 5.71973l28.0703 -15.5693c7.93945 -4.40039 10.9102 -14.7207 6.0498 -22.3906zM256 384
c-17.6699 0 -32 -14.3301 -32 -32s14.3301 -32 32 -32s32 14.3301 32 32s-14.3301 32 -32 32z" />
    <glyph glyph-name="drum" unicode="&#xf569;" 
d="M431.34 325.95c44.9004 -16.3398 80.6602 -42.7803 80.6602 -86.1006v-160.229c0 -30.2705 -27.5 -57.6797 -72 -77.8604v101.9c0 13.248 -10.752 24 -24 24s-24 -10.752 -24 -24v-118.93c-33.0498 -9.11035 -71.0703 -15.0605 -112 -16.7305v103.61
c0 13.248 -10.752 24 -24 24s-24 -10.752 -24 -24v-103.61c-40.9297 1.66992 -78.9502 7.62012 -112 16.7305v118.93c0 13.248 -10.752 24 -24 24s-24 -10.752 -24 -24v-101.9c-44.5 20.1807 -72 47.5898 -72 77.8604v160.229c0 107.601 219.55 112.15 256 112.15
c15.2197 0 62.4297 -0.910156 112.19 -9.69043l110.06 71c2.22461 1.4834 6.20117 2.6875 8.875 2.6875c4.72852 0 10.6934 -3.19238 13.3154 -7.12695l8.86914 -13.3105c1.4834 -2.22461 2.6875 -6.20117 2.6875 -8.875c0 -4.72754 -3.19238 -10.6924 -7.12695 -13.3145z
M256 175.76c114.87 0 208 28.6904 208 64.0898c0 21.3105 -33.9102 40.1504 -85.8604 51.75l-118.64 -76.5195c-2.22461 -1.4834 -6.20117 -2.6875 -8.875 -2.6875c-4.72852 0 -10.6934 3.19336 -13.3154 7.12695l-8.86914 13.3105
c-1.48535 2.22559 -2.69043 6.2041 -2.69043 8.87988c0 4.72461 3.18945 10.6875 7.12012 13.3096l72.8096 47c-15.9492 1.2002 -32.5293 1.91016 -49.6797 1.91016c-114.88 0 -208 -28.6797 -208 -64.0801c0 -35.3994 93.1201 -64.0898 208 -64.0898z" />
    <glyph glyph-name="drum-steelpan" unicode="&#xf56a;" horiz-adv-x="576" 
d="M288 416c159.06 0 288 -57.3096 288 -128v-192c0 -70.6904 -128.94 -128 -288 -128s-288 57.3096 -288 128v192c0 70.6904 128.94 128 288 128zM205.01 257.64c5.11035 19.0605 2.49023 38.96 -7.37012 56.0508l-25.5996 44.3398
c-73.9297 -13.6406 -124.04 -39.8701 -124.04 -70.0303c0 -30.7803 52.2305 -57.46 128.7 -70.8398c13.7695 9.91016 23.8594 23.8701 28.3096 40.4795zM288 208c21.0801 0 41.4102 1 60.8896 2.7002c-8.05957 26.1299 -32.1494 45.2998 -60.8896 45.2998
s-52.8301 -19.1699 -60.8896 -45.2998c19.4795 -1.7002 39.8096 -2.7002 60.8896 -2.7002zM352 352v13.04c-20.4004 1.87988 -41.7998 2.95996 -64 2.95996s-43.5996 -1.08008 -64 -2.95996v-13.04c0 -35.29 28.71 -64 64 -64s64 28.71 64 64zM398.93 217.1
c76.6699 13.3604 129.07 40.0703 129.07 70.9004c0 30.21 -50.2803 56.5 -124.44 70.0996l-25.6494 -44.4199c-9.87012 -17.0801 -12.4902 -36.9795 -7.37988 -56.04c4.45996 -16.6396 14.5898 -30.6299 28.3994 -40.54z" />
    <glyph glyph-name="feather-alt" unicode="&#xf56b;" 
d="M512 448c-1.80957 -26.2598 -11.71 -132.86 -53.6201 -234.79l-106.54 -53.21h81.1406c-9.08008 -16.4102 -19.2002 -32.2305 -30.4502 -47.1201l-146.79 -48.8799h100.95c-35.5605 -30.0703 -79.1006 -51.0996 -132.58 -56.54
c-41.8105 -4.83008 -83.8701 -7.21973 -125.96 -7.36035l-57.1309 -57.0693c-9.38965 -9.37012 -24.5996 -9.37012 -33.9795 0s-9.37988 24.5693 0 33.9395l259.5 259.24c6.25 6.25 6.25 16.3799 0 22.6299s-16.4004 6.25 -22.6504 0l-178.87 -178.689
c1.15039 26.7998 2.90039 53.5801 5.99023 80.2393c25.4307 249.41 389.21 284.051 440.99 287.61z" />
    <glyph glyph-name="file-contract" unicode="&#xf56c;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM64 376v-16c0 -4.41992 3.58008 -8 8 -8h80c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8
h-80c-4.41992 0 -8 -3.58008 -8 -8zM64 312v-16c0 -4.41992 3.58008 -8 8 -8h80c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-80c-4.41992 0 -8 -3.58008 -8 -8zM256.81 64c-4.19922 0 -8.13965 2.44043 -10.1592 6.5
c-11.9502 23.8604 -46.2305 30.3496 -66 14.1602l-13.8809 41.6396c-3.28906 9.82031 -12.4297 16.4102 -22.7695 16.4102s-19.4805 -6.59961 -22.7803 -16.4102l-18.1895 -54.6396c-1.53027 -4.58008 -5.81055 -7.66016 -10.6406 -7.66016h-12.3896
c-8.83984 0 -16 -7.16016 -16 -16s7.16016 -16 16 -16h12.3896c18.6201 0 35.1104 11.8701 41 29.5303l10.6104 31.8799l16.8301 -50.46c2.03027 -6.14062 7.58008 -10.4404 14.0303 -10.8906c0.389648 -0.0292969 0.759766 -0.0498047 1.13965 -0.0498047h0.00976562
c5.45508 0 11.8613 3.96094 14.2998 8.83984l7.6709 15.3408c2.7998 5.59961 7.93945 6.18945 10.0195 6.18945s7.21973 -0.599609 10.1699 -6.51953c7.37012 -14.7207 22.1904 -23.8604 38.6396 -23.8604h47.1904c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16h-47.1904z
M377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7z" />
    <glyph glyph-name="file-download" unicode="&#xf56d;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM300.45 100.64c10.1299 10.0703 3.00977 27.3604 -11.2705 27.3604h-65.1797v80
c0 8.83984 -7.16016 16 -16 16h-32c-8.83984 0 -16 -7.16016 -16 -16v-80h-65.1797c-14.2803 0 -21.4004 -17.29 -11.25 -27.3604l96.4199 -95.6992c6.64941 -6.61035 17.3896 -6.61035 24.04 0zM377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6.09961
c6.40039 0 12.5 -2.5 17 -7z" />
    <glyph glyph-name="file-export" unicode="&#xf56e;" horiz-adv-x="576" 
d="M384 326.1v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7l97.9004 -98c4.5 -4.5 7 -10.5996 7 -16.9004zM571 140c6.59961 -6.59961 6.59961 -17.4004 0 -24l-95.7002 -96.5c-10.0996 -10.0996 -27.3994 -3 -27.3994 11.2998v65.2002h-64v64h64v65.0996
c0 14.3008 17.2998 21.4004 27.3994 11.3008zM192 112c0 -8.7998 7.2002 -16 16 -16h176v-136c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136c0 -13.2002 10.7998 -24 24 -24h136v-128h-176
c-8.7998 0 -16 -7.2002 -16 -16v-32z" />
    <glyph glyph-name="file-import" unicode="&#xf56f;" 
d="M16 160h112v-64h-112c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16zM505 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7zM352 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24
h-336c-13.2998 0 -24 10.7002 -24 24v136h127.9v-65.0996c0 -14.3008 17.2998 -21.4004 27.3994 -11.3008l95.7002 96.4004c6.59961 6.59961 6.59961 17.2998 0 24l-95.5996 96.5c-10.1006 10.0996 -27.4004 3 -27.4004 -11.2998v-65.2002h-128v264
c0 13.2998 10.7002 24 24 24h200v-136z" />
    <glyph glyph-name="file-invoice" unicode="&#xf570;" horiz-adv-x="384" 
d="M288 192v-64h-192v64h192zM377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7zM224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464
c0 13.2998 10.7002 24 24 24h200v-136zM64 376v-16c0 -4.41992 3.58008 -8 8 -8h80c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-80c-4.41992 0 -8 -3.58008 -8 -8zM64 312v-16c0 -4.41992 3.58008 -8 8 -8h80c4.41992 0 8 3.58008 8 8v16
c0 4.41992 -3.58008 8 -8 8h-80c-4.41992 0 -8 -3.58008 -8 -8zM320 8v16c0 4.41992 -3.58008 8 -8 8h-80c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h80c4.41992 0 8 3.58008 8 8zM320 208c0 8.83984 -7.16016 16 -16 16h-224
c-8.83984 0 -16 -7.16016 -16 -16v-96c0 -8.83984 7.16016 -16 16 -16h224c8.83984 0 16 7.16016 16 16v96z" />
    <glyph glyph-name="file-invoice-dollar" unicode="&#xf571;" horiz-adv-x="384" 
d="M377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7zM224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136z
M64 376v-16c0 -4.41992 3.58008 -8 8 -8h80c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-80c-4.41992 0 -8 -3.58008 -8 -8zM64 296c0 -4.41992 3.58008 -8 8 -8h80c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-80c-4.41992 0 -8 -3.58008 -8 -8
v-16zM208 32.1201c23.6201 0.629883 42.6699 20.54 42.6699 45.0703c0 19.9697 -12.9902 37.8096 -31.5801 43.3896l-45 13.5c-5.16016 1.54004 -8.76953 6.78027 -8.76953 12.7295c0 7.27051 5.2998 13.1904 11.7998 13.1904h28.1104
c4.55957 0 8.94922 -1.29004 12.8193 -3.71973c3.24023 -2.03027 7.36035 -1.91016 10.1299 0.729492l11.75 11.21c3.53027 3.37012 3.33008 9.20996 -0.569336 12.1406c-9.10059 6.83984 -20.0801 10.7695 -31.3701 11.3496v24.29c0 4.41992 -3.58008 8 -8 8h-16
c-4.41992 0 -8 -3.58008 -8 -8v-24.1201c-23.6201 -0.629883 -42.6699 -20.5498 -42.6699 -45.0703c0 -19.9697 12.9893 -37.8096 31.5801 -43.3896l45 -13.5c5.15918 -1.54004 8.76953 -6.78027 8.76953 -12.7295c0 -7.27051 -5.2998 -13.1904 -11.7998 -13.1904h-28.1104
c-4.55957 0 -8.9502 1.2998 -12.8193 3.71973c-3.24023 2.03027 -7.36035 1.91016 -10.1309 -0.729492l-11.75 -11.21c-3.5293 -3.37012 -3.3291 -9.20996 0.570312 -12.1406c9.10059 -6.83008 20.0801 -10.7695 31.3701 -11.3496v-24.29c0 -4.41992 3.58008 -8 8 -8h16
c4.41992 0 8 3.58008 8 8v24.1201z" />
    <glyph glyph-name="file-prescription" unicode="&#xf572;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM292.53 132.52c-6.25 6.25 -16.3799 6.25 -22.6299 0l-29.9004 -29.8994l-33.46 33.46
c19.8398 10.8701 33.46 31.7002 33.46 55.9199c0 35.3496 -28.6504 64 -64 64h-80c-8.83984 0 -16 -7.16016 -16 -16v-160c0 -8.83984 7.16016 -16 16 -16h16c8.83984 0 16 7.16016 16 16v48h18.7402l59.3193 -59.3096l-30.0596 -30.0605
c-6.25 -6.25 -6.25 -16.3799 0 -22.6299l11.3096 -11.3096c6.25 -6.25 16.3809 -6.25 22.6309 0l30.0596 30.0596l30.0596 -30.0703c6.25 -6.25 16.3809 -6.25 22.6309 0l11.3096 11.3105c6.25 6.25 6.25 16.3799 0 22.6299l-30.0596 30.0596l29.8994 29.9004
c6.25 6.25 6.25 16.3799 0 22.6299zM176 176h-48v32h48c8.82031 0 16 -7.17969 16 -16s-7.17969 -16 -16 -16zM384 326.1v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7l97.9004 -98c4.5 -4.5 7 -10.5996 7 -16.9004z" />
    <glyph glyph-name="file-signature" unicode="&#xf573;" horiz-adv-x="576" 
d="M218.17 23.8604c7.25 -14.4707 21.71 -23.4404 37.8301 -23.75l128 -0.110352v-40c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136c0 -13.2002 10.7998 -24 24 -24h136.01v-46.5498l-128 -127.09
v-82.1201c-3.87012 0.30957 -7.46973 2.47949 -9.35938 6.25977c-11.9404 23.8604 -46.25 30.3496 -66 14.1602l-13.8809 41.6396c-3.28906 9.82031 -12.4297 16.4102 -22.7695 16.4102s-19.4805 -6.59961 -22.7803 -16.4102l-18.1895 -54.6396
c-1.53027 -4.58008 -5.81055 -7.66016 -10.6406 -7.66016h-12.3896c-8.83984 0 -16 -7.16016 -16 -16s7.16016 -16 16 -16h12.3896c18.6201 0 35.1104 11.8701 41 29.5303l10.6104 31.8799l16.8301 -50.4697c4.4502 -13.46 23.1104 -14.8701 29.4795 -2.09082
l7.6709 15.3408c2.7998 5.59961 7.93945 6.18945 10.0195 6.18945s7.21973 -0.599609 10.1699 -6.51953zM384 326.1v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7l97.9004 -98c4.5 -4.5 7 -10.5996 7 -16.9004zM288 101.04l162.79 161.62l67.8799 -67.8799
l-161.68 -162.78h-68.9902v69.04zM568.54 280.67c9.9502 -9.93945 9.9502 -26.0703 0 -36.0098l-27.25 -27.25l-67.8799 67.8799l27.25 27.25c9.93945 9.94043 26.0703 9.94043 36.0098 0z" />
    <glyph glyph-name="file-upload" unicode="&#xf574;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM289.18 95.9902c14.2803 0 21.4004 17.29 11.25 27.3594l-96.4199 95.7002
c-6.64941 6.61035 -17.3896 6.61035 -24.04 0l-96.4199 -95.7002c-10.1396 -10.0693 -3.00977 -27.3594 11.2705 -27.3594h65.1797v-80c0 -8.83984 7.16016 -16 16 -16h32c8.83984 0 16 7.16016 16 16v80h65.1797zM377 343c4.5 -4.5 7 -10.5996 7 -16.9004v-6.09961h-128
v128h6.09961c6.40039 0 12.5 -2.5 17 -7z" />
    <glyph glyph-name="fill" unicode="&#xf575;" 
d="M502.63 230.94c12.4902 -12.5 12.4902 -32.7607 0 -45.2607l-221.57 -221.569c-18.75 -18.75 -43.3096 -28.1201 -67.8799 -28.1201c-24.5596 0 -49.1201 9.37988 -67.8701 28.1201l-117.189 117.189c-37.4902 37.4902 -37.4902 98.2598 0 135.75l94.7598 94.7598
l-86.1895 86.1807c-6.24023 6.25 -6.24023 16.3799 0 22.6299l22.6191 22.6104c6.24023 6.25 16.3809 6.25 22.6201 0l86.1807 -86.1807l81.5801 81.5801c6.23926 6.25 14.4297 9.37012 22.6191 9.37012c8.19043 0 16.3809 -3.12012 22.6309 -9.37012zM386.41 159.97
l48.3496 48.3398l-162.45 162.44l-58.9492 -58.9502l58.6094 -58.5996c12.4902 -12.4902 12.4902 -32.75 0 -45.2402c-12.4893 -12.4902 -32.75 -12.4902 -45.2393 0l-58.6104 58.5996l-81.6104 -81.6094l-13.1494 -13.1504
c-3.86035 -3.84961 -6.07031 -7.99023 -7.43066 -11.8301h320.48z" />
    <glyph glyph-name="fill-drip" unicode="&#xf576;" horiz-adv-x="576" 
d="M512 128c0 0 64 -92.6504 64 -128s-28.6602 -64 -64 -64s-64 28.6504 -64 64s64 128 64 128zM502.63 230.94c12.4902 -12.5 12.4902 -32.75 -0.00976562 -45.25l-221.57 -221.57c-18.7402 -18.75 -43.2998 -28.1201 -67.8701 -28.1201
c-24.5596 0 -49.1299 9.37988 -67.8701 28.1201l-117.189 117.189c-37.4902 37.4902 -37.4902 98.2705 0 135.75l94.7598 94.7607l-86.1895 86.1797c-6.24023 6.24023 -6.24023 16.3701 0 22.6201l22.6191 22.6201c6.24023 6.25 16.3701 6.25 22.6201 0l86.1807 -86.1904
l81.5801 81.5801c6.23926 6.25 14.4297 9.37012 22.6191 9.37012c8.19043 0 16.3809 -3.12012 22.6309 -9.37012zM386.41 159.97l48.3398 48.3398l-162.44 162.44l-58.9492 -58.9502l58.5996 -58.5996c12.4902 -12.4902 12.4902 -32.75 0 -45.2402
s-32.75 -12.4902 -45.2402 0l-58.5996 58.5996l-81.6104 -81.6094l-13.1494 -13.1504c-3.86035 -3.84961 -6.07031 -7.99023 -7.43066 -11.8301h320.48z" />
    <glyph glyph-name="fingerprint" unicode="&#xf577;" 
d="M256.12 202.04c13.2598 0 24 -10.75 23.9902 -24c1.55957 -99.1104 -15.9502 -176.61 -29.4805 -224.521c-2.97949 -10.5996 -12.6104 -17.5195 -23.0898 -17.5195c-20.9697 0 -25.8496 20.7695 -23.1201 30.4902c19.5605 69.6494 28.8398 139.3 27.7002 211.55
c0 13.2598 10.75 24 24 24zM255.26 283.77c56.9707 -0.839844 104.03 -46.9199 104.91 -102.72c0.790039 -50.8994 -2.99023 -102.08 -11.2695 -152.109c-0.770508 -4.6709 -7.61035 -23.1006 -27.5801 -19.7705c-13.0703 2.16016 -21.9307 14.5205 -19.7607 27.5801
c7.80078 47.2197 11.3809 95.5 10.6104 143.55c-0.469727 30.1299 -26.3096 55 -57.6201 55.4697c-34.5303 0.150391 -54.8594 -26.3896 -54.4502 -52.3398c0.800781 -51.4395 -4.0293 -102.93 -14.3691 -153.02c-2.69043 -12.9805 -15.3105 -21.3105 -28.3604 -18.6406
c-12.9697 2.6709 -21.3301 15.3809 -18.6396 28.3604c9.61914 46.6396 14.1191 94.6104 13.3691 142.55c-0.849609 54.0205 41.9004 101.16 103.16 101.09zM144.57 303.55c10.2793 -8.37012 11.8398 -23.4795 3.48926 -33.7598
c-18.7998 -23.0898 -28.4697 -51.0898 -28 -80.9697c0.640625 -40.6699 -2.66992 -81.4902 -9.85938 -121.33c-0.820312 -4.5498 -7.78027 -22.8604 -27.8906 -19.3604c-13.0498 2.36035 -21.6992 14.8398 -19.3594 27.8896c6.63965 36.7803 9.7002 74.4707 9.10938 112.051
c-0.639648 40.7197 13.1309 80.5 38.75 112c8.39062 10.2793 23.46 11.8193 33.7607 3.47949zM254.04 365.88c101.09 -1.5 184.6 -83.0801 186.16 -181.83c0.0615234 -3.97852 0.111328 -10.4375 0.111328 -14.417c0 -29.1934 -2.68848 -76.4277 -6.00195 -105.433
c-1.06934 -9.23047 -9.85938 -23.0605 -26.5791 -21.1104c-13.1602 1.5 -22.6104 13.4102 -21.1104 26.5801c4.2998 37.5205 6.16992 75.75 5.58008 113.63c-1.15039 73.0801 -63.4502 133.45 -138.88 134.58c-11.5303 0.0800781 -22.9502 -1.08008 -34 -3.68945
c-12.8906 -3 -25.8301 4.93945 -28.8906 17.8291c-3.04004 12.9102 4.94043 25.8301 17.8301 28.8906c14.9102 3.53027 30.3701 5.37988 45.7803 4.96973zM506.11 244.43c6.22949 -28.2295 6.00977 -50.1602 5.83008 -72.3398
c-0.110352 -13.1895 -10.8301 -23.7998 -24 -23.7998h-0.200195c-13.25 0.110352 -23.9102 10.9297 -23.7998 24.2002c0.209961 24.1895 0.00976562 40.1895 -4.7002 61.5996c-2.86035 12.9502 5.31934 25.75 18.2598 28.6104
c13.0996 2.92969 25.75 -5.35059 28.6104 -18.2705zM465.99 335.15c7.62012 -10.8408 5 -25.8105 -5.83984 -33.4307c-10.8604 -7.58984 -25.8105 -5 -33.4199 5.86035c-39.8906 56.8301 -105.171 91.3604 -174.62 92.3896
c-56.3408 0.810547 -108.92 -20.0596 -147.681 -58.8594c-37.1201 -37.1406 -57.1094 -86.5 -56.2793 -139l-0.160156 -23.6406c-0.379883 -13 -11.0498 -23.2998 -23.9707 -23.2998c-0.239258 0 -0.489258 0 -0.719727 0.0205078
c-13.25 0.379883 -23.6699 11.4395 -23.2803 24.6895l0.120117 21.4697c-1.04004 65.6104 23.9502 127.28 70.3203 173.71c48.0098 48.0303 112.56 73.7607 182.35 72.9209c84.79 -1.27051 164.48 -43.4404 213.181 -112.83z" />
    <glyph glyph-name="fish" unicode="&#xf578;" horiz-adv-x="576" 
d="M327.1 352c137.46 0 248.9 -128 248.9 -160s-111.44 -160 -248.9 -160c-89.9697 0 -168.55 54.7695 -212.279 101.62l-87.3301 -66.0498c-12.1299 -9.16992 -30.2402 0.599609 -27.1406 14.6602l24.1904 109.77l-24.1797 109.76
c-3.10059 14.0605 15.0098 23.8398 27.1396 14.6602l87.3301 -66.0498c43.7295 46.8604 122.3 101.63 212.27 101.63zM414.53 168c13.25 0 24 10.75 24 24c0 13.2598 -10.7402 24 -24 24c-13.25 0 -24 -10.7402 -24 -24c0 -13.25 10.75 -24 24 -24z" />
    <glyph glyph-name="flushed" unicode="&#xf579;" horiz-adv-x="496" 
d="M344 248c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM152 248c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248
s-248 111 -248 248s111 248 248 248zM80 224c0 -39.7998 32.2002 -72 72 -72s72 32.2002 72 72s-32.2002 72 -72 72s-72 -32.2002 -72 -72zM312 48c21.2002 0 21.2002 32 0 32h-128c-21.2002 0 -21.2002 -32 0 -32h128zM344 152c39.7998 0 72 32.2002 72 72
s-32.2002 72 -72 72s-72 -32.2002 -72 -72s32.2002 -72 72 -72z" />
    <glyph glyph-name="frown-open" unicode="&#xf57a;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM136 240c0 -17.7002 14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32zM323.3 56.7002c11.4004 -3.5 22.5 6.2002 20.5 18.0996
c-7 39.9004 -60.0996 61.2002 -95.7998 61.2002s-88.7998 -21.2002 -95.7998 -61.2002c-2 -11.7998 9 -21.5996 20.5 -18.0996c31.2002 9.59961 59.3994 15.2998 75.2998 15.2998s44.0996 -5.7002 75.2998 -15.2998zM328 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32
s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="glass-martini-alt" unicode="&#xf57b;" 
d="M502.05 390.4l-214.05 -214.04v-192.36h56c22.0898 0 40 -17.9102 40 -40c0 -4.41992 -3.58008 -8 -8 -8h-240c-4.41992 0 -8 3.58008 -8 8c0 22.0898 17.9102 40 40 40h56v192.36l-214.05 214.04c-21.25 21.2598 -6.2002 57.5996 23.8496 57.5996h444.4
c30.0498 0 45.0996 -36.3398 23.8496 -57.5996zM443.77 400h-375.529l48 -48h279.529z" />
    <glyph glyph-name="globe-africa" unicode="&#xf57c;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM408 224.5c0 8.55957 6.94043 15.5 15.5 15.5h18.4297c-19.0693 76.9805 -82.6992 136.37 -161.92 149.21v-21.7002c0 -8.55957 -6.93945 -15.5 -15.5 -15.5
h-24.21c-5.17969 0 -10.0195 -2.58984 -12.8896 -6.89941l-8.08008 -12.1104c-2.13965 -3.20996 -5.40039 -5.5 -9.13965 -6.44043l-14.4502 -3.60938c-6.90039 -1.73047 -11.7402 -7.93066 -11.7402 -15.04v-4.40039c0 -8.55957 6.94043 -15.5 15.5 -15.5h90.0498
h0.00292969c3.54297 0 8.45215 -2.0332 10.957 -4.54004l6.91992 -6.91992c2.91016 -2.91016 6.85059 -4.54004 10.96 -4.54004h10.0908c8.55957 0 15.5 -6.93945 15.5 -15.5c0 -6.66992 -4.27051 -12.5898 -10.6006 -14.7002l-47.3096 -15.7695
c-3.90039 -1.2998 -8.15039 -1 -11.8301 0.839844l-14.7207 7.36035c-7.5791 3.7998 -15.9492 5.76953 -24.4297 5.76953h-0.889648c-10.0527 -0.00195312 -24.7383 -4.89941 -32.7803 -10.9297l-27.5801 -20.6904c-13.75 -10.3193 -21.8496 -26.5098 -21.8496 -43.6992
v-14.0605c0.00195312 -12.4902 7.16992 -29.7959 16 -38.6299c10.25 -10.2402 24.1396 -16 38.6299 -16h25.8799c8.55957 0 15.5 -6.94043 15.5 -15.5v-29.8896v-0.00390625c0 -10.2822 3.73145 -26.0898 8.33008 -35.2861
c4.7002 -9.40039 14.3096 -15.3398 24.8203 -15.3398c8.19824 0.000976562 18.542 5.53809 23.0898 12.3594l13.0293 19.5498c5.9248 8.88477 17.125 21.9482 25 29.1602c2.4707 2.27051 4.14062 5.27051 4.76074 8.56055l4.2998 22.8301
c0.439453 2.3291 1.41016 4.5293 2.83008 6.42969l18.7402 24.9795c2.00977 2.68066 3.09961 5.9502 3.09961 9.30078v11.3398c0 8.55957 -6.94043 15.5 -15.5 15.5h-8.20996c-5.17969 0 -10.0205 2.58984 -12.8896 6.89941l-13.2402 19.8604
c-5.66992 8.50977 -1.70996 20.0703 7.99023 23.2998l2.64941 0.879883c1.31641 0.4375 3.50977 0.792969 4.89746 0.792969c2.5918 0 6.44531 -1.16602 8.60254 -2.60254l18.21 -12.1396c2.15527 -1.43945 6.00781 -2.60742 8.59961 -2.60742
c2.01953 0 5.125 0.733398 6.93066 1.63672l15.3896 7.7002c5.25 2.62012 8.57031 7.99023 8.57031 13.8604v6.92969z" />
    <glyph glyph-name="globe-americas" unicode="&#xf57d;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM330.29 82.4004c7.56934 7.52832 13.7168 22.3037 13.7197 32.9795v0.00488281c0 6.97266 -4 16.6338 -8.92969 21.5654l-13.6904 13.6895
c-6.00977 6 -14.1396 9.37012 -22.6299 9.37012h-66.75c-9.41016 4.70996 -21.4795 32 -32 32c-10.5195 0 -20.8994 2.4502 -30.3096 7.16016l-11.0801 5.54004c-4.0498 2.03027 -6.61035 6.16016 -6.61035 10.6904v0.00292969c0 4.75391 3.66016 9.83301 8.16992 11.3369
l31.1699 10.3896c1.3584 0.452148 3.62305 0.818359 5.05469 0.818359c3.30078 0 8.00293 -1.75488 10.4961 -3.91797l9.2793 -8.06055c1.4502 -1.25977 3.31055 -1.95996 5.24023 -1.95996h5.63965c5.94043 0 9.81055 6.25977 7.15039 11.5801l-15.5898 31.1904
c-0.464844 0.931641 -0.84082 2.53223 -0.84082 3.57227c0 1.86621 1.08398 4.43555 2.4209 5.7373l9.91992 9.65039c1.5 1.45996 3.5 2.26953 5.58008 2.26953h8.99023h0.00292969c1.82812 0 4.3623 1.04883 5.65625 2.33984l8 8
c3.12012 3.12012 3.12012 8.19043 0 11.3105l-4.68945 4.68945c-3.12012 3.12012 -3.12012 8.19043 0 11.3105l10.3398 10.3398l4.69043 4.67969c6.25 6.25 6.25 16.3799 0 22.6299l-28.3008 28.3008c-8.26953 -0.310547 -16.3994 -1.12988 -24.3896 -2.41992v-11.3008
c0 -11.8994 -12.5195 -19.6299 -23.1602 -14.3096l-24.0098 12.0098c-45.8398 -19.8496 -82.7305 -56.3896 -103.2 -101.89c9.92969 -14.7197 25.21 -37.3701 34.5898 -51.1406c4.29395 -6.3252 12.3848 -15.6172 18.0605 -20.7393l0.799805 -0.720703
c9.5498 -8.60938 20.1699 -15.9697 31.6504 -21.75c14 -7.0498 34.4395 -18.1592 48.8096 -26.1094c10.1904 -5.62988 16.46 -16.3301 16.46 -27.9707v-32.0098c0 -8.49023 3.37012 -16.6299 9.37012 -22.6299c14.9902 -14.9902 24.3203 -38.6299 22.6299 -51.25v-27.3799
c14.6504 0 28.8896 1.69043 42.6504 4.69043l17.3896 46.8496c2.04004 5.49023 3.25977 11.21 4.76953 16.8701c1.07031 4.00977 3.18066 7.70996 6.1709 10.71c3.31934 3.33008 7.40918 7.39941 11.3096 11.2803zM417 173.75l29.1797 -7.29004
c1.08008 8.37988 1.82031 16.8701 1.82031 25.54c0 32.1299 -7.7998 62.4102 -21.3203 89.3301l-12.9795 -6.49023c-3.74023 -1.85938 -6.91992 -4.67969 -9.24023 -8.14941l-19.5898 -29.3809c-2.22754 -3.33594 -4.03516 -9.29883 -4.03516 -13.3096
s1.80762 -9.97363 4.03516 -13.3096l17.9795 -26.9707c3.31055 -4.96973 8.36035 -8.51953 14.1504 -9.96973z" />
    <glyph glyph-name="globe-asia" unicode="&#xf57e;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM236.66 199.77l17.3701 28.9502c1.7998 2.99023 6.2002 2.82031 7.75977 -0.299805c1.34961 -2.70996 4.12012 -4.41992 7.15039 -4.41992h3.05957
c4.41992 0 8 3.58008 8 8v78.1201c0 6.05957 -3.41992 11.5996 -8.83984 14.3096l-10.8301 5.41016c-5.49023 2.75 -5.96973 10.4004 -0.860352 13.8105l50.1602 38.5293c-19.4297 6.31055 -40.1201 9.82031 -61.6299 9.82031c-110.28 0 -200 -89.7197 -200 -200
c0 -10.9199 1.12012 -21.5498 2.80957 -31.9902h62.5703c4.24023 0 8.31055 1.69043 11.3105 4.69043l19.4697 19.46c3.85938 3.85938 10.3701 2.7998 12.8096 -2.08008l22.6201 -45.2305c2.70996 -5.42969 8.25 -8.84961 14.3105 -8.84961h6.10938
c8.83984 0 16 7.16016 16 16v9.37012c0 4.24023 -1.68945 8.30957 -4.68945 11.3096l-5.66016 5.66016c-3.12012 3.12012 -3.12012 8.19043 0 11.3105l5.66016 5.65918c3 3 7.06934 4.69043 11.3096 4.69043h0.310547c5.61914 0 10.8291 2.9502 13.7197 7.76953z
M408 89.5703l-0.00976562 24.5996c0 4.24023 -1.69043 8.31055 -4.69043 11.3105l-11.9102 11.9092c-1.5 1.5 -2.33984 3.54004 -2.33984 5.66016v12.9307c0 2.20996 -1.79004 4 -4 4h-6.05957c-1.78027 0 -3.33984 -1.1709 -3.83984 -2.88086l-4.2002 -14.4697
c-0.490234 -1.7002 -2.06055 -2.87988 -3.83984 -2.87988h-3.80078c-1.4707 0.000976562 -3.12305 1.10254 -3.68945 2.45996l-5.35059 12.8496c-1.23926 2.99023 -4.15918 4.93066 -7.38965 4.93066h-12.0898h-0.0117188c-1.4082 0 -3.48145 -0.663086 -4.62793 -1.48047
l-23.71 -16.8896c-1.73047 -1.23047 -3.61035 -2.25977 -5.59082 -3.0498l-39.3398 -15.7402c-3.04004 -1.21973 -5.0293 -4.16016 -5.0293 -7.42969v-10.2002v-0.00292969c0 -1.8291 1.04785 -4.36328 2.33984 -5.65723l11.9102 -11.9102
c3 -3 7.06934 -4.68945 11.3096 -4.68945h10.3398c1.31055 0 2.61035 0.15918 3.87988 0.479492l21.2705 5.32031c1.76465 0.441406 4.67383 0.798828 6.49316 0.798828c6.12012 0 14.5986 -3.51172 18.9268 -7.83887l13.0098 -13.0098
c3 -3 7.07031 -4.69043 11.3096 -4.69043h15.1602c4.24023 0 8.31055 1.69043 11.3105 4.69043l9.56934 9.56934c3 3 4.69043 7.07031 4.69043 11.3105z" />
    <glyph glyph-name="grimace" unicode="&#xf57f;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM144 48v40h-40v-8c0 -17.7002 14.2998 -32 32 -32h8zM144 104v40h-8c-17.7002 0 -32 -14.2998 -32 -32v-8h40zM136 240c0 -17.7002 14.2998 -32 32 -32s32 14.2998 32 32
s-14.2998 32 -32 32s-32 -14.2998 -32 -32zM208 48v40h-48v-40h48zM208 104v40h-48v-40h48zM272 48v40h-48v-40h48zM272 104v40h-48v-40h48zM336 48v40h-48v-40h48zM336 104v40h-48v-40h48zM328 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32
s14.2998 -32 32 -32zM392 80v8h-40v-40h8c17.7002 0 32 14.2998 32 32zM392 104v8c0 17.7002 -14.2998 32 -32 32h-8v-40h40z" />
    <glyph glyph-name="grin" unicode="&#xf580;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM328 272c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32zM168 272c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32
s32 14.2998 32 32s-14.2998 32 -32 32zM248 16c60.5996 0 134.5 38.2998 143.8 93.2998c1.90039 11.7998 -9.39941 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002
c-11.4004 3.7002 -22.7002 -6.10059 -20.7002 -17.9004c9.2998 -55 83.2002 -93.2998 143.8 -93.2998z" />
    <glyph glyph-name="grin-alt" unicode="&#xf581;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM311.7 311.3c-12.4004 -18.3994 -15.2002 -36.8994 -15.7002 -55.2998c0.599609 -18.4004 3.2998 -36.9004 15.7002 -55.2998c8 -11.7002 25.0996 -11.4004 32.7002 0
c12.3994 18.3994 15.1992 36.8994 15.6992 55.2998c-0.599609 18.4004 -3.2998 36.9004 -15.6992 55.2998c-8 11.7002 -25.1006 11.4004 -32.7002 0zM151.7 311.3c-12.4004 -18.3994 -15.2002 -36.8994 -15.7002 -55.2998
c0.599609 -18.4004 3.2998 -36.9004 15.7002 -55.2998c8 -11.7002 25.0996 -11.4004 32.7002 0c12.3994 18.3994 15.1992 36.8994 15.6992 55.2998c-0.599609 18.4004 -3.2998 36.9004 -15.6992 55.2998c-8 11.7002 -25.1006 11.4004 -32.7002 0zM248 16
c60.5996 0 134.5 38.2998 143.8 93.2998c1.90039 11.7998 -9.2998 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002c-11.4004 3.7002 -22.7002 -6.10059 -20.7002 -17.9004
c9.2998 -55 83.2002 -93.2998 143.8 -93.2998z" />
    <glyph glyph-name="grin-beam" unicode="&#xf582;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM328 296c-23.7998 0 -52.7002 -29.2998 -55.7998 -71.4004c-0.700195 -8.5 10.7998 -11.7998 14.8994 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006
c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17c4.10059 -7.39941 15.6006 -4.09961 14.9004 4.5c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004zM168 296c-23.7998 0 -52.7002 -29.2998 -55.7998 -71.4004c-0.700195 -8.5 10.7002 -11.8994 14.8994 -4.5l9.5 17
c7.7002 13.7002 19.2002 21.6006 31.5 21.6006c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17c4.10059 -7.39941 15.6006 -4.09961 14.9004 4.5c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004zM248 16c60.5996 0 134.5 38.2998 143.8 93.2998
c1.90039 11.7998 -9.2998 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002c-11.3008 3.7002 -22.7002 -6 -20.7002 -17.9004c9.2998 -55 83.2002 -93.2998 143.8 -93.2998z" />
    <glyph glyph-name="grin-beam-sweat" unicode="&#xf583;" horiz-adv-x="504" 
d="M456 320c-26.5 0 -48 21 -48 47c0 20 28.5 60.4004 41.5996 77.7998c3.2002 4.2998 9.60059 4.2998 12.8008 0c13.0996 -17.3994 41.5996 -57.7998 41.5996 -77.7998c0 -26 -21.5 -47 -48 -47zM456 288c6.7998 0 13.2002 1.09961 19.5 2.59961
c13.0996 -30.1992 20.5 -63.5 20.5 -98.5996c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248c50.2998 0 97 -15.0996 136.1 -40.7998c-7.7998 -18 -8.09961 -27.7998 -8.09961 -32.2002c0 -43.5996 35.9004 -79 80 -79zM328 296
c-23.7998 0 -52.7002 -29.2998 -55.7998 -71.4004c-0.700195 -8.5 10.7998 -11.8994 14.8994 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17c4.10059 -7.5 15.6006 -4.09961 14.9004 4.5
c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004zM168 296c-23.7998 0 -52.7002 -29.2998 -55.7998 -71.4004c-0.700195 -8.5 10.7002 -11.8994 14.8994 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17
c4.10059 -7.5 15.6006 -4.09961 14.9004 4.5c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004zM248 16c60.5996 0 134.5 38.2998 143.8 93.2998c1.90039 11.7002 -9.2002 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002
s-92.9004 5.5 -123.1 15.2002c-11.4004 3.7002 -22.7002 -6.10059 -20.7002 -17.9004c9.2998 -55 83.2002 -93.2998 143.8 -93.2998z" />
    <glyph glyph-name="grin-hearts" unicode="&#xf584;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM90.4004 264.4c-7.7002 -20.2002 3.7998 -41.8008 24.1992 -47.2002l70.2002 -18.2002c4.60059 -1.2002 9.2998 1.5 10.5 6l19.4004 69.9004
c5.59961 20.2998 -7.40039 41.0996 -28.7998 44.5c-18.7002 3 -36.5 -9.80078 -41.5 -27.9004l-2 -7.09961l-7.10059 1.89941c-18.2002 4.7998 -38.2002 -4.2998 -44.8994 -21.8994zM248 16c60.5996 0 134.5 38.2998 143.8 93.2998
c1.90039 11.7998 -9.2998 21.5 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002c-11.5 3.59961 -22.7002 -6.10059 -20.7002 -17.9004c9.2998 -55 83.2002 -93.2998 143.8 -93.2998zM381.4 217.3
c20.3994 5.2998 31.8994 26.9004 24.1992 47.2002c-6.69922 17.5996 -26.6992 26.5996 -44.8994 21.9004l-7.10059 -1.90039l-2 7.09961c-5.09961 18.1006 -22.8994 30.9004 -41.5 27.9004c-21.3994 -3.40039 -34.3994 -24.2002 -28.7998 -44.5l19.4004 -69.9004
c1.2998 -4.5 6 -7.19922 10.5 -6z" />
    <glyph glyph-name="grin-squint" unicode="&#xf585;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM281.8 250.3c-7.7002 -4.7002 -7.7002 -15.8994 0 -20.5996l80 -48c11.5 -6.7998 24.1006 7.59961 15.4004 18l-33.6006 40.2998l33.6006 40.2998
c8.59961 10.2998 -3.7998 24.9004 -15.4004 18zM118.8 280.3l33.6006 -40.2998l-33.6006 -40.2998c-8.59961 -10.4004 3.90039 -24.7998 15.4004 -18l80 48c7.7998 4.7002 7.7998 15.8994 0 20.5996l-80 48c-11.6006 6.90039 -24 -7.7002 -15.4004 -18zM248 16
c60.5996 0 134.5 38.2998 143.8 93.2998c1.90039 11.7002 -9.2002 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002c-11.3008 3.7002 -22.7002 -6 -20.7002 -17.9004
c9.2998 -55 83.2002 -93.2998 143.8 -93.2998z" />
    <glyph glyph-name="grin-squint-tears" unicode="&#xf586;" 
d="M409.6 336.1c-5.59961 -0.799805 -10.2998 3.90039 -9.5 9.40039c3.30078 22.5996 12 73.5 26.8008 88.2998c19.0996 19.2002 50.6992 18.9004 70.2998 -0.700195c19.5996 -19.5996 19.8994 -51 0.700195 -70.1992
c-14.8008 -14.8008 -65.7002 -23.6006 -88.3008 -26.8008zM102.4 47.9004c5.59961 0.799805 10.2998 -3.90039 9.5 -9.40039c-3.30078 -22.5996 -12 -73.5 -26.8008 -88.2998c-19.1992 -19.2002 -50.5996 -18.9004 -70.1992 0.700195
c-19.6006 19.5996 -19.9004 51.0996 -0.800781 70.1992c14.8008 14.8008 65.7002 23.6006 88.3008 26.8008zM414.1 304.4c24 3.5 42.1006 7.39941 56.5 11.5c54.8008 -94.9004 42 -218.2 -39.1992 -299.301c-81.2002 -81.0996 -204.5 -94 -299.301 -39.1992
c4.10059 14.3994 8.10059 32.5 11.5 56.5c2.90039 20.5 -12.5 49.5996 -45.6992 45.6992c-24.1006 -3.5 -42.1006 -7.39941 -56.5 -11.5c-54.8008 94.9004 -41.9004 218.2 39.1992 299.301c81.2002 81.0996 204.5 94 299.301 39.1992
c-4.10059 -14.3994 -8.10059 -32.5 -11.5 -56.5c-2.90039 -20.5996 12.6992 -49.5996 45.6992 -45.6992zM255.7 342l-22.5 -90.5996c-2.2002 -8.60059 5.59961 -16.7002 14.5 -14.5l90.5 22.5996c13.0996 3.2998 11.5996 22.4004 -1.7998 23.5996l-52.3008 4.80078
l-4.7998 52.2998c-1.2002 13.2998 -20.2998 15 -23.5996 1.7998zM164.8 111.7c1.2998 -13.4004 20.4004 -14.9004 23.5 -1.7002l22.6006 90.5c2.19922 8.7002 -5.7002 16.7002 -14.5 14.5l-90.5 -22.5996c-13.1006 -3.30078 -11.6006 -22.4004 1.7998 -23.6006
l52.2998 -4.7998zM380.5 67.5c42.7998 42.9004 68 122.3 35.7002 167.6c-7.10059 9.90039 -21.9004 8.5 -27.2998 -2c-14.6006 -28.1992 -42.4004 -63.8994 -76.3008 -97.7998c-33.8994 -33.8994 -69.5 -61.7002 -97.7998 -76.2998
c-10.7002 -5.40039 -11.7998 -20.2998 -2 -27.2002c14.4004 -10.2002 32.1006 -14.7002 51 -14.7002c41 0 87.4004 21.1006 116.7 50.4004z" />
    <glyph glyph-name="grin-stars" unicode="&#xf587;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM94.5996 279.1c-6.19922 -1 -8.89941 -8.59961 -4.2998 -13.2998l25.4004 -24.5996l-6 -34.9004c-1 -6.2002 5.2998 -11 11 -7.89941l31.2998 16.2998l31.2002 -16.2002
c5.7002 -3.09961 12 1.7002 11 7.90039l-6 34.8994l25.3994 24.6006c4.60059 4.59961 1.90039 12.1992 -4.2998 13.1992l-34.8994 5l-15.5 31.6006c-2.90039 5.7998 -11 5.7998 -13.9004 0l-15.5 -31.6006zM248 16c60.5996 0 134.5 38.2998 143.8 93.2998
c1.90039 11.7998 -9.2002 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002c-11.4004 3.59961 -22.7002 -6.10059 -20.7002 -17.9004c9.2998 -55 83.2002 -93.2998 143.8 -93.2998zM405.7 265.9
c4.59961 4.59961 1.89941 12.1992 -4.40039 13.0996l-34.8994 5l-15.5 31.5996c-2.90039 5.80078 -11 5.80078 -13.9004 0l-15.5 -31.5996l-34.9004 -5c-6.19922 -1 -8.7998 -8.59961 -4.2998 -13.2002l25.4004 -24.5996l-6 -34.9004c-1 -6.2002 5.2998 -11 11 -7.89941
l31.2998 16.2998l31.2998 -16.2002c5.7002 -3.09961 12 1.7002 11 7.90039l-6 34.8994z" />
    <glyph glyph-name="grin-tears" unicode="&#xf588;" horiz-adv-x="640" 
d="M102.4 191.9c5.59961 0.799805 10.2998 -3.90039 9.5 -9.40039c-3.30078 -22.5996 -12 -73.5 -26.8008 -88.2998c-19.1992 -19.2002 -50.5996 -18.9004 -70.1992 0.700195c-19.6006 19.5996 -19.9004 51.0996 -0.800781 70.1992
c14.8008 14.8008 65.7002 23.6006 88.3008 26.8008zM625.8 165.1c19.2002 -19.0996 18.7998 -50.6992 -0.799805 -70.2998c-19.5996 -19.5996 -51 -19.8994 -70.2002 -0.700195c-14.7998 14.8008 -23.5996 65.7002 -26.7998 88.3008c-0.799805 5.59961 4 10.2998 9.5 9.5
c22.5996 -3.30078 73.5 -12 88.2998 -26.8008zM496.4 177.9c11.7998 -82.3008 29.8994 -100.4 35.7998 -106.301c0.899414 -1 2 -1.59961 3 -2.5c-42.7002 -74.6992 -123 -125.1 -215.2 -125.1s-172.5 50.4004 -215.2 125c1 0.900391 2.10059 1.59961 3 2.5
c5.90039 6 24 24.0996 35.7998 106.4c2.90039 20.3994 -12.5 49.5996 -45.6992 45.6992c-8.90039 -1.2998 -16.8008 -2.69922 -24.3008 -4.09961c13.7002 124 118.7 220.5 246.4 220.5s232.7 -96.5 246.4 -220.5c-7.5 1.40039 -15.4004 2.7998 -24.3008 4.09961
c-26.5996 3.80078 -49.5 -19.0996 -45.6992 -45.6992zM400 296c-23.7998 0 -52.7002 -29.2998 -55.7998 -71.4004c-0.700195 -8.5 10.7002 -11.8994 14.8994 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17
c4.10059 -7.5 15.6006 -4.09961 14.9004 4.5c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004zM240 296c-23.7998 0 -52.7002 -29.2998 -55.7998 -71.4004c-0.700195 -8.5 10.7002 -11.8994 14.8994 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006
c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17c4.10059 -7.5 15.6006 -4.09961 14.9004 4.5c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004zM320 16c60.5996 0 134.5 38.2998 143.8 93.2998c1.90039 11.7998 -9.2998 21.6006 -20.7002 17.9004
c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002c-11.5 3.7002 -22.7002 -6.2002 -20.7002 -17.9004c9.2998 -55 83.2002 -93.2998 143.8 -93.2998z" />
    <glyph glyph-name="grin-tongue" unicode="&#xf589;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248c0 -106.3 -67 -196.7 -161 -232c5.59961 12.2002 9 25.7002 9 40v45.5c24.7002 16.2002 43.5 38.0996 47.7998 63.7998c1.90039 11.7998 -9.2998 21.5 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002
s-92.9004 5.5 -123.1 15.2002c-11.4004 3.59961 -22.7002 -6.10059 -20.7002 -17.9004c4.2998 -25.7002 23.0996 -47.5996 47.7998 -63.7998v-45.5c0 -14.2998 3.40039 -27.7998 9 -40c-94 35.2998 -161 125.7 -161 232c0 137 111 248 248 248zM168 208
c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM328 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM293.1 73.4004c0.800781 -0.400391 -0.5 0.299805 19 -9.30078v-64
c0 -35.5996 -29.1992 -64.5 -64.8994 -64c-35.1006 0.400391 -63.1006 29.7002 -63.1006 64.9004v63c19.2002 9.59961 18 9 18.9004 9.40039c14.4004 6.5 31.0996 -2.2002 34.5996 -17.6006l1.80078 -7.7998c2.09961 -9.2002 15.1992 -9.2002 17.2998 0l1.7998 7.7998
c3.5 15.4004 20.2002 24.1006 34.5996 17.6006z" />
    <glyph glyph-name="grin-tongue-squint" unicode="&#xf58a;" horiz-adv-x="496" 
d="M293.1 73.4004c0.800781 -0.400391 -0.5 0.299805 19 -9.30078v-64c0 -35.5996 -29.1992 -64.5 -64.8994 -64c-35.1006 0.400391 -63.1006 29.7002 -63.1006 64.9004v63c19.2002 9.59961 18 9 18.9004 9.40039c14.4004 6.5 31.0996 -2.2002 34.5996 -17.6006
l1.80078 -7.7998c2.09961 -9.2002 15.1992 -9.2002 17.2998 0l1.7998 7.7998c3.5 15.4004 20.2002 24.1006 34.5996 17.6006zM248 440c137 0 248 -111 248 -248c0 -106.3 -67 -196.7 -161 -232c5.59961 12.2002 9 25.7002 9 40v45.5
c24.7002 16.2002 43.5 38.0996 47.7998 63.7998c1.90039 11.7998 -9.2998 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002c-11.5 3.59961 -22.7002 -6.10059 -20.7002 -17.9004
c4.2998 -25.7002 23.0996 -47.5996 47.7998 -63.7998v-45.5c0 -14.2998 3.40039 -27.7998 9 -40c-94 35.2998 -161 125.7 -161 232c0 137 111 248 248 248zM214.2 229.7c7.7002 4.7002 7.7002 15.8994 0 20.5996l-80 48c-11.6006 6.90039 -24 -7.7002 -15.4004 -18
l33.6006 -40.2998l-33.6006 -40.2998c-8.59961 -10.4004 3.90039 -24.7998 15.4004 -18zM377.2 199.7l-33.6006 40.2998l33.6006 40.2998c8.5 10.2998 -3.7002 24.9004 -15.4004 18l-80 -48c-7.7998 -4.7002 -7.7998 -15.8994 0 -20.5996l80 -48
c11.5 -6.7998 24.1006 7.59961 15.4004 18z" />
    <glyph glyph-name="grin-tongue-wink" unicode="&#xf58b;" horiz-adv-x="496" 
d="M344 264c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM248 440c137 0 248 -111 248 -248c0 -106.3 -67 -196.7 -161 -232c5.59961 12.2002 9 25.7002 9 40v45.5c24.7002 16.2002 43.5 38.0996 47.7998 63.7998
c1.90039 11.7998 -9.2002 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002c-11.4004 3.59961 -22.7002 -6.10059 -20.7002 -17.9004c4.2998 -25.7002 23.0996 -47.5996 47.7998 -63.7998v-45.5
c0 -14.2998 3.40039 -27.7998 9 -40c-94 35.2998 -161 125.7 -161 232c0 137 111 248 248 248zM192 215c8.40039 -7.40039 21.5996 -0.299805 20 10.7998c-4 25.2002 -34.2002 42.1006 -59.9004 42.1006c-25.6992 0 -55.8994 -16.9004 -59.8994 -42.1006
c-1.7998 -11.0996 11.2998 -18.2002 19.7998 -10.7998l9.5 8.5c14.7998 13.2002 46.2002 13.2002 61 0zM344 176c35.2998 0 64 28.7002 64 64s-28.7002 64 -64 64s-64 -28.7002 -64 -64s28.7002 -64 64 -64zM293.1 73.4004c0.800781 -0.400391 -0.5 0.299805 19 -9.30078
v-64c0 -35.5996 -29.1992 -64.5 -64.8994 -64c-35.1006 0.400391 -63.1006 29.7002 -63.1006 64.9004v63c19.2002 9.59961 18 9 18.9004 9.40039c14.4004 6.5 31.0996 -2.2002 34.5996 -17.6006l1.80078 -7.7998c2.09961 -9.2002 15.1992 -9.2002 17.2998 0l1.7998 7.7998
c3.5 15.4004 20.2002 24.1006 34.5996 17.6006z" />
    <glyph glyph-name="grin-wink" unicode="&#xf58c;" horiz-adv-x="496" 
d="M0 192c0 137 111 248 248 248s248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248zM200 240c0 17.7002 -14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32zM368 215c8.5 -7.40039 21.5996 -0.200195 20 10.7998
c-4 25.2002 -34.2002 42.1006 -59.9004 42.1006c-25.6992 0 -55.8994 -16.9004 -59.8994 -42.1006c-1.7998 -11.2002 11.5 -18.2002 19.7998 -10.7998l9.5 8.5c14.7998 13.2002 46.2002 13.2002 61 0zM124.9 127.2c-11.4004 3.7002 -22.7002 -6 -20.7002 -17.9004
c9.2998 -55 83.2002 -93.2998 143.8 -93.2998s134.6 38.2998 143.8 93.2998c1.90039 11.9004 -9.39941 21.6006 -20.7002 17.9004c-30.1992 -9.7002 -75.0996 -15.2002 -123.1 -15.2002s-92.9004 5.5 -123.1 15.2002z" />
    <glyph glyph-name="grip-horizontal" unicode="&#xf58d;" horiz-adv-x="448" 
d="M96 160c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64zM256 160c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64
c0 17.6699 14.3301 32 32 32h64zM416 160c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64zM96 352c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64
c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64zM256 352c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64zM416 352c17.6699 0 32 -14.3301 32 -32v-64
c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64z" />
    <glyph glyph-name="grip-vertical" unicode="&#xf58e;" horiz-adv-x="320" 
d="M96 416c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64zM96 256c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64
c0 17.6699 14.3301 32 32 32h64zM96 96c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64zM288 416c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64
c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64zM288 256c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64zM288 96c17.6699 0 32 -14.3301 32 -32v-64
c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h64z" />
    <glyph glyph-name="headphones-alt" unicode="&#xf58f;" 
d="M160 160c17.6699 0 32 -14.3496 32 -32.0596v-127.881c0 -17.6992 -14.3301 -32.0596 -32 -32.0596h-16c-35.3496 0 -64 28.71 -64 64.1201v63.7598c0 35.4199 28.6504 64.1201 64 64.1201h16zM368 160c35.3496 0 64 -28.71 64 -64.1201v-63.7598
c0 -35.4102 -28.6504 -64.1201 -64 -64.1201h-16c-17.6699 0 -32 14.3604 -32 32.0596v127.881c0 17.71 14.3301 32.0596 32 32.0596h16zM256 416c143.09 0 251.43 -119.13 256 -256v-112c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v112
c0 114.67 -93.3301 207.8 -208 207.82c-114.67 -0.0205078 -208 -93.1504 -208 -207.82v-112c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v112c4.57031 136.87 112.91 256 256 256z" />
    <glyph glyph-name="headset" unicode="&#xf590;" 
d="M192 240v-112c0 -17.6699 -14.3301 -32 -32 -32h-16c-35.3496 0 -64 28.6504 -64 64v48c0 35.3496 28.6504 64 64 64h16c17.6699 0 32 -14.3301 32 -32zM368 96h-16c-17.6699 0 -32 14.3301 -32 32v112c0 17.6699 14.3301 32 32 32h16c35.3496 0 64 -28.6504 64 -64v-48
c0 -35.3496 -28.6504 -64 -64 -64zM256 448c142.82 0 251.42 -118.83 256 -256v-165.72c0 -49.8604 -40.4199 -90.2803 -90.2803 -90.2803h-181.72c-26.5098 0 -48 21.4902 -48 48s21.4902 48 48 48h32c26.5098 0 48 -21.4902 48 -48h101.72
c23.3506 0 42.2803 18.9297 42.2803 42.2803c0 0 -0.0400391 163.29 -0.120117 165.72h0.120117c0 114.69 -93.3096 208 -208 208s-208 -93.3096 -208 -208v-16c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v16c4.58008 137.17 113.18 256 256 256z
" />
    <glyph glyph-name="highlighter" unicode="&#xf591;" horiz-adv-x="544" 
d="M0 -31.9805l68.3301 70.4707l67.04 -67.04l-35.4502 -35.4502zM124.61 208.03l41.5195 35.4395l173.34 -173.34l-35.5498 -41.6396c-9.5 -10.7705 -24.4199 -14.9805 -38.1504 -10.7803l-42.7393 13.0801l-50.8604 -50.8604l-96.2295 96.2305l50.9297 50.9395
l-13.0498 42.8301c-0.876953 2.87891 -1.58887 7.65625 -1.58887 10.665c0 9.11328 5.5459 21.4043 12.3789 27.4355zM527.92 368.73c20.5 -20.5 21.5303 -53.3906 2.34961 -75.1309l-169.949 -199.06l-169.771 169.78l199.05 169.96
c21.7402 19.1699 54.6309 18.1396 75.1201 -2.35059z" />
    <glyph glyph-name="hot-tub" unicode="&#xf593;" 
d="M414.21 270.35c-3.15039 25.3906 -14.6104 47.9707 -31.9697 62.1406c-27.7305 22.6299 -45.79 58.0498 -50.1299 97.1602c-1.09082 9.7793 6.48926 18.3496 16 18.3496h16.1201c7.98926 0 14.7295 -6.13965 15.7393 -14.3398
c3.16016 -25.4004 14.6104 -47.9805 31.9805 -62.1504c27.7295 -22.6299 45.79 -58.0498 50.1299 -97.1602c1.08008 -9.7793 -6.49023 -18.3496 -16 -18.3496h-16.1201c-8 0 -14.7295 6.13965 -15.75 14.3496zM306.21 270.35
c-3.15039 25.3906 -14.6104 47.9707 -31.9697 62.1406c-27.7305 22.6299 -45.79 58.0498 -50.1299 97.1602c-1.09082 9.7793 6.48926 18.3496 16 18.3496h16.1201c7.98926 0 14.7295 -6.13965 15.7393 -14.3398c3.16016 -25.4004 14.6104 -47.9805 31.9805 -62.1504
c27.7295 -22.6299 45.79 -58.0498 50.1299 -97.1602c1.08008 -9.7793 -6.49023 -18.3496 -16 -18.3496h-16.1201c-8 0 -14.7295 6.13965 -15.75 14.3496zM480 192c17.6699 0 32 -14.3301 32 -32v-160c0 -35.3496 -28.6504 -64 -64 -64h-384c-35.3496 0 -64 28.6504 -64 64
v224c0 35.3496 28.6504 64 64 64h42.6699h0.00292969c11.7754 0 28.9775 -5.73438 38.3975 -12.7998l110.93 -83.2002h224zM128 8v112c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-112c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8zM224 8v112
c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-112c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8zM320 8v112c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-112c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8zM416 8
v112c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-112c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8zM64 320c-35.3496 0 -64 28.6504 -64 64s28.6504 64 64 64s64 -28.6504 64 -64s-28.6504 -64 -64 -64z" />
    <glyph glyph-name="hotel" unicode="&#xf594;" horiz-adv-x="576" 
d="M560 384h-16v-384h16c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-240v80c0 8.7998 -7.2002 16 -16 16h-32c-8.7998 0 -16 -7.2002 -16 -16v-80h-240c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h15.9805v384h-15.9805
c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h544c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16zM256 339.2v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998v38.4004
c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998zM256 243.2v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998v38.4004
c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998zM128 339.2v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998v38.4004
c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998zM179.2 192c6.39941 0 12.7998 6.40039 12.7998 12.7998v38.4004c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004zM192 64h192c0 53.0195 -42.9805 96 -96 96s-96 -42.9805 -96 -96zM448 204.8v38.4004c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998zM448 300.8v38.4004c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-38.4004
c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-38.4004c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h38.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998z" />
    <glyph glyph-name="joint" unicode="&#xf595;" horiz-adv-x="640" 
d="M444.34 266.9c-35.7803 25.0693 -60.3398 63.0098 -60.3398 106.699v66.4004c0 4.41992 3.58008 8 8 8h48c4.41992 0 8 -3.58008 8 -8v-62.3096c0 -29.0303 15.8496 -54.71 39.6602 -71.3203c35.3301 -24.6504 56.3398 -64.8203 56.3398 -108.061v-30.3096
c0 -4.41992 -3.58008 -8 -8 -8h-48c-4.41992 0 -8 3.58008 -8 8v30.3096c0 27.4307 -13.2803 52.9102 -35.6602 68.5908zM194.97 89.0195c22.3701 3.60059 45.0801 -4.30957 59.8203 -21.5098l112.72 -131.51h-88.5693c-98.6406 0 -195.29 27.7197 -278.94 80
c59.6904 37.3096 126.03 61.9297 194.97 73.0195zM553.28 360.91c54.3096 -36.4102 86.7197 -97.1602 86.7197 -162.601v-30.3096c0 -4.41992 -3.58008 -8 -8 -8h-48c-4.41992 0 -8 3.58008 -8 8v30.3096c0 50.1504 -25.21 96.6504 -67.3604 123.99
c-18.4697 11.9805 -28.6396 33.3701 -28.6396 55.3906v62.3096c0 4.41992 3.58008 8 8 8h48c4.41992 0 8 -3.58008 8 -8v-62.3096c0 -6.82031 3.61035 -12.9805 9.28027 -16.7803zM360.89 95.9502h0.108398c16.2441 0 38.0049 -10.0127 48.5723 -22.3506l117.949 -137.6
h-88.4492h-0.00292969c-16.248 0 -38.0146 10.0127 -48.5869 22.3496l-117.801 137.431c1.40039 0.0195312 53.8105 0.109375 88.21 0.169922zM616 96c13.25 0 24 -10.7402 24 -24v-112c0 -13.25 -10.75 -24 -24 -24h-17.4199h-0.00292969
c-16.248 0 -38.0146 10.0127 -48.5869 22.3496l-117.99 137.65h184z" />
    <glyph glyph-name="kiss" unicode="&#xf596;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM168 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM304 52c0 13 -13.4004 27.2998 -35.2002 36.4004
c21.7998 8.69922 35.2002 23 35.2002 36c0 19.1992 -28.7002 41.5 -71.5 44c-8.40039 1.09961 -12.2002 -11.8008 -3.59961 -15.4004l17 -7.2002c13 -5.5 20.7998 -13.5 20.7998 -21.5s-7.7998 -16 -20.7998 -21.5l-17 -7.2002c-6.10059 -2.59961 -6 -12.2998 0 -14.7998
l17 -7.2002c13 -5.5 20.7998 -13.5 20.7998 -21.5s-7.7998 -16 -20.7998 -21.5l-17 -7.19922c-8.5 -3.60059 -4.90039 -16.2002 3.59961 -15.4004c42.7998 2.5 71.5 24.7998 71.5 44zM328 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32
s14.2998 -32 32 -32z" />
    <glyph glyph-name="kiss-beam" unicode="&#xf597;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM209 220.1c4.2002 -7.5 15.5996 -4 15.0996 4.5c-3.2998 42.1006 -32.1992 71.4004 -56 71.4004c-23.7998 0 -52.6992 -29.2998 -56 -71.4004
c-0.699219 -8.5 10.7002 -11.8994 14.9004 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006s23.7998 -7.90039 31.5 -21.6006zM304 52c0 13 -13.4004 27.2998 -35.2002 36.4004c21.7998 8.69922 35.2002 23 35.2002 36c0 19.1992 -28.7002 41.5 -71.5 44
c-8.40039 1.09961 -12.2002 -11.8008 -3.59961 -15.4004l17 -7.2002c13 -5.5 20.7998 -13.5 20.7998 -21.5s-7.7998 -16 -20.7998 -21.5l-17 -7.2002c-6.10059 -2.59961 -6 -12.2998 0 -14.7998l17 -7.2002c13 -5.5 20.7998 -13.5 20.7998 -21.5s-7.7998 -16 -20.7998 -21.5
l-17 -7.19922c-8.5 -3.60059 -4.90039 -16.2002 3.59961 -15.4004c42.7998 2.5 71.5 24.7998 71.5 44zM369 220.1c4.2002 -7.5 15.5996 -4 15.0996 4.5c-3.2998 42.1006 -32.1992 71.4004 -56 71.4004c-23.7998 0 -52.6992 -29.2998 -56 -71.4004
c-0.699219 -8.5 10.8008 -11.7998 14.9004 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006s23.7998 -7.90039 31.5 -21.6006z" />
    <glyph glyph-name="kiss-wink-heart" unicode="&#xf598;" horiz-adv-x="504" 
d="M501.1 45.5c9.2002 -23.9004 -4.39941 -49.4004 -28.5 -55.7002l-83 -21.5c-5.39941 -1.39941 -10.8994 1.7998 -12.3994 7.10059l-22.9004 82.5996c-6.59961 24 8.7998 48.5996 34 52.5996c22 3.5 43.1006 -11.5996 49 -33l2.2998 -8.39941l8.40039 2.2002
c21.5996 5.59961 45.0996 -5.10059 53.0996 -25.9004zM323.5 49.5c0 0 23.5996 -83.9004 23.9004 -84.5996c-30.5 -13.4004 -64 -20.9004 -99.4004 -20.9004c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248c0 -31.7998 -6.2002 -62.0996 -17.0996 -90
c-6 1.5 -12.2002 2.7998 -18.6006 2.90039c-29.0996 49.7998 -98.0996 50.5996 -127.8 4.2998c-11.2998 -17.7002 -14.5996 -39.4004 -9 -59.7002zM168 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM288 52
c0 13 -13.4004 27.2998 -35.2002 36.4004c21.7998 8.69922 35.2002 23 35.2002 36c0 19.1992 -28.7002 41.5 -71.5 44c-8.2002 1.19922 -12.4004 -11.7002 -3.59961 -15.4004l17 -7.2002c13 -5.5 20.7998 -13.5 20.7998 -21.5s-7.7998 -16 -20.7998 -21.5l-17 -7.2002
c-5.7002 -2.5 -6 -12.2998 0 -14.7998l17 -7.2002c13 -5.5 20.7998 -13.5 20.7998 -21.5s-7.7998 -16 -20.7998 -21.5l-17 -7.19922c-8.5 -3.60059 -4.90039 -16.2002 3.59961 -15.4004c42.7998 2.5 71.5 24.7998 71.5 44zM304 231l9.7002 8.5
c14.7998 13.2002 46.2002 13.2002 61 0l9.5 -8.5c8.5 -7.5 21.5 -0.299805 19.7998 10.7998c-4 25.2002 -34.2002 42.1006 -59.9004 42.1006c-25.6992 0 -55.8994 -16.9004 -59.8994 -42.1006c-1.7998 -11.2002 11.5 -18.2002 19.7998 -10.7998z" />
    <glyph glyph-name="laugh" unicode="&#xf599;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM328 288c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32zM168 288c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32
s32 14.2998 32 32s-14.2998 32 -32 32zM256 16c73.4004 0 134 55 142.9 126c1.19922 9.59961 -6.30078 18 -15.9004 18h-270c-9.59961 0 -17.0996 -8.5 -15.9004 -18c8.90039 -71 69.5 -126 142.9 -126h16z" />
    <glyph glyph-name="laugh-beam" unicode="&#xf59a;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM272 240.6c-0.700195 -8.59961 10.9004 -11.8994 15.0996 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17
c4.10059 -7.39941 15.6006 -4.09961 14.9004 4.5c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004s-52.7002 -29.2998 -56 -71.4004zM112 240.6c-0.700195 -8.5 10.7998 -11.8994 15.0996 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006
c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17c4.10059 -7.39941 15.6006 -4.09961 14.9004 4.5c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004s-52.7002 -29.2998 -56 -71.4004zM398.9 142c1.19922 9.59961 -6.30078 18 -15.9004 18h-270
c-9.59961 0 -17.0996 -8.5 -15.9004 -18c8.90039 -71 69.5 -126 142.9 -126h16c73.4004 0 134 55 142.9 126z" />
    <glyph glyph-name="laugh-squint" unicode="&#xf59b;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM281.8 278.3c-7.7002 -4.7002 -7.7002 -15.8994 0 -20.5996l80 -48c11.5 -6.7998 24.1006 7.59961 15.4004 18l-33.6006 40.2998l33.6006 40.2998
c8.59961 10.2998 -3.7998 24.9004 -15.4004 18zM118.8 308.3l33.6006 -40.2998l-33.6006 -40.2998c-8.59961 -10.4004 3.90039 -24.7998 15.4004 -18l80 48c7.7998 4.7002 7.7998 15.8994 0 20.5996l-80 48c-11.6006 6.90039 -24 -7.7002 -15.4004 -18zM398.9 142
c1.19922 9.59961 -6.30078 18 -15.9004 18h-270c-9.59961 0 -17.0996 -8.5 -15.9004 -18c8.90039 -71 69.5 -126 142.9 -126h16c73.4004 0 134 55 142.9 126z" />
    <glyph glyph-name="laugh-wink" unicode="&#xf59c;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM268.1 241.9c-1.69922 -11.2002 11.5 -18.3008 19.9004 -10.9004l9.59961 8.59961c14.8008 13.2002 46.2002 13.2002 61 0l9.5 -8.5
c8.40039 -7.5 21.5 -0.299805 19.8008 10.8008c-4 25.1992 -34.2002 42.0996 -59.9004 42.0996s-55.9004 -16.9004 -59.9004 -42.0996zM168 288c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32zM398.9 142
c1.19922 9.59961 -6.30078 18 -15.9004 18h-270c-9.59961 0 -17.0996 -8.5 -15.9004 -18c8.90039 -71 69.5 -126 142.9 -126h16c73.4004 0 134 55 142.9 126z" />
    <glyph glyph-name="luggage-cart" unicode="&#xf59d;" horiz-adv-x="640" 
d="M224 128c-17.6699 0 -32 14.3301 -32 32v160c0 17.6699 14.3301 32 32 32h32v-224h-32zM576 160c0 -17.6699 -14.3301 -32 -32 -32h-32v224h32c17.6699 0 32 -14.3301 32 -32v-160zM624 64c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-82.9404
c1.79004 -5.03027 2.94043 -10.3604 2.94043 -16c0 -26.5098 -21.4902 -48 -48 -48s-48 21.4902 -48 48c0 5.63965 1.15039 10.9697 2.94043 16h-197.881c1.79004 -5.03027 2.94043 -10.3604 2.94043 -16c0 -26.5098 -21.4902 -48 -48 -48s-48 21.4902 -48 48
c0 5.63965 1.15039 10.9697 2.94043 16h-82.9404c-8.83984 0 -16 7.16016 -16 16v368h-48c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h96c8.83984 0 16 -7.16016 16 -16v-368h496zM480 352v-224h-192v272c0 26.5098 21.4902 48 48 48h96
c26.5098 0 48 -21.4902 48 -48v-48zM432 352v48h-96v-48h96z" />
    <glyph glyph-name="map-marked" unicode="&#xf59f;" horiz-adv-x="576" 
d="M288 448c69.5898 0 126 -56.4102 126 -126c0 -56.2598 -82.3496 -158.8 -113.9 -196.02c-6.37988 -7.54004 -17.8096 -7.54004 -24.1992 0c-31.5508 37.2197 -113.9 139.76 -113.9 196.02c0 69.5898 56.4102 126 126 126zM20.1201 232.05l118.63 47.4502
c5.17969 -14.8799 12.4102 -30.4404 21.25 -46.4199v-233.08l-138.06 -62.8398c-10.5107 -4.2002 -21.9404 3.54004 -21.9404 14.8594v250.32c0.00292969 11.959 9.0166 25.2686 20.1201 29.71zM288 88.3301c14.0703 0 27.3799 6.17969 36.5098 16.9502
c19.6699 23.2002 40.5703 49.6299 59.4902 76.7197v-245.99l-192 64v182c18.9199 -27.0996 39.8301 -53.5195 59.4902 -76.7197c9.12988 -10.7803 22.4395 -16.96 36.5098 -16.96zM554.06 286.84c10.5107 4.2002 21.9404 -3.54004 21.9404 -14.8594v-250.32
c0 -11.9609 -9.01367 -25.2705 -20.1201 -29.71l-139.88 -55.9502v288z" />
    <glyph glyph-name="map-marked-alt" unicode="&#xf5a0;" horiz-adv-x="576" 
d="M288 448c69.5898 0 126 -56.4102 126 -126c0 -56.2598 -82.3496 -158.8 -113.9 -196.02c-6.37988 -7.54004 -17.8096 -7.54004 -24.1992 0c-31.5508 37.2197 -113.9 139.76 -113.9 196.02c0 69.5898 56.4102 126 126 126zM288 280c23.2002 0 42 18.7998 42 42
s-18.7998 42 -42 42s-42 -18.7998 -42 -42s18.7998 -42 42 -42zM20.1201 232.05l118.63 47.4502c5.17969 -14.8799 12.4102 -30.4404 21.25 -46.4199v-233.08l-138.06 -62.8398c-10.5107 -4.2002 -21.9404 3.54004 -21.9404 14.8594v250.32
c0.00292969 11.959 9.0166 25.2686 20.1201 29.71zM288 88.3301c14.0703 0 27.3799 6.17969 36.5098 16.9502c19.6699 23.2002 40.5703 49.6299 59.4902 76.7197v-245.99l-192 64v182c18.9199 -27.0996 39.8301 -53.5195 59.4902 -76.7197
c9.12988 -10.7803 22.4395 -16.96 36.5098 -16.96zM554.06 286.84c10.5107 4.2002 21.9404 -3.54004 21.9404 -14.8594v-250.32c0 -11.9609 -9.01367 -25.2705 -20.1201 -29.71l-139.88 -55.9502v288z" />
    <glyph glyph-name="marker" unicode="&#xf5a1;" 
d="M93.9502 157.97l75.3994 75.4004l128.021 -128.021l-75.4004 -75.3994c-44.8223 -44.8203 -132.335 -86.8428 -195.34 -93.7998c-15.2803 -1.69043 -28.1895 11.2295 -26.4902 26.5098l0.0302734 0.229492c7.00195 62.9189 49.0156 150.315 93.7803 195.08z
M485.49 421.49c35.3496 -35.3604 35.3496 -92.6699 0 -128.021l-165.49 -165.489l-128.02 128.02l98.4795 98.4697l-19.5898 19.5898l-87.1504 -87.1494c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-22.6201 22.6201c-6.25 6.25 -6.25 16.3799 0 22.6299l104.12 104.12
c15.6104 15.6201 40.9404 15.6201 56.5605 0l36.5596 -36.5498l21.7598 21.7598c35.3506 35.3496 92.6699 35.3496 128.021 0z" />
    <glyph glyph-name="medal" unicode="&#xf5a2;" 
d="M223.75 317.25c-42.04 -6.55957 -79.8398 -25.6201 -109.56 -53.3896l-111.271 158.96c-7.41992 10.6094 0.160156 25.1797 13.1104 25.1797h111.149c10.0029 0 22.2959 -6.96191 27.4404 -15.54zM495.97 448c12.9502 0 20.5303 -14.5703 13.1104 -25.1797
l-111.271 -158.95c-29.7197 27.7598 -67.5195 46.8203 -109.56 53.3799l69.1299 115.21c5.78027 9.63965 16.2002 15.54 27.4404 15.54h111.149zM256 288c97.2002 0 176 -78.7998 176 -176s-78.7998 -176 -176 -176s-176 78.7998 -176 176s78.7998 176 176 176z
M348.52 130.74c6.82031 6.63965 3.05078 18.2295 -6.34961 19.5898l-52.4297 7.63965l-23.4307 47.5205c-2.10938 4.25 -6.21973 6.38965 -10.3291 6.38965c-4.09082 0 -8.1709 -2.11035 -10.2803 -6.38965l-23.4307 -47.5205l-52.4297 -7.63965
c-9.39941 -1.36035 -13.1699 -12.9502 -6.34961 -19.5898l37.9297 -36.96l-8.96973 -52.2207c-1.60059 -9.34961 8.25 -16.54 16.6494 -12.0898l46.9004 24.6504l46.9102 -24.6504c8.38965 -4.41992 18.25 2.73047 16.6494 12.0898l-8.96973 52.2207z" />
    <glyph glyph-name="meh-blank" unicode="&#xf5a4;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM168 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM328 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32
s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="meh-rolling-eyes" unicode="&#xf5a5;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM88 224c0 -35.2998 28.7002 -64 64 -64s64 28.7002 64 64c0 24.2998 -13.7002 45.2002 -33.5996 56c0.699219 -2.59961 1.59961 -5.2002 1.59961 -8
c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32c0 2.7998 0.900391 5.40039 1.59961 8c-19.8994 -10.7998 -33.5996 -31.7002 -33.5996 -56zM312 48c21.2002 0 21.2002 32 0 32h-128c-21.2002 0 -21.2002 -32 0 -32h128zM344 160c35.2998 0 64 28.7002 64 64
c0 24.2998 -13.7002 45.2002 -33.5996 56c0.699219 -2.59961 1.59961 -5.2002 1.59961 -8c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32c0 2.7998 0.900391 5.40039 1.59961 8c-19.8994 -10.7998 -33.5996 -31.7002 -33.5996 -56c0 -35.2998 28.7002 -64 64 -64z
" />
    <glyph glyph-name="monument" unicode="&#xf5a6;" horiz-adv-x="384" 
d="M368 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-352c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h352zM289.14 347.26l30.8604 -315.26h-256l30.8701 315.26c0.625 6.27344 4.75098 14.9834 9.20996 19.4404
l76.5996 76.6094c6.25 6.25 16.3799 6.25 22.6299 0l76.6201 -76.6094c4.45898 -4.45703 8.58496 -13.167 9.20996 -19.4404zM240 140.8v38.4004c0 6.39941 -6.40039 12.7998 -12.7998 12.7998h-70.4004c-6.39941 0 -12.7998 -6.40039 -12.7998 -12.7998v-38.4004
c0 -6.39941 6.40039 -12.7998 12.7998 -12.7998h70.4004c6.39941 0 12.7998 6.40039 12.7998 12.7998z" />
    <glyph glyph-name="mortar-pestle" unicode="&#xf5a7;" 
d="M501.54 387.09l-99.0801 -99.0898h-151.37l203.811 152.86c5.25293 3.93848 14.8457 7.13477 21.4121 7.13477c4.64941 0 11.7988 -1.68652 15.957 -3.76465c21.7803 -10.8906 26.4902 -39.9209 9.27051 -57.1406zM496 256c8.83984 0 16 -7.16016 16 -16v-32
c0 -8.83984 -7.16016 -16 -16 -16h-16c0 -80.9805 -50.2002 -150.11 -121.13 -178.32c12.7695 -16.8701 21.7295 -36.7998 24.9502 -58.6895c1.45996 -9.91992 -6.04004 -18.9805 -16.0703 -18.9805h-223.5c-10.0303 0 -17.5303 9.06055 -16.0703 18.9805
c3.23047 21.8896 12.1904 41.8193 24.9502 58.6895c-70.9297 28.21 -121.13 97.3398 -121.13 178.32h-16c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h480z" />
    <glyph glyph-name="paint-roller" unicode="&#xf5aa;" 
d="M416 320c0 -17.6699 -14.3301 -32 -32 -32h-352c-17.6699 0 -32 14.3301 -32 32v96c0 17.6699 14.3301 32 32 32h352c17.6699 0 32 -14.3301 32 -32v-96zM448 384c35.3496 0 64 -28.6504 64 -64v-64c0 -53.0195 -42.9805 -96 -96 -96h-160v-32
c17.6699 0 32 -14.3301 32 -32v-128c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v128c0 17.6699 14.3301 32 32 32v32c0 35.3496 28.6504 64 64 64h160c17.6699 0 32 14.3301 32 32v128z" />
    <glyph glyph-name="passport" unicode="&#xf5ab;" horiz-adv-x="448" 
d="M129.62 272c5.28027 31.2197 25.5898 57.1699 53.2998 70.4102c-7.66992 -19.0605 -12.7197 -43.3799 -14.21 -70.4102h-39.0898zM129.62 240h39.0898c1.49023 -27.0303 6.53027 -51.3496 14.21 -70.4102c-27.71 13.2402 -48.0098 39.1904 -53.2998 70.4102zM224 161.31
c-7.69043 7.4502 -20.7695 34.4307 -23.4404 78.6904h46.8701c-2.66016 -44.2695 -15.7393 -71.2402 -23.4297 -78.6904zM200.57 272c2.66016 44.2598 15.7393 71.2402 23.4395 78.6904c7.69043 -7.4502 20.7705 -34.4307 23.4307 -78.6904h-46.8701zM265.08 169.59
c7.67969 19.0605 12.7197 43.3799 14.21 70.4102h39.0898c-5.28027 -31.2197 -25.5898 -57.1699 -53.2998 -70.4102zM416 448c17.6699 0 32 -14.3301 32 -32v-448c0 -17.6699 -14.3301 -32 -32 -32h-352c-35.3496 0 -64 28.6504 -64 64v384c0 35.3496 28.6504 64 64 64h352z
M336 32c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16h-224c-8.7998 0 -16 -7.2002 -16 -16s7.2002 -16 16 -16h224zM224 128c70.6904 0 128 57.3096 128 128s-57.3096 128 -128 128s-128 -57.3096 -128 -128s57.3096 -128 128 -128zM265.08 342.41
c27.71 -13.2402 48.0195 -39.1904 53.2998 -70.4102h-39.0898c-1.49023 27.0303 -6.53027 51.3496 -14.21 70.4102z" />
    <glyph glyph-name="pen-fancy" unicode="&#xf5ac;" 
d="M79.1797 165.06l84.0703 33.0703l98.8799 -98.8799l-33.0703 -84.0703c-2.79102 -8.38086 -11.8584 -17.4482 -20.2393 -20.2393l-176.82 -58.9404l-4.67969 4.67969l92.8896 92.8906c2.55957 -0.660156 5.03027 -1.57031 7.7998 -1.57031c17.6699 0 32 14.3301 32 32
s-14.3301 32 -32 32s-32 -14.3301 -32 -32c0 -2.76953 0.910156 -5.24023 1.57031 -7.7998l-92.8896 -92.8906l-4.69043 4.69043l58.9404 176.82c2.79297 8.37891 11.8604 17.4463 20.2393 20.2393zM369.25 419.68c74.4805 84.2607 199.15 -39.1602 114.23 -114.229
l-199.49 -183.11l-97.8506 97.8506z" />
    <glyph glyph-name="pen-nib" unicode="&#xf5ad;" 
d="M136.6 309.21l151.4 42.79l128 -128l-42.79 -151.4c-5.08594 -17.9932 -23.6104 -37.3965 -41.3496 -43.3096l-279.86 -93.29l-14.6904 14.6904l150.11 150.109c6.25977 -2.99023 13.1797 -4.7998 20.5801 -4.7998c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48
s-48 -21.4902 -48 -48c0 -7.40039 1.80957 -14.3203 4.7998 -20.5801l-150.109 -150.11l-14.6904 14.6904l93.29 279.86c5.91309 17.7393 25.3164 36.2637 43.3096 41.3496zM497.94 373.83c18.75 -18.7598 18.75 -49.1602 0 -67.9102l-56.5508 -56.5498l-128.02 128.02
l56.5498 56.5508c18.75 18.75 49.1602 18.75 67.9102 0z" />
    <glyph glyph-name="pencil-ruler" unicode="&#xf5ae;" 
d="M109.46 203.96l-100.17 100.18c-12.3896 12.3906 -12.3799 32.4707 0 44.8604l89.71 89.71c12.3896 12.3896 32.4697 12.3896 44.8604 0l33.6396 -33.6504l-61.6797 -61.6797c-3.10059 -3.08984 -3.10059 -8.11035 0 -11.21l11.21 -11.21
c1.28027 -1.2832 3.79199 -2.3252 5.60449 -2.3252c1.81348 0 4.32422 1.04199 5.60547 2.3252l61.6797 61.6797l44.1201 -44.1201zM497.93 320.76l-46.0195 -46.0293l-113.2 113.199l46.0205 46.0107c18.7695 18.7598 49.1895 18.7598 67.9492 0l45.25 -45.25
c18.75 -18.7607 18.7607 -49.1709 0 -67.9307zM316.08 365.29l113.2 -113.19l-296.92 -296.93l-107.45 -18.8398c-14.5 -2.5498 -27.1201 10.0703 -24.5898 24.5596l18.7598 107.44zM502.71 79.8604c12.3896 -12.3906 12.3896 -32.4707 0 -44.8604l-89.71 -89.7002
c-12.3896 -12.3896 -32.4697 -12.3896 -44.8604 0l-100.21 100.2l134.58 134.56l44.1406 -44.1396l-61.6807 -61.6797c-3.08984 -3.08984 -3.08984 -8.11035 0 -11.21l11.21 -11.21c3.08984 -3.10059 8.11035 -3.10059 11.21 0l61.6807 61.6797z" />
    <glyph glyph-name="plane-arrival" unicode="&#xf5af;" horiz-adv-x="640" 
d="M624 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-608c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h608zM44.8096 242.34c-6.5498 5.91016 -12.3896 14.3398 -12.5791 23.25l-0.230469 101.78
c0.19043 10.8799 10.3799 18.7002 20.7197 15.8799l39.7305 -10.8301c5.00977 -1.36035 9.08984 -5.04004 11.0195 -9.92969l27.5898 -67.8799l102.2 -27.8408l-47.9199 164.211c-0.189453 11.1191 10.1504 19.3193 20.71 16.4395l65.0898 -17.7295
c5.70996 -1.56055 10.1504 -6.10059 11.6602 -11.9102l100.36 -191.851l97.5098 -26.5596c26.4805 -7.20996 51.5498 -20.1797 70.8301 -40c21.6396 -22.25 27.2002 -40.46 23.3701 -54.96c-3.81055 -14.5 -17.5801 -27.4404 -47.25 -35.71
c-26.4404 -7.36035 -54.5205 -5.85059 -81 1.35938l-287.601 78.3506c-7.94531 2.16895 -19.3564 8.41016 -25.4697 13.9297z" />
    <glyph glyph-name="plane-departure" unicode="&#xf5b0;" horiz-adv-x="640" 
d="M624 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-608c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h608zM80.5498 106.73l-76.21 82.9697c-7.62012 8.95996 -4.87012 22.7803 5.57031 28.0801l40.1299 20.3701
c2.0957 1.0625 5.7041 1.92578 8.05469 1.92578c2.33691 0 5.92773 -0.853516 8.01562 -1.90625l72.3496 -36.4697l103.21 52.3799l-156.22 98.0996c-8.08008 8.87988 -5.5 23.1201 5.16992 28.5303l65.75 33.3701c2.0957 1.06348 5.70508 1.92676 8.05566 1.92676
c3 0 7.45508 -1.36035 9.94434 -3.03711l218.7 -82.0596l98.5098 49.9902c26.7402 13.5596 56.4297 21.4199 86.2803 19.4795c33.5098 -2.17969 51.04 -12.8799 58.25 -27.4502c7.22949 -14.5596 5.23926 -35.1699 -13.0703 -63.6494
c-16.3096 -25.3701 -40.2803 -44.7402 -67.0205 -58.3105l-290.96 -147.649c-7.71094 -3.91895 -20.9893 -7.1084 -29.6396 -7.12012l-130.54 -0.180664c-9.22949 -0.00976562 -18.0498 3.87012 -24.3301 10.7109z" />
    <glyph glyph-name="prescription" unicode="&#xf5b1;" horiz-adv-x="384" 
d="M301.26 96l78.0605 -78.0498c6.25 -6.25 6.25 -16.3799 0 -22.6299l-22.6299 -22.6299c-6.25 -6.25 -16.3809 -6.25 -22.6309 0l-78.0596 78.0596l-78.0498 -78.0703c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-22.6299 22.6299c-6.25 6.25 -6.25 16.3809 0 22.6309
l78.0596 78.0596l-128 128h-18.75v-80c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v256c0 8.83984 7.16016 16 16 16h144c53.0195 0 96 -42.9805 96 -96c0 -48.8896 -36.6904 -88.7998 -83.96 -94.7803l83.96 -83.96l78.0596 78.0605
c6.25 6.25 16.3809 6.25 22.6309 0l22.6299 -22.6299c6.25 -6.25 6.25 -16.3809 0 -22.6309zM64 352v-64h96c17.6396 0 32 14.3604 32 32s-14.3604 32 -32 32h-96z" />
    <glyph glyph-name="sad-cry" unicode="&#xf5b3;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248c0 -90 -48.2002 -168.7 -120 -212.1v180.1c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16v-196.7c-29.5 -12.3994 -62 -19.2998 -96 -19.2998s-66.5 6.90039 -96 19.2998v196.7c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16
v-180.1c-71.7998 43.3994 -120 122 -120 212.1c0 137 111 248 248 248zM182.5 223.5l9.7002 -8.5c2.5 -2.2998 7.89941 -4.7002 13.7002 -1.59961c4.39941 2.39941 6.89941 7.39941 6.09961 12.3994c-4 25.2002 -34.2002 42.1006 -59.9004 42.1006
c-25.6992 0 -55.8994 -16.9004 -59.8994 -42.1006c-0.799805 -5 1.7002 -10 6.09961 -12.3994c4.40039 -2.40039 9.90039 -1.7002 13.7002 1.59961l9.5 8.5c14.7998 13.2002 46.2002 13.2002 61 0zM248 32c26.5 0 48 28.7002 48 64s-21.5 64 -48 64s-48 -28.7002 -48 -64
s21.5 -64 48 -64zM397.8 213.5c4.40039 2.40039 6.7998 7.40039 6.2002 12.2998c-4 25.2002 -34.2002 42.1006 -59.9004 42.1006c-25.6992 0 -55.8994 -16.9004 -59.8994 -42.1006c-0.799805 -5 1.7002 -10 6.09961 -12.3994
c4.40039 -2.40039 9.90039 -1.7002 13.7002 1.59961l9.59961 8.59961c14.8008 13.2002 46.2002 13.2002 61 0l9.5 -8.5c2.5 -2.2998 7.90039 -4.69922 13.7002 -1.59961z" />
    <glyph glyph-name="sad-tear" unicode="&#xf5b4;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM328 272c-17.7002 0 -32 -14.2998 -32 -32s14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32zM152 32c26.5 0 48 21 48 47c0 20 -28.5 60.4004 -41.5996 77.7998
c-3.2002 4.2998 -9.60059 4.2998 -12.8008 0c-13.0996 -17.3994 -41.5996 -57.7998 -41.5996 -77.7998c0 -26 21.5 -47 48 -47zM168 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM338.2 53.7998
c13.2998 -16.0996 38.2998 4 24.5 20.4004c-28.4004 34.2002 -70.2998 53.7998 -114.7 53.7998c-21.2002 0 -21.2002 -32 0 -32c34.9004 0 67.7998 -15.4004 90.2002 -42.2002z" />
    <glyph glyph-name="shuttle-van" unicode="&#xf5b6;" horiz-adv-x="640" 
d="M628.88 237.35c7.17969 -8.62988 11.1201 -19.5 11.1201 -30.7295v-110.62c0 -17.6699 -14.3301 -32 -32 -32h-32c0 -53.0195 -42.9805 -96 -96 -96s-96 42.9805 -96 96h-128c0 -53.0195 -42.9805 -96 -96 -96s-96 42.9805 -96 96h-32c-17.6699 0 -32 14.3301 -32 32v288
c0 17.6699 14.3301 32 32 32h425.52c12.4082 -0.00195312 28.9258 -7.73926 36.8701 -17.2695zM64 256h96v96h-96v-96zM160 16c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48s21.4902 -48 48 -48zM320 256v96h-96v-96h96zM480 16
c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48s21.4902 -48 48 -48zM384 256h146.02l-80 96h-66.0195v-96z" />
    <glyph glyph-name="signature" unicode="&#xf5b7;" horiz-adv-x="640" 
d="M623.2 256c9.09961 0.599609 16.7998 -7.09961 16.5996 -16.2002v-32.0996c0 -8.5 -6.7002 -15.1006 -15.2002 -15.7998c-39.3994 -3.2002 -105.399 -51 -138.399 -65.8008c-34.2998 -15.3994 -66.7002 -30 -102.3 -30c-28.2002 0 -50.2002 8.5 -65.5 25.3008
c-22.7002 24.8994 -22.8008 55.2998 -20.6006 83.7998c-56.5 -45.1006 -169 -153.601 -211.2 -195.8c-6.09961 -6.2002 -14.2998 -9.40039 -22.5996 -9.40039c-27 0 -36.5 27 -29.7002 43.9004l98.2002 245.6c8 19.9004 -14.2998 38.7998 -32.7002 27.0996l-58 -38.8994
c-7.5 -4.7998 -17.3994 -2.60059 -22.0996 4.89941l-17.2002 27c-4.7002 7.5 -2.5 17.4004 4.90039 22.1006l54.8994 36.8994c76.5 48.7002 160.101 -26.8994 129.7 -102.8l-41.5 -103.7c105.2 101.2 144.4 124.5 169.5 126
c54.4004 3.10059 43.7998 -68.0996 42.7002 -76.0996c-4.7002 -35.7002 -1.2998 -51.9004 21.2998 -51.9004c21.9004 0 47 11.3008 76.0996 24.4004c37.4004 16.7998 111.301 68 163.101 71.5z" />
    <glyph glyph-name="smile-beam" unicode="&#xf5b8;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM112 224.6c-0.700195 -8.5 10.7998 -11.8994 15.0996 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006c12.3008 0 23.8008 -7.90039 31.5 -21.6006l9.5 -17
c4.10059 -7.39941 15.6006 -4.09961 14.9004 4.5c-3.2998 42.1006 -32.2002 71.4004 -56 71.4004s-52.7002 -29.2998 -56 -71.4004zM362.8 101.8c13.5 16.2002 -11 36.7002 -24.5996 20.5c-22.4004 -26.7998 -55.2002 -42.2002 -90.2002 -42.2002
s-67.7998 15.3008 -90.2002 42.2002c-13.5996 16.2002 -38.0996 -4.2002 -24.5996 -20.5c28.5 -34.2002 70.2998 -53.7998 114.8 -53.7998s86.2998 19.5996 114.8 53.7998zM369 220.1c4.09961 -7.39941 15.7002 -4.09961 15.0996 4.5
c-3.2998 42.1006 -32.1992 71.4004 -56 71.4004c-23.7998 0 -52.6992 -29.2998 -56 -71.4004c-0.699219 -8.5 10.8008 -11.7998 14.9004 -4.5l9.5 17c7.7002 13.7002 19.2002 21.6006 31.5 21.6006s23.7998 -7.90039 31.5 -21.6006z" />
    <glyph glyph-name="solar-panel" unicode="&#xf5ba;" horiz-adv-x="640" 
d="M431.98 -0.00976562c8.84961 0.00976562 16.0293 -7.16992 16.0195 -16.0205l-0.0400391 -31.7295c-0.00976562 -8.82031 -7.16016 -15.9707 -15.9795 -15.9805l-223.961 -0.259766c-8.84961 -0.00976562 -16.0293 7.16992 -16.0195 16.0195l0.0498047 31.7305
c0.00976562 8.83008 7.16016 15.9805 15.9805 15.9902l47.9795 0.0498047v32.21h128v-32.0596zM585.2 421.26c58.1094 -342.42 54.7803 -321.39 54.7598 -325.47c-0.0800781 -17.2305 -14.3604 -31.79 -32.5898 -31.79h-574.74c-18.3096 0 -32.6299 14.6797 -32.5996 32
c0.00976562 3.91992 -3.35059 -17.1602 54.7598 325.26c2.62012 15.4307 16.21 26.7402 32.1396 26.7402h466.13c15.9307 0 29.5205 -11.3096 32.1406 -26.7402zM259.83 384l-9.77051 -96h139.87l-9.76953 96h-120.33zM184.66 128l11.4102 112h-105.971l-19.0098 -112
h113.57zM200.95 288l9.76953 96h-96.1895l-16.29 -96h102.71zM233.77 128h172.45l-11.3994 112h-149.65zM429.27 384l9.77051 -96h102.71l-16.29 96h-96.1904zM455.33 128h113.58l-19.0098 112h-105.971z" />
    <glyph glyph-name="spa" unicode="&#xf5bb;" horiz-adv-x="576" 
d="M568.25 256c4.41016 0.0195312 7.79004 -3.40039 7.75 -7.82031c-0.230469 -27.9199 -7.12988 -126.13 -88.7695 -199.3c-84.04 -81.8301 -167.23 -80.8799 -199.23 -80.8799s-115.21 -0.94043 -199.23 80.8799c-81.6299 73.1602 -88.5391 171.38 -88.7695 199.3
c-0.0400391 4.41992 3.33984 7.83984 7.75 7.82031c29.04 -0.129883 135.01 -6.16016 213.84 -83c33.1201 -29.6299 53.3604 -63.2998 66.4102 -94.8604c13.0498 31.5605 33.29 65.2305 66.4102 94.8604c78.8301 76.8398 184.8 82.8701 213.84 83zM287.98 145.4
c-10.7012 15.7168 -30.8789 38.7705 -45.04 51.46c-18.7207 18.25 -38.8506 32.6895 -59.2207 44.3896c16.4707 70.4404 51.75 132.93 96.7402 172.07c4.12012 3.58008 11.0303 3.58008 15.1396 0c45.0107 -39.1699 80.29 -101.721 96.7305 -172.221
c-20.6797 -11.8799 -41.1699 -26.5693 -60.2598 -45.1797c-16.4902 -14.7402 -31.2705 -31.6699 -44.0898 -50.5195z" />
    <glyph glyph-name="splotch" unicode="&#xf5bc;" 
d="M472.29 252.11c48.54 -16.6201 53.8301 -73.8301 8.9502 -96.79l-62 -31.7402c-17.8301 -9.12988 -29.2803 -25.2002 -30.6299 -42.9902l-4.7002 -61.8594c-3.41016 -44.79 -65.1299 -66.7803 -104.45 -37.2207l-54.3203 40.8301
c-15.6201 11.7305 -36.96 16.1201 -57.0693 11.7305l-69.96 -15.2803c-50.6504 -11.0596 -94.0801 32.5596 -73.4902 73.8096l28.4297 56.9805c8.18066 16.3799 6.44043 35.1699 -4.63965 50.2402l-38.54 52.4199c-27.9004 37.9502 6.97949 86.8994 59.0303 82.8301
l71.8799 -5.62012c20.6602 -1.62012 40.9395 5.59961 54.2002 19.3096l46.1396 47.6699c33.4102 34.5107 98.3994 21.1504 109.979 -22.6201l15.9902 -60.4492c4.60059 -17.3799 18.8604 -31.7002 38.1406 -38.3008z" />
    <glyph glyph-name="spray-can" unicode="&#xf5bd;" 
d="M224 416v-96h-128v96c0 17.6699 14.3301 32 32 32h64c17.6699 0 32 -14.3301 32 -32zM480 320c17.6699 0 32 -14.3301 32 -32s-14.3301 -32 -32 -32s-32 14.3301 -32 32s14.3301 32 32 32zM224 288c53.0195 0 96 -42.9805 96 -96v-224c0 -17.6699 -14.3301 -32 -32 -32
h-256c-17.6699 0 -32 14.3301 -32 32v224c0 53.0195 42.9805 96 96 96h128zM160 32c44.1797 0 80 35.8203 80 80s-35.8203 80 -80 80s-80 -35.8203 -80 -80s35.8203 -80 80 -80zM480 352c-17.6699 0 -32 14.3301 -32 32s14.3301 32 32 32s32 -14.3301 32 -32
s-14.3301 -32 -32 -32zM384 320c17.6699 0 32 -14.3301 32 -32s-14.3301 -32 -32 -32s-32 14.3301 -32 32s14.3301 32 32 32zM288 416c17.6699 0 32 -14.3301 32 -32s-14.3301 -32 -32 -32s-32 14.3301 -32 32s14.3301 32 32 32zM384 416c17.6699 0 32 -14.3301 32 -32
s-14.3301 -32 -32 -32s-32 14.3301 -32 32s14.3301 32 32 32zM480 224c17.6699 0 32 -14.3301 32 -32s-14.3301 -32 -32 -32s-32 14.3301 -32 32s14.3301 32 32 32z" />
    <glyph glyph-name="stamp" unicode="&#xf5bf;" 
d="M32 -64v64h448v-64h-448zM416 192c53.0195 0 96 -42.9805 96 -96v-32c0 -17.6699 -14.3301 -32 -32 -32h-448c-17.6699 0 -32 14.3301 -32 32v32c0 53.0195 42.9805 96 96 96h66.5596c16.2607 0 29.4404 13.1797 29.4404 29.4404v0.0693359
c0 31.79 -9.98047 62.0605 -23.3096 90.9102c-5.57031 12.04 -8.69043 25.4199 -8.69043 39.5801c0 58.6699 52.6201 105.04 113.25 94.4902c38.79 -6.75 70.4902 -38.6699 77.2598 -77.4502c3.85059 -22.0303 0.0605469 -42.8096 -9.0498 -60.4199
c-12.5801 -24.3105 -21.46 -50.3506 -21.46 -77.7197v-9.45996c0 -16.2607 13.1797 -29.4404 29.4404 -29.4404h66.5596z" />
    <glyph glyph-name="star-half-alt" unicode="&#xf5c0;" horiz-adv-x="536" 
d="M508.55 276.49c26.25 -3.7998 36.7705 -36.1006 17.7305 -54.6006l-105.91 -102.979l25.0303 -145.49c3.55957 -20.79 -13.0605 -37.4004 -31.6602 -37.4004c-4.91016 0 -9.9707 1.16016 -14.8301 3.71094l-130.94 68.6992l-130.95 -68.6797
c-4.86914 -2.58008 -9.93945 -3.75 -14.8691 -3.75c-18.5801 0 -35.1699 16.6699 -31.6104 37.4502l25.0596 145.479l-105.89 103c-19.0303 18.5 -8.50977 50.79 17.7402 54.5898l146.38 21.29l65.4297 132.381c5.90039 11.9092 17.29 17.8096 28.6904 17.8096
c11.4697 0 22.9395 -5.98047 28.8193 -17.8096l65.4102 -132.391zM386.81 153.29l82.6504 80.3799l-114.229 16.6299l-25.0107 3.64062l-11.1797 22.6299l-51.0303 103.29l-0.0292969 -317.19l22.3799 -11.7402l102.13 -53.5898l-19.5205 113.45l-4.2793 24.8799z" />
    <glyph glyph-name="suitcase-rolling" unicode="&#xf5c1;" horiz-adv-x="384" 
d="M336 288c26.5098 0 48 -21.4902 48 -48v-224c0 -26.5098 -21.4902 -48 -48 -48h-16v-16c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v16h-128v-16c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v16h-16
c-26.5098 0 -48 21.4902 -48 48v224c0 26.5098 21.4902 48 48 48h288zM320 72v16c0 4.41992 -3.58008 8 -8 8h-240c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h240c4.41992 0 8 3.58008 8 8zM320 168v16c0 4.41992 -3.58008 8 -8 8h-240
c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h240c4.41992 0 8 3.58008 8 8zM144 400v-80h-48v80c0 26.5098 21.4902 48 48 48h96c26.5098 0 48 -21.4902 48 -48v-80h-48v80h-96z" />
    <glyph glyph-name="surprise" unicode="&#xf5c2;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM136 240c0 -17.7002 14.2998 -32 32 -32s32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32zM248 32c35.2998 0 64 28.7002 64 64s-28.7002 64 -64 64
s-64 -28.7002 -64 -64s28.7002 -64 64 -64zM328 208c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32z" />
    <glyph glyph-name="swatchbook" unicode="&#xf5c3;" 
d="M434.66 280.29c5.15527 -5.1709 9.33984 -15.293 9.33984 -22.5947s-4.18457 -17.4248 -9.33984 -22.5957l-210.66 -211.1v271.12l75.4297 75.5195l0.0703125 0.0703125v0c5.14258 5.12305 15.2061 9.28027 22.4648 9.28027c7.29102 0 17.3867 -4.18848 22.5352 -9.35059
l90.1602 -90.3496v0zM480 128c17.6641 0 32 -14.3359 32 -32v-128c0 -17.6641 -14.3359 -32 -32 -32h-300c2.17969 1.91016 4.62012 3.41992 6.67969 5.49023l186.41 186.51h106.91zM192 416v-384c0 -52.9922 -43.0078 -96 -96 -96s-96 43.0078 -96 96v384
c0 17.6641 14.3359 32 32 32h128c17.6641 0 32 -14.3359 32 -32zM96 8c13.248 0 24 10.752 24 24s-10.752 24 -24 24s-24 -10.752 -24 -24s10.752 -24 24 -24zM128 192v64h-64v-64h64zM128 320v64h-64v-64h64z" />
    <glyph glyph-name="swimmer" unicode="&#xf5c4;" horiz-adv-x="640" 
d="M189.61 137.42c-5.04004 4.65039 -10.3906 8.34961 -15.8604 11.5801l68.6299 98.04c7.36035 10.5 16.3398 19.5498 26.7197 26.9404l80.0205 57.1699c25.54 18.2598 57.8301 24.96 88.5596 18.3799l100.351 -21.5303c25.9297 -5.55957 42.4297 -31.0801 36.8799 -57
c-5.56055 -25.9102 -31.0898 -42.4102 -57 -36.8799l-100.351 21.5303c-4.33984 0.90918 -8.97949 -0.0302734 -12.6191 -2.61035l-18 -12.8604l112.84 -80.5996c-17.5107 -1.04004 -34.5303 -8.4502 -49.3906 -22.1602
c-3.5293 -3.25977 -15.2695 -9.41992 -34.3896 -9.41992s-30.8496 6.16016 -34.3896 9.41992c-16.0107 14.7705 -34.5 22.5801 -53.46 22.5801h-16.3008c-18.96 0 -37.4395 -7.80957 -53.46 -22.5801c-3.5293 -3.25977 -15.2695 -9.41992 -34.3896 -9.41992
s-30.8496 6.16016 -34.3896 9.41992zM624 96c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-16c-38.6201 0 -72.7197 12.1797 -96 31.8398c-23.2803 -19.6494 -57.3799 -31.8398 -96 -31.8398s-72.7197 12.1797 -96 31.8398
c-23.2803 -19.6494 -57.3799 -31.8398 -96 -31.8398s-72.7197 12.1797 -96 31.8398c-23.2803 -19.6494 -57.3799 -31.8398 -96 -31.8398h-16c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h16c26.04 0 45.7998 8.41992 56.0703 17.9004
c8.89941 8.20996 19.6602 14.0996 31.7695 14.0996h16.2998c12.1104 0 22.8701 -5.88965 31.7705 -14.0996c10.29 -9.48047 30.0498 -17.9004 56.0898 -17.9004s45.7998 8.41992 56.0703 17.9004c8.89941 8.20996 19.6602 14.0996 31.7695 14.0996h16.2998
c12.1104 0 22.8701 -5.88965 31.7705 -14.0996c10.29 -9.48047 30.0498 -17.9004 56.0898 -17.9004s45.7998 8.41992 56.0703 17.9004c8.89941 8.20996 19.6602 14.0996 31.7695 14.0996h16.2998c12.1104 0 22.8701 -5.88965 31.7705 -14.0996
c10.29 -9.48047 30.0498 -17.9004 56.0898 -17.9004h16zM112 192c-44.1797 0 -80 35.8203 -80 80s35.8203 80 80 80s80 -35.8203 80 -80s-35.8203 -80 -80 -80z" />
    <glyph glyph-name="swimming-pool" unicode="&#xf5c5;" horiz-adv-x="640" 
d="M624 32c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-16c-38.6201 0 -72.7197 12.1797 -96 31.8398c-23.2803 -19.6494 -57.3799 -31.8398 -96 -31.8398s-72.7197 12.1797 -96 31.8398c-23.2803 -19.6494 -57.3799 -31.8398 -96 -31.8398
s-72.7197 12.1797 -96 31.8398c-23.2803 -19.6494 -57.3799 -31.8398 -96 -31.8398h-16c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h16c26.04 0 45.7998 8.41992 56.0703 17.9004c8.89941 8.20996 19.6602 14.0996 31.7695 14.0996h16.2998
c12.1104 0 22.8701 -5.88965 31.7705 -14.0996c10.29 -9.48047 30.0498 -17.9004 56.0898 -17.9004s45.7998 8.41992 56.0703 17.9004c8.89941 8.20996 19.6602 14.0996 31.7695 14.0996h16.2998c12.1104 0 22.8701 -5.88965 31.7705 -14.0996
c10.29 -9.48047 30.0498 -17.9004 56.0898 -17.9004s45.7998 8.41992 56.0703 17.9004c8.89941 8.20996 19.6602 14.0996 31.7695 14.0996h16.2998c12.1104 0 22.8701 -5.88965 31.7705 -14.0996c10.29 -9.48047 30.0498 -17.9004 56.0898 -17.9004h16zM224 64
c-19.1201 0 -30.8604 6.16016 -34.3896 9.42969c-9.16992 8.4502 -19.2002 14.3398 -29.6104 18.0703v228.5c0 52.9404 43.0596 96 96 96s96 -43.0596 96 -96v-16c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v16c0 17.6396 -14.3604 32 -32 32
s-32 -14.3604 -32 -32v-96h192v96c0 52.9404 43.0596 96 96 96s96 -43.0596 96 -96v-16c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v16c0 17.6396 -14.3604 32 -32 32s-32 -14.3604 -32 -32v-228.51
c-10.4102 -3.73047 -20.4404 -9.61035 -29.6104 -18.0703c-3.5293 -3.25977 -15.2695 -9.41992 -34.3896 -9.41992v96h-192v-96z" />
    <glyph glyph-name="tint-slash" unicode="&#xf5c7;" horiz-adv-x="640" 
d="M633.82 -10.0996c6.97949 -5.43066 8.22949 -15.4805 2.81934 -22.4502l-19.6396 -25.2705c-5.42969 -6.97949 -15.4805 -8.23926 -22.46 -2.80957l-588.36 454.729c-6.97949 5.43066 -8.22949 15.4805 -2.80957 22.4502l19.6396 25.2705
c5.41992 6.97949 15.4805 8.22949 22.46 2.80957l186.82 -144.399c21.6201 33.7197 42.9697 73.3398 58.4902 125.68c9 30.1201 50.5 28.7803 58.4395 0c46.9902 -158.48 146.78 -200.061 146.78 -311.82c0 -5.70996 -0.509766 -11.2998 -1.03027 -16.8701zM144 114.09
c0 29.7803 7.30957 54.6299 18.7197 78.1299l273.681 -211.52c-31.0303 -27.7402 -71.6904 -44.7002 -116.4 -44.7002c-97.2803 0 -176 79.6504 -176 178.09z" />
    <glyph glyph-name="tired" unicode="&#xf5c8;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM281.8 250.3c-7.7002 -4.7002 -7.7002 -15.8994 0 -20.5996l80 -48c11.5 -6.7998 24.1006 7.59961 15.4004 18l-33.6006 40.2998l33.6006 40.2998
c8.59961 10.2998 -3.7998 24.9004 -15.4004 18zM118.8 280.3l33.6006 -40.2998l-33.6006 -40.2998c-8.59961 -10.4004 3.90039 -24.7998 15.4004 -18l80 48c7.7998 4.7002 7.7998 15.8994 0 20.5996l-80 48c-11.6006 6.90039 -24 -7.7002 -15.4004 -18zM248 160
c-51.9004 0 -115.3 -43.7998 -123.2 -106.7c-1.7002 -13.3994 7.90039 -24.5996 17.7002 -20.3994c25.9004 11.0996 64.4004 17.3994 105.5 17.3994s79.5996 -6.2998 105.5 -17.3994c9.7002 -4.2002 19.4004 6.7998 17.7002 20.3994
c-7.90039 62.9004 -71.2998 106.7 -123.2 106.7z" />
    <glyph glyph-name="tooth" unicode="&#xf5c9;" horiz-adv-x="448" 
d="M443.98 351.75c10.1299 -41.6299 0.419922 -80.8203 -21.5303 -110.43c-23.3604 -31.5703 -32.6807 -68.6504 -36.29 -107.351c-4.41016 -47.1602 -10.3301 -94.1699 -20.9404 -140.319l-7.7998 -33.9502c-3.18945 -13.8701 -15.4902 -23.7002 -29.6699 -23.7002
c-13.9697 0 -26.1504 9.5498 -29.54 23.1602l-34.4697 138.42c-4.56055 18.3096 -20.96 31.1602 -39.7598 31.1602c-18.8008 0 -35.2002 -12.8398 -39.7607 -31.1602l-34.4697 -138.42c-3.38965 -13.6104 -15.5703 -23.1602 -29.54 -23.1602
c-14.1797 0 -26.4795 9.83008 -29.6699 23.7002l-7.7998 33.9502c-10.6104 46.1592 -16.54 93.1592 -20.9404 140.319c-3.60938 38.6904 -12.9297 75.7803 -36.29 107.351c-21.9199 29.6201 -31.6299 68.8096 -21.5 110.43c11.0098 45.2197 47.1104 82.0498 92.0098 93.7197
c23.4307 6.08984 46.1104 0.540039 66.8105 -10.3096l100.51 -64.6201c7.83984 -5.05957 17.6504 -2.15039 22.1104 4.7998c4.78027 7.44043 2.62012 17.3398 -4.7998 22.1104l-28.3203 18.21c3.54004 1.75 7.25 3.08984 10.5 5.47949
c26.1396 19.2305 56.9502 32.6904 89.1396 24.3301c44.9004 -11.6602 81 -48.5 92.0107 -93.7197z" />
    <glyph glyph-name="umbrella-beach" unicode="&#xf5ca;" horiz-adv-x="640" 
d="M115.38 311.1c-10.0801 3.66992 -14.1104 16.3203 -7.41992 24.7207c59.75 74.8398 152.65 116.689 248.53 111.8c-52.79 -29.4102 -103.811 -92.1602 -139 -173.7zM247.63 262.94c44.4902 101.979 114.74 171.14 172.76 171.149c7.95996 0 15.6904 -1.2998 23.0908 -4
c61.3291 -22.3203 78.3896 -132.6 42.6299 -253.979zM521.48 387.5c76.5293 -57.9199 120.76 -149.67 118.439 -245.36c-0.259766 -10.7393 -11.4795 -17.8398 -21.5703 -14.1699l-102.619 37.3604c17.5293 58.75 24.6895 117.09 18.9492 166.979
c-2.37012 20.5908 -6.97949 38.8906 -13.1992 55.1904zM560 0.0195312c8.83984 0 16 -7.15918 16 -16v-32.0098c0 -8.83984 -7.16016 -16.0098 -16 -16.0098h-544c-8.83984 0 -16 7.16992 -16 16.0098v32.0098c0 8.85059 7.16016 16.0107 16 16.0107h236.96l72.9004 200.37
l60.1396 -21.9004l-64.9404 -178.48h238.94z" />
    <glyph glyph-name="vector-square" unicode="&#xf5cb;" 
d="M512 320c0 -17.6699 -14.3301 -32 -32 -32v-192c17.6699 0 32 -14.3301 32 -32v-96c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32h-192c0 -17.6699 -14.3301 -32 -32 -32h-96c-17.6699 0 -32 14.3301 -32 32v96c0 17.6699 14.3301 32 32 32v192
c-17.6699 0 -32 14.3301 -32 32v96c0 17.6699 14.3301 32 32 32h96c17.6699 0 32 -14.3301 32 -32h192c0 17.6699 14.3301 32 32 32h96c17.6699 0 32 -14.3301 32 -32v-96zM416 384v-32h32v32h-32zM64 384v-32h32v32h-32zM96 0v32h-32v-32h32zM448 0v32h-32v-32h32zM416 96
v192h-32c-17.6699 0 -32 14.3301 -32 32v32h-192v-32c0 -17.6699 -14.3301 -32 -32 -32h-32v-192h32c17.6699 0 32 -14.3301 32 -32v-32h192v32c0 17.6699 14.3301 32 32 32h32z" />
    <glyph glyph-name="weight-hanging" unicode="&#xf5cd;" 
d="M510.28 2.13965c8.33008 -33.3096 -14.6602 -66.1396 -46.2998 -66.1396h-415.95c-31.6504 0 -54.6406 32.8301 -46.3105 66.1396l73.0498 292.13c3.79004 15.1807 16.4404 25.7207 30.8701 25.7207h60.25c-3.58008 10.0498 -5.87988 20.7197 -5.87988 32
c0 53.0195 42.9805 96 96 96c53.0205 0 96 -42.9805 96 -96c0 -11.2803 -2.30957 -21.9502 -5.87988 -32h60.25c14.4297 0 27.0703 -10.5303 30.8701 -25.7207zM256 320c17.6396 0 32 14.3604 32 32s-14.3604 32 -32 32s-32 -14.3604 -32 -32s14.3604 -32 32 -32z" />
    <glyph glyph-name="wine-glass-alt" unicode="&#xf5ce;" horiz-adv-x="288" 
d="M216 -16c22.0898 0 40 -17.9102 40 -40c0 -4.41992 -3.58008 -8 -8 -8h-208c-4.41992 0 -8 3.58008 -8 8c0 22.0898 17.9102 40 40 40h40v117.18c-68.4697 15.8906 -118.05 79.9102 -111.4 154.16l15.96 178.11c0.730469 8.24023 7.55078 14.5498 15.7002 14.5498h223.48
c8.16016 0 14.9697 -6.30957 15.71 -14.5498l15.9502 -178.101c6.64941 -74.25 -42.9307 -138.27 -111.4 -154.159v-117.19h40zM61.75 400l-7.16992 -80h178.84l-7.16992 80h-164.5z" />
    <glyph glyph-name="air-freshener" unicode="&#xf5d0;" horiz-adv-x="384" 
d="M378.94 126.59c11.75 -12.1494 1.71973 -30.5898 -16.6406 -30.5898h-138.3v-32h112c8.83984 0 16 -7.16016 16 -16v-96c0 -8.83984 -7.16016 -16 -16 -16h-288c-8.83984 0 -16 7.16016 -16 16v96c0 8.83984 7.16016 16 16 16h112v32h-138.3
c-18.3604 0 -28.3906 18.4404 -16.6406 30.5898l94.2402 97.4102h-49.2197c-15.2998 0 -23.6602 16.5996 -13.8604 27.5303l113.33 126.51c-3.42969 6.61035 -5.5498 14 -5.5498 21.96c0 26.5098 21.4902 48 48 48s48 -21.4902 48 -48
c0 -7.95996 -2.12012 -15.3496 -5.5498 -21.96l113.33 -126.51c9.7998 -10.9307 1.43945 -27.5303 -13.8604 -27.5303h-49.2197zM192 416.02c-8.84961 0 -16.0195 -7.16992 -16.0195 -16.0195c0 -8.83984 7.16992 -16.0195 16.0195 -16.0195
s16.0195 7.17969 16.0195 16.0195c0 8.84961 -7.16992 16.0195 -16.0195 16.0195zM304 16h-224v-32h224v32z" />
    <glyph glyph-name="apple-alt" unicode="&#xf5d1;" horiz-adv-x="448" 
d="M350.85 319c25.9707 -4.66992 47.2705 -18.6699 63.9199 -42c14.6504 -20.6699 24.6406 -46.6699 29.9609 -78c4.66992 -28.6699 4.31934 -57.3301 -1 -86c-7.99023 -47.3301 -23.9707 -87 -47.9404 -119c-28.6396 -38.6699 -64.5898 -58 -107.87 -58
c-10.6602 0 -22.2998 3.33008 -34.96 10c-8.66016 5.33008 -18.3096 8 -28.9697 8s-20.2998 -2.66992 -28.9707 -8c-12.6592 -6.66992 -24.2998 -10 -34.96 -10c-43.2793 0 -79.2295 19.3301 -107.869 58c-23.9707 32 -39.9502 71.6699 -47.9404 119
c-5.32031 28.6699 -5.66992 57.3301 -1 86c5.32031 31.3301 15.3096 57.3301 29.96 78c16.6504 23.3301 37.9502 37.3301 63.9199 42c15.9805 2.66992 37.9502 0.330078 65.9199 -7c23.9697 -6.66992 44.2803 -14.6699 60.9307 -24
c16.6494 9.33008 36.96 17.3301 60.9297 24c27.9795 7.33008 49.96 9.66992 65.9395 7zM295.91 360c-9.32031 -8.66992 -21.6504 -15 -36.96 -19c-10.6602 -3.33008 -22.2998 -5 -34.96 -5l-14.9805 1c-1.33008 9.33008 -1.33008 20 0 32
c2.66992 24 10.3203 42.3301 22.9707 55c9.31934 8.66992 21.6494 15 36.96 19c10.6592 3.33008 22.2998 5 34.96 5l14.9795 -1l1 -15c0 -12.6699 -1.66992 -24.3301 -4.99023 -35c-3.98926 -15.3301 -10.3096 -27.6699 -18.9795 -37z" />
    <glyph glyph-name="atom" unicode="&#xf5d2;" horiz-adv-x="448" 
d="M223.999 224c17.6328 -0.03125 31.9727 -14.3672 32.0078 -32c0 -17.6641 -14.3359 -32 -32 -32s-32 14.3359 -32 32c0 17.6602 14.333 31.9961 31.9922 32zM438.171 320c16.3789 -29.375 15.0039 -73.125 -25.1309 -128c40.1348 -54.875 41.5098 -98.625 25.1309 -128
c-29.1309 -52.375 -101.646 -43.625 -116.275 -41.875c-21.5039 -51.25 -54.2617 -86.125 -97.8965 -86.125s-76.3906 34.875 -97.8965 86.125c-14.627 -1.75 -87.1426 -10.5 -116.273 41.875c-16.3789 29.375 -15.0039 73.125 25.1289 128
c-40.1328 54.875 -41.5078 98.625 -25.1289 128c10.877 19.5 40.5078 50.625 116.273 41.875c21.5059 51.25 54.2617 86.125 97.8965 86.125s76.3926 -34.875 97.8965 -86.125c75.7656 8.875 105.398 -22.375 116.275 -41.875zM63.3389 96
c3.75195 -6.625 19.0059 -11.875 43.6348 -11c-2.75 13 -5.125 26.375 -6.75 40.125c-7.75195 6.25 -15.0039 12.625 -21.8809 19.125c-15.1289 -23.5 -19.0039 -41 -15.0039 -48.25zM100.224 258.875c1.625 13.5 3.875 26.875 6.75 40.25c-1.875 0 -4 0.375 -5.75 0.375
c-21.5059 0 -34.5078 -5.375 -37.8848 -11.5c-4 -7.25 -0.125 -24.75 15.0039 -48.25c6.87695 6.5 14.1289 12.875 21.8809 19.125zM223.999 384c-9.50195 0 -22.2539 -13.5 -33.8828 -37.25c11.2539 -3.75 22.5059 -8 33.8828 -12.875
c11.3789 4.875 22.6309 9.125 33.8828 12.875c-11.627 23.75 -24.3809 37.25 -33.8828 37.25zM223.999 0c9.50195 0 22.2559 13.5 33.8828 37.25c-11.252 3.75 -22.5039 8 -33.8828 12.875c-11.377 -4.875 -22.6289 -9.125 -33.8828 -12.875
c11.6289 -23.75 24.3809 -37.25 33.8828 -37.25zM223.999 112c44.1602 0 80 35.8398 80 80s-35.8398 80 -80 80s-80 -35.8398 -80 -80s35.8398 -80 80 -80zM384.659 96c4 7.25 0.125 24.75 -15.0039 48.25c-6.875 -6.5 -14.127 -12.875 -21.8789 -19.125
c-1.625 -13.75 -4 -27.125 -6.75195 -40.125c24.6309 -0.875 40.0098 4.375 43.6348 11zM369.655 239.75c15.1289 23.5 19.0039 41 15.0039 48.25c-3.375 6.125 -16.3789 11.5 -37.8828 11.5c-1.75 0 -3.87695 -0.375 -5.75195 -0.375
c2.87695 -13.375 5.12695 -26.75 6.75195 -40.25c7.75195 -6.25 15.0039 -12.625 21.8789 -19.125z" />
    <glyph glyph-name="bone" unicode="&#xf5d7;" horiz-adv-x="640" 
d="M598.88 203.44c-9.42969 -4.70996 -9.42969 -18.1709 -0.00976562 -22.8809c25.2002 -12.5996 41.1201 -38.3496 41.1201 -66.5293v-7.64062c0 -41.0898 -33.2998 -74.3896 -74.3799 -74.3896c-32.0107 0 -60.4404 20.4902 -70.5703 50.8604
c-6.53027 19.5996 -10.7305 45.1396 -38.1104 45.1396h-273.87c-26.5098 0 -30.4297 -22.1104 -38.1094 -45.1396c-10.1299 -30.3701 -38.5498 -50.8604 -70.5703 -50.8604c-41.0801 0 -74.3799 33.2998 -74.3799 74.3896v7.64062
c0 28.1699 15.9199 53.9297 41.1201 66.5293c9.42969 4.70996 9.42969 18.1709 0 22.8809c-25.2002 12.5996 -41.1201 38.3594 -41.1201 66.5293v7.64062c0 41.0898 33.2998 74.3896 74.3896 74.3896c32.0107 0 60.4404 -20.4902 70.5605 -50.8604
c6.53027 -19.5996 10.7295 -45.1396 38.1094 -45.1396h273.87c26.5107 0 30.4307 22.1104 38.1104 45.1396c10.1299 30.3701 38.5498 50.8604 70.5703 50.8604c41.0898 0 74.3896 -33.2998 74.3896 -74.3896v-7.64062c0 -28.1699 -15.9199 -53.9297 -41.1201 -66.5293z" />
    <glyph glyph-name="book-reader" unicode="&#xf5da;" 
d="M352 352c0 -53.0195 -42.9805 -96 -96 -96s-96 42.9805 -96 96s42.9805 96 96 96s96 -42.9805 96 -96zM233.59 206.9c4.10059 -2.51074 6.41016 -6.79004 6.41992 -11.46v-245.99c0 -10.1602 -11.1094 -16.5898 -20.4795 -11.8701
c-61.0498 30.75 -149.38 39.1396 -193.04 41.4297c-14.9004 0.770508 -26.4902 12.7207 -26.4902 27.0498v222.801c0 15.6299 13.5498 28.0098 29.7998 27.0898c48.3604 -2.75 144.46 -12.7305 203.79 -49.0498zM482.2 255.95
c16.25 0.919922 29.7998 -11.46 29.8096 -27.0898v-222.82c0 -14.3301 -11.5898 -26.2803 -26.4902 -27.0596c-43.6494 -2.29004 -131.93 -10.6807 -192.97 -41.4004c-9.39941 -4.73047 -20.54 1.70996 -20.54 11.9004v245.789c0 4.6709 2.31055 9.12012 6.41016 11.6309
c59.3203 36.3193 155.43 46.3096 203.78 49.0498z" />
    <glyph glyph-name="brain" unicode="&#xf5dc;" horiz-adv-x="576" 
d="M208 448c35.2998 0 64 -28.7002 64 -64v-376c0 -39.7998 -32.2002 -72 -72 -72c-31.7998 0 -58.4004 20.7002 -68 49.2002c-3.90039 -0.700195 -7.90039 -1.2002 -12 -1.2002c-39.7998 0 -72 32.2002 -72 72c0 4.7998 0.5 9.5 1.40039 14.0996
c-29 12 -49.4004 40.6006 -49.4004 73.9004c0 29.7002 16.2998 55.2998 40.2998 69.0996c-5.09961 10.6006 -8.2998 22.3008 -8.2998 34.9004c0 33.4004 20.5 62 49.7002 74c-1.10059 4.5 -1.7002 9.2002 -1.7002 14c0 35.2998 28.7002 64 64 64
c0.799805 0 1.40039 -0.200195 2.2002 -0.200195c7.09961 27.7002 31.8994 48.2002 61.7998 48.2002zM576 144c0 -33.2998 -20.4004 -61.9004 -49.4004 -73.9004c0.900391 -4.59961 1.40039 -9.2998 1.40039 -14.0996c0 -39.7998 -32.2002 -72 -72 -72
c-4.09961 0 -8.09961 0.5 -12 1.2002c-9.59961 -28.5 -36.2002 -49.2002 -68 -49.2002c-39.7998 0 -72 32.2002 -72 72v376c0 35.4004 28.7002 64 64 64c29.9004 0 54.7002 -20.5 61.7998 -48.2002c0.700195 0 1.40039 0.200195 2.2002 0.200195
c35.2998 0 64 -28.7002 64 -64c0 -4.7998 -0.700195 -9.5 -1.7002 -14c29.2002 -12 49.7002 -40.5996 49.7002 -74c0 -12.5996 -3.09961 -24.2998 -8.2998 -34.9004c24 -13.7998 40.2998 -39.3994 40.2998 -69.0996z" />
    <glyph glyph-name="car-alt" unicode="&#xf5de;" horiz-adv-x="480" 
d="M438.66 235.67c24.1201 -9.16992 41.3398 -32.3301 41.3398 -59.6699v-48c0 -16.1299 -6.16016 -30.6797 -16 -41.9297v-54.0703c0 -17.6699 -14.3301 -32 -32 -32h-32c-17.6699 0 -32 14.3301 -32 32v32h-256v-32c0 -17.6699 -14.3301 -32 -32 -32h-32
c-17.6699 0 -32 14.3301 -32 32v54.0703c-9.83984 11.2598 -16 25.8096 -16 41.9297v48c0 27.3398 17.2197 50.5 41.3398 59.6699l11.2402 28.0996l19.9297 49.8301c17.1104 42.7705 57.9307 70.4004 103.99 70.4004h127c46.0703 0 86.8799 -27.6299 103.99 -70.4004
l19.9297 -49.8301zM131.93 289.83l-19.9297 -49.8301h256l-19.9297 49.8301c-7.29004 18.2197 -24.9404 30.1699 -44.5703 30.1699h-127c-19.6299 0 -37.2803 -11.9502 -44.5703 -30.1699zM80 128.2c19.2002 0 48 -3.19043 48 15.9502
c0 19.1396 -28.7998 47.8496 -48 47.8496s-32 -12.7598 -32 -31.9004c0 -19.1396 12.7998 -31.8994 32 -31.8994zM400 128.2c19.2002 0 32 12.7598 32 31.8994c0 19.1406 -12.7998 31.9004 -32 31.9004s-48 -28.71 -48 -47.8496c0 -19.1406 28.7998 -15.9502 48 -15.9502z
" />
    <glyph glyph-name="car-battery" unicode="&#xf5df;" 
d="M480 320c17.6699 0 32 -14.3301 32 -32v-256c0 -17.6699 -14.3301 -32 -32 -32h-448c-17.6699 0 -32 14.3301 -32 32v256c0 17.6699 14.3301 32 32 32h32v48c0 8.83984 7.16016 16 16 16h96c8.83984 0 16 -7.16016 16 -16v-48h128v48c0 8.83984 7.16016 16 16 16h96
c8.83984 0 16 -7.16016 16 -16v-48h32zM192 184v16c0 4.41992 -3.58008 8 -8 8h-112c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h112c4.41992 0 8 3.58008 8 8zM448 184v16c0 4.41992 -3.58008 8 -8 8h-40v40c0 4.41992 -3.58008 8 -8 8h-16
c-4.41992 0 -8 -3.58008 -8 -8v-40h-40c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h40v-40c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v40h40c4.41992 0 8 3.58008 8 8z" />
    <glyph glyph-name="car-crash" unicode="&#xf5e1;" horiz-adv-x="640" 
d="M143.25 227.19l-12.4199 -46.3701c-3.00977 -11.25 -3.62988 -22.8906 -2.41016 -34.3906l-35.2002 -28.9795c-6.56934 -5.41016 -16.3096 0.429688 -14.6201 8.76953l15.4404 76.6807c1.05957 5.25977 -2.66016 10.2793 -8 10.79l-77.8604 7.5498
c-8.46973 0.819336 -11.2295 11.8301 -4.13965 16.54l65.1504 43.2998c4.45996 2.96973 5.37988 9.15039 1.97949 13.29l-49.71 60.4102c-5.41016 6.56934 0.429688 16.2998 8.78027 14.6201l76.6797 -15.4404c5.25977 -1.05957 10.2803 2.66016 10.7998 8l7.5498 77.8604
c0.820312 8.47949 11.8301 11.2295 16.5508 4.13965l43.2998 -65.1396c2.96973 -4.45996 9.14941 -5.37988 13.29 -1.98047l60.3994 49.71c6.57031 5.41016 16.3008 -0.429688 14.6201 -8.76953l-11.3301 -56.1602c-2.70996 -3.0498 -5.42969 -6.08984 -7.90918 -9.40039
l-32.1504 -42.9697l-10.71 -14.3203c-32.7305 -8.75977 -59.1797 -34.5293 -68.0801 -67.7393zM637.82 94.6797l-12.4199 -46.3594c-3.13086 -11.6807 -9.38086 -21.6104 -17.5508 -29.3604c-2.25488 -2.13574 -6.17969 -5.27148 -8.75977 -7l-13.9902 -52.2295
c-1.13965 -4.27051 -3.09961 -8.10059 -5.64941 -11.3809c-7.66992 -9.83984 -20.7402 -14.6797 -33.54 -11.25l-30.9102 8.28027c-17.0703 4.57031 -27.2002 22.1201 -22.6299 39.1904l8.28027 30.9102l-247.28 66.2598l-8.28027 -30.9102
c-4.57031 -17.0703 -22.1201 -27.2002 -39.1895 -22.6299l-30.9102 8.28027c-12.7998 3.42969 -21.7002 14.1592 -23.4199 26.5098c-0.570312 4.12012 -0.350586 8.41992 0.790039 12.6797l13.9893 52.2305c-1.37207 2.78809 -3.2041 7.46973 -4.08984 10.4492
c-3.2002 10.79 -3.64941 22.5205 -0.519531 34.2002l12.4199 46.3701c5.30957 19.7998 19.3594 34.8301 36.8896 42.21c4.9082 2.06836 13.1914 4.18262 18.4902 4.71973l18.1299 24.2305l32.1504 42.9697c3.44922 4.61035 7.18945 8.90039 11.1992 12.8398
c8 7.89062 17.0303 14.4404 26.7402 19.5107c4.86035 2.54004 9.89062 4.70996 15.0498 6.48926c10.3301 3.58008 21.1904 5.62988 32.2402 6.04004s22.3105 -0.819336 33.4307 -3.7998l122.68 -32.8701c11.1201 -2.97949 21.4795 -7.54004 30.8496 -13.4297
c11.7236 -7.36133 27.2646 -22.8174 34.6904 -34.5c8.81934 -13.8799 14.6396 -29.8398 16.6797 -46.9902l6.36035 -53.29l3.58984 -30.0498c8.79297 -6.34863 18.9805 -19.7568 22.7402 -29.9297c4.38965 -11.8799 5.29004 -25.1904 1.75 -38.3906zM255.58 213.66
c-18.5498 4.96973 -34.21 -4.04004 -39.1699 -22.5303s4.10938 -34.1201 22.6494 -39.0898c18.5508 -4.96973 45.54 -15.5098 50.4902 2.97949c4.95996 18.4902 -15.4297 53.6709 -33.9697 58.6406zM546.19 185.49l-6.36035 53.29
c-0.580078 4.87012 -1.88965 9.5293 -3.82031 13.8594c-5.7998 12.9902 -17.2002 23.0107 -31.4199 26.8203l-122.68 32.8701c-3.36914 0.902344 -8.93457 1.63477 -12.4229 1.63477c-13.2676 0 -30.4883 -8.62207 -38.4375 -19.2451l-32.1494 -42.9697l172 -46.0801z
M564.68 130.84c-18.5498 4.96973 -53.7998 -15.3096 -58.75 -33.79c-4.94922 -18.4902 23.6904 -22.8594 42.2402 -27.8301c18.5498 -4.96973 34.21 4.04004 39.1699 22.5303c4.9502 18.4805 -4.10938 34.1201 -22.6602 39.0898z" />
    <glyph glyph-name="car-side" unicode="&#xf5e4;" horiz-adv-x="640" 
d="M544 256c53.0195 0 96 -42.9805 96 -96v-80c0 -8.83984 -7.16016 -16 -16 -16h-48c0 -53.0195 -42.9805 -96 -96 -96s-96 42.9805 -96 96h-128c0 -53.0195 -42.9805 -96 -96 -96s-96 42.9805 -96 96h-48c-8.83984 0 -16 7.16016 -16 16v112
c0 29.79 20.4404 54.5996 48 61.7402l47.9102 122.029c9.71973 24.3008 33.25 40.2305 59.4199 40.2305h213.91c16.9795 -0.00195312 39.3701 -10.7627 49.9795 -24.0195l108.78 -135.98h16zM160 16c26.4697 0 48 21.5303 48 48s-21.5303 48 -48 48s-48 -21.5303 -48 -48
s21.5303 -48 48 -48zM232 256v96h-76.6699l-38.4004 -96h115.07zM280 256h166.04l-76.7998 96h-89.2402v-96zM480 16c26.4697 0 48 21.5303 48 48s-21.5303 48 -48 48s-48 -21.5303 -48 -48s21.5303 -48 48 -48z" />
    <glyph glyph-name="charging-station" unicode="&#xf5e7;" horiz-adv-x="576" 
d="M336 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-320c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h320zM544 320h16c8.83984 0 16 -7.16016 16 -16v-32c0 -35.7598 -23.6201 -65.6904 -56 -75.9297v-120.07
c0 -44.4102 -38.29 -80.0498 -83.5898 -75.6201c-39.4902 3.85059 -68.4102 39.3398 -68.4102 79.0098v24.6104c0 22.0898 -17.9102 40 -40 40h-8v-112h-288v352c0 35.3496 28.6504 64 64 64h160c35.3496 0 64 -28.6504 64 -64v-192h8c48.5996 0 88 -39.4004 88 -88v-28
c0 -16.9902 15.2197 -30.5 32.7402 -27.6104c13.7598 2.27051 23.2598 15.2402 23.2598 29.1904v118.49c-32.3799 10.2393 -56 40.1699 -56 75.9297v32c0 8.83984 7.16016 16 16 16h16v48c0 8.83984 7.16016 16 16 16s16 -7.16016 16 -16v-48h32v48
c0 8.83984 7.16016 16 16 16s16 -7.16016 16 -16v-48zM260.09 272.24c4.62012 6.97949 -1.14941 15.7598 -10.3896 15.7598h-57.7002l11.5996 50.79c2.02051 6.66992 -3.71973 13.21 -11.5996 13.21h-68c-6.01953 0 -11.0996 -3.90039 -11.8896 -9.11035l-16 -107
c-0.959961 -6.2998 4.63965 -11.8896 11.8896 -11.8896h59.3496l-23.0195 -83.0801c-1.7998 -6.63965 4 -12.9199 11.6699 -12.9199c4.17969 0 8.19043 1.91016 10.3896 5.24023z" />
    <glyph glyph-name="directions" unicode="&#xf5eb;" 
d="M502.61 214.68c12.5195 -12.5293 12.5195 -32.8301 0 -45.3594l-223.931 -223.931c-12.5293 -12.5293 -32.8398 -12.5293 -45.3594 0l-223.931 223.931c-12.5195 12.5293 -12.5195 32.8301 0 45.3594l223.931 223.931c12.5293 12.5195 32.8398 12.5195 45.3594 0z
M401.63 202.12c3.42969 3.16992 3.42969 8.58984 0 11.7598l-84.21 77.7305c-5.12988 4.72949 -13.4297 1.08984 -13.4297 -5.87988v-53.7305h-112c-17.6699 0 -32 -14.3301 -32 -32v-80c0 -4.41992 3.58008 -8 8 -8h32c4.41992 0 8 3.58008 8 8v64h96v-53.7305
c0 -6.97949 8.30957 -10.6094 13.4297 -5.87988z" />
    <glyph glyph-name="draw-polygon" unicode="&#xf5ee;" horiz-adv-x="448" 
d="M384 96c35.3496 0 64 -28.6504 63.9902 -64c0 -35.3496 -28.6504 -64 -64 -64c-23.6299 0 -44.0303 12.9502 -55.1201 32h-209.75c-11.0801 -19.0498 -31.4902 -32 -55.1201 -32c-35.3496 0 -64 28.6504 -64 64c0 23.6299 12.9502 44.04 32 55.1299v209.75
c-19.0498 11.0801 -32 31.4902 -32 55.1201c0 35.3496 28.6504 64 64 64c23.6299 0 44.04 -12.9502 55.1201 -32h209.76c11.0801 19.0498 31.4902 32 55.1201 32c35.3496 0 64 -28.6504 64 -64s-28.6504 -64 -64 -64c-0.349609 0 -0.669922 0.0898438 -1.01953 0.0996094
l-39.2002 -65.3193c5.08008 -9.16992 8.21973 -19.5605 8.21973 -30.7803s-3.15039 -21.6104 -8.21973 -30.7803l39.2002 -65.3193c0.349609 0 0.669922 0.0996094 1.01953 0.0996094zM96 87.1201c8.07422 -4.68848 18.4316 -15.0459 23.1201 -23.1201h208.36
l-38.4609 64.0996c-0.349609 0 -0.669922 -0.0996094 -1.01953 -0.0996094c-35.3496 0 -64 28.6504 -64 64s28.6504 64 64 64c0.349609 0 0.669922 -0.0898438 1.01953 -0.0996094l38.4609 64.0996h-208.36c-4.69043 -8.07227 -15.0479 -18.4297 -23.1201 -23.1201v-209.76z
M272 192c0 -8.82031 7.17969 -16 16 -16s16 7.17969 16 16s-7.17969 16 -16 16s-16 -7.17969 -16 -16zM400 352c0 8.82031 -7.17969 16 -16 16s-16 -7.17969 -16 -16s7.17969 -16 16 -16s16 7.17969 16 16zM64 368c-8.82031 0 -16 -7.17969 -16 -16s7.17969 -16 16 -16
s16 7.17969 16 16s-7.17969 16 -16 16zM48 32c0 -8.82031 7.17969 -16 16 -16s16 7.17969 16 16s-7.17969 16 -16 16s-16 -7.17969 -16 -16zM384 16c8.82031 0 16 7.17969 16 16s-7.17969 16 -16 16s-16 -7.17969 -16 -16s7.17969 -16 16 -16z" />
    <glyph glyph-name="laptop-code" unicode="&#xf5fc;" horiz-adv-x="640" 
d="M255.03 186.35l-58.3506 58.3408c-6.25 6.25 -6.25 16.3799 0 22.6299l58.3398 58.3398c6.25 6.25 16.3809 6.25 22.6309 0l11.3096 -11.3105c6.25 -6.25 6.25 -16.3799 0 -22.6299l-35.71 -35.7197l35.7197 -35.71c6.25 -6.25 6.25 -16.3799 0 -22.6299
l-11.3096 -11.3105c-6.25 -6.25 -16.3799 -6.25 -22.6299 0zM351.04 197.65c-6.25 6.25 -6.25 16.3799 0 22.6299l35.71 35.7197l-35.71 35.71c-6.25 6.25 -6.25 16.3799 0 22.6299l11.3096 11.3105c6.25 6.25 16.3809 6.25 22.6309 0l58.3398 -58.3408
c6.25 -6.25 6.25 -16.3799 0 -22.6299l-58.3398 -58.3398c-6.25 -6.25 -16.3809 -6.25 -22.6309 0zM624 32c8.7998 0 16 -7.2002 16 -16v-16c0 -35.2002 -28.7998 -64 -64 -64h-512c-35.2002 0 -64 28.7998 -64 64v16c0 8.7998 7.2002 16 16 16h239.23
c-0.25 -14.5303 14.0791 -32 32.7695 -32h60.7998c18.0303 0 32 12.1904 32.7402 32h242.46zM576 400v-336h-512v336c0 26.4004 21.5996 48 48 48h416c26.4004 0 48 -21.5996 48 -48zM512 128v256h-384v-256h384z" />
    <glyph glyph-name="layer-group" unicode="&#xf5fd;" 
d="M12.4102 299.98c-16.5498 7.50977 -16.5498 32.5293 0 40.0391l232.95 105.671c2.79883 1.2793 7.56738 2.31738 10.6445 2.31738s7.84668 -1.03809 10.6455 -2.31738l232.93 -105.681c16.5498 -7.50977 16.5498 -32.5195 0 -40.0293l-232.94 -105.671
c-6.7998 -3.08984 -14.4893 -3.08984 -21.29 0zM499.59 211.7c16.5498 -7.5 16.5498 -32.5 0 -40l-232.95 -105.59c-6.7998 -3.08008 -14.4893 -3.08008 -21.29 0l-232.939 105.59c-16.5498 7.5 -16.5498 32.5 0 40l58.0996 26.3301l161.63 -73.2705
c7.57031 -3.42969 15.5908 -5.16992 23.8604 -5.16992s16.2998 1.74023 23.8604 5.16992l161.64 73.2705zM499.59 83.9004c16.5498 -7.5 16.5498 -32.5 0 -40l-232.95 -105.591c-6.7998 -3.0791 -14.4893 -3.0791 -21.29 0l-232.939 105.591
c-16.5498 7.5 -16.5498 32.5 0 40l57.8799 26.2295l161.85 -73.3701c7.57031 -3.42969 15.5908 -5.16992 23.8604 -5.16992s16.2998 1.74023 23.8604 5.16992l161.859 73.3701z" />
    <glyph glyph-name="lungs" unicode="&#xf604;" horiz-adv-x="640" 
d="M636.11 57.8496c2.58984 -9.68945 3.88965 -19.6396 3.88965 -29.6299c0 -61.2295 -62.4805 -105.439 -125.24 -88.6201l-59.5 15.9502c-42.1797 11.3105 -71.2598 47.4697 -71.2598 88.6201v87.4902l85.8398 -57.2305
c1.1123 -0.741211 3.09961 -1.34375 4.43652 -1.34375c2.36328 0 5.34375 1.59668 6.65332 3.56445l8.87988 13.3096c0.742188 1.1123 1.34375 3.09961 1.34375 4.43555c0 2.36328 -1.5957 5.34473 -3.56348 6.6543l-167.59 111.72l-167.59 -111.72
c-1.96777 -1.30957 -3.56445 -4.29004 -3.56445 -6.65332c0 -1.33691 0.602539 -3.32422 1.34473 -4.43652l8.87988 -13.3096c1.30859 -1.96777 4.29004 -3.56445 6.65332 -3.56445c1.33691 0 3.32422 0.601562 4.43652 1.34375l85.8398 57.2305v-87.4902
c0 -41.1504 -29.0801 -77.3203 -71.2598 -88.6201l-59.5 -15.9502c-62.7598 -16.8193 -125.24 27.3906 -125.24 88.6201c0 9.99023 1.2998 19.9404 3.88965 29.6299c21.6699 81.3008 56.04 159.15 102.011 231.021c22.1191 34.5703 36.0693 63.1299 80.0498 63.1299
c38.6895 0 70.0498 -29.4199 70.0498 -65.71v-60.1104l32.8799 21.9199c4.4502 2.9707 7.12012 7.95996 7.12012 13.3105v170.59c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-170.59v-0.00292969c0 -4.72363 3.18945 -10.6855 7.12012 -13.3076
l32.8799 -21.9199v60.1104c0 36.29 31.3604 65.71 70.0498 65.71c43.9805 0 57.9307 -28.5596 80.0498 -63.1299c45.9707 -71.8701 80.3408 -149.72 102.011 -231.021z" />
    <glyph glyph-name="microscope" unicode="&#xf610;" 
d="M160 128c-17.6699 0 -32 14.3301 -32 32v224c0 17.6699 14.3301 32 32 32v16c0 8.83984 7.16016 16 16 16h64c8.83984 0 16 -7.16016 16 -16v-16c17.6699 0 32 -14.3301 32 -32v-224c0 -17.6699 -14.3301 -32 -32 -32h-12v-16c0 -8.83984 -7.16016 -16 -16 -16h-40
c-8.83984 0 -16 7.16016 -16 16v16h-12zM464 0c26.5098 0 48 -21.4902 48 -48c0 -8.83984 -7.16016 -16 -16 -16h-480c-8.83984 0 -16 7.16016 -16 16c0 26.5098 21.4902 48 48 48h272c70.5801 0 128 57.4199 128 128s-57.4199 128 -128 128v64
c105.88 0 192 -86.1201 192 -192c0 -49.2002 -18.7598 -93.9902 -49.29 -128h1.29004zM104 32c-4.41992 0 -8 3.58008 -8 8v16c0 4.41992 3.58008 8 8 8h208c4.41992 0 8 -3.58008 8 -8v-16c0 -4.41992 -3.58008 -8 -8 -8h-208z" />
    <glyph glyph-name="oil-can" unicode="&#xf613;" horiz-adv-x="640" 
d="M629.8 287.69c5.11035 1.45996 10.2002 -2.38086 10.1904 -7.69043v-18.0801c0 -2.12012 -0.839844 -4.16016 -2.33984 -5.66016l-212.261 -214.75c-6.00977 -6.08984 -14.21 -9.50977 -22.7598 -9.50977h-274.63c-17.6699 0 -32 14.3301 -32 32v46.54l-69.7197 12.6904
c-15.2207 2.75977 -26.2803 16.0195 -26.2803 31.4795v94.9502c0 17.9795 14.6699 32.0098 31.9297 32.0098c1.61133 0 4.20605 -0.237305 5.79004 -0.530273l138.28 -25.1396h56v48h-56c-8.83984 0 -16 7.16016 -16 16v16c0 8.83984 7.16016 16 16 16h160
c8.83984 0 16 -7.16016 16 -16v-16c0 -8.83984 -7.16016 -16 -16 -16h-56v-48h56.8896c8.33984 -0.00292969 21.1611 -3.03125 28.6201 -6.75977l50.4902 -25.2402zM96 159.33v62.4297l-48 8.73047v-62.4307zM549.33 74.6699c0 23.5605 42.6699 85.3301 42.6699 85.3301
s42.6699 -61.7598 42.6699 -85.3301s-19.0996 -42.6699 -42.6699 -42.6699s-42.6699 19.1104 -42.6699 42.6699z" />
    <glyph glyph-name="poop" unicode="&#xf619;" 
d="M451.36 78.8604c34.3301 -5.48047 60.6396 -34.9805 60.6396 -70.8604c0 -39.7598 -32.2402 -72 -72 -72h-368c-39.7598 0 -72 32.2402 -72 72c0 35.8799 26.3096 65.3799 60.6396 70.8604c-17.2998 13.1494 -28.6396 33.7295 -28.6396 57.1396
c0 39.7695 32.2402 72 72 72h14.0703c-13.4199 11.7305 -22.0703 28.7803 -22.0703 48c0 35.3496 28.6504 64 64 64h16c44.1797 0 80 35.8203 80 80c0 17.3799 -5.69043 33.3604 -15.1104 46.4805c4.95996 0.779297 9.94043 1.51953 15.1104 1.51953
c53.0195 0 96 -42.9805 96 -96c0 -11.2803 -2.30957 -21.9502 -5.87988 -32h5.87988c35.3496 0 64 -28.6504 64 -64c0 -19.2197 -8.65039 -36.2695 -22.0703 -48h14.0703c39.7598 0 72 -32.2305 72 -72c0 -23.4102 -11.3398 -43.9902 -28.6396 -57.1396z" />
    <glyph glyph-name="shapes" unicode="&#xf61f;" 
d="M128 192c70.6562 0 128 -57.3438 128 -128s-57.3438 -128 -128 -128s-128 57.3438 -128 128s57.3438 128 128 128zM507 246.86c14.2402 -24.3799 -3.58008 -54.8604 -32.0898 -54.8604h-213.82c-28.5098 0 -46.3301 30.4805 -32.0898 54.8604l106.93 182.85
c5.97266 10.0967 20.3398 18.291 32.0703 18.291s26.0977 -8.19434 32.0703 -18.291zM480 160c17.6641 0 32 -14.3359 32 -32v-160c0 -17.6641 -14.3359 -32 -32 -32h-160c-17.6641 0 -32 14.3359 -32 32v160c0 17.6641 14.3359 32 32 32h160z" />
    <glyph glyph-name="star-of-life" unicode="&#xf621;" horiz-adv-x="480" 
d="M471.99 113.57c7.66016 -4.41992 10.2793 -14.2002 5.85938 -21.8506l-32.0195 -55.4297c-4.41992 -7.66016 -14.21 -10.2803 -21.8701 -5.86035l-135.93 78.4307v-156.86c0 -8.83984 -7.16992 -16 -16.0107 -16h-64.0391c-8.84082 0 -16.0107 7.16016 -16.0107 16
v156.85l-135.93 -78.4297c-7.66016 -4.41016 -17.4502 -1.79004 -21.8701 5.86035l-32.0195 55.4297c-4.41992 7.65039 -1.80078 17.4404 5.85938 21.8604l135.931 78.4297l-135.931 78.4297c-7.66016 4.41992 -10.2793 14.21 -5.85938 21.8604l32.0195 55.4199
c4.41992 7.65039 14.21 10.2803 21.8701 5.86035l135.93 -78.4307v156.86c0 8.83984 7.16992 16 16.0107 16h64.0391c8.84082 0 16.0107 -7.16016 16.0107 -16v-156.85l135.93 78.4297c7.66016 4.41992 17.4502 1.79004 21.8701 -5.86035l32.0195 -55.4297
c4.41992 -7.66016 1.80078 -17.4404 -5.85938 -21.8604l-135.931 -78.4297z" />
    <glyph glyph-name="teeth" unicode="&#xf62e;" horiz-adv-x="640" 
d="M544 448c53.0195 0 96 -42.9805 96 -96v-320c0 -53.0195 -42.9805 -96 -96 -96h-448c-53.0195 0 -96 42.9805 -96 96v320c0 53.0195 42.9805 96 96 96h448zM160 80v64c0 8.83984 -7.16016 16 -16 16h-64c-8.83984 0 -16 -7.16016 -16 -16v-64
c0 -26.5098 21.4902 -48 48 -48s48 21.4902 48 48zM160 208v64c0 26.5098 -21.4902 48 -48 48s-48 -21.4902 -48 -48v-64c0 -8.83984 7.16016 -16 16 -16h64c8.83984 0 16 7.16016 16 16zM304 88v56c0 8.83984 -7.16016 16 -16 16h-80c-8.83984 0 -16 -7.16016 -16 -16v-56
c0 -30.9297 25.0703 -56 56 -56s56 25.0703 56 56zM304 208v88c0 30.9297 -25.0703 56 -56 56s-56 -25.0703 -56 -56v-88c0 -8.83984 7.16016 -16 16 -16h80c8.83984 0 16 7.16016 16 16zM448 88v56c0 8.83984 -7.16016 16 -16 16h-80c-8.83984 0 -16 -7.16016 -16 -16v-56
c0 -30.9297 25.0703 -56 56 -56s56 25.0703 56 56zM448 208v88c0 30.9297 -25.0703 56 -56 56s-56 -25.0703 -56 -56v-88c0 -8.83984 7.16016 -16 16 -16h80c8.83984 0 16 7.16016 16 16zM576 80v64c0 8.83984 -7.16016 16 -16 16h-64c-8.83984 0 -16 -7.16016 -16 -16v-64
c0 -26.5098 21.4902 -48 48 -48s48 21.4902 48 48zM576 208v64c0 26.5098 -21.4902 48 -48 48s-48 -21.4902 -48 -48v-64c0 -8.83984 7.16016 -16 16 -16h64c8.83984 0 16 7.16016 16 16z" />
    <glyph glyph-name="teeth-open" unicode="&#xf62f;" horiz-adv-x="640" 
d="M544 448c53.0195 0 96 -42.9805 96 -96v-64c0 -35.3496 -28.6602 -64 -64 -64h-512c-35.3398 0 -64 28.6504 -64 64v64c0 53.0195 42.9805 96 96 96h448zM160 272v32c0 26.5098 -21.4902 48 -48 48s-48 -21.4902 -48 -48v-32c0 -8.83984 7.16016 -16 16 -16h64
c8.83984 0 16 7.16016 16 16zM304 272v56c0 30.9297 -25.0703 56 -56 56s-56 -25.0703 -56 -56v-56c0 -8.83984 7.16016 -16 16 -16h80c8.83984 0 16 7.16016 16 16zM448 272v56c0 30.9297 -25.0703 56 -56 56s-56 -25.0703 -56 -56v-56c0 -8.83984 7.16016 -16 16 -16h80
c8.83984 0 16 7.16016 16 16zM576 272v32c0 26.5098 -21.4902 48 -48 48s-48 -21.4902 -48 -48v-32c0 -8.83984 7.16016 -16 16 -16h64c8.83984 0 16 7.16016 16 16zM576 128c35.3398 0 64 -28.6504 64 -64v-32c0 -53.0195 -42.9805 -96 -96 -96h-448
c-53.0195 0 -96 42.9805 -96 96v32c0 35.3496 28.6602 64 64 64h512zM160 48v32c0 8.83984 -7.16016 16 -16 16h-64c-8.83984 0 -16 -7.16016 -16 -16v-32c0 -26.5098 21.4902 -48 48 -48s48 21.4902 48 48zM304 56v24c0 8.83984 -7.16016 16 -16 16h-80
c-8.83984 0 -16 -7.16016 -16 -16v-24c0 -30.9297 25.0703 -56 56 -56s56 25.0703 56 56zM448 56v24c0 8.83984 -7.16016 16 -16 16h-80c-8.83984 0 -16 -7.16016 -16 -16v-24c0 -30.9297 25.0703 -56 56 -56s56 25.0703 56 56zM576 48v32c0 8.83984 -7.16016 16 -16 16h-64
c-8.83984 0 -16 -7.16016 -16 -16v-32c0 -26.5098 21.4902 -48 48 -48s48 21.4902 48 48z" />
    <glyph glyph-name="theater-masks" unicode="&#xf630;" horiz-adv-x="640" 
d="M206.86 202.85l-7.62988 -43.1797c-21.0908 -7.21973 -38.5 -18.2002 -49.9004 -30.9199c-2.41992 32.9004 21.6504 63.6504 57.5303 74.0996zM95.8096 153c5.87012 -33.1699 64.3203 -71.8096 111.931 -84.79c10.5596 -27.0996 25.9795 -50.5 39.5 -67.5801
c-3.25977 -0.339844 -6.41992 -0.799805 -10.0098 -0.799805c-68.1201 0 -190.221 61.5596 -204.45 142.08l-31.7305 179.51c-4.96973 28.0996 7.98047 56.0996 32.1504 69.5205c67.8193 37.6396 143.46 57.0596 220.12 57.0596c23.9199 0 47.9492 -1.88965 71.8594 -5.7002
c17.29 -2.76953 31.7803 -13.0498 41.7705 -27c-19.1299 -0.769531 -38.29 -2.2998 -57.1807 -5.31934c-19.8594 -3.1709 -37.6396 -12.5303 -51.5898 -26c-1.62012 0.0195312 -3.23926 0.189453 -4.84961 0.189453c-65.8896 0 -131.25 -16.9502 -189.01 -49.0098
c0.0400391 -0.0302734 -0.530273 -1.03027 -0.240234 -2.65039zM193.36 290.46c3.83984 -21.7002 -10.6904 -42.4004 -32.4404 -46.2197c-21.7598 -3.82031 -42.5 10.6699 -46.3398 32.3701c-0.730469 4.12012 -0.610352 8.15918 -0.0898438 12.0996
c10.8096 -5.57031 24.8301 -7.75 39.4795 -5.16992c14.6504 2.57031 27.0703 9.41016 35.3203 18.3203c1.83984 -3.53027 3.33984 -7.28027 4.07031 -11.4004zM606.8 327.1c24.1699 -13.4092 37.1201 -41.4092 32.1504 -69.5195l-31.7305 -179.51
c-15.3896 -87.0508 -156.83 -151.931 -219.859 -140.84c-63.0303 11.0791 -173.7 120.3 -158.311 207.35l31.7305 179.51c4.95996 28.1006 26.7295 50 54.04 54.3604c100.55 16.0596 203 -1.96973 291.979 -51.3506zM333.56 230.3
c-0.729492 -4.12012 -0.609375 -8.16016 -0.0791016 -12.1094c10.8096 5.56934 24.8291 7.75 39.4795 5.16992c14.6504 -2.57031 27.0703 -9.41016 35.3203 -18.3203c1.83984 3.53027 3.33984 7.28027 4.06934 11.4004c3.83008 21.6992 -10.6895 42.3896 -32.4492 46.2197
c-21.7607 3.83008 -42.5 -10.6602 -46.3408 -32.3604zM404.03 31.54c55.6699 -9.79004 108.2 23.7803 122.38 75.7197c-28.1104 -16.9697 -68.6504 -24.21 -111.93 -16.5996c-43.2803 7.60938 -78.8906 28.2402 -99.4902 53.7803
c-4.48047 -53.6309 33.3594 -103.11 89.04 -112.9zM534.33 182.88c1.83984 3.52051 3.33984 7.27051 4.07031 11.4004c3.83008 21.7002 -10.7002 42.3896 -32.4502 46.2197c-21.7598 3.82031 -42.5 -10.6699 -46.3398 -32.3701
c-0.730469 -4.12012 -0.610352 -8.16016 -0.0908203 -12.0996c10.8105 5.56934 24.8301 7.75 39.4805 5.16992c14.6504 -2.57031 27.0801 -9.41016 35.3301 -18.3203z" />
    <glyph glyph-name="traffic-light" unicode="&#xf637;" horiz-adv-x="384" 
d="M384 256c0 -41.7402 -26.7998 -76.9004 -64 -90.1201v-37.8799h64c0 -42.8398 -28.25 -78.6904 -66.9902 -91.0498c-12.4297 -57.6699 -63.6094 -100.95 -125.01 -100.95s-112.58 43.2803 -125.01 100.95c-38.7402 12.3594 -66.9902 48.21 -66.9902 91.0498h64v37.8799
c-37.2002 13.2197 -64 48.3799 -64 90.1201h64v37.8799c-37.2002 13.2197 -64 48.3799 -64 90.1201h64v32c0 17.6699 14.3301 32 32 32h192c17.6699 0 32 -14.3301 32 -32v-32h64c0 -41.7402 -26.7998 -76.9004 -64 -90.1201v-37.8799h64zM192 32
c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48s21.4902 -48 48 -48zM192 160c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48s21.4902 -48 48 -48zM192 288c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48
s-48 -21.4902 -48 -48s21.4902 -48 48 -48z" />
    <glyph glyph-name="truck-monster" unicode="&#xf63b;" horiz-adv-x="640" 
d="M624 224c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-16.71c-29.21 38.6504 -75.0996 64 -127.28 64c-52.1797 0 -98.0693 -25.3496 -127.279 -64h-65.4502c-29.21 38.6504 -75.1006 64 -127.28 64s-98.0703 -25.3496 -127.28 -64h-16.7197
c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h16v80c0 8.83984 7.16016 16 16 16h176v96c0 17.6699 14.3301 32 32 32h113.24c16.9795 -0.00195312 39.3701 -10.7627 49.9795 -24.0195l83.1807 -103.98h73.5996c17.6699 0 32 -14.3301 32 -32v-64h16z
M288 320h132.44l-51.2002 64h-81.2402v-64zM592 96c8.83984 0 16 -7.16016 16.0195 -16v-32c0 -8.83984 -7.15918 -16 -16 -16h-5.19922c-1.79688 -6.01074 -5.67188 -15.3691 -8.65039 -20.8896l3.66992 -3.66992c6.25 -6.25 6.25 -16.3809 0 -22.6309l-22.6299 -22.6299
c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-3.66992 3.66992c-6.62012 -3.58008 -13.5703 -6.44922 -20.9004 -8.64941v-5.2002c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v5.2002c-7.33008 2.2002 -14.29 5.08008 -20.8994 8.64941
l-3.66992 -3.66992c-6.25 -6.25 -16.3809 -6.25 -22.6309 0l-22.6299 22.6299c-6.25 6.25 -6.25 16.3809 0 22.6309l3.66992 3.66992c-3.58008 6.60938 -6.44922 13.5596 -8.64941 20.8896h-5.2002c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h5.2002
c1.7959 6.01074 5.6709 15.3691 8.64941 20.8896l-3.66992 3.66992c-6.25 6.25 -6.25 16.3809 0 22.6309l22.6299 22.6299c6.25 6.25 16.3809 6.25 22.6309 0l3.66992 -3.66992c6.60938 3.58008 13.5596 6.44922 20.8896 8.64941v5.2002c0 8.83984 7.16016 16 16 16h32
c8.83984 0 16 -7.16016 16 -16v-5.2002c6.01074 -1.7959 15.3691 -5.6709 20.8896 -8.64941l3.66992 3.66992c6.25 6.25 16.3809 6.25 22.6309 0l22.6299 -22.6299c6.25 -6.25 6.25 -16.3809 0 -22.6309l-3.66992 -3.66992
c3.58008 -6.60938 6.44922 -13.5596 8.64941 -20.8896h5.2002zM480 16c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48s21.4902 -48 48 -48zM272 96c8.83984 0 16 -7.16016 16.0195 -15.9902v-32c0 -8.83984 -7.15918 -16 -16 -16h-5.19922
c-1.79688 -6.00977 -5.67188 -15.3691 -8.65039 -20.8896l3.66992 -3.66992c6.25 -6.25 6.25 -16.3799 0 -22.6299l-22.6299 -22.6299c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-3.66992 3.66992c-6.62012 -3.58008 -13.5703 -6.4502 -20.9004 -8.65039v-5.2002
c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v5.2002c-7.33008 2.2002 -14.29 5.08008 -20.8994 8.65039l-3.66992 -3.66992c-6.25 -6.25 -16.3809 -6.25 -22.6309 0l-22.6299 22.6299c-6.25 6.25 -6.25 16.3799 0 22.6299l3.66992 3.66992
c-3.58008 6.61035 -6.44922 13.5596 -8.64941 20.8896h-5.2002c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h5.2002c1.7959 6.01074 5.6709 15.3691 8.64941 20.8906l-3.66992 3.66992c-6.25 6.25 -6.25 16.3799 0 22.6299l22.6299 22.6201
c6.25 6.25 16.3809 6.25 22.6309 0l3.66992 -3.66992c6.60938 3.58008 13.5596 6.44922 20.8896 8.64941v5.2002c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-5.2002c6.01074 -1.7959 15.3691 -5.6709 20.8896 -8.64941l3.66992 3.66992
c6.25 6.25 16.3809 6.25 22.6309 0l22.6299 -22.6299c6.25 -6.25 6.25 -16.3809 0 -22.6309l-3.66992 -3.66992c3.58008 -6.60938 6.44922 -13.5596 8.64941 -20.8896h5.2002zM160 16c26.5098 0 48 21.4902 48 48s-21.4902 48 -48 48s-48 -21.4902 -48 -48
s21.4902 -48 48 -48z" />
    <glyph glyph-name="truck-pickup" unicode="&#xf63c;" horiz-adv-x="640" 
d="M624 160c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-49.5996c0.759766 -5.26953 1.60938 -10.5195 1.60938 -16c0 -61.8604 -50.1396 -112 -112 -112c-61.8594 0 -112 50.1396 -112 112c0 5.48047 0.850586 10.7305 1.61035 16h-67.2305
c0.760742 -5.26953 1.61035 -10.5195 1.61035 -16c0 -61.8604 -50.1396 -112 -112 -112s-112 50.1396 -112 112c0 5.48047 0.849609 10.7305 1.61035 16h-49.6104c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h16v64c0 17.6699 14.3301 32 32 32h160v128
c0 17.6699 14.3301 32 32 32h113.24c16.9795 -0.00195312 39.3701 -10.7627 49.9795 -24.0195l108.78 -135.98h48c17.6699 0 32 -14.3301 32 -32v-64h16zM288 352v-96h158.04l-76.7998 96h-81.2402zM176 32c26.4697 0 48 21.5303 48 48s-21.5303 48 -48 48
s-48 -21.5303 -48 -48s21.5303 -48 48 -48zM464 32c26.4697 0 48 21.5303 48 48s-21.5303 48 -48 48s-48 -21.5303 -48 -48s21.5303 -48 48 -48z" />
    <glyph glyph-name="ad" unicode="&#xf641;" 
d="M157.52 176l18.4805 53.2197l18.4805 -53.2197h-36.9609zM352 192c13.2305 0 24 -10.7695 24 -24s-10.7695 -24 -24 -24s-24 10.7695 -24 24s10.7695 24 24 24zM464 384c26.5 0 48 -21.5 48 -48v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288
c0 26.5 21.5 48 48 48h416zM250.58 96c11 0 18.7197 10.8496 15.1104 21.25l-53.6904 154.62c-3.08789 8.90332 -13.2422 16.1299 -22.666 16.1299h-0.00390625h-26.6602h-0.00390625c-9.41992 0 -19.5742 -7.22168 -22.666 -16.1201l-53.7002 -154.63
c-3.60938 -10.4004 4.11035 -21.25 15.1201 -21.25h16.9404h0.00585938c6.28125 0 13.0527 4.81641 15.1143 10.75l7.37988 21.25h70.29l7.36914 -21.25c2.24023 -6.42969 8.31055 -10.75 15.1201 -10.75h16.9404zM424 112v160c0 8.83984 -7.16016 16 -16 16h-16
c-8.83984 0 -16 -7.16016 -16 -16v-36.4199c-7.54004 2.68945 -15.54 4.41992 -24 4.41992c-39.7002 0 -72 -32.2998 -72 -72s32.2998 -72 72 -72c9.92969 0 19.4004 2.01953 28.0195 5.67969c2.94043 -3.41016 7.13086 -5.67969 11.9805 -5.67969h16
c8.83984 0 16 7.16016 16 16z" />
    <glyph glyph-name="ankh" unicode="&#xf644;" horiz-adv-x="320" 
d="M296 192c13.25 0 24 -10.7402 24 -24v-32c0 -13.25 -10.75 -24 -24 -24h-96v-152c0 -13.25 -10.75 -24 -24 -24h-32c-13.25 0 -24 10.75 -24 24v152h-96c-13.25 0 -24 10.75 -24 24v32c0 13.2598 10.75 24 24 24h44.6201c-21.0801 33.9902 -36.6201 74.3496 -36.6201 112
c0 88.3701 57.3096 144 128 144s128 -55.6299 128 -144c0 -37.6504 -15.54 -78.0098 -36.6201 -112h44.6201zM160 368c-29.6104 0 -48 -24.5195 -48 -64c0 -34.6602 27.1396 -78.1504 48 -100.87c20.8604 22.7305 48 66.21 48 100.87c0 39.4805 -18.3896 64 -48 64z" />
    <glyph glyph-name="bible" unicode="&#xf647;" horiz-adv-x="448" 
d="M448 89.5996c0 -9.59961 -3.2002 -16 -9.59961 -19.1992c-3.2002 -12.8008 -3.2002 -57.6006 0 -73.6006c6.39941 -6.39941 9.59961 -12.7998 9.59961 -19.2002v-16c0 -16 -12.7998 -25.5996 -25.5996 -25.5996h-326.4c-54.4004 0 -96 41.5996 -96 96v320
c0 54.4004 41.5996 96 96 96h326.4c16 0 25.5996 -9.59961 25.5996 -25.5996v-332.801zM144 304v-32c0 -8.83984 7.16016 -16 16 -16h48v-112c0 -8.83984 7.16016 -16 16 -16h32c8.83984 0 16 7.16016 16 16v112h48c8.83984 0 16 7.16016 16 16v32
c0 8.83984 -7.16016 16 -16 16h-48v48c0 8.83984 -7.16016 16 -16 16h-32c-8.83984 0 -16 -7.16016 -16 -16v-48h-48c-8.83984 0 -16 -7.16016 -16 -16zM380.8 0v64h-284.8c-16 0 -32 -12.7998 -32 -32s12.7998 -32 32 -32h284.8z" />
    <glyph glyph-name="business-time" unicode="&#xf64a;" horiz-adv-x="640" 
d="M496 224c79.5898 0 144 -64.4102 144 -144s-64.4102 -144 -144 -144s-144 64.4102 -144 144s64.4102 144 144 144zM560 73.71v12.5801c0 5.33984 -4.37012 9.70996 -9.70996 9.70996h-38.29v54.2803c0 5.33984 -4.37012 9.70996 -9.70996 9.70996h-12.5703
c-5.33984 0 -9.70996 -4.37012 -9.70996 -9.70996v-76.5703c0 -5.33984 4.37012 -9.70996 9.70996 -9.70996h60.5703c5.33984 0 9.70996 4.37012 9.70996 9.70996zM496 256c-37.5303 0 -72.2803 -11.9102 -100.88 -32h-395.12v80c0 25.5996 22.4004 48 48 48h80v48
c0 25.5996 22.4004 48 48 48h160c25.5996 0 48 -22.4004 48 -48v-48h80c25.5996 0 48 -22.4004 48 -48v-48.8096c-5.28027 0.479492 -10.5996 0.80957 -16 0.80957zM320 352v32h-128v-32h128zM326.82 128c-4.33984 -15.2803 -6.82031 -31.3398 -6.82031 -48
c0 -28.8203 7.09961 -55.96 19.4297 -80h-291.43c-25.5996 0 -48 22.4004 -48 48v144h192v-48c0 -8.83984 7.16016 -16 16 -16h118.82z" />
    <glyph glyph-name="city" unicode="&#xf64f;" horiz-adv-x="640" 
d="M616 256c13.25 0 24 -10.7402 24 -24v-264c0 -17.6699 -14.3301 -32 -32 -32h-576c-17.6699 0 -32 14.3301 -32 32v360c0 13.2598 10.7402 24 24 24h40v80c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-80h64v80c0 8.83984 7.16016 16 16 16h16
c8.83984 0 16 -7.16016 16 -16v-80h64v72c0 13.2598 10.7402 24 24 24h144c13.2598 0 24 -10.7402 24 -24v-168h136zM128 44v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12z
M128 140v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12zM128 236v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40
c6.62988 0 12 5.37012 12 12zM256 44v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12zM256 140v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40
c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12zM256 236v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12zM416 140v40c0 6.62988 -5.37012 12 -12 12h-40
c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12zM416 236v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12zM416 332v40
c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12zM576 44v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40
c6.62988 0 12 5.37012 12 12zM576 140v40c0 6.62988 -5.37012 12 -12 12h-40c-6.62988 0 -12 -5.37012 -12 -12v-40c0 -6.62988 5.37012 -12 12 -12h40c6.62988 0 12 5.37012 12 12z" />
    <glyph glyph-name="comment-dollar" unicode="&#xf651;" 
d="M256 416c141.38 0 256 -93.1201 256 -208s-114.62 -208 -256 -208c-38.4102 0 -74.71 7.07031 -107.4 19.3799c-24.6094 -19.6299 -74.3398 -51.3799 -140.6 -51.3799h-0.00195312c-4.41309 0 -7.99512 3.58203 -7.99512 7.99512
c0 1.76172 0.984375 4.22754 2.19727 5.50488c0.5 0.530273 42.2598 45.4502 54.8193 95.7598c-35.6094 35.7305 -57.0195 81.1807 -57.0195 130.74c0 114.88 114.62 208 256 208zM280 113.56c30.29 3.62012 53.3701 30.9805 49.3203 63.04
c-2.90039 22.96 -20.6602 41.3105 -42.9102 47.6699l-50.0703 14.3008c-3.59961 1.0293 -6.12012 4.35938 -6.12012 8.10938c0 4.64062 3.78027 8.41992 8.44043 8.41992h32.7803h0.0654297c2.94727 0 7.51367 -0.994141 10.1943 -2.21973
c4.7998 -2.20996 10.3701 -1.70996 14.1094 2.03027l17.5205 17.5195c5.26953 5.27051 4.66992 14.2705 -1.5498 18.3799c-9.5 6.27051 -20.3604 10.1104 -31.7803 11.46v17.7305c0 8.83984 -7.16016 16 -16 16h-16c-8.83984 0 -16 -7.16016 -16 -16v-17.5498
c-30.29 -3.62012 -53.3701 -30.9805 -49.3203 -63.0498c2.90039 -22.96 20.6602 -41.3203 42.9102 -47.6699l50.0703 -14.3008c3.59961 -1.0293 6.12012 -4.35938 6.12012 -8.10938c0 -4.64062 -3.78027 -8.41992 -8.44043 -8.41992h-32.7803
c-3.59961 0 -7.0791 0.759766 -10.2598 2.21973c-4.7998 2.20996 -10.3701 1.70996 -14.1094 -2.03027l-17.5205 -17.5195c-5.26953 -5.27051 -4.66992 -14.2705 1.5498 -18.3799c9.5 -6.27051 20.3604 -10.1104 31.7803 -11.46v-17.7305c0 -8.83984 7.16016 -16 16 -16h16
c8.83984 0 16 7.16016 16 16v17.5596z" />
    <glyph glyph-name="comments-dollar" unicode="&#xf653;" horiz-adv-x="576" 
d="M416 256c0 -88.3701 -93.1201 -160 -208 -160c-40.9805 0 -79.0703 9.24023 -111.27 24.9805c-21.8008 -12.7305 -52.1504 -24.9805 -88.7305 -24.9805h-0.00195312c-4.41309 0 -7.99512 3.58203 -7.99512 7.99512c0 1.76172 0.984375 4.22754 2.19727 5.50488
c0.319336 0.339844 22.4102 24.2803 35.7695 54.5195c-23.8398 26.0303 -37.9697 57.7109 -37.9697 91.9805c0 88.3701 93.1201 160 208 160s208 -71.6299 208 -160zM192 160c0 -4.41992 3.58008 -8 8 -8h16c4.41992 0 8 3.58008 8 8v16.1201
c23.6201 0.629883 42.6699 20.54 42.6699 45.0703c0 19.9697 -12.9902 37.8096 -31.5801 43.3896l-45 13.5c-5.16016 1.54004 -8.76953 6.78027 -8.76953 12.7295c0 7.27051 5.2998 13.1904 11.7998 13.1904h28.1104c4.55957 0 8.94922 -1.29004 12.8193 -3.71973
c3.24023 -2.03027 7.36035 -1.91016 10.1299 0.729492l11.75 11.21c3.53027 3.37012 3.33008 9.20996 -0.569336 12.1406c-9.10059 6.83984 -20.0801 10.7695 -31.3701 11.3496v16.29c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-16.1201
c-23.6201 -0.629883 -42.6699 -20.5498 -42.6699 -45.0703c0 -19.9697 12.9893 -37.8096 31.5801 -43.3896l45 -13.5c5.15918 -1.54004 8.76953 -6.78027 8.76953 -12.7295c0 -7.27051 -5.2998 -13.1904 -11.7998 -13.1904h-28.1104
c-4.55957 0 -8.9502 1.2998 -12.8193 3.71973c-3.24023 2.03027 -7.36035 1.91016 -10.1309 -0.729492l-11.75 -11.21c-3.5293 -3.37012 -3.3291 -9.20996 0.570312 -12.1406c9.10059 -6.83008 20.0801 -10.7695 31.3701 -11.3496v-16.29zM538.01 36.0098
c13.3604 -30.2598 35.4707 -54.1699 35.7803 -54.5c2.20996 -2.33008 2.82031 -5.72949 1.5498 -8.66992c-1.25 -2.92969 -4.13965 -4.83984 -7.33984 -4.83984c-36.5801 0 -66.9297 12.25 -88.7305 24.9805c-32.1992 -15.7402 -70.2891 -24.9805 -111.27 -24.9805
c-86.2305 0 -160.2 40.3701 -191.73 97.8799c10.4102 -1.11035 20.9502 -1.87988 31.7305 -1.87988c132.34 0 240 86.1299 240 192c0 6.78027 -0.469727 13.4697 -1.33008 20.0703c75.8398 -23.8701 129.33 -81.1299 129.33 -148.07
c0 -34.2695 -14.1299 -65.96 -37.9902 -91.9902z" />
    <glyph glyph-name="cross" unicode="&#xf654;" horiz-adv-x="384" 
d="M352 320c17.6699 0 32 -14.3301 32 -32v-64c0 -17.6699 -14.3301 -32 -32 -32h-96v-224c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32v224h-96c-17.6699 0 -32 14.3301 -32 32v64c0 17.6699 14.3301 32 32 32h96v96c0 17.6699 14.3301 32 32 32
h64c17.6699 0 32 -14.3301 32 -32v-96h96z" />
    <glyph glyph-name="dharmachakra" unicode="&#xf655;" 
d="M495 222.94c9.20996 0.569336 17 -6.74023 17.0098 -15.9707v-29.9395c0 -9.23047 -7.79004 -16.5498 -17 -15.9707l-17.2197 1.08008c-5.28027 -39.4795 -20.7998 -75.6299 -43.8604 -105.83l12.9502 -11.4297c6.91992 -6.09961 7.25977 -16.7803 0.730469 -23.3096
l-21.1699 -21.1699c-6.52051 -6.52051 -17.2002 -6.19043 -23.3105 0.729492l-11.4297 12.9502c-30.2002 -23.0703 -66.3506 -38.5898 -105.84 -43.8604l1.08008 -17.2197c0.569336 -9.20996 -6.74023 -17 -15.9707 -17h-29.9395c-9.23047 0 -16.5498 7.79004 -15.9707 17
l1.09082 17.2197c-39.4902 5.28027 -75.6406 20.7998 -105.841 43.8604l-11.4297 -12.9502c-6.09961 -6.91992 -16.7803 -7.25977 -23.3096 -0.729492l-21.1699 21.1699c-6.52051 6.51953 -6.19043 17.1992 0.729492 23.3096l12.9502 11.4297
c-23.0703 30.1904 -38.5898 66.3408 -43.8604 105.83l-17.2197 -1.08008c-9.20996 -0.569336 -17 6.74023 -17 15.9707v29.9395c0 9.23047 7.79004 16.5498 17 15.9707l17.2197 -1.08008c5.28027 39.4893 20.7998 75.6396 43.8604 105.84l-12.9502 11.4297
c-6.91992 6.10059 -7.25977 16.7803 -0.729492 23.3105l21.1699 21.1592c6.51953 6.52051 17.1992 6.19043 23.3096 -0.729492l11.4297 -12.9502c30.1904 23.0703 66.3408 38.5898 105.83 43.8604l-1.08008 17.2197c-0.569336 9.20996 6.74023 17 15.9707 17h29.9395
c9.23047 0 16.5498 -7.79004 15.9707 -17l-1.07031 -17.21c39.4795 -5.28027 75.6299 -20.7998 105.83 -43.8604l11.4297 12.9404c6.10059 6.91992 16.7803 7.25977 23.3105 0.729492l21.1592 -21.1592c6.52051 -6.52051 6.19043 -17.2002 -0.729492 -23.3105
l-12.9502 -11.4297c23.0703 -30.2002 38.5898 -66.3506 43.8604 -105.84zM281.84 349.39l-4.00977 -64.1201c10.2998 -2.40918 19.8896 -6.50977 28.6201 -11.9492l42.6201 48.29c-19.6006 14.1201 -42.4199 23.71 -67.2305 27.7793zM230.16 349.39
c-24.8105 -4.06934 -47.6299 -13.6592 -67.2305 -27.7793l42.6201 -48.29c8.73047 5.42969 18.3301 9.54004 28.6201 11.9492zM126.39 285.06c-14.1201 -19.5996 -23.71 -42.4092 -27.7793 -67.2197l64.1201 -4.00977c2.41992 10.29 6.51953 19.8896 11.96 28.6201z
M98.6104 166.16c4.06934 -24.8105 13.6592 -47.6299 27.7793 -67.2305l48.29 42.6201c-5.42969 8.73047 -9.54004 18.3301 -11.9492 28.6201zM230.16 34.6104l4 64.1201c-10.29 2.41992 -19.8906 6.51953 -28.6201 11.96l-42.6104 -48.3008
c19.6006 -14.1201 42.4199 -23.71 67.2305 -27.7793zM256 160c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM281.84 34.6104c24.8105 4.06934 47.6201 13.6592 67.2197 27.7793l-42.6094 48.3008
c-8.73047 -5.44043 -18.3301 -9.55078 -28.6201 -11.96zM385.61 98.9404c14.1201 19.5898 23.71 42.4092 27.7793 67.2295l-64.1201 4.00977c-2.40918 -10.2998 -6.50977 -19.8896 -11.9492 -28.6201zM349.27 213.83l64.1201 4
c-4.06934 24.8096 -13.6592 47.6299 -27.7793 67.2295l-48.3008 -42.6094c5.44043 -8.73047 9.55078 -18.3301 11.96 -28.6201z" />
    <glyph glyph-name="envelope-open-text" unicode="&#xf658;" 
d="M176 232c-8.83984 0 -16 7.16016 -16 16v16c0 8.83984 7.16016 16 16 16h160c8.83984 0 16 -7.16016 16 -16v-16c0 -8.83984 -7.16016 -16 -16 -16h-160zM160 152v16c0 8.83984 7.16016 16 16 16h160c8.83984 0 16 -7.16016 16 -16v-16c0 -8.83984 -7.16016 -16 -16 -16
h-160c-8.83984 0 -16 7.16016 -16 16zM256 30.8701c16.4199 0 32.8398 5.07031 46.8604 15.1895l209.14 151.08v-213.14c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v213.14l209.14 -151.08c14.0205 -10.1299 30.4404 -15.1895 46.8604 -15.1895z
M493.61 285.05c11.6094 -9.09961 18.3896 -23.0303 18.3896 -37.7695v-10.6504l-96 -69.3496v184.72h-320v-184.72l-96 69.3496v10.6504c0.00195312 12.8945 8.24023 29.8154 18.3896 37.7695c8.85059 6.94043 17.2402 13.4805 29.6104 22.8105v44.1396
c0 26.5098 21.4902 48 48 48h77.5498c3.04004 2.2002 5.87012 4.25977 9.04004 6.55957c16.8203 12.2705 50.21 41.79 73.4102 41.4404c23.2002 0.349609 56.5996 -29.1699 73.4102 -41.4404c3.16992 -2.2998 6 -4.35938 9.04004 -6.55957h77.5498
c26.5098 0 48 -21.4902 48 -48v-44.1396c12.3701 -9.34082 20.7598 -15.8701 29.6104 -22.8105z" />
    <glyph glyph-name="folder-minus" unicode="&#xf65d;" 
d="M464 320c26.5098 0 48 -21.4902 48 -48v-224c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h160l64 -64h192zM368 152v16c0 8.83984 -7.16016 16 -16 16h-192c-8.83984 0 -16 -7.16016 -16 -16v-16
c0 -8.83984 7.16016 -16 16 -16h192c8.83984 0 16 7.16016 16 16z" />
    <glyph glyph-name="folder-plus" unicode="&#xf65e;" 
d="M464 320c26.4961 0 48 -21.5039 48 -48v-224c0 -26.4961 -21.5039 -48 -48 -48h-416c-26.4961 0 -48 21.5039 -48 48v288c0 26.4961 21.5039 48 48 48h160l64 -64h192zM359.5 152v16c0 8.83203 -7.16797 16 -16 16h-64v64c0 8.83203 -7.16797 16 -16 16h-16
c-8.83203 0 -16 -7.16797 -16 -16v-64h-64c-8.83203 0 -16 -7.16797 -16 -16v-16c0 -8.83203 7.16797 -16 16 -16h64v-64c0 -8.83203 7.16797 -16 16 -16h16c8.83203 0 16 7.16797 16 16v64h64c8.83203 0 16 7.16797 16 16z" />
    <glyph glyph-name="funnel-dollar" unicode="&#xf662;" horiz-adv-x="640" 
d="M433.46 282.06c-83.4102 -20.8896 -145.46 -96.2695 -145.46 -186.06c0 -54.3496 22.7998 -103.38 59.21 -138.35c-10.75 -20.54 -38.3604 -29.21 -59.2197 -13.5703l-79.9902 60c-10.0703 7.55957 -16 19.4102 -16 32v155.92l-182.66 201.93
c-19.9502 19.9502 -5.82031 54.0703 22.4004 54.0703h480.52c28.2207 0 42.3506 -34.1201 22.4004 -54.0703zM480 256c88.3701 0 160 -71.6299 160 -160s-71.6299 -160 -160 -160s-160 71.6299 -160 160s71.6299 160 160 160zM496 16.1201
c23.6299 0.629883 42.6699 20.54 42.6699 45.0703c0 19.9697 -12.9902 37.8096 -31.5801 43.3896l-45 13.5c-5.16016 1.54004 -8.76953 6.78027 -8.76953 12.7295c0 7.27051 5.2998 13.1904 11.7998 13.1904h28.1104c4.55957 0 8.94922 -1.29004 12.8193 -3.71973
c3.24023 -2.03027 7.36035 -1.91016 10.1299 0.729492l11.75 11.21c3.53027 3.37012 3.33008 9.20996 -0.569336 12.1406c-9.10059 6.83984 -20.0801 10.7695 -31.3701 11.3496v16.29c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-16.1201
c-23.6201 -0.629883 -42.6699 -20.5498 -42.6699 -45.0703c0 -19.9697 12.9893 -37.8096 31.5801 -43.3896l45 -13.5c5.15918 -1.54004 8.76953 -6.78027 8.76953 -12.7295c0 -7.27051 -5.2998 -13.1904 -11.7998 -13.1904h-28.1104
c-4.55957 0 -8.9502 1.2998 -12.8193 3.71973c-3.24023 2.03027 -7.36035 1.91016 -10.1309 -0.729492l-11.75 -11.21c-3.5293 -3.37012 -3.3291 -9.20996 0.570312 -12.1406c9.10059 -6.83008 20.0801 -10.7695 31.3701 -11.3496v-16.29c0 -4.41992 3.58008 -8 8 -8h16
c4.41992 0 8 3.58008 8 8v16.1201z" />
    <glyph glyph-name="gopuram" unicode="&#xf664;" 
d="M496 96c8.7998 0 16 -7.2002 16 -16v-128c0 -8.7998 -7.2002 -16 -16 -16h-80v160h-32v128h-32v96h-32v-96h32v-128h32v-160h-80v80c0 8.7998 -7.2002 16 -16 16h-64c-8.7998 0 -16 -7.2002 -16 -16v-80h-80v160h32v128h32v96h-32v-96h-32v-128h-32v-160h-80
c-8.7998 0 -16 7.2002 -16 16v128c0 8.7998 7.2002 16 16 16h16v112c0 8.7998 7.2002 16 16 16h16v80c0 8.7998 7.2002 16 16 16h16v112c0 8.7998 7.2002 16 16 16s16 -7.2002 16 -16v-16h64v16c0 8.7998 7.2002 16 16 16s16 -7.2002 16 -16v-16h64v16
c0 8.7998 7.2002 16 16 16s16 -7.2002 16 -16v-16h64v16c0 8.7998 7.2002 16 16 16s16 -7.2002 16 -16v-112h16c8.7998 0 16 -7.2002 16 -16v-80h16c8.7998 0 16 -7.2002 16 -16v-112h16zM232 272v-48h48v48c0 8.7998 -7.2002 16 -16 16h-16c-8.7998 0 -16 -7.2002 -16 -16z
M288 96v64c0 8.7998 -7.2002 16 -16 16h-32c-8.7998 0 -16 -7.2002 -16 -16v-64h64z" />
    <glyph glyph-name="hamsa" unicode="&#xf665;" 
d="M509.34 140.75c1.46875 -3.37012 2.66016 -9.08984 2.66016 -12.7656c0 -6.95703 -3.85254 -16.7295 -8.59961 -21.8145l-102.681 -110.03c-35.6895 -38.2197 -88.4102 -60.1396 -144.72 -60.1396s-109.03 21.9199 -144.71 60.1396l-102.69 110.03
c-4.74707 5.08496 -8.59961 14.8574 -8.59961 21.8145c0 3.67578 1.19141 9.39551 2.66016 12.7656c5.05957 11.6904 16.5898 19.25 29.3398 19.25h64v208c0 22 18 40 40 40s40 -18 40 -40v-134c0 -5.51953 4.48047 -10 10 -10h20c5.51953 0 10 4.48047 10 10v174
c0 22 18 40 40 40s40 -18 40 -40v-174c0 -5.51953 4.48047 -10 10 -10h20c5.51953 0 10 4.48047 10 10v134c0 22 18 40 40 40s40 -18 40 -40v-208h64c12.75 0 24.2803 -7.55957 29.3398 -19.25zM256 32c53.0195 0 96 64 96 64s-42.9805 64 -96 64s-96 -64 -96 -64
s42.9805 -64 96 -64zM256 128c17.6699 0 32 -14.3301 32 -32s-14.3301 -32 -32 -32s-32 14.3301 -32 32s14.3301 32 32 32z" />
    <glyph glyph-name="bahai" unicode="&#xf666;" 
d="M496.25 245.48c17.54 -2.46094 21.6797 -26.2705 6.04004 -34.6602l-98.1602 -52.6602l74.4805 -83.54c11.8594 -13.29 0.00976562 -34.25 -17.3506 -30.4902l-108.569 23.6504l4.10938 -112.55c0.430664 -11.6504 -8.87012 -19.2207 -18.4102 -19.2207
c-5.15918 0 -10.3896 2.20996 -14.1992 7.18066l-68.1807 88.8994l-68.1797 -88.8994c-3.81055 -4.9707 -9.0498 -7.18066 -14.2002 -7.18066c-9.54004 0 -18.8398 7.57031 -18.4102 19.2207l4.11035 112.55l-108.57 -23.6504
c-1.39941 -0.30957 -2.75977 -0.450195 -4.06934 -0.450195c-15.0107 0 -24.21 18.6807 -13.29 30.9307l74.4795 83.54l-98.1602 52.6592c-15.6494 8.40039 -11.5098 32.21 6.03027 34.6709l110 15.4297l-41.8203 104.34c-6.66016 16.6396 11.6006 32.1797 26.5898 22.6299
l94.04 -59.8896l34.0908 107.189c2.70996 8.55078 10.0293 12.8203 17.3496 12.8203s14.6396 -4.26953 17.3496 -12.8203l34.0908 -107.18l94.04 59.8896c14.9893 9.55078 33.2598 -5.98926 26.5898 -22.6299l-41.8203 -104.34zM338.51 136.32l-35.6094 39.9297
l46.9199 25.1699l-52.5703 7.37988l19.9902 49.8701l-44.9502 -28.6201l-16.29 51.2305l-16.3096 -51.2305l-44.9502 28.6201l19.9902 -49.8701l-52.5703 -7.37988l46.9199 -25.1699l-35.5996 -39.9297l51.8896 11.2998l-1.95996 -53.79l32.5898 42.4902l32.5898 -42.4902
l-1.96973 53.79z" />
    <glyph glyph-name="jedi" unicode="&#xf669;" horiz-adv-x="576" 
d="M535.953 96c-42.6406 -94.1719 -137.641 -160 -247.984 -160c-4.26562 0 -8.54688 0.0986328 -12.8447 0.296875c-103.969 4.76562 -193.859 69.4688 -235.109 159.703h39.9219l-58.6094 58.5938c-2.22949 10.7744 -4.51758 28.4355 -5.10938 39.4219
c-0.109375 2.87891 -0.199219 7.55469 -0.199219 10.4365c0 5.40234 0.313477 14.1592 0.699219 19.5479h47.2188l-41.3906 41.375c12.4873 56.2656 60.8574 128.877 107.969 162.078c2.29785 1.64453 6.45605 2.98828 9.28125 3
c4.78613 -0.0263672 10.835 -3.27441 13.5 -7.25c1.54883 -2.25977 2.80566 -6.31836 2.80566 -9.05762c0 -1.72949 -0.529297 -4.43359 -1.18066 -6.03613c-5.43359 -13.626 -9.84375 -36.5908 -9.84375 -51.2598v-0.00585938
c0 -45.1094 21.0469 -86.5781 57.7188 -113.734c3.70312 -2.69531 6.70801 -8.59863 6.70801 -13.1787c0 -4.05469 -2.46582 -9.52637 -5.50488 -12.2119c-26.5469 -23.9844 -41.1719 -56.5 -41.1719 -91.5781c0 -60.0312 42.9531 -110.281 99.8906 -121.922l2.5 65.2656
l-27.1562 -18.4844c-1.13477 -0.728516 -3.15234 -1.31934 -4.50098 -1.31934c-1.73242 0 -4.19629 0.926758 -5.49902 2.06934c-1.38965 1.31152 -2.5166 3.92578 -2.5166 5.83691c0 1.2168 0.504883 3.05469 1.12598 4.10059l20.125 33.7656l-42.0625 8.73438
c-3.52734 0.720703 -6.39062 4.22754 -6.39062 7.82812s2.86328 7.10742 6.39062 7.82812l42.0625 8.71875l-20.1094 33.7344c-0.632812 1.05078 -1.14648 2.89844 -1.14648 4.12598c0 4.41113 3.58008 7.99121 7.99121 7.99121
c1.36523 0 3.38867 -0.626953 4.51465 -1.39844l30.3906 -20.6562l11.5166 287.969c0.15918 4.23535 3.72754 7.67188 7.96484 7.67188h0.0351562h0.046875c4.22266 -0.0322266 7.78516 -3.4834 7.95312 -7.70312l11.5312 -287.922l30.3906 20.6719
c1.12402 0.75 3.13477 1.35938 4.48633 1.35938c1.75781 0 4.22754 -0.972656 5.51367 -2.17188c1.38672 -1.30762 2.5127 -3.91504 2.5127 -5.82129c0 -1.21191 -0.50293 -3.04199 -1.12207 -4.08496l-20.1406 -33.7656l42.0781 -8.73438
c3.51855 -0.727539 6.375 -4.23438 6.375 -7.82812s-2.85645 -7.10059 -6.375 -7.82812l-42.0781 -8.71875l20.1094 -33.7344c0.637695 -1.05273 1.15625 -2.90625 1.15625 -4.13672c0 -1.8916 -1.11328 -4.48242 -2.48438 -5.78516
c-1.30176 -1.1748 -3.78125 -2.12891 -5.53418 -2.12891c-1.35059 0 -3.36523 0.59668 -4.49707 1.33203l-27.1719 18.4688l2.5 -65.3438c48.4844 9.40625 87.5781 48.1562 97.3125 96.5c1.41602 6.84082 2.56641 18.0625 2.56641 25.0488
c0 30.4727 -18.4258 71.7021 -41.1289 92.0293c-3.04688 2.6875 -5.52051 8.16602 -5.52051 12.2285c0 4.58691 3.0127 10.498 6.72363 13.1934c36.6562 27.1719 57.6875 68.6094 57.6875 113.734v0.0839844c0 14.6631 -4.41699 37.6133 -9.85938 51.2285
c-0.658203 1.60645 -1.19238 4.31934 -1.19238 6.05566c0 2.73438 1.25488 6.7832 2.80176 9.03809c2.66895 3.96875 8.7168 7.20996 13.5 7.23438c2.81445 -0.0107422 6.95898 -1.34863 9.25 -2.98438c47.0215 -33.3271 95.3633 -106.028 107.906 -162.281l-41.25 -41.2344
h46.9531c0.359375 -5.76562 1.04688 -11.4531 1.04688 -17.2656c-0.0273438 -14.4502 -2.32324 -37.6836 -5.125 -51.8594l-58.8906 -58.875h39.9688z" />
    <glyph glyph-name="journal-whills" unicode="&#xf66a;" horiz-adv-x="448" 
d="M438.406 70.4062c-3.20312 -12.8125 -3.20312 -57.6094 0 -73.6094c6.39062 -6.39062 9.58887 -12.792 9.59375 -19.2031v-16c0 -16 -12.7969 -25.5938 -25.5938 -25.5938h-326.406c-54.4062 0 -96 41.5938 -96 96v320c0 54.4062 41.5938 96 96 96h326.406
c16 0 25.5938 -9.59375 25.5938 -25.5938v-332.812c0 -9.59375 -3.19824 -15.9893 -9.59375 -19.1875zM380.797 64h-284.797c-16 0 -32 -12.7969 -32 -32s12.7969 -32 32 -32h284.797v64zM128.016 271.984c0 -0.515625 0.140625 -0.984375 0.140625 -1.5l37.1094 -32.4688
c1.50488 -1.31934 2.72656 -4.01465 2.72656 -6.01562c0 -4.41211 -3.58008 -7.99609 -7.99219 -8h-0.015625c-1.625 0.0820312 -3.97656 0.97168 -5.25 1.98438l-23.5938 20.6406c11.5469 -49.5781 55.7656 -86.625 108.859 -86.625s97.3125 37.0469 108.875 86.625
l-23.5938 -20.6406c-1.25 -1.08691 -3.60938 -1.96875 -5.26562 -1.96875v0h-0.015625c-1.9502 0.108398 -4.64551 1.32617 -6.01562 2.71875c-1.01074 1.27832 -1.89941 3.6377 -1.98438 5.26562c0.107422 1.9541 1.33203 4.64941 2.73438 6.01562l37.1094 32.4688
c0.015625 0.53125 0.15625 1 0.15625 1.51562c0 11.0469 -2.09375 21.5156 -5.0625 31.5938l-21.2656 -21.25c-1.29492 -1.2959 -3.83105 -2.34766 -5.66309 -2.34766c-4.41895 0 -8.00488 3.58594 -8.00488 8.00488c0 1.82812 1.04883 4.36133 2.33984 5.65527
l26.4219 26.4062c-8.47949 17.6582 -29.249 39.7295 -46.3594 49.2656c5.2959 -8.46484 9.59375 -23.4395 9.59375 -33.4248c0 -16.7217 -10.5977 -38.7705 -23.6562 -49.2158c8.64258 -8.95605 15.6562 -26.3262 15.6562 -38.7725
c0 -25.0283 -19.8799 -49.5117 -44.375 -54.6494l-1.42188 34.2812l12.6719 -8.625c0.557617 -0.379883 1.55762 -0.6875 2.23242 -0.6875h0.0175781h0.0253906c2.19727 0 3.98145 1.7832 3.98145 3.98047c0 0.609375 -0.254883 1.52832 -0.569336 2.05078l-8.53125 14.3125
l17.9062 3.71875c1.75977 0.367188 3.1875 2.12402 3.1875 3.92188s-1.42773 3.55469 -3.1875 3.92188l-17.9062 3.71875l8.53125 14.3125c0.314453 0.522461 0.569336 1.44141 0.569336 2.05078c0 2.19727 -1.78418 3.98047 -3.98145 3.98047h-0.0253906
c-0.668945 -0.0263672 -1.67676 -0.327148 -2.25 -0.671875l-14.1875 -9.65625l-4.6875 112.297c-0.0927734 2.11328 -1.88477 3.82812 -4 3.82812s-3.90723 -1.71484 -4 -3.82812l-4.625 -110.812l-12 8.15625c-0.561523 0.380859 -1.56836 0.69043 -2.24707 0.69043
c-2.20996 0 -4.00293 -1.79297 -4.00293 -4.00293c0 -0.607422 0.251953 -1.52441 0.5625 -2.04688l8.53125 -14.3125l-17.9062 -3.71875c-1.75977 -0.364258 -3.1875 -2.11719 -3.1875 -3.91406s1.42773 -3.5498 3.1875 -3.91406l17.9062 -3.73438l-8.53125 -14.2969
c-0.285156 -0.529297 -0.537109 -1.44629 -0.5625 -2.04688c0.0507812 -0.928711 0.611328 -2.23047 1.25 -2.90625c0.639648 -0.603516 1.87109 -1.09277 2.75 -1.09375c0.677734 0.00292969 1.68555 0.311523 2.25 0.6875l10.3594 7.04688l-1.35938 -32.7188
c-24.4951 5.14746 -44.375 29.6396 -44.375 54.6699c0 12.4482 7.01367 29.8232 15.6562 38.7832c-13.0586 10.4434 -23.6562 32.4893 -23.6562 49.21c0 9.99316 4.30469 24.9775 9.60938 33.4463c-17.1104 -9.53906 -37.8867 -31.6104 -46.375 -49.2656l26.4219 -26.4219
c1.28516 -1.29199 2.3291 -3.81934 2.3291 -5.64258c0 -4.41504 -3.58398 -7.99902 -7.99902 -7.99902c-1.82324 0 -4.35059 1.04395 -5.64258 2.3291l-21.2656 21.2656c-2.98438 -10.0938 -5.07812 -20.5625 -5.0625 -31.625z" />
    <glyph glyph-name="kaaba" unicode="&#xf66b;" horiz-adv-x="576" 
d="M554.12 364.49c13.0703 -4.36035 21.8799 -16.5898 21.8799 -30.3604v-49.0098l-265 79.5098c-15.0596 4.5 -30.9502 4.5 -45.9805 0l-265.02 -79.5098v49.0098c0.000976562 12.7314 9.80273 26.332 21.8799 30.3604l235.771 78.5801
c8.15723 2.71973 21.7559 4.92676 30.3545 4.92676s22.1982 -2.20703 30.3555 -4.92676zM274.22 333.97c9 2.7207 18.5498 2.7207 27.5898 0l274.2 -82.2598v-228.39c0 -15 -10.4199 -27.9902 -25.0596 -31.2402l-242.12 -53.7998
c-5.67871 -1.2627 -15.0078 -2.28809 -20.8252 -2.28809s-15.1465 1.02539 -20.8252 2.28809l-242.12 53.7998c-14.6396 3.25977 -25.0596 16.2402 -25.0596 31.2402v228.38zM128 217.89v16.5801c0 5.28027 -5.01953 9.11035 -10.1104 7.7207l-80 -21.8203
c-3.47949 -0.950195 -5.88965 -4.11035 -5.88965 -7.71973v-16.5801c0 -5.27051 5.01953 -9.10059 10.1104 -7.7207l80 21.8203c3.47949 0.950195 5.88965 4.11035 5.88965 7.71973zM272 257.17v16.5801c0 5.28027 -5.01953 9.11035 -10.1104 7.71973l-96 -26.1797
c-3.47949 -0.950195 -5.88965 -4.11035 -5.88965 -7.71973v-16.5801c0 -5.28027 5.01953 -9.11035 10.1104 -7.7207l96 26.1807c3.47949 0.950195 5.88965 4.10938 5.88965 7.71973zM448 234.47v-16.5801v-0.00488281c0 -3.37109 2.63867 -6.82715 5.88965 -7.71484
l80 -21.8203c5.09082 -1.38965 10.1104 2.44043 10.1104 7.7207v16.5801c0 3.60938 -2.41016 6.76953 -5.88965 7.71973l-80 21.8203c-5.09082 1.38965 -10.1104 -2.44043 -10.1104 -7.7207zM304 273.74v-16.5801v-0.00585938c0 -3.37012 2.63867 -6.82617 5.88965 -7.71387
l96 -26.1807c5.09082 -1.38965 10.1104 2.44043 10.1104 7.7207v16.5791c0 3.61035 -2.41016 6.77051 -5.88965 7.7207l-96 26.1797c-5.09082 1.38965 -10.1104 -2.44043 -10.1104 -7.71973z" />
    <glyph glyph-name="khanda" unicode="&#xf66d;" 
d="M415.81 382c73.71 -40.2402 111.78 -123.85 90.1602 -207.51c-7.25 -28.0898 -22.3799 -53.5703 -41.25 -75.5898l-52.5098 -61.3105c-4.87012 -5.67969 -13.04 -7.22949 -19.6504 -3.70996l-79.3496 42.2305l-29.21 -20.3408l47.0801 -32.7793
c1.66992 0.370117 3.22949 1.00977 5.00977 1.00977c13.25 0 23.9902 -10.7402 23.9902 -24c0 -13.25 -10.7402 -24 -23.9902 -24c-12.0898 0 -21.6797 9.11035 -23.3301 20.7598l-40.9102 28.4805v-30.1504c9.38086 -5.58008 15.9902 -15.3896 15.9902 -27.0996
c0 -17.6699 -14.3203 -32 -31.9795 -32c-17.6602 0 -31.9805 14.3301 -31.9805 32c0 11.7197 6.60059 21.5293 15.9902 27.0996v29.9502l-40.6299 -28.2803c-1.64062 -11.6494 -11.2305 -20.7598 -23.3301 -20.7598c-13.25 0 -23.9902 10.75 -23.9902 24
c0 13.2598 10.7402 24 23.9902 24c1.78027 0 3.33984 -0.639648 5.00977 -1.00977l47.0801 32.7793l-29.21 20.3301l-79.3496 -42.2295c-6.61035 -3.52051 -14.7803 -1.96973 -19.6504 3.71973l-55.9697 65.3604c-12.5703 14.6797 -23.3906 31.0693 -30.46 49.0596
c-35.6602 90.6904 2.95996 186.391 81.4893 229.24c6.34082 3.5 15.0205 2.63965 20.0205 -2.7002c4.99023 -5.30957 6.45996 -12.9199 2.58984 -19.0801c-16.4902 -26.1602 -25.2002 -56.3896 -25.2002 -87.4697c0.180664 -53.1904 26.7598 -102.62 71.0303 -132.18
l76.5898 -53.3301v19.8994l-44.0498 36.0908c-3.91016 4.20996 -5 10.0996 -2.81055 15.2793l7.85059 17.2402c-33.8506 19.2598 -56.9404 55.2402 -56.9404 96.9902c0 40.79 22.0205 76.1396 54.5898 95.7197l-5.21973 11.4404
c-2.33008 5.5293 -0.929688 11.8301 3.57031 16.04l58.9902 52.8096l58.9893 -52.8203c4.5 -4.20996 5.91016 -10.5098 3.57031 -16.04l-5.21973 -11.4395c32.5693 -19.5801 54.5898 -54.9199 54.5898 -95.71c0 -41.7402 -23.0996 -77.7305 -56.9404 -96.9902
l7.85059 -17.2402c2.18945 -5.18945 1.10938 -11.0801 -2.81055 -15.2793l-44.0498 -36.0908v-20.0996l76.6299 53.3496c44.5 29.7207 71.0801 79.1602 71.2705 132.41c0 31.0205 -8.70996 61.25 -25.2002 87.4102c-1.36328 2.15723 -2.46973 5.97949 -2.46973 8.53223
c0 3.51465 1.96191 8.43652 4.37988 10.9883c4.99023 5.34961 12.9902 6.51953 19.3594 3.01953zM319.82 272c0 21.3203 -10.5801 40.1201 -26.6504 51.7695l-7.83008 -17.1797c-8.75 -24.5195 -8.75 -51.04 0 -75.5596l5.65039 -12.4102
c17.3398 11.46 28.8301 31.0801 28.8301 53.3799zM191.89 272c0 -22.2998 11.5 -41.9297 28.8408 -53.3896l5.64941 12.4092c8.75 24.5303 8.75 51.04 0 75.5605l-7.83008 17.1797c-16.0801 -11.6396 -26.6602 -30.4395 -26.6602 -51.7598z" />
    <glyph glyph-name="landmark" unicode="&#xf66f;" 
d="M501.62 355.89c6.24023 -2.33984 10.3799 -8.30957 10.3799 -14.9795v-36.9102c0 -8.83984 -7.16016 -16 -16 -16h-480c-8.83984 0 -16 7.16016 -16 16v36.9102c0 6.11914 4.65039 12.8301 10.3799 14.9795l234.39 90.0703
c2.99902 1.12598 8.03223 2.04004 11.2354 2.04004s8.23633 -0.914062 11.2354 -2.04004zM64 256h64v-160h96v160h64v-160h96v160h64v-160h16c8.83984 0 16 -7.16016 16 -16v-48h-448v48c0 8.83984 7.16016 16 16 16h16v160zM496 0c8.83984 0 16 -7.16016 16 -16v-32
c0 -8.83984 -7.16016 -16 -16 -16h-480c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h480z" />
    <glyph glyph-name="mail-bulk" unicode="&#xf674;" horiz-adv-x="576" 
d="M160 0c25.5996 0 51.2002 22.4004 64 32c64 44.7998 83.2002 60.7998 96 70.4004v-134.4c0 -17.6699 -14.3301 -32 -32 -32h-256c-17.6699 0 -32 14.3301 -32 32v134.4c12.7998 -9.60059 32 -25.6006 96 -70.4004c12.7998 -9.59961 38.4004 -32 64 -32zM288 192
c17.6699 0 32 -14.3301 32 -32v-19.2002c-25.5996 -19.2002 -22.4004 -19.2002 -115.2 -86.3994c-9.59961 -3.2002 -28.7998 -22.4004 -44.7998 -22.4004s-35.2002 19.2002 -44.7998 25.5996c-92.7998 67.2002 -89.6006 67.2002 -115.2 86.4004v16
c0 17.6699 14.3301 32 32 32h256zM544 288c17.6699 0 32 -14.3301 32 -32v-192c0 -17.6699 -14.3301 -32 -32 -32h-192v134.4l-0.290039 -0.220703c-3.12012 32.4004 -30.5 57.8203 -63.71 57.8203h-96v32c0 17.6699 14.3301 32 32 32h320zM512 160v64h-64v-64h64zM160 256
v-32h-96v192c0 17.6699 14.3301 32 32 32h320c17.6699 0 32 -14.3301 32 -32v-96h-224c-35.29 0 -64 -28.71 -64 -64z" />
    <glyph glyph-name="menorah" unicode="&#xf676;" horiz-adv-x="640" 
d="M144 320c8.83984 0 16 -7.16016 16 -16v-144h-64v144c0 8.83984 7.16016 16 16 16h32zM240 320c8.83984 0 16 -7.16016 16 -16v-144h-64v144c0 8.83984 7.16016 16 16 16h32zM432 320c8.83984 0 16 -7.16016 16 -16v-144h-64v144c0 8.83984 7.16016 16 16 16h32zM528 320
c8.83984 0 16 -7.16016 16 -16v-144h-64v144c0 8.83984 7.16016 16 16 16h32zM608 352c-17.6699 0 -32 14.3301 -32 32s32 64 32 64s32 -46.3301 32 -64s-14.3301 -32 -32 -32zM512 352c-17.6699 0 -32 14.3301 -32 32s32 64 32 64s32 -46.3301 32 -64s-14.3301 -32 -32 -32
zM416 352c-17.6699 0 -32 14.3301 -32 32s32 64 32 64s32 -46.3301 32 -64s-14.3301 -32 -32 -32zM320 352c-17.6699 0 -32 14.3301 -32 32s32 64 32 64s32 -46.3301 32 -64s-14.3301 -32 -32 -32zM224 352c-17.6699 0 -32 14.3301 -32 32s32 64 32 64s32 -46.3301 32 -64
s-14.3301 -32 -32 -32zM128 352c-17.6699 0 -32 14.3301 -32 32s32 64 32 64s32 -46.3301 32 -64s-14.3301 -32 -32 -32zM32 352c-17.6699 0 -32 14.3301 -32 32s32 64 32 64s32 -46.3301 32 -64s-14.3301 -32 -32 -32zM576 160v144c0 8.83984 7.16016 16 16 16h32
c8.83984 0 16 -7.16016 16 -16v-144c0 -53.0195 -42.9805 -96 -96 -96h-192v-64h176c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-416c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h176v64h-192c-53.0195 0 -96 42.9805 -96 96
v144c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-144c0 -17.6699 14.3301 -32 32 -32h192v176c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-176h192c17.6699 0 32 14.3301 32 32z" />
    <glyph glyph-name="mosque" unicode="&#xf678;" horiz-adv-x="640" 
d="M0 -32v320h128v-320c0 -17.6699 -14.3301 -32 -32 -32h-64c-17.6699 0 -32 14.3301 -32 32zM579.16 160h-358.32c-17.8594 17.3896 -28.8398 37.3398 -28.8398 58.9102c0 52.8594 41.79 93.79 87.9199 122.899c41.9502 26.46 80.6299 57.7705 111.96 96.2207
l8.12012 9.96973l8.12012 -9.96973c31.3301 -38.4502 70.0195 -69.75 111.96 -96.2207c46.1299 -29.1094 87.9199 -70.04 87.9199 -122.899c0 -21.5703 -10.9805 -41.5205 -28.8398 -58.9102zM608 128c17.6699 0 32 -14.3301 32 -32v-128c0 -17.6699 -14.3301 -32 -32 -32
h-32v64c0 17.6699 -14.3301 32 -32 32s-32 -14.3301 -32 -32v-64h-64v72c0 48 -48 72 -48 72s-48 -24 -48 -72v-72h-64v64c0 17.6699 -14.3301 32 -32 32s-32 -14.3301 -32 -32v-64h-32c-17.6699 0 -32 14.3301 -32 32v128c0 17.6699 14.3301 32 32 32h416zM64 448
c0 0 64 -32 64 -96v-32h-128v32c0 64 64 96 64 96z" />
    <glyph glyph-name="om" unicode="&#xf679;" 
d="M360.6 387.06l-21.5801 21.5605c-1.68848 1.68652 -3.05957 4.99316 -3.05957 7.37988s1.37109 5.69336 3.05957 7.37988l21.5703 21.5605c4.08008 4.06934 10.6797 4.06934 14.7598 0l21.5801 -21.5605c1.68945 -1.68652 3.06055 -4.99316 3.06055 -7.37988
s-1.37109 -5.69336 -3.06055 -7.37988l-21.5693 -21.5605c-1.6875 -1.68848 -4.99316 -3.05957 -7.37988 -3.05957c-2.3877 0 -5.69336 1.37109 -7.38086 3.05957zM412.11 256c55.0898 0 99.8896 -44.7998 99.8896 -99.8799v-100.12c0 -48.5303 -47.4805 -88 -96.0195 -88
c-96.0205 0 -96.0205 64 -96.0205 64v37.8701c0 7.55957 9.42969 10.8896 14.2002 5.01953c15.1494 -18.6494 42.4199 -42.8896 81.8203 -42.8896c13.2393 0 32.0098 10.7695 32.0098 24v100.12c0 19.79 -16.1006 35.8799 -35.8799 35.8799
c-9.60059 0 -18.6006 -3.73047 -25.3799 -10.5l-24.25 -24.25c-18.8701 -18.8604 -43.9502 -29.25 -70.6406 -29.25h-21.6895c11.0293 -18.9004 17.8096 -40.5801 17.8096 -64c0 -70.5801 -57.4297 -128 -128.02 -128c-118.811 0 -160.03 96 -159.94 150.81
c0.0195312 8.80078 10.2598 12.7705 14.79 5.2207c22.7998 -38.0107 49.1299 -92.0303 145.15 -92.0303c35.2998 0 64.0098 28.7002 64.0098 64s-28.71 64 -64.0098 64h-33.0303c-5.57031 0.450195 -10.6406 3.49023 -13.1699 8.5498l-16.0898 32.1699
c-5.35059 10.7002 2.42969 23.2803 14.3896 23.2803h31.9004c26.4697 0 48.0098 21.5303 48.0098 48s-21.54 48 -48.0098 48c-11.25 0 -21.8203 -3.80957 -30.2705 -10.71c-5.54004 -4.53027 -13.4795 -4.50977 -19.2002 -0.209961l-26.1494 19.6299
c-8.08984 6.08008 -8.48047 17.9697 -1.12012 24.9297c25.1094 23.7402 59.8594 34.71 96.0098 28.7803c43.1602 -7.08008 79.4199 -40.6396 89.5205 -83.1895c6.43945 -27.1201 2.80957 -53.1309 -7.73047 -75.2305h46.8398c9.60059 0 18.6006 3.73047 25.3799 10.5
l24.25 24.25c18.8701 18.8604 43.9502 29.25 70.6406 29.25zM454.29 380.73c10.5596 7.95996 25.7002 0.489258 25.7002 -12.7305v-35.5195c0 -2.36035 -0.509766 -4.71094 -1.53027 -6.83008c-2.96973 -6.30078 -21.8301 -37.6602 -101.75 -37.6602
c-78.4297 0 -117.19 69.3896 -118.8 72.3398c-3.61035 6.62988 -2.08008 14.8799 3.66016 19.7998c5.69922 4.92969 14.1201 5.16992 20.1396 0.549805c3.53027 -2.69922 87.0303 -65.0693 172.58 0.0507812z" />
    <glyph glyph-name="pastafarianism" unicode="&#xf67b;" horiz-adv-x="640" 
d="M624.54 100.33c12.4004 -4.71973 18.5996 -18.5801 13.8896 -30.9805c-4.69922 -12.4092 -18.5801 -18.6299 -30.9697 -13.8799c-8.11035 3.08984 -14.3398 0.19043 -31.3896 -11.3594c-13.5508 -9.15039 -30.8301 -20.8408 -52.4199 -20.8408
c-7.16992 0 -14.8301 1.28027 -22.9707 4.39062c-32.6602 12.4395 -39.9893 41.3301 -45.3301 62.4395c-2.20996 8.7207 -3.98926 14.4902 -5.94922 18.8701c-16.6201 -13.5996 -36.9307 -25.8701 -61.6201 -34.1602c10.0098 -37 32.2793 -90.8096 60.2197 -90.8096
c13.25 0 24 -10.75 24 -24s-10.75 -24 -24 -24c-66.7402 0 -97.0498 88.6299 -107.42 129.14c-6.69043 -0.599609 -13.4199 -1.13965 -20.5801 -1.13965s-13.8896 0.540039 -20.5801 1.13965c-10.3701 -40.5098 -40.6797 -129.14 -107.42 -129.14c-13.25 0 -24 10.75 -24 24
s10.75 24 24 24c28.0801 0 50.2998 53.7998 60.2598 90.7998c-24.6895 8.29004 -45.0195 20.5605 -61.6396 34.1699c-1.95996 -4.37988 -3.74023 -10.1494 -5.9502 -18.8701c-5.34961 -21.1094 -12.6699 -50 -45.3301 -62.4395
c-8.13965 -3.11035 -15.7998 -4.39062 -22.9697 -4.39062c-21.5898 -0.0195312 -38.8701 11.6807 -52.4199 20.8408c-17.0498 11.5498 -23.2305 14.4492 -31.3906 11.3594c-12.3594 -4.72949 -26.25 1.4707 -30.9697 13.8799
c-4.71973 12.3906 1.48047 26.25 13.8701 30.9707c32.6504 12.4697 57.3398 -4.25 75.3701 -16.4502c17.0801 -11.5303 23.2998 -14.4199 31.4102 -11.3604c8.12012 3.10059 10.8301 9.37988 15.8896 29.3799c3.33008 13.1504 7.44043 29.3203 17.9502 42.6504
c-2.24023 2.91016 -4.42969 5.78027 -6.37988 8.57031c-10.1699 -9.56055 -23.4102 -17.1104 -41.7002 -17.1104c-33.9502 0 -50.8701 25.7803 -62.0596 42.8301c-10.6006 16.1396 -15 21.1699 -21.9404 21.1699c-13.25 0 -24 10.75 -24 24s10.75 24 24 24
c33.96 0 50.8799 -25.7803 62.0596 -42.8301c10.6006 -16.1396 15 -21.1699 21.9404 -21.1699c17.1504 0 37.6797 61.5596 97.2695 101.9l-17.25 34.5c-33.46 2.09961 -60.0195 29.6191 -60.0195 63.5996c0 35.3496 28.6504 64 64 64s64 -28.6504 64 -64
c0 -13.0195 -3.94043 -25.0996 -10.5996 -35.21l18.1494 -36.2998c16.9697 4.59961 35.6006 7.50977 56.46 7.50977c20.8604 0 39.4805 -2.91016 56.46 -7.50977l18.1504 36.2998c-6.67969 10.1104 -10.6201 22.1904 -10.6201 35.21c0 35.3496 28.6504 64 64 64
s64 -28.6504 64 -64c0 -33.9805 -26.5703 -61.5 -60.0098 -63.5898l-17.25 -34.5c59.7793 -40.4805 79.9502 -101.91 97.2598 -101.91c6.94043 0 11.3398 5.03027 21.9404 21.1699c11.1895 17.0498 28.1094 42.8301 62.0596 42.8301c13.25 0 24 -10.75 24 -24
s-10.75 -24 -24 -24c-6.94043 0 -11.3496 -5.03027 -21.9404 -21.1699c-11.1895 -17.0498 -28.1094 -42.8301 -62.0596 -42.8301c-18.29 0 -31.5303 7.5498 -41.7002 17.1201c-1.9502 -2.78027 -4.13965 -5.66016 -6.37988 -8.57031
c10.5098 -13.3301 14.6201 -29.5 17.9502 -42.6494c5.05957 -20 7.76953 -26.29 15.8896 -29.3809c8.16016 -3.05957 14.3506 -0.169922 31.4102 11.3604c18.0098 12.2002 42.6699 28.9697 75.3701 16.4502zM448 400c-8.82031 0 -16 -7.17969 -16 -16s7.17969 -16 16 -16
s16 7.17969 16 16s-7.17969 16 -16 16zM192 400c-8.82031 0 -16 -7.17969 -16 -16s7.17969 -16 16 -16s16 7.17969 16 16s-7.17969 16 -16 16z" />
    <glyph glyph-name="peace" unicode="&#xf67c;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM432 192c0 90.5303 -65.7695 165.82 -152 181.03v-165.66l129.43 -103.54c14.3701 26.2002 22.5703 56.2402 22.5703 88.1699zM216 10.9697v114.46
l-89.29 -71.4395c24.7998 -21.8203 55.4297 -37.0498 89.29 -43.0205zM280 125.43v-114.449c33.8604 5.96973 64.4902 21.1992 89.29 43.0195zM216 373.03c-86.2305 -15.21 -152 -90.5 -152 -181.03c0 -31.9297 8.2002 -61.9697 22.5703 -88.1699l129.43 103.54v165.66z" />
    <glyph glyph-name="place-of-worship" unicode="&#xf67f;" horiz-adv-x="640" 
d="M620.61 81.4502c10.7031 -4.58887 19.3896 -17.7646 19.3896 -29.4102v-100.04c0 -8.83984 -7.16016 -16 -16 -16h-112v192zM0 52.04c0 11.6455 8.68652 24.8213 19.3896 29.4102l108.61 46.5498v-192h-112c-8.83984 0 -16 7.16016 -16 16v100.04zM464.46 201.32
c9.63965 -5.78027 15.54 -16.2002 15.54 -27.4404v-237.88h-96v96c0 35.3496 -28.6602 64 -64 64s-64 -28.6504 -64 -64v-96h-96v237.88c0 10.0029 6.96191 22.2959 15.54 27.4404l48.46 29.0801v114.97c0 8.49023 3.37988 16.6299 9.37988 22.6299l75.3105 75.3096
c6.23926 6.25 16.3691 6.25 22.6191 0l75.3105 -75.3096c6.00977 -6.00977 9.37988 -14.1396 9.37988 -22.6299v-114.97z" />
    <glyph glyph-name="poll" unicode="&#xf681;" horiz-adv-x="448" 
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM160 80v128c0 8.83984 -7.16016 16 -16 16h-32c-8.83984 0 -16 -7.16016 -16 -16v-128c0 -8.83984 7.16016 -16 16 -16h32
c8.83984 0 16 7.16016 16 16zM256 80v224c0 8.83984 -7.16016 16 -16 16h-32c-8.83984 0 -16 -7.16016 -16 -16v-224c0 -8.83984 7.16016 -16 16 -16h32c8.83984 0 16 7.16016 16 16zM352 80v64c0 8.83984 -7.16016 16 -16 16h-32c-8.83984 0 -16 -7.16016 -16 -16v-64
c0 -8.83984 7.16016 -16 16 -16h32c8.83984 0 16 7.16016 16 16z" />
    <glyph glyph-name="poll-h" unicode="&#xf682;" horiz-adv-x="448" 
d="M448 16c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48v-352zM112 256h128c8.83984 0 16 7.16016 16 16v32c0 8.83984 -7.16016 16 -16 16h-128c-8.83984 0 -16 -7.16016 -16 -16v-32
c0 -8.83984 7.16016 -16 16 -16zM112 160h224c8.83984 0 16 7.16016 16 16v32c0 8.83984 -7.16016 16 -16 16h-224c-8.83984 0 -16 -7.16016 -16 -16v-32c0 -8.83984 7.16016 -16 16 -16zM112 64h64c8.83984 0 16 7.16016 16 16v32c0 8.83984 -7.16016 16 -16 16h-64
c-8.83984 0 -16 -7.16016 -16 -16v-32c0 -8.83984 7.16016 -16 16 -16z" />
    <glyph glyph-name="pray" unicode="&#xf683;" horiz-adv-x="384" 
d="M256 320c-35.3496 0 -64 28.6504 -64 64s28.6504 64 64 64s64 -28.6504 64 -64s-28.6504 -64 -64 -64zM225.37 150.25l-24.1504 28.7598l-34.7998 -64.8701l109.86 -109.859c25.4893 -25.4902 5.7998 -68.2803 -28.2803 -68.2803h-208c-22.0898 0 -40 17.9102 -40 40
s17.9102 40 40 40h91.5596l-44.8096 34.8896c-42.8799 27.3799 -57.5898 80.1104 -34.1904 123.75l49.3701 92.0303c11.1201 20.6504 32.1807 34.4404 56.3701 36.9199c24.7803 2.58984 48.5605 -6.93945 64 -25.3301l38.9102 -46.3096l57.4404 47
c17.1191 13.9697 42.3398 11.4902 56.3096 -5.62012c13.9697 -17.0898 11.4697 -42.2998 -5.62012 -56.2803l-88 -72.0195c-16.9697 -13.8701 -41.9102 -11.5 -55.9697 5.21973z" />
    <glyph glyph-name="praying-hands" unicode="&#xf684;" horiz-adv-x="640" 
d="M272 256.09c17.5996 0 32 -14.3994 32 -32v-128c0 -51.8896 -34.8398 -98.0801 -84.75 -112.35l-179.19 -46.6201c-2.64941 -0.69043 -5.36914 -1.03027 -8.05957 -1.03027c-23.4805 0 -32 21.1797 -32 32v96v0.0117188c0 12.7285 9.80176 26.3203 21.8799 30.3389
l90.1201 30.04v80.2295c0 18.9805 5.55957 37.3896 16.1201 53.2305l117.26 175.899c0.169922 0.270508 0.589844 0.25 0.790039 0.480469c9.58008 13.5098 27.8496 17.8799 42.2998 9.20996c15.1602 -9.10059 20.0605 -28.75 10.9707 -43.9102l-77.75 -129.59
c-8.9707 -14.9199 -13.6904 -32 -13.6904 -49.3906v-76.5498c0 -8.83984 7.16016 -16 16 -16s16 7.16016 16 16v80c0 17.6006 14.4004 32 32 32zM618.12 94.3604c13.0703 -4.36035 21.8799 -16.5801 21.8799 -30.3506v-96c0 -10.8193 -8.51953 -32 -32 -32
c-2.67969 0 -5.40039 0.339844 -8.05957 1.03027l-179.19 46.6201c-49.9102 14.2598 -84.75 60.4502 -84.75 112.34v128c0 17.5996 14.4004 32 32 32s32 -14.4004 32 -32v-80c0 -8.83984 7.16016 -16 16 -16s16 7.16016 16 16v76.5498
c0 17.3906 -4.71973 34.4697 -13.6904 49.3906l-77.75 129.59c-9.08984 15.1602 -4.18945 34.8193 10.9707 43.9102c14.4502 8.66992 32.7197 4.2998 42.2998 -9.20996c0.200195 -0.240234 0.610352 -0.210938 0.790039 -0.480469l117.26 -175.89
c10.5605 -15.8408 16.1201 -34.25 16.1201 -53.2305v-80.2295z" />
    <glyph glyph-name="quran" unicode="&#xf687;" horiz-adv-x="448" 
d="M448 89.5996c0 -9.59961 -3.2002 -16 -9.59961 -19.1992c-3.2002 -12.8008 -3.2002 -57.6006 0 -73.6006c6.39941 -6.39941 9.59961 -12.7998 9.59961 -19.2002v-16c0 -16 -12.7998 -25.5996 -25.5996 -25.5996h-326.4c-54.4004 0 -96 41.5996 -96 96v320
c0 54.4004 41.5996 96 96 96h326.4c16 0 25.5996 -9.59961 25.5996 -25.5996v-332.801zM301.08 302.18l-11.1904 -22.6494l-24.9893 -3.62988c-2.68066 -0.390625 -3.75 -3.66992 -1.81055 -5.56055l18.0898 -17.6299l-4.26953 -24.8896
c-0.360352 -2.11035 1.30957 -3.82031 3.20996 -3.82031c0.5 0 1.01953 0.120117 1.51953 0.379883l22.3604 11.75l22.3604 -11.75c0.5 -0.259766 1.01953 -0.379883 1.51953 -0.379883c1.90039 0 3.57031 1.70996 3.20996 3.82031l-4.26953 24.8896l18.0898 17.6299
c1.92969 1.89062 0.859375 5.16992 -1.81055 5.56055l-25 3.62988l-11.1797 22.6494c-0.599609 1.20996 -1.75977 1.82031 -2.91992 1.82031s-2.32031 -0.610352 -2.91992 -1.82031zM243.19 371.19c-63.5205 0 -115.19 -51.6709 -115.19 -115.19
c0 -63.5098 51.6699 -115.19 115.18 -115.18c13.6006 0 27.1201 2.46973 40.1904 7.33984c2.67969 0.910156 4.62012 3.43945 4.62012 6.41992c0 3.63965 -2.87012 6.78027 -6.7998 6.78027c-0.650391 0 -3.10059 -0.209961 -4.13086 -0.209961
c-52.3096 0 -94.8594 42.5596 -94.8594 94.8594c0 52.3105 42.5498 94.8604 94.8594 94.8604c1.04004 0 3.45996 -0.209961 4.13086 -0.209961c0.633789 -0.237305 1.69727 -0.429688 2.375 -0.429688c3.73926 0 6.77441 3.03516 6.77441 6.77441
c0 3.7373 -3.03223 6.77246 -6.76953 6.77539c-13.1201 4.91992 -26.71 7.41016 -40.3799 7.41016zM380.8 0v64h-284.8c-16 0 -32 -12.7998 -32 -32s12.7998 -32 32 -32h284.8z" />
    <glyph glyph-name="search-dollar" unicode="&#xf688;" 
d="M505.04 5.33984c9.2998 -9.39941 9.2998 -24.5898 -0.0996094 -33.9902l-28.3008 -28.2998c-9.2998 -9.39941 -24.5 -9.39941 -33.8994 0l-99.71 99.6904c-4.5 4.5 -7 10.5996 -7 17v16.2998c-35.2998 -27.5996 -79.71 -44 -128.011 -44
c-114.909 0 -208.02 93.0898 -208.02 207.979c0 114.891 93.1201 207.98 208.02 207.98c114.9 0 208.011 -93.0898 208.011 -207.98c0 -48.2998 -16.4004 -92.6895 -44 -127.989h16.2998c6.40039 0 12.5 -2.5 17 -7zM208.02 96.04c79.6504 0 144 64.4502 144 143.979
c0 79.6406 -64.46 143.98 -144 143.98c-79.6494 0 -144 -64.4502 -144 -143.98c0 -79.6396 64.4609 -143.979 144 -143.979zM235.13 248.58c18.6006 -5.58008 31.5898 -23.4199 31.5898 -43.3896c0 -24.5303 -19.0498 -44.4404 -42.6797 -45.0703v-16.1201
c0 -4.41992 -3.58008 -8 -8 -8h-16c-4.41992 0 -8 3.58008 -8 8v16.29c-11.29 0.580078 -22.2705 4.51953 -31.3701 11.3496c-3.90039 2.93066 -4.09961 8.77051 -0.570312 12.1406l11.75 11.21c2.77051 2.63965 6.89062 2.75977 10.1309 0.729492
c3.85938 -2.42969 8.25977 -3.71973 12.8193 -3.71973h28.1006c6.5 0 11.7998 5.91992 11.7998 13.1904c0 5.94922 -3.61035 11.1797 -8.77051 12.7295l-45.0098 13.5c-18.5898 5.58008 -31.5801 23.4199 -31.5801 43.3896c0 24.5205 19.0498 44.4404 42.6797 45.0703
v16.1201c0 4.41992 3.58008 8 8 8h16c4.4209 0 8 -3.58008 8 -8v-16.29c11.29 -0.580078 22.2705 -4.51953 31.3701 -11.3496c3.90039 -2.93066 4.10059 -8.77051 0.570312 -12.1406l-11.75 -11.21c-2.76953 -2.63965 -6.88965 -2.75977 -10.1299 -0.729492
c-3.86035 2.42969 -8.25977 3.71973 -12.8203 3.71973h-28.1094c-6.5 0 -11.8008 -5.91992 -11.8008 -13.1904c0 -5.94922 3.61035 -11.1797 8.77051 -12.7295z" />
    <glyph glyph-name="search-location" unicode="&#xf689;" 
d="M505.04 5.33984c9.2998 -9.39941 9.2998 -24.5898 -0.0996094 -33.9902l-28.3008 -28.2998c-9.2998 -9.39941 -24.5 -9.39941 -33.8994 0l-99.71 99.6904c-4.5 4.5 -7 10.5996 -7 17v16.2998c-35.2998 -27.5996 -79.71 -44 -128.011 -44
c-114.909 0 -208.02 93.0898 -208.02 207.979c0 114.891 93.1201 207.98 208.02 207.98c114.9 0 208.011 -93.0898 208.011 -207.98c0 -48.2998 -16.4004 -92.6895 -44 -127.989h16.2998c6.40039 0 12.5 -2.5 17 -7zM208.02 96.04c79.6504 0 144 64.4502 144 143.979
c0 79.6406 -64.46 143.98 -144 143.98c-79.6494 0 -144 -64.4502 -144 -143.98c0 -79.6396 64.4609 -143.979 144 -143.979zM208.04 336c40.7803 0 73.8398 -33.0498 73.8398 -73.8301c0 -32.9697 -48.2598 -93.0498 -66.75 -114.86
c-1.5293 -1.8291 -4.70508 -3.31445 -7.08984 -3.31445s-5.56055 1.48535 -7.08984 3.31445c-18.4902 21.8105 -66.75 81.9004 -66.75 114.86c0 40.7803 33.0596 73.8301 73.8398 73.8301zM208.04 240c13.25 0 24 10.75 24 24c0 13.2598 -10.75 24 -24 24
s-24 -10.7402 -24 -24c0 -13.25 10.7402 -24 24 -24z" />
    <glyph glyph-name="socks" unicode="&#xf696;" 
d="M214.66 136.99c-52.7402 -39.5605 -69.0498 -110.021 -39.2002 -165.4l-21.8604 -16.3896c-17.2695 -12.9502 -37.4893 -19.2002 -57.5195 -19.2002c-32.8105 0 -65.6904 16.75 -83.9404 48.3301c-24.6494 42.6396 -10.1895 97.5 29.21 127.06l86.6504 64.6104v176h160
v-160zM288 416v-32h-160v32c0 17.6699 14.3301 32 32 32h128c2.84961 0 5.40039 -0.919922 8.01953 -1.62012c-4.94922 -9.08008 -8.01953 -19.3301 -8.01953 -30.3799zM480 448c17.6699 0 32 -14.3301 32 -32v-32h-192v32c0 17.6699 14.3301 32 32 32h128zM320 176v176h192
v-208v-0.00195312c0 -35.3271 -22.9375 -81.2021 -51.2002 -102.398l-115.2 -86.3994c-17.2695 -12.9502 -37.4893 -19.2002 -57.5195 -19.2002c-32.8105 0 -65.1699 16.75 -83.4199 48.3301c-24.6504 42.6396 -10.1904 97.5 29.21 127.06z" />
    <glyph glyph-name="square-root-alt" unicode="&#xf698;" horiz-adv-x="576" 
d="M571.31 196.69c6.25 -6.25 6.25 -16.3809 0 -22.6309l-46.0596 -46.0596l46.0596 -46.0596c6.25 -6.25 6.25 -16.3809 0 -22.6309l-22.6191 -22.6191c-6.25 -6.25 -16.3809 -6.25 -22.6309 0l-46.0596 46.0596l-46.0596 -46.0596c-6.25 -6.25 -16.3809 -6.25 -22.6309 0
l-22.6191 22.6191c-6.25 6.25 -6.25 16.3809 0 22.6309l46.0596 46.0596l-46.0596 46.0596c-6.25 6.25 -6.25 16.3809 0 22.6309l22.6191 22.6191c6.25 6.25 16.3809 6.25 22.6309 0l46.0596 -46.0596l46.0596 46.0596c6.25 6.25 16.3809 6.25 22.6309 0zM552 448
c13.25 0 24 -10.7402 24 -24v-48c0 -13.25 -10.75 -24 -24 -24h-194.97l-97.8105 -374.52c-9.83984 -32.4805 -37.0098 -41.4805 -54.2793 -41.4805c-18.6406 0 -35.9502 8.5 -48.4404 28.2695l-88.8799 163.73h-43.6201c-13.25 0 -24 10.75 -24 24v48
c0 13.2598 10.75 24 24 24h81.4697c10.4385 -0.00292969 22.9961 -7.42578 28.0303 -16.5703l58.4102 -106.1l84.79 322.8c3.68945 14.0703 16.4102 23.8701 30.9502 23.8701h244.35z" />
    <glyph glyph-name="star-and-crescent" unicode="&#xf699;" 
d="M340.47 -18.3604c8.74023 0 15.1299 -6.96973 15.1299 -15.0596c0 -6.62012 -4.31934 -12.2402 -10.2793 -14.2598c-29.04 -10.8301 -59.0898 -16.3203 -89.3203 -16.3203c-141.16 0 -256 114.84 -256 256s114.84 256 256 256c30.3896 0 60.5801 -5.54004 89.75 -16.4805
c6.91992 -2.59961 10.9297 -9.83984 9.46973 -17.0898c-1.41992 -7.04004 -7.62012 -12.0693 -14.75 -12.0693c-1.47949 0 -6.85938 0.459961 -9.17969 0.459961c-116.25 0 -210.82 -94.5703 -210.82 -210.82s94.5703 -210.82 210.82 -210.82
c2.29004 0 7.72949 0.459961 9.17969 0.459961zM503.46 234.14c8.16992 -1.17969 11.4297 -11.2197 5.52051 -16.9893l-55.2705 -53.8701l13.0498 -76.0703c1.11035 -6.42969 -4.00977 -11.6602 -9.80957 -11.6602c-1.53027 0 -3.11035 0.370117 -4.64062 1.16992
l-68.3096 35.9102l-68.3301 -35.9102c-1.53027 -0.80957 -3.11035 -1.16992 -4.63965 -1.16992c-5.7998 0 -10.9199 5.21973 -9.81055 11.6602l13.0498 76.0703l-55.2695 53.8701c-5.91016 5.76953 -2.65039 15.8096 5.51953 16.9893l76.3809 11.1006l34.1592 69.21
c1.83008 3.7002 5.38086 5.5498 8.93066 5.5498s7.09961 -1.84961 8.92969 -5.5498l34.1602 -69.21z" />
    <glyph glyph-name="star-of-david" unicode="&#xf69a;" horiz-adv-x="464" 
d="M405.68 192l53.2207 -89.3896c14.4092 -24.21 -3.41016 -54.6104 -32.0107 -54.6104h-106.93l-55.9502 -93.9805c-7.14941 -12.0098 -19.5801 -18.0195 -32.0098 -18.0195s-24.8604 6.00977 -32.0098 18.0195l-55.9502 93.9805h-106.93
c-28.6006 0 -46.4199 30.4004 -32.0107 54.6104l53.2207 89.3896l-53.2207 89.3896c-14.4092 24.21 3.41016 54.6104 32.0107 54.6104h106.93l55.9502 93.9805c7.14941 12.0098 19.5801 18.0195 32.0098 18.0195s24.8604 -6.00977 32.0098 -18.0195l55.9502 -93.9805h106.92
c28.6006 0 46.4199 -30.4004 32.0098 -54.6104zM392.9 280h-39.6006l19.7998 -33.2598zM340.51 192l-52.3896 88h-112.25l-52.3799 -88l52.3896 -88h112.24zM232 374.28l-22.7803 -38.2803h45.5703zM71.0996 280l19.8008 -33.2598l19.7998 33.2598h-39.6006zM71.0996 104
h39.6006l-19.7998 33.2598zM232 9.71973l22.7803 38.2803h-45.5703zM353.29 104h39.6104l-19.8105 33.2598z" />
    <glyph glyph-name="synagogue" unicode="&#xf69b;" horiz-adv-x="640" 
d="M70 251.49c5.30957 6.00977 14.6904 6.00977 20 0l38 -43.0703v-272.42h-128v226.07v0.00683594c0 5.5625 2.98828 13.4629 6.66992 17.6328zM633.33 179.71c4.2998 -4.87012 6.66992 -11.1396 6.66992 -17.6396v-226.07h-128v272.42l38 43.0703
c5.30957 6.01953 14.6904 6.01953 20 0zM339.99 440.99l128 -102.4c7.58984 -6.07031 12.0098 -15.2695 12.0098 -24.9902v-377.6h-96v96c0 38.8701 -34.6602 69.6504 -74.75 63.1201c-31.4697 -5.12012 -53.25 -34.6699 -53.25 -66.5498v-92.5703h-96v377.6
c0 8.49023 5.38086 19.6865 12.0098 24.9902l128 102.4c11.6904 9.34961 28.29 9.34961 39.9805 0zM392.06 225.44l-19.1895 30.5596l19.2002 30.5703c1.97949 3.14941 -0.290039 7.23926 -4 7.23926h-38.9502l-25.1201 39.9805c-1.84961 2.9502 -6.15039 2.9502 -8 0
l-25.1201 -40h-38.9395c-3.70996 0 -5.98047 -4.08984 -4 -7.24023l19.1992 -30.5596l-19.1992 -30.5605c-1.98047 -3.14941 0.279297 -7.23926 4 -7.23926h38.9395l25.1201 -39.9805c1.84961 -2.9502 6.15039 -2.9502 8 0l25.1201 39.9902h38.9395
c3.70996 0 5.98047 4.08984 4 7.24023z" />
    <glyph glyph-name="torah" unicode="&#xf6a0;" horiz-adv-x="640" 
d="M320.05 81.5195l-17.7402 29.6406h35.46zM419.26 247.52l-18.3994 -30.8193l-18.46 30.8193h36.8594zM48 448c26.5098 0 48 -14.3301 48 -32v-448c0 -17.6699 -21.4902 -32 -48 -32s-48 14.3301 -48 32v448c0 17.6699 21.4902 32 48 32zM220.74 136.5l18.3896 30.8203
l18.46 -30.8203h-36.8496zM382.45 136.5l18.4102 30.7998l18.4492 -30.7998h-36.8594zM128 -16v416h384v-416h-384zM194.77 262.13c-1.53711 -2.65625 -2.78516 -7.30176 -2.78516 -10.3711c0 -3.20312 1.35059 -8.02246 3.01562 -10.7588l29.3604 -49l-29.21 -48.8398
c-1.6709 -2.77344 -3.02637 -7.65234 -3.02637 -10.8906c0 -11.6523 9.45703 -21.1094 21.1104 -21.1094h0.015625h59.5l29.25 -48.8799c3.33105 -5.6416 11.3516 -10.2207 17.9023 -10.2207h0.0976562c6.64844 0.0136719 14.7842 4.67285 18.1602 10.4004l29.1299 48.7002
h59.4697h0.0224609c6.8125 0 15.082 4.80273 18.458 10.7197c1.53418 2.65332 2.7793 7.29297 2.7793 10.3584c0 3.2041 -1.35254 8.02539 -3.01953 10.7617l-29.3701 49l29.2402 48.8496c1.66602 2.77246 3.01758 7.64648 3.01758 10.8809
c0 11.6562 -9.46094 21.1182 -21.1182 21.1191h-59.5195l-29.25 48.8604c-3.3252 5.63574 -11.3359 10.21 -17.8799 10.21h-0.0703125h-0.0341797c-6.65137 0 -14.7988 -4.64551 -18.1855 -10.3701l-29.1299 -48.71h-59.4502h-0.0458984
c-6.80469 0 -15.0635 -4.79785 -18.4346 -10.71zM592 448c26.5098 0 48 -14.3301 48 -32v-448c0 -17.6699 -21.4902 -32 -48 -32s-48 14.3301 -48 32v448c0 17.6699 21.4902 32 48 32zM320 302.47l17.6797 -29.6201h-35.46zM257.55 247.47l-18.3701 -30.7998
l-18.4395 30.7998h36.8096zM287.13 136.47l-33.2295 55.5303l33.1699 55.5195h65.79l33.2295 -55.5195l-33.1699 -55.5303h-65.79z" />
    <glyph glyph-name="torii-gate" unicode="&#xf6a1;" 
d="M376.45 416c39.4961 0.00195312 100.223 14.3389 135.55 32v-96c0 -17.6699 -14.3301 -32 -32 -32h-32v-64h48c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-48v-240c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v240
h-256v-240c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v240h-48c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h48v64h-32c-17.6699 0 -32 14.3301 -32 32v96c35.3271 -17.6611 96.0537 -31.998 135.55 -32h240.9zM128 320v-64h96
v64h-96zM384 256v64h-96v-64h96z" />
    <glyph glyph-name="vihara" unicode="&#xf6a7;" horiz-adv-x="640" 
d="M632.88 47.29c5.41992 -3.61035 7.7002 -9.62012 6.99023 -15.29c-0.620117 -5.00977 -3.56055 -9.75 -8.71973 -12.3301l-55.1504 -19.6699v-48c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v48h-160v-48c0 -8.83984 -7.16016 -16 -16 -16h-32
c-8.83984 0 -16 7.16016 -16 16v48h-160v-48c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v48l-55.1602 19.6699c-5.14941 2.58008 -8.09961 7.32031 -8.71973 12.3301c-0.700195 5.66016 1.58008 11.6699 7 15.29l88.8799 48.71v64
l-55.1602 17.6904c-11.79 5.89941 -11.79 22.7197 0 28.6191l119.16 49.6904v64l-27.3096 16.3096c-7.7207 7.7207 -5.61035 20.7402 4.15918 25.6201l183.15 86.0703l183.15 -86.0801c9.76953 -4.87988 11.8799 -17.9004 4.15918 -25.6201l-27.3096 -16.2998v-64
l119.16 -49.6904c11.79 -5.89941 11.79 -22.7197 0 -28.6191l-55.1602 -17.6904v-64zM224 320v-64h192v64h-192zM160 96h320v64h-320v-64z" />
    <glyph glyph-name="volume-mute" unicode="&#xf6a9;" 
d="M215.03 376.95c15.0098 15.0098 40.9697 4.49023 40.9697 -16.9697v-335.961c0 -21.4395 -25.9404 -32 -40.9697 -16.9697l-88.9707 88.9502h-102.06c-13.2598 0 -24 10.75 -24 24v144c0 13.2598 10.7402 24 24 24h102.06zM461.64 192l45.6406 -45.6396
c6.2998 -6.30078 6.2998 -16.5205 0 -22.8203l-22.8203 -22.8203c-6.2998 -6.2998 -16.5195 -6.2998 -22.8203 0l-45.6396 45.6406l-45.6299 -45.6299c-6.2998 -6.30078 -16.5205 -6.30078 -22.8203 0l-22.8193 22.8193c-6.30078 6.2998 -6.30078 16.5205 0 22.8203
l45.6299 45.6299l-45.6406 45.6396c-6.2998 6.30078 -6.2998 16.5205 0 22.8203l22.8203 22.8203c6.2998 6.2998 16.5195 6.2998 22.8203 0l45.6396 -45.6406l45.6396 45.6406c6.30078 6.2998 16.5205 6.2998 22.8203 0l22.8203 -22.8203
c6.2998 -6.2998 6.2998 -16.5195 0 -22.8203z" />
    <glyph glyph-name="yin-yang" unicode="&#xf6ad;" horiz-adv-x="496" 
d="M248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM248 64c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM248 192c53.0195 0 96 42.9805 96 96s-42.9805 96 -96 96
c-106.04 0 -192 -85.96 -192 -192s85.96 -192 192 -192c-53.0195 0 -96 42.9805 -96 96s42.9805 96 96 96zM248 320c17.6699 0 32 -14.3301 32 -32s-14.3301 -32 -32 -32s-32 14.3301 -32 32s14.3301 32 32 32z" />
    <glyph glyph-name="blender-phone" unicode="&#xf6b6;" horiz-adv-x="576" 
d="M392 384c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h157.82l-17.46 -64h-140.36c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h131.64l-17.46 -64h-114.18c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h105.46
l-17.46 -64h-288v352h384l-17.46 -64h-166.54zM158.8 112.99c3.00977 -7.40039 0.200195 -15.8506 -6.68945 -20.0703l-39.4102 -24.1797c-12.5303 -7.68066 -31.7803 -6 -41.6504 4.7998c-94.0996 102.94 -94.6699 258.89 -2.09961 362.49
c11.1396 12.4697 29.5596 15.8398 43.8896 7.0498l39.2803 -24.0996c6.87988 -4.2207 9.7002 -12.6807 6.67969 -20.0703l-25.7803 -63.2598c-2.7793 -6.80078 -9.80957 -10.9902 -17.2393 -10.2607l-45.0303 4.41992c-17.6504 -47.9395 -17.2803 -100.779 0 -147.72
l45.0303 4.41992c7.43945 0.730469 14.46 -3.4502 17.2393 -10.2598zM480 64c35.3496 0 64 -28.6504 64 -64v-32c0 -17.6699 -14.3301 -32 -32 -32h-352c-17.6699 0 -32 14.3301 -32 32v32c0 35.3496 28.6504 64 64 64h288zM336 -32c17.6699 0 32 14.3301 32 32
s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="book-dead" unicode="&#xf6b7;" horiz-adv-x="448" 
d="M272 312c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16s16 -7.2002 16 -16s-7.2002 -16 -16 -16zM448 89.5996c0 -9.59961 -3.2002 -16 -9.59961 -19.1992c-3.2002 -12.8008 -3.2002 -57.6006 0 -73.6006c6.39941 -6.39941 9.59961 -12.7998 9.59961 -19.2002v-16
c0 -16 -12.7998 -25.5996 -25.5996 -25.5996h-326.4c-54.4004 0 -96 41.5996 -96 96v320c0 54.4004 41.5996 96 96 96h326.4c16 0 25.5996 -9.59961 25.5996 -25.5996v-332.801zM240 392c-44.2002 0 -80 -28.7002 -80 -64c0 -20.9004 12.7002 -39.2002 32 -50.9004v-13.0996
c0 -8.7998 7.2002 -16 16 -16h64c8.7998 0 16 7.2002 16 16v13.0996c19.2998 11.7002 32 30 32 50.9004c0 35.2998 -35.7998 64 -80 64zM124.8 224.7c-1.7002 -4.10059 0.100586 -8.7998 4.2002 -10.5l70.5 -30.2998l-70.4004 -30.1006
c-4.09961 -1.7002 -5.89941 -6.39941 -4.19922 -10.5l6.2998 -14.7002c1.7002 -4.09961 6.39941 -5.89941 10.5 -4.19922l98.2998 42.1992l98.2998 -42.0996c4.10059 -1.7002 8.7998 0.0996094 10.5 4.2002l6.2998 14.7002c1.7002 4.09961 -0.0996094 8.7998 -4.19922 10.5
l-70.3008 30.0996l70.3008 30.2002c4.09961 1.7002 5.89941 6.39941 4.19922 10.5l-6.2998 14.7002c-1.7002 4.09961 -6.39941 5.89941 -10.5 4.19922l-98.3994 -42.0996l-98.3008 42.0996c-4.09961 1.7002 -8.7998 -0.0996094 -10.5 -4.19922zM380.8 0v64h-284.8
c-16 0 -32 -12.7998 -32 -32s12.7998 -32 32 -32h284.8zM208 312c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16s16 -7.2002 16 -16s-7.2002 -16 -16 -16z" />
    <glyph glyph-name="campground" unicode="&#xf6bb;" horiz-adv-x="640" 
d="M624 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-608c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h24.6797l239.79 330.25l-53.4102 73.5498c-5.19922 7.15039 -3.60938 17.1602 3.54004 22.3506l25.8809 18.7998
c7.14941 5.18945 17.1592 3.59961 22.3496 -3.5498l41.1699 -56.7002l41.1602 56.6895c5.2002 7.16016 15.2002 8.74023 22.3496 3.55078l25.9004 -18.79c7.14941 -5.19043 8.72949 -15.2002 3.54004 -22.3506l-53.4102 -73.5498l239.78 -330.25h24.6797zM320 160
l-116.36 -160h232.721z" />
    <glyph glyph-name="cat" unicode="&#xf6be;" 
d="M290.59 256c11.8906 -58.3496 63.6006 -102.4 125.41 -102.4c11.1104 0 21.71 1.87012 32 4.54004v-206.14c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v144l-128 -96h32c17.6699 0 32 -14.3301 32 -32v-16c0 -8.83984 -7.16016 -16 -16 -16
h-176c-35.2998 0 -64 28.7002 -64 64v256c0 17.6396 -14.3604 32 -32 32c-17.6699 0 -32 14.3301 -32 32s14.3301 32 32 32c52.9404 0 96 -43.0596 96 -96v-85.9502c55.7695 83.9697 142.41 85.9502 162.59 85.9502zM448 352l64 64v-134.4c0 -53.0195 -42.9805 -96 -96 -96
s-96 42.9805 -96 96v134.4l64 -64h64zM376 272c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16s-16 -7.16016 -16 -16s7.16016 -16 16 -16zM456 272c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16s-16 -7.16016 -16 -16s7.16016 -16 16 -16z" />
    <glyph glyph-name="chair" unicode="&#xf6c0;" horiz-adv-x="448" 
d="M112 320v-128h-48v128c0 70.7002 57.2998 128 128 128h64c70.7002 0 128 -57.2998 128 -128v-128h-48v128c0 29.5 -16.2002 55 -40 68.9004v-196.9h-48v208h-48v-208h-48v196.9c-23.7998 -13.9004 -40 -39.4004 -40 -68.9004zM446.3 106.1
c6.90039 -20.6992 -8.5 -42.0996 -30.2998 -42.0996v-112c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v112h-256v-112c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v112c-21.7998 0 -37.2002 21.4004 -30.4004 42.0996l10.7002 32
c4.40039 13.1006 16.6006 21.9004 30.4004 21.9004h362.5c13.7998 0 26 -8.7998 30.3994 -21.9004z" />
    <glyph glyph-name="cloud-moon" unicode="&#xf6c3;" horiz-adv-x="576" 
d="M342.8 95.2998c40.9004 -3.5 73.2002 -37.3994 73.2002 -79.2998c0 -44.2002 -35.7998 -80 -80 -80h-240c-53 0 -96 43 -96 96c0 41.9004 27.0996 77.2002 64.5996 90.2998c-0.0996094 1.90039 -0.599609 3.7002 -0.599609 5.7002c0 53 43 96 96 96
c36.2002 0 67.4004 -20.2998 83.7002 -49.9004c11.5 11 27.0996 17.9004 44.2998 17.9004c35.2998 0 64 -28.7002 64 -64c0 -12 -3.5 -23.0996 -9.2002 -32.7002zM565.3 149.6c8.2002 1.60059 14 -8 8.7002 -14.5c-33.4004 -41.0996 -82.7002 -67 -137.1 -70.3994
c-11.1006 23.0996 -29.9004 41.7998 -53.5 52.5996c0.399414 3.5 0.599609 7.10059 0.599609 10.7002c0 52.9004 -43.0996 96 -96 96c-12.7002 0 -25 -2.5 -36.4004 -7.2002c-5.09961 5.2998 -10.7998 9.90039 -16.6992 14.2002c-1.10059 8.2002 -1.80078 16.5 -1.80078 25
c0 106.1 86 192 191.9 192c11.7002 0 23.4004 -1.09961 35.0996 -3.2002c8.2002 -1.59961 10.1006 -12.5996 2.80078 -16.7002c-47.1006 -26.7998 -76.1006 -76.5996 -76.1006 -130.8c0 -94 85.4004 -165.399 178.5 -147.7z" />
    <glyph glyph-name="cloud-sun" unicode="&#xf6c4;" horiz-adv-x="640" 
d="M575.2 122.3c37.5996 -13 64.7998 -48.2998 64.7998 -90.3994c0 -53 -43 -96 -96 -96h-272c-53 0 -96 43 -96 96c0 50.5996 39.2998 91.5996 88.9004 95.2998c-0.200195 2.89941 -0.900391 5.7002 -0.900391 8.7002c0 61.8994 50.2002 112 112 112
c45.4004 0 84.2998 -27.2002 101.9 -66c9.89941 6.19922 21.5 10 34.0996 10c35.2998 0 64 -28.7002 64 -64c0 -1.90039 -0.599609 -3.7002 -0.799805 -5.60059zM144.8 144.9c10.6006 -10.6006 22.9004 -18.6006 36 -24c-9.59961 -9.80078 -17.5 -21.1006 -23.5996 -33.5
l-76.1006 -25.3008c-11.8994 -3.89941 -23.1992 7.30078 -19.1992 19.2002l29.2998 87.7998l-82.7998 41.4004c-11.2002 5.59961 -11.2002 21.5 0 27.0996l82.7998 41.5l-29.2998 87.8008c-3.90039 11.7998 7.39941 23.0996 19.1992 19.1992l87.9004 -29.2998
l41.4004 82.7998c5.59961 11.2002 21.5996 11.2002 27.0996 0l41.5 -82.7998l87.7998 29.2998c11.9004 3.90039 23.2002 -7.2998 19.2002 -19.1992l-29.7998 -88.9004c-10.6006 -1.5 -20.9004 -3.7998 -30.7002 -7.5c-5.40039 11.7998 -12.5996 23 -22.2998 32.7002
c-43.7002 43.7002 -114.7 43.7002 -158.4 0c-43.7002 -43.6006 -43.7002 -114.601 0 -158.3zM140 224.1c0 46.3008 37.7002 83.9004 84 83.9004c34 0 63.2998 -20.4004 76.5 -49.5c-36.4004 -22.5 -62 -60.7002 -67.4004 -105
c-8.89941 -2.90039 -17.1992 -7 -25.1992 -11.7002c-38.6006 7.5 -67.9004 41.5 -67.9004 82.2998z" />
    <glyph glyph-name="dice-d20" unicode="&#xf6cf;" horiz-adv-x="480" 
d="M106.75 232.94l108.64 -190.101l-208.26 22.0703c-5.83008 0.639648 -9.00977 7.13965 -5.92969 12.1396zM7.41016 132.57c-2.12012 -3.44043 -7.41016 -1.94043 -7.41016 2.08984v162.81c0 3.11035 3.38965 5.03027 6.05957 3.43066l76.6406 -45.9805zM18.25 24.4004
c-4.03027 1.97949 -2.25 8.06934 2.2002 7.56934l203.55 -22.2998v-65.6699c0 -5.83008 -6.0498 -9.70996 -11.3496 -7.25977zM99.4697 282.18l-81.5293 48.6904c-2.52051 1.51953 -2.60059 5.16016 -0.130859 6.78027l150.811 98.6094
c7.18945 4.11035 15.1201 -4.08008 10.7803 -11.1396zM240 272h-109.21l95.5801 168.38c3.12988 5.08008 8.37988 7.62012 13.6299 7.62012s10.5 -2.54004 13.6299 -7.62012l95.5801 -168.38h-109.21zM473.94 300.9c2.66992 1.59961 6.05957 -0.320312 6.05957 -3.43066
v-162.81c0 -4.04004 -5.2998 -5.54004 -7.41016 -2.10059l-75.29 122.351zM380.53 282.18l-79.9307 142.94c-4.33984 7.05957 3.59082 15.25 10.7803 11.1396l150.811 -98.5996c2.46973 -1.62012 2.39941 -5.25977 -0.130859 -6.78027zM459.55 31.9697
c4.4502 0.5 6.23047 -5.58984 2.2002 -7.55957l-194.4 -87.6602c-5.2998 -2.4502 -11.3496 1.41992 -11.3496 7.25977v65.6699zM373.25 232.94l105.56 -155.891c3.08008 -5 -0.0996094 -11.4902 -5.92969 -12.1396l-208.26 -22.0703zM240 240h100.43l-100.43 -175.75
l-100.43 175.75h100.43z" />
    <glyph glyph-name="dice-d6" unicode="&#xf6d1;" horiz-adv-x="448" 
d="M422.19 338.05c5.3291 -3.24023 5.2998 -11.2695 -0.0507812 -14.46l-198.14 -118.14l-198.13 118.14c-5.35059 3.19043 -5.37988 11.2305 -0.0605469 14.46l165.971 100.88c19.9102 12.1006 44.5195 12.1006 64.4297 0zM436.03 293.42
c5.33008 3.17969 11.9697 -0.839844 11.9697 -7.25v-197.7c0 -23.7598 -12.1104 -45.7393 -31.79 -57.7002l-152.16 -92.4795c-10.6602 -6.48047 -24.0498 1.5498 -24.0498 14.4297v223.82zM0 286.17c0 6.41016 6.63965 10.4297 11.9697 7.25l196.03 -116.88v-223.81
c0 -12.8906 -13.3799 -20.9102 -24.0498 -14.4307l-152.16 92.4697c-19.6797 11.9609 -31.79 33.9307 -31.79 57.7002v197.7z" />
    <glyph glyph-name="dog" unicode="&#xf6d3;" horiz-adv-x="576" 
d="M298.06 224l149.94 -53.5498v-218.45c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v112h-160v-112c0 -8.83203 -7.16797 -16 -16 -16h-64c-8.83203 0 -16 7.16797 -16 16v213.91c-37.1602 13.25 -64 48.4297 -64 90.0898
c0 17.6641 14.3359 32 32 32s32 -14.3359 32 -32c0.0332031 -17.6309 14.3691 -31.9668 32 -32h170.06zM544 336v-32c0 -35.3281 -28.6719 -64 -64 -64h-32v-35.5801l-128 45.71v149.87c0 14.25 17.2197 21.3896 27.3096 11.3096l27.2803 -27.3096h53.6299
c10.9102 0 23.75 -7.91992 28.6201 -17.6904l7.16016 -14.3096h64c8.83203 0 16 -7.16797 16 -16zM432 336c0 8.83203 -7.16797 16 -16 16s-16 -7.16797 -16 -16s7.16797 -16 16 -16s16 7.16797 16 16z" />
    <glyph glyph-name="dragon" unicode="&#xf6d5;" horiz-adv-x="640" 
d="M18.3203 192.22c-15.96 -2.2793 -24.8906 17.8105 -12.5107 28.1406l117.4 116.34c21.7705 18.5996 53.2402 20.4697 77.0596 4.58984l119.73 -87.5996v-42.2705c0 -28.9102 5.29004 -56.9795 14.7305 -83.3799h-222.7c-14.25 0 -21.3906 17.2295 -11.3105 27.3096
l91.2803 68.6904zM575.19 158.12c41.9092 -20.96 67.1592 -64.0801 64.6396 -111.36c-3.37988 -63.2002 -59.7002 -110.77 -122.99 -110.76h-499.08c-9.80957 0 -17.7598 8 -17.7598 17.7998c0 8.32031 5.78027 15.5303 13.9004 17.3301
c89.54 19.9004 238.51 54.1006 434.1 60.9102c-59.9697 39.9902 -96 107.3 -96 179.38v108.62l-59.5801 24.8496c-5.90039 2.9502 -5.90039 11.3604 0 14.3105l59.5801 24.8398l-61.6396 50.3496c-5.04004 5.04004 -1.4707 13.6104 5.65918 13.6104h237.45
c10.0703 0 19.5498 -4.7002 25.6006 -12.7598l74.5293 -99.3799c3.53223 -4.71094 6.39844 -13.3115 6.39844 -19.1992c0 -4.16992 -1.51367 -10.5811 -3.37793 -14.3115l-14.3105 -28.6191c-4.88086 -9.76465 -17.7031 -17.6895 -28.6191 -17.6904h-30.9707
c-8.48926 0 -16.6299 3.37012 -22.6299 9.37012l-28.0898 22.6299h-64v-36.6904c0.00195312 -16.3701 11.8877 -35.5986 26.5303 -42.9199zM489.18 381.75c-4.33008 -17.1396 8.56055 -28.96 21.5205 -29.6699c11.6602 -0.629883 21.3799 7.34961 24.1299 18.2598z" />
    <glyph glyph-name="drumstick-bite" unicode="&#xf6d7;" 
d="M462.8 398.43c34.3203 -34.2793 50.4307 -79.5996 49.1299 -124.56c-41.9795 22.6602 -94.3594 17.5596 -128.739 -16.7998c-40.8809 -40.8398 -40.6904 -107.181 -1.05078 -151.07c-16.2383 -5.52246 -43.3389 -10.0049 -60.4912 -10.0049
c-0.385742 0 -1.0127 0.00195312 -1.39844 0.00488281h-85.8896l-40.6104 -40.5596c-9.71973 -9.75 -11.0898 -24.0205 -6 -36.75c2.38477 -5.95898 4.32031 -16.0049 4.32031 -22.4229c0 -33.3135 -27.0371 -60.3496 -60.3506 -60.3496
c-13.8428 0 -33.0039 7.96191 -42.7695 17.7725c-15.2803 15.2695 -19.6006 36.5 -15.1006 56.0996c-19.6094 -4.49023 -40.8496 -0.179688 -56.1191 15.0703c-9.77148 9.75684 -17.7021 28.8828 -17.7021 42.6914c0 33.3018 27.0273 60.3301 60.3301 60.3301
c6.40234 0 16.4248 -1.92773 22.3721 -4.30176c12.7793 -5.07031 27.0791 -3.69043 36.7793 6l40.6201 40.5898v85.8301c0 64 27.6904 107 63.1699 142.43c27.3887 27.3604 81.0371 49.5664 119.75 49.5664c38.7139 0 92.3613 -22.2061 119.75 -49.5664z" />
    <glyph glyph-name="dungeon" unicode="&#xf6d9;" 
d="M128.73 252.68c6.58984 -4.12012 8.89941 -12.2393 6.33984 -19.5801c-3 -8.60938 -5.15039 -17.6094 -6.24023 -26.9395c-0.929688 -7.91016 -7.0498 -14.1602 -15.0098 -14.1602h-97.1299c-9.10059 0 -16.7402 7.62988 -16.1504 16.7197
c1.66016 25.7793 11.7178 65.7725 22.4502 89.2705c3.93945 8.62012 14.8896 11.4697 22.9297 6.4502zM319.03 440c9.16992 -2.36035 13.9102 -12.5996 10.3896 -21.3896l-37.4697 -104.03c-2.28027 -6.34961 -8.2998 -10.5801 -15.0498 -10.5801h-41.8008
c-6.2041 0.00195312 -12.9473 4.74219 -15.0498 10.5801l-37.4697 104.03c-3.52051 8.79004 1.21973 19.04 10.3896 21.3896c20.1699 5.17969 41.2607 8 63.0303 8s42.8604 -2.82031 63.0303 -8zM112 160c8.83984 0 16 -7.16016 16 -16v-64c0 -8.83984 -7.16016 -16 -16 -16
h-96c-8.83984 0 -16 7.16016 -16 16v64c0 8.83984 7.16016 16 16 16h96zM112 32c8.83984 0 16 -7.16016 16 -16v-64c0 -8.83984 -7.16016 -16 -16 -16h-96c-8.83984 0 -16 7.16016 -16 16v64c0 8.83984 7.16016 16 16 16h96zM189.31 315.67
c2.85059 -7.12012 -0.0195312 -14.8799 -6.2998 -19.29c-6 -4.2002 -11.6094 -8.89941 -16.79 -14.0498c-5.4502 -5.41016 -13.5996 -6.86035 -20.1094 -2.79004l-82.9307 51.8301c-8.06934 5.04004 -10.2793 16.2002 -4.21973 23.5195
c16.7148 20.1758 48.7969 47.0068 71.6104 59.8906c8.29004 4.67969 18.8896 0.519531 22.4199 -8.31055zM398.18 192c-7.95996 0 -14.0801 6.25 -15.0098 14.1602c-1.08984 9.32031 -3.22949 18.3301 -6.24023 26.9395c-2.55957 7.34082 -0.25 15.46 6.33984 19.5801
l82.8105 51.7607c8.04004 5.01953 18.9902 2.16992 22.9297 -6.4502c10.7334 -23.498 20.791 -63.4902 22.4502 -89.2705c0.589844 -9.08984 -7.0498 -16.7197 -16.1504 -16.7197h-97.1299zM453.03 354.89c6.06934 -7.31934 3.84961 -18.4795 -4.2207 -23.5098
l-82.9297 -51.8301c-6.50977 -4.06934 -14.6699 -2.62012 -20.1104 2.79004c-5.17969 5.15039 -10.7891 9.85059 -16.7891 14.0498c-6.28027 4.40039 -9.15039 12.1602 -6.30078 19.2803l36.3203 90.7998c3.54004 8.83008 14.1396 12.9902 22.4199 8.31055
c22.8135 -12.8838 54.8945 -39.7148 71.6104 -59.8906zM496 160c8.83984 0 16 -7.16016 16 -16v-64c0 -8.83984 -7.16016 -16 -16 -16h-96c-8.83984 0 -16 7.16016 -16 16v64c0 8.83984 7.16016 16 16 16h96zM496 32c8.83984 0 16 -7.16016 16 -16v-64
c0 -8.83984 -7.16016 -16 -16 -16h-96c-8.83984 0 -16 7.16016 -16 16v64c0 8.83984 7.16016 16 16 16h96zM240 270.38c5.23047 0.889648 10.5195 1.62012 16 1.62012s10.7695 -0.730469 16 -1.62012v-294.38c0 -4.41992 -3.58008 -8 -8 -8h-16c-4.41992 0 -8 3.58008 -8 8
v294.38zM176 228.87c8.16016 12.2998 19.2197 22.3203 32 29.7695v-282.64c0 -4.41992 -3.58008 -8 -8 -8h-16c-4.41992 0 -8 3.58008 -8 8v252.87zM304 258.64c12.7803 -7.44922 23.8398 -17.4697 32 -29.7695v-252.87c0 -4.41992 -3.58008 -8 -8 -8h-16
c-4.41992 0 -8 3.58008 -8 8v282.64z" />
    <glyph glyph-name="file-csv" unicode="&#xf6dd;" horiz-adv-x="384" 
d="M224 312c0 -13.2002 10.7998 -24 24 -24h136v-328c0 -13.2998 -10.7002 -24 -24 -24h-336c-13.2998 0 -24 10.7002 -24 24v464c0 13.2998 10.7002 24 24 24h200v-136zM128 168v16c0 4.41992 -3.58008 8 -8 8h-8c-26.5098 0 -48 -21.4902 -48 -48v-32
c0 -26.5098 21.4902 -48 48 -48h8c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-8c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h8c4.41992 0 8 3.58008 8 8zM172.27 64c23.3906 0 42.4004 17.3301 42.3906 38.6201
c0 10.6602 -4.86035 20.9199 -13.3301 28.1396l-21.8896 18.7705c-1.37012 1.17969 -2.12012 2.54004 -2.12012 3.83984c0 3.12012 4.45996 6.62012 10.4102 6.62012h12.2695c4.41992 0 8 3.58008 8 8v16c0 4.41992 -3.58008 8 -8 8h-12.25
c-23.3896 0 -42.4102 -17.3203 -42.4102 -38.6201c0 -10.6602 4.86035 -20.9199 13.3301 -28.1396l21.8896 -18.7705c1.37012 -1.17969 2.12012 -2.54004 2.12012 -3.83984c0 -3.12012 -4.45996 -6.62012 -10.4102 -6.62012h-12.2695c-4.41992 0 -8 -3.58008 -8 -8v-16
c0 -4.41992 3.58008 -8 8 -8h12.2695zM256 184c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-20.7998c0 -35.4805 12.8799 -68.8906 36.2803 -94.0898c3.01953 -3.25 7.26953 -5.11035 11.7197 -5.11035s8.7002 1.86035 11.7197 5.11035
c23.4004 25.1992 36.2803 58.6094 36.2803 94.0898v20.7998c0 4.41992 -3.58008 8 -8 8h-16c-4.41992 0 -8 -3.58008 -8 -8v-20.7998c0 -20.2705 -5.7002 -40.1807 -16 -56.8799c-10.2998 16.71 -16 36.6094 -16 56.8799v20.7998zM377 343c4.5 -4.5 7 -10.5996 7 -16.9004
v-6.09961h-128v128h6.09961c6.40039 0 12.5 -2.5 17 -7z" />
    <glyph glyph-name="fist-raised" unicode="&#xf6de;" horiz-adv-x="384" 
d="M255.98 288h-48.0303c-5.62988 0 -10.9502 -1.15039 -15.9697 -2.92969v146.93c0 8.83984 7.15918 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-144zM383.98 192.01l0.0195312 -88.2197v-0.0107422c0 -21.9551 -12.5977 -52.373 -28.1201 -67.8994l-35.9102 -35.9199
v-63.96h-255.979v64l-26.5 26.5098c-24.0098 24.0098 -37.4902 56.5605 -37.4902 90.5098v77.9307c5.03027 -1.7998 10.3604 -2.9502 16 -2.9502h32c12.3301 0 23.4805 4.80957 32 12.4902c8.50977 -7.66992 19.6602 -12.4805 32 -12.4805h32
c7.91016 0 15.2803 2.11035 21.8701 5.52051c7.46973 -16.3301 21.5996 -28.9404 38.8701 -34.4502c-17.1104 -14.8203 -31.5801 -34.4805 -47.3105 -58.0801l-6.30957 -9.46973c-0.742188 -1.1123 -1.34375 -3.09961 -1.34375 -4.43652
c0 -2.36328 1.59668 -5.34375 3.56348 -6.65332l13.3105 -8.88086c1.11133 -0.741211 3.09863 -1.34375 4.43555 -1.34375c2.36328 0 5.34473 1.59668 6.6543 3.56445l6.30957 9.46973c31.8906 47.8398 51.5303 70.2695 96.0498 72.5498
c4.29004 0.219727 7.88086 3.70996 7.88086 8v16.2002c0 4.41992 -3.52051 8 -13.2002 8h-35.2607c-26.2695 0 -47.5693 21.3203 -47.5693 47.5898v0.560547c0 8.7793 7.12012 15.8496 15.8994 15.8496h112.141c35.3301 0 63.9795 -28.6504 63.9902 -63.9902zM351.97 282.1
c-10.0596 3.59082 -20.7197 5.90039 -32 5.90039h-32v112c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-117.9zM16 224c-8.83984 0 -16 7.16016 -16 16v128c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-128
c0 -8.83984 -7.16016 -16 -16 -16h-32zM111.99 224c-8.83984 0 -16 7.16016 -16 16v160c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-160c0 -8.83984 -7.16016 -16 -16 -16h-32z" />
    <glyph glyph-name="ghost" unicode="&#xf6e2;" horiz-adv-x="384" 
d="M186.1 447.91c108.73 3.25977 197.9 -83.9102 197.9 -191.91v-271.97c0 -14.25 -17.2305 -21.3906 -27.3096 -11.3105l-24.9209 18.5303c-6.65918 4.95996 -16 3.99023 -21.5098 -2.20996l-42.9502 -48.3496c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-40.7197 45.8496
c-6.36035 7.16992 -17.5498 7.16992 -23.9199 0l-40.7197 -45.8496c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-42.9502 48.3496c-5.50977 6.2002 -14.8506 7.16016 -21.5098 2.20996l-24.9209 -18.5303c-10.0791 -10.0801 -27.3096 -2.9502 -27.3096 11.3105v263.92
c0 105.13 81.0098 196.81 186.1 199.96zM128 224c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32zM256 224c17.6699 0 32 14.3301 32 32s-14.3301 32 -32 32s-32 -14.3301 -32 -32s14.3301 -32 32 -32z" />
    <glyph glyph-name="hammer" unicode="&#xf6e3;" horiz-adv-x="576" 
d="M571.31 254.06c6.25 -6.25 6.25 -16.3799 0.0205078 -22.6191l-90.5098 -90.5107c-6.25 -6.25 -16.3799 -6.25 -22.6299 0l-22.6309 22.6299c-6.25 6.25 -6.25 16.3809 0 22.6309l11.3105 11.3096l-28.9004 28.9004
c-21.3096 -5.63086 -44.8994 -0.360352 -61.6094 16.3496l-49.1406 49.1396c-12.0098 12 -18.75 28.2803 -18.75 45.25v18.75l-90.5098 45.25c62.4902 62.4805 163.8 62.4805 226.28 0l45.25 -45.25c16.71 -16.71 21.9795 -40.2998 16.3496 -61.6094l28.9004 -28.9004
l11.3096 11.3105c6.25 6.25 16.3799 6.25 22.6299 0zM284.59 269.26l49.1406 -49.1396c3.53906 -3.54004 7.47949 -6.5 11.4395 -9.41016l-238.13 -255.07c-23.8799 -25.5801 -64.2002 -26.2695 -88.9297 -1.5293c-24.7305 24.7393 -24.04 65.0498 1.5293 88.9297
l255.101 238.17c3.00977 -4.16016 6.14941 -8.25 9.84961 -11.9502z" />
    <glyph glyph-name="hanukiah" unicode="&#xf6e6;" horiz-adv-x="640" 
d="M232 288h16c4.41992 0 8 -3.58008 8 -8v-120h-32v120c0 4.41992 3.58008 8 8 8zM168 288h16c4.41992 0 8 -3.58008 8 -8v-120h-32v120c0 4.41992 3.58008 8 8 8zM392 288h16c4.41992 0 8 -3.58008 8 -8v-120h-32v120c0 4.41992 3.58008 8 8 8zM456 288h16
c4.41992 0 8 -3.58008 8 -8v-120h-32v120c0 4.41992 3.58008 8 8 8zM544 280v-120h-32v120c0 4.41992 3.58008 8 8 8h16c4.41992 0 8 -3.58008 8 -8zM104 288h16c4.41992 0 8 -3.58008 8 -8v-120h-32v120c0 4.41992 3.58008 8 8 8zM624 288c8.83984 0 16 -7.16016 16 -16
v-112c0 -53.0195 -42.9805 -96 -96 -96h-192v-64h176c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-416c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h176v64h-192c-53.0195 0 -96 42.9805 -96 96v112c0 8.83984 7.16016 16 16 16
h32c8.83984 0 16 -7.16016 16 -16v-112c0 -17.6699 14.3301 -32 32 -32h192v192c0 8.83984 7.16016 16 16 16h32c8.83984 0 16 -7.16016 16 -16v-192h192c17.6699 0 32 14.3301 32 32v112c0 8.83984 7.16016 16 16 16h32zM608 320c-13.25 0 -24 11.9502 -24 26.6699
s24 53.3301 24 53.3301s24 -38.5996 24 -53.3301c0 -14.7295 -10.75 -26.6699 -24 -26.6699zM32 320c-13.25 0 -24 11.9502 -24 26.6699s24 53.3301 24 53.3301s24 -38.5996 24 -53.3301c0 -14.7295 -10.75 -26.6699 -24 -26.6699zM320 368
c-13.25 0 -24 11.9502 -24 26.6699s24 53.3301 24 53.3301s24 -38.5996 24 -53.3301c0 -14.7295 -10.75 -26.6699 -24 -26.6699zM112 320c-13.25 0 -24 11.9502 -24 26.6699s24 53.3301 24 53.3301s24 -38.5996 24 -53.3301c0 -14.7295 -10.75 -26.6699 -24 -26.6699z
M176 320c-13.25 0 -24 11.9502 -24 26.6699s24 53.3301 24 53.3301s24 -38.5996 24 -53.3301c0 -14.7295 -10.75 -26.6699 -24 -26.6699zM240 320c-13.25 0 -24 11.9502 -24 26.6699s24 53.3301 24 53.3301s24 -38.5996 24 -53.3301
c0 -14.7295 -10.75 -26.6699 -24 -26.6699zM400 320c-13.25 0 -24 11.9502 -24 26.6699s24 53.3301 24 53.3301s24 -38.5996 24 -53.3301c0 -14.7295 -10.75 -26.6699 -24 -26.6699zM464 320c-13.25 0 -24 11.9502 -24 26.6699s24 53.3301 24 53.3301
s24 -38.5996 24 -53.3301c0 -14.7295 -10.75 -26.6699 -24 -26.6699zM528 320c-13.25 0 -24 11.9502 -24 26.6699s24 53.3301 24 53.3301s24 -38.5996 24 -53.3301c0 -14.7295 -10.75 -26.6699 -24 -26.6699z" />
    <glyph glyph-name="hat-wizard" unicode="&#xf6e8;" 
d="M496 0c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-480c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h480zM192 64l16 -32h-144l110.96 249.66c9.4043 21.1611 33.3545 47.6611 53.46 59.1494l187.58 107.19l-56.2998 -168.92
c-1.81543 -5.43945 -3.28809 -14.5078 -3.28809 -20.2412c0 -7.25098 2.31934 -18.5449 5.17773 -25.209l86.4102 -201.63h-208l16 32l64 32l-64 32l-32 64l-32 -64l-64 -32zM256 288l-32 -16l32 -16l16 -32l16 32l32 16l-32 16l-16 32z" />
    <glyph glyph-name="hiking" unicode="&#xf6ec;" horiz-adv-x="384" 
d="M80.9502 -24.2305l34.5596 138.221l52.7803 -52.7803l-25.2402 -100.97c-3.64941 -14.5303 -16.6895 -24.2305 -31.0195 -24.2305c-2.58008 0 -5.19043 0.290039 -7.7998 0.950195c-17.1406 4.28027 -27.5605 21.6504 -23.2803 38.8096zM95.8398 171.89
c-2.18945 -8.41992 -11.0801 -13.54 -19.8701 -11.4395l-63.5596 15.25c-8.78027 2.10938 -14.1104 10.6396 -11.9199 19.0596l25.2695 98.1299c10.9707 42.1006 55.4404 67.6904 99.3203 57.1699c8.78027 -2.10938 14.1104 -10.6396 11.9199 -19.0596zM368 288
c8.83984 0 16 -7.16016 15.9902 -16v-320.01c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v240h-48c-8.48047 0 -16.6201 3.37988 -22.6201 9.37988l-22.4297 22.4297l-19.8906 -79.5693
c-0.129883 -0.520508 -0.469727 -0.910156 -0.620117 -1.41016l46.8203 -46.8203c12.0898 -12.0898 18.75 -28.1602 18.75 -45.25v-82.75c0 -17.6699 -14.3301 -32 -32 -32s-32 14.3301 -32 32v82.75l-86.6201 86.6201c-5.17383 5.1748 -9.37402 15.3154 -9.37402 22.6338
c0 2.17285 0.427734 5.64746 0.954102 7.75586l26.9199 107.721c6.56055 26.2197 30.0098 44.5195 57.0303 44.5195c15.7002 0 30.4697 -6.11035 41.5596 -17.2197l46.7803 -46.7803h34.75v16c0 8.83984 7.16016 16 16 16h16zM240 352c-26.5098 0 -48 21.4902 -48 48
s21.4902 48 48 48s48 -21.4902 48 -48s-21.4902 -48 -48 -48z" />
    <glyph glyph-name="hippo" unicode="&#xf6ed;" horiz-adv-x="640" 
d="M581.12 351.8c34.0898 -0.189453 58.8799 -33.6895 58.8799 -67.7803v-92.0195c0 -17.6699 -14.3301 -32 -32 -32v-32c0 -8.83984 -7.16016 -16 -16 -16h-32c-8.83984 0 -16 7.16016 -16 16v32h-128v-176c0 -8.83984 -7.16016 -16 -16 -16h-64
c-8.83984 0 -16 7.16016 -16 16v70.79c-32.3496 -14.3604 -70.7197 -22.79 -112 -22.79s-79.6504 8.42969 -112 22.79v-70.79c0 -8.83984 -7.16016 -16 -16 -16h-64c-8.83984 0 -16 7.16016 -16 16v240c0 88.3604 85.96 160 192 160
c49.2402 0 94.0098 -15.5801 128 -40.9805v48.9805c0 13.2598 10.75 24 24 24h16c13.25 0 24 -10.7402 24 -24v-13.8799c10.0498 3.58008 20.7197 5.87988 32 5.87988c39.8301 0 73.9805 -24.2695 88.5195 -58.8203c24.1006 9.04004 48.9307 26.7705 76.6006 26.6201z
M448 272c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16s-16 -7.16016 -16 -16s7.16016 -16 16 -16z" />
    <glyph glyph-name="horse" unicode="&#xf6f0;" horiz-adv-x="576" 
d="M575.92 371.4l0.0605469 -77.71v-0.0292969c0 -11.9609 -9.01465 -25.2715 -20.1201 -29.7109l-32.5508 -13.0205c-15.4395 -6.17969 -33.04 0.5 -40.4893 15.3701l-18.9004 37.7002l-16 7.11035v-102.471c0.00976562 -0.219727 0.0800781 -0.419922 0.0800781 -0.639648
c0 -30.4697 -12.2598 -58.0303 -32 -78.2197v-177.78c0 -8.83984 -7.16016 -16 -16 -16h-64c-8.83984 0 -16 7.16016 -16 16v150.4l-133.97 22.3301l-23.8398 -63.5908l26.3096 -105.26c2.53027 -10.0996 -5.11035 -19.8799 -15.5195 -19.8799h-65.9609h-0.000976562
c-6.89453 0 -13.8428 5.42969 -15.5088 12.1201l-24.8496 99.4102c-1.05664 4.2207 -1.91406 11.1777 -1.91406 15.5293c0 6.40332 1.8252 16.4648 4.07422 22.46l25.7197 68.6006c-18.7002 17.5195 -30.54 42.2402 -30.54 69.8799
c0 2.62988 0.570312 5.09961 0.780273 7.67969c-9.91016 -7.29004 -16.7803 -18.46 -16.7803 -31.6797v-56c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v56c0 48.5303 39.4697 88 88 88v-1.11035c17.5996 20.1299 43.1602 33.1104 72 33.1104
h159.92c0 70.6904 57.3105 128 128 128h119.98c5.05957 0 8.94922 -4.67969 7.92969 -9.63965c-2.67969 -13.1699 -11.1201 -23.8203 -22.1797 -30.6602c5.10938 -5.37988 9.90918 -10.4697 13.6895 -14.5c5.56055 -5.93066 8.57031 -13.6699 8.58008 -21.7998zM511.92 352
c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16s-16 -7.16016 -16 -16s7.16016 -16 16 -16z" />
    <glyph glyph-name="house-damage" unicode="&#xf6f1;" horiz-adv-x="576" 
d="M288 333.04l218.74 -192.94c1.54004 -1.37988 3.55957 -2.04004 5.25977 -3.19922v-184.9c0 -8.83984 -7.16016 -16 -16 -16h-176.19l-39.9199 55.25l104.11 64l-148.05 136.78l60.1602 -119.221l-104.11 -64l37.2305 -72.8096h-149.23c-8.83984 0 -16 7.16016 -16 16
v184.94c1.78027 1.20996 3.84961 1.88965 5.46973 3.34961zM570.69 211.72c6.5791 -5.89941 7.11914 -16.0195 1.21973 -22.5898l-21.4004 -23.8203c-5.91016 -6.56934 -16.0293 -7.10938 -22.5996 -1.20996l-229.32 202.271c-6.0498 5.33008 -15.1201 5.33008 -21.1699 0
l-229.32 -202.28c-6.58008 -5.91016 -16.6992 -5.35938 -22.5996 1.20996l-21.4004 23.8203c-5.90918 6.58008 -5.35938 16.6895 1.20996 22.5996l255.99 226.011c7.60059 6.85938 17.1406 10.2793 26.7002 10.2695s19.1201 -3.4502 26.75 -10.3096l101.25 -89.3809v51.6904
c0 8.83984 7.16016 16 16 16h64c8.83984 0 16 -7.16016 16 -16v-136.45z" />
    <glyph glyph-name="hryvnia" unicode="&#xf6f2;" horiz-adv-x="384" 
d="M368 208h-99.7002l-34.6699 -32h134.37c8.83984 0 16 -7.16016 16 -16v-32c0 -8.83984 -7.16016 -16 -16 -16h-203.7l-29.4902 -27.2197c-4.3291 -4 -6.80957 -9.66992 -6.80957 -15.5801c0 -11.6807 9.50977 -21.2002 21.2002 -21.2002h83.6299h0.00195312
c4.79395 0 11.6748 2.49121 15.3584 5.55957l11.75 9.80078c10.1895 8.48926 25.3193 7.12012 33.8096 -3.07031l20.4902 -24.5898c8.49023 -10.1807 7.10938 -25.3105 -3.07031 -33.7998l-11.7695 -9.81055c-18.6807 -15.5596 -42.2207 -24.0898 -66.54 -24.0898h-78.8203
c-37.1396 0 -73.3799 17.8496 -92.0498 49.9502c-17.8701 30.7197 -17.54 65.4199 -4.12988 94.0498h-41.8604c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16h99.7002l34.6699 32h-134.37c-8.83984 0 -16 7.16016 -16 16v32c0 8.83984 7.16016 16 16 16
h203.7l29.4902 27.21c4.3291 4 6.80957 9.66992 6.80957 15.5801c0 11.6797 -9.50977 21.2002 -21.2002 21.2002h-83.6201c-5.62012 0 -11.0693 -1.9707 -15.3896 -5.57031l-11.7305 -9.78027c-10.1895 -8.48926 -25.3193 -7.12012 -33.8096 3.07031l-20.4902 24.5898
c-8.49023 10.1807 -7.10938 25.3105 3.07031 33.7998l11.7695 9.81055c18.6807 15.5596 42.2207 24.0898 66.54 24.0898h78.8203c37.1396 0 73.3799 -17.8398 92.0498 -49.9502c17.8701 -30.7197 17.54 -65.4199 4.12988 -94.0498h41.8604c8.83984 0 16 -7.16016 16 -16v-32
c0 -8.83984 -7.16016 -16 -16 -16z" />
    <glyph glyph-name="mask" unicode="&#xf6fa;" horiz-adv-x="640" 
d="M320.67 384c449.09 0 348.32 -384 158.46 -384c-39.8994 0 -77.4697 20.6904 -101.41 55.8604l-25.7295 37.79c-15.6602 22.9893 -46.9707 22.9893 -62.6299 0l-25.7305 -37.79c-23.9502 -35.1699 -61.5195 -55.8604 -101.42 -55.8604c-199.11 0 -284.14 384 158.46 384z
M184 139.64c41.0596 0 67.7598 25.6504 80.0801 41.0508c5.22949 6.54004 5.22949 16.0996 0 22.6299c-12.3203 15.3896 -39.0098 41.0498 -80.0801 41.0498s-67.7598 -25.6504 -80.0801 -41.0498c-5.22949 -6.54004 -5.22949 -16.1006 0 -22.6299
c12.3203 -15.3906 39.0205 -41.0508 80.0801 -41.0508zM456 139.64c41.0596 0 67.7598 25.6504 80.0801 41.0508c5.22949 6.54004 5.22949 16.0996 0 22.6299c-12.3203 15.3896 -39.0098 41.0498 -80.0801 41.0498s-67.7598 -25.6504 -80.0801 -41.0498
c-5.22949 -6.54004 -5.22949 -16.1006 0 -22.6299c12.3203 -15.3906 39.0205 -41.0508 80.0801 -41.0508z" />
    <glyph glyph-name="mountain" unicode="&#xf6fc;" horiz-adv-x="640" 
d="M634.92 -14.7002c2.80566 -4.3623 5.08301 -12.1133 5.08301 -17.3008c0 -4.50586 -1.75293 -11.374 -3.91309 -15.3291c-5.60938 -10.2803 -16.3799 -16.6699 -28.0898 -16.6699h-576h-0.00390625c-10.4795 0 -23.0615 7.46387 -28.0859 16.6602
c-2.16016 3.95605 -3.91309 10.8262 -3.91309 15.334c0 5.18848 2.27734 12.9414 5.08301 17.3057l288 448c5.88965 9.16016 16.0303 14.7002 26.9199 14.7002s21.0303 -5.54004 26.9199 -14.7002zM320 356.82l-102.06 -158.761l38.0596 -38.0596l64 64h85.3896z" />
    <glyph glyph-name="network-wired" unicode="&#xf6ff;" horiz-adv-x="640" 
d="M640 184c0 -8.83984 -7.16016 -16 -16 -16h-104v-40h56c17.6699 0 32 -14.3301 32 -32v-128c0 -17.6699 -14.3301 -32 -32 -32h-160c-17.6699 0 -32 14.3301 -32 32v128c0 17.6699 14.3301 32 32 32h56v40h-304v-40h56c17.6699 0 32 -14.3301 32 -32v-128
c0 -17.6699 -14.3301 -32 -32 -32h-160c-17.6699 0 -32 14.3301 -32 32v128c0 17.6699 14.3301 32 32 32h56v40h-104c-8.83984 0 -16 7.16016 -16 16v16c0 8.83984 7.16016 16 16 16h280v40h-72c-17.6699 0 -32 14.3301 -32 32v128c0 17.6699 14.3301 32 32 32h192
c17.6699 0 32 -14.3301 32 -32v-128c0 -17.6699 -14.3301 -32 -32 -32h-72v-40h280c8.83984 0 16 -7.16016 16 -16v-16zM256 320h128v64h-128v-64zM192 0v64h-96v-64h96zM544 0v64h-96v-64h96z" />
    <glyph glyph-name="otter" unicode="&#xf700;" horiz-adv-x="640" 
d="M608 416c17.6699 0 32 -14.3301 32 -32v-32c0 -53.0195 -42.9805 -96 -96 -96h-22.8604l-92.4697 -49.79l55.1104 -110.21h28.2197c17.6699 0 32 -14.3301 32 -32v-16c0 -8.83984 -7.16016 -16 -16 -16h-80l-74.5098 144.5l-149.49 -80.5h64
c17.6699 0 32 -14.3301 32 -32v-16c0 -8.83984 -7.16016 -16 -16 -16h-224c-8.83008 0 -16 -7.16992 -16 -16s7.16992 -16 16 -16h112c17.6699 0 32 -14.3301 32 -32s-14.3301 -32 -32 -32h-108.47c-39.3799 0 -75.5205 26.9004 -82.2803 65.7002
c-4.91016 28.1201 5 54.2197 23.1904 71.7998c23.5596 22.75 39.5596 52.1396 39.5596 84.8896v1.61035c0 106.04 85.96 192 192 192h56l153.25 87.5703c9.66992 5.51953 20.6104 8.42969 31.75 8.42969h20.4902h0.0126953c14.6328 0 34.9033 -8.40039 45.2471 -18.75
l13.25 -13.25h32zM512 400c-8.83984 0 -16 -7.16016 -16 -16s7.16016 -16 16 -16s16 7.16016 16 16s-7.16016 16 -16 16zM544 304c20.8301 0 38.4297 13.4199 45.0498 32h-77.0498l-118.57 -59.29l13.7705 -27.5498l101.84 54.8398h34.96z" />
    <glyph glyph-name="ring" unicode="&#xf70b;" 
d="M256 384c145.94 0 256 -61.9102 256 -144v-98.1299c0 -78.3506 -114.62 -141.87 -256 -141.87s-256 63.5195 -256 141.87v98.1299c0 82.0898 110.06 144 256 144zM256 320c-106.04 0 -192 -35.8203 -192 -80c0 -9.25977 3.96973 -18.1201 10.9102 -26.3896
c44.9395 26.1797 108.859 42.3896 181.09 42.3896s136.15 -16.21 181.09 -42.3896c6.94043 8.26953 10.9102 17.1299 10.9102 26.3896c0 44.1797 -85.96 80 -192 80zM120.43 183.36c34.7305 -14.4307 82.6406 -23.3604 135.57 -23.3604s100.84 8.92969 135.57 23.3604
c-34.6104 14.71 -81.21 24.6396 -135.57 24.6396s-100.96 -9.92969 -135.57 -24.6396z" />
    <glyph glyph-name="running" unicode="&#xf70c;" horiz-adv-x="416" 
d="M272 352c-26.5098 0 -48 21.4902 -48 48s21.4902 48 48 48s48 -21.4902 48 -48s-21.4902 -48 -48 -48zM113.69 130.53c7.92969 -17.2402 20.6699 -32.3799 37.9893 -42.6104l10.6699 -6.2998l-8.79004 -20.5205c-7.5293 -17.6494 -24.8594 -29.0898 -44.1094 -29.0898
h-77.4502c-17.6699 0 -32 14.3301 -32 32s14.3301 32 32 32h66.8896zM384 224.01c17.6699 0 32 -14.3193 32 -31.9902c0 -17.6699 -14.3301 -32 -32 -32h-53.9902c-18.1895 0 -35.1094 10.5508 -43.1094 26.8906l-20.2705 41.4297l-31.3096 -78.2803l61.2393 -36.1396
c18.75 -11.3096 27.5508 -33.6201 21.6406 -54.3896l-31.6406 -101.061c-4.29004 -13.6797 -16.9092 -22.4502 -30.5195 -22.4502c-3.16992 0 -6.38965 0.480469 -9.58008 1.48047c-16.8604 5.28027 -26.25 23.2305 -20.9697 40.0898l27.4697 87.7305l-84.9795 50.1699
c-27.6104 16.2998 -38.9209 50.8301 -26.3008 80.3096l37.46 87.3906l-14.6992 4.36914c-7.83008 1.86035 -17.6006 -0.25 -25.2705 -6.13965l-39.6895 -30.4102c-14.0205 -10.7402 -34.0908 -8.10938 -44.8604 5.91992c-10.7705 14.0303 -8.11035 34.1104 5.91992 44.8604
l39.6699 30.4102c23.0703 17.6895 52.54 23.9395 80.8398 17.1396l71.0801 -21.1396c26.3301 -6.70996 49.2803 -25.3906 61.7803 -50.9404l26.0596 -53.25h44.0303z" />
    <glyph glyph-name="scroll" unicode="&#xf70e;" horiz-adv-x="640" 
d="M48 448c26.4697 0 48 -21.5303 48 -48v-80h-80c-8.83984 0 -16 7.16016 -16 16v64c0 26.4697 21.5303 48 48 48zM256 35.4297c0 -31.8896 -21.7803 -61.4297 -53.25 -66.5498c-40.0996 -6.53027 -74.75 24.25 -74.75 63.1201v368c0 18.0801 -6.25977 34.5898 -16.4102 48
h336.41c52.9404 0 96 -43.0596 96 -96v-256h-288v-60.5703zM288 64h336c8.83984 0 16 -7.16016 16 -16c0 -61.8604 -50.1396 -112 -112 -112h-336c52.9404 0 96 43.0703 96 96v32z" />
    <glyph glyph-name="skull-crossbones" unicode="&#xf714;" horiz-adv-x="448" 
d="M439.15 -5.05957c7.89941 -3.9502 11.1094 -13.5605 7.15918 -21.4707l-14.3096 -28.6299c-3.95996 -7.89941 -13.5703 -11.0996 -21.4697 -7.14941l-186.53 90.7197l-186.52 -90.7197c-7.91016 -3.95996 -17.5205 -0.75 -21.4707 7.14941l-14.3096 28.6299
c-3.95996 7.91016 -0.75 17.5205 7.14941 21.4707l141.98 69.0596l-141.99 69.0596c-7.89941 3.9502 -11.0996 13.5605 -7.14941 21.46l14.3096 28.6309c3.95996 7.90918 13.5703 11.1094 21.4697 7.15918l186.53 -90.7197l186.53 90.7197
c7.91016 3.9502 17.5195 0.740234 21.4697 -7.15918l14.3096 -28.6309c3.95996 -7.89941 0.75 -17.5098 -7.14941 -21.46l-141.99 -69.0596zM150 210.72c-41.7803 22.4102 -70 62.75 -70 109.28c0 70.6904 64.4697 128 144 128s144 -57.3096 144 -128
c0 -46.5303 -28.2197 -86.8701 -70 -109.28l5.5 -25.8701c2.66992 -12.6191 -5.41992 -24.8496 -16.4502 -24.8496h-126.08c-11.0293 0 -19.1201 12.2305 -16.4502 24.8496zM280 336c-17.6504 0 -32 -14.3496 -32 -32s14.3496 -32 32 -32s32 14.3496 32 32
s-14.3496 32 -32 32zM168 336c-17.6504 0 -32 -14.3496 -32 -32s14.3496 -32 32 -32s32 14.3496 32 32s-14.3496 32 -32 32z" />
    <glyph glyph-name="slash" unicode="&#xf715;" horiz-adv-x="640" 
d="M594.53 -60.6299l-588.351 454.729c-6.96973 5.41992 -8.22949 15.4707 -2.80957 22.4502l19.6396 25.2705c5.41992 6.97949 15.4805 8.23926 22.46 2.80957l588.351 -454.729c6.96973 -5.41992 8.22949 -15.4707 2.80957 -22.4502l-19.6396 -25.2705
c-5.41992 -6.97949 -15.4805 -8.22949 -22.46 -2.80957z" />
    <glyph glyph-name="spider" unicode="&#xf717;" horiz-adv-x="576" 
d="M151.17 280.65l-27.1504 54.2998c-1.86035 3.72949 -3.37109 10.1387 -3.37109 14.3066c0 2.86719 0.735352 7.40234 1.6416 10.123l25.8896 77.6797c2.79004 8.39062 11.8604 12.9209 20.2402 10.1201l15.1699 -5.05957
c8.39062 -2.7998 12.9102 -11.8604 10.1201 -20.2402l-23.7998 -71.3896l20.29 -40.5801c-1.41016 -4.20996 -2.49023 -8.20996 -3.20996 -11.79l-5.2207 -26.1201h-4.66992zM573.31 98.6201c4.90039 -7.35059 2.9209 -17.2803 -4.43945 -22.1797l-13.3105 -8.88086
c-7.34961 -4.89941 -17.29 -2.90918 -22.1895 4.44043l-48 72h-47.0605l60.8301 -97.3301c3.16992 -5.08008 4.86035 -10.96 4.86035 -16.96v-77.71c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v73.1104l-74.0801 118.529
c1 -14.0498 2.08008 -28.1094 2.08008 -42.21c0 -53.0693 -40.7598 -101.43 -96 -101.43s-96 48.3604 -96 101.43c0 14.1006 1.07031 28.1602 2.08008 42.21l-74.0801 -118.529v-73.1104c0 -8.83984 -7.16016 -16 -16 -16h-16c-8.83984 0 -16 7.16016 -16 16v77.7002
v0.00976562c0 5.0625 2.17773 12.6562 4.86035 16.9502l60.8301 97.3301h-47.0605l-48 -72c-4.89941 -7.35059 -14.8398 -9.33984 -22.1895 -4.44043l-13.3105 8.87988c-7.36035 4.90039 -9.33984 14.8398 -4.43945 22.1904l52.7393 79.1299
c5.24707 7.86426 17.1768 14.248 26.6299 14.25h77.9404l-68.9902 24.3496c-5.75 1.91895 -13.1465 7.56738 -16.5098 12.6104l-53.5996 80.4102c-4.90039 7.36035 -2.91016 17.29 4.43945 22.1895l13.3105 8.88086c7.35938 4.89941 17.29 2.90918 22.1895 -4.44043
l50.5703 -75.8301l60.4902 -20.1699h36.0996l10.3701 51.8496c2.18945 10.9707 17.3701 60.1504 69.6299 60.1504s67.4404 -49.1797 69.6299 -60.1504l10.3701 -51.8496h36.0996l60.5 20.1699l50.5605 75.8301c4.89941 7.34961 14.8398 9.33984 22.1895 4.44043
l13.3105 -8.88086c7.34961 -4.89941 9.33984 -14.8398 4.43945 -22.1895l-53.5996 -80.4102c-3.36328 -5.04297 -10.7598 -10.6914 -16.5098 -12.6104l-68.9902 -24.3594h77.9404c9.45117 -0.00195312 21.377 -6.38672 26.6191 -14.25zM406.09 350.49l-23.7998 71.3896
c-2.79004 8.37988 1.74023 17.4404 10.1201 20.2402l15.1699 5.05957c8.37988 2.80078 17.4502 -1.73926 20.2402 -10.1201l25.8896 -77.6797c0.908203 -2.72168 1.64551 -7.25781 1.64551 -10.127c0 -4.16699 -1.5127 -10.5752 -3.375 -14.3027l-27.1504 -54.2998
l-25.9297 -8.65039h-4.66992l-5.2207 26.1201c-0.719727 3.58008 -1.7998 7.58008 -3.20996 11.79z" />
    <glyph glyph-name="toilet-paper" unicode="&#xf71e;" horiz-adv-x="576" 
d="M128 448h284.44c-36.7705 -38.4805 -60.4404 -108.4 -60.4404 -192v-172.07c0 -53.6494 -11.8799 -87.5693 -24.71 -126.05c-4.36035 -13.0703 -16.5898 -21.8799 -30.3604 -21.8799h-280.92c-10.9199 0 -18.6299 10.7002 -15.1797 21.0596
c21.3701 64.1006 31.1699 85.75 31.1699 126.87v172.07c0 106.04 42.9805 192 96 192zM96 224c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16s-16 -7.16016 -16 -16s7.16016 -16 16 -16zM160 224c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16s-16 -7.16016 -16 -16
s7.16016 -16 16 -16zM224 224c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16s-16 -7.16016 -16 -16s7.16016 -16 16 -16zM288 224c8.83984 0 16 7.16016 16 16s-7.16016 16 -16 16s-16 -7.16016 -16 -16s7.16016 -16 16 -16zM480 448c53.0195 0 96 -85.96 96 -192
s-42.9805 -192 -96 -192s-96 85.96 -96 192s42.9805 192 96 192zM480 192c17.6699 0 32 28.6504 32 64s-14.3301 64 -32 64s-32 -28.6504 -32 -64s14.3301 -64 32 -64z" />
    <glyph glyph-name="tractor" unicode="&#xf722;" horiz-adv-x="640" 
d="M528 112c48.5996 0 88 -39.4004 88 -88s-39.4004 -88 -88 -88s-88 39.4004 -88 88s39.4004 88 88 88zM528 0c13.2305 0 24 10.7695 24 24s-10.7695 24 -24 24s-24 -10.7695 -24 -24s10.7695 -24 24 -24zM608 288c17.6699 0 32 -14.3301 31.9902 -32v-50.7598
c0 -8.49023 -3.37012 -16.6299 -9.37012 -22.6299l-50.8203 -50.8203c-15.7295 7.58984 -33.1602 12.2002 -51.7998 12.2002c-39.1396 0 -73.5498 -19.0098 -95.46 -48h-80.54v-6c0 -12.1504 -9.84961 -22 -22 -22h-7.16016
c-2.9502 -9.90039 -6.91992 -19.46 -11.9102 -28.7207l5.06055 -5.05957c8.58984 -8.58984 8.58984 -22.5195 0 -31.1104l-31.1104 -31.1094c-8.58984 -8.58984 -22.5195 -8.58984 -31.1104 0l-5.05957 5.05957c-9.25977 -4.99023 -18.8203 -8.95996 -28.7197 -11.9102
v-7.13965c0 -12.1504 -9.85059 -22 -22 -22h-44c-12.1504 0 -22 9.84961 -22 22v7.15039c-9.90039 2.94922 -19.46 6.91992 -28.7207 11.9092l-5.05957 -5.05957c-8.58984 -8.58984 -22.5195 -8.58984 -31.1104 0l-31.1094 31.1104
c-8.58984 8.58984 -8.58984 22.5195 0 31.1094l5.05957 5.06055c-4.99023 9.26953 -8.9502 18.8193 -11.9102 28.7295h-7.13965c-12.1504 0 -22 9.85059 -22 22v44c0 12.1504 9.84961 22 22 22h7.15039c2.94922 9.90039 6.91992 19.46 11.9092 28.7207l-5.05957 5.05957
c-8.58984 8.58984 -8.58984 22.5195 0 31.1104l31.1104 31.1094c7.92969 7.93066 20.2598 8.2002 28.8896 1.4707v146.52c0 26.4697 21.5303 48 48 48h133.45h0.046875c17.4834 0 37.2324 -13.0547 44.083 -29.1396l56.0898 -130.86h102.33v40.2002
c0 29.9902 10.5801 58.8994 29.5 81.7197c6.37988 7.7002 18.04 8.23047 24.7002 0.780273l21.6299 -24.1699c4.87012 -5.43066 5.74023 -13.6904 1.32031 -19.4902c-8.4502 -11.0801 -13.1504 -24.7197 -13.1504 -38.8398v-40.2002h64zM176 32c44.1797 0 80 35.8203 80 80
s-35.8203 80 -80 80s-80 -35.8203 -80 -80s35.8203 -80 80 -80zM198 288h110.04l-41.1504 96h-106.89v-96h38z" />
    <glyph glyph-name="user-injured" unicode="&#xf728;" horiz-adv-x="448" 
d="M277.37 436.02l-90.6904 -68.0195h-81.1895c19.0098 46.8701 64.8193 80 118.51 80c19.1104 0 37.0801 -4.46973 53.3701 -11.9805zM342.51 368h-102.52l66.0293 49.5195c15.8203 -13.3193 28.5908 -30.0498 36.4902 -49.5195zM224 192c-70.6904 0 -128 57.3096 -128 128
c0 5.48047 0.94043 10.7002 1.61035 16h252.779c0.660156 -5.2998 1.61035 -10.5195 1.61035 -16c0 -70.6904 -57.3096 -128 -128 -128zM80 148.3c7.92676 3.51758 21.2812 7.64844 29.8096 9.21973l98.4502 -221.52h-128.26v212.3zM0 -16v41.5996
c0 41.1406 18.8799 77.5107 48 102.16v-191.76c-26.5098 0 -48 21.4902 -48 48zM256 32c26.4697 0 48 -21.5303 48 -48s-21.5303 -48 -48 -48h-12.71l-42.6699 96h55.3799zM313.6 160c74.2305 0 134.4 -60.1699 134.4 -134.4v-41.5996c0 -26.5098 -21.4902 -48 -48 -48
h-80.4102c10.1504 13.4102 16.4102 29.9199 16.4102 48c0 44.1104 -35.8896 80 -80 80h-69.5898l-42.6699 96h7.37012c22.2393 -10.1797 46.8799 -16 72.8896 -16s50.6504 5.82031 72.8896 16h16.71z" />
    <glyph glyph-name="vr-cardboard" unicode="&#xf729;" horiz-adv-x="640" 
d="M608 384c17.6699 0 32 -14.3301 32 -32v-320c0 -17.6699 -14.3301 -32 -32 -32h-160.22c-25.1807 0 -48.0303 14.7695 -58.3604 37.7402l-27.7402 61.6396c-7.88965 17.54 -24.0293 28.6201 -41.6797 28.6201s-33.79 -11.0801 -41.6797 -28.6201l-27.7402 -61.6396
c-10.3301 -22.9707 -33.1699 -37.7402 -58.3604 -37.7402h-160.22c-17.6699 0 -32 14.3301 -32 32v320c0 17.6699 14.3301 32 32 32h576zM160 144c35.3496 0 64 28.6504 64 64s-28.6504 64 -64 64s-64 -28.6504 -64 -64s28.6504 -64 64 -64zM480 144
c35.3496 0 64 28.6504 64 64s-28.6504 64 -64 64s-64 -28.6504 -64 -64s28.6504 -64 64 -64z" />
    <glyph glyph-name="wind" unicode="&#xf72e;" 
d="M156.7 192c48.7002 0 92.2998 -35 98.3994 -83.4004c7.5 -58.5 -38.0996 -108.6 -95.1992 -108.6c-46.6006 0 -85.6006 33.5 -94.2002 77.5996c-1.7998 9.60059 6.09961 18.4004 15.8994 18.4004h32.8008c6.59961 0 13.0996 -3.7998 15.1992 -10.0996
c4.30078 -12.7002 16.3008 -21.9004 30.4004 -21.9004c19.5 0 34.9004 17.4004 31.5996 37.4004c-2.59961 15.6992 -17.5 26.5996 -33.3994 26.5996h-142.2c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h140.7zM16 224c-8.7998 0 -16 7.2002 -16 16v32
c0 8.7998 7.2002 16 16 16h334.2c16 0 30.7998 10.9004 33.3994 26.5996c3.30078 20 -12.1992 37.4004 -31.5996 37.4004c-14.0996 0 -26.0996 -9.2002 -30.4004 -21.9004c-2.09961 -6.2998 -8.5 -10.0996 -15.1992 -10.0996h-32.8008
c-9.69922 0 -17.6992 8.7002 -15.7998 18.2998c9.7998 50.6006 59.5 87.1006 114.9 75.5c36.2002 -7.59961 65.5 -36.8994 73.0996 -73.0996c13 -61.9004 -34.0996 -116.7 -93.7998 -116.7h-336zM400 192c70.5 0 126 -65.5 108.9 -138.7
c-9.60059 -41.0996 -43.5 -74 -84.7002 -82.7002c-58.9004 -12.5 -111.601 21.7002 -129.4 72.3008c-3.7002 10.2998 4.40039 21.0996 15.2998 21.0996h33.8008c5.7998 0 11.5996 -2.59961 14.5 -7.59961c8.2998 -14.5 23.6992 -24.4004 41.5996 -24.4004
c26.5 0 48 21.5 48 48s-21.5 48 -48 48h-116.5c-6.59961 25.2002 -20.5 47.4004 -39.7998 64h156.3z" />
    <glyph glyph-name="wine-bottle" unicode="&#xf72f;" 
d="M507.31 375.43c6.25 -6.25 6.25 -16.3799 0.0107422 -22.6201l-22.6299 -22.6299c-6.25 -6.25 -16.3809 -6.25 -22.6309 0l-76.6699 -76.6699c19.7002 -46.5801 10.7305 -102.41 -27.2295 -140.37l-158.391 -158.39c-24.9893 -24.9902 -65.5195 -24.9902 -90.5098 0
l-90.5098 90.5098c-24.9902 24.9902 -24.9902 65.5205 0 90.5098l158.38 158.381c37.9697 37.96 93.79 46.9297 140.37 27.2295l76.6699 76.6699c-6.25 6.25 -6.25 16.3799 0 22.6299l22.6299 22.6299c6.25 6.25 16.3799 6.25 22.6299 0zM179.22 24.71l122.04 122.04
l-90.5098 90.5098l-122.04 -122.04z" />
    <glyph glyph-name="cloud-meatball" unicode="&#xf73b;" 
d="M48 96c26.5 0 48 -21.5 48 -48s-21.5 -48 -48 -48s-48 21.5 -48 48s21.5 48 48 48zM464 96c26.5 0 48 -21.5 48 -48s-21.5 -48 -48 -48s-48 21.5 -48 48s21.5 48 48 48zM345 84.9004c13.5 -7 23 -20.7002 23 -36.9004s-9.5 -29.9004 -23 -36.9004
c4.59961 -14.5 1.7002 -30.7998 -9.7998 -42.2998c-8.2002 -8.2002 -18.9004 -12.2998 -29.7002 -12.2998c-4.2998 0 -8.5 1.2002 -12.5996 2.5c-7 -13.5 -20.7002 -23 -36.9004 -23s-29.9004 9.5 -36.9004 23c-4.09961 -1.40039 -8.2998 -2.5 -12.5996 -2.5
c-10.7998 0 -21.5 4.09961 -29.7002 12.2998c-11.5 11.5 -14.5 27.7998 -9.89941 42.2998c-13.5 7 -23 20.7002 -23 36.9004s9.5 29.9004 23 36.9004c-4.5 14.5 -1.60059 30.7998 9.89941 42.2998s27.7998 14.5 42.2998 9.89941c7 13.5 20.7002 23 36.9004 23
s29.9004 -9.5 36.9004 -23c14.5 4.5 30.7998 1.60059 42.2998 -9.89941c11.3994 -11.5 14.3994 -27.7998 9.7998 -42.2998zM512 224c0 -53 -43 -96 -96 -96h-43.4004c-3.5 8 -8.39941 15.4004 -14.7998 21.7998c-13.5 13.5 -31.5 21.1006 -50.7998 21.2998
c-13.5 13.2002 -31.7002 20.9004 -51 20.9004s-37.5 -7.7002 -51 -20.9004c-19.2998 -0.199219 -37.2998 -7.7998 -50.7998 -21.2998c-6.40039 -6.39941 -11.2002 -13.7998 -14.7998 -21.7998h-43.4004c-53 0 -96 43 -96 96c0 42.5 27.7998 78.2002 66.0996 90.7998
c-1.2998 6.90039 -2.09961 13.9004 -2.09961 21.2002c0 61.9004 50.0996 112 112 112c43.2998 0 80.4004 -24.7998 99 -60.7998c14.7002 17.5 36.4004 28.7998 61 28.7998c44.2002 0 80 -35.7998 80 -80c0 -5.59961 -0.5 -11 -1.59961 -16.2002
c0.5 0 1 0.200195 1.59961 0.200195c53 0 96 -43 96 -96z" />
    <glyph glyph-name="cloud-moon-rain" unicode="&#xf73c;" horiz-adv-x="576" 
d="M350.5 222.5c37.2998 -6.7998 65.5 -39.2998 65.5 -78.5c0 -44.2002 -35.7998 -80 -80 -80h-256c-44.2002 0 -80 35.7998 -80 80c0 38.7998 27.5996 71.0996 64.2002 78.4004c0 0.5 -0.200195 1.09961 -0.200195 1.59961c0 53 43 96 96 96
c32.0996 0 60.2998 -15.9004 77.7002 -40c10.3994 5 22 8 34.2998 8c39.2002 0 71.5996 -28.2998 78.5 -65.5zM567.9 224.2c6.19922 1.2002 10.5996 -6 6.39941 -10.7998c-27 -33.1006 -67.8994 -53.3008 -112.6 -53.3008c-5.2002 0 -10.1006 1 -15.2002 1.5
c-6.2002 39.4004 -33.0996 72.5 -70.2002 86.8008c-10.7002 27.8994 -32.2002 49.7998 -58.8994 61.6992c3.2998 76.7002 66.5 137.9 144.399 137.9c8.90039 0 17.7998 -0.799805 26.5 -2.40039c6.2002 -1.09961 7.60059 -9.39941 2.10059 -12.5
c-35.6006 -20.0996 -57.5 -57.5 -57.5 -98.0996c0 -70.5 64.5996 -124.1 135 -110.8zM364.5 29.9004c7.7002 -4.40039 10.2998 -14.1006 6 -21.8008l-36.5996 -64c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961
c-7.69922 4.40039 -10.3994 14.1006 -6 21.8008l36.6006 64c4.39941 7.7998 14.2002 10.2998 21.7998 6zM268.5 29.9004c7.7002 -4.40039 10.2998 -14.1006 6 -21.8008l-36.5996 -64c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961
c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.40039 -10.3994 14.1006 -6 21.8008l36.6006 64c4.39941 7.7998 14.2002 10.2998 21.7998 6zM172.5 29.9004c7.7002 -4.40039 10.2998 -14.1006 6 -21.8008l-36.5996 -64
c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.40039 -10.3994 14.1006 -6 21.8008l36.6006 64c4.39941 7.7998 14.2002 10.2998 21.7998 6zM76.5 29.9004c7.7002 -4.40039 10.2998 -14.1006 6 -21.8008
l-36.5996 -64c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.40039 -10.3994 14.1006 -6 21.8008l36.6006 64c4.39941 7.7998 14.2002 10.2998 21.7998 6z" />
    <glyph glyph-name="cloud-rain" unicode="&#xf73d;" 
d="M416 320c53 0 96 -43 96 -96s-43 -96 -96 -96h-320c-53 0 -96 43 -96 96c0 42.5 27.7998 78.2002 66.0996 90.7998c-1.2998 6.90039 -2.09961 13.9004 -2.09961 21.2002c0 61.9004 50.0996 112 112 112c43.2998 0 80.4004 -24.7998 99 -60.7998
c14.7002 17.5 36.4004 28.7998 61 28.7998c44.2002 0 80 -35.7998 80 -80c0 -5.59961 -0.5 -11 -1.59961 -16.2002c0.5 0 1 0.200195 1.59961 0.200195zM88 73.7998c2.5 8.5 13.7998 8.10059 16 0c12.7998 -44.5996 40 -56.2998 40 -87.7002
c0 -27.6992 -21.5 -50.0996 -48 -50.0996s-48 22.4004 -48 50.0996c0 31.3008 27.2002 43.3008 40 87.7002zM248 73.7998c2.5 8.5 13.7998 8.10059 16 0c12.7998 -44.5996 40 -56.2998 40 -87.7002c0 -27.6992 -21.5 -50.0996 -48 -50.0996s-48 22.4004 -48 50.0996
c0 31.3008 27.2002 43.3008 40 87.7002zM408 73.7998c2.5 8.5 13.7998 8.10059 16 0c12.7998 -44.5996 40 -56.2998 40 -87.7002c0 -27.6992 -21.5 -50.0996 -48 -50.0996s-48 22.4004 -48 50.0996c0 31.3008 27.2002 43.3008 40 87.7002z" />
    <glyph glyph-name="cloud-showers-heavy" unicode="&#xf740;" 
d="M183.9 77.9004c7.69922 -4.40039 10.3994 -14.2002 6 -21.8008l-64 -112c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.30078 -10.3994 14.1006 -6 21.8008l64 112
c4.40039 7.7998 14.2002 10.3994 21.8008 6zM279.9 77.9004c7.69922 -4.40039 10.3994 -14.2002 6 -21.8008l-64 -112c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.30078 -10.3994 14.1006 -6 21.8008
l64 112c4.40039 7.7998 14.2002 10.3994 21.8008 6zM87.9004 77.9004c7.69922 -4.40039 10.3994 -14.2002 6 -21.8008l-64 -112c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961
c-7.69922 4.30078 -10.3994 14.1006 -6 21.8008l64 112c4.40039 7.7998 14.2002 10.3994 21.8008 6zM471.9 77.9004c7.69922 -4.40039 10.3994 -14.2002 6 -21.8008l-64 -112c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961
c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.30078 -10.3994 14.1006 -6 21.8008l64 112c4.40039 7.7998 14.2002 10.3994 21.8008 6zM375.9 77.9004c7.69922 -4.40039 10.3994 -14.2002 6 -21.8008l-64 -112
c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.30078 -10.3994 14.1006 -6 21.8008l64 112c4.40039 7.7998 14.2002 10.3994 21.8008 6zM416 320c53 0 96 -43 96 -96s-43 -96 -96 -96h-320
c-53 0 -96 43 -96 96c0 42.5 27.7998 78.2002 66.0996 90.7998c-1.2998 6.90039 -2.09961 13.9004 -2.09961 21.2002c0 61.9004 50.2002 112 112 112c43.2998 0 80.4004 -24.7998 99 -60.7998c14.7002 17.5 36.4004 28.7998 61 28.7998c44.2002 0 80 -35.7998 80 -80
c0 -5.59961 -0.5 -11 -1.59961 -16.2002c0.5 0 1 0.200195 1.59961 0.200195z" />
    <glyph glyph-name="cloud-sun-rain" unicode="&#xf743;" horiz-adv-x="576" 
d="M510.5 222.5c37.2998 -6.7998 65.5 -39.2998 65.5 -78.5c0 -44.2002 -35.7998 -80 -80 -80h-256c-44.2002 0 -80 35.7998 -80 80c0 38.7998 27.5996 71 64.2002 78.4004c0 0.5 -0.200195 1.09961 -0.200195 1.59961c0 53 43 96 96 96
c32.0996 0 60.2998 -15.9004 77.7002 -40c10.3994 5 22 8 34.2998 8c39.2002 0 71.5996 -28.2998 78.5 -65.5zM124.1 188.1c3.10059 -3.09961 6.60059 -5.59961 10.2002 -8.2998c-3.89941 -11.3994 -6.2002 -23.3994 -6.2002 -35.8994c0 -2.5 0.5 -4.80078 0.700195 -7.2002
l-59.2002 -19.7002c-10.1992 -3.2998 -19.8994 6.2998 -16.5 16.5l25.1006 75.2998l-71 35.5c-9.60059 4.7998 -9.60059 18.5 0 23.2998l71 35.5l-25.1006 75.3008c-3.39941 10.1992 6.2002 19.8994 16.4004 16.5l75.2998 -25.1006l35.5 71
c4.7998 9.60059 18.5 9.60059 23.2998 0l35.5 -71l75.3008 25.1006c10.1992 3.39941 19.8994 -6.2002 16.5 -16.4004l-8.90039 -26.7002c-0.700195 0 -1.2998 0.200195 -2 0.200195c-25.5996 0 -49.2002 -7.7998 -69.2002 -20.7002
c-37.5996 29.4004 -92.0996 27.2002 -126.7 -7.39941c-37.3994 -37.5 -37.3994 -98.4004 0 -135.801zM193.9 246.1c-18.2002 -8.2998 -33.5 -21.2998 -44.8008 -37.1992c-12.8994 11.6992 -21.0996 28.3994 -21.0996 47.0996c0 35.2998 28.7002 64 64 64
c12.4004 0 24 -3.7002 33.7998 -9.90039c-16.0996 -17.5996 -27.5996 -39.5 -31.8994 -64zM524.5 29.9004c7.7002 -4.40039 10.2998 -14.1006 6 -21.8008l-36.5996 -64c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961
c-7.69922 4.40039 -10.3994 14.1006 -6 21.8008l36.6006 64c4.39941 7.7998 14.2002 10.2998 21.7998 6zM428.5 29.9004c7.7002 -4.40039 10.2998 -14.1006 6 -21.8008l-36.5996 -64c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961
c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.40039 -10.3994 14.1006 -6 21.8008l36.6006 64c4.39941 7.7998 14.2002 10.2998 21.7998 6zM332.5 29.9004c7.7002 -4.40039 10.2998 -14.1006 6 -21.8008l-36.5996 -64
c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.40039 -10.3994 14.1006 -6 21.8008l36.6006 64c4.39941 7.7998 14.2002 10.2998 21.7998 6zM236.5 29.9004c7.7002 -4.40039 10.2998 -14.1006 6 -21.8008
l-36.5996 -64c-3 -5.19922 -8.40039 -8.09961 -13.9004 -8.09961c-2.7002 0 -5.40039 0.700195 -7.90039 2.09961c-7.69922 4.40039 -10.3994 14.1006 -6 21.8008l36.6006 64c4.39941 7.7998 14.2002 10.2998 21.7998 6z" />
    <glyph glyph-name="democrat" unicode="&#xf747;" horiz-adv-x="640" 
d="M637.3 191.1c4.90039 -7.39941 2.90039 -17.2998 -4.39941 -22.2998l-26.6006 -17.7002c-7.39941 -4.89941 -17.2998 -3 -22.2002 4.40039c-21.7998 32.7002 -23.8994 38.0996 -40.0996 50.2998v-77.7998h-352l-54 108l-38.0996 -34.5996
c-6 -6 -14.1006 -9.40039 -22.6006 -9.40039h-31c-12.0996 0 -23.2002 6.90039 -28.5996 17.7002l-14.2998 28.5996c-5.40039 10.7998 -4.30078 23.7998 3 33.5l74.5996 99.2998c1.7002 2.30078 4.2002 3.7002 6.40039 5.40039c-4 2.2002 -8 4.2002 -11.3008 7.5
c-16.3994 16.4004 -18.3994 41.7998 -6.09961 60.4004c2.7998 4.19922 8.7998 4.7998 12.4004 1.19922l42.8994 -42.7998l41.7998 41.7998c4.40039 4.40039 11.8008 3.7002 15.2002 -1.5c15.1006 -22.7998 12.6006 -53.7998 -7.5 -73.8994l81.2002 -81.2002h235.6
c50.8008 0 97.9004 -25.2002 126.101 -67.5zM296.2 204.7c3 2.89941 1.39941 7.89941 -2.60059 8.5l-22.7998 3.2998l-10.2002 20.7002c-1.89941 3.7002 -7.19922 3.7002 -9 0l-10.1992 -20.7002l-22.8008 -3.2998c-4.09961 -0.600586 -5.7998 -5.60059 -2.7998 -8.5
l16.5 -16.1006l-3.89941 -22.6992c-0.700195 -4.10059 3.59961 -7.2002 7.19922 -5.30078l20.4004 10.7002l20.4004 -10.7002c3.59961 -1.89941 7.89941 1.2002 7.19922 5.30078l-3.89941 22.6992zM408.2 204.7c3 2.89941 1.39941 7.89941 -2.60059 8.5l-22.7998 3.2998
l-10.2002 20.7002c-1.89941 3.7002 -7.19922 3.7002 -9 0l-10.1992 -20.7002l-22.8008 -3.2998c-4.09961 -0.600586 -5.7998 -5.60059 -2.7998 -8.5l16.5 -16.1006l-3.89941 -22.6992c-0.700195 -4.10059 3.59961 -7.2002 7.19922 -5.30078l20.4004 10.7002
l20.4004 -10.7002c3.59961 -1.89941 7.89941 1.2002 7.19922 5.30078l-3.89941 22.6992zM520.2 204.7c3 2.89941 1.39941 7.89941 -2.60059 8.5l-22.7998 3.2998l-10.2002 20.7002c-1.89941 3.7002 -7.19922 3.7002 -9 0l-10.1992 -20.7002l-22.8008 -3.2998
c-4.09961 -0.600586 -5.7998 -5.60059 -2.7998 -8.5l16.5 -16.1006l-3.89941 -22.6992c-0.700195 -4.10059 3.59961 -7.2002 7.19922 -5.30078l20.4004 10.7002l20.4004 -10.7002c3.59961 -1.89941 7.89941 1.2002 7.19922 5.30078l-3.89941 22.6992zM192 -48v144h352v-144
c0 -8.7998 -7.2002 -16 -16 -16h-64c-8.7998 0 -16 7.2002 -16 16v80h-160v-80c0 -8.7998 -7.2002 -16 -16 -16h-64c-8.7998 0 -16 7.2002 -16 16z" />
    <glyph glyph-name="flag-usa" unicode="&#xf74d;" 
d="M32 448c17.7002 0 32 -14.2998 32 -32v-464c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v464c0 17.7002 14.2998 32 32 32zM299.9 144.4c31.0996 -8.2002 62.5996 -16.5 100 -16.6006c31.8994 0 68.5 6.7998 112.1 24.1006v-36
c0 -12.3008 -7.09961 -23.8008 -18.5 -28.8008c-175.8 -76.3994 -211.8 69.1006 -397.5 -23.0996v69.2998c92.2002 39.9004 146.7 26.2002 203.9 11.1006zM299.9 240.4c31.0996 -8.2002 62.5996 -16.5 100 -16.5c31.8994 0 68.5 6.7998 112.1 24.0996v-61.5
c-92.2002 -39.9004 -146.7 -26.2002 -203.9 -11.0996c-57.5 15.0996 -117.3 30 -212.1 -7.60059v61.5c92.2002 39.9004 146.7 26.2002 203.9 11.1006zM309.4 366.3c-7 2.10059 -14.1006 4.2002 -21.3008 6.2002v-33.2002c4 -1.09961 8.10059 -2.2998 12.1006 -3.5
c26.7002 -8.09961 52.8994 -15.8994 85.7002 -15.8994c32.7998 0 72.5 7.89941 126.1 31.3994v-68.8994c-92.2002 -39.8008 -146.7 -26.1006 -203.9 -11.1006c-57.5 15.1006 -117.3 29.9004 -212.1 -7.59961v151.899c209.4 94.6006 195.3 -59.0996 366.6 28.2002
c22.6006 11.5 49.4004 -1.5 49.4004 -26.5996v-30.7998c-105.2 -49.1006 -150.8 -35.7002 -202.6 -20.1006zM160 319.9c8.7998 0 16 7.09961 16 16c0 8.89941 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.90039 7.2002 -16 16 -16zM160 375.7c8.7998 0 16 7.2002 16 16
c0 8.89941 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.90039 7.2002 -16 16 -16zM224 327.8c8.7998 0 16 7.2002 16 16c0 8.90039 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.89941 7.2002 -16 16 -16zM224 383.7c8.7998 0 16 7.2002 16 16c0 8.89941 -7.2002 16 -16 16
s-16 -7.2002 -16 -16c0 -8.90039 7.2002 -16 16 -16z" />
    <glyph glyph-name="meteor" unicode="&#xf753;" 
d="M511.328 427.197c-11.6074 -38.7021 -34.3076 -111.702 -61.3037 -187.701c6.99902 -2.09375 13.4043 -4 18.6074 -5.59277c6.28125 -1.91504 11.3789 -8.79785 11.3789 -15.3643c0 -2.21094 -0.842773 -5.58984 -1.88086 -7.54199
c-22.1055 -42.2969 -82.6904 -152.795 -142.479 -214.403c-0.999023 -1.09375 -1.99902 -2.5 -2.99902 -3.5c-31.501 -31.5098 -93.2285 -57.083 -137.784 -57.083c-107.546 0 -194.83 87.2842 -194.83 194.831c0 44.5391 25.5566 106.25 57.0469 137.748
c1 1 2.40625 2 3.49902 3c61.6006 59.9053 171.975 120.405 214.374 142.498c1.95215 1.03809 5.33008 1.88086 7.54102 1.88086c6.56641 0 13.4492 -5.09863 15.3613 -11.3809c1.59375 -5.09375 3.5 -11.5928 5.59277 -18.5928
c75.8955 26.999 148.978 49.7021 187.675 61.2959c1.26465 0.382812 3.36426 0.692383 4.68555 0.692383c8.93262 0 16.1826 -7.25 16.1826 -16.1826c0 -1.29785 -0.298828 -3.35938 -0.667969 -4.60352zM319.951 127.998
c-0.00976562 70.6348 -57.3457 127.962 -127.98 127.962c-70.6455 0 -127.98 -57.335 -127.98 -127.98c0 -70.6445 57.335 -127.979 127.98 -127.979h0.00488281c70.6426 0 127.976 57.333 127.976 127.976v0.0224609zM191.971 159.997
c-0.00292969 -17.6582 -14.3359 -31.9902 -31.9951 -31.9902c-17.6611 0 -31.9951 14.334 -31.9951 31.9951s14.334 31.9951 31.9951 31.9951h0.0361328c17.6416 0 31.959 -14.3174 31.959 -31.959v-0.0410156zM223.966 79.998
c-0.000976562 -8.8291 -7.16797 -15.9951 -15.998 -15.9951s-15.9971 7.16699 -15.9971 15.998c0 8.83008 7.16699 15.9971 15.9971 15.9971c8.80371 -0.0283203 15.9707 -7.19629 15.998 -16z" />
    <glyph glyph-name="person-booth" unicode="&#xf756;" horiz-adv-x="576" 
d="M192 -48v176h64v-176c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16zM224 224c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32h-57.5c-12.7998 0 -24.7998 5 -33.9004 14.0996l-20.8994 20.9004v-80.5996l41.2002 -61.3008
c4.39941 -8.7998 6.69922 -18.6992 6.69922 -28.5996v-56.5c0 -17.7002 -14.2998 -32 -32 -32c-17.6992 0 -32 14.2998 -32 32v56l-29.0996 43c-0.900391 0.400391 -1.59961 1.2002 -2.5 1.7002l-0.0996094 -100.7c0 -17.7002 -14.4004 -32 -32 -32
c-17.6006 0 -31.9004 14.2998 -31.9004 32l0.200195 160l-0.200195 95.9004c0 17.0996 6.7002 33.1992 18.7002 45.2998c12.0996 12.0996 28.2002 18.7998 45.2998 18.7998h18.7002c17 0 33.0996 -6.59961 45.2002 -18.7002l45.1992 -45.2998h50.9004zM64 320
c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM288 416v32h192v-416c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32c0 -17.7002 -14.2998 -32 -32 -32c-17.0996 0 -30.7998 13.5 -31.7002 30.4004
c-4.2998 -21.3008 -17.0996 -30.4004 -32.2998 -30.4004c-18.4004 0 -35.7002 16.7002 -31.4004 38.2998l30.9004 154.601zM192 416c0 17.7002 14.2998 32 32 32h32v-192h-64v160zM544 448c17.7002 0 32 -14.2998 32 -32v-464c0 -8.7998 -7.2002 -16 -16 -16h-32
c-8.7998 0 -16 7.2002 -16 16v496h32z" />
    <glyph glyph-name="poo-storm" unicode="&#xf75a;" horiz-adv-x="448" 
d="M308 112c9.2002 0 15 -10 10.4004 -18l-88 -152c-2.2002 -3.7998 -6.2002 -6 -10.4004 -6c-7.7002 0 -13.5 7.2002 -11.7002 14.7998l23 97.2002h-59.2998c-7.2998 0 -12.9004 6.40039 -11.9004 13.5996l16 120c0.800781 5.90039 5.90039 10.4004 11.9004 10.4004h68
c7.90039 0 13.5996 -7.5 11.5996 -15.0996l-17.2998 -64.9004h57.7002zM374.4 223.3c41 -3.2998 73.5996 -37.5 73.5 -79.2998c0 -44 -36 -80 -80 -80h-30l8.09961 14c7.7998 13.5 7.7998 30.4004 0 44s-22.4004 22 -38.0996 22h-16l6.59961 24.7002
c3.59961 13.2998 0.799805 27.2002 -7.59961 38.0996c-8.40039 10.9004 -21.1006 17.2002 -34.9004 17.2002h-68c-22 0 -40.7002 -16.4004 -43.7002 -38.2002l-16 -120c0 -0.599609 0.100586 -1.2002 0 -1.7998h-48.2998c-44 0 -80 36 -80 80
c0 41.7998 32.5996 76 73.5996 79.2998c-5.89941 9.60059 -9.59961 20.6006 -9.59961 32.7002c0 35.2998 28.7002 64 64 64h16c44.2002 0 80 35.7998 80 80c0 17.4004 -5.7002 33.4004 -15.0996 46.5c4.89941 0.799805 9.89941 1.5 15.0996 1.5c53 0 96 -43 96 -96
c0 -11.2998 -2.2998 -21.9004 -5.90039 -32h5.90039c35.2998 0 64 -28.7002 64 -64c0 -12.0996 -3.7002 -23.0996 -9.59961 -32.7002z" />
    <glyph glyph-name="rainbow" unicode="&#xf75b;" horiz-adv-x="576" 
d="M268.3 415.3c167.7 11.2998 307.7 -122 307.7 -287.3v-144c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v136.2c0 113.8 -81.5996 215.399 -194.5 229.899c-136.6 17.6006 -253.5 -88.8994 -253.5 -222.1v-144c0 -8.7998 -7.2002 -16 -16 -16h-32
c-8.7998 0 -16 7.2002 -16 16v133.8c0 153.3 115.4 287.3 268.3 297.5zM262.7 318.4c117.1 15 217.3 -76.2002 217.3 -190.4v-144c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v138.3c0 66.9004 -48.7002 126.601 -115.2 133.101
c-76.2998 7.39941 -140.8 -52.6006 -140.8 -127.4v-144c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v137.3c0 97.6006 70 184.7 166.7 197.101zM268.9 222.1c61.2998 11.9004 115.1 -34.8994 115.1 -94.0996v-144c0 -8.7998 -7.2002 -16 -16 -16h-32
c-8.7998 0 -16 7.2002 -16 16v144c0 17.5996 -14.2998 32 -32 32s-32 -14.4004 -32 -32v-144c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v140.2c0 46.3994 31.2998 89 76.9004 97.8994z" />
    <glyph glyph-name="republican" unicode="&#xf75e;" horiz-adv-x="640" 
d="M544 256v-64h-544v64c0 88.4004 71.5996 160 160 160h224c88.4004 0 160 -71.5996 160 -160zM176.3 277.6c3.5 3.5 1.60059 9.5 -3.39941 10.2002l-27.4004 4l-12.2002 24.7998c-2.09961 4.40039 -8.5 4.5 -10.7002 0l-12.1992 -24.7998l-27.4004 -4
c-4.90039 -0.700195 -6.90039 -6.7002 -3.2998 -10.2002l19.7998 -19.2998l-4.7002 -27.2998c-0.799805 -4.90039 4.40039 -8.59961 8.7002 -6.2998l24.5 12.8994l24.5 -12.8994c4.40039 -2.2998 9.5 1.39941 8.7002 6.2998l-4.7002 27.2998zM320.3 277.6
c3.5 3.5 1.60059 9.5 -3.39941 10.2002l-27.4004 4l-12.2002 24.7998c-2.09961 4.40039 -8.5 4.5 -10.7002 0l-12.1992 -24.7998l-27.4004 -4c-4.90039 -0.700195 -6.90039 -6.7002 -3.2998 -10.2002l19.7998 -19.2998l-4.7002 -27.2998
c-0.799805 -4.90039 4.40039 -8.59961 8.7002 -6.2998l24.5 12.8994l24.5 -12.8994c4.40039 -2.2998 9.5 1.39941 8.7002 6.2998l-4.7002 27.2998zM464.3 277.6c3.5 3.5 1.60059 9.5 -3.39941 10.2002l-27.4004 4l-12.2002 24.7998c-2.09961 4.40039 -8.5 4.5 -10.7002 0
l-12.1992 -24.7998l-27.4004 -4c-4.90039 -0.700195 -6.90039 -6.7002 -3.2998 -10.2002l19.7998 -19.2998l-4.7002 -27.2998c-0.799805 -4.90039 4.40039 -8.59961 8.7002 -6.2998l24.5 12.8994l24.5 -12.8994c4.40039 -2.2998 9.5 1.39941 8.7002 6.2998l-4.7002 27.2998z
M624 128c8.7998 0 16 -7.2002 16 -16v-64c0 -46.9004 -40.5996 -84.5 -88.4004 -79.5996c-41.5996 4.19922 -71.5996 42.5 -71.5996 84.2998v43.2998h-32v-112c0 -8.7998 -7.2002 -16 -16 -16h-96c-8.7998 0 -16 7.2002 -16 16v80h-192v-80c0 -8.7998 -7.2002 -16 -16 -16
h-96c-8.7998 0 -16 7.2002 -16 16v176h544v-112c0 -8.7998 7.2002 -16 16 -16s16 7.2002 16 16v64c0 8.7998 7.2002 16 16 16h32z" />
    <glyph glyph-name="smog" unicode="&#xf75f;" horiz-adv-x="640" 
d="M624 80c8.7998 0 16 -7.2002 16 -16v-16c0 -8.7998 -7.2002 -16 -16 -16h-544c-8.7998 0 -16 7.2002 -16 16v16c0 8.7998 7.2002 16 16 16h544zM144 -16c8.7998 0 16 -7.2002 16 -16v-16c0 -8.7998 -7.2002 -16 -16 -16h-128c-8.7998 0 -16 7.2002 -16 16v16
c0 8.7998 7.2002 16 16 16h128zM560 -16c8.7998 0 16 -7.2002 16 -16v-16c0 -8.7998 -7.2002 -16 -16 -16h-336c-8.7998 0 -16 7.2002 -16 16v16c0 8.7998 7.2002 16 16 16h336zM144 160c-79.5 0 -144 64.5 -144 144s64.5 144 144 144c41 0 77.7998 -17.2998 104 -44.7998
c26.2002 27.5 63 44.7998 104 44.7998c54.7998 0 102 -31 126.3 -76.0996c15 7.5 31.7002 12.0996 49.7002 12.0996c61.9004 0 112 -50.0996 112 -112s-50.0996 -112 -112 -112h-60.0996c-22.6006 -19.7002 -51.6006 -32 -83.9004 -32s-61.4004 12.2998 -83.9004 32h-156.1z
" />
    <glyph glyph-name="temperature-high" unicode="&#xf769;" 
d="M416 448c52.9004 0 96 -43.0996 96 -96s-43.0996 -96 -96 -96s-96 43.0996 -96 96s43.0996 96 96 96zM416 320c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM256 336v-166.5c19.7002 -24.5996 32 -55.5 32 -89.5
c0 -79.5 -64.5 -144 -144 -144s-144 64.5 -144 144c0 34 12.2998 64.7998 32 89.5v166.5c0 61.9004 50.0996 112 112 112s112 -50.0996 112 -112zM144 0c44.0996 0 80 35.9004 80 80c0 25.5 -12.2002 49 -32 63.7998v192.2c0 26.5 -21.5 48 -48 48s-48 -21.5 -48 -48v-192.2
c-19.7998 -14.8994 -32 -38.2998 -32 -63.7998c0 -44.0996 35.9004 -80 80 -80zM160 125.1c18.5996 -6.59961 32 -24.1992 32 -45.0996c0 -26.5 -21.5 -48 -48 -48s-48 21.5 -48 48c0 20.9004 13.4004 38.5 32 45.0996v210.9c0 8.7998 7.2002 16 16 16s16 -7.2002 16 -16
v-210.9z" />
    <glyph glyph-name="temperature-low" unicode="&#xf76b;" 
d="M416 448c52.9004 0 96 -43.0996 96 -96s-43.0996 -96 -96 -96s-96 43.0996 -96 96s43.0996 96 96 96zM416 320c17.7002 0 32 14.2998 32 32s-14.2998 32 -32 32s-32 -14.2998 -32 -32s14.2998 -32 32 -32zM256 336v-166.5c19.7002 -24.5996 32 -55.5 32 -89.5
c0 -79.5 -64.5 -144 -144 -144s-144 64.5 -144 144c0 34 12.2998 64.7998 32 89.5v166.5c0 61.9004 50.0996 112 112 112s112 -50.0996 112 -112zM144 0c44.0996 0 80 35.9004 80 80c0 25.5 -12.2002 49 -32 63.7998v192.2c0 26.5 -21.5 48 -48 48s-48 -21.5 -48 -48v-192.2
c-19.7998 -14.8994 -32 -38.2998 -32 -63.7998c0 -44.0996 35.9004 -80 80 -80zM160 125.1c18.5996 -6.59961 32 -24.1992 32 -45.0996c0 -26.5 -21.5 -48 -48 -48s-48 21.5 -48 48c0 20.9004 13.4004 38.5 32 45.0996v18.9004c0 8.7998 7.2002 16 16 16s16 -7.2002 16 -16
v-18.9004z" />
    <glyph glyph-name="vote-yea" unicode="&#xf772;" horiz-adv-x="640" 
d="M608 128c17.7002 0 32 -14.2998 32 -32v-96c0 -17.7002 -14.2998 -32 -32 -32h-576c-17.7002 0 -32 14.2998 -32 32v96c0 17.7002 14.2998 32 32 32h64v-64h-22.4004c-5.2998 0 -9.59961 -3.59961 -9.59961 -8v-16c0 -4.40039 4.2998 -8 9.59961 -8h492.801
c5.2998 0 9.59961 3.59961 9.59961 8v16c0 4.40039 -4.2998 8 -9.59961 8h-22.4004v64h64zM512 64h-384v319.7c0 17.7998 14.5 32.2998 32.4004 32.2998h319.3c17.7998 0 32.2998 -14.4004 32.2998 -32.2998v-319.7zM211.2 246c-4.2002 -4.2002 -4.2998 -11 0 -15.2002
l74.0996 -74.7002c4.2002 -4.2998 11 -4.2998 15.2002 -0.0996094l128.3 127.2c4.2998 4.2002 4.2998 11 0.100586 15.2002l-25.3008 25.5c-4.19922 4.2998 -11 4.2998 -15.1992 0.0996094l-95.2002 -94.4004l-41.2998 41.6006
c-4.2002 4.2998 -11 4.2998 -15.2002 0.0996094z" />
    <glyph glyph-name="water" unicode="&#xf773;" horiz-adv-x="576" 
d="M562.1 64.0996c8.10059 -0.899414 13.9004 -8.2998 13.8008 -16.2998v-31.5996c0 -9.10059 -7.60059 -16.7998 -16.7002 -16c-28.2002 2.5 -55.7998 11.5996 -79.1006 25.7998c-55 -34.0996 -135.5 -34.5996 -192 0c-55 -34.0996 -135.5 -34.5996 -192 0
c-23.2998 -14.5 -50.5996 -23.4004 -79.3994 -25.9004c-9.10059 -0.799805 -16.7002 6.90039 -16.7002 16v32.2002c0 7.90039 5.7002 14.9004 13.5996 15.7002c21.7002 2.2998 42.2002 10.2002 57.7002 22.4004c13.7998 10.8994 33.6006 13.1992 47.1006 2
c38.2998 -31.7002 107.199 -31.8008 145.199 -1.7002c13.7002 10.8994 33.2002 13 46.7002 1.7998c38.5 -31.9004 107.8 -31.9004 145.7 -1.5c14 11.2998 34.0996 11.0996 48.2002 0c15.7998 -12.4004 36.3994 -20.5 57.8994 -22.9004zM562.1 208.1
c8.10059 -0.899414 13.9004 -8.2998 13.8008 -16.2998v-31.5996c0 -9.10059 -7.60059 -16.7998 -16.7002 -16c-28.2002 2.5 -55.7998 11.5996 -79.1006 25.7998c-55 -34.0996 -135.5 -34.5996 -192 0c-55 -34.0996 -135.5 -34.5996 -192 0
c-23.2998 -14.5 -50.5996 -23.4004 -79.3994 -25.9004c-9.10059 -0.799805 -16.7002 6.90039 -16.7002 16v32.2002c0 7.90039 5.7002 14.9004 13.5996 15.7002c21.7002 2.2998 42.2002 10.2002 57.7002 22.4004c13.7998 10.8994 33.6006 13.1992 47.1006 2
c38.2998 -31.7002 107.199 -31.8008 145.199 -1.7002c13.7002 10.8994 33.2002 13 46.7002 1.7998c38.5 -31.9004 107.8 -31.9004 145.7 -1.5c14 11.2998 34.0996 11.0996 48.2002 0c15.7998 -12.4004 36.3994 -20.5 57.8994 -22.9004zM562.1 352.1
c8.10059 -0.899414 13.9004 -8.2998 13.8008 -16.2998v-31.5996c0 -9.10059 -7.60059 -16.7998 -16.7002 -16c-28.2002 2.5 -55.7998 11.5996 -79.1006 25.7998c-55 -34.0996 -135.5 -34.5996 -192 0c-55 -34.0996 -135.5 -34.5996 -192 0
c-23.2998 -14.5 -50.5996 -23.4004 -79.3994 -25.9004c-9.10059 -0.799805 -16.7002 6.90039 -16.7002 16v32.2002c0 7.90039 5.7002 14.9004 13.5996 15.7002c21.7002 2.2998 42.2002 10.2002 57.7002 22.4004c13.7998 10.8994 33.6006 13.1992 47.1006 2
c38.2998 -31.7002 107.199 -31.8008 145.199 -1.7002c13.7002 10.8994 33.2002 13 46.7002 1.7998c38.5 -31.9004 107.8 -31.9004 145.7 -1.5c14 11.2998 34.0996 11.0996 48.2002 0c15.7998 -12.4004 36.3994 -20.4004 57.8994 -22.9004z" />
    <glyph glyph-name="baby" unicode="&#xf77c;" horiz-adv-x="384" 
d="M192 288c-44.2002 0 -80 35.7998 -80 80s35.7998 80 80 80s80 -35.7998 80 -80s-35.7998 -80 -80 -80zM138.6 39.2002l29.4004 -39.2002c13.2002 -17.7002 9.7002 -42.7998 -8 -56c-7.2002 -5.40039 -15.7002 -8 -24 -8c-12.0996 0 -24.0996 5.5 -32 16l-48 64
c-10.9004 14.5996 -10.5996 34.7998 0.799805 49l45.9004 57.4004l61.5 -51.2002zM281.3 122.4l45.9004 -57.4004c11.3994 -14.2002 11.7002 -34.4004 0.799805 -49l-48 -64c-7.7998 -10.5 -19.7998 -16 -32 -16c-8.40039 0 -16.7998 2.59961 -24 8
c-17.7002 13.2002 -21.2002 38.2998 -8 56l29.4004 39.2002l-25.6006 32zM376.7 303c12.7002 -18.0996 8.39941 -43 -9.7002 -55.7998l-40.5996 -28.5c-17 -11.9004 -35.4004 -20.9004 -54.4004 -27.9004v-30.7998h-160v30.9004c-19 7 -37.4004 16 -54.4004 27.8994
l-40.5996 28.5c-18 12.7002 -22.4004 37.6006 -9.7002 55.7002c12.7002 18 37.6006 22.4004 55.7002 9.7002l40.5996 -28.4004c52.6006 -37 124.101 -37 176.801 0l40.5996 28.5c18.0996 12.6006 43 8.2998 55.7002 -9.7998z" />
    <glyph glyph-name="baby-carriage" unicode="&#xf77d;" 
d="M144.8 431l111.2 -175h-256c0 74 35.2998 140.1 90.7998 184.4c16.7998 13.3994 42.7002 8.39941 54 -9.40039zM496 352c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-48v-64c0 -50.5996 -23 -96.4004 -60.2998 -130.7
c34.5996 -8.89941 60.2998 -40 60.2998 -77.2998c0 -44.2002 -35.7998 -80 -80 -80s-80 35.7998 -80 80c0 8.90039 1.7002 17.2002 4.40039 25.2002c-21.5 -5.90039 -44.6006 -9.2002 -68.4004 -9.2002s-46.7998 3.2998 -68.4004 9.2002
c2.60059 -8 4.40039 -16.2998 4.40039 -25.2002c0 -44.2002 -35.7998 -80 -80 -80s-80 35.7998 -80 80c0 37.2998 25.7002 68.4004 60.2998 77.2998c-37.2998 34.2998 -60.2998 80.1006 -60.2998 130.7h384v64c0 35.2998 28.7002 64 64 64h48zM80 -16
c17.5996 0 32 14.4004 32 32s-14.4004 32 -32 32s-32 -14.4004 -32 -32s14.4004 -32 32 -32zM400 16c0 17.5996 -14.4004 32 -32 32s-32 -14.4004 -32 -32s14.4004 -32 32 -32s32 14.4004 32 32z" />
    <glyph glyph-name="biohazard" unicode="&#xf780;" horiz-adv-x="576" 
d="M287.9 336c-18.5 0 -36 -3.7998 -52.5 -9.5c-13.3008 10.2998 -23.6006 24.2998 -29.5 40.7002c25.1992 10.8994 53 16.8994 82.0996 16.8994c29.2002 0 57 -6.09961 82.2002 -17c-5.90039 -16.3994 -16.2002 -30.3994 -29.5 -40.6992
c-16.6006 5.7998 -34.2002 9.59961 -52.7998 9.59961zM163.6 9.2998c-47.5 35.5 -79.1992 90.7002 -83.2998 153.5c7.2998 2.10059 14.9004 3.10059 22.5 3.10059c9.2002 0 17.9004 -1.80078 26.4004 -4.60059c4.09961 -44.2998 26 -83.2002 58.8994 -109.6
c-4.09961 -16 -12.5 -30.6006 -24.5 -42.4004zM387.8 51.9004c32.7002 26.3994 54.6006 65.0996 58.7002 109.3c8.59961 2.7998 17.4004 4.7002 26.5996 4.7002c7.5 0 15 -1 22.2002 -3c-3.89941 -62.8008 -35.5996 -118 -83 -153.5c-12 11.7998 -20.3994 26.5 -24.5 42.5z
M501.3 256.9c34.6006 -20.4004 61 -53.3008 74.1006 -92.4004c1.2998 -3.7002 -0.200195 -7.7998 -3.5 -9.7998c-3.30078 -2 -7.5 -1.2998 -10 1.59961c-9.40039 10.7998 -19 19 -29.2002 25.1006c-57.2998 33.8994 -130.8 13.6992 -163.9 -45
c-33.0996 -58.7002 -13.3994 -134 43.9004 -167.9c10.2002 -6.09961 21.8994 -10.5 35.7998 -13.4004c3.7998 -0.799805 6.40039 -4.19922 6.40039 -8.09961c-0.100586 -4 -2.7002 -7.2998 -6.5 -8c-39.7002 -7.7998 -80.6006 -0.799805 -115.2 19.7002
c-18 10.5996 -32.9004 24.5 -45.2998 40.0996c-12.4004 -15.5996 -27.3008 -29.5 -45.3008 -40.0996c-34.5996 -20.5 -75.5 -27.5 -115.199 -19.7002c-3.80078 0.700195 -6.40039 4 -6.5 8c0 3.90039 2.69922 7.2998 6.39941 8.09961
c13.7998 3 25.6006 7.30078 35.7998 13.4004c57.3008 33.9004 77 109.2 43.9004 167.9c-33.0996 58.6992 -106.6 78.8994 -163.9 45c-10.1992 -6 -19.7998 -14.3008 -29.1992 -25.1006c-2.5 -2.89941 -6.7002 -3.59961 -10 -1.59961
c-3.30078 2.09961 -4.80078 6.09961 -3.5 9.7998c13.2998 39.0996 39.6992 71.9004 74.2998 92.4004c17.5996 10.3994 36.3994 16.5996 55.2998 19.8994c-6.09961 17.7002 -10 36.4004 -10 56.2002c0 41 14.5996 80.7998 41 112.2c2.5 3 6.59961 3.7002 10 1.7998
c3.2998 -1.90039 4.7998 -6 3.59961 -9.7002c-4.39941 -13.7998 -6.59961 -26.3994 -6.59961 -38.5c0 -67.7998 53.7998 -122.899 120 -122.899s120 55.0996 120 122.899c0 12.2002 -2.09961 24.7002 -6.59961 38.5c-1.2002 3.7002 0.299805 7.7998 3.59961 9.7002
c3.40039 1.90039 7.5 1.2002 10 -1.7998c26.5 -31.4004 41 -71.2002 41 -112.2c0 -19.7998 -4 -38.5 -10 -56.2002c19 -3.2998 37.7002 -9.5 55.2998 -19.8994zM287.9 127.9c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48z" />
    <glyph glyph-name="blog" unicode="&#xf781;" 
d="M172.2 221.2c75.5 -15 129.899 -89.2998 112.5 -172.2c-11.4004 -54.2998 -55.2998 -98.2998 -109.7 -109.7c-92.9004 -19.5 -175 51.2002 -175 140.7v248c0 13.2998 10.7002 24 24 24h48c13.2998 0 24 -10.7002 24 -24v-248c0 -26.5 21.5 -48 48 -48s48 21.5 48 48
c0 20.5996 -13.0996 38.2002 -31.2998 45c-9.60059 3.59961 -16.7002 11.7998 -16.7002 22v50.4004c0 14.8994 13.5996 26.6992 28.2002 23.7998zM209 448c163.2 -8.59961 294.4 -139.8 302.9 -303c0.5 -9.2002 -6.80078 -17 -16 -17h-32.1006
c-8.39941 0 -15.3994 6.59961 -15.8994 15c-7.5 129.5 -111.5 234.5 -240.9 241.5c-8.40039 0.400391 -15 7.40039 -15 15.9004v31.5996c0 9.2002 7.7998 16.5 17 16zM209.3 352c110.101 -8.5 198.2 -96.5996 206.601 -206.7
c0.699219 -9.2998 -6.80078 -17.2998 -16.1006 -17.2998h-32.2002c-8.2998 0 -15.0996 6.40039 -15.8994 14.7002c-6.90039 77 -68.1006 138.899 -144.9 145.2c-8.2998 0.599609 -14.7998 7.5 -14.7998 15.8994v32.1006c0 9.39941 8 16.7998 17.2998 16.0996z" />
    <glyph glyph-name="calendar-day" unicode="&#xf783;" horiz-adv-x="448" 
d="M0 -16v272h448v-272c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48zM64 176v-96c0 -8.7998 7.2002 -16 16 -16h96c8.7998 0 16 7.2002 16 16v96c0 8.7998 -7.2002 16 -16 16h-96c-8.7998 0 -16 -7.2002 -16 -16zM400 384c26.5 0 48 -21.5 48 -48v-48h-448v48
c0 26.5 21.5 48 48 48h48v48c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-48h128v48c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-48h48z" />
    <glyph glyph-name="calendar-week" unicode="&#xf784;" horiz-adv-x="448" 
d="M0 -16v272h448v-272c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48zM64 176v-64c0 -8.7998 7.2002 -16 16 -16h288c8.7998 0 16 7.2002 16 16v64c0 8.7998 -7.2002 16 -16 16h-288c-8.7998 0 -16 -7.2002 -16 -16zM400 384c26.5 0 48 -21.5 48 -48v-48h-448
v48c0 26.5 21.5 48 48 48h48v48c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-48h128v48c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-48h48z" />
    <glyph glyph-name="candy-cane" unicode="&#xf786;" 
d="M497.5 356c35.7002 -75.5 2.7998 -166.1 -68.9004 -209l-347.3 -206.5c-5.2002 -3 -10.7998 -4.5 -16.3994 -4.5c-10.9004 0 -21.5 5.59961 -27.5 15.5996l-32.8008 54.9004c-9.09961 15.2002 -4.19922 34.7998 11 43.9004l353.601 210.1
c15.0996 9.09961 20.0996 28.7998 11 43.9004c-6 10 -16.6006 15.5996 -27.5 15.5996c-5.60059 0 -11.2998 -1.40039 -16.4004 -4.5l-27.5 -16.4004c-5.2002 -3 -10.7998 -4.5 -16.3994 -4.5c-10.9004 0 -21.5 5.60059 -27.5 15.6006l-32.8008 54.8994
c-9.09961 15.2002 -4.19922 34.8008 11 43.9004l27.5 16.4004c25.6006 15.2998 53.9004 22.5996 81.8008 22.5996c59.3994 0 117.199 -33.0996 145.1 -92zM319.8 343c8.5 5.09961 18.1006 7.59961 27.9004 8.40039l-20.6006 61.7998
c-10.5 -2.10059 -20.5996 -5.5 -30.2998 -10.2002l20.5 -61.5zM145.9 16.2002l30.7998 18.2998l-60.5 38.5l-30.7998 -18.2998zM253.4 80.0996l30.7998 18.3008l-60.5 38.5l-30.7998 -18.3008zM364.3 146l30.7998 18.2998l-60.5 38.5l-30.7998 -18.2998zM384.7 343.3
c9.2002 -5.39941 17.2002 -13 22.8994 -22.2998l45.7002 45.7002c-6.59961 8.5 -14.2002 16.0996 -22.5996 22.5996zM466.8 235.5c4.60059 9.7998 8 20 10.1006 30.4004l-60.4004 20.0996c-0.0996094 -4.5 -0.700195 -9.09961 -1.7998 -13.5996
c-1.60059 -6.2002 -4.2002 -11.8008 -7.40039 -17.1006z" />
    <glyph glyph-name="carrot" unicode="&#xf787;" 
d="M298.2 291.4c61.7002 -30.1006 87.2998 -104.5 57.2002 -166.2c-12.6006 -25.7998 -33.1006 -45.4004 -57.1006 -57.1006l-102 -49.7998l-57 57c-6.2002 6.2002 -16.2998 6.2002 -22.5996 0s-6.2998 -16.3994 0 -22.5996l49.2002 -49.2002l-133.601 -65.2002
c-11.0996 -5.39941 -24.5996 -0.799805 -30 10.2998c-3.09961 6.40039 -2.89941 13.7002 0 19.7002l128.101 262.7l50.1992 -50.2002c3.10059 -3.09961 7.2002 -4.7002 11.3008 -4.7002c4.09961 0 8.19922 1.60059 11.2998 4.7002c6.2998 6.2002 6.2998 16.2998 0 22.6006
l-55.2002 55.1992c35.7002 43.3008 97.5 58.5 150.2 32.8008zM390.3 326.3c40.7002 19.5 88.7998 9.40039 121.7 -30.2998c-41.5996 -50.2998 -107.5 -52.5 -151.9 -7.90039l-8 8c-44.5996 44.4004 -42.3994 110.2 7.90039 151.9
c39.7002 -32.9004 49.7998 -81 30.2998 -121.7z" />
    <glyph glyph-name="cash-register" unicode="&#xf788;" 
d="M511.1 69.2002c0.600586 -3.5 0.900391 -7 0.800781 -10.5v-90.7002c0 -17.7002 -14.3008 -32 -32 -32h-448c-17.7002 0 -32 14.2998 -32 32v90.7998c0 3.5 0.299805 7 0.899414 10.5l26.7002 160c2.59961 15.4004 16 26.7002 31.5996 26.7002h84.9004v64h-96
c-8.7998 0 -16 7.2002 -16 16v96c0 8.7998 7.2002 16 16 16h256c8.7998 0 16 -7.2002 16 -16v-96.0996c0 -8.80078 -7.2002 -16 -16 -16h-96v-64h244.8c15.7002 0 29 -11.3008 31.6006 -26.7002zM280 200v-16c0 -8.7998 7.2002 -16 16 -16h16c8.7998 0 16 7.2002 16 16v16
c0 8.7998 -7.2002 16 -16 16h-16c-8.7998 0 -16 -7.2002 -16 -16zM248 136c-8.7998 0 -16 -7.2002 -16 -16v-16c0 -8.7998 7.2002 -16 16 -16h16c8.7998 0 16 7.2002 16 16v16c0 8.7998 -7.2002 16 -16 16h-16zM216 216h-16c-8.7998 0 -16 -7.2002 -16 -16v-16
c0 -8.7998 7.2002 -16 16 -16h16c8.7998 0 16 7.2002 16 16v16c0 8.7998 -7.2002 16 -16 16zM80 368h192v32h-192v-32zM120 168c8.7998 0 16 7.2002 16 16v16c0 8.7998 -7.2002 16 -16 16h-16c-8.7998 0 -16 -7.2002 -16 -16v-16c0 -8.7998 7.2002 -16 16 -16h16zM136 104
c0 -8.7998 7.2002 -16 16 -16h16c8.7998 0 16 7.2002 16 16v16c0 8.7998 -7.2002 16 -16 16h-16c-8.7998 0 -16 -7.2002 -16 -16v-16zM352 -8v16c0 4.40039 -3.59961 8 -8 8h-176c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h176c4.40039 0 8 3.59961 8 8
zM376 104v16c0 8.7998 -7.2002 16 -16 16h-16c-8.7998 0 -16 -7.2002 -16 -16v-16c0 -8.7998 7.2002 -16 16 -16h16c8.7998 0 16 7.2002 16 16zM424 184v16c0 8.7998 -7.2002 16 -16 16h-16c-8.7998 0 -16 -7.2002 -16 -16v-16c0 -8.7998 7.2002 -16 16 -16h16
c8.7998 0 16 7.2002 16 16z" />
    <glyph glyph-name="compress-arrows-alt" unicode="&#xf78c;" 
d="M200 160c13.2998 0 24 -10.7002 24 -24v-112c0 -21.4004 -25.7998 -32.0996 -40.9004 -17l-31.0996 33l-99.2998 -99.2998c-6.2002 -6.2002 -16.4004 -6.2002 -22.6006 0l-25.3994 25.3994c-6.2002 6.2002 -6.2002 16.4004 0 22.6006l99.2002 99.2998l-32.9004 31
c-15.0996 15.2002 -4.40039 41 17 41h112zM312 224c-13.2998 0 -24 10.7002 -24 24v112c0 21.4004 25.7998 32.0996 40.9004 17l31.0996 -33l99.2998 99.2998c6.2002 6.2002 16.4004 6.2002 22.6006 0l25.3994 -25.3994c6.2002 -6.2002 6.2002 -16.4004 0 -22.6006
l-99.2998 -99.2998l33 -31c15.0996 -15.0996 4.40039 -41 -17 -41h-112zM408 88l99.2998 -99.4004c6.2002 -6.19922 6.2002 -16.3994 0 -22.5996l-25.3994 -25.4004c-6.2002 -6.19922 -16.4004 -6.19922 -22.6006 0l-99.2998 99.3008l-31 -32.9004
c-15.0996 -15.0996 -41 -4.40039 -41 17v112c0 13.2998 10.7002 24 24 24h112c21.4004 0 32.0996 -25.7998 17 -40.9004zM183 376.9c15.0996 15.0996 41 4.39941 41 -16.9004v-112c0 -13.2998 -10.7002 -24 -24 -24h-112c-21.4004 0 -32.0996 25.7998 -17 40.9004
l33 31.0996l-99.2998 99.2998c-6.2002 6.2002 -6.2002 16.4004 0 22.6006l25.3994 25.3994c6.2002 6.2002 16.4004 6.2002 22.6006 0l99.2998 -99.2998z" />
    <glyph glyph-name="dumpster" unicode="&#xf793;" horiz-adv-x="576" 
d="M560 288h-97.2998l-25.6006 128h98.9004c7.2998 0 13.7002 -5 15.5 -12.0996l24 -96c2.5 -10.1006 -5.09961 -19.9004 -15.5 -19.9004zM272 416v-128h-126.1l25.5996 128h100.5zM404.5 416l25.5996 -128h-126.1v128h100.5zM16 288c-10.4004 0 -18 9.7998 -15.5 19.9004
l24 96c1.7998 7.09961 8.2002 12.0996 15.5 12.0996h98.9004l-25.6006 -128h-97.2998zM560 224c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-28l-20 -160v-16c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v16h-320v-16
c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v16l-20 160h-28c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h20l-4 32h512l-4 -32h20z" />
    <glyph glyph-name="dumpster-fire" unicode="&#xf794;" horiz-adv-x="640" 
d="M418.7 343.9c-19.7002 -17.6006 -37.7002 -36.5 -53.9004 -55.8008h-60.7998v128h100.5l14.4004 -72zM272 416v-128h-126.1l25.5996 128h100.5zM461.3 343.9l-11.8994 10.5996l-12.3008 61.5h98.9004c7.2998 0 13.7002 -5 15.4004 -12.0996l24 -96
c0.199219 -0.800781 -0.100586 -1.5 0 -2.30078c-1 1 -2 2.2002 -3.10059 3.10059l-21.2998 19l-21.2998 -19c-5.90039 -5.2002 -11.6006 -10.7002 -17.2998 -16.2998c-15.6006 17.7998 -32.9004 35.1992 -51.1006 51.5zM16 288c-10.4004 0 -18 9.7998 -15.5 19.9004l24 96
c1.7998 7.09961 8.2002 12.0996 15.5 12.0996h98.9004l-25.6006 -128h-97.2998zM340.6 256c-32.6992 -46.7002 -52.5996 -93.7002 -52.5996 -129.6c0 -48.5 18.5996 -92.7002 48.7998 -126.4h-208.8v-16c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v16
l-20 160h-28c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h20l-4 32h308.6zM551.1 284.8c51.8008 -46.2002 88.9004 -121.8 88.8008 -158.399c0 -87.5 -71.6006 -158.4 -160 -158.4c-88.4004 0 -160 70.9004 -160 158.4c0 49.2998 49.7998 130.899 120 193.6
c27.3994 -24.4004 51.5 -50.5996 71 -76.4004c11.8994 14 25.2998 27.9004 40.1992 41.2002zM532.5 55.4004c33.4004 24.1992 41.2002 71.0996 22.5996 107.8c-2.2998 4.5 -4.89941 9.2002 -7.69922 14l-39.8008 -47s-62.3994 82.5 -67.0996 88.0996
c-32.9004 -40.8994 -49.4004 -64.7998 -49.4004 -91.8994c0 -54.5 39.9004 -88 88.9004 -88c19.5996 0 37.7998 6.2998 52.5 17z" />
    <glyph glyph-name="ethernet" unicode="&#xf796;" 
d="M496 256c8.7998 0 16 -7.2002 16 -16v-224c0 -8.7998 -7.2002 -16 -16 -16h-80v128h-32v-128h-64v128h-32v-128h-64v128h-32v-128h-64v128h-32v-128h-80c-8.7998 0 -16 7.2002 -16 16v224c0 8.7998 7.2002 16 16 16h48v48c0 8.7998 7.2002 16 16 16h48v48
c0 8.7998 7.2002 16 16 16h224c8.7998 0 16 -7.2002 16 -16v-48h48c8.7998 0 16 -7.2002 16 -16v-48h48z" />
    <glyph glyph-name="gifts" unicode="&#xf79c;" horiz-adv-x="640" 
d="M240.6 253.9c-27.7998 -6.90039 -48.5996 -32 -48.5996 -61.9004v-224c0 -11.7002 3.40039 -22.5 8.90039 -32h-168.9c-17.7002 0 -32 14.2998 -32 32v352c0 17.7002 14.2998 32 32 32h29.4004l-30.7002 22c-7.2002 5.09961 -8.7998 15.0996 -3.7002 22.2998l9.2998 13
c5.10059 7.2002 15.1006 8.7998 22.2998 3.7002l32.1006 -22.7998l-11.5 30.5996c-3.2002 8.2002 1 17.5 9.2998 20.6006l15 5.59961c8.2998 3.09961 17.5 -1.09961 20.5996 -9.40039l19.9004 -53.0996l19.9004 53c3.09961 8.2998 12.2998 12.5 20.5996 9.40039l15 -5.60059
c8.2998 -3.09961 12.5 -12.2998 9.40039 -20.5996l-11.5 -30.6006l32 22.9004c7.19922 5.2002 17.1992 3.5 22.2998 -3.7002l9.2998 -13c5.2002 -7.2002 3.5 -17.2002 -3.7002 -22.2998l-30.7002 -22h29.4004c12.7002 0 23.4004 -7.5 28.5996 -18.2998
c-26.6992 -18.6006 -42.0996 -49 -44 -79.7998zM224 -32v96h192v-128h-160c-17.7002 0 -32 14.2998 -32 32zM448 -64v128h192v-96c0 -17.7002 -14.2998 -32 -32 -32h-160zM608 224c17.7002 0 32 -14.2998 32 -32v-96h-192v128h-15.2998l-0.700195 0.200195
l-0.700195 -0.200195h-15.2998v-128h-192v96c0 17.7002 14.2998 32 32 32h20.4004c-2.7002 7.59961 -4.40039 15.5 -4.40039 23.7998c0 35.5 27 72.2002 72.0996 72.2002c48 0 75.8008 -47.7002 87.9004 -75.2998c12 27.5996 39.7998 75.2998 87.9004 75.2998
c45.0996 0 72.0996 -36.7002 72.0996 -72.2002c0 -8.2998 -1.7998 -16.2002 -4.40039 -23.7998h20.4004zM336 224h52.5996c-8.89941 20.5996 -25.7998 48 -44.5 48c-17.6992 0 -24.0996 -14.5 -24.0996 -24.2002c0 -5.2002 1.5 -12.5996 8.7998 -19
c2.10059 -1.7998 4.5 -3.39941 7.2002 -4.7998zM535.2 228.8c7.2998 6.40039 8.7998 13.7998 8.7998 19c0 9.7002 -6.40039 24.2002 -24.0996 24.2002c-18.7002 0 -35.7002 -27.7002 -44.5 -48h52.5996c2.7002 1.40039 5.09961 3 7.2002 4.7998z" />
    <glyph glyph-name="glass-cheers" unicode="&#xf79f;" horiz-adv-x="640" 
d="M639.4 14.4004c1.69922 -4.10059 -0.300781 -8.7002 -4.30078 -10.4004l-162.399 -67.4004c-4 -1.69922 -8.7002 0.200195 -10.4004 4.30078c-8.5 20.3994 1.2002 43.7998 21.6006 52.2998l22.0996 9.2002l-39.2998 103.6
c-4.40039 -0.5 -8.7998 -1.2998 -13.1006 -1.2998c-51.6992 0 -99.3994 33.0996 -113.399 85.2998l-20.2002 75.4004l-20.2002 -75.4004c-14 -52.2002 -61.7002 -85.2998 -113.399 -85.2998c-4.30078 0 -8.7002 0.799805 -13.1006 1.2998l-39.3994 -103.6l22.0996 -9.2002
c20.4004 -8.5 30 -31.9004 21.5996 -52.2998c-1.69922 -4.10059 -6.2998 -6 -10.3994 -4.30078l-162.3 67.4004c-4.10059 1.7002 -6 6.40039 -4.30078 10.5c8.5 20.4004 31.8008 30.0996 52.2002 21.5996l22.1006 -9.19922l38.6992 101.899
c-47.8994 34.9004 -64.6992 100.2 -34.5 152.7l86.6006 150.5c8 13.9004 25.0996 19.7998 40 13.5996l114.3 -47.3994l114.3 47.3994c14.9004 6.10059 32 0.300781 40 -13.5996l86.6006 -150.5c30.2998 -52.5 13.3994 -117.8 -34.5 -152.8l38.6992 -101.9l22.1006 9.2002
c20.3994 8.5 43.7998 -1.2002 52.2002 -21.5996zM275.9 285.9l18.8994 70.6992l-94.5 39.2002l-36.5 -63.3994zM364.1 285.9l112.101 46.5l-36.5 63.3994l-94.5 -39.2002z" />
    <glyph glyph-name="glass-whiskey" unicode="&#xf7a0;" 
d="M480 416c19.5 0 34.4004 -17.2002 31.7002 -36.5l-55.6006 -356.5c-4.5 -31.5 -31.5996 -54.9004 -63.3994 -54.9004h-273c-31.9004 0 -58.9004 23.4004 -63.4004 54.9004l-56 356.5c-2.7002 19.2998 12.2002 36.5 31.7002 36.5h448zM442.6 352h-373.199l30.1992 -192
h313z" />
    <glyph glyph-name="globe-europe" unicode="&#xf7a2;" horiz-adv-x="496" 
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM448 192c0 110.3 -89.7002 200 -200.2 200c-1.89941 0 -3.7998 -0.200195 -5.7002 -0.299805l-28.8994 -21.7002c-2 -1.5 -3.2002 -3.90039 -3.2002 -6.40039v-20
c0 -4.39941 3.59961 -8 8 -8h16c4.40039 0 8 3.60059 8 8v8l16 16h20.7002c6.2002 0 11.2998 -5.09961 11.2998 -11.2998c0 -3 -1.2002 -5.89941 -3.2998 -8l-26.7998 -26.7998c-1.2002 -1.2002 -2.7002 -2.09961 -4.40039 -2.7002l-40 -13.2998
c-3.2998 -1.09961 -5.5 -4.2002 -5.5 -7.59961c0 -6.60059 -2.59961 -12.9004 -7.2002 -17.5l-20.0996 -20.1006c-3 -3 -4.7002 -7.09961 -4.7002 -11.2998v-25.2998c0 -8.7998 7.2002 -16 16 -16h22.0996c6.10059 0 11.6006 3.39941 14.3008 8.7998l9.39941 18.7002
c1.40039 2.7002 4.2002 4.39941 7.2002 4.39941h3.09961c4.40039 0 8 -3.59961 8 -8c0 -4.39941 3.60059 -8 8 -8h16c4.40039 0 8 3.60059 8 8v2.2002c0 3.5 2.2002 6.5 5.5 7.60059l31.6006 10.5c6.5 2.19922 10.8994 8.2998 10.8994 15.1992v4.5
c0 8.80078 7.2002 16 16 16h36.7002c6.2002 0 11.2998 -5.09961 11.2998 -11.2998v-9.39941c0 -6.2002 -5.09961 -11.3008 -11.2998 -11.3008h-32c-3 0 -5.89941 -1.19922 -8 -3.2998l-9.39941 -9.39941c-2.10059 -2.10059 -3.30078 -5 -3.30078 -8
c0 -6.2002 5.10059 -11.3008 11.3008 -11.3008h16c3 0 5.89941 -1.19922 8 -3.2998l9.39941 -9.39941c2.10059 -2.10059 3.2998 -5 3.2998 -8v-8.7002l-12.5 -12.5c-4.59961 -4.60059 -4.59961 -12.1006 -0.0996094 -16.7002l32 -32.5996
c3 -3.10059 7.09961 -4.80078 11.4004 -4.80078h20.2998c6.89941 20.2002 10.7998 41.9004 10.7998 64.4004zM130.1 298.9c0 -6.2002 5.10059 -11.3008 11.3008 -11.3008h16c3 0 5.89941 1.2002 8 3.30078l9.39941 9.39941c2.10059 2.10059 3.2998 5 3.2998 8v16
c0 6.2002 -5.09961 11.2998 -11.2998 11.2998c-3 0 -5.89941 -1.19922 -8 -3.2998l-25.3994 -25.3994c-2.10059 -2.10059 -3.30078 -5 -3.30078 -8zM258.1 -7.5c71.1006 3.59961 132.5 44.2002 164.9 103.1h-13.4004c-4.7998 0 -9.5 1.90039 -12.8994 5.30078
l-17.2998 17.2998c-6 6 -14.1006 9.39941 -22.6006 9.39941h-18.2998l-43.2002 37.1006c-8.2002 7 -18.7002 10.8994 -29.5996 10.8994h-31.2002c-8.2002 0 -16.2998 -2.2998 -23.4004 -6.5l-42.8994 -25.6992c-13.7002 -8.2002 -22.1006 -23 -22.1006 -39v-23.9004
c0 -14.2998 6.7002 -27.7998 18.2002 -36.4004l22.2002 -16.6992c8.7002 -6.5 24.5996 -11.8008 35.4004 -11.8008h20.1992c8.80078 0 16 -7.19922 16 -16v-7.09961z" />
    <glyph glyph-name="grip-lines" unicode="&#xf7a4;" 
d="M496 160c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-480c-8.7998 0 -16 7.2002 -16 16v32c0 8.7998 7.2002 16 16 16h480zM496 288c8.7998 0 16 -7.2002 16 -16v-32c0 -8.7998 -7.2002 -16 -16 -16h-480c-8.7998 0 -16 7.2002 -16 16v32
c0 8.7998 7.2002 16 16 16h480z" />
    <glyph glyph-name="grip-lines-vertical" unicode="&#xf7a5;" horiz-adv-x="256" 
d="M96 -48c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v480c0 8.7998 7.2002 16 16 16h32c8.7998 0 16 -7.2002 16 -16v-480zM224 -48c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v480c0 8.7998 7.2002 16 16 16h32
c8.7998 0 16 -7.2002 16 -16v-480z" />
    <glyph glyph-name="guitar" unicode="&#xf7a6;" 
d="M502.63 409c5.15625 -5.1709 9.33984 -15.293 9.33984 -22.5947c0 -7.31543 -4.19727 -17.4521 -9.37012 -22.625l-46.3301 -46.3203c-3.24707 -3.25684 -9.4248 -7.07812 -13.7891 -8.53027l-36.4805 -12.1602l-76.2402 -76.2393
c8.79004 -12.2002 15.7705 -25.5605 19.1602 -40.2002c7.74023 -33.3896 0.870117 -66.8701 -22 -89.75c-7.87793 -7.8418 -22.877 -16.9141 -33.4795 -20.25c-18.54 -6.00977 -32.6709 -23.29 -34.4307 -42.1396c-2.29004 -23.8105 -11.4502 -45.8301 -28.4502 -62.71
c-45.5596 -45.4805 -127.5 -37.3809 -182.979 18.0693c-55.4805 55.4502 -63.6904 137.45 -18.0498 182.96c16.8799 16.9902 38.9102 26.1699 62.6094 28.4404c18.9404 1.76953 36.1504 15.8994 42.1504 34.46c3.33105 10.6016 12.3984 25.5957 20.2402 33.4697
c22.8799 22.8799 56.4297 29.7803 89.8799 22c14.5996 -3.39941 27.9395 -10.3799 40.0996 -19.1396l76.2598 76.2598l12.1602 36.5098c1.45215 4.36426 5.27344 10.542 8.53027 13.79l46.2803 46.3301c5.17383 5.1748 15.3115 9.375 22.6299 9.375
c7.31738 0 17.4561 -4.2002 22.6299 -9.375zM208 96c26.4961 0 48 21.5039 48 48s-21.5039 48 -48 48s-48 -21.5039 -48 -48s21.5039 -48 48 -48z" />
    <glyph glyph-name="heart-broken" unicode="&#xf7a9;" 
d="M473.7 374.2c48.7002 -49.7998 50.7998 -129.101 7.2998 -182.101l-212.2 -218.699c-7.09961 -7.30078 -18.5996 -7.30078 -25.7002 0l-212.1 218.6c-43.5 53.0996 -41.4004 132.4 7.2998 182.2l2.40039 2.39941c46.2998 47.4004 119 51.8008 170.7 14l28.5996 -86.5
l-96 -64l144 -144l-48 128l96 64l-34.2998 103.4c51.5996 36.9004 123.6 32.2002 169.6 -14.7998z" />
    <glyph glyph-name="holly-berry" unicode="&#xf7aa;" horiz-adv-x="448" 
d="M144 256c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM256 304c0 26.5 21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48s-48 21.5 -48 48zM224 352c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48z
M207.8 212.9c-0.399414 -39.8008 7.40039 -78.1006 22.9004 -112.301c4 -8.89941 -2 -19.1992 -11.7002 -20.1992c-15.2002 -1.5 -30.4004 -4.60059 -45.2998 -9.10059c-14.9004 -4.5 -23.7998 -19.8994 -20.2002 -35.0996s8.5 -29.9004 14.7002 -43.7998
c4 -8.90039 -1.90039 -19.3008 -11.6006 -20.2002c-35.8994 -3.40039 -71.5996 -14.9004 -104.8 -33.9004c-12.3994 -7.09961 -27.5 1.60059 -27.5996 16c-0.100586 38.2002 -8 74.9004 -23 107.7c-4 8.90039 2 19.2002 11.7002 20.2002
c15.1992 1.5 30.3994 4.59961 45.2998 9.09961c14.8994 4.5 23.7998 19.9004 20.2002 35.1006c-3.60059 15.1992 -8.5 29.8994 -14.7002 43.7998c-4 8.89941 1.89941 19.2998 11.5996 20.2002c37.2998 3.5 74.4004 15.8994 108.7 36.1992
c10.7002 6.40039 23.9004 -1.2998 23.7998 -13.6992zM435 82.4004c9.7002 -1 15.7998 -11.4004 11.5 -20.1006c-15 -32.7002 -22.7998 -69.5 -23 -107.7c0 -14.3994 -15.0996 -23.0996 -27.5996 -16c-33.2002 19 -68.9004 30.5 -104.801 33.9004
c-9.69922 0.900391 -15.5996 11.2998 -11.5996 20.2002c6.2002 14 11.0996 28.5996 14.7002 43.7998c3.59961 15.2002 -5.2998 30.5996 -20.2002 35.0996c-4.90039 1.5 -9.90039 2.5 -14.7998 3.7002c5.7998 12.2998 6.2998 26.5 0.599609 38.9004
c-12.8994 28.2998 -19.7002 60.7002 -19.8994 94c0 1.7002 0.199219 3.2998 0.199219 4.89941c-0.0996094 12.3008 13.1006 20 23.8008 13.7002c34.2998 -20.2998 71.3994 -32.7002 108.699 -36.2002c9.7002 -0.899414 15.6006 -11.2998 11.6006 -20.1992
c-6.2002 -14 -11.1006 -28.6006 -14.7002 -43.8008c-3.59961 -15.1992 5.2998 -30.5996 20.2002 -35.0996c15 -4.40039 30.0996 -7.5 45.2998 -9.09961z" />
    <glyph glyph-name="horse-head" unicode="&#xf7ab;" 
d="M509.8 115.5c4.60059 -11.7998 1.7998 -25.2998 -7.09961 -34.4004l-45.2998 -39.7998c-6 -6 -14.1006 -9.39941 -22.6006 -9.39941h-50.2998c-10.2998 0 -20 4.89941 -26 13.2998l-46 63.8994c-13.7998 -8.09961 -29.5996 -13.1992 -46.7998 -13.1992
c-39.2002 0 -72.6006 23.6992 -87.4004 57.3994c-2.2998 5.10059 -9 6.2998 -12.8994 2.40039l-12.1006 -12.1006c-2.5 -2.39941 -3.2002 -6.19922 -1.59961 -9.2998c19.7002 -38.8994 58.7002 -66.0996 104.3 -69.5996v-0.700195l40.7998 -81.7002
c10.7002 -21.2998 -4.7998 -46.2998 -28.5996 -46.2998h-236.2c-17.7002 0 -32 14.2998 -32 32v81.2002c0 159.899 35.9004 275.399 166.9 322.5l202.199 75.7002c4.90039 1.7998 10.7002 -1.10059 12 -6.10059c12.1006 -46.3994 -16.1992 -71.7002 -34.1992 -82.2998
c42.5996 -8.2002 78.0996 -38 93 -79.2002zM328 224c13.2998 0 24 10.7002 24 24s-10.7002 24 -24 24s-24 -10.7002 -24 -24s10.7002 -24 24 -24z" />
    <glyph glyph-name="icicles" unicode="&#xf7ad;" 
d="M511.4 410.1l-87.5 -467.699c-1.7002 -8.60059 -14 -8.60059 -15.7002 0l-66.7002 363.8l-45.7998 -172.5c-2.2998 -7.60059 -13 -7.60059 -15.2998 0l-34.1006 133.399l-46.5 -196.899c-1.89941 -8.2998 -13.7002 -8.2998 -15.5996 0l-44.2002 187.3l-36.4004 -124.1
c-2.39941 -7.2002 -12.5996 -7.2002 -15.0996 0l-87.0996 273.399c-6.2002 20.5 9.19922 41.2002 30.5996 41.2002h448c20 0 35.0996 -18.2002 31.4004 -37.9004z" />
    <glyph glyph-name="igloo" unicode="&#xf7ae;" horiz-adv-x="576" 
d="M320 414.1v-126.1h-271.4c51.6006 77.2002 139.601 128 239.4 128c10.7998 0 21.5 -0.700195 32 -1.90039zM96 256v-128h-96c0 46 11.0996 89.4004 30.2998 128h65.7002zM352 408.6c72.7998 -16.5 135.2 -60.5 175.4 -120.6h-175.4v120.6zM480 128v128h65.7002
c19.2002 -38.5996 30.2998 -82 30.2998 -128h-96zM416 64c0 11.0996 -1.90039 21.7002 -4.5 32h164.5v-96c0 -17.7002 -14.2998 -32 -32 -32h-128v96zM448 256v-128h-49.7998c-22.2002 38.0996 -63 64 -110.2 64s-88 -25.9004 -110.2 -64h-49.7998v128h320zM0 0v96h164.5
c-2.59961 -10.2998 -4.5 -20.9004 -4.5 -32v-96h-128c-17.7002 0 -32 14.2998 -32 32zM288 160c53 0 96 -43 96 -96v-96h-192v96c0 53 43 96 96 96z" />
    <glyph glyph-name="mitten" unicode="&#xf7b5;" horiz-adv-x="448" 
d="M368 32c8.7998 0 16 -7.2002 16 -16v-64c0 -8.7998 -7.2002 -16 -16 -16h-320c-8.7998 0 -16 7.2002 -16 16v64c0 8.7998 7.2002 16 16 16h320zM425 241.1c27.0996 -22.5996 30.7998 -62.8994 8.09961 -90.0996l-72.5 -87h-309l-47.8994 207.6
c-17.9004 77.5 30.5 154.801 107.899 172.7c77.4004 17.9004 154.801 -30.5 172.801 -108l29.5996 -128.399l20.9004 25c22.5996 27.1992 62.8994 30.7998 90.0996 8.19922z" />
    <glyph glyph-name="mug-hot" unicode="&#xf7b6;" 
d="M127.1 301.5c-2.69922 16.5996 -10.3994 31.9004 -22.3994 44.0996c-22.6006 23.1006 -36.7002 52.5 -40.6006 84.4004c-1.09961 9.5 6.5 18 16.3008 18h16.3994c8.2002 0 15 -5.90039 16.1006 -13.7998c2.7998 -20.2002 12 -38.7998 26.3994 -53.5
c20.2002 -20.5 32.7998 -46.5 36.6006 -74.7002c1.2998 -9.5 -6.5 -18 -16.3008 -18h-16.5c-8 0 -14.6992 5.7998 -16 13.5zM239.1 301.5c-2.69922 16.5996 -10.3994 31.9004 -22.3994 44.0996c-22.6006 23.1006 -36.7002 52.5 -40.6006 84.4004
c-1.19922 9.5 6.5 18 16.3008 18h16.3994c8.2002 0 15 -5.90039 16.1006 -13.7998c2.7998 -20.2002 12 -38.7998 26.3994 -53.5c20.2002 -20.5 32.7998 -46.5 36.6006 -74.7002c1.2998 -9.5 -6.5 -18 -16.3008 -18h-16.5c-8 0 -14.6992 5.7998 -16 13.5zM400 256
c61.7998 0 112 -50.2002 112 -112s-50.2002 -112 -112 -112h-16c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 17.7002 14.2998 32 32 32h368zM400 96c26.5 0 48 21.5 48 48s-21.5 48 -48 48h-16v-96h16z" />
    <glyph glyph-name="radiation" unicode="&#xf7b9;" horiz-adv-x="496" 
d="M328.2 192.2c0 28.5996 -15.2002 53.5 -37.7998 67.7998l80.3994 128.4c4.7998 7.69922 15.2998 10.0996 22.7002 4.7998c58.0996 -42 97.4004 -108.4 102.5 -184.2c0.599609 -9.09961 -7.09961 -16.7998 -16.2002 -16.7998h-151.6zM290.4 124.5l80.3994 -128.5
c4.7998 -7.59961 2.40039 -18.0996 -5.59961 -22.4004c-34.9004 -18.7998 -74.7998 -29.5996 -117.2 -29.5996s-82.2998 10.7998 -117.2 29.5996c-8 4.30078 -10.3994 14.7002 -5.59961 22.4004l80.3994 128.5c12.4004 -7.7002 26.8008 -12.4004 42.4004 -12.4004
s30.0996 4.7002 42.4004 12.4004zM248 144.2c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM16.2002 192.2c-9.10059 0 -16.7998 7.7002 -16.2002 16.7002c5.09961 75.7998 44.4004 142.199 102.5 184.199
c7.40039 5.40039 17.9004 2.90039 22.7002 -4.7998l80.3994 -128.399c-22.5996 -14.2002 -37.7998 -39.1006 -37.7998 -67.7002h-151.6z" />
    <glyph glyph-name="radiation-alt" unicode="&#xf7ba;" horiz-adv-x="496" 
d="M312 192c0 22.7998 -12.0996 42.7998 -30.0996 54l41.6992 66.7998c5.2002 8.2998 16.4004 9.90039 24 3.7998c32.5 -26 54.9004 -64.1992 59.5 -107.8c0.900391 -9.09961 -6.7998 -16.7998 -16 -16.7998h-79.0996zM214.2 137.9
c9.7998 -6.2002 21.5 -9.90039 33.8994 -9.90039c12.4004 0 24 3.7002 33.8008 9.90039l41.7998 -66.9004c4.7998 -7.7998 2.39941 -18.4004 -5.7998 -22.5c-21.2002 -10.4004 -44.8008 -16.5 -69.9004 -16.5s-48.7002 6.09961 -69.7998 16.5
c-8.2002 4.09961 -10.7002 14.7002 -5.7998 22.5zM104.9 192c-9.2002 0 -17 7.7002 -15.9004 16.9004c4.59961 43.5996 26.9004 81.7998 59.5 107.8c7.59961 6.09961 18.7998 4.5 24 -3.7998l41.7002 -66.8008c-18.1006 -11.2998 -30.2002 -31.2998 -30.2002 -54.0996
h-79.0996zM248 -56c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248s-111 -248 -248 -248zM248 376c-101.5 0 -184 -82.5 -184 -184s82.5 -184 184 -184s184 82.5 184 184s-82.5 184 -184 184zM248 160c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
s32 -14.2998 32 -32s-14.2998 -32 -32 -32z" />
    <glyph glyph-name="restroom" unicode="&#xf7bd;" horiz-adv-x="640" 
d="M128 320c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM512 320c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM639.3 93.5c3.7002 -15.0996 -8.2998 -29.5 -24.5 -29.5
h-54.7998v-104c0 -13.2998 -10.7002 -24 -24 -24h-48c-13.2998 0 -24 10.7002 -24 24v104h-54.7998c-16.2002 0 -28.2002 14.4004 -24.7002 29.5l45.5996 185.8c3.30078 13.5 15.5 23 29.8008 24.2002c15 -9.7002 32.7998 -15.5 52 -15.5c19.1992 0 37 5.7998 52 15.5
c14.2998 -1.2002 26.5 -10.7002 29.7998 -24.2002zM336 448c8.7998 0 16 -7.2002 16 -16v-480c0 -8.7998 -7.2002 -16 -16 -16h-32c-8.7998 0 -16 7.2002 -16 16v480c0 8.7998 7.2002 16 16 16h32zM180.1 303.6c24.6006 -2.09961 43.9004 -22.5 43.9004 -47.5996v-136
c0 -13.2998 -10.7002 -24 -24 -24h-8v-136c0 -13.2998 -10.7002 -24 -24 -24h-80c-13.2998 0 -24 10.7002 -24 24v136h-8c-13.2998 0 -24 10.7002 -24 24v136c0 25.0996 19.2998 45.5 43.9004 47.5996c15 -9.7998 32.8994 -15.5996 52.0996 -15.5996
s37.0996 5.7998 52.0996 15.5996z" />
    <glyph glyph-name="satellite" unicode="&#xf7bf;" 
d="M502.609 137.958l-96.7041 -96.7168c-5.15039 -5.13184 -15.2324 -9.29785 -22.5029 -9.29785c-7.27148 0 -17.3535 4.16602 -22.5039 9.29785l-80.3262 80.418l-9.89258 -9.9082c9.41016 -20.7256 17.0469 -56.0186 17.0469 -78.7803
c0 -26.3193 -10.0596 -66.5244 -22.4541 -89.7422c-4.50098 -8.50098 -16.3936 -9.59473 -23.207 -2.79785l-107.519 107.515l-17.7998 -17.7988c0.703125 -2.60938 1.60938 -5.00098 1.60938 -7.79785v-0.000976562c0 -17.667 -14.3379 -32.0059 -32.0049 -32.0059
s-32.0059 14.3389 -32.0059 32.0059s14.3389 32.0049 32.0059 32.0049c2.79688 0 5.18848 -0.90625 7.79785 -1.60938l17.7998 17.7998l-107.518 107.515c-6.79883 6.8125 -5.7041 18.6113 2.79688 23.2061c23.2197 12.3936 63.4248 22.4531 89.7451 22.4531
c22.7627 0 58.0576 -7.63672 78.7832 -17.0469l9.79883 9.79883l-80.3105 80.417c-5.13086 5.16602 -9.29395 15.2686 -9.29395 22.5498s4.16309 17.3838 9.29395 22.5498l96.7197 96.7168c5.11621 5.13281 15.1514 9.29785 22.3984 9.29785h0.105469h0.0449219
c7.28223 0 17.3857 -4.16602 22.5527 -9.29785l80.3262 -80.3076l47.8047 47.8965c5.43262 5.42773 16.0742 9.83398 23.7539 9.83398s18.3213 -4.40625 23.7539 -9.83398l47.5088 -47.5059c5.42188 -5.43555 9.82129 -16.0771 9.82129 -23.7539
s-4.39941 -18.3184 -9.82129 -23.7529l-47.8057 -47.8975l80.3105 -80.417c5.12305 -5.13672 9.28125 -15.1934 9.28125 -22.4482c0 -7.30469 -4.20703 -17.4111 -9.39062 -22.5576zM219.562 250.567l73.8252 73.8223l-68.918 68.8994l-73.8096 -73.8066zM457.305 160.461
l-68.9023 68.916l-73.8242 -73.8232l68.918 -68.8994z" />
    <glyph glyph-name="satellite-dish" unicode="&#xf7c0;" 
d="M305.449 -14.5898c7.3916 -7.29785 6.18848 -20.0967 -3 -25.0039c-77.7129 -41.8027 -176.726 -29.9102 -242.344 35.708c-65.6016 65.6035 -77.5098 164.523 -35.6914 242.332c4.89062 9.09473 17.6895 10.2979 25.0029 3l116.812 -116.813l27.3945 27.3945
c-0.6875 2.60938 -1.59375 5.00098 -1.59375 7.81348c0 17.666 14.3379 32.0039 32.0039 32.0039s32.0039 -14.3379 32.0039 -32.0039s-14.3379 -32.0039 -32.0039 -32.0039c-2.79785 0 -5.2041 0.890625 -7.79785 1.59375l-27.4102 -27.4102zM511.976 144.933
c0.0136719 -0.248047 0.0253906 -0.650391 0.0253906 -0.899414c0 -8.84668 -7.18066 -16.0615 -16.0273 -16.1025h-32.1133c-8.27148 0.0244141 -15.3916 6.74512 -15.8926 15.002c-7.50098 129.519 -111.515 234.533 -240.937 241.534
c-8.28125 0.441406 -15.0029 7.5293 -15.0029 15.8223c0 0.0234375 0 0.0625 0.000976562 0.0859375v31.5986c0.0361328 8.84766 7.24609 16.0273 16.0938 16.0273c0.250977 0 0.657227 -0.0107422 0.908203 -0.0253906c163.224 -8.59473 294.443 -139.816 302.944 -303.043
zM415.964 145.229c0.0195312 -0.299805 0.0361328 -0.788086 0.0361328 -1.08887c0 -8.91309 -7.23438 -16.1758 -16.1475 -16.21h-32.208c-8.08594 0.0585938 -15.2061 6.64648 -15.8926 14.7051c-6.90625 77.0107 -68.1172 138.91 -144.924 145.224
c-8.16602 0.585938 -14.7959 7.70605 -14.7988 15.8926v32.1143v0.00390625c0 8.90625 7.22754 16.1338 16.1338 16.1338c0.322266 0 0.84375 -0.0185547 1.16504 -0.0419922c110.123 -8.50098 198.229 -96.6074 206.636 -206.732z" />
    <glyph glyph-name="sd-card" unicode="&#xf7c2;" horiz-adv-x="384" 
d="M320 448c35.2998 0 64 -28.7002 64 -64v-384c0 -35.2998 -28.7002 -64 -64 -64h-256c-35.2998 0 -64 28.7002 -64 64v320l128 128h192zM160 288v96h-48v-96h48zM240 288v96h-48v-96h48zM320 288v96h-48v-96h48z" />
    <glyph glyph-name="sim-card" unicode="&#xf7c4;" horiz-adv-x="384" 
d="M0 384c0 35.2998 28.7002 64 64 64h192l128 -128v-320c0 -35.2998 -28.7002 -64 -64 -64h-256c-35.2998 0 -64 28.7002 -64 64v384zM224 192v64h-64v-64h64zM320 192v32c0 17.7002 -14.2998 32 -32 32h-32v-64h64zM256 64v-64h32c17.7002 0 32 14.2998 32 32v32h-64z
M160 64v-64h64v64h-64zM64 64v-32c0 -17.7002 14.2998 -32 32 -32h32v64h-64zM64 160v-64h256v64h-256zM64 224v-32h64v64h-32c-17.7002 0 -32 -14.2998 -32 -32z" />
    <glyph glyph-name="skating" unicode="&#xf7c5;" horiz-adv-x="448" 
d="M400 448c26.5 0 48 -21.5 48 -48s-21.5 -48 -48 -48s-48 21.5 -48 48s21.5 48 48 48zM400 0c8.7998 0 16 -7.2002 16 -16c0 -26.5 -21.5 -48 -48 -48h-96c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16h96c8.7998 0 16 7.2002 16 16s7.2002 16 16 16zM117.8 -8.59961
c6.2998 6.2998 16.5 6.19922 22.7002 0c6.2002 -6.2002 6.2002 -16.4004 0 -22.6006c-9.2998 -9.2998 -21.5996 -14 -33.9004 -14c-12.2998 0 -24.5996 4.60059 -34 14l-67.8994 67.9004c-6.2002 6.2002 -6.2002 16.3994 0 22.5996s16.3994 6.2002 22.5996 0
l67.9004 -67.8994c6.2002 -6.30078 16.3994 -6.2002 22.5996 0zM173.9 171.2c3.7998 -6.10059 8.19922 -11.7998 13.1992 -16.7998l30.2002 -30.2002l-91.8994 -91.9004c-6.2002 -6.2998 -14.4004 -9.39941 -22.6006 -9.39941s-16.3994 3.19922 -22.5996 9.39941
c-12.5 12.4004 -12.5 32.7002 0 45.2002zM128 288c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32h204.6c16.3008 0 30.8008 -9.7002 37 -24.7002c6.2002 -15 2.80078 -32.0996 -8.69922 -43.5996l-82.3008 -82.2998c-0.5 -0.5 -1.19922 -0.700195 -1.69922 -1.10059
l61 -61c9 -8.89941 14.0996 -21.2998 14.0996 -33.8994v-89.4004c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32v82.7998l-78.2002 78.2002c-12.5996 12.5 -19.3994 29.9004 -18.7002 47.7002c0.700195 17.7002 8.80078 34.5996 22.3008 46.0996l20.0996 17.2002
h-105.5z" />
    <glyph glyph-name="skiing" unicode="&#xf7c9;" 
d="M432 352c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM505 -4.09961c9.2998 -9.30078 9.2998 -24.5 0 -33.8008c-17 -17 -39.7998 -26 -63 -26c-12.5996 0 -25.2002 2.60059 -37.0996 8.10059l-391.9 202.5
c-11.7998 6 -16.4004 20.5 -10.2998 32.2998c6.09961 11.7998 20.5996 16.2998 32.2998 10.2998l197.9 -102.3l45.8994 68.7998l-75.0996 75.2002c-14.2998 14.4004 -20.6006 34.5 -17.7002 54.4004l107 -53.1006l40.4004 -40.5
c16.1992 -16.0996 18.6992 -41.5996 6 -60.5996l-49.2002 -73.7998l135.8 -70.2002c14.5996 -6.7002 33 -3.40039 45.0996 8.7002c9.30078 9.39941 24.5 9.39941 33.9004 0zM120 356.4l-26.2002 23c-2.2002 1.89941 -2.39941 5.19922 -0.5 7.39941
c1.2998 1.5 3.2002 2.10059 5 1.7002l34.4004 -7h0.200195l11.0996 21.7002c13.7002 -7 21.2002 -21.1006 20.9004 -35.6006l62.5 -31l81.1992 32.5c43.6006 17.4004 76.4004 -15 84.5 -39.1992l17.1006 -51.2002l52.0996 -26.1006
c15.7998 -7.89941 22.2002 -27.0996 14.2998 -42.8994c-7.89941 -15.7998 -27 -22.2002 -42.8994 -14.2998l-58.1006 29c-11.3994 5.69922 -20 15.5996 -24 27.6992l-6.39941 19.1006l-32.4004 -13l-114.5 56.7998c0.100586 0.0996094 0.100586 0.200195 0.200195 0.299805
l-47.2002 23.4004c-11.5996 -9.7002 -28.3994 -12.1006 -42.7998 -4.7998z" />
    <glyph glyph-name="skiing-nordic" unicode="&#xf7ca;" horiz-adv-x="576" 
d="M336 352c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM552 32c13.2002 0 24 -10.7998 24 -24c0 -39.7002 -32.2998 -72 -72 -72h-480c-13.2002 0 -24 10.7002 -24 24s10.7998 24 24 24h42.9004l54.0996 270.8
c-0.700195 0.799805 -1.7002 1.2002 -2.40039 2.10059c-10.7998 14.0996 -8.09961 34.1992 5.90039 44.8994l39.7002 30.4004c23 17.5996 52.5 23.8994 80.7998 17.0996l71.2002 -21.2002c26.2998 -6.69922 49.2998 -25.3994 61.7998 -50.8994l26.0996 -53.2002h44
c17.7002 0 32 -14.2998 32 -32c0 -13.4004 -8.39941 -24.9004 -20.0996 -29.5996l-25.5 -178.4h69.5c13.2002 0 24 10.7998 24 24c0 13.2998 10.7998 24 24 24zM291.5 -16l25.5 81.2002l-85 50.2002c-27.5996 16.2998 -38.9004 50.7998 -26.2998 80.2998l37.5 87.3994
l-14.7002 4.40039c-7.90039 1.90039 -17.5996 -0.200195 -25.2998 -6.09961l-39.7002 -30.4004c-3.59961 -2.7002 -7.59961 -4.59961 -11.7002 -5.59961l-52.2998 -261.4h24.2002l62.5 131.8c7.59961 -10.8994 17.3994 -20.5996 29.5 -27.7998l22 -13l-43.1006 -91h96.9004z
M402.1 -16l25.2002 176h-33.2998c-18.2002 0 -35.0996 10.5996 -43.0996 26.9004l-20.3008 41.3994l-31.2998 -78.2998l61.2002 -36.0996c18.7002 -11.3008 27.5 -33.6006 21.5996 -54.4004l-23.5996 -75.5h43.5996z" />
    <glyph glyph-name="sleigh" unicode="&#xf7cc;" horiz-adv-x="640" 
d="M612.7 97.2998c18.5 -14.7002 28.5996 -37.2002 27.2002 -61c-2.2002 -39 -36.9004 -68.2998 -75.9004 -68.2998h-516c-8.7998 0 -16 7.2002 -16 16v16c0 8.7998 7.2002 16 16 16h519.3c13.6006 0 24.6006 11 24.6006 24.5996c0 7.5 -3.30078 14.5 -9.2002 19.2002
l-9.2998 7.40039c-6.90039 5.5 -8 15.5996 -2.5 22.5l10 12.5c5.5 6.89941 15.5996 8 22.5 2.5zM32 224v128c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32h20.7002c65.7002 0 125.899 -37.2002 155.3 -96s89.5 -96 155.3 -96h20.7002c35.2998 0 64 28.7002 64 64v64h96
c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32v-96c0 -53 -43 -96 -96 -96v-48h-64v48h-192v-48h-64v52.5c-55.0996 14.2998 -96 63.9004 -96 123.5z" />
    <glyph glyph-name="sms" unicode="&#xf7cd;" 
d="M256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-38.4004 0 -74.7002 7.09961 -107.4 19.4004c-24.5996 -19.6006 -74.2998 -51.4004 -140.6 -51.4004c-3.2002 0 -6 1.7998 -7.2998 4.7998s-0.700195 6.40039 1.5 8.7002
c0.5 0.5 42.2998 45.4004 54.7998 95.7998c-35.5996 35.7002 -57 81.1006 -57 130.7c0 114.9 114.6 208 256 208zM128.2 144c23.3994 0 42.5 17.2998 42.3994 38.5996c0 10.6006 -4.7998 20.9004 -13.2998 28.1006l-21.8994 18.7998
c-1.30078 1.09961 -2.10059 2.5 -2.10059 3.7998c0 3.10059 4.40039 6.60059 10.4004 6.60059h12.2998c4.40039 0 8 3.59961 8 8v16c0 4.39941 -3.59961 8 -8 8h-12.2002c-23.3994 0 -42.3994 -17.3008 -42.3994 -38.6006c0 -10.5996 4.7998 -20.8994 13.2998 -28.0996
l21.8994 -18.7998c1.30078 -1.10059 2.10059 -2.5 2.10059 -3.80078c0 -3.09961 -4.40039 -6.59961 -10.4004 -6.59961h-12.2998c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h12.2002zM320 152v104c0 8.7998 -7.2002 16 -16 16h-16
c-6 0 -11.5996 -3.40039 -14.2998 -8.7998l-17.7002 -35.4004l-17.7002 35.4004c-2.7002 5.39941 -8.2002 8.7998 -14.2998 8.7998h-16c-8.7998 0 -16 -7.2002 -16 -16v-104c0 -4.40039 3.59961 -8 8 -8h16c4.40039 0 8 3.59961 8 8v68.2002l24.9004 -55.7998
c2.89941 -5.90039 11.3994 -5.90039 14.2998 0l24.7998 55.7998v-68.2002c0 -4.40039 3.59961 -8 8 -8h16c4.40039 0 8 3.59961 8 8zM368.3 144c23.4004 0 42.4004 17.2998 42.2998 38.5996c0 10.6006 -4.7998 20.9004 -13.2998 28.1006l-21.8994 18.7998
c-1.30078 1.09961 -2.10059 2.5 -2.10059 3.7998c0 3.10059 4.40039 6.60059 10.4004 6.60059h12.2998c4.40039 0 8 3.59961 8 8v16c0 4.39941 -3.59961 8 -8 8h-12.2002c-23.3994 0 -42.3994 -17.3008 -42.3994 -38.6006c0 -10.5996 4.7998 -20.8994 13.2998 -28.0996
l21.8994 -18.7998c1.30078 -1.10059 2.10059 -2.5 2.10059 -3.80078c0 -3.09961 -4.40039 -6.59961 -10.4004 -6.59961h-12.2998c-4.40039 0 -8 -3.59961 -8 -8v-16c0 -4.40039 3.59961 -8 8 -8h12.2998z" />
    <glyph glyph-name="snowboarding" unicode="&#xf7ce;" 
d="M432 352c-26.5 0 -48 21.5 -48 48s21.5 48 48 48s48 -21.5 48 -48s-21.5 -48 -48 -48zM460.8 198.4l-83.5 62.8994l-66 -30.5l52 -39c14.9004 -11.2002 22 -30.2002 18.1006 -48.3994l-21.9004 -102c-2.2002 -10.1006 -9.09961 -17.8008 -17.7998 -21.9004
l90.7998 -33.0996c9.7002 -3.5 20.2002 -3.10059 29.5 1.2998c12 5.59961 26.2998 0.399414 31.9004 -11.6006c5.59961 -12 0.399414 -26.2998 -11.6006 -31.8994c-11.5996 -5.5 -24 -8.2002 -36.5 -8.2002c-10 0 -20 1.7998 -29.7002 5.2998l-364.8 132.7
c-21.7998 7.90039 -39.0996 23.7998 -48.8994 44.7998c-5.60059 12 -0.400391 26.2998 11.5996 31.9004c12 5.59961 26.2998 0.399414 31.9004 -11.6006c4.39941 -9.39941 12.0996 -16.5 21.7998 -20l38.7002 -14.0996c-3.80078 3.5 -7 7.7002 -8.7002 12.9004
c-5.60059 16.7998 3.39941 34.8994 20.2002 40.5l74.0996 24.6992v53.1006c0 24.3994 13.5996 46.2998 35.4004 57.2002l41.1992 20.5996l-16.3994 5.5c-12.1006 4.09961 -22 12.5996 -27.7002 24l-29.0996 58.0996c-7.90039 15.8008 -1.5 35 14.2998 42.9004
s35 1.5 42.8994 -14.2998l26.1006 -52.1006l63.7002 -21.1992c16.2998 -5.40039 31.5996 -13.5 45.3994 -23.8008l111.4 -83.5c14.2002 -10.5996 17 -30.6992 6.39941 -44.7998c-6.2998 -8.39941 -15.8994 -12.7998 -25.5996 -12.7998
c-6.7002 0 -13.4004 2.09961 -19.2002 6.40039zM316.4 146.7l-60.5 45.2998v-20.5c0 -20.7002 -13.2002 -39 -32.8008 -45.5l-85 -28.4004c-2.59961 -0.899414 -5.2998 -1.09961 -8 -1.2998l169.4 -61.5996c-2.90039 6.09961 -4.2998 12.8994 -2.7998 20z" />
    <glyph glyph-name="snowman" unicode="&#xf7d0;" 
d="M510.9 295.7c3.19922 -8.10059 -0.800781 -17.2002 -8.90039 -20.2998l-135.2 -55.2002c0.400391 -4.10059 1.2002 -8 1.2002 -12.2002c0 -10 -1.7002 -19.5 -4.2002 -28.7002c21.1006 -21.3994 36.1006 -48.7998 41.6006 -79
c11.5 -63.2002 -16.4004 -120.3 -62.9004 -152.6c-10.9004 -7.60059 -23.9004 -11.7002 -37.2002 -11.7002h-99.2002c-11 0 -22 2.2998 -31.2998 8.2002c-42.3994 26.8994 -70.7998 73.7998 -70.7998 127.8c0 41.7998 16.9004 79.5996 44.2998 107.1
c-2.5 9.30078 -4.2002 18.8008 -4.2002 28.9004c0 4.2002 0.800781 8.2002 1.2002 12.2002l-135.2 55.2002c-8.19922 3.19922 -12.1992 12.2998 -8.89941 20.2998l5.89941 14.5c3.30078 8 12.6006 11.8994 20.8008 8.7002l28.0996 -11.5v29
c0 8.59961 7.2002 15.5996 16 15.5996h16c8.7998 0 16 -7 15.7998 -15.5996v-46.9004c0 -0.5 -0.200195 -1 -0.299805 -1.5l56.4004 -23c6 10 13.2998 18.9004 22 26.5996c-13.5 16.6006 -22 37.4004 -22 60.5c0 53 43 96 96 96s96 -43 96 -96
c0 -23.0996 -8.40039 -43.8994 -22 -60.5c8.69922 -7.69922 16.0996 -16.5996 22 -26.5996l56.3994 23c0 0.5 -0.299805 1 -0.299805 1.5v46.9004c0 8.59961 7.2002 15.5996 16 15.5996h16c8.7998 0 16 -7 16 -15.5996v-29l28.2002 11.5
c8.2002 3.19922 17.5 -0.700195 20.7998 -8.7002zM224 352c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM256 80c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM256 144
c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM256 208c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16zM256 296c0 0 16 23.2002 16 32s-7.2002 16 -16 16s-16 -7.2002 -16 -16s16 -32 16 -32z
M288 352c8.7998 0 16 7.2002 16 16s-7.2002 16 -16 16s-16 -7.2002 -16 -16s7.2002 -16 16 -16z" />
    <glyph glyph-name="snowplow" unicode="&#xf7d2;" horiz-adv-x="640" 
d="M120 72c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM200 72c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM280 72c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24
s-24 10.7002 -24 24s10.7002 24 24 24zM360 72c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM598.6 22.5996l36.7002 -36.6992c6.2002 -6.2002 6.2002 -16.4004 0 -22.6006l-22.5996 -22.5996
c-6.2002 -6.2002 -16.4004 -6.2002 -22.6006 0l-36.6992 36.7002c-26.5 26.5 -41.4004 62.3994 -41.4004 99.8994v18.7002h-43.2002c7 -14.5996 11.2002 -30.7002 11.2002 -48c0 -61.9004 -50.0996 -112 -112 -112h-256c-61.9004 0 -112 50.0996 -112 112
c0 44.5996 26.2998 82.7998 64 100.8v91.2002c0 26.5 21.5 48 48 48h16v112c0 26.5 21.5 48 48 48h144.3c19.2998 0 36.6006 -11.4004 44.2002 -29.0996l78.2998 -182.801c3.40039 -8 5.2002 -16.5 5.2002 -25.1992v-50.9004h64v18.7002
c0 37.5 14.9004 73.3994 41.4004 99.8994l36.6992 36.7002c6.2002 6.2002 16.4004 6.2002 22.6006 0l22.5996 -22.5996c6.2002 -6.2002 6.2002 -16.4004 0 -22.6006l-36.7002 -36.6992c-14.5 -14.5 -22.5996 -34.1006 -22.5996 -54.6006v-101.6
c0 -20.5 8.09961 -40.1006 22.5996 -54.6006zM192 384v-96l64 -64h122.4l-68.6006 160h-117.8zM368 0c26.5 0 48 21.5 48 48s-21.5 48 -48 48h-256c-26.5 0 -48 -21.5 -48 -48s21.5 -48 48 -48h256z" />
    <glyph glyph-name="tenge" unicode="&#xf7d7;" horiz-adv-x="384" 
d="M372 288c6.59961 0 12 -5.40039 12 -12v-56c0 -6.59961 -5.40039 -12 -12 -12h-140v-228c0 -6.59961 -5.40039 -12 -12 -12h-56c-6.59961 0 -12 5.40039 -12 12v228h-140c-6.59961 0 -12 5.40039 -12 12v56c0 6.59961 5.40039 12 12 12h360zM372 416
c6.59961 0 12 -5.40039 12 -12v-56c0 -6.59961 -5.40039 -12 -12 -12h-360c-6.59961 0 -12 5.40039 -12 12v56c0 6.59961 5.40039 12 12 12h360z" />
    <glyph glyph-name="toilet" unicode="&#xf7d8;" horiz-adv-x="384" 
d="M368 400h-16v-156.7c20.2002 -10.0996 32 -22.2002 32 -35.2998c0 -67.2002 -34.5996 -126.2 -86.7998 -160.5l21.3994 -70.2002c6.30078 -20.5 -9.09961 -41.2998 -30.5996 -41.2998h-192c-21.5 0 -36.9004 20.7998 -30.5996 41.2998l21.3994 70.2002
c-52.2002 34.2998 -86.7998 93.2998 -86.7998 160.5c0 13.0996 11.7998 25.2002 32 35.2998v156.7h-16c-8.7998 0 -16 7.2002 -16 16v16c0 8.7998 7.2002 16 16 16h352c8.7998 0 16 -7.2002 16 -16v-16c0 -8.7998 -7.2002 -16 -16 -16zM80 376v-16
c0 -4.40039 3.59961 -8 8 -8h48c4.40039 0 8 3.59961 8 8v16c0 4.40039 -3.59961 8 -8 8h-48c-4.40039 0 -8 -3.59961 -8 -8zM192 176c77.0996 0 139.6 14.2998 139.6 32s-62.5 32 -139.6 32s-139.6 -14.2998 -139.6 -32s62.5 -32 139.6 -32z" />
    <glyph glyph-name="tools" unicode="&#xf7d9;" 
d="M501.1 52.2998c14.5 -14.5 14.5 -38.0996 0 -52.7002l-52.6992 -52.6992c-14.5 -14.6006 -38.1006 -14.6006 -52.7002 0l-117.101 117.1c-23.0996 23.0996 -27.5 57.5996 -13.8994 85.4004l-106.601 106.6h-62.0996l-96 128l64 64l128 -96v-62.0996l106.6 -106.601
c27.8008 13.7002 62.3008 9.2002 85.4004 -13.8994zM331.7 223c-8.2002 0 -16.6006 -1 -24.7002 -2.90039l-82.0996 82.1006c-0.700195 37.5 12.6992 75.0996 41.1992 103.6c37 37 89.2002 49.6006 136.601 37.9004c9.09961 -2.2998 12.2998 -13.6006 5.7002 -20.2002
l-74.4004 -74.4004l11.2998 -67.8994l67.9004 -11.2998l74.3994 74.3994c6.60059 6.60059 17.9004 3.5 20.1006 -5.5c11.7998 -47.3994 -0.799805 -99.5996 -37.9004 -136.7c-13 -13 -28 -22.5996 -43.7998 -29.5l-19.4004 19.4004c-20 20 -46.5996 31 -74.8994 31z
M227.8 141c-4.89941 -21.0996 -2.59961 -42.7998 5 -62.7002l-123.6 -123.6c-25 -25 -65.5 -25 -90.5 0s-25 65.5 0 90.5l152.399 152.5zM64 -24c13.2998 0 24 10.7998 24 24c0 13.2998 -10.7002 24 -24 24s-24 -10.7002 -24 -24c0 -13.2002 10.7998 -24 24 -24z" />
    <glyph glyph-name="tram" unicode="&#xf7da;" 
d="M288 384c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM511.5 396.1c2.2002 -8.5 -2.7998 -17.2998 -11.4004 -19.5996l-228.1 -60.7998v-91.7002h176c17.7002 0 32 -14.2998 32 -32v-224c0 -17.7002 -14.2998 -32 -32 -32
h-384c-17.7002 0 -32 14.2998 -32 32v224c0 17.7002 14.2998 32 32 32h176v83.2002l-219.9 -58.7002c-1.2998 -0.299805 -2.69922 -0.5 -4.09961 -0.5c-7.09961 0 -13.5 4.7002 -15.4004 11.7998c-2.2998 8.60059 2.80078 17.2998 11.3008 19.6006l480 128
c8.59961 2.2998 17.2998 -2.7002 19.5996 -11.3008zM176 64v96h-96v-96h96zM336 160v-96h96v96h-96zM304 160h-96v-96h96v96zM192 352c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32z" />
    <glyph glyph-name="fire-alt" unicode="&#xf7e4;" horiz-adv-x="448" 
d="M323.56 396.8c72.46 -67.2598 124.44 -177.13 124.44 -230.399c0 -127.25 -100.29 -230.4 -224 -230.4s-224 103.15 -224 230.4c0 71.6396 69.7402 190.43 168 281.6c38.2803 -35.5303 72.0801 -73.6201 99.3398 -111.17
c16.6406 20.3799 35.4199 40.6699 56.2197 59.9697zM304.09 56.1504c49.2402 34.4492 60.7803 101.229 33.4297 153.42c-3.35938 6.41992 -7.12988 13.1201 -11.2695 19.9697l-58.6299 -66.8799s-91.9004 117.359 -98.8301 125.34
c-48.4805 -58.1201 -72.79 -92.1396 -72.79 -130.75c0 -77.5098 58.71 -125.25 130.86 -125.25c28.8594 0 55.5693 8.99023 77.2295 24.1504z" />
    <glyph glyph-name="bacon" unicode="&#xf7e5;" horiz-adv-x="576" 
d="M218.92 111.61c-34.8604 -34.8799 -59.6504 -44.1602 -85.9199 -54c-26 -9.76074 -53 -20.1299 -88.1699 -52.7305l-35.7598 35.5098c-12.7002 12.6104 -12.0703 33.6104 1.79004 45.0605c36.3398 29.9795 66.21 41.0996 91.0693 50.3594
c9.16992 3.41016 68.9707 19.2607 98.7207 98.0908c8.60938 22.8096 46.3496 134.58 188.979 187.72c15.8506 5.91016 27.3604 10.2002 41 20.2998c4.53516 3.35449 12.7939 6.07617 18.4346 6.07617c7.00879 0 16.751 -3.98926 21.7451 -8.90625l37.6709 -37.3896
c-30.1504 -27.6904 -52.9102 -36.3701 -76.79 -45.3701c-28.3008 -10.6104 -57.5703 -21.5801 -97.3506 -61.3799s-50.7598 -69.0498 -61.3701 -97.3398c-9.84961 -26.3008 -19.1602 -51.1104 -54.0498 -86zM566.92 343.61
c12.7002 -12.5996 12.0801 -33.6602 -1.80957 -45.0605c-36.3701 -30.0098 -66.2402 -41.1396 -91.1104 -50.4102c-9.2002 -3.43945 -69 -19.3193 -98.7305 -98.1094c-8.93945 -23.5898 -46.7393 -134.69 -188.939 -187.69
c-15.8496 -5.89941 -27.3398 -10.1797 -40.9404 -20.2402c-4.53613 -3.35645 -12.7969 -6.08008 -18.4395 -6.08008c-7.00586 0 -16.7461 3.9873 -21.7402 8.90039l-37.6797 37.4297c30.1094 27.6699 52.8594 36.3301 76.7197 45.3301
c28.2998 10.5898 57.5098 21.54 97.2998 61.3203s50.7803 69 61.4199 97.3301c9.81055 26.3096 19.1104 51.1602 54 86c34.8906 34.8398 59.6904 44.1504 85.9502 54c26.0703 9.79004 53.0605 20.1602 88.25 52.79z" />
    <glyph glyph-name="book-medical" unicode="&#xf7e6;" horiz-adv-x="448" 
d="M448 89.5996c0 -9.59961 -3.2002 -15.999 -9.59961 -19.1992c-3.2002 -12.8008 -3.2002 -57.6006 0 -73.6006c6.39941 -6.39941 9.59961 -12.7998 9.59961 -19.2002v-16c0 -16 -12.7998 -25.5996 -25.5996 -25.5996h-326.4c-54.4004 0 -96 41.5996 -96 96v320
c0 54.4004 41.5996 96 96 96h326.4c16 0 25.5996 -9.59961 25.5996 -25.5996v-332.801zM144 280v-48c0 -4.41602 3.58398 -8 8 -8h56v-56c0 -4.41602 3.58398 -8 8 -8h48c4.41602 0 8 3.58398 8 8v56h56c4.41602 0 8 3.58398 8 8v48c0 4.41602 -3.58398 8 -8 8h-56v56
c0 4.41602 -3.58398 8 -8 8h-48c-4.41602 0 -8 -3.58398 -8 -8v-56h-56c-4.41602 0 -8 -3.58398 -8 -8zM380.8 0v64h-284.8c-16 0 -32 -12.7998 -32 -32s12.7998 -32 32 -32h284.8z" />
    <glyph glyph-name="bread-slice" unicode="&#xf7ec;" horiz-adv-x="576" 
d="M288 448c180 0 288 -93.4004 288 -169.14c0 -30.3008 -24.2402 -54.8604 -64 -54.8604v-256c0 -17.6699 -16.1201 -32 -36 -32h-376c-19.8799 0 -36 14.3301 -36 32v256c-39.7598 0 -64 24.5596 -64 54.8604c0 75.7393 108 169.14 288 169.14z" />
    <glyph glyph-name="cheese" unicode="&#xf7ef;" 
d="M0 160h512v-160c0 -17.6641 -14.3359 -32 -32 -32h-448c-17.6641 0 -32 14.3359 -32 32v160zM299.83 416c118.17 -6.2002 212.17 -104.11 212.17 -224h-512l278.7 217c4.83984 3.875 13.7998 7.01953 20 7.01953c0.311523 0 0.818359 -0.00878906 1.12988 -0.0195312z
" />
    <glyph glyph-name="clinic-medical" unicode="&#xf7f2;" horiz-adv-x="576" 
d="M288 333l218.74 -192.9c1.54004 -1.37988 3.55957 -2.04004 5.25977 -3.19922v-184.9c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v184.94c1.78027 1.20996 3.84961 1.88965 5.46973 3.34961zM384 72v48c0 4.41602 -3.58398 8 -8 8h-56v56
c0 4.41602 -3.58398 8 -8 8h-48c-4.41602 0 -8 -3.58398 -8 -8v-56h-56c-4.41602 0 -8 -3.58398 -8 -8v-48c0 -4.41602 3.58398 -8 8 -8h56v-56c0 -4.41602 3.58398 -8 8 -8h48c4.41602 0 8 3.58398 8 8v56h56c4.41602 0 8 3.58398 8 8zM570.69 211.72
c2.93066 -2.63184 5.31055 -7.96484 5.31055 -11.9053c0 -3.38086 -1.83301 -8.16797 -4.09082 -10.6846l-21.4004 -23.8203c-2.63184 -2.93066 -7.96484 -5.30957 -11.9043 -5.30957c-3.38574 0 -8.17773 1.83691 -10.6953 4.09961l-229.32 202.271
c-2.50391 2.20898 -7.24609 4.00195 -10.585 4.00195s-8.08105 -1.79297 -10.585 -4.00195l-229.32 -202.28c-2.51758 -2.2627 -7.30957 -4.09961 -10.6953 -4.09961c-3.93848 0 -9.27246 2.37891 -11.9043 5.30957l-21.4102 23.8203
c-2.2627 2.51758 -4.09961 7.30957 -4.09961 10.6953c0 3.93945 2.37891 9.27246 5.30957 11.9043l256 226c6.2832 5.68066 18.2559 10.29 26.7256 10.29c8.46875 0 20.4424 -4.60938 26.7246 -10.29z" />
    <glyph glyph-name="comment-medical" unicode="&#xf7f5;" 
d="M256 416c141.39 0 256 -93.1201 256 -208s-114.61 -208 -256 -208h-0.473633c-30.4814 0 -78.3838 8.68164 -106.927 19.3799c-24.5996 -19.6299 -74.3398 -51.3799 -140.6 -51.3799c-4.41113 0.00488281 -7.99023 3.58887 -7.99023 8
c0 1.75879 0.981445 4.22266 2.19043 5.5c0.5 0.5 42.2598 45.4502 54.7998 95.7598c-35.5898 35.7402 -57 81.1807 -57 130.74c0 114.88 114.62 208 256 208zM352 184v48c0 4.41602 -3.58398 8 -8 8h-56v56c0 4.41602 -3.58398 8 -8 8h-48c-4.41602 0 -8 -3.58398 -8 -8
v-56h-56c-4.41602 0 -8 -3.58398 -8 -8v-48c0 -4.41602 3.58398 -8 8 -8h56v-56c0 -4.41602 3.58398 -8 8 -8h48c4.41602 0 8 3.58398 8 8v56h56c4.41602 0 8 3.58398 8 8z" />
    <glyph glyph-name="crutch" unicode="&#xf7f7;" 
d="M507.31 262.29c2.56348 -2.58301 4.64355 -7.63184 4.64355 -11.2695c0 -3.66602 -2.10742 -8.74219 -4.70312 -11.3301l-22.6201 -22.6309c-2.58691 -2.58691 -7.65625 -4.6875 -11.3145 -4.6875c-3.65918 0 -8.72852 2.10059 -11.3154 4.6875l-181 181
c-2.58789 2.58691 -4.6875 7.65625 -4.6875 11.3154s2.09961 8.72852 4.6875 11.3154l22.6904 22.5996c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262zM327.77 195.88l55.1006 55.1201l45.25 -45.2695l-109.68 -109.681
c-10.7441 -10.748 -31.4814 -22.2393 -46.29 -25.6494l-120.25 -27.75l-102 -102c-2.58691 -2.58789 -7.65625 -4.6875 -11.3154 -4.6875s-8.72754 2.09961 -11.3154 4.6875l-22.6191 22.6191c-2.58789 2.58789 -4.6875 7.65625 -4.6875 11.3154
s2.09961 8.72852 4.6875 11.3154l102 102l27.7393 120.26c3.4248 14.8057 14.9248 35.5439 25.6699 46.29l109.671 109.67l45.25 -45.25l-55.1006 -55.1006zM273.2 141.31l9.30957 9.31055l-67.8896 67.8896l-9.31055 -9.30957
c-3.57715 -3.59082 -7.41211 -10.5127 -8.55957 -15.4502l-18.2998 -79.2998l79.2998 18.3193c4.94043 1.13379 11.8623 4.95996 15.4502 8.54004z" />
    <glyph glyph-name="disease" unicode="&#xf7fa;" 
d="M472.29 252.1c48.54 -16.6191 53.8301 -73.8301 8.99023 -96.79l-62 -31.7393c-17.8301 -9.12988 -29.2803 -25.2002 -30.6299 -43l-4.7002 -61.8604c-3.4502 -44.79 -65.1299 -66.7803 -104.45 -37.2197l-54.3203 40.8301
c-15.6201 11.7295 -36.96 16.1201 -57.0693 11.7295l-70 -15.2803c-50.6504 -11.0596 -94.1104 32.5605 -73.46 73.8008l28.4297 57c8.17969 16.3799 6.43945 35.1699 -4.63965 50.2393l-38.54 52.4209c-27.9307 37.9492 7 86.9092 59 82.8398l71.8994 -5.62012
c20.6602 -1.62012 40.9404 5.59961 54.2002 19.3096l46.0898 47.7207c33.4297 34.5098 98.4199 21.1494 110 -22.6201l16 -60.4502c4.60059 -17.3906 18.8604 -31.71 38.1406 -38.3105zM160 192c17.6641 0 32 14.3359 32 32s-14.3359 32 -32 32s-32 -14.3359 -32 -32
s14.3359 -32 32 -32zM288 96c17.6641 0 32 14.3359 32 32s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32zM304 224c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16s-16 -7.16797 -16 -16s7.16797 -16 16 -16z" />
    <glyph glyph-name="egg" unicode="&#xf7fb;" horiz-adv-x="384" 
d="M192 448c106 0 192 -214 192 -320s-86 -192 -192 -192s-192 86 -192 192s86 320 192 320z" />
    <glyph glyph-name="hamburger" unicode="&#xf805;" 
d="M464 192c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48h-416c-26.4961 0 -48 21.5039 -48 48s21.5039 48 48 48h416zM480 64c8.83203 0 16 -7.16797 16 -16v-16c0 -35.3281 -28.6719 -64 -64 -64h-352c-35.3281 0 -64 28.6719 -64 64v16
c0 8.83203 7.16797 16 16 16h448zM58.6396 224c-34.5693 0 -54.6396 43.9102 -34.8193 75.8896c40.1797 64.9102 128.64 116.011 232.18 116.11c103.55 -0.0996094 192 -51.2002 232.18 -116.12c19.8008 -31.9795 -0.25 -75.8799 -34.8193 -75.8799h-394.721zM384 336
c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16s16 7.16797 16 16s-7.16797 16 -16 16zM256 368c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16s16 7.16797 16 16s-7.16797 16 -16 16zM128 336c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16
s16 7.16797 16 16s-7.16797 16 -16 16z" />
    <glyph glyph-name="hand-middle-finger" unicode="&#xf806;" 
d="M479.93 130.88l0.0703125 -82.8799v0c0 -61.7969 -50.1533 -111.973 -111.95 -112h-215c-25.6074 0.00292969 -61.084 14.7012 -79.1895 32.8096l-30.9307 30.9307c-6.0332 6.03223 -10.9297 17.8525 -10.9297 26.3838v0.00585938v73.4697v0.00292969
c0 12.7383 9.24707 27.7002 20.6396 33.3975l27.3604 15v-76c0 -4.41602 3.58398 -8 8 -8s8 3.58398 8 8v147.04c0 15.2598 12.8701 28.3799 30.8701 31.3799l30.6797 5.12012c17.8203 2.96973 34.4502 -8.38965 34.4502 -23.54v-32c0 -4.41602 3.58398 -8 8 -8
s8 3.58398 8 8v200v0.0224609c0 26.4961 21.5039 48 48 48c0.408203 0 1.07129 -0.00976562 1.48047 -0.0224609c26.2695 -0.799805 46.5195 -23.7197 46.5195 -50v-198c0 -4.41602 3.58398 -8 8 -8s8 3.58398 8 8v32c0 15.1396 16.6299 26.5 34.4502 23.5303
l38.3994 -6.40039c13.46 -2.25 23.1504 -12.0996 23.1504 -23.54v-49.5898l35.6504 -8.92969c15.5986 -3.89844 28.2686 -20.1113 28.2793 -36.1904z" />
    <glyph glyph-name="hard-hat" unicode="&#xf807;" 
d="M480 160v-64h-448v64c0 80.25 49.2803 148.92 119.19 177.62l40.8096 -81.6201v112c0 8.83203 7.16797 16 16 16h96c8.83203 0 16 -7.16797 16 -16v-112l40.8096 81.6201c69.9102 -28.7002 119.19 -97.3701 119.19 -177.62zM496 64c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-480c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h480z" />
    <glyph glyph-name="hospital-user" unicode="&#xf80d;" horiz-adv-x="640" 
d="M480 128c-52.9922 0 -96 43.0078 -96 96s43.0078 96 96 96s96 -43.0078 96 -96s-43.0078 -96 -96 -96zM528 96c61.8242 0 112.002 -50.1758 112.002 -112c0 -0.170898 -0.000976562 -0.449219 -0.00195312 -0.620117c-0.139648 -26.2598 -21.7305 -47.3799 -48 -47.3799
h-224c-26.2695 0 -47.8604 21.1201 -48 47.3799c-0.000976562 0.170898 -0.00195312 0.449219 -0.00195312 0.620117c0 61.8242 50.1758 112 112 112h0.00195312h0.0810547c1.9707 0 5.09277 -0.488281 6.96875 -1.08984
c10.9795 -3.81445 29.3223 -6.91016 40.9453 -6.91016s29.9658 3.0957 40.9453 6.91016c1.87891 0.601562 5.00488 1.08984 6.97754 1.08984h0.0820312zM329.91 85.5498c-23.1367 -23.1309 -41.915 -68.4561 -41.915 -101.172
c0 -0.322266 0.00195312 -0.845703 0.00488281 -1.16797c0.136719 -14.5381 7.44336 -35.6885 16.3096 -47.21h-288.31c-8.83203 0 -16 7.16797 -16 16v368c0 17.6641 14.3359 32 32 32h32v64c0 17.6641 14.3359 32 32 32h160c17.6641 0 32 -14.3359 32 -32v-64h32
c17.6641 0 32 -14.3359 32 -32v-216.62c-6.58008 -4.32227 -16.4766 -12.3096 -22.0898 -17.8301zM144 44v40c0 6.62402 -5.37598 12 -12 12h-40c-6.62402 0 -12 -5.37598 -12 -12v-40c0 -6.62402 5.37598 -12 12 -12h40c6.62402 0 12 5.37598 12 12zM144 172v40
c0 6.62402 -5.37598 12 -12 12h-40c-6.62402 0 -12 -5.37598 -12 -12v-40c0 -6.62402 5.37598 -12 12 -12h40c6.62402 0 12 5.37598 12 12zM192 294v26h26c3.31152 0 6 2.68848 6 6v20c0 3.31152 -2.68848 6 -6 6h-26v26c0 3.31152 -2.68848 6 -6 6h-20
c-3.31152 0 -6 -2.68848 -6 -6v-26h-26c-3.31152 0 -6 -2.68848 -6 -6v-20c0 -3.31152 2.68848 -6 6 -6h26v-26c0 -3.31152 2.68848 -6 6 -6h20c3.31152 0 6 2.68848 6 6zM272 44v40c0 6.62402 -5.37598 12 -12 12h-40c-6.62402 0 -12 -5.37598 -12 -12v-40
c0 -6.62402 5.37598 -12 12 -12h40c6.62402 0 12 5.37598 12 12zM272 172v40c0 6.62402 -5.37598 12 -12 12h-40c-6.62402 0 -12 -5.37598 -12 -12v-40c0 -6.62402 5.37598 -12 12 -12h40c6.62402 0 12 5.37598 12 12z" />
    <glyph glyph-name="hotdog" unicode="&#xf80f;" 
d="M488.56 424.56c12.9297 -12.9326 23.4238 -38.2715 23.4238 -56.5596s-10.4941 -43.627 -23.4238 -56.5596l-352 -352c-13.0205 -13.4824 -38.7998 -24.4238 -57.543 -24.4238c-44.1592 0 -80 35.8408 -80 80c0 18.7432 10.9414 44.5225 24.4238 57.543l352 352
c12.9326 12.9297 38.2715 23.4238 56.5596 23.4238s43.627 -10.4941 56.5596 -23.4238zM438.63 329.37c2.58691 2.58691 4.68652 7.65625 4.68652 11.3145c0 8.83301 -7.16797 16.002 -16.001 16.002c-3.65918 0 -8.72852 -2.09961 -11.3154 -4.68652
c-12.4102 -12.4102 -21.7598 -14 -34.71 -16.2305c-14.4004 -2.46973 -32.3203 -5.55957 -51.9199 -25.1494c-19.6006 -19.5898 -22.6699 -37.5205 -25.1396 -51.9199c-2.24023 -12.9502 -3.84082 -22.3105 -16.2402 -34.71
c-12.4004 -12.4004 -21.7002 -14.0098 -34.7002 -16.2305c-14.4004 -2.46973 -32.3203 -5.5498 -51.9199 -25.1396c-19.6006 -19.5898 -22.6699 -37.5205 -25.1504 -51.9199c-2.21973 -12.9502 -3.80957 -22.29 -16.2197 -34.7002s-21.71 -14.0098 -34.71 -16.2305
c-14.4004 -2.46973 -32.3203 -5.5498 -51.9199 -25.1396c-2.58691 -2.58691 -4.68652 -7.65625 -4.68652 -11.3145c0 -8.83301 7.16797 -16.002 16.001 -16.002c3.65918 0 8.72852 2.09961 11.3154 4.68652c12.4004 12.4004 21.7598 14 34.7002 16.2305
c14.3994 2.46973 32.3301 5.55957 51.9297 25.1494c19.6006 19.5898 22.6699 37.5205 25.1396 51.9199c2.23047 12.9502 3.83008 22.2998 16.2305 34.7002s21.75 14 34.7002 16.2197c14.3994 2.48047 32.3193 5.56055 51.9199 25.1504
c19.5996 19.5898 22.6699 37.5195 25.1494 51.9199c2.23047 12.9502 3.83008 22.3096 16.2305 34.71s21.7598 14 34.7002 16.2305c14.4102 2.46973 32.3301 5.5498 51.9297 25.1396zM31.4404 125.82l-11.5508 11.5498c-24.9893 24.9902 -26.6592 63.8398 -3.71973 86.7803
l207.68 207.68c22.9404 22.9395 61.79 21.2803 86.79 -3.71973l11.54 -11.5508zM480.56 258.18l11.5508 -11.54c24.9893 -25 26.6592 -63.8496 3.71973 -86.79l-207.68 -207.68c-22.9404 -22.9395 -61.79 -21.2803 -86.79 3.71973l-11.54 11.5508z" />
    <glyph glyph-name="ice-cream" unicode="&#xf810;" horiz-adv-x="448" 
d="M368 288c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48h-288c-26.4961 0 -48 21.5039 -48 48s21.5039 48 48 48h0.94043c-0.519531 4.51855 -0.94043 11.8779 -0.94043 16.4268c0 79.4883 64.5117 144 144 144s144 -64.5117 144 -144
c0 -4.54883 -0.420898 -11.9082 -0.94043 -16.4268h0.94043zM195.38 -45.6904l-99.3799 205.69h256l-99.3799 -205.69c-4.66504 -10.1084 -17.4863 -18.3135 -28.6201 -18.3135s-23.9551 8.20508 -28.6201 18.3135z" />
    <glyph glyph-name="laptop-medical" unicode="&#xf812;" horiz-adv-x="640" 
d="M232 224c-4.41602 0 -8 3.58398 -8 8v48c0 4.41602 3.58398 8 8 8h56v56c0 4.41602 3.58398 8 8 8h48c4.41602 0 8 -3.58398 8 -8v-56h56c4.41602 0 8 -3.58398 8 -8v-48c0 -4.41602 -3.58398 -8 -8 -8h-56v-56c0 -4.41602 -3.58398 -8 -8 -8h-48
c-4.41602 0 -8 3.58398 -8 8v56h-56zM576 400v-336h-512v336c0.0771484 26.4189 21.5811 47.9229 48 48h416c26.4189 -0.0771484 47.9229 -21.5811 48 -48zM512 128v256h-384v-256h384zM624 32c8.83203 0 16 -7.16797 16 -16v-16
c-0.104492 -35.2236 -28.7764 -63.8955 -64 -64h-512c-35.2236 0.104492 -63.8955 28.7764 -64 64v16c0 8.83203 7.16797 16 16 16h239.23c-0.230469 -14.5303 14.0791 -32 32.7695 -32h60.7998c18.0303 0 32 12.1904 32.7402 32h242.46z" />
    <glyph glyph-name="pager" unicode="&#xf815;" 
d="M448 384c35.3281 0 64 -28.6719 64 -64v-256c0 -35.3281 -28.6719 -64 -64 -64h-384c-35.3281 0 -64 28.6719 -64 64v256c0 35.3281 28.6719 64 64 64h384zM160 80v48h-80c-8.83203 0 -16 -7.16797 -16 -16v-16c0 -8.83203 7.16797 -16 16 -16h80zM288 96v16
c0 8.83203 -7.16797 16 -16 16h-80v-48h80c8.83203 0 16 7.16797 16 16zM448 224v64c0 17.6641 -14.3359 32 -32 32h-320c-17.6641 0 -32 -14.3359 -32 -32v-64c0 -17.6641 14.3359 -32 32 -32h320c17.6641 0 32 14.3359 32 32z" />
    <glyph glyph-name="pepper-hot" unicode="&#xf816;" 
d="M330.67 184.88h107.46l37.0498 -38.54c-48.5293 -87.4697 -206.54 -210.34 -419.18 -210.34c-30.9121 0 -56 25.0879 -56 56s25.0879 56 56 56c141.58 0 163.44 181.24 221.92 250.82l52.75 -24.2207v-89.7197zM461.76 313.25
c27.7324 -25.2861 50.2402 -76.2676 50.2402 -113.798v-0.142578c0 -13.6797 -2.2998 -26.6895 -5.55957 -39.3096l-54.6807 56.8799h-89.0898v78.2402l-74.6699 34.29c22.3398 14.0498 48.3398 22.5898 76.3398 22.5898
c16.4658 -0.00683594 42.0732 -5.36523 57.1602 -11.96c18.4502 37.2197 8.25977 61.96 1.40039 72.3203c-0.787109 1.14062 -1.42578 3.19043 -1.42578 4.57617c0 1.82227 1.03711 4.35449 2.31543 5.65332l22.9004 23c1.29688 1.31836 3.85156 2.38867 5.70117 2.38867
c2.1123 0 4.90234 -1.33398 6.22852 -2.97852c18.5596 -23.4805 35.2998 -71.9102 3.13965 -131.75z" />
    <glyph glyph-name="pizza-slice" unicode="&#xf818;" 
d="M158.87 447.85c181.91 -17.1699 332.02 -164.93 352.899 -345.71c1.87012 -16.2197 -7.89941 -31.54 -23.6191 -35.8994l-56.9404 -15.7803c-7.94043 186.39 -134.86 311.51 -322.479 317l14.8096 56.2705c4.12988 15.6992 19.1699 25.6396 35.3301 24.1191z
M100.4 335.85c176.069 -1.95996 294.88 -119.25 299.149 -294.14l-379 -105.1c-1.1709 -0.324219 -3.1084 -0.587891 -4.32422 -0.587891c-8.94824 0 -16.21 7.26172 -16.21 16.21c0 1.1582 0.239258 3.00781 0.53418 4.12793zM128 32c17.6641 0 32 14.3359 32 32
s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32zM176 184c17.6641 0 32 14.3359 32 32s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32zM280 80c17.6641 0 32 14.3359 32 32s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32z" />
    <glyph glyph-name="trash-restore" unicode="&#xf829;" horiz-adv-x="448" 
d="M53.2002 -19l-21.2002 339h384l-21.2002 -339c-1.55469 -24.8369 -23.0146 -44.9971 -47.8994 -45h-245.801c-24.8848 0.00292969 -46.3447 20.1631 -47.8994 45zM123.31 156.8c-10.0791 -10.6201 -2.93945 -28.7998 11.3203 -28.7998h57.3701v-112
c0 -8.83203 7.16797 -16 16 -16h32c8.83203 0 16 7.16797 16 16v112h57.3701c14.2598 0 21.3994 18.1797 11.3203 28.7998l-89.3809 94.2598c-2.52441 2.72949 -7.5918 4.94336 -11.3096 4.94336s-8.78516 -2.21387 -11.3096 -4.94336zM432 416
c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h120l9.40039 18.7002c3.58984 7.3418 13.1357 13.2998 21.3086 13.2998h0.0908203h114.3h0.0175781
c8.20215 0 17.8262 -5.95801 21.4824 -13.2998l9.40039 -18.7002h120z" />
    <glyph glyph-name="trash-restore-alt" unicode="&#xf82a;" horiz-adv-x="448" 
d="M32 -16v336h384v-336c0 -26.4961 -21.5039 -48 -48 -48h-288c-26.4961 0 -48 21.5039 -48 48zM123.31 156.8c-10.0791 -10.6201 -2.93945 -28.7998 11.3203 -28.7998h57.3701v-112c0 -8.83203 7.16797 -16 16 -16h32c8.83203 0 16 7.16797 16 16v112h57.3701
c14.2598 0 21.3994 18.1797 11.3203 28.7998l-89.3809 94.2598c-2.52441 2.72949 -7.5918 4.94336 -11.3096 4.94336s-8.78516 -2.21387 -11.3096 -4.94336zM432 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-416c-8.83203 0 -16 7.16797 -16 16
v32c0 8.83203 7.16797 16 16 16h120l9.40039 18.7002c3.58984 7.3418 13.1357 13.2998 21.3086 13.2998h0.0908203h114.3h0.0175781c8.20215 0 17.8262 -5.95801 21.4824 -13.2998l9.40039 -18.7002h120z" />
    <glyph glyph-name="user-nurse" unicode="&#xf82f;" horiz-adv-x="448" 
d="M319.41 128c71.4902 -3.09961 128.59 -61.5996 128.59 -133.79c0 -32.1318 -26.0781 -58.21 -58.21 -58.21h-331.58c-32.1318 0 -58.21 26.0781 -58.21 58.21c0 72.1904 57.0996 130.69 128.59 133.79l95.4102 -95.3896zM224 144c-70.6562 0 -128 57.3438 -128 128
v110.18c0 12.2393 9.30078 25.6611 20.7598 29.96l84.7705 31.79c5.99707 2.24902 16.0645 4.07422 22.4697 4.07422s16.4727 -1.8252 22.4697 -4.07422l84.7705 -31.75c11.459 -4.29883 20.7598 -17.7217 20.7598 -29.9609v-0.0390625v-110.18
c0 -70.6562 -57.3438 -128 -128 -128zM184 376.33v-16.6602c0 -2.75977 2.24023 -5 5 -5h21.6699v-21.6699c0 -2.75977 2.24023 -5 5 -5h16.6602c2.75977 0 5 2.24023 5 5v21.6699h21.6699c2.75977 0 5 2.24023 5 5v16.6602c0 2.75977 -2.24023 5 -5 5h-21.6699v21.6699
c0 2.75977 -2.24023 5 -5 5h-16.6602c-2.75977 0 -5 -2.24023 -5 -5v-21.6699h-21.6699c-2.75977 0 -5 -2.24023 -5 -5zM144 288v-16c0 -44.1602 35.8398 -80 80 -80s80 35.8398 80 80v16h-160z" />
    <glyph glyph-name="wave-square" unicode="&#xf83e;" horiz-adv-x="640" 
d="M476 -32h-152c-19.8721 0 -36 16.1279 -36 36v348h-96v-156c0 -19.8721 -16.1279 -36 -36 -36h-140c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h112v156c0 19.8721 16.1279 36 36 36h152c19.8721 0 36 -16.1279 36 -36v-348h96v156
c0 19.8721 16.1279 36 36 36h140c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-112v-156c0 -19.8721 -16.1279 -36 -36 -36z" />
    <glyph glyph-name="biking" unicode="&#xf84a;" horiz-adv-x="640" 
d="M400 352c-26.4961 0 -48 21.5039 -48 48s21.5039 48 48 48s48 -21.5039 48 -48s-21.5039 -48 -48 -48zM396 231l-41.3604 33.1104l-58.25 -49.9199l41.3604 -27.5703c7.86426 -5.24316 14.248 -17.1689 14.25 -26.6201v-128c0 -17.6641 -14.3359 -32 -32 -32
s-32 14.3359 -32 32v110.88l-81.7305 54.5205c-7.86621 5.24316 -14.251 17.1719 -14.251 26.626c0 8.12305 5.00488 19.0068 11.1719 24.2939l112 96c4.95508 4.25781 14.2803 7.71289 20.8135 7.71289c6.20215 0 15.1602 -3.15039 19.9961 -7.0332l71.2197 -57h52.7803
c17.6641 0 32 -14.3359 32 -32s-14.3359 -32 -32 -32h-64h-0.0595703c-6.18262 0 -15.1152 3.13574 -19.9404 7zM512 192c70.6562 0 128 -57.3438 128 -128s-57.3438 -128 -128 -128s-128 57.3438 -128 128s57.3438 128 128 128zM512 0c35.3281 0 64 28.6719 64 64
s-28.6719 64 -64 64s-64 -28.6719 -64 -64s28.6719 -64 64 -64zM128 192c70.6562 0 128 -57.3438 128 -128s-57.3438 -128 -128 -128s-128 57.3438 -128 128s57.3438 128 128 128zM128 0c35.3281 0 64 28.6719 64 64s-28.6719 64 -64 64s-64 -28.6719 -64 -64
s28.6719 -64 64 -64z" />
    <glyph glyph-name="border-all" unicode="&#xf84c;" horiz-adv-x="448" 
d="M416 416c17.6641 0 32 -14.3359 32 -32v-384c0 -17.6641 -14.3359 -32 -32 -32h-384c-17.6641 0 -32 14.3359 -32 32v384c0 17.6641 14.3359 32 32 32h384zM384 352h-128v-128h128v128zM192 352h-128v-128h128v128zM64 32h128v128h-128v-128zM256 32h128v128h-128v-128z
" />
    <glyph glyph-name="border-none" unicode="&#xf850;" horiz-adv-x="448" 
d="M240 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM336 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h32zM432 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM144 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM240 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM336 32c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 128
c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 320c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h32zM240 128c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM240 320c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM144 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM240 416c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM336 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 416
c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM48 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h32zM48 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM48 128c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM48 320c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM48 416c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM144 416c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32z" />
    <glyph glyph-name="border-style" unicode="&#xf853;" horiz-adv-x="448" 
d="M240 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM144 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32
c0 8.83203 7.16797 16 16 16h32zM336 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 224c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32
c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 128c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 32c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 320c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32zM432 416
c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-368v-368c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v400c0 17.6641 14.3359 32 32 32h400z" />
    <glyph glyph-name="fan" unicode="&#xf863;" 
d="M352.57 320c81.79 0 149.3 -61.6299 159.3 -141.33c1.30957 -10.4795 -7.17969 -19.6396 -17.6201 -18.5898l-123.11 12.4102c8.34082 -22.9707 12.8604 -48.9707 12.8604 -77.0605c0 -81.79 -61.6299 -149.3 -141.33 -159.3
c-10.4795 -1.30957 -19.6396 7.19043 -18.5898 17.6201l12.4102 123.11c-22.9707 -8.34082 -48.9707 -12.8604 -77.0605 -12.8604c-81.79 0 -149.3 61.6299 -159.3 141.33c-1.30957 10.4795 7.17969 19.6699 17.6201 18.5898l123.11 -12.4102
c-8.34082 22.9707 -12.8604 48.9707 -12.8604 77.0605c0 81.79 61.6299 149.3 141.33 159.3c10.4795 1.30957 19.6699 -7.17969 18.5898 -17.6201l-12.4102 -123.11c22.9707 8.34082 48.9707 12.8604 77.0605 12.8604zM256 160c17.6641 0 32 14.3359 32 32
s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32z" />
    <glyph glyph-name="icons" unicode="&#xf86d;" 
d="M116.65 228.65l-96.79 99.8301c-28 29.0293 -26.4102 77.0996 5 103.88c27.3896 23.3398 68.1895 19.1396 93.29 -6.80078l9.84961 -10.1396l9.86035 10.1396c25.1396 25.9404 65.8896 30.1406 93.2793 6.80078c31.4102 -26.7803 33.0605 -74.8799 4.91016 -103.88
l-96.75 -99.8301c-2.55566 -2.66992 -7.62891 -4.83594 -11.3252 -4.83594c-3.69531 0 -8.76855 2.16602 -11.3242 4.83594zM260.57 128.16c15.1406 -0.0107422 27.4297 -12.3086 27.4297 -27.4502v-0.00976562v-137.25v0c0 -15.1416 -12.2891 -27.4395 -27.4297 -27.4502
h-233.141c-15.1406 0.00585938 -27.4297 12.2988 -27.4297 27.4404v0.00976562v137.25v0.00976562c0 15.1523 12.2979 27.4502 27.4502 27.4502h0.00976562h48l7 14.2402c3.67773 9.81445 15.168 17.7793 25.6484 17.7793h0.0117188h71.71h0.0107422
c10.4814 0 21.9717 -7.96484 25.6494 -17.7793l7.08008 -14.2402h48zM144 -20c28.7041 0 52 23.2959 52 52s-23.2959 52 -52 52s-52 -23.2959 -52 -52s23.2959 -52 52 -52zM499.4 95.9004c9.70996 0 15.75 -8.79004 10.8691 -15.7002l-92.3994 -138.91
c-2.19629 -2.90039 -6.93262 -5.25488 -10.5713 -5.25488c-0.0957031 0 -0.25293 0.00195312 -0.348633 0.00488281c-8.03027 0 -14.1201 6.25 -12.2305 12.9004l24.2002 83h-62.3096c-7.62012 0 -13.5 5.58984 -12.5 11.8896l16.7998 106.93
c0.839844 5.2002 6.2002 9.10059 12.5 9.10059h75.5898c8.25 0 14.2803 -6.56055 12.1797 -13.21l-22.3594 -50.75h60.5801zM478.08 447.67c17.9199 2.75 33.9199 -12.1895 33.9199 -31.6699v-144.26c-0.269531 -26.3398 -28.7998 -47.6602 -64 -47.6602
c-35.3496 0 -64 21.4795 -64 48c0 26.5195 28.6504 48 64 48c4.46191 -0.0400391 11.6299 -0.801758 16 -1.7002v47.1797l-112 -17.2197v-108.58c-0.269531 -26.3398 -28.7998 -47.6602 -64 -47.6602c-35.3496 0 -64 21.4805 -64 48c0 26.5205 28.6504 48 64 48
c4.46191 -0.0400391 11.6299 -0.801758 16 -1.69922v106.77c0 15.9102 10.8701 29.4102 25.5098 31.6602z" />
    <glyph glyph-name="phone-alt" unicode="&#xf879;" 
d="M497.39 86.2002c8.06055 -3.50586 14.6016 -13.4844 14.6016 -22.2744c0 -1.48828 -0.264648 -3.87402 -0.59082 -5.32617l-24 -104c-2.37109 -10.2666 -12.8477 -18.5996 -23.3848 -18.5996h-0.015625c-256.1 0 -464 207.5 -464 464v0.00585938
c0 10.5371 8.33301 21.0137 18.5996 23.3838l104 24c1.45996 0.332031 3.8584 0.601562 5.35547 0.601562c8.73242 0 18.6533 -6.49707 22.1445 -14.501l48 -112c1.06836 -2.49219 1.93457 -6.71582 1.93457 -9.42773c0 -6.28613 -3.95801 -14.6064 -8.83398 -18.5723
l-60.6006 -49.6006c31.3398 -66.4688 110.721 -145.85 177.19 -177.189l49.5996 60.5996c3.97559 4.86914 12.3047 8.82129 18.5908 8.82129c2.70508 0 6.9209 -0.860352 9.40918 -1.9209z" />
    <glyph glyph-name="phone-square-alt" unicode="&#xf87b;" horiz-adv-x="448" 
d="M400 416c26.4961 0 48 -21.5039 48 -48v-352c0 -26.4961 -21.5039 -48 -48 -48h-352c-26.4961 0 -48 21.5039 -48 48v352c0 26.4961 21.5039 48 48 48h352zM383.61 108.63c0.198242 0.919922 0.373047 2.42969 0.389648 3.37012
c-0.262695 5.28613 -4.33496 11.4648 -9.08984 13.79l-70 30c-1.57422 0.613281 -4.22168 1.15527 -5.91016 1.20996c-3.82422 -0.209961 -9.02539 -2.67383 -11.6104 -5.5l-31 -37.8896c-41.5469 19.6025 -91.1768 69.2324 -110.779 110.779l37.8896 31
c2.82617 2.58496 5.29004 7.78613 5.5 11.6104c-0.0546875 1.68848 -0.597656 4.33594 -1.20996 5.91016l-30 70c-2.32812 4.75098 -8.50586 8.82324 -13.79 9.08984c-0.94043 -0.0205078 -2.4502 -0.195312 -3.37012 -0.389648l-65 -15
c-6.19238 -1.6582 -11.4033 -8.20312 -11.6299 -14.6104c0 -160.29 130 -290 290 -290c6.58496 0.00292969 13.1309 5.21289 14.6104 11.6299z" />
    <glyph glyph-name="photo-video" unicode="&#xf87c;" horiz-adv-x="640" 
d="M608 448c17.6641 0 32 -14.3359 32 -32v-320c0 -17.6641 -14.3359 -32 -32 -32h-128v320h-192v-64h-160v96c0 17.6641 14.3359 32 32 32h448zM232 345v30c0 4.96777 -4.03223 9 -9 9h-30c-4.96777 0 -9 -4.03223 -9 -9v-30c0 -4.96777 4.03223 -9 9 -9h30
c4.96777 0 9 4.03223 9 9zM584 137v30c0 4.96777 -4.03223 9 -9 9h-30c-4.96777 0 -9 -4.03223 -9 -9v-30c0 -4.96777 4.03223 -9 9 -9h30c4.96777 0 9 4.03223 9 9zM584 241v30c0 4.96777 -4.03223 9 -9 9h-30c-4.96777 0 -9 -4.03223 -9 -9v-30
c0 -4.96777 4.03223 -9 9 -9h30c4.96777 0 9 4.03223 9 9zM584 345v30c0 4.96777 -4.03223 9 -9 9h-30c-4.96777 0 -9 -4.03223 -9 -9v-30c0 -4.96777 4.03223 -9 9 -9h30c4.96777 0 9 4.03223 9 9zM416 288c17.6641 0 32 -14.3359 32 -32v-288
c0 -17.6641 -14.3359 -32 -32 -32h-384c-17.6641 0 -32 14.3359 -32 32v288c0 17.6641 14.3359 32 32 32h384zM96 224c-17.6641 0 -32 -14.3359 -32 -32s14.3359 -32 32 -32s32 14.3359 32 32s-14.3359 32 -32 32zM384 0v96l-96 96l-128 -128l-32 32l-64 -64v-32h320z" />
    <glyph glyph-name="remove-format" unicode="&#xf87d;" horiz-adv-x="640" 
d="M336 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h32.4902l26.5098 79.5996l67.0898 -51.8301l-9.25977 -27.7695h11.1699zM633.82 -10.0996
c3.41309 -2.65234 6.18359 -8.3125 6.18359 -12.6357c0 -3.02734 -1.50684 -7.42383 -3.36426 -9.81445l-19.6396 -25.2705c-2.65234 -3.41211 -8.31152 -6.18262 -12.6338 -6.18262c-3.03125 0 -7.43359 1.51172 -9.82617 3.37305l-588.36 454.72
c-3.41016 2.65234 -6.17773 8.31055 -6.17773 12.6309c0 3.02832 1.50879 7.42773 3.36816 9.81934l19.6299 25.2695c2.65234 3.41309 8.31152 6.18262 12.6338 6.18262c3.03125 0 7.43359 -1.51074 9.82617 -3.37207l114.54 -88.5205v43.9004c0 8.83203 7.16797 16 16 16
h416c8.83203 0 16 -7.16797 16 -16v-96c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v32h-117.83l-49.1699 -147.59zM309.91 240.24l31.9199 95.7598h-117.83v-29.3604z" />
    <glyph glyph-name="sort-alpha-down-alt" unicode="&#xf881;" horiz-adv-x="448" 
d="M176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262l-80 96c-10.0703 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32
c8.83203 0 16 -7.16797 16 -16v-304h48zM288 224c-8.83203 0 -16 7.16797 -16 16v17.6299v0.00292969c0 7.93262 4.81152 18.6475 10.7402 23.917l61.2598 70.4502h-56c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128c8.83203 0 16 -7.16797 16 -16
v-17.6299v-0.00292969c0 -7.93262 -4.81152 -18.6475 -10.7402 -23.917l-61.2598 -70.4502h56c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128zM447.06 -10.6201c0.514648 -1.44043 0.931641 -3.85059 0.931641 -5.37988
c0 -8.82715 -7.16406 -15.9951 -15.9912 -16h-24.8398h-0.0449219c-6.42773 0 -13.249 4.96387 -15.2256 11.0801l-4.40918 12.9199h-71l-4.4209 -12.9199c-1.97559 -6.11621 -8.79688 -11.0801 -15.2246 -11.0801h-0.00488281h-24.8301
c-8.82715 0.00488281 -15.9912 7.17285 -15.9912 16c0 1.5293 0.416992 3.93945 0.931641 5.37988l59.2695 160c2.09277 5.8623 8.84375 10.6201 15.0684 10.6201h0.00195312h41.4395h0.00195312c6.22461 0 12.9756 -4.75781 15.0684 -10.6201zM335.61 48h32.7793
l-16.3896 48z" />
    <glyph glyph-name="sort-alpha-up-alt" unicode="&#xf882;" horiz-adv-x="448" 
d="M16 288c-14.2197 0 -21.3496 17.2598 -11.3096 27.3096l80 96c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262l80 -96c10.0703 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32
c-8.83203 0 -16 7.16797 -16 16v304h-48zM288 224c-8.83203 0 -16 7.16797 -16 16v17.6299v0.00292969c0 7.93262 4.81152 18.6475 10.7402 23.917l61.2598 70.4502h-56c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128c8.83203 0 16 -7.16797 16 -16
v-17.6299v-0.00292969c0 -7.93262 -4.81152 -18.6475 -10.7402 -23.917l-61.2598 -70.4502h56c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-128zM447.06 -10.6201c0.514648 -1.44043 0.931641 -3.85059 0.931641 -5.37988
c0 -8.82715 -7.16406 -15.9951 -15.9912 -16h-24.8398h-0.0449219c-6.42773 0 -13.249 4.96387 -15.2256 11.0801l-4.40918 12.9199h-71l-4.4209 -12.9199c-1.97559 -6.11621 -8.79688 -11.0801 -15.2246 -11.0801h-0.00488281h-24.8301
c-8.82715 0.00488281 -15.9912 7.17285 -15.9912 16c0 1.5293 0.416992 3.93945 0.931641 5.37988l59.2695 160c2.09277 5.8623 8.84375 10.6201 15.0684 10.6201h0.00195312h41.4395h0.00195312c6.22461 0 12.9756 -4.75781 15.0684 -10.6201zM335.61 48h32.7793
l-16.3896 48z" />
    <glyph glyph-name="sort-amount-down-alt" unicode="&#xf884;" 
d="M240 352c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-64zM240 224c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-128zM496 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-256c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h256zM240 96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h192
c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-192zM176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262l-80 96
c-10.0801 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32c8.83203 0 16 -7.16797 16 -16v-304h48z" />
    <glyph glyph-name="sort-amount-up-alt" unicode="&#xf885;" 
d="M240 352c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h64c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-64zM240 224c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h128c8.83203 0 16 -7.16797 16 -16v-32
c0 -8.83203 -7.16797 -16 -16 -16h-128zM496 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-256c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h256zM240 96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h192
c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-192zM16 288c-14.2197 0 -21.3496 17.2598 -11.3096 27.3096l80 96c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262l80 -96
c10.0801 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v304h-48z" />
    <glyph glyph-name="sort-numeric-down-alt" unicode="&#xf886;" horiz-adv-x="448" 
d="M176 96c14.2197 0 21.3496 -17.2598 11.3301 -27.3096l-80 -96c-2.58691 -2.58496 -7.65332 -4.68262 -11.3105 -4.68262c-3.65625 0 -8.72266 2.09766 -11.3096 4.68262l-80 96c-10.0703 10.0693 -2.90039 27.3096 11.29 27.3096h48v304c0 8.83203 7.16797 16 16 16h32
c8.83203 0 16 -7.16797 16 -16v-304h48zM400 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v64h-16c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16
c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-112h16zM330.17 413.09c53.4502 14.25 101.83 -25.8799 101.85 -77.0898v-10.7695c0 -70.3906 -28.25 -107.23 -86.25 -132
c-8.36914 -3.58008 -18.0293 1.2793 -20.8994 9.90918l-9.90039 20c-2.62012 7.87012 0.610352 16.9404 8.18066 20.3408c6.2793 2.71387 15.6201 8.49805 20.8496 12.9092c-47.6396 4.76074 -83.0996 51.4805 -68.8301 102.53c6.80762 23.4512 31.4482 47.7197 55 54.1699z
M352 316c11.04 0 20 8.95996 20 20s-8.95996 20 -20 20s-20 -8.95996 -20 -20s8.95996 -20 20 -20z" />
    <glyph glyph-name="sort-numeric-up-alt" unicode="&#xf887;" horiz-adv-x="448" 
d="M107.31 411.31l80 -96c10.0703 -10.0693 2.90039 -27.3096 -11.3096 -27.3096h-48v-304c0 -8.83203 -7.16797 -16 -16 -16h-32c-8.83203 0 -16 7.16797 -16 16v304h-48c-14.2197 0 -21.3496 17.2598 -11.3096 27.3096l80 96
c2.58594 2.58496 7.65332 4.68262 11.3096 4.68262s8.72363 -2.09766 11.3096 -4.68262zM400 32c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-96c-8.83203 0 -16 7.16797 -16 16v32c0 8.83203 7.16797 16 16 16h16v64h-16
c-8.82422 0.0078125 -15.9863 7.17578 -15.9863 16c0 2.08984 0.759766 5.30176 1.69629 7.16992l16 32c2.44141 4.87012 8.84277 8.8252 14.29 8.83008h48c8.83203 0 16 -7.16797 16 -16v-112h16zM330.17 413.09c53.4502 14.25 101.83 -25.8799 101.85 -77.0898v-10.7695
c0 -70.3906 -28.25 -107.23 -86.25 -132c-8.36914 -3.58008 -18.0293 1.2793 -20.8994 9.90918l-9.90039 20c-2.62012 7.87012 0.610352 16.9404 8.18066 20.3408c6.2793 2.71387 15.6201 8.49805 20.8496 12.9092c-47.6396 4.76074 -83.0996 51.4805 -68.8301 102.53
c6.80762 23.4512 31.4482 47.7197 55 54.1699zM352 316c11.04 0 20 8.95996 20 20s-8.95996 20 -20 20s-20 -8.95996 -20 -20s8.95996 -20 20 -20z" />
    <glyph glyph-name="spell-check" unicode="&#xf891;" horiz-adv-x="576" 
d="M272 192c-8.83203 0 -16 7.16797 -16 16v224c0 8.83203 7.16797 16 16 16h75c42.2998 0 80.9004 -30.5703 84.6699 -72.6797c0.186523 -2.02051 0.337891 -5.30762 0.337891 -7.33691c0 -11.0186 -4.20996 -27.8516 -9.39746 -37.5732
c14.0186 -13.0674 25.3965 -39.2256 25.3965 -58.3906c0 -1.29199 -0.0615234 -3.38867 -0.136719 -4.67969c-2.50977 -43.1396 -41.3105 -75.3398 -84.5098 -75.3398h-91.3604zM312 392v-48h40c13.248 0 24 10.752 24 24s-10.752 24 -24 24h-40zM312 296v-48h56
c13.248 0 24 10.752 24 24s-10.752 24 -24 24h-56zM155.12 425.75l68.2998 -213.48c0.320312 -1.15625 0.580078 -3.06934 0.580078 -4.26953c0 -8.83203 -7.16797 -16 -16 -16v0h-24.9297h-0.000976562c-6.71875 0 -13.626 5.25488 -15.4189 11.7305l-11.9404 36.2695
h-87.4199l-11.9404 -36.2695c-1.79297 -6.47559 -8.7002 -11.7305 -15.4189 -11.7305h-0.000976562h-24.9297c-8.82617 0.00488281 -15.9902 7.17383 -15.9902 16c0 1.2002 0.259766 3.11328 0.580078 4.26953l68.29 213.48c3.92871 12.2822 17.583 22.25 30.4785 22.25
h0.00195312h25.2793h0.00195312c12.8955 0 26.5498 -9.96777 30.4785 -22.25zM89.3701 304h45.2598l-22.6299 68.7002zM571.37 171.52c2.58203 -2.58594 4.65723 -7.65039 4.65723 -11.3047c0 -3.64551 -2.08594 -8.70117 -4.65723 -11.2852l-208 -208.21
c-2.5752 -2.60449 -7.6377 -4.71777 -11.2998 -4.71777c-3.66309 0 -8.72559 2.11328 -11.3008 4.71777l-112 112.21c-2.57617 2.58496 -4.66699 7.64551 -4.66699 11.2949c0 3.65039 2.09082 8.70996 4.66699 11.2949l45.3008 45.3008
c2.57324 2.60352 7.63379 4.71777 11.2949 4.71777s8.72168 -2.11426 11.2949 -4.71777l55.4102 -55.5l151.5 151.5c2.57324 2.60352 7.63379 4.71777 11.2949 4.71777s8.72168 -2.11426 11.2949 -4.71777z" />
    <glyph glyph-name="voicemail" unicode="&#xf897;" horiz-adv-x="640" 
d="M496 320c79.4883 0 144 -64.5117 144 -144s-64.5117 -144 -144 -144h-352c-79.4844 0.00390625 -143.993 64.5156 -143.993 144c0 79.4883 64.5117 144 144 144s144 -64.5117 144 -144c0 -24.1113 -10.8711 -59.9512 -24.2666 -80h112.52
c-13.3955 20.0488 -24.2666 55.8887 -24.2666 80c0 79.4883 64.5117 144 144 144h0.00683594zM64 176c0 -44.1602 35.8398 -80 80 -80s80 35.8398 80 80s-35.8398 80 -80 80s-80 -35.8398 -80 -80zM496 96c44.1602 0 80 35.8398 80 80s-35.8398 80 -80 80
s-80 -35.8398 -80 -80s35.8398 -80 80 -80z" />
    <glyph glyph-name="hat-cowboy" unicode="&#xf8c0;" horiz-adv-x="640" 
d="M490 151.1c-38.7695 -12.5898 -93.7305 -23.0996 -170 -23.0996s-131.19 10.5303 -169.99 23.1201c9.50977 57.4102 39.5098 232.88 97.71 232.88c14 0 26.4902 -6 37 -14c8.62988 -6.57812 24.4395 -11.917 35.29 -11.917s26.6611 5.33887 35.29 11.917
c10.5098 8.07031 23 14 37 14c58.21 0 88.21 -175.51 97.7002 -232.9zM632.9 188.28c3.90625 -2.625 7.08594 -8.57422 7.08594 -13.2803c0 -1.5752 -0.442383 -4.05273 -0.986328 -5.53027c-0.730469 -2.01953 -77.3203 -201.47 -319 -201.47s-318.27 199.45 -319 201.47
c-0.537109 1.46973 -0.973633 3.93164 -0.973633 5.49512c0 8.83203 7.16797 16 16 16c3.39844 0 8.20215 -1.84766 10.7236 -4.125c1.01953 -0.899414 102.42 -90.8398 293.24 -90.8398c191.89 0 292.16 89.8799 293.16 90.7803
c2.53418 2.3291 7.38477 4.21875 10.8262 4.21875c2.69141 0 6.68945 -1.21777 8.92383 -2.71875z" />
    <glyph glyph-name="hat-cowboy-side" unicode="&#xf8c1;" horiz-adv-x="640" 
d="M260.8 156.94l98.0098 -84.4805c78.1904 -67.3896 129.98 -104.46 233.19 -104.46h-546.12c-14.0498 0 -27.1299 7.53027 -35.8799 20.6396c-9 13.4707 -12.1201 30.7002 -8.57031 47.3008c20.04 93.3398 85.5703 156.06 162.971 156.06
c34.3994 0 67.7695 -12.1201 96.3994 -35.0596zM495.45 175.23c114.95 -7.90039 144.55 -101.841 144.55 -127.23c0 -26.4961 -21.5039 -48 -48 -48c-97.0996 0 -141.24 35.46 -212.31 96.7002l-98 84.4795c-35.29 28.2705 -75.5 42.8203 -117.29 42.8203
c-7.09082 0 -13.8906 -1.16992 -20.79 -2l6.88965 65.21c2.72852 25.4766 25.2852 50.4707 50.3496 55.79l191.15 40.5898c3.63574 0.773438 9.60254 1.40137 13.3193 1.40137c29.7891 0 58.0498 -23.8301 63.0811 -53.1914z" />
    <glyph glyph-name="mouse" unicode="&#xf8cc;" horiz-adv-x="384" 
d="M0 96v128h384v-128c0 -88.3203 -71.6797 -160 -160 -160h-64c-88.3203 0 -160 71.6797 -160 160zM176 448v-192h-176v32c0 88.3203 71.6797 160 160 160h16zM224 448c88.3203 0 160 -71.6797 160 -160v-32h-176v192h16z" />
    <glyph glyph-name="record-vinyl" unicode="&#xf8d9;" 
d="M256 296c57.4082 0 104 -46.5918 104 -104s-46.5918 -104 -104 -104s-104 46.5918 -104 104s46.5918 104 104 104zM256 168c13.248 0 24 10.752 24 24s-10.752 24 -24 24s-24 -10.752 -24 -24s10.752 -24 24 -24zM256 440c137 0 248 -111 248 -248s-111 -248 -248 -248
s-248 111 -248 248s111 248 248 248zM256 64c70.6562 0 128 57.3438 128 128s-57.3438 128 -128 128s-128 -57.3438 -128 -128s57.3438 -128 128 -128z" />
    <glyph glyph-name="caravan" unicode="&#xf8ff;" horiz-adv-x="640" 
d="M416 240c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM624 128c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-336c0 -52.9922 -43.0078 -96 -96 -96s-96 43.0078 -96 96h-32
c-35.3281 0 -64 28.6719 -64 64v256c0 35.3281 28.6719 64 64 64h352c88.3203 0 160 -71.6797 160 -160v-160h48zM192 16c26.4688 0.0273438 47.9727 21.5312 48 48c0 26.4961 -21.5039 48 -48 48s-48 -21.5039 -48 -48s21.5039 -48 48 -48zM256 256v64
c0 17.6641 -14.3359 32 -32 32h-128c-17.6641 0 -32 -14.3359 -32 -32v-64c0 -17.6641 14.3359 -32 32 -32h128c17.6641 0 32 14.3359 32 32zM448 128v192c0 17.6641 -14.3359 32 -32 32h-64c-17.6641 0 -32 -14.3359 -32 -32v-192h128z" />
    <glyph glyph-name="faucet" unicode="&#xf905;" 
d="M352 192c88.3203 0 160 -71.6797 160 -160c0 -17.6641 -14.3359 -32 -32 -32h-64c-17.6641 0 -32 14.3359 -32 32s-14.3359 32 -32 32h-12.79c-20.5898 -37.7305 -64.21 -64 -115.21 -64s-94.6201 26.2695 -115.21 64h-92.79c-8.83203 0 -16 7.16797 -16 16v96
c0 8.83203 7.16797 16 16 16h118.61c15.71 13.4004 35.46 23 57.3896 28v47.5596l32 3.38086l32 -3.38086v-47.5596c21.9297 -4.92969 41.6797 -14.5596 57.3896 -28h38.6104zM81.5898 288.09c-9.41992 -1 -17.5898 6.81055 -17.5898 16.7998v30.2207
c0 9.98926 8.16992 17.7998 17.5898 16.8096l110.41 -11.6602v27.7402c0 8.83203 7.16797 16 16 16h32c8.83203 0 16 -7.16797 16 -16v-27.7402l110.41 11.6602c9.41992 0.990234 17.5898 -6.80957 17.5898 -16.8096v-30.2207
c0 -9.98926 -8.16992 -17.7998 -17.5898 -16.7998l-142.41 15z" />
    <glyph glyph-name="trailer" unicode="&#xf941;" horiz-adv-x="640" 
d="M624 128c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-337.61c-7.83008 54.21 -54 96 -110.39 96s-102.56 -41.79 -110.39 -96h-49.6104c-8.83203 0 -16 7.16797 -16 16v288c0 8.83203 7.16797 16 16 16h512c8.83203 0 16 -7.16797 16 -16v-240
h80zM96 204.32v107.68c0 4.41602 -3.58398 8 -8 8h-16c-4.41602 0 -8 -3.58398 -8 -8v-128.39c8.20996 6.67578 22.5469 15.9541 32 20.71zM192 222.86v89.1396c0 4.41602 -3.58398 8 -8 8h-16c-4.41602 0 -8 -3.58398 -8 -8v-89.1396
c5.30957 0.489258 10.5703 1.13965 16 1.13965s10.6904 -0.650391 16 -1.13965zM288 183.61v128.39c0 4.41602 -3.58398 8 -8 8h-16c-4.41602 0 -8 -3.58398 -8 -8v-107.68c9.45312 -4.75586 23.79 -14.0342 32 -20.71zM384 128v184c0 4.41602 -3.58398 8 -8 8h-16
c-4.41602 0 -8 -3.58398 -8 -8v-184h32zM480 128v184c0 4.41602 -3.58398 8 -8 8h-16c-4.41602 0 -8 -3.58398 -8 -8v-184h32zM176 128c44.1602 0 80 -35.8398 80 -80s-35.8398 -80 -80 -80s-80 35.8398 -80 80s35.8398 80 80 80zM176 16c17.6641 0 32 14.3359 32 32
s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32z" />
    <glyph glyph-name="box-tissue" unicode="&#xf95b;" 
d="M383.88 160.18h-256l-64 288h141.4c27.9277 -0.00195312 57.7646 -21.5059 66.5996 -48c8.83105 -26.4932 38.6641 -47.9971 66.5898 -48h109.41zM-0.120117 -31.8203v64h512v-64c0 -17.6641 -14.3359 -32 -32 -32h-448c-17.6641 0 -32 14.3359 -32 32zM479.88 224.18
c17.6582 -0.00488281 31.9902 -14.3408 31.9902 -32v0v-128h-512v128c0 17.6641 14.3359 32 32 32h49l14.2197 -64h-15.21c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16h352c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16h-14.2695l21.3301 64h40.9395z" />
    <glyph glyph-name="hand-holding-medical" unicode="&#xf95c;" horiz-adv-x="576" 
d="M159.88 272.18c-8.83203 0 -16 7.16797 -16 16v64c0 8.83203 7.16797 16 16 16h64v64c0 8.83203 7.16797 16 16 16h64c8.83203 0 16 -7.16797 16 -16v-64h64c8.83203 0 16 -7.16797 16 -16v-64c0 -8.83203 -7.16797 -16 -16 -16h-64v-64c0 -8.83203 -7.16797 -16 -16 -16
h-64c-8.83203 0 -16 7.16797 -16 16v64h-64zM568.07 111.87c4.28906 -5.83496 7.77051 -16.4492 7.77051 -23.6914c0 -11.1436 -7.27637 -25.5596 -16.2412 -32.1787l-135.029 -99.5703c-15.2061 -11.1436 -42.8477 -20.2246 -61.7002 -20.2695h-347
c-8.77246 0.0595703 -15.9404 7.22754 -16 16v96c0.0595703 8.77246 7.22754 15.9404 16 16h55.3604l46.5 37.7402c17.8828 14.4893 51.0781 26.25 74.0957 26.25h0.0234375h160h0.00488281c17.6973 0 32.0596 -14.3633 32.0596 -32.0605
c0 -1.47852 -0.198242 -3.86133 -0.444336 -5.32031c-2.62012 -15.7393 -17.3701 -26.6094 -33.3701 -26.6094h-78.2393c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16h120.609l119.67 88.1797c5.8418 4.3252 16.4814 7.83496 23.749 7.83496
c11.1621 0 25.5791 -7.30469 32.1816 -16.3047z" />
    <glyph glyph-name="hand-sparkles" unicode="&#xf95d;" horiz-adv-x="640" 
d="M106.66 277.36l-20.7402 -49.6201c-1.01074 -2.04297 -3.68066 -3.7002 -5.95996 -3.7002s-4.94922 1.65723 -5.95996 3.7002l-20.6602 49.6602h-0.0703125l-49.5898 20.5996c-1.92383 1.09863 -3.57227 3.78711 -3.67969 6v0c0.106445 2.21973 1.76367 4.9082 3.7002 6
l49.6299 20.6904h0.0498047l20.7002 49.6299c1.01465 2.03516 3.68555 3.6875 5.95996 3.6875s4.94434 -1.65234 5.95996 -3.6875l20.6602 -49.6406h0.0703125l49.5693 -20.6699c1.92871 -1.0957 3.57715 -3.78418 3.68066 -6v0
c-0.108398 -2.21289 -1.75684 -4.90039 -3.68066 -6l-49.5498 -20.6494h-0.0898438zM471.38 -19.4102l37.4902 -15.6299l0.0703125 -0.169922c-7.59082 -17.0596 -24 -28.79 -43.2402 -28.79h-197.61c-13.4805 0.0224609 -30.8584 8.88867 -38.79 19.79l-125.6 172.61
c-4.22852 5.81055 -7.66016 16.3584 -7.66016 23.5449c0 22.0879 17.9268 40.0146 40.0146 40.0146c11.2441 0 25.7393 -7.37891 32.3555 -16.4697l23.5898 -32.4902v241c0 17.6641 14.3359 32 32 32s32 -14.3359 32 -32v-152c0 -4.41602 3.58398 -8 8 -8h16
c4.41602 0 8 3.58398 8 8v184c0 17.6641 14.3359 32 32 32s32 -14.3359 32 -32v-184c0 -4.41602 3.58398 -8 8 -8h16c4.41602 0 8 3.58398 8 8v152c0 17.6641 14.3359 32 32 32s32 -14.3359 32 -32v-152c0 -4.41602 3.58398 -8 8 -8h16c4.41602 0 8 3.58398 8 8v72
c0 17.6641 14.3359 32 32 32s32 -14.3359 32 -32v-176.03c-0.0195312 -1.30957 -0.269531 -2.66992 -0.269531 -4c-7.77051 -3.70996 -14.5 -9.59961 -18.3506 -17.3398l-0.469727 -0.950195l-0.410156 -1l-15.6299 -37.4795l-37.4902 -15.6299l-1 -0.430664l-1 -0.489258
c-11.7803 -5.90527 -21.3408 -21.3926 -21.3408 -34.5703s9.56055 -28.665 21.3408 -34.5703l1 -0.5zM349.79 108.48c1.22266 0.609375 2.21582 2.21289 2.21582 3.5791c0 1.36719 -0.993164 2.9707 -2.21582 3.58008l-29.79 12.4199l-12.4297 29.7803
c-0.611328 1.21777 -2.21289 2.20605 -3.5752 2.20605s-2.96387 -0.988281 -3.5752 -2.20605l-12.4199 -29.7803l-29.79 -12.4199c-1.22266 -0.609375 -2.21582 -2.21289 -2.21582 -3.58008c0 -1.36621 0.993164 -2.96973 2.21582 -3.5791l29.79 -12.4102l12.4297 -29.7803
c0.611328 -1.21777 2.21289 -2.20605 3.5752 -2.20605s2.96387 0.988281 3.5752 2.20605l12.4199 29.7803zM640 16.0898l-0.0703125 -0.0703125v0c-0.117188 -2.19727 -1.76562 -4.86328 -3.67969 -5.94922l-49.5498 -20.6602h-0.0898438v0l-20.6904 -49.6201
c-1.01074 -2.04297 -3.68066 -3.7002 -5.95996 -3.7002s-4.94922 1.65723 -5.95996 3.7002l-20.6602 49.5898h-0.0703125l-49.5693 20.6699c-1.91406 1.08691 -3.5625 3.75293 -3.68066 5.9502v0c0.101562 2.2168 1.75 4.90527 3.68066 6l49.6299 20.7402h0.0498047
l20.7002 49.6299c1.01465 2.03516 3.68555 3.6875 5.95996 3.6875s4.94434 -1.65234 5.95996 -3.6875l20.6797 -49.6104h0.0703125l49.5703 -20.6699c1.92969 -1.09473 3.57812 -3.7832 3.67969 -6z" />
    <glyph glyph-name="hands-wash" unicode="&#xf95e;" horiz-adv-x="576" 
d="M496 224c-26.4961 0 -48 21.5039 -48 48s21.5039 48 48 48s48 -21.5039 48 -48s-21.5039 -48 -48 -48zM311.47 269.55l-16.0801 -4.96973l20.9004 66.1699c3.5 11.0703 14.1797 18.8604 25.71 17.5098c11.8564 -1.25195 21.4785 -11.9453 21.4785 -23.8672
c0 -2.05566 -0.505859 -5.31348 -1.12891 -7.27246l-15.3496 -48.6104c-5.0752 1.88184 -13.5869 3.44531 -19 3.49023h-0.0322266c-4.6543 0 -12.0449 -1.09766 -16.498 -2.4502zM93.6504 61.6699c-33.4609 19.3945 -61.0801 66.5195 -61.6504 105.19v112.729
c0.179688 13.3203 11.6699 23.9102 24.9004 23.8604c13.1709 -0.0771484 23.8604 -10.8281 23.8604 -24c0 -0.0410156 0 -0.108398 -0.000976562 -0.150391l2.06055 -50.0498l60 189.85c3.5 11.0703 14.1797 18.9004 25.71 17.46
c11.8398 -1.26465 21.4492 -11.9561 21.4492 -23.8633c0 -2.04785 -0.500977 -5.29395 -1.11914 -7.24609l-38.5605 -122c-0.205078 -0.649414 -0.371094 -1.72949 -0.371094 -2.41016c0 -4.41699 3.58398 -8.00195 8.00098 -8.00195
c3.2373 0 6.65527 2.50586 7.62988 5.5918l47.9307 151.71c3.50977 11.0605 14.1797 18.8506 25.71 17.5098c11.8398 -1.26465 21.4502 -11.9561 21.4502 -23.8633c0 -2.04785 -0.501953 -5.29395 -1.12012 -7.24609l-43.3701 -137.79
c-0.206055 -0.650391 -0.373047 -1.73242 -0.373047 -2.41504c0 -4.41797 3.58496 -8.00293 8.00293 -8.00293c3.23535 0 6.65332 2.50293 7.62988 5.58789l33.4502 106.42c3.5 11.0703 14.1895 18.8604 25.7197 17.5195
c11.8408 -1.26465 21.4502 -11.9561 21.4502 -23.8633c0 -2.04785 -0.501953 -5.29395 -1.12012 -7.24609l-34.1602 -108.12l-73.7002 -22.7598c-59.0469 -19.5098 -107.01 -85.8135 -107.06 -148v-25.6904c-0.80957 -0.169922 -1.5498 -0.519531 -2.34961 -0.709961z
M519.1 112c11.6104 0 22.25 -7.83984 24.4404 -19.2402c0.262695 -1.30078 0.476562 -3.43262 0.476562 -4.75977c0 -13.248 -10.752 -24 -24 -24h-0.0166016h-160c-4.41602 0 -8 -3.58398 -8 -8s3.58398 -8 8 -8h127.1c11.6104 0 22.25 -7.83984 24.4404 -19.2402
c0.262695 -1.30078 0.476562 -3.43262 0.476562 -4.75977c0 -13.248 -10.752 -24 -24 -24h-0.0166016h-128c-4.41602 0 -8 -3.58398 -8 -8s3.58398 -8 8 -8h95.0996c11.6104 0 22.25 -7.83984 24.4404 -19.2402c0.262695 -1.30078 0.476562 -3.43262 0.476562 -4.75977
c0 -13.248 -10.752 -24 -24 -24h-0.0166016h-208c-18.4902 0.0703125 -46.2656 8.00879 -62 17.7197c3.32715 8.06641 6.02734 21.6953 6.02734 30.4209c0 36.0527 -28.6846 71.0908 -64.0273 78.209v25.6504v0.00683594c0 49.501 38.165 102.223 85.1904 117.684
l107.72 33.25c1.91211 0.59082 5.08887 1.07031 7.08984 1.07031c13.2539 0 24.0107 -10.7568 24.0107 -24.0107c0 -9.77637 -7.58008 -20.0537 -16.9209 -22.9404l-47.0898 -17.0596h199.1c11.6104 0 22.25 -7.83984 24.4404 -19.2402
c0.262695 -1.30078 0.476562 -3.43262 0.476562 -4.75977c0 -13.248 -10.752 -24 -24 -24h-0.0166016h-128c-4.41602 0 -8 -3.58398 -8 -8s3.58398 -8 8 -8h159.1zM416 384c-17.6641 0 -32 14.3359 -32 32s14.3359 32 32 32s32 -14.3359 32 -32s-14.3359 -32 -32 -32z
M112 32c26.4961 0 48 -21.5039 48 -48s-21.5039 -48 -48 -48s-48 21.5039 -48 48s21.5039 48 48 48z" />
    <glyph glyph-name="handshake-alt-slash" unicode="&#xf95f;" horiz-adv-x="640" 
d="M358.59 252.4l26.1104 23.8896c2.86914 2.62598 5.19824 7.91504 5.19824 11.8047c0 8.83398 -7.16992 16.0039 -16.0039 16.0039c-3.43164 0 -8.27246 -1.88086 -10.8047 -4.19824l-27 -24.7002l-32.6895 -29.9199l330.43 -255.38
c3.41016 -2.65234 6.17773 -8.31055 6.17773 -12.6309c0 -3.0293 -1.50879 -7.42773 -3.36816 -9.81934l-19.6396 -25.2705c-2.65234 -3.41211 -8.31152 -6.18262 -12.6338 -6.18262c-3.03125 0 -7.43359 1.51172 -9.82617 3.37305l-588.35 454.72
c-3.41016 2.65234 -6.17773 8.31055 -6.17773 12.6309c0 3.02832 1.50781 7.42773 3.36719 9.81934l19.6201 25.2695c2.65234 3.41602 8.31348 6.1875 12.6377 6.1875c3.03418 0 7.43848 -1.5127 9.83203 -3.37695l116.891 -90.3301l20.3398 20.2998
c5.16211 5.17969 15.2871 9.39551 22.5996 9.41016h83.79l-75.5996 -69.2402l25.6895 -19.8496l88.1201 80.6797c5.0625 4.63965 14.7432 8.40723 21.6104 8.41016h85.8896c7.31641 -0.0126953 17.4453 -4.22852 22.6104 -9.41016l54.5898 -54.5898h112v0
c8.78223 0 15.9502 -7.12793 16 -15.9102v-191.8c-0.0273438 -8.80469 -7.19531 -15.9727 -16 -16h-97.5898c-2.26465 12.7275 -12.2148 29.7109 -22.21 37.9102zM16 320h7.55957l382.44 -295.59l-8.7998 -10.8203c-6.15723 -7.57617 -19.0762 -13.7246 -28.8389 -13.7246
c-7.29004 0 -17.7959 3.73438 -23.4512 8.33496l-17.9102 15.5l-0.200195 -0.200195c-10.6025 -13.0381 -32.8477 -23.6201 -49.6533 -23.6201c-12.5381 0 -30.6133 6.41602 -40.3467 14.3203l-90.5 81.8896h-130.3c-8.83203 0 -16 7.16797 -16 16v191.91
c0.0273438 8.80469 7.19531 15.9727 16 16z" />
    <glyph glyph-name="handshake-slash" unicode="&#xf960;" horiz-adv-x="640" 
d="M0 319.79h23.8301l72.1699 -55.79v-168c0 -17.6641 -14.3359 -32 -32 -32h-64v255.79zM48 127.9c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16s16 7.16797 16 16s-7.16797 16 -16 16zM128 96.0898v143.19l278 -214.87l-8.7998 -10.8203
c-6.15723 -7.57617 -19.0762 -13.7246 -28.8389 -13.7246c-7.29004 0 -17.7959 3.73438 -23.4512 8.33496l-17.9102 15.5l-0.200195 -0.200195c-10.6025 -13.0381 -32.8477 -23.6201 -49.6533 -23.6201c-12.5381 0 -30.6133 6.41602 -40.3467 14.3203l-90.5 81.8896
h-18.2998zM544 319.79h96v-255.89h-64c-17.6641 0 -32 14.3359 -32 32v223.89zM592 95.9004c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16s-16 -7.16797 -16 -16s7.16797 -16 16 -16zM303.33 245.33l330.5 -255.43c3.41309 -2.65234 6.18359 -8.3125 6.18359 -12.6357
c0 -3.02734 -1.50684 -7.42383 -3.36328 -9.81445l-19.6504 -25.2705c-2.65234 -3.41504 -8.31348 -6.1875 -12.6377 -6.1875c-3.03418 0 -7.43848 1.51367 -9.83203 3.37793l-588.34 454.72c-3.41016 2.65234 -6.17773 8.31055 -6.17773 12.6309
c0 3.02832 1.50781 7.42773 3.36719 9.81934l19.6201 25.2695c2.65234 3.41602 8.31348 6.1875 12.6377 6.1875c3.03418 0 7.43848 -1.5127 9.83203 -3.37695l116.891 -90.3398l20.3398 20.3096c5.16211 5.17969 15.2871 9.39551 22.5996 9.41016h83.79l-75.5996 -69.2402
l25.6396 -19.8096l88.0703 80.6396c5.05566 4.64258 14.7305 8.41016 21.5947 8.41016h0.00488281h85.9004h0.0351562c7.31055 0 17.4199 -4.21582 22.5645 -9.41016l54.6104 -54.5898v-193.5c-2.02246 2.29102 -5.56641 5.74023 -7.91016 7.7002l-145.59 118.2
l26.0898 23.8896c2.73828 2.61035 4.95996 7.79883 4.95996 11.5811c0 8.83203 -7.16797 16 -16 16c-3.32422 0 -8.05078 -1.7793 -10.5498 -3.9707z" />
    <glyph glyph-name="head-side-cough" unicode="&#xf961;" horiz-adv-x="640" 
d="M616 144c-13.248 0 -24 10.752 -24 24s10.752 24 24 24s24 -10.752 24 -24s-10.752 -24 -24 -24zM552 32c13.248 0 24 -10.752 24 -24s-10.752 -24 -24 -24s-24 10.752 -24 24s10.752 24 24 24zM488 88c13.248 0 24 -10.752 24 -24s-10.752 -24 -24 -24
s-24 10.752 -24 24s10.752 24 24 24zM616 -16c13.248 0 24 -10.752 24 -24s-10.752 -24 -24 -24s-24 10.752 -24 24s10.752 24 24 24zM616 88c13.248 0 24 -10.752 24 -24s-10.752 -24 -24 -24s-24 10.752 -24 24s10.752 24 24 24zM552 128c13.248 0 24 -10.752 24 -24
s-10.752 -24 -24 -24s-24 10.752 -24 24s10.752 24 24 24zM477.22 173c1.52344 -3.42676 2.75977 -9.25 2.75977 -13c0 -17.6523 -14.3271 -31.9883 -31.9795 -32h-32v-32h-96c-17.6641 0 -32 -14.3359 -32 -32s14.3359 -32 32 -32h96c0 -35.3281 -28.6719 -64 -64 -64h-64
v-32h-224v177.12c-39.25 35.2598 -64 86.1299 -64 142.88c0 106 86 192 192 192h42.0996c59.5439 -0.0390625 135.704 -39.5752 170 -88.25c24.6201 -35 52.1201 -139.63 73.1201 -186.75zM288 224c17.626 0.0380859 31.9619 14.374 32 32c0 17.6641 -14.3359 32 -32 32
s-32 -14.3359 -32 -32s14.3359 -32 32 -32z" />
    <glyph glyph-name="head-side-cough-slash" unicode="&#xf962;" horiz-adv-x="640" 
d="M454.11 128.79l179.72 -138.89c3.41016 -2.65234 6.17773 -8.31055 6.17773 -12.6309c0 -3.0293 -1.50879 -7.42773 -3.36816 -9.81934l-19.6396 -25.2705c-2.65234 -3.41504 -8.31348 -6.1875 -12.6377 -6.1875c-3.03418 0 -7.43848 1.51367 -9.83203 3.37793
l-588.351 454.72c-3.41016 2.65234 -6.17773 8.31055 -6.17773 12.6309c0 3.02832 1.50879 7.42773 3.36816 9.81934l19.6299 25.2695c2.65234 3.41309 8.31152 6.18262 12.6338 6.18262c3.03125 0 7.43359 -1.51074 9.82617 -3.37207l38.7197 -29.9199
c26.8672 18.3818 75.0928 33.2998 107.646 33.2998h0.173828h42.0996c59.5439 -0.0390625 135.704 -39.5752 170 -88.25c24.6201 -35 52.1201 -139.63 73.1201 -186.75c8.51074 -19.21 -3.5498 -40.4004 -23.1094 -44.21zM313.39 237.55
c3.85059 5.28027 6.61035 11.4502 6.58008 18.4502c-0.0322266 17.6309 -14.3691 31.9668 -32 32c-9.92969 0 -18.4795 -4.86035 -24.3594 -12zM616 144c-13.248 0 -24 10.752 -24 24s10.752 24 24 24s24 -10.752 24 -24s-10.752 -24 -24 -24zM552 80
c-13.248 0 -24 10.752 -24 24s10.752 24 24 24s24 -10.752 24 -24s-10.752 -24 -24 -24zM288 64c0 -17.6641 14.3359 -32 32 -32h96c0 -35.3281 -28.6719 -64 -64 -64h-64v-32h-224v177.12c-39.25 35.2598 -64 86.1299 -64 142.88
c0.0126953 25.2188 9.2998 63.9307 20.7305 86.4102l318.81 -246.41h-19.54c-17.6641 0 -32 -14.3359 -32 -32zM616 88c13.248 0 24 -10.752 24 -24s-10.752 -24 -24 -24s-24 10.752 -24 24s10.752 24 24 24z" />
    <glyph glyph-name="head-side-mask" unicode="&#xf963;" 
d="M0.150391 263.58c0.364258 7.85059 1.94043 20.4707 3.51953 28.1699l220.33 -160.26v-195.49h-160v177.12c-41 36.8203 -66.1699 90.6699 -63.8496 150.46zM509.22 173c1.40625 -3.27148 2.54688 -8.81543 2.54688 -12.376
c0 -0.171875 -0.00292969 -0.452148 -0.00683594 -0.624023h-272.55l-225.96 164.35c29.2305 73.0801 103.75 123.65 186.75 123.65h66.1104c59.541 -0.0390625 135.697 -39.5752 169.989 -88.25c24.6201 -35 52.1201 -139.63 73.1201 -186.75zM320 224
c17.626 0.0380859 31.9619 14.374 32 32c0 17.6641 -14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32zM336 80c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16h149.34l-10.6699 -32h-138.67c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16h128
l-1.41016 -4.24023c-8.05176 -24.1533 -35.25 -43.7578 -60.71 -43.7598h-145.88v192h256l-16 -48h-160z" />
    <glyph glyph-name="head-side-virus" unicode="&#xf964;" 
d="M272 208c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM208 272c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM509.2 173c1.52344 -3.42676 2.75977 -9.25 2.75977 -13
c0 -17.6416 -14.3184 -31.9775 -31.96 -32h-32v-64c0 -35.3281 -28.6719 -64 -64 -64h-64v-64h-256v177.19c-35.3281 31.4834 -64 95.4414 -64 142.763v0.046875c0 106 86 192 192 192h74.0898h0.0214844c59.5684 0 135.736 -39.5361 170.019 -88.25
c24.6396 -35.0195 52.1396 -139.63 73.0703 -186.75zM368 208c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16h-12.1201c-28.5098 0 -42.79 34.4697 -22.6299 54.6299l8.58008 8.57031c2.58691 2.58691 4.68652 7.65625 4.68652 11.3145
c0 8.83301 -7.16895 16.002 -16.002 16.002c-3.6582 0 -8.72754 -2.09961 -11.3145 -4.68652l-8.57031 -8.58008c-20.1602 -20.1602 -54.6299 -5.87988 -54.6299 22.6299v12.1201c0 8.83203 -7.16797 16 -16 16s-16 -7.16797 -16 -16v-12.1201
c0 -28.5098 -34.4697 -42.79 -54.6299 -22.6299l-8.57031 8.58008c-2.58691 2.58691 -7.65625 4.68652 -11.3145 4.68652c-8.83301 0 -16.002 -7.16895 -16.002 -16.002c0 -3.6582 2.09961 -8.72754 4.68652 -11.3145l8.58008 -8.57031
c20.1602 -20.1602 5.87988 -54.6299 -22.6299 -54.6299h-12.1201c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16h12.1201c28.5098 0 42.79 -34.4697 22.6299 -54.6299l-8.58008 -8.57031c-2.58691 -2.58691 -4.68652 -7.65625 -4.68652 -11.3145
c0 -8.83301 7.16895 -16.002 16.002 -16.002c3.6582 0 8.72754 2.09961 11.3145 4.68652l8.57031 8.58008c20.1602 20.1602 54.6299 5.87988 54.6299 -22.6299v-12.1201c0 -8.83203 7.16797 -16 16 -16s16 7.16797 16 16v12.1201c0 28.5098 34.4697 42.79 54.6299 22.6299
l8.57031 -8.58008c2.58691 -2.58691 7.65625 -4.68652 11.3145 -4.68652c8.83301 0 16.002 7.16895 16.002 16.002c0 3.6582 -2.09961 8.72754 -4.68652 11.3145l-8.58008 8.57031c-20.1602 20.1602 -5.87988 54.6299 22.6299 54.6299h12.1201z" />
    <glyph glyph-name="house-user" unicode="&#xf965;" horiz-adv-x="576" 
d="M570.69 211.73c2.54004 -2.81152 4.91895 -8.15137 5.30957 -11.9209c-0.319336 -3.25977 -2.15234 -8.04883 -4.08984 -10.6895l-21.4102 -23.8105c-2.7959 -2.53809 -8.11426 -4.91699 -11.8701 -5.30957c-3.2666 0.334961 -8.06934 2.18066 -10.7197 4.12012
l-15.9102 14v-210.12c0 -17.6641 -14.3359 -32 -32 -32h-383.91c-17.6641 0 -32 14.3359 -32 32v210.11l-15.8994 -14c-2.63965 -1.94336 -7.42871 -3.78418 -10.6904 -4.11035c-3.78906 0.381836 -9.16504 2.75586 -12 5.2998l-21.4102 23.79
c-2.08398 2.59082 -3.91602 7.38965 -4.08984 10.71c0.200195 3.83789 2.55664 9.16895 5.25977 11.9004l256 226c6.28027 5.68945 18.21 10.2998 26.7402 10.2998s20.5 -4.61035 26.7803 -10.2998l101.22 -89.3701v51.6699c0 8.83203 7.16797 16 16 16h64
c8.83203 0 16 -7.16797 16 -16v-136.44zM288 272c-35.3281 0 -64 -28.6719 -64 -64s28.6719 -64 64 -64s64 28.6719 64 64s-28.6719 64 -64 64zM400 0c8.83203 0 16 7.16797 16 16c0 52.9922 -43.0078 96 -96 96h-64c-52.9922 0 -96 -43.0078 -96 -96
c0 -8.83203 7.16797 -16 16 -16h224z" />
    <glyph glyph-name="laptop-house" unicode="&#xf966;" horiz-adv-x="640" 
d="M272 160v-128h-176c-17.6641 0 -32 14.3359 -32 32v164.12l-21.6602 -19.1201c-2.27344 -1.77637 -6.45801 -3.33594 -9.33984 -3.48047c-3.45117 0.183594 -8.22754 2.3252 -10.6602 4.78027l-18.79 21.3105c-1.8125 2.27637 -3.40332 6.4834 -3.5498 9.38965
c0.194336 3.42871 2.33594 8.16797 4.78027 10.5801l211.8 187.5c5.54004 4.91992 16.0703 8.91992 23.4697 8.91992c7.40039 0 17.9502 -4 23.4502 -8.91992l88.5 -78.3799v39.2998c0 8.83203 7.16797 16 16 16h32c8.83203 0 16 -7.16797 16 -16v-96l59.25 -52.3896
c2.42773 -2.42871 4.55566 -7.18164 4.75 -10.6104c-0.15332 -2.93457 -1.77051 -7.17773 -3.61035 -9.46973l-6.64941 -7.53027h-136.94c-17.7998 0 -33.6895 -8.24023 -44.7998 -21.1201v37.1201c0 8.83203 -7.16797 16 -16 16h-64c-8.83203 0 -16 -7.16797 -16 -16v-64
c0 -8.83203 7.16797 -16 16 -16h64zM629.33 0c5.88965 0 10.6699 -4.78027 10.6699 -10.6699v-10.6602c-0.0820312 -23.4336 -19.167 -42.5498 -42.5996 -42.6699h-298.801c-23.4326 0.120117 -42.5176 19.2363 -42.5996 42.6699v10.6602
c0 5.88965 4.78027 10.6699 10.6699 10.6699v0h37.3301v160c0 17.6699 12.8896 32 28.7998 32h230.4c15.9102 0 28.7998 -14.3301 28.7998 -32v-160h37.3301zM544 0v144h-192v-144h192z" />
    <glyph glyph-name="lungs-virus" unicode="&#xf967;" horiz-adv-x="640" 
d="M344 297.32c-6.11035 3.6875 -16.8623 6.68066 -24 6.68066s-17.8896 -2.99316 -24 -6.68066v134.68c0 8.83203 7.16797 16 16 16h16c8.83203 0 16 -7.16797 16 -16v-134.68zM195.54 3.54004c7.55664 -7.76367 22.4814 -14.0645 33.3154 -14.0645
c2.33594 0 6.09668 0.342773 8.39453 0.764648c-11.2559 -14.4775 -34.7754 -30.0459 -52.5 -34.75l-59.5 -15.8701c-62.75 -16.8799 -125.25 27.3799 -125.25 88.6299v0.241211c0 8.25 1.73828 21.4121 3.87988 29.3789c18.2109 68.1455 63.9072 171.634 102 231
c22.1201 34.6299 36.1201 63.1299 80.1201 63.1299c38.6201 0 70 -29.3799 70 -65.75v-27.6797c-6.68359 4.46582 -18.6309 8.08984 -26.6689 8.08984c-26.4961 0 -48 -21.5039 -48 -48c0 -11.043 6.36523 -26.3154 14.209 -34.0898l8.58008 -8.57031h-12.1201
c-26.4961 0 -48 -21.5039 -48 -48s21.5039 -48 48 -48h12.1201l-8.58008 -8.58008c-7.74609 -7.76562 -14.0332 -22.9707 -14.0332 -33.9395c0 -10.9697 6.28711 -26.1748 14.0332 -33.9404zM421.83 26.1699c-2.58691 -2.58789 -7.65625 -4.6875 -11.3154 -4.6875
c-3.6582 0 -8.72754 2.09961 -11.3145 4.6875l-8.57031 8.57031c-20.1602 20.1602 -54.6299 5.87988 -54.6299 -22.6201v-12.1201c0 -8.83203 -7.16797 -16 -16 -16s-16 7.16797 -16 16v12.1201c0 28.5 -34.4697 42.7803 -54.6299 22.6201l-8.57031 -8.57031
c-2.60156 -2.67969 -7.74512 -4.85547 -11.4805 -4.85547c-8.83203 0 -16 7.16797 -16 16c0 3.7334 2.17285 8.87402 4.85059 11.4756l8.58008 8.58008c20.1602 20.1602 5.87988 54.6299 -22.6299 54.6299h-12.1201c-8.83203 0 -16 7.16797 -16 16s7.16797 16 16 16h12.1201
c28.5098 0 42.79 34.4697 22.6299 54.6201l-8.58008 8.58008c-2.58691 2.58691 -4.68652 7.65625 -4.68652 11.3145c0 8.83301 7.16895 16.002 16.002 16.002c3.6582 0 8.72754 -2.09961 11.3145 -4.68652l8.57031 -8.58008
c20.1602 -20.1602 54.6299 -5.87988 54.6299 22.6299v12.1201c0 8.83203 7.16797 16 16 16s16 -7.16797 16 -16v-12.1201c0 -28.5098 34.4697 -42.79 54.6299 -22.6299l8.57031 8.58008c2.58691 2.58691 7.65625 4.68652 11.3145 4.68652
c8.83301 0 16.002 -7.16895 16.002 -16.002c0 -3.6582 -2.09961 -8.72754 -4.68652 -11.3145l-8.58008 -8.58008c-20.1602 -20.1504 -5.87988 -54.6201 22.6299 -54.6201h12.1201c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16h-12.1201
c-28.5098 0 -42.79 -34.4697 -22.6299 -54.6299l8.58008 -8.58008c2.58496 -2.58691 4.68262 -7.65332 4.68262 -11.3096c0 -3.65723 -2.09766 -8.72363 -4.68262 -11.3105zM288 144c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16s-16 -7.16797 -16 -16
s7.16797 -16 16 -16zM352 80c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16s-16 -7.16797 -16 -16s7.16797 -16 16 -16zM636.12 57.8701c2.1416 -7.9668 3.87988 -21.1289 3.87988 -29.3789v-0.241211c0 -61.25 -62.5 -105.51 -125.25 -88.6299l-59.5 15.8701
c-17.7246 4.7041 -41.2441 20.2725 -52.5 34.75c2.32812 -0.421875 6.1377 -0.764648 8.50391 -0.764648c26.3311 0 47.7002 21.3701 47.7002 47.7002c0 11.1445 -6.49316 26.4863 -14.4941 34.2441l-8.58008 8.58008h12.1201c26.4961 0 48 21.5039 48 48
s-21.5039 48 -48 48h-12.1201l8.58008 8.53027c7.84375 7.77441 14.209 23.0469 14.209 34.0898c0 26.4961 -21.5039 48 -48 48c-8.03809 0 -19.9854 -3.62402 -26.6689 -8.08984v27.7197c0 36.3701 31.3799 65.75 70 65.75c44 0 58 -28.5 80.1201 -63.1299
c38.0928 -59.3662 83.7891 -162.854 102 -231z" />
    <glyph glyph-name="people-arrows" unicode="&#xf968;" horiz-adv-x="576" 
d="M96 320c-35.3281 0 -64 28.6719 -64 64s28.6719 64 64 64s64 -28.6719 64 -64s-28.6719 -64 -64 -64zM96 143.92v-0.118164c0 -10.4102 6.11035 -24.6934 13.6396 -31.8818l50.3604 -47.5303v-96.3896c0 -17.6641 -14.3359 -32 -32 -32h-64
c-17.6641 0 -32 14.3359 -32 32v128c-17.6641 0 -32 14.3359 -32 32v96c0 35.3281 28.6719 64 64 64h64c23.9707 -0.0224609 50.5732 -18.1357 59.3799 -40.4297c-1.83984 -1.26074 -3.95996 -2.02051 -5.61035 -3.57031l-72.1299 -68.0801
c-7.5293 -7.19336 -13.6396 -21.4814 -13.6396 -31.8945v-0.105469zM480 320c-35.3281 0 -64 28.6719 -64 64s28.6719 64 64 64s64 -28.6719 64 -64s-28.6719 -64 -64 -64zM512 288c35.3281 0 64 -28.6719 64 -64v-96c0 -17.6641 -14.3359 -32 -32 -32v-128
c0 -17.6641 -14.3359 -32 -32 -32h-64c-17.6641 0 -32 14.3359 -32 32v96.3799l50.3604 47.5498c7.52539 7.22949 13.6338 21.5654 13.6338 32c0 10.4355 -6.1084 24.7715 -13.6338 32l-72.1201 68.0605c-1.62012 1.58984 -3.78027 2.31934 -5.62012 3.58984
c8.80957 22.291 35.4111 40.3984 59.3799 40.4199h64zM444.4 152.66c1.98633 -2.00195 3.59863 -5.91504 3.59863 -8.73535s-1.6123 -6.7334 -3.59863 -8.73438l-72.1201 -68.0703c-1.91895 -1.83008 -5.62891 -3.31445 -8.28027 -3.31445c-6.62402 0 -12 5.37598 -12 12
v0.0546875v36.1396h-128v-36.1396v-0.0546875c0 -6.62402 -5.37598 -12 -12 -12c-2.65137 0 -6.36133 1.48438 -8.28027 3.31445l-72.1201 68.0703c-1.98633 2.00098 -3.59863 5.91406 -3.59863 8.73438s1.6123 6.7334 3.59863 8.73535l72.1201 68.0703
c1.91895 1.8291 5.62891 3.31348 8.28027 3.31348c6.62402 0 12 -5.37598 12 -12v-0.0439453v-36h128v36v0.0341797c0 6.62402 5.37598 12 12 12c2.65137 0 6.36133 -1.48438 8.28027 -3.31445z" />
    <glyph glyph-name="plane-slash" unicode="&#xf969;" horiz-adv-x="640" 
d="M32.4805 300.12c-0.21875 0.947266 -0.396484 2.50586 -0.396484 3.47852c0 2.40137 1.01465 6.0127 2.26562 8.06152l324.841 -251.061l-66.6006 -116.54c-2.54297 -4.44824 -8.76562 -8.05957 -13.8896 -8.05957h-65.5
c-8.81543 0.0166016 -15.9697 7.18457 -15.9697 16c0 1.24121 0.277344 3.2168 0.619141 4.41016l49 171.59h-102.85l-43.2002 -57.5898c-2.64746 -3.53613 -8.38184 -6.4082 -12.7998 -6.41016h-40c-8.8291 0.00292969 -15.9951 7.1709 -15.9951 16
c0 1.08398 0.212891 2.81836 0.475586 3.87012l31.5195 108.13zM633.82 -10.0898c3.41602 -2.65234 6.18848 -8.31445 6.18848 -12.6387c0 -3.03027 -1.50879 -7.42969 -3.36914 -9.82129l-19.6396 -25.2598c-2.65234 -3.41699 -8.31445 -6.18945 -12.6387 -6.18945
c-3.03027 0 -7.42969 1.50977 -9.82129 3.36914l-588.36 454.72c-3.41211 2.65234 -6.18262 8.3125 -6.18262 12.6338c0 3.03223 1.51172 7.43359 3.37305 9.82617l19.6299 25.2598c2.65234 3.41309 8.31152 6.18262 12.6338 6.18262
c3.03125 0 7.43359 -1.51074 9.82617 -3.37207l189.3 -146.3l-36.9395 129.29c-0.338867 1.1875 -0.614258 3.1543 -0.614258 4.38965c0 8.8291 7.16504 15.9971 15.9941 16h65.5098c5.12988 0 11.3496 -3.61035 13.9004 -8.05957l105.09 -183.94h114.3
c35.3398 0 96 -28.6602 96 -64s-60.6602 -64 -96 -64h-56.8604z" />
    <glyph glyph-name="pump-medical" unicode="&#xf96a;" horiz-adv-x="384" 
d="M235.51 288.18c32.2471 -0.00195312 60.7979 -26.0664 63.7305 -58.1797l20.3701 -224c0.145508 -1.59766 0.262695 -4.19629 0.262695 -5.7998c0 -35.3242 -28.6689 -63.9961 -63.9932 -64h-192h-0.00292969c-35.3281 0 -64 28.6719 -64 64
c0 1.60352 0.117188 4.20215 0.262695 5.7998l20.3701 224c2.93262 32.1133 31.4834 58.1777 63.7305 58.1797h151.27zM239.88 114.85v26.6602c0 7.36426 -5.97656 13.3398 -13.3398 13.3398v0h-40v40c0 7.3584 -5.97168 13.3301 -13.3301 13.3301v0h-26.6699
c-7.3584 0 -13.3301 -5.97168 -13.3301 -13.3301v-40h-40c-7.3584 0 -13.3301 -5.97168 -13.3301 -13.3301v-0.00976562v-26.6602c0 -7.35742 5.97168 -13.334 13.3301 -13.3398h40v-40c0 -7.3584 5.97168 -13.3301 13.3301 -13.3301v0h26.6699
c7.3584 0 13.3301 5.97168 13.3301 13.3301v40h40c7.3584 0.00585938 13.334 5.98242 13.3398 13.3398zM379.19 354.12c2.58691 -2.58691 4.6875 -7.65625 4.6875 -11.3154c0 -3.6582 -2.10059 -8.72754 -4.6875 -11.3145l-22.6201 -22.6201
c-2.58691 -2.58789 -7.65625 -4.6875 -11.3154 -4.6875s-8.72754 2.09961 -11.3145 4.6875l-43.3105 43.3096h-66.75v-32h-128v96c0 17.6641 14.3359 32 32 32h64c17.6641 0 32 -14.3359 32 -32h66.75c14.6279 -0.00195312 34.8955 -8.39746 45.2402 -18.7393z" />
    <glyph glyph-name="pump-soap" unicode="&#xf96b;" horiz-adv-x="384" 
d="M235.63 288c32.2637 0 60.8311 -26.0781 63.75 -58.21l20.3604 -224c0.144531 -1.59473 0.262695 -4.18848 0.262695 -5.79004c0 -35.3281 -28.6729 -64 -64 -64h-0.00292969h-192c-35.3242 0.00390625 -63.9922 28.6758 -63.9922 64
c0 1.60156 0.117188 4.19531 0.261719 5.79004l20.3604 224c2.91895 32.1318 31.4736 58.21 63.7373 58.21h0.00292969h151.26zM160 32c33.1201 0 60 26.3301 60 58.7305c0 25 -35.6699 75.4697 -52 97.2695c-1.65625 2.21387 -5.24316 4.00977 -8.00781 4.00977
c-2.75586 0 -6.33594 -1.78711 -7.99219 -3.99023c-16.2998 -21.7998 -52 -72.2695 -52 -97.2695c0 -32.4199 26.8799 -58.75 60 -58.75zM379.31 353.94c2.58789 -2.58691 4.68848 -7.65625 4.68848 -11.3154s-2.10059 -8.72852 -4.68848 -11.3154l-22.6191 -22.6191
c-2.58691 -2.58789 -7.65625 -4.68848 -11.3154 -4.68848s-8.72852 2.10059 -11.3154 4.68848l-43.3096 43.3096h-66.75v-32h-128v96c0 17.6641 14.3359 32 32 32h64c17.6641 0 32 -14.3359 32 -32h66.75v0c14.6309 0 34.9033 -8.39551 45.25 -18.7402z" />
    <glyph glyph-name="shield-virus" unicode="&#xf96c;" 
d="M224 256c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16zM466.5 364.32c16.2842 -6.80176 29.5 -26.6445 29.5 -44.292v-0.0283203c0 -221.3 -135.91 -344.61 -221.59 -380.32
c-4.89062 -2.03223 -13.1592 -3.68164 -18.4551 -3.68164c-5.29688 0 -13.5645 1.64941 -18.4551 3.68164c-107 44.6006 -221.5 181.82 -221.5 380.32v0.0478516c0 17.6787 13.2559 37.5176 29.5898 44.2822l192 80c4.92676 1.85938 13.1973 3.50391 18.46 3.66992
c5.26074 -0.169922 13.5264 -1.81836 18.4502 -3.67969zM384 192c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16h-12.1201c-28.5098 0 -42.79 34.4697 -22.6299 54.6299l8.58008 8.57031c2.58691 2.58691 4.68652 7.65625 4.68652 11.3145
c0 8.83301 -7.16895 16.002 -16.002 16.002c-3.6582 0 -8.72754 -2.09961 -11.3145 -4.68652l-8.57031 -8.58008c-20.1602 -20.1602 -54.6299 -5.87988 -54.6299 22.6299v12.1201c0 8.83203 -7.16797 16 -16 16s-16 -7.16797 -16 -16v-12.1201
c0 -28.5098 -34.4697 -42.79 -54.6299 -22.6299l-8.57031 8.58008c-2.58691 2.58691 -7.65625 4.68652 -11.3145 4.68652c-8.83301 0 -16.002 -7.16895 -16.002 -16.002c0 -3.6582 2.09961 -8.72754 4.68652 -11.3145l8.58008 -8.57031
c20.1602 -20.1602 5.87988 -54.6299 -22.6299 -54.6299h-12.1201c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16h12.1201c28.5098 0 42.79 -34.4697 22.6299 -54.6299l-8.58008 -8.57031c-2.58691 -2.58691 -4.68652 -7.65625 -4.68652 -11.3145
c0 -8.83301 7.16895 -16.002 16.002 -16.002c3.6582 0 8.72754 2.09961 11.3145 4.68652l8.57031 8.58008c20.1602 20.1602 54.6299 5.87988 54.6299 -22.6299v-12.1201c0 -8.83203 7.16797 -16 16 -16s16 7.16797 16 16v12.1201c0 28.5098 34.4697 42.79 54.6299 22.6299
l8.57031 -8.58008c2.58691 -2.58691 7.65625 -4.68652 11.3145 -4.68652c8.83301 0 16.002 7.16895 16.002 16.002c0 3.6582 -2.09961 8.72754 -4.68652 11.3145l-8.58008 8.57031c-20.1602 20.1602 -5.87988 54.6299 22.6299 54.6299h12.1201zM288 192
c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16s-16 7.16797 -16 16s7.16797 16 16 16z" />
    <glyph glyph-name="soap" unicode="&#xf96e;" 
d="M416 256c52.9922 0 96 -43.0078 96 -96v-128c0 -52.9922 -43.0078 -96 -96 -96h-320c-52.9922 0 -96 43.0078 -96 96v128c0 52.9922 43.0078 96 96 96h128c0.0517578 -20.3193 11.2119 -48.9912 24.9102 -64h-88.9102c-52.9922 0 -96 -43.0078 -96 -96
s43.0078 -96 96 -96h192h0.206055c52.8809 0 95.7998 42.918 95.7998 95.7998c0 36.9893 -28.2002 77.3047 -62.9463 89.9902c17.0488 15.6279 30.9092 47.082 30.9404 70.21zM320 192c-35.3281 0 -64 28.6719 -64 64s28.6719 64 64 64s64 -28.6719 64 -64
s-28.6719 -64 -64 -64zM208 352c-26.4961 0 -48 21.5039 -48 48s21.5039 48 48 48s48 -21.5039 48 -48s-21.5039 -48 -48 -48zM384 384c-17.6641 0 -32 14.3359 -32 32s14.3359 32 32 32s32 -14.3359 32 -32s-14.3359 -32 -32 -32zM160 160h192
c35.3281 0 64 -28.6719 64 -64s-28.6719 -64 -64 -64h-192c-35.3281 0 -64 28.6719 -64 64s28.6719 64 64 64z" />
    <glyph glyph-name="stopwatch-20" unicode="&#xf96f;" horiz-adv-x="448" 
d="M398.5 257.09c18.4922 -28.3281 33.501 -78.7754 33.501 -112.605c0 -0.133789 -0.000976562 -0.350586 -0.000976562 -0.484375c0 -116 -94.8701 -209.77 -211.28 -208c-113.96 1.78027 -208.08 100.5 -204.63 214.43c2.92773 95.2598 81.7354 184.443 175.91 199.07
v34.5h-32c-8.80469 0.0273438 -15.9727 7.19531 -16 16v32c0.0273438 8.80469 7.19531 15.9727 16 16h128c8.83203 0 16 -7.16797 16 -16v-32c0 -8.83203 -7.16797 -16 -16 -16h-32v-34.5c30.8857 -4.76953 75.5469 -24.7461 99.6904 -44.5898l24.6797 24.6797
c2.58691 2.58789 7.65625 4.6875 11.3145 4.6875c3.65918 0 8.72852 -2.09961 11.3154 -4.6875l22.6797 -22.6797c2.58789 -2.58691 4.6875 -7.65625 4.6875 -11.3154c0 -3.6582 -2.09961 -8.72754 -4.6875 -11.3145l-26.5898 -26.5801zM204.37 70.4502l-49.1299 0.0400391
c1.7998 15.6299 14.8496 36.2002 26.4102 51.2002c21.9092 30.0996 34.3496 45.7295 34.3496 81.3096c0 35.1504 -12.5703 61 -55.5703 61c-47.9492 0 -56.4297 -32.9404 -56.4297 -60.2402v-4.06934c0.0703125 -4.45605 3.74316 -8.07129 8.19922 -8.07129
c0.0361328 0 0.0947266 0 0.130859 0.000976562h24.9004c0.0361328 -0.000976562 0.0947266 -0.000976562 0.130859 -0.000976562c4.45508 0 8.12891 3.61523 8.19824 8.07129v5.22949c0 15.2803 3.30078 22.6797 12.6904 22.6797c10.4199 0 12.21 -7.34961 12.21 -24.2695
c0 -25.0205 -6.67969 -33.1504 -27.0996 -62.3398c-23.7803 -33.96 -35.6699 -56.1504 -38.4502 -91.3701c-0.0224609 -0.320312 -0.0410156 -0.84082 -0.0410156 -1.16113c0 -9.08594 7.37402 -16.46 16.46 -16.46c0.0527344 0 0.137695 0 0.19043 0.000976562h82.8506
c0.0332031 -0.000976562 0.0878906 -0.000976562 0.121094 -0.000976562c4.45508 0 8.12891 3.61621 8.19922 8.07129v22.3096c-0.0703125 4.45508 -3.74414 8.07129 -8.19922 8.07129c-0.0332031 0 -0.0878906 -0.000976562 -0.121094 -0.000976562zM344 95.6797v107.021
c0 38.6602 -19 61.2998 -55.7998 61.2998c-36.6201 0 -56.2002 -22.4902 -56.2002 -63.2197v-105.33c0 -33.9307 11.1904 -63.4502 54.7695 -63.4502c44.9307 0 57.2305 28.5195 57.2305 63.6797zM287.87 226.27c10.0098 0 13.0195 -8.05957 13 -19.3291v-115.94
c0 -13.2695 -3.36035 -21.2695 -13 -21.2695s-13.2305 7.47949 -13.2305 20.5898v115.949c0 12.5 3.82031 20 13.2305 20z" />
    <glyph glyph-name="store-alt-slash" unicode="&#xf970;" horiz-adv-x="640" 
d="M17.8896 324.38l88.4707 -68.3799h-74.2607c-25.5898 0 -40.79 28.5 -26.5898 49.7998zM576 34.5801l57.8301 -44.6797c3.41016 -2.65234 6.17773 -8.31055 6.17773 -12.6309c0 -3.0293 -1.50879 -7.42773 -3.36816 -9.81934l-19.6396 -25.2598
c-2.65234 -3.41895 -8.31543 -6.19434 -12.6426 -6.19434c-3.03223 0 -7.43457 1.51172 -9.82715 3.37402l-588.351 454.72c-3.41016 2.65234 -6.17773 8.31055 -6.17773 12.6309c0 3.02832 1.50879 7.42773 3.36816 9.81934l19.6299 25.2695
c2.65234 3.41309 8.31152 6.18262 12.6338 6.18262c3.03125 0 7.43359 -1.51074 9.82617 -3.37207l34.6904 -26.8203l10.6592 16c5.22266 7.83887 17.1045 14.2002 26.5234 14.2002h0.0869141h405.18h0.0117188c9.45117 0 21.4082 -6.36133 26.6885 -14.2002l85.29 -128
c14.1104 -21.2998 -1.08984 -49.7998 -26.5898 -49.7998h-318.48l41.4004 -32h53.0801v-41l128 -99v140h64v-189.42zM320 64v26.8799l64 -49.4697v-73.4102c0 -17.6641 -14.3359 -32 -32 -32h-256c-17.6641 0 -32 14.3359 -32 32v256h64v-160h192z" />
    <glyph glyph-name="store-slash" unicode="&#xf971;" horiz-adv-x="640" 
d="M121.51 64h226.91l157.33 -128h-414.52c-16.8105 0 -30.4004 14.2998 -30.4004 32v196.8c4.23047 -1.29297 11.2109 -2.90625 15.5801 -3.59961c4.69629 -0.660156 12.3574 -1.19727 17.0996 -1.2002c7.85352 0.12793 20.3975 1.83008 28 3.7998v-99.7998z
M93.5098 192.09h-0.21875c-3.54883 0 -9.28418 0.385742 -12.8008 0.860352c-58.9404 8.46973 -87.0098 81.6094 -56.4902 135l133.51 -108.62c-16.71 -16.5205 -38.8994 -27.2402 -64 -27.2402zM602.13 -10.0898c3.24316 -2.74219 5.875 -8.41406 5.875 -12.6611
c0 -2.99414 -1.43555 -7.38379 -3.20508 -9.79883l-18.6602 -25.2598c-2.42383 -3.41309 -7.78906 -6.18359 -11.9756 -6.18359c-2.91602 0 -7.10645 1.50684 -9.35449 3.36328l-558.939 454.72c-3.24316 2.74219 -5.875 8.41406 -5.875 12.6611
c0 2.99414 1.43555 7.38379 3.20508 9.79883l18.6602 25.2598c2.42188 3.41211 7.78516 6.18164 11.9697 6.18164c2.91797 0 7.11133 -1.51074 9.36035 -3.37109l33.6895 -27.4004l9.38965 15.7803c4.74609 8.18066 16.2734 14.9014 25.7305 15h383.81
c9.46289 -0.09375 20.9941 -6.81445 25.7402 -15l61.6602 -103.6c31.9404 -53.6006 3.59961 -127.99 -56.0596 -136.4c-3.57129 -0.5 -9.39453 -0.907227 -13 -0.910156c-28.0303 0 -52.9199 13 -70.1104 33.1104c-17.1104 -20.1104 -42 -33.1104 -70.1104 -33.1104
c-7.18164 0.106445 -18.5654 1.96094 -25.4102 4.14062l137.82 -112.11v79.6797c7.59863 -2.00586 20.1426 -3.70898 28 -3.7998c4.79492 0.00585938 12.541 0.542969 17.29 1.2002c4.38281 0.625 11.3584 2.2373 15.5703 3.59961v-130.21z" />
    <glyph glyph-name="toilet-paper-slash" unicode="&#xf972;" horiz-adv-x="640" 
d="M64 256c0 10.8096 0.530273 21.3398 1.41992 31.6699l316 -244.25c-4.17969 -32.2002 -12.8701 -57.7197 -22.1797 -85.5498c-3.98926 -12.0723 -17.5459 -21.8701 -30.2607 -21.8701h-0.119141h-280.86c-8.78906 0.0429688 -15.9209 7.21094 -15.9209 16
c0 1.41504 0.358398 3.65527 0.800781 5c21.3701 64.1201 31.1201 85.75 31.1201 126.87v172.13zM633.82 -10.0898c3.41602 -2.65234 6.18848 -8.31445 6.18848 -12.6387c0 -3.03027 -1.50879 -7.42969 -3.36914 -9.82129l-19.6396 -25.2598
c-2.65234 -3.41699 -8.31445 -6.18945 -12.6387 -6.18945c-3.03027 0 -7.42969 1.50977 -9.82129 3.36914l-588.36 454.72c-3.41211 2.65234 -6.18262 8.3125 -6.18262 12.6338c0 3.03223 1.51172 7.43359 3.37305 9.82617l19.6299 25.2598
c2.65234 3.41309 8.31152 6.18262 12.6338 6.18262c3.03125 0 7.43359 -1.51074 9.82617 -3.37207l53.2803 -41.1504c16.6299 27.7002 37.9297 44.5303 61.2598 44.5303h284.5c-36.8701 -38.5 -60.5 -108.38 -60.5 -192v-73l50.4297 -39
c-11.4297 31.5996 -18.4297 70 -18.4297 112c0 106 43 192 96 192s96 -86 96 -192c0 -92.3203 -32.7197 -168.91 -76.1797 -187.28zM512 192c17.6201 0 32 28.6299 32 64s-14.3701 64 -32 64s-32 -28.6201 -32 -64s14.3701 -64 32 -64z" />
    <glyph glyph-name="virus" unicode="&#xf974;" 
d="M483.55 220.45c0.147461 0.00292969 0.356445 0.00488281 0.503906 0.00488281c15.7041 0 28.4492 -12.7461 28.4492 -28.4502s-12.7451 -28.4502 -28.4492 -28.4502c-0.147461 0 -0.386719 0.00292969 -0.53418 0.00488281h-21.5391
c-50.6807 0 -76.0703 -61.2793 -40.2305 -97.1191l15.25 -15.2402c4.15039 -4.50879 7.51855 -13.1406 7.51855 -19.2686c0 -15.7051 -12.7451 -28.4502 -28.4502 -28.4502c-6.12793 0 -14.7598 3.36816 -19.2686 7.51855l-15.2402 15.2305
c-35.8398 35.8398 -97.1094 10.4492 -97.1094 -40.2305v-21.5195c0 -15.7051 -12.7461 -28.4502 -28.4502 -28.4502s-28.4502 12.7451 -28.4502 28.4502v21.5391c0 50.6807 -61.2695 76.0703 -97.1094 40.2305l-15.2402 -15.25
c-4.50879 -4.15039 -13.1406 -7.51855 -19.2686 -7.51855c-15.7051 0 -28.4502 12.7451 -28.4502 28.4502c0 6.12793 3.36816 14.7598 7.51855 19.2686l15.2305 15.2402c35.8398 35.8398 10.4492 97.1191 -40.2305 97.1191h-21.5498
c-0.147461 -0.00195312 -0.386719 -0.00488281 -0.533203 -0.00488281c-15.7051 0 -28.4502 12.7461 -28.4502 28.4502s12.7451 28.4502 28.4502 28.4502c0.146484 0 0.385742 -0.00195312 0.533203 -0.00488281h21.5693c50.6807 0 76.0703 61.2695 40.2305 97.1094
l-15.25 15.25c-4.21094 4.52148 -7.62793 13.2051 -7.62793 19.3828c0 15.6992 12.7412 28.4404 28.4404 28.4404c6.17969 0 14.8662 -3.41992 19.3877 -7.63281l15.2402 -15.2305c35.8398 -35.8291 97.1094 -10.4492 97.1094 40.2305v21.5596
c0 15.7051 12.7461 28.4502 28.4502 28.4502s28.4502 -12.7451 28.4502 -28.4502v-21.5498c0 -50.6797 61.2695 -76.0596 97.1094 -40.2295l15.2402 15.2197c4.52148 4.21289 13.208 7.63281 19.3877 7.63281c15.6992 0 28.4404 -12.7412 28.4404 -28.4404
c0 -6.17773 -3.41699 -14.8613 -7.62793 -19.3828l-15.2305 -15.25c-35.8398 -35.8398 -10.4492 -97.1094 40.2305 -97.1094h21.5498zM224 176c26.4961 0 48 21.5039 48 48s-21.5039 48 -48 48s-48 -21.5039 -48 -48s21.5039 -48 48 -48zM304 120c13.248 0 24 10.752 24 24
s-10.752 24 -24 24s-24 -10.752 -24 -24s10.752 -24 24 -24z" />
    <glyph glyph-name="virus-slash" unicode="&#xf975;" horiz-adv-x="640" 
d="M114 220.44c8.37207 0.0664062 20.9922 3.61914 28.1699 7.92969l244.5 -189c-21.2197 -7.45996 -38.2197 -26.7598 -38.2197 -53.3701v-21.5195c0 -15.7051 -12.7461 -28.4502 -28.4502 -28.4502s-28.4502 12.7451 -28.4502 28.4502v21.5391
c0 50.6807 -61.2695 76.0703 -97.1094 40.2305l-15.25 -15.25c-4.66113 -5.03711 -14.0127 -9.125 -20.875 -9.125c-15.6992 0 -28.4404 12.7412 -28.4404 28.4404c0 6.8623 4.08789 16.2139 9.125 20.875l15.2305 15.25c35.8291 35.8398 10.4492 97.1191 -40.2305 97.1191
h-21.5596c-15.6992 0 -28.4404 12.7412 -28.4404 28.4404s12.7412 28.4404 28.4404 28.4404h21.5596zM633.82 -10.0898c3.41602 -2.65234 6.18848 -8.31445 6.18848 -12.6387c0 -3.03027 -1.50879 -7.42969 -3.36914 -9.82129l-19.6396 -25.2598
c-2.65234 -3.41699 -8.31445 -6.18945 -12.6387 -6.18945c-3.03027 0 -7.42969 1.50977 -9.82129 3.36914l-588.36 454.72c-3.41211 2.65234 -6.18262 8.3125 -6.18262 12.6338c0 3.03223 1.51172 7.43359 3.37305 9.82617l19.6299 25.2598
c2.65234 3.41309 8.31152 6.18262 12.6338 6.18262c3.03125 0 7.43359 -1.51074 9.82617 -3.37207l93.2598 -72.0801c0.129883 0.139648 0.150391 0.320312 0.280273 0.459961c4.5957 4.5918 13.5986 8.31934 20.0947 8.31934c6.49707 0 15.5 -3.72754 20.0957 -8.31934
l15.25 -15.2305c35.8398 -35.8398 97.1094 -10.46 97.1094 40.2305v21.5498c0 15.7051 12.7461 28.4502 28.4502 28.4502s28.4502 -12.7451 28.4502 -28.4502v-21.54c0 -50.6895 61.2695 -76.0693 97.1094 -40.2295l15.25 15.2197
c4.51367 4.17578 13.167 7.56543 19.3154 7.56543c15.6992 0 28.4404 -12.7412 28.4404 -28.4404c0 -6.14844 -3.38965 -14.8018 -7.56543 -19.3154l-15.2305 -15.29c-35.8291 -35.8398 -10.4492 -97.1191 40.2305 -97.1191h21.5596
c15.6992 0 28.4404 -12.7412 28.4404 -28.4404s-12.7412 -28.4404 -28.4404 -28.4404v0h-21.5498c-30.4795 0 -51.2197 -22.1299 -55.3896 -47.5195zM335.43 220.52c0.0898438 1.19043 0.570312 2.26074 0.570312 3.48047c0 26.4961 -21.5039 48 -48 48
c-4.39844 -0.0683594 -11.3154 -1.36328 -15.4404 -2.88965z" />
    <glyph glyph-name="viruses" unicode="&#xf976;" horiz-adv-x="640" 
d="M624 96c8.83203 0 16 -7.16797 16 -16s-7.16797 -16 -16 -16h-12.1201c-28.5098 0 -42.79 -34.4697 -22.6299 -54.6299l8.58008 -8.57031c2.58691 -2.58691 4.68652 -7.65625 4.68652 -11.3145c0 -8.83301 -7.16895 -16.002 -16.002 -16.002
c-3.6582 0 -8.72754 2.09961 -11.3145 4.68652l-8.57031 8.58008c-20.1602 20.1602 -54.6299 5.87988 -54.6299 -22.6299v-12.1201c0 -8.83203 -7.16797 -16 -16 -16s-16 7.16797 -16 16v12.1201c0 28.5098 -34.4697 42.79 -54.6299 22.6299l-8.57031 -8.58008
c-2.58691 -2.58691 -7.65625 -4.68652 -11.3145 -4.68652c-8.83301 0 -16.002 7.16895 -16.002 16.002c0 3.6582 2.09961 8.72754 4.68652 11.3145l8.58008 8.57031c20.1602 20.1602 5.87988 54.6299 -22.6299 54.6299h-12.1201c-8.83203 0 -16 7.16797 -16 16
s7.16797 16 16 16h12.1201c28.5098 0 42.79 34.4697 22.6299 54.6299l-8.58008 8.57031c-2.58691 2.58691 -4.68652 7.65625 -4.68652 11.3145c0 8.83301 7.16895 16.002 16.002 16.002c3.6582 0 8.72754 -2.09961 11.3145 -4.68652l8.57031 -8.58008
c20.1602 -20.1602 54.6299 -5.87988 54.6299 22.6299v12.1201c0 8.83203 7.16797 16 16 16s16 -7.16797 16 -16v-12.1201c0 -28.5098 34.4697 -42.79 54.6299 -22.6299l8.57031 8.58008c2.58691 2.58691 7.65625 4.68652 11.3145 4.68652
c8.83301 0 16.002 -7.16895 16.002 -16.002c0 -3.6582 -2.09961 -8.72754 -4.68652 -11.3145l-8.58008 -8.57031c-20.1602 -20.1602 -5.87988 -54.6299 22.6299 -54.6299h12.1201zM480 64c17.6641 0 32 14.3359 32 32s-14.3359 32 -32 32s-32 -14.3359 -32 -32
s14.3359 -32 32 -32zM346.51 234.67c-38.0195 0 -57.0498 -45.96 -30.1699 -72.8398l11.4297 -11.4297c3.44922 -3.44922 6.24902 -10.208 6.24902 -15.085c0 -11.7764 -9.55762 -21.334 -21.334 -21.334c-4.87695 0 -11.6357 2.7998 -15.085 6.24902l-11.4297 11.4297
c-26.8398 26.8799 -72.8398 7.83008 -72.8398 -30.1699v-16.1602c0 -11.7744 -9.55566 -21.3301 -21.3301 -21.3301s-21.3301 9.55566 -21.3301 21.3301v16.1602c0 38.0195 -45.96 57.0498 -72.8398 30.1699l-11.4297 -11.4297
c-3.44922 -3.44922 -10.208 -6.24902 -15.085 -6.24902c-11.7764 0 -21.334 9.55762 -21.334 21.334c0 4.87695 2.7998 11.6357 6.24902 15.085l11.4297 11.4297c26.8799 26.8398 7.83008 72.8398 -30.1699 72.8398h-16.1602c-11.7744 0 -21.3301 9.55566 -21.3301 21.3301
s9.55566 21.3301 21.3301 21.3301h16.1602c38.0195 0 57.0498 45.96 30.1699 72.8398l-11.4297 11.4404c-3.41895 3.44336 -6.19434 10.1758 -6.19434 15.0283c0 11.7744 9.55566 21.3301 21.3301 21.3301c4.85449 0 11.5898 -2.77734 15.0342 -6.19922l11.4297 -11.4297
c26.8398 -26.8799 72.8398 -7.83008 72.8398 30.1699v16.1602c0 11.7744 9.55566 21.3301 21.3301 21.3301s21.3301 -9.55566 21.3301 -21.3301v-16.1602c0 -38.0195 45.96 -57.0498 72.8398 -30.1699l11.4297 11.4297c3.44434 3.42188 10.1797 6.19922 15.0342 6.19922
c11.7744 0 21.3301 -9.55566 21.3301 -21.3301c0 -4.85254 -2.77539 -11.585 -6.19434 -15.0283l-11.4297 -11.4404c-26.8799 -26.8398 -7.83008 -72.8398 30.1699 -72.8398h16.1602c11.7744 0 21.3301 -9.55566 21.3301 -21.3301s-9.55566 -21.3301 -21.3301 -21.3301
h-16.1602zM160 256c17.6641 0 32 14.3359 32 32s-14.3359 32 -32 32s-32 -14.3359 -32 -32s14.3359 -32 32 -32zM240 224c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16s-16 -7.16797 -16 -16s7.16797 -16 16 -16z" />
  </font>
</defs></svg>

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.ttf.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff.

cannot compute difference between binary files

Added build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2.

cannot compute difference between binary files

Added build/html/_static/webpack-macros.html.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- these macros are generated by "yarn build:production". do not edit by hand. -->
{% macro head_pre_icons() %}
  <link rel="stylesheet"
    href="{{ pathto('_static/vendor/fontawesome/5.13.0/css/all.min.css', 1) }}">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="{{ pathto('_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2', 1) }}">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="{{ pathto('_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2', 1) }}">
{% endmacro %}

{% macro head_pre_fonts() %}
{% endmacro %}

{% macro head_pre_bootstrap() %}
  <link href="{{ pathto('_static/css/theme.css', 1) }}" rel="stylesheet" />
  <link href="{{ pathto('_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css', 1) }}" rel="stylesheet" />
{% endmacro %}

{% macro head_js_preload() %}
  <link rel="preload" as="script" href="{{ pathto('_static/js/index.1c5a1a01449ed65a7b51.js', 1) }}">
{% endmacro %}

{% macro body_post() %}
  <script src="{{ pathto('_static/js/index.1c5a1a01449ed65a7b51.js', 1) }}"></script>
{% endmacro %}

Added build/html/bookmarks.html.





































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Bookmarks &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="prev" title="Saving and Sharing" href="saving.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
            <div class="tocsection onthispage pt-5 pb-3">
                <i class="fas fa-list"></i> Contents
            </div>
            <nav id="bd-toc-nav">
                <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#webaudio">
   WebAudio
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#obsevers">
   Obsevers
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#visuals">
   Visuals
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#inspiration">
   Inspiration
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#misc">
   Misc
  </a>
 </li>
</ul>

            </nav>
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="bookmarks">
<h1>Bookmarks<a class="headerlink" href="#bookmarks" title="Permalink to this headline">ΒΆ</a></h1>
<div class="section" id="webaudio">
<h2>WebAudio<a class="headerlink" href="#webaudio" title="Permalink to this headline">ΒΆ</a></h2>
<p><a class="reference external" href="http://blog.mecheye.net/2017/09/i-dont-know-who-the-web-audio-api-is-designed-for/">http://blog.mecheye.net/2017/09/i-dont-know-who-the-web-audio-api-is-designed-for/</a><br />
<a class="reference external" href="https://joshondesign.com/p/books/canvasdeepdive/chapter12.html">https://joshondesign.com/p/books/canvasdeepdive/chapter12.html</a><br />
<a class="reference external" href="https://robert.ocallahan.org/2017/09/some-opinions-on-history-of-web-audio.html">https://robert.ocallahan.org/2017/09/some-opinions-on-history-of-web-audio.html</a><br />
<a class="reference external" href="https://webaudioapi.com/book/Web_Audio_API_Boris_Smus.pdf">https://webaudioapi.com/book/Web_Audio_API_Boris_Smus.pdf</a></p>
<p><a class="reference external" href="https://web.noom.com/company-blog/2015/08/cooking-is-like-programming/">https://web.noom.com/company-blog/2015/08/cooking-is-like-programming/</a></p>
<p><a class="reference external" href="https://github.com/ideoforms/isobar">https://github.com/ideoforms/isobar</a><br />
<a class="reference external" href="https://github.com/tmhglnd/mercury/blob/master/docs/reference.md">https://github.com/tmhglnd/mercury/blob/master/docs/reference.md</a><br />
<a class="reference external" href="https://foxdot.org/docs/pattern-functions/">https://foxdot.org/docs/pattern-functions/</a><br />
<a class="reference external" href="https://faustdoc.grame.fr/">https://faustdoc.grame.fr/</a></p>
</div>
<div class="section" id="obsevers">
<h2>Obsevers<a class="headerlink" href="#obsevers" title="Permalink to this headline">ΒΆ</a></h2>
<p><a class="reference external" href="https://github.com/rsimmons/plinth">https://github.com/rsimmons/plinth</a><br />
<a class="reference external" href="https://github.com/gullerya/object-observer">https://github.com/gullerya/object-observer</a><br />
<a class="reference external" href="https://awesomeopensource.com/project/nx-js/observer-util">https://awesomeopensource.com/project/nx-js/observer-util</a><br />
<a class="reference external" href="https://doc.esdoc.org/github.com/jstoolkit/dom-observer/">https://doc.esdoc.org/github.com/jstoolkit/dom-observer/</a><br />
<a class="reference external" href="https://github.com/tannerntannern/micro-observer">https://github.com/tannerntannern/micro-observer</a><br />
<a class="reference external" href="https://github.com/colxi/deep-observer">https://github.com/colxi/deep-observer</a><br />
<a class="reference external" href="https://www.npmjs.com/package/observe">https://www.npmjs.com/package/observe</a><br />
<a class="reference external" href="https://www.vertexshaderart.com/new/">https://www.vertexshaderart.com/new/</a></p>
</div>
<div class="section" id="visuals">
<h2>Visuals<a class="headerlink" href="#visuals" title="Permalink to this headline">ΒΆ</a></h2>
<p><a class="reference external" href="https://compform.net/turtles/">https://compform.net/turtles/</a><br />
<a class="reference external" href="https://github.com/capnmidnight/Primrose">https://github.com/capnmidnight/Primrose</a></p>
<p>The code editor borrows some CSS styles from this project
<a class="reference external" href="https://github.com/htor/repeat-editor">https://github.com/htor/repeat-editor</a></p>
</div>
<div class="section" id="inspiration">
<h2>Inspiration<a class="headerlink" href="#inspiration" title="Permalink to this headline">ΒΆ</a></h2>
<p><a class="reference external" href="http://wavepot.com/">http://wavepot.com/</a><br />
<a class="reference external" href="https://glicol.web.app/">https://glicol.web.app/</a><br />
<a class="reference external" href="http://charlie-roberts.com/gibber/">http://charlie-roberts.com/gibber/</a><br />
<a class="reference external" href="https://tweakable.org/">https://tweakable.org/</a></p>
</div>
<div class="section" id="misc">
<h2>Misc<a class="headerlink" href="#misc" title="Permalink to this headline">ΒΆ</a></h2>
<p><a class="reference external" href="https://ccrma.stanford.edu/~blackrse/algorithm.html">https://ccrma.stanford.edu/~blackrse/algorithm.html</a><br />
<a class="reference external" href="https://oeis.org/">https://oeis.org/</a><br />
<a class="reference external" href="https://www.cs.cmu.edu/~music/cmsip/readings/MIDI%20tutorial%20for%20programmers.html">https://www.cs.cmu.edu/~music/cmsip/readings/MIDI%20tutorial%20for%20programmers.html</a>
<a class="reference external" href="https://en.wikipedia.org/wiki/Computational_creativity">https://en.wikipedia.org/wiki/Computational_creativity</a><br />
<a class="reference external" href="https://en.wikipedia.org/wiki/Algorithmic_composition">https://en.wikipedia.org/wiki/Algorithmic_composition</a></p>
</div>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="saving.html" title="previous page">Saving and Sharing</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/changelog.html.







































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Changelog &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Concepts and Code Walkthrough" href="main.html" />
    <link rel="prev" title="Early Attempts" href="early-attempts.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="changelog">
<h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this headline">ΒΆ</a></h1>
<p>June - July 2019 ~ First prototype</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>Eval, tone.js and an checkoxbased input visualization for rhythm
</pre></div>
</div>
<p>Feb ~ May 2021 ~ Second Prototype</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>    <span class="n">Save</span> <span class="n">feature</span>
    <span class="n">Added</span> <span class="n">Samples</span>
    <span class="n">Moving</span> <span class="n">to</span> <span class="n">riot</span> <span class="n">javascript</span>
    <span class="n">Fix</span> <span class="k">for</span> <span class="ow">not</span> <span class="n">mounting</span>
    <span class="n">Refactoring</span> <span class="n">codebase</span>
    <span class="n">Added</span> <span class="n">sphinx</span>
    <span class="n">Added</span> <span class="n">number</span> <span class="ow">and</span> <span class="n">monitoring</span> <span class="k">for</span> <span class="n">knob</span>
    <span class="n">Added</span> <span class="n">clock</span>
    <span class="n">Changed</span> <span class="n">Theme</span>
    <span class="n">Visuals</span>
    <span class="n">Observers</span> <span class="ow">and</span> <span class="n">Misc</span> <span class="n">Libraries</span>
    <span class="n">New</span> <span class="n">sections</span>
    <span class="n">Fix</span> <span class="k">for</span> <span class="n">crackling</span>
    <span class="n">Docs</span>
</pre></div>
</div>
<p>June - July 2021 - Demo</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>    <span class="n">Theme</span> <span class="n">changes</span>
    <span class="n">Lots</span> <span class="n">of</span> <span class="n">Docs</span>
    <span class="n">Tutorials</span>
    <span class="n">Working</span> <span class="n">visuals</span>
    <span class="n">Code</span> <span class="n">Mirror</span> <span class="n">Issue</span>
</pre></div>
</div>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="early-attempts.html" title="previous page">Early Attempts</a>
    <a class='right-next' id="next-link" href="main.html" title="next page">Concepts and Code Walkthrough</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/demo.html.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Demo and Tutorial &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="What exactly is Tweaking ?" href="tweaking.html" />
    <link rel="prev" title="Source Code and License" href="source-code.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
            <div class="tocsection onthispage pt-5 pb-3">
                <i class="fas fa-list"></i> Contents
            </div>
            <nav id="bd-toc-nav">
                <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#video">
   Video
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#demo-song-1-techno">
   Demo Song 1 // Techno
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#example1">
   Example1
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#example2">
   Example2
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#full-code">
   Full Code
  </a>
 </li>
</ul>

            </nav>
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="demo-and-tutorial">
<h1>Demo and Tutorial<a class="headerlink" href="#demo-and-tutorial" title="Permalink to this headline">ΒΆ</a></h1>
<div class="section" id="video">
<h2>Video<a class="headerlink" href="#video" title="Permalink to this headline">ΒΆ</a></h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/GTfmTMrSpag" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>Postprocessed using Reaper with EQ and Surround effects to add some sparkle.
Video is recorded with the help of Blackhole and Kap and rendered by Reaper.</p>
<p>Samples taken from Deep Techno and Dub Techno collections from splice. Sadly I can’t distribute the song itself as I would also have to distribute the samples with it.</p>
</div>
<div class="section" id="demo-song-1-techno">
<h2>Demo Song 1 // Techno<a class="headerlink" href="#demo-song-1-techno" title="Permalink to this headline">ΒΆ</a></h2>
<p>Code for the Demo Song. The visualisation was disabled in the Demo as it was causing a huge lag while recording on both windows and mac.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">volume_guard1</span> <span class="o">=</span> <span class="n">guard</span><span class="p">([</span><span class="o">-</span><span class="mi">20</span><span class="p">,</span><span class="mi">15</span><span class="p">])</span>
<span class="n">volume_guard2</span> <span class="o">=</span> <span class="n">guard</span><span class="p">([</span><span class="o">-</span><span class="mi">20</span><span class="p">,</span><span class="mi">15</span><span class="p">])</span>
<span class="n">Tone</span><span class="o">.</span><span class="n">Master</span><span class="o">.</span><span class="n">volume</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">volume_guard1</span><span class="p">(</span><span class="n">Math</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">dials</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]()</span> <span class="o">*</span> <span class="mi">30</span><span class="p">)</span> <span class="o">-</span><span class="mi">20</span><span class="p">);</span>
 <span class="o">//</span><span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_channel&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">volume</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">volume_guard2</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span>
 <span class="o">//</span><span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_filter&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">dials</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]()</span> <span class="o">*</span> <span class="mi">10000</span><span class="p">);</span>
<span class="o">//</span><span class="n">mem</span><span class="p">[</span><span class="s2">&quot;l_filter&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">dials</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">);</span>


<span class="n">scene1</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 1000 1000 1000 1000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p x000 0000 0000 0000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 0x00 0000 0x00 x000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 0000 x000 0000 x000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p x000 00x0 0x00 x0xx&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 00x0 00x0 0000 00x0&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 00x0 00x0 00x0 00x0&quot;</span><span class="p">),</span>
<span class="p">]</span>

<span class="n">patterns</span> <span class="o">=</span> <span class="n">scene1</span>

<span class="n">always</span><span class="p">();</span>

<span class="n">function</span> <span class="n">Sample</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">no</span><span class="p">,</span> <span class="nb">filter</span><span class="p">,</span> <span class="n">volume</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
    <span class="nb">filter</span> <span class="o">=</span> <span class="nb">filter</span> <span class="o">||</span> <span class="mi">10000</span>
    <span class="n">volume</span> <span class="o">=</span> <span class="n">volume</span> <span class="o">||</span> <span class="mi">0</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Filter</span><span class="p">(</span><span class="nb">filter</span><span class="p">,</span> <span class="s1">&#39;lowpass&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">96</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Channel</span><span class="p">({</span><span class="n">channelCount</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">volume</span><span class="p">:</span> <span class="n">volume</span><span class="p">})</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">],</span> <span class="n">mem</span><span class="o">.</span><span class="n">master</span><span class="p">)</span>
    <span class="n">samples</span><span class="p">[</span><span class="n">no</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]);</span>
<span class="p">}</span>

<span class="n">function</span> <span class="n">p</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">note</span><span class="p">,</span> <span class="nb">len</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">note</span> <span class="o">=</span> <span class="n">note</span> <span class="o">||</span> <span class="s2">&quot;C3&quot;</span>
    <span class="nb">len</span> <span class="o">=</span> <span class="nb">len</span> <span class="o">||</span> <span class="s2">&quot;16n&quot;</span>
    <span class="n">samples</span><span class="p">[</span><span class="n">s</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttackRelease</span><span class="p">(</span><span class="n">note</span><span class="p">,</span> <span class="nb">len</span><span class="p">,</span> <span class="n">time</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">function</span> <span class="n">once</span> <span class="p">()</span> <span class="p">{</span>
    
	<span class="n">var</span> <span class="n">vis</span> <span class="o">=</span> <span class="n">initWinamp</span><span class="p">(</span><span class="s2">&quot;Cope - The Neverending Explosion of Red Liquid Fire&quot;</span><span class="p">);</span>
    <span class="n">render_loop</span> <span class="o">=</span> <span class="n">function</span> <span class="p">()</span> <span class="p">{</span>
       <span class="n">vis</span><span class="o">.</span><span class="n">render</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="n">Tone</span><span class="o">.</span><span class="n">Master</span><span class="o">.</span><span class="n">volume</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="o">-</span><span class="mi">30</span>
    <span class="n">mem</span><span class="o">.</span><span class="n">master</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Channel</span><span class="p">({</span><span class="n">channelCount</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">volume</span><span class="p">:</span> <span class="o">-</span><span class="mi">10</span><span class="p">})</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">Tone</span><span class="o">.</span><span class="n">Destination</span><span class="p">);</span>

    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;k&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">20000</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;h&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">20000</span><span class="p">,</span> <span class="o">-</span><span class="mi">5</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;sn&quot;</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span> <span class="mi">6000</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;c&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1200</span><span class="p">,</span> <span class="o">-</span><span class="mi">10</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;stab&quot;</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">420</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;l&quot;</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">20000</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;o&quot;</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">20000</span><span class="p">,</span> <span class="o">-</span><span class="mi">8</span><span class="p">);</span>


    <span class="n">handlers</span><span class="p">[</span><span class="s2">&quot;1&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">function</span> <span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">val</span> <span class="o">&gt;</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;start_snare&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">true</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">dials</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">onChange</span><span class="p">(</span><span class="n">function</span> <span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">var</span> <span class="n">val</span> <span class="o">=</span> <span class="n">parseFloat</span><span class="p">(</span><span class="n">e</span><span class="p">[</span><span class="s2">&quot;data&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">);</span>
        <span class="n">handlers</span><span class="p">[</span><span class="s2">&quot;1&quot;</span><span class="p">](</span><span class="n">val</span><span class="p">);</span>
    <span class="p">})</span>

<span class="p">}</span>

<span class="n">function</span> <span class="n">tweak</span> <span class="p">()</span> <span class="p">{</span>
	<span class="n">mem</span><span class="o">.</span><span class="n">k1</span> <span class="o">=</span> <span class="n">knob</span><span class="p">({</span><span class="n">initial</span> <span class="p">:</span> <span class="mf">0.42</span><span class="p">,</span> <span class="n">ramp</span> <span class="p">:</span> <span class="p">[</span><span class="mf">0.42</span><span class="p">,</span> <span class="mf">0.525</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">,</span> <span class="mf">0.4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.65</span><span class="p">,</span> <span class="mf">0.75</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">],</span> <span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">dials</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]</span> <span class="p">});</span>
    <span class="n">always</span> <span class="o">=</span> <span class="n">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_filter&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">mem</span><span class="o">.</span><span class="n">k1</span><span class="o">.</span><span class="n">move</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="n">function</span> <span class="n">sampleTest</span> <span class="p">()</span> <span class="p">{</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;l&quot;</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">10000</span><span class="p">,</span> <span class="o">-</span><span class="mi">5</span><span class="p">);</span>

<span class="p">}</span>

<span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&lt;=</span> <span class="mi">3</span> <span class="p">)</span> <span class="p">{</span>
	<span class="n">transition</span> <span class="o">=</span> <span class="n">once</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
	<span class="n">transition</span> <span class="o">=</span> <span class="n">tweak</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">if</span> <span class="p">(</span><span class="n">isHit</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
   		 <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">4</span> <span class="p">)</span> <span class="p">{</span>
       		 <span class="n">p</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">8</span> <span class="p">)</span> <span class="p">{</span>
       	 	<span class="n">p</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span>  <span class="s2">&quot;C3&quot;</span><span class="p">,</span> <span class="s2">&quot;1n&quot;</span><span class="p">);</span>
        <span class="p">}</span>	
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">)</span> <span class="p">{</span>
    		<span class="n">p</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="s2">&quot;C3&quot;</span><span class="p">,</span> <span class="s2">&quot;1n&quot;</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">==</span> <span class="mi">15</span><span class="p">)</span> <span class="p">{</span>
        	<span class="n">transition</span><span class="p">();</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
		  <span class="k">if</span><span class="p">(</span> <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;start_snare&quot;</span><span class="p">])</span> <span class="p">{</span>
           <span class="n">p</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
        <span class="p">}</span>
 
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">6</span><span class="p">)</span> <span class="p">{</span>
       <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">12</span><span class="p">)</span> <span class="p">{</span>
	       <span class="n">p</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="s2">&quot;F2&quot;</span><span class="p">,</span> <span class="s2">&quot;16n&quot;</span><span class="p">)</span>
       <span class="p">}</span> 
    <span class="p">}</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">7</span><span class="p">)</span> <span class="p">{</span>
       <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">48</span><span class="p">)</span> <span class="p">{</span>

     		<span class="n">p</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="s2">&quot;C3&quot;</span><span class="p">,</span> <span class="s2">&quot;48n&quot;</span><span class="p">)</span>
       <span class="p">}</span>
    <span class="p">}</span>

<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="example1">
<h2>Example1<a class="headerlink" href="#example1" title="Permalink to this headline">ΒΆ</a></h2>
<p>This illustrates the core concepts of bitrhythm.</p>
<ol class="simple">
<li><p>Samples (Tone.Sampler)</p></li>
<li><p>Dials (use cellx internally)</p></li>
<li><p>Observers (cellx)</p></li>
</ol>
<p>See <a class="reference external" href="https://tonejs.github.io/">https://tonejs.github.io/</a> for more notes.</p>
<p>For an understanding of the global variables see the concepts and code walkthrough section.</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>- patterns and track_no
- isHit, current_bit
- samples
- Tone
- cellx
- window and any thing included with the script tag is available here
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">mem</span></code> is short for memory. All instruments and effects are saved here so that they can be accessed everywhere.</p>
<p>Step to create the basic song.</p>
<ol class="simple">
<li><p>Click on <code class="docutils literal notranslate"><span class="pre">Add</span> <span class="pre">Sample</span> <span class="pre">URL</span></code> to add the following URLs</p>
<ul class="simple">
<li><p>/Kick01.wav</p></li>
<li><p>/Snare19.wav</p></li>
<li><p>/Closedhat01.wav</p></li>
<li><p>/MiscSynthStab04.wav</p></li>
</ul>
</li>
<li><p>Click on <code class="docutils literal notranslate"><span class="pre">Add</span> <span class="pre">Dial</span></code></p></li>
<li><p>Enter the following into the window</p></li>
</ol>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">scene1</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 1000 1000 1000 1000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 00x0 00x0 00x0 00x0&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 0000 x000 0000 x000&quot;</span><span class="p">),</span>
<span class="p">]</span>

<span class="n">scene2</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 1011 1001 1000 1000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 00x0 00x0 00x0 00x0&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 0000 x000 0000 x000&quot;</span><span class="p">),</span>
<span class="p">]</span>

<span class="n">patterns</span> <span class="o">=</span> <span class="n">scene1</span>

<span class="n">function</span> <span class="n">Sample</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">no</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="o">||</span> <span class="s2">&quot;sample&quot;</span>
    <span class="n">name</span> <span class="o">+=</span> <span class="n">no</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Filter</span><span class="p">(</span><span class="mi">10000</span><span class="p">,</span> <span class="s1">&#39;lowpass&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">96</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Channel</span><span class="p">({</span><span class="n">channelCount</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">volume</span><span class="p">:</span><span class="mi">0</span><span class="p">})</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">],</span> <span class="n">mem</span><span class="o">.</span><span class="n">master</span><span class="p">)</span>
    <span class="n">samples</span><span class="p">[</span><span class="n">no</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]);</span>
<span class="p">}</span>

<span class="n">function</span> <span class="n">p</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">note</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">note</span> <span class="o">=</span> <span class="n">note</span> <span class="o">||</span> <span class="s2">&quot;C3&quot;</span>
    <span class="n">samples</span><span class="p">[</span><span class="n">s</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttack</span><span class="p">(</span><span class="n">note</span><span class="p">,</span> <span class="n">time</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">var</span> <span class="n">once</span> <span class="o">=</span> <span class="n">function</span> <span class="p">()</span> <span class="p">{</span>
    <span class="n">Tone</span><span class="o">.</span><span class="n">Master</span><span class="o">.</span><span class="n">volume</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="o">-</span><span class="mi">30</span>
    <span class="n">mem</span><span class="o">.</span><span class="n">master</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Channel</span><span class="p">({</span><span class="n">channelCount</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">volume</span><span class="p">:</span> <span class="o">-</span><span class="mi">10</span><span class="p">})</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Destination</span><span class="p">);</span>
    <span class="n">mem</span><span class="o">.</span><span class="n">volume_guard</span> <span class="o">=</span> <span class="n">guard</span><span class="p">([</span><span class="o">-</span><span class="mi">20</span><span class="p">,</span><span class="o">-</span><span class="mi">10</span><span class="p">]);</span>

    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;k&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;h&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;sn&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>

    <span class="n">handlers</span><span class="p">[</span><span class="s2">&quot;ex&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">function</span> <span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">val</span> <span class="o">&gt;</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;start_snare&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">true</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">dials</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">onChange</span><span class="p">(</span><span class="n">function</span> <span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">var</span> <span class="n">val</span> <span class="o">=</span> <span class="n">parseFloat</span><span class="p">(</span><span class="n">e</span><span class="p">[</span><span class="s2">&quot;data&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">);</span>
        <span class="n">handlers</span><span class="p">[</span><span class="s2">&quot;ex&quot;</span><span class="p">](</span><span class="n">val</span><span class="p">);</span>
    <span class="p">})</span>

<span class="p">}</span>

<span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&lt;=</span> <span class="mi">3</span> <span class="p">)</span> <span class="p">{</span>
	<span class="n">transition</span> <span class="o">=</span> <span class="n">once</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
	<span class="n">transition</span> <span class="o">=</span> <span class="n">tweak</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">if</span> <span class="p">(</span><span class="n">isHit</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">p</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">p</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="s2">&quot;start_snare&quot;</span><span class="p">])</span> <span class="p">{</span>
            <span class="n">p</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
        <span class="p">};</span>
    <span class="p">}</span>
<span class="p">}</span>


</pre></div>
</div>
<p>Now try changing the code.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">patterns</span> <span class="o">=</span> <span class="n">scene2</span>
</pre></div>
</div>
<p>Increase the dial to see the addition of the snare. This is how you can use observers to trigger unrelated changes. I call them sideevents, as the logic is similar to sidechain, which typically observers the volume.</p>
<p>Comment and Uncomment lines in the <code class="docutils literal notranslate"><span class="pre">if</span> <span class="pre">(isHit)</span></code> block. To mute and unmute sections.</p>
<p><em>Note:</em> <code class="docutils literal notranslate"><span class="pre">mem[&quot;k0_channel&quot;].solo</span> <span class="pre">=</span> <span class="pre">true;</span></code> is not working.</p>
<p><strong>Visuals</strong></p>
<p>Change the once function to this and click <code class="docutils literal notranslate"><span class="pre">+</span> <span class="pre">Execute</span> <span class="pre">Once</span></code></p>
<p>Code is taken from butterchurn. Try changing <a class="reference external" href="https://butterchurnviz.com/">presets</a> to get different visuals.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">var</span> <span class="n">tweak</span> <span class="o">=</span> <span class="n">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">var</span> <span class="n">can</span> <span class="o">=</span> <span class="n">document</span><span class="o">.</span><span class="n">getElementById</span><span class="p">(</span><span class="s2">&quot;visual&quot;</span><span class="p">);</span>
    <span class="n">var</span> <span class="n">can_container</span> <span class="o">=</span> <span class="n">document</span><span class="o">.</span><span class="n">getElementById</span><span class="p">(</span><span class="s2">&quot;canvas-container&quot;</span><span class="p">);</span>
    <span class="n">can</span><span class="o">.</span><span class="n">width</span> <span class="o">=</span> <span class="n">window</span><span class="o">.</span><span class="n">innerWidth</span><span class="p">;</span>
    <span class="n">can</span><span class="o">.</span><span class="n">height</span> <span class="o">=</span> <span class="n">window</span><span class="o">.</span><span class="n">innerHeight</span><span class="p">;</span>
    <span class="n">can_container</span><span class="o">.</span><span class="n">width</span> <span class="o">=</span> <span class="n">window</span><span class="o">.</span><span class="n">innerWidth</span><span class="p">;</span>
    <span class="n">window</span><span class="o">.</span><span class="n">visualizer</span> <span class="o">=</span> <span class="n">window</span><span class="o">.</span><span class="n">butterchurn</span><span class="o">.</span><span class="n">default</span><span class="o">.</span><span class="n">createVisualizer</span><span class="p">(</span><span class="n">Tone</span><span class="o">.</span><span class="n">getContext</span><span class="p">()</span><span class="o">.</span><span class="n">rawContext</span><span class="p">,</span> <span class="n">can</span><span class="p">,</span> <span class="p">{</span>
        <span class="n">width</span><span class="p">:</span> <span class="n">window</span><span class="o">.</span><span class="n">innerWidth</span><span class="p">,</span>
        <span class="n">height</span><span class="p">:</span> <span class="n">window</span><span class="o">.</span><span class="n">innerHeight</span><span class="p">,</span>
    <span class="p">});</span>
    <span class="n">window</span><span class="o">.</span><span class="n">visualizer</span><span class="o">.</span><span class="n">connectAudio</span><span class="p">(</span><span class="n">Tone</span><span class="o">.</span><span class="n">getContext</span><span class="p">()</span><span class="o">.</span><span class="n">destination</span><span class="p">);</span>
    <span class="n">const</span> <span class="n">presets</span> <span class="o">=</span> <span class="n">butterchurnPresets</span><span class="o">.</span><span class="n">getPresets</span><span class="p">();</span>
    <span class="n">const</span> <span class="n">preset</span> <span class="o">=</span> <span class="n">presets</span><span class="p">[</span><span class="s2">&quot;_Aderrasi - Wanderer in Curved Space - mash0000 - faclempt kibitzing meshuggana schmaltz (Geiss color mix)&quot;</span><span class="p">]</span>
    <span class="n">window</span><span class="o">.</span><span class="n">visualizer</span><span class="o">.</span><span class="n">loadPreset</span><span class="p">(</span><span class="n">preset</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">);</span> <span class="o">//</span> <span class="mi">2</span><span class="n">nd</span> <span class="n">argument</span> <span class="ow">is</span> <span class="n">the</span> <span class="n">number</span> <span class="n">of</span> <span class="n">seconds</span> <span class="n">to</span> <span class="n">blend</span> <span class="n">presets</span>

    <span class="n">render_loop</span> <span class="o">=</span> <span class="n">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="n">window</span><span class="o">.</span><span class="n">visualizer</span><span class="o">.</span><span class="n">render</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p><strong>Tweaking</strong></p>
<p>First click <code class="docutils literal notranslate"><span class="pre">+</span> <span class="pre">Number</span></code>. This is useful to check if the knob function is actually working. And click <code class="docutils literal notranslate"><span class="pre">+</span> <span class="pre">Execute</span> <span class="pre">Once</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">var</span> <span class="n">tweak</span> <span class="o">=</span> <span class="n">function</span> <span class="p">()</span> <span class="p">{</span>
    <span class="n">mem</span><span class="o">.</span><span class="n">k1</span> <span class="o">=</span> <span class="n">knob</span><span class="p">({</span><span class="n">ramp</span> <span class="p">:</span> <span class="p">[</span><span class="mf">0.09</span><span class="p">,</span><span class="mf">1.8</span><span class="p">,</span> <span class="mf">0.4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mf">1.5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">numbers</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;v&quot;</span><span class="p">]</span> <span class="p">});</span>
    <span class="n">always</span> <span class="o">=</span> <span class="n">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;k0_filter&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">mem</span><span class="o">.</span><span class="n">k1</span><span class="o">.</span><span class="n">move</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>As you can sere numbers and dials will be available as a global array.</p>
<p>There is no way to remove them so be careful about the order in which you add them.</p>
<p>The following code will always be executed as its at the top level. As you can see this code implies that the first dial is connected to the master volume. Use guards to avoid going deaf as sometimes editing can created bad frequency numbers.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tone</span><span class="o">.</span><span class="n">Master</span><span class="o">.</span><span class="n">volume</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">volume_guard</span><span class="p">((</span><span class="mi">1</span> <span class="o">-</span> <span class="n">dials</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]())</span> <span class="o">*</span> <span class="o">-</span><span class="mi">30</span><span class="p">);</span>
</pre></div>
</div>
</div>
<div class="section" id="example2">
<h2>Example2<a class="headerlink" href="#example2" title="Permalink to this headline">ΒΆ</a></h2>
<ul class="simple">
<li><p>Kick + Filter</p></li>
<li><p>Snare + Filter</p></li>
<li><p>Snare + Filter + Delay</p></li>
<li><p>High Hat</p></li>
<li><p>Lead + Filter</p></li>
<li><p>Dub Stab + Filter + Reverb</p></li>
</ul>
<p>Tip: In Tone.js you can’t call connect one after another, you need to use chain.</p>
<p>TODO: Add glide to Lead to make it more 303 sounding</p>
<p>Master is connected with Surround and Volume Limiter.
Use Gates and Limiters to avoid going deaf.</p>
<p>Tone.MultiInstrument gave lots of glitches, so custom voices are written in the voice function</p>
<p>Channels provide</p>
<ul class="simple">
<li><p>Mute</p></li>
<li><p>Solo</p></li>
</ul>
<p>More improvements for the Stab</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>- Chorus or Phaser
- Compressor
- Decay in envelope
- Separate filters
- EQ
- Sends for more delay
- LFO for filters
</pre></div>
</div>
<p>Freeverb does not work and also needs Mono to function properly</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">var</span> <span class="n">reverb</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Freeverb</span><span class="p">()</span><span class="o">.</span><span class="n">toDestination</span><span class="p">();</span>
<span class="n">var</span> <span class="n">reverb_mono</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Mono</span><span class="p">()</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">reverb</span><span class="p">);</span>
<span class="n">reverb</span><span class="o">.</span><span class="n">dampening</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
<span class="n">reverb</span><span class="o">.</span><span class="n">roomSize</span> <span class="o">=</span> <span class="mf">0.9</span><span class="p">;</span>
</pre></div>
</div>
</div>
<div class="section" id="full-code">
<h2>Full Code<a class="headerlink" href="#full-code" title="Permalink to this headline">ΒΆ</a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">volume_guard1</span> <span class="o">=</span> <span class="n">guard</span><span class="p">([</span><span class="o">-</span><span class="mi">20</span><span class="p">,</span><span class="mi">15</span><span class="p">])</span>
<span class="n">volume_guard2</span> <span class="o">=</span> <span class="n">guard</span><span class="p">([</span><span class="o">-</span><span class="mi">20</span><span class="p">,</span><span class="mi">15</span><span class="p">])</span>
<span class="n">Tone</span><span class="o">.</span><span class="n">Master</span><span class="o">.</span><span class="n">volume</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">volume_guard1</span><span class="p">(</span><span class="n">Math</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">dials</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]()</span> <span class="o">*</span> <span class="mi">30</span><span class="p">)</span> <span class="o">-</span><span class="mi">20</span><span class="p">);</span>
 <span class="o">//</span><span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_channel&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">volume</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">volume_guard2</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span>
<span class="o">//</span> <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_filter&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">dials</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]()</span> <span class="o">*</span> <span class="mi">10000</span><span class="p">);</span>
<span class="o">//</span> <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;l_filter&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">dials</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">);</span>


<span class="n">scene1</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 1000 1000 1000 1000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 00x0 00x0 00x0 00x0&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 0x00 0000 0000 x000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p 0000 x000 0000 x000&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p xx0x x0x0 x0x0 0xxx&quot;</span><span class="p">),</span>
    <span class="n">cellx</span><span class="p">(</span><span class="s2">&quot;p x000 x0x0 0000 x0x0&quot;</span><span class="p">),</span>
<span class="p">]</span>

<span class="n">patterns</span> <span class="o">=</span> <span class="n">scene1</span>

<span class="n">always</span><span class="p">();</span>

<span class="n">function</span> <span class="n">NoiseSynth</span> <span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="o">||</span> <span class="s2">&quot;wf&quot;</span><span class="p">;</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">StereoWidener</span><span class="p">({</span><span class="n">width</span><span class="p">:</span> <span class="mi">1</span><span class="p">});</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span>  <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Noise</span><span class="p">(</span><span class="s2">&quot;pink&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">start</span><span class="p">();</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Filter</span><span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="s1">&#39;lowpass&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">96</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Channel</span><span class="p">({</span><span class="n">channelCount</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">volume</span><span class="p">:</span> <span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="n">pan</span><span class="p">:</span> <span class="o">-</span><span class="mf">0.8</span><span class="p">})</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">],</span> <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_stereo&quot;</span><span class="p">],</span> <span class="n">mem</span><span class="o">.</span><span class="n">master</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">])</span>
<span class="p">}</span>


<span class="n">function</span> <span class="n">Sample</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">no</span><span class="p">,</span> <span class="nb">filter</span><span class="p">,</span> <span class="n">volume</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
    <span class="nb">filter</span> <span class="o">=</span> <span class="nb">filter</span> <span class="o">||</span> <span class="mi">10000</span>
    <span class="n">volume</span> <span class="o">=</span> <span class="n">volume</span> <span class="o">||</span> <span class="mi">0</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Filter</span><span class="p">(</span><span class="nb">filter</span><span class="p">,</span> <span class="s1">&#39;lowpass&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">96</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Channel</span><span class="p">({</span><span class="n">channelCount</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">volume</span><span class="p">:</span> <span class="n">volume</span><span class="p">})</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">],</span> <span class="n">mem</span><span class="o">.</span><span class="n">master</span><span class="p">)</span>
    <span class="n">samples</span><span class="p">[</span><span class="n">no</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]);</span>
<span class="p">}</span>

<span class="n">function</span> <span class="n">Stab</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="o">||</span> <span class="s2">&quot;stab&quot;</span><span class="p">;</span>

    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Filter</span><span class="p">(</span><span class="mi">5250</span><span class="p">,</span> <span class="s1">&#39;lowpass&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">96</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_hfilter&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Filter</span><span class="p">(</span><span class="mi">80</span><span class="p">,</span> <span class="s1">&#39;highpass&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">96</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_reverb&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Reverb</span><span class="p">(</span><span class="mf">0.1</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_delay&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">FeedbackDelay</span><span class="p">(</span><span class="s2">&quot;4n&quot;</span><span class="p">,</span> <span class="mf">0.4</span><span class="p">);</span>
    <span class="o">//</span> <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_pdelay&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">PingPongDelay</span><span class="p">(</span><span class="s2">&quot;2n&quot;</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">);</span>
     <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">StereoWidener</span><span class="p">({</span><span class="n">width</span><span class="p">:</span> <span class="mf">0.25</span><span class="p">});</span>
     <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Channel</span><span class="p">({</span><span class="n">channelCount</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">volume</span><span class="p">:</span> <span class="o">-</span><span class="mi">2</span><span class="p">})</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_filter&quot;</span><span class="p">]</span> <span class="p">,</span>   <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_delay&quot;</span><span class="p">],</span> <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_reverb&quot;</span><span class="p">],</span>  <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_hfilter&quot;</span><span class="p">]</span> <span class="p">,</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_stereo&quot;</span><span class="p">],</span> <span class="n">mem</span><span class="o">.</span><span class="n">master</span><span class="p">)</span>


    <span class="n">function</span> <span class="n">voice</span><span class="p">(</span><span class="n">no</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_synth&quot;</span> <span class="o">+</span> <span class="n">no</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">MonoSynth</span><span class="p">({</span>
            <span class="n">oscillator</span><span class="p">:</span> <span class="p">{</span>
                <span class="nb">type</span><span class="p">:</span> <span class="nb">type</span>
            <span class="p">}</span>
        <span class="p">})</span>
        <span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_synth&quot;</span> <span class="o">+</span> <span class="n">no</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;_channel&quot;</span><span class="p">]);</span>
    <span class="p">}</span>

    <span class="n">voice</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;sawtooth&quot;</span><span class="p">)</span>
    <span class="n">voice</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&quot;sawtooth&quot;</span><span class="p">)</span>
    <span class="n">voice</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;sawtooth&quot;</span><span class="p">)</span>
    <span class="n">voice</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="s2">&quot;pwm&quot;</span><span class="p">)</span>
    <span class="n">voice</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="s2">&quot;pwm&quot;</span><span class="p">)</span>
    <span class="n">voice</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="s2">&quot;pwm&quot;</span><span class="p">)</span>
<span class="p">}</span>


<span class="n">function</span> <span class="n">p</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">note</span><span class="p">,</span> <span class="nb">len</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">note</span> <span class="o">=</span> <span class="n">note</span> <span class="o">||</span> <span class="s2">&quot;C3&quot;</span>
    <span class="nb">len</span> <span class="o">=</span> <span class="nb">len</span> <span class="o">||</span> <span class="s2">&quot;16n&quot;</span>
    <span class="n">samples</span><span class="p">[</span><span class="n">s</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttackRelease</span><span class="p">(</span><span class="n">note</span><span class="p">,</span> <span class="nb">len</span><span class="p">,</span> <span class="n">time</span><span class="p">);</span>
<span class="p">}</span>


<span class="n">function</span> <span class="n">s</span><span class="p">(</span><span class="n">vel</span><span class="p">,</span> <span class="n">notes</span><span class="p">,</span> <span class="n">duration</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">vel</span> <span class="o">=</span> <span class="n">vel</span> <span class="o">||</span> <span class="mf">1.0</span><span class="p">;</span>
    <span class="n">duration</span> <span class="o">=</span> <span class="n">duration</span> <span class="o">||</span> <span class="s2">&quot;2n&quot;</span><span class="p">;</span>
    <span class="n">notes</span> <span class="o">=</span> <span class="n">notes</span> <span class="o">||</span>  <span class="p">[</span><span class="s2">&quot;E2&quot;</span><span class="p">,</span> <span class="s2">&quot;B2&quot;</span><span class="p">,</span> <span class="s2">&quot;G2&quot;</span><span class="p">];</span>
    <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_synth1&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttackRelease</span><span class="p">(</span><span class="n">notes</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">duration</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">vel</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_synth2&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttackRelease</span><span class="p">(</span><span class="n">notes</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">duration</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">vel</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_synth3&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttackRelease</span><span class="p">(</span><span class="n">notes</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">duration</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">vel</span><span class="p">);</span>

    <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_synth4&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttackRelease</span><span class="p">(</span><span class="n">notes</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">duration</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">vel</span><span class="p">);</span>
    <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_synth5&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttackRelease</span><span class="p">(</span><span class="n">notes</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">duration</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">vel</span><span class="p">);</span>
   <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_synth6&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">triggerAttackRelease</span><span class="p">(</span><span class="n">notes</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">duration</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">vel</span><span class="p">);</span>
<span class="p">}</span>




<span class="n">function</span> <span class="n">once</span> <span class="p">()</span> <span class="p">{</span>
    
	<span class="o">//</span> <span class="n">var</span> <span class="n">vis</span> <span class="o">=</span> <span class="n">initWinamp</span><span class="p">(</span><span class="s2">&quot;Unchained - Rewop&quot;</span><span class="p">);</span>
    <span class="n">render_loop</span> <span class="o">=</span> <span class="n">function</span> <span class="p">()</span> <span class="p">{</span>
       <span class="o">//</span> <span class="n">vis</span><span class="o">.</span><span class="n">render</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="n">Tone</span><span class="o">.</span><span class="n">Master</span><span class="o">.</span><span class="n">volume</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="o">-</span><span class="mi">30</span>
    <span class="n">mem</span><span class="o">.</span><span class="n">master</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Tone</span><span class="o">.</span><span class="n">Channel</span><span class="p">({</span><span class="n">channelCount</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">volume</span><span class="p">:</span> <span class="o">-</span><span class="mi">10</span><span class="p">})</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">Tone</span><span class="o">.</span><span class="n">Destination</span><span class="p">);</span>

    <span class="o">//</span> <span class="n">NoiseSynth</span><span class="p">();</span>
    <span class="n">Stab</span><span class="p">();</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;k&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3000</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;h&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">7000</span><span class="p">,</span> <span class="o">-</span><span class="mi">15</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;sn&quot;</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span> <span class="mi">6000</span><span class="p">,</span> <span class="o">-</span><span class="mi">15</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;c&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">800</span><span class="p">,</span> <span class="o">-</span><span class="mi">10</span><span class="p">);</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;l&quot;</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">420</span><span class="p">,</span> <span class="o">-</span><span class="mi">15</span><span class="p">);</span>


    <span class="n">handlers</span><span class="p">[</span><span class="s2">&quot;1&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">function</span> <span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">val</span> <span class="o">&gt;</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;start_snare&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">true</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;start_snare&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">false</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_filter&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">Q</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">val</span> <span class="o">*</span> <span class="mi">5</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="n">dials</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">onChange</span><span class="p">(</span><span class="n">function</span> <span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">var</span> <span class="n">val</span> <span class="o">=</span> <span class="n">parseFloat</span><span class="p">(</span><span class="n">e</span><span class="p">[</span><span class="s2">&quot;data&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">);</span>
        <span class="n">handlers</span><span class="p">[</span><span class="s2">&quot;1&quot;</span><span class="p">](</span><span class="n">val</span><span class="p">);</span>
    <span class="p">})</span>
    
    

<span class="p">}</span>


<span class="n">function</span> <span class="n">tweak</span> <span class="p">()</span> <span class="p">{</span>
	<span class="n">mem</span><span class="o">.</span><span class="n">k1</span> <span class="o">=</span> <span class="n">knob</span><span class="p">({</span><span class="n">ramp</span> <span class="p">:</span> <span class="p">[</span><span class="mf">0.525</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">,</span> <span class="mf">0.4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.25</span><span class="p">,</span> <span class="mf">0.75</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.25</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">],</span> <span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">dials</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="s2">&quot;cell&quot;</span><span class="p">]</span> <span class="p">});</span>
    <span class="n">always</span> <span class="o">=</span> <span class="n">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="n">mem</span><span class="p">[</span><span class="s2">&quot;stab_filter&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">mem</span><span class="o">.</span><span class="n">k1</span><span class="o">.</span><span class="n">move</span><span class="p">()</span> <span class="o">*</span> <span class="mi">10000</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>




<span class="n">function</span> <span class="n">sampleTest</span> <span class="p">()</span> <span class="p">{</span>
    <span class="n">Sample</span><span class="p">(</span><span class="s2">&quot;l&quot;</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">10000</span><span class="p">,</span> <span class="o">-</span><span class="mi">5</span><span class="p">);</span>

<span class="p">}</span>



<span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&lt;=</span> <span class="mi">3</span> <span class="p">)</span> <span class="p">{</span>
	<span class="n">transition</span> <span class="o">=</span> <span class="n">once</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
	<span class="n">transition</span> <span class="o">=</span> <span class="n">tweak</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">if</span> <span class="p">(</span><span class="n">isHit</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
   		 <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">)</span> <span class="p">{</span>
       		 <span class="n">p</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">8</span> <span class="p">)</span> <span class="p">{</span>
       	 	<span class="n">p</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
        <span class="p">}</span>	
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">4</span> <span class="p">)</span> <span class="p">{</span>
    		<span class="n">s</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">==</span> <span class="mi">6</span><span class="p">)</span> <span class="p">{</span>
        	<span class="n">transition</span><span class="p">();</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
        <span class="o">//</span> <span class="n">Uncomment</span> <span class="k">for</span> <span class="n">snare</span>
      <span class="o">//</span>  <span class="k">if</span> <span class="p">(</span><span class="n">mem</span><span class="p">[</span><span class="s2">&quot;start_snare&quot;</span><span class="p">])</span> <span class="p">{</span>
            <span class="n">p</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
      <span class="o">//</span>  <span class="p">}</span>

    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
         <span class="k">if</span> <span class="p">(</span><span class="n">bars</span> <span class="o">&gt;</span> <span class="mi">12</span><span class="p">)</span> <span class="p">{</span>
	  		<span class="n">p</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
        <span class="p">}</span>
       <span class="o">//</span> <span class="n">a</span><span class="p">();</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">track_no</span> <span class="o">==</span> <span class="mi">6</span><span class="p">)</span> <span class="p">{</span>
      <span class="o">//</span> <span class="n">p</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="s2">&quot;B3&quot;</span><span class="p">,</span> <span class="s2">&quot;8n&quot;</span><span class="p">)</span>
    <span class="p">}</span>

<span class="p">}</span>
</pre></div>
</div>
</div>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="source-code.html" title="previous page">Source Code and License</a>
    <a class='right-next' id="next-link" href="tweaking.html" title="next page">What exactly is Tweaking ?</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/early-attempts.html.







































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Early Attempts &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Changelog" href="changelog.html" />
    <link rel="prev" title="Samples" href="samples.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="early-attempts">
<h1>Early Attempts<a class="headerlink" href="#early-attempts" title="Permalink to this headline">ΒΆ</a></h1>
<p>My first attempt at this project was called bang256 ~ 2016, meant to mess with Renoise’s OSC. Its still usable.</p>
<p>The music loop for OSC sequencing. You need to install osc and nanotimer. Alternatively you can use portmidi</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">var</span> <span class="n">fs</span> <span class="o">=</span> <span class="n">require</span><span class="p">(</span><span class="s2">&quot;fs&quot;</span><span class="p">);</span>
<span class="n">var</span> <span class="n">osc</span> <span class="o">=</span> <span class="n">require</span><span class="p">(</span><span class="s2">&quot;osc&quot;</span><span class="p">);</span>
<span class="n">var</span> <span class="n">NanoTimer</span> <span class="o">=</span> <span class="n">require</span><span class="p">(</span><span class="s1">&#39;nanotimer&#39;</span><span class="p">);</span>
<span class="n">var</span> <span class="n">timer</span> <span class="o">=</span> <span class="n">new</span> <span class="n">NanoTimer</span><span class="p">();</span>

<span class="n">function</span> <span class="n">bang256</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">tempo</span><span class="p">,</span> <span class="n">lines_per_beat</span><span class="p">,</span> <span class="n">measure</span><span class="p">,</span> <span class="n">tracks</span><span class="p">,</span> <span class="n">title</span><span class="p">)</span> <span class="p">{</span>

    <span class="n">var</span> <span class="n">udpPort</span> <span class="o">=</span> <span class="n">new</span> <span class="n">osc</span><span class="o">.</span><span class="n">UDPPort</span><span class="p">({</span>
        <span class="n">remoteAddress</span><span class="p">:</span> <span class="n">host</span><span class="p">,</span>
        <span class="n">remotePort</span><span class="p">:</span> <span class="n">port</span>
    <span class="p">});</span>

    <span class="n">udpPort</span><span class="o">.</span><span class="n">open</span><span class="p">();</span>

    <span class="n">var</span> <span class="n">beat</span> <span class="o">=</span> <span class="mf">60.0</span> <span class="o">/</span> <span class="n">tempo</span><span class="p">;</span>
    <span class="n">var</span> <span class="n">lines_per_measure</span> <span class="o">=</span> <span class="n">lines_per_beat</span> <span class="o">*</span> <span class="n">measure</span><span class="p">;</span>
    <span class="n">var</span> <span class="n">tick</span> <span class="o">=</span> <span class="n">beat</span> <span class="o">/</span> <span class="n">lines_per_beat</span><span class="p">;</span>
    <span class="n">var</span> <span class="n">bangs</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="n">var</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="n">timer</span><span class="o">.</span><span class="n">setInterval</span><span class="p">(</span><span class="n">function</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">var</span> <span class="n">bang</span> <span class="o">=</span> <span class="p">(</span><span class="n">bangs</span> <span class="o">%</span> <span class="n">lines_per_measure</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">bang</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">count</span><span class="o">++</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">for</span> <span class="p">(</span><span class="n">var</span> <span class="n">t</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">t</span> <span class="o">&lt;=</span> <span class="n">tracks</span><span class="p">;</span> <span class="n">t</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">var</span> <span class="n">path</span> <span class="o">=</span> <span class="n">title</span> <span class="o">+</span> <span class="s2">&quot;/&quot;</span> <span class="o">+</span> <span class="n">t</span><span class="p">;</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">fs</span><span class="o">.</span><span class="n">existsSync</span><span class="p">(</span><span class="n">path</span><span class="p">))</span> <span class="p">{</span>
                <span class="n">var</span> <span class="n">code</span> <span class="o">=</span> <span class="n">fs</span><span class="o">.</span><span class="n">readFileSync</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="p">{</span><span class="n">encoding</span><span class="p">:</span> <span class="s1">&#39;utf-8&#39;</span><span class="p">});</span>
                <span class="n">var</span> <span class="n">f</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">code</span><span class="p">);</span>
                <span class="n">f</span><span class="p">(</span><span class="n">udpPort</span><span class="p">,</span> <span class="n">bang</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">bangs</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>

        <span class="n">bangs</span><span class="o">++</span><span class="p">;</span>

    <span class="p">},</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">tick</span> <span class="o">+</span> <span class="s2">&quot;s&quot;</span><span class="p">);</span>

<span class="p">}</span>

<span class="n">var</span> <span class="n">argv</span> <span class="o">=</span> <span class="n">require</span><span class="p">(</span><span class="s1">&#39;minimist&#39;</span><span class="p">)(</span><span class="n">process</span><span class="o">.</span><span class="n">argv</span><span class="o">.</span><span class="n">slice</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span>
<span class="n">var</span> <span class="n">bang256</span> <span class="o">=</span> <span class="n">require</span><span class="p">(</span><span class="s2">&quot;bang256&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">bang256</span><span class="p">;</span>

<span class="n">var</span> <span class="n">host</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="s2">&quot;host&quot;</span><span class="p">]</span> <span class="o">||</span> <span class="s2">&quot;127.0.0.1&quot;</span><span class="p">;</span>
<span class="n">var</span> <span class="n">port</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="s2">&quot;port&quot;</span><span class="p">]</span> <span class="o">||</span> <span class="mi">8000</span><span class="p">;</span>
<span class="n">var</span> <span class="n">tempo</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="s2">&quot;tempo&quot;</span><span class="p">];</span>
<span class="n">var</span> <span class="n">lines_per_beat</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="s2">&quot;lpb&quot;</span><span class="p">]</span> <span class="o">||</span> <span class="mi">4</span><span class="p">;</span>
<span class="n">var</span> <span class="n">measure</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="s2">&quot;measure&quot;</span><span class="p">]</span> <span class="o">||</span> <span class="mi">4</span><span class="p">;</span>
<span class="n">var</span> <span class="n">tracks</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="s2">&quot;tracks&quot;</span><span class="p">]</span> <span class="o">||</span> <span class="mi">4</span><span class="p">;</span>
<span class="n">var</span> <span class="n">title</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="s2">&quot;title&quot;</span><span class="p">];</span>

<span class="n">bang256</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">tempo</span><span class="p">,</span> <span class="n">lines_per_beat</span><span class="p">,</span> <span class="n">measure</span><span class="p">,</span> <span class="n">tracks</span><span class="p">,</span> <span class="n">title</span><span class="p">);</span>
</pre></div>
</div>
<p>To run,</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">node</span> <span class="o">./</span><span class="n">bang256</span> <span class="o">-</span><span class="n">host</span> <span class="s2">&quot;127.0.0.1&quot;</span> <span class="o">--</span><span class="n">tempo</span><span class="o">=</span><span class="mi">120</span> <span class="o">--</span><span class="n">lpb</span><span class="o">=</span><span class="mi">4</span> <span class="o">--</span><span class="n">measure</span><span class="o">=</span><span class="mi">4</span> <span class="o">--</span><span class="n">tracks</span><span class="o">=</span><span class="mi">4</span> <span class="o">--</span><span class="n">title</span><span class="o">=</span><span class="n">foo</span>
</pre></div>
</div>
<p>Edit files in foo/1 and foo/2 and foo/3 and foo/4 to create live music with an OSC compatible synthesizer.</p>
<p>Inside the file <code class="docutils literal notranslate"><span class="pre">foo/1</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">function</span> <span class="p">(</span><span class="n">osc</span><span class="p">,</span> <span class="n">bang</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">bangs</span><span class="p">,</span> <span class="n">thread</span><span class="p">)</span> <span class="p">{</span>

    <span class="k">if</span> <span class="p">([</span><span class="mi">4</span><span class="p">,</span> <span class="mi">12</span><span class="p">]</span><span class="o">.</span><span class="n">indexOf</span><span class="p">(</span><span class="n">bang</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">var</span> <span class="n">msg</span> <span class="o">=</span> <span class="p">{</span>
            <span class="n">address</span><span class="p">:</span> <span class="s2">&quot;/renoise/trigger/note_on&quot;</span><span class="p">,</span>
            <span class="n">args</span><span class="p">:</span> <span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">38</span><span class="p">,</span> <span class="mi">127</span><span class="p">],</span>
        <span class="p">};</span>
        <span class="n">osc</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">);</span>
    <span class="p">}</span>

<span class="p">})</span>
</pre></div>
</div>
<p><a class="reference external" href="https://www.perl.com/pub/2004/08/31/livecode.html/">https://www.perl.com/pub/2004/08/31/livecode.html/</a>  also uses the ticks approach but uses a message bus for events.<br />
<a class="reference external" href="https://github.com/psenough/teach_yourself_demoscene_in_14_days">https://github.com/psenough/teach_yourself_demoscene_in_14_days</a></p>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="samples.html" title="previous page">Samples</a>
    <a class='right-next' id="next-link" href="changelog.html" title="next page">Changelog</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/genindex.html.











































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Index &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="#" />
    <link rel="search" title="Search" href="search.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                

<h1 id="index">Index</h1>

<div class="genindex-jumpbox">
 
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/index.html.















































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta content="Bitrhythm's - literate documentation" lang="en" name="description" xml:lang="en" />
<meta content="literate programming, p5, live coding, algorave, demoscene, creative programming, music, techno, programming, webaudio, webgl, improvising" name="keywords" />

    <title>Welcome to Bitrhythm’s documentation! &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="What is bitrhythm about ?" href="what.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="#">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="welcome-to-bitrhythm-s-documentation">
<h1>Welcome to Bitrhythm’s  documentation!<a class="headerlink" href="#welcome-to-bitrhythm-s-documentation" title="Permalink to this headline">ΒΆ</a></h1>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Table of Contents</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="what.html">What is bitrhythm about ?</a><ul>
<li class="toctree-l2"><a class="reference internal" href="what.html#about-author">About Author</a></li>
<li class="toctree-l2"><a class="reference internal" href="what.html#support-this-project">Support this project</a></li>
<li class="toctree-l2"><a class="reference internal" href="what.html#future-features">Future Features</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="source-code.html">Source Code and License</a></li>
<li class="toctree-l1"><a class="reference internal" href="demo.html">Demo and Tutorial</a><ul>
<li class="toctree-l2"><a class="reference internal" href="demo.html#video">Video</a></li>
<li class="toctree-l2"><a class="reference internal" href="demo.html#demo-song-1-techno">Demo Song 1 // Techno</a></li>
<li class="toctree-l2"><a class="reference internal" href="demo.html#example1">Example1</a></li>
<li class="toctree-l2"><a class="reference internal" href="demo.html#example2">Example2</a></li>
<li class="toctree-l2"><a class="reference internal" href="demo.html#full-code">Full Code</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="tweaking.html">What exactly is Tweaking ?</a><ul>
<li class="toctree-l2"><a class="reference internal" href="tweaking.html#is-bitrhythm-maths-heavy">Is Bitrhythm Maths heavy ?</a></li>
<li class="toctree-l2"><a class="reference internal" href="tweaking.html#dj-controls">DJ Controls</a></li>
<li class="toctree-l2"><a class="reference internal" href="tweaking.html#music-is-arrangement">Music is arrangement</a></li>
<li class="toctree-l2"><a class="reference internal" href="tweaking.html#see-also">See Also</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="limitations.html">Limitations and Recording</a></li>
<li class="toctree-l1"><a class="reference internal" href="midi.html">MIDI and DAW Terms</a><ul>
<li class="toctree-l2"><a class="reference internal" href="midi.html#midi">MIDI</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="midi.html#usage">Usage</a><ul>
<li class="toctree-l2"><a class="reference internal" href="midi.html#terms">Terms</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="samples.html">Samples</a></li>
<li class="toctree-l1"><a class="reference internal" href="early-attempts.html">Early Attempts</a></li>
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog</a></li>
<li class="toctree-l1"><a class="reference internal" href="main.html">Concepts and Code Walkthrough</a><ul>
<li class="toctree-l2"><a class="reference internal" href="main.html#running">Running</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#core-tracker-loop">Core Tracker Loop</a><ul>
<li class="toctree-l3"><a class="reference internal" href="main.html#observers">Observers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="main.html#dials">Dials</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#numbers">Numbers</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#autoknob">AutoKnob</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#main-ui">Main UI</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#sample">Sample</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#app">App</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#index">Index</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#page">Page</a></li>
<li class="toctree-l2"><a class="reference internal" href="main.html#javascript">Javascript</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="saving.html">Saving and Sharing</a></li>
<li class="toctree-l1"><a class="reference internal" href="bookmarks.html">Bookmarks</a><ul>
<li class="toctree-l2"><a class="reference internal" href="bookmarks.html#webaudio">WebAudio</a></li>
<li class="toctree-l2"><a class="reference internal" href="bookmarks.html#obsevers">Obsevers</a></li>
<li class="toctree-l2"><a class="reference internal" href="bookmarks.html#visuals">Visuals</a></li>
<li class="toctree-l2"><a class="reference internal" href="bookmarks.html#inspiration">Inspiration</a></li>
<li class="toctree-l2"><a class="reference internal" href="bookmarks.html#misc">Misc</a></li>
</ul>
</li>
</ul>
</div>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='right-next' id="next-link" href="what.html" title="next page">What is bitrhythm about ?</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/limitations.html.



























































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Limitations and Recording &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="MIDI and DAW Terms" href="midi.html" />
    <link rel="prev" title="What exactly is Tweaking ?" href="tweaking.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="limitations-and-recording">
<h1>Limitations and Recording<a class="headerlink" href="#limitations-and-recording" title="Permalink to this headline">ΒΆ</a></h1>
<ul class="simple">
<li><p>Opening developer tools might slow down the execution a bit</p></li>
<li><p>Using excessive delays and reverbs seems to cause some glitches</p></li>
<li><p>Mobile browsers don’t work properly</p></li>
<li><p>Firefox does not seem to work well with tone.js</p></li>
</ul>
<p>I use <a class="reference external" href="https://existential.audio/blackhole/">BlackHole</a> to record audio from the browser window to Reaper. You can use any screenrecording software to record the screen. Have a distinct sound to match both audio and video.</p>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="tweaking.html" title="previous page">What exactly is Tweaking ?</a>
    <a class='right-next' id="next-link" href="midi.html" title="next page">MIDI and DAW Terms</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/main.html.













































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Concepts and Code Walkthrough &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Saving and Sharing" href="saving.html" />
    <link rel="prev" title="Changelog" href="changelog.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
            <div class="tocsection onthispage pt-5 pb-3">
                <i class="fas fa-list"></i> Contents
            </div>
            <nav id="bd-toc-nav">
                <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#running">
   Running
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#core-tracker-loop">
   Core Tracker Loop
  </a>
  <ul class="nav section-nav flex-column">
   <li class="toc-h3 nav-item toc-entry">
    <a class="reference internal nav-link" href="#observers">
     Observers
    </a>
   </li>
  </ul>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#dials">
   Dials
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#numbers">
   Numbers
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#autoknob">
   AutoKnob
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#main-ui">
   Main UI
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#sample">
   Sample
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#app">
   App
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#index">
   Index
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#page">
   Page
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#javascript">
   Javascript
  </a>
 </li>
</ul>

            </nav>
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="concepts-and-code-walkthrough">
<h1>Concepts and Code Walkthrough<a class="headerlink" href="#concepts-and-code-walkthrough" title="Permalink to this headline">ΒΆ</a></h1>
<div class="section" id="running">
<h2>Running<a class="headerlink" href="#running" title="Permalink to this headline">ΒΆ</a></h2>
<p>ls source/main.cog | entr -r runserver.sh -b</p>
</div>
<div class="section" id="core-tracker-loop">
<h2>Core Tracker Loop<a class="headerlink" href="#core-tracker-loop" title="Permalink to this headline">ΒΆ</a></h2>
<p>In bitrhythm code is evaluated for every cycle.</p>
<p>1 beat = 60 / tempo
1 cycle = 1 beat / ticks</p>
<p>For every cycle visual and audio code is evaluated.</p>
<p>The edit checkbox allows you to perform long edits, where only old code is evaluated. Once you disable it, all the new edit changes are applied in the next cycle.</p>
<p>If there is any syntax error, previous working code is used.</p>
<p>If the click the <code class="docutils literal notranslate"><span class="pre">execute</span> <span class="pre">transition</span></code> is selected, the transition function is run. Use this progressing the song from initializing to tweaking.</p>
<p>Patterns is an array of strings, each string can be hexadecimal, decimal or something like β€œx000 x000 x000 x000”.
isHit and track_no can be used to identify the layer in the live editor. Hexadecimal uses `0 `1 `2 `3 `4 `5 instead of the Roman numerals abcde for 10, 11, 12 …</p>
<p>Scheduled Time as signified by the variable time is crucial when calling note triggers. This is used by Tone.js to schedule notes to play in the future.</p>
<div class="section" id="observers">
<h3>Observers<a class="headerlink" href="#observers" title="Permalink to this headline">ΒΆ</a></h3>
<p>Sidechain compression is a simple algorithm which observes amplitude of another instrument but you can generalise it to anything. By attaching observers  to time or other instruments you can create sections within the song that can trigger others with conditional logic. This is similar to pure data’s bangs - <a class="reference external" href="https://www.youtube.com/watch?v=nTTZZyD4xlE">see this</a>. In future this will be referred to as side events. You could decrease the volume of the drums to have the snares drop automatically for example.</p>
<p>This is something that you can’t do in DAWs.</p>
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="k">async</span> <span class="nx">play</span><span class="p">()</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">cellx</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">cellx</span><span class="p">.</span><span class="nx">cellx</span><span class="p">;</span>

    <span class="k">await</span> <span class="nx">Tone</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
    <span class="nx">Tone</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
    <span class="nx">Tone</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">bpm</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">tempo</span><span class="p">;</span>
    <span class="nx">Tone</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">swing</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span>

    <span class="kd">var</span> <span class="nx">transition</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
    <span class="p">}</span>

    <span class="kd">var</span> <span class="nx">always</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
    <span class="p">}</span>


    <span class="kd">var</span> <span class="nx">render_loop</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
    <span class="p">}</span>

    <span class="kd">var</span> <span class="nx">animation</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="nx">render_loop</span><span class="p">();</span>
        <span class="nb">window</span><span class="p">.</span><span class="nx">requestAnimationFrame</span><span class="p">(</span><span class="nx">animation</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="nx">Tone</span><span class="p">.</span><span class="nx">Master</span><span class="p">.</span><span class="nx">mute</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
    <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;tempo-value&#39;</span><span class="p">).</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
    <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;tick-value&#39;</span><span class="p">).</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>

    <span class="kd">var</span> <span class="nx">mem</span> <span class="o">=</span> <span class="nx">self</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">mem</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">handlers</span> <span class="o">=</span> <span class="p">{};</span>
    <span class="kd">var</span> <span class="nx">count</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1</span><span class="p">;</span>

    <span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">getValue</span><span class="p">();</span>
    <span class="nx">editor</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;change&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
            <span class="nx">text</span> <span class="o">=</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">getValue</span><span class="p">();</span>
    <span class="p">});</span>

    <span class="kd">var</span> <span class="nx">patterns</span> <span class="o">=</span> <span class="p">[</span> <span class="nx">cellx</span><span class="p">(</span><span class="s2">&quot;0000&quot;</span><span class="p">)</span> <span class="p">];</span> <span class="c1">// need this for first eval</span>

    <span class="kd">var</span> <span class="nx">bars</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">tick</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span>

    <span class="nx">loop</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Tone</span><span class="p">.</span><span class="nx">ToneEvent</span><span class="p">((</span><span class="nx">time</span><span class="p">,</span> <span class="nx">chord</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
        <span class="nx">count</span> <span class="o">=</span> <span class="nx">count</span> <span class="o">+</span> <span class="mf">1</span><span class="p">;</span>
        <span class="nx">tick</span> <span class="o">=</span> <span class="p">(</span><span class="nx">count</span> <span class="o">%</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">ticks</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="nx">tick</span> <span class="o">===</span> <span class="mf">0</span><span class="p">)</span> <span class="o">++</span><span class="nx">bars</span><span class="p">;</span>

        <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#duration&quot;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="s2">&quot;&quot;</span> <span class="o">+</span> <span class="nx">bars</span> <span class="o">+</span> <span class="s2">&quot;.&quot;</span> <span class="o">+</span> <span class="nx">tick</span> <span class="o">+</span> <span class="s2">&quot; / &quot;</span> <span class="o">+</span> <span class="nx">count</span> <span class="o">+</span> <span class="s2">&quot; / &quot;</span> <span class="o">+</span> <span class="nb">window</span><span class="p">.</span><span class="nx">roundTo</span><span class="p">(</span><span class="nx">Tone</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">seconds</span><span class="p">,</span> <span class="mf">2</span><span class="p">));</span>

        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">patterns</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">samples</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">samples</span><span class="p">;</span>
            <span class="kd">var</span> <span class="nx">dials</span> <span class="o">=</span> <span class="nx">self</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">dials</span><span class="p">;</span>
            <span class="kd">var</span> <span class="nx">numbers</span> <span class="o">=</span> <span class="nx">self</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">numbers</span><span class="p">;</span>

            <span class="k">if</span> <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;edit-mode&#39;</span><span class="p">).</span><span class="nx">checked</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">p</span> <span class="o">=</span> <span class="nx">oldPatterns</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="nx">patterns</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
                <span class="nx">oldPatterns</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">p</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">if</span> <span class="p">(</span><span class="nx">p</span> <span class="o">&amp;&amp;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">length</span> <span class="o">!==</span> <span class="mf">0</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">var</span> <span class="nx">track_no</span> <span class="o">=</span> <span class="nx">i</span> <span class="o">+</span> <span class="mf">1</span><span class="p">;</span>
                <span class="kd">var</span> <span class="nx">pattern</span> <span class="o">=</span> <span class="nx">pattern_clean</span><span class="p">(</span><span class="nx">p</span><span class="p">());</span>
                <span class="kd">var</span> <span class="nx">isHit</span> <span class="o">=</span> <span class="p">(</span><span class="nx">pattern</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)[</span><span class="nx">tick</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;1&quot;</span><span class="p">)</span> <span class="o">?</span> <span class="kc">true</span> <span class="o">:</span> <span class="kc">false</span><span class="p">;</span>

                <span class="k">try</span> <span class="p">{</span>
                    <span class="k">if</span> <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;edit-mode&#39;</span><span class="p">).</span><span class="nx">checked</span><span class="p">)</span> <span class="p">{</span>
                        <span class="nb">eval</span><span class="p">(</span><span class="nx">oldCode</span><span class="p">);</span>
                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                        <span class="nb">eval</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
                        <span class="k">if</span> <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;load-mode&#39;</span><span class="p">).</span><span class="nx">checked</span><span class="p">)</span> <span class="p">{</span>
                            <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;load-mode&#39;</span><span class="p">).</span><span class="nx">checked</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
                            <span class="nx">transition</span><span class="p">();</span>
                        <span class="p">}</span>
                        <span class="nx">oldCode</span> <span class="o">=</span> <span class="nx">text</span><span class="p">;</span>
                    <span class="p">}</span>
                    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#error&quot;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">);</span>
                <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">ex</span><span class="p">)</span> <span class="p">{</span>
                    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#error&quot;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">ex</span><span class="p">);</span>
                    <span class="nb">eval</span><span class="p">(</span><span class="nx">oldCode</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">},</span> <span class="p">[]);</span>
    <span class="nx">loop</span><span class="p">.</span><span class="nx">loop</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
    <span class="nx">loop</span><span class="p">.</span><span class="nx">loopEnd</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">ticks</span> <span class="o">+</span> <span class="s2">&quot;n&quot;</span><span class="p">;</span>
    <span class="nx">loop</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>

   <span class="nb">window</span><span class="p">.</span><span class="nx">requestAnimationFrame</span><span class="p">(</span><span class="nx">animation</span><span class="p">)</span>

<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="dials">
<h2>Dials<a class="headerlink" href="#dials" title="Permalink to this headline">ΒΆ</a></h2>
<p>Bitrhythm provides custom dials. These dials can be mapped to any aspects of Tone.js. All dials are available as an array dials in the live code editor.</p>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">dial</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">vbox</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-4&quot;</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">hstack</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">{&quot;knob&quot;</span> <span class="err">+</span> <span class="na">props</span><span class="err">.</span><span class="na">ti</span><span class="err">}</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;mt-1&quot;</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;height: 22px&quot;</span> <span class="na">id</span><span class="o">=</span><span class="s">{&quot;knob-value&quot;</span> <span class="err">+</span> <span class="na">props</span><span class="err">.</span><span class="na">ti</span><span class="err">}</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;cursor-pointer&quot;</span> <span class="na">id</span><span class="o">=</span><span class="s">{&quot;sample&quot;</span> <span class="err">+</span> <span class="na">this</span><span class="err">.</span><span class="na">props</span><span class="err">.</span><span class="na">ti</span><span class="err">}</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{remove(this.props.ti</span> <span class="na">-1</span><span class="err">)}</span><span class="p">&gt;</span>(x)<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">hstack</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
    <span class="p">&lt;/</span><span class="nt">vbox</span><span class="p">&gt;</span>

    <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="k">this</span><span class="p">.</span><span class="nx">props</span> <span class="o">=</span> <span class="nx">opts</span><span class="p">;</span>

<span class="nx">remove</span><span class="p">(</span><span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">rmdial</span><span class="p">(</span><span class="nx">index</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">this</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;mount&quot;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">opts</span><span class="p">.</span><span class="nx">v</span><span class="p">)</span> <span class="p">{</span>

        <span class="nx">Nexus</span><span class="p">.</span><span class="nx">colors</span><span class="p">.</span><span class="nx">accent</span> <span class="o">=</span> <span class="s2">&quot;#000000&quot;</span>
        <span class="nx">Nexus</span><span class="p">.</span><span class="nx">colors</span><span class="p">.</span><span class="nx">fill</span> <span class="o">=</span> <span class="s2">&quot;#ffffff&quot;</span>

        <span class="kd">var</span> <span class="nx">cell</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">cellx</span><span class="p">.</span><span class="nx">cellx</span><span class="p">(</span><span class="mf">0.5</span><span class="p">);</span>
        <span class="kd">var</span> <span class="nx">dial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Nexus</span><span class="p">.</span><span class="nx">Dial</span><span class="p">(</span><span class="s1">&#39;#knob&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">ti</span><span class="p">,</span> <span class="p">{</span>
            <span class="s1">&#39;size&#39;</span><span class="o">:</span> <span class="p">[</span><span class="mf">45</span><span class="p">,</span> <span class="mf">45</span><span class="p">],</span>
            <span class="s1">&#39;value&#39;</span><span class="o">:</span> <span class="mf">0.5</span>
        <span class="p">});</span>
        <span class="nx">cell</span><span class="p">.</span><span class="nx">onChange</span><span class="p">(</span><span class="nx">evt</span> <span class="p">=&gt;</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="nx">evt</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">prevValue</span> <span class="o">!==</span> <span class="nx">evt</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">dial</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">evt</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">value</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">});</span>
        <span class="nx">dial</span><span class="p">.</span><span class="nx">colorize</span><span class="p">(</span><span class="s2">&quot;accent&quot;</span><span class="p">,</span><span class="s2">&quot;#000&quot;</span><span class="p">)</span>
        <span class="nx">dial</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
            <span class="nx">val</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">roundTo</span><span class="p">(</span><span class="nx">val</span><span class="p">,</span> <span class="mf">4</span><span class="p">);</span>
            <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#knob-value&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">ti</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">val</span><span class="p">);</span>
            <span class="nx">cell</span><span class="p">(</span><span class="nx">val</span><span class="p">);</span>
        <span class="p">});</span>
       <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">v</span><span class="p">[</span><span class="s2">&quot;cell&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">cell</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">});</span>
   <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="p">&lt;/</span><span class="nt">dial</span><span class="p">&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="numbers">
<h2>Numbers<a class="headerlink" href="#numbers" title="Permalink to this headline">ΒΆ</a></h2>
<p>These numbers can be mapped to any aspect of Tone.js. All number boxes are available as an array numbers in the live code editor. Useful for debugging purposes.</p>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">number</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">vbox</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span>  <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-4&quot;</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">hstack</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">{&quot;number&quot;</span> <span class="err">+</span> <span class="na">props</span><span class="err">.</span><span class="na">ti</span><span class="err">}</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;mt-1&quot;</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;height: 22px&quot;</span> <span class="na">id</span><span class="o">=</span><span class="s">{&quot;number-value&quot;</span> <span class="err">+</span> <span class="na">props</span><span class="err">.</span><span class="na">ti</span><span class="err">}</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;cursor-pointer&quot;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{remove(this.props.ti</span> <span class="na">-1</span><span class="err">)}</span><span class="p">&gt;</span>(x)<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">hstack</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
    <span class="p">&lt;/</span><span class="nt">vbox</span><span class="p">&gt;</span>

    <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="k">this</span><span class="p">.</span><span class="nx">props</span> <span class="o">=</span> <span class="nx">opts</span><span class="p">;</span>

    <span class="nx">remove</span><span class="p">(</span><span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">rmnumber</span><span class="p">(</span><span class="nx">index</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

<span class="k">this</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;mount&quot;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">opts</span><span class="p">.</span><span class="nx">v</span><span class="p">)</span> <span class="p">{</span>

        <span class="nx">Nexus</span><span class="p">.</span><span class="nx">colors</span><span class="p">.</span><span class="nx">accent</span> <span class="o">=</span> <span class="s2">&quot;#000000&quot;</span>
        <span class="nx">Nexus</span><span class="p">.</span><span class="nx">colors</span><span class="p">.</span><span class="nx">fill</span> <span class="o">=</span> <span class="s2">&quot;#ffffff&quot;</span>

        <span class="kd">var</span> <span class="nx">cell</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">cellx</span><span class="p">.</span><span class="nx">cellx</span><span class="p">(</span><span class="mf">0</span><span class="p">)</span>
        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Nexus</span><span class="p">.</span><span class="nb">Number</span><span class="p">(</span><span class="s1">&#39;#number&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">ti</span><span class="p">,</span> <span class="p">{</span>
            <span class="s1">&#39;value&#39;</span><span class="o">:</span> <span class="mf">0</span><span class="p">,</span>
            <span class="s1">&#39;step&#39;</span><span class="o">:</span> <span class="mf">0.01</span>
        <span class="p">});</span>
        <span class="nx">cell</span><span class="p">.</span><span class="nx">onChange</span><span class="p">(</span><span class="nx">evt</span> <span class="p">=&gt;</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="nx">evt</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">prevValue</span> <span class="o">!==</span> <span class="nx">evt</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">number</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">evt</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">value</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">});</span>

        <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">v</span><span class="p">[</span><span class="s2">&quot;v&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">cell</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">});</span>
   <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="p">&lt;/</span><span class="nt">number</span><span class="p">&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="autoknob">
<h2>AutoKnob<a class="headerlink" href="#autoknob" title="Permalink to this headline">ΒΆ</a></h2>
<p>AutoKnob enables programmatic automation in Bitrhythm</p>
<p><code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">-&gt;</span> <span class="pre">[1,</span> <span class="pre">2.5,</span> <span class="pre">4,</span> <span class="pre">3.2]</span> <span class="pre">|</span> <span class="pre">by</span> <span class="pre">0.3</span></code></p>
<p>x will go from 1 to 2.5 to 4 to 3.2 in increments of 0.3 for every tick. While x will increase till 4 … it will decrease once it reaches 4 and drop down to 3.2. After reaching 3.2 you can stay there or reverse back. At any point during live editing, you can add an extra element to the array. If you add 5 for example, the loop will continue from 3.2 to 5.</p>
<p>You can think of each element in the array as the β€œfinal knob position” and in each cycle we are moving to the next knob position in increments of 0.3</p>
<p>An alternate to AutoKnob is to use TimedKnob. In the endless acid banger  project, the basic code was using a simple timer to randomly move the knob position along with note collections and weighted random choice on note collections for generating rhythms.</p>
<p>TimedKnobs can be used to add small variations in volume to make the drums sounds more natural.</p>
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="kd">function</span> <span class="nx">knob</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
    <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="p">{};</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">ramp</span> <span class="o">||</span> <span class="p">[</span><span class="mf">0</span> <span class="p">,</span> <span class="mf">1</span><span class="p">];</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">count_skip</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">speed</span> <span class="o">||</span> <span class="mf">4</span><span class="p">;</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">step</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">step</span> <span class="o">||</span> <span class="mf">0.01</span><span class="p">;</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">reverse</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">reverse</span> <span class="o">||</span> <span class="kc">true</span><span class="p">;</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">number</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">number</span> <span class="o">||</span> <span class="kc">null</span><span class="p">;</span>

    <span class="nx">context</span><span class="p">.</span><span class="nx">current_count</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">index</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">val</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">cellx</span><span class="p">.</span><span class="nx">cellx</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">initial</span> <span class="o">||</span> <span class="mf">0.5</span><span class="p">)</span>

    <span class="kd">function</span> <span class="nx">changeContext</span><span class="p">()</span> <span class="p">{</span>
        <span class="nx">context</span><span class="p">.</span><span class="nx">next_val</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">index</span> <span class="o">+</span> <span class="mf">1</span><span class="p">];</span>

        <span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">index</span><span class="p">]);</span>
        <span class="k">if</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">()</span> <span class="o">&gt;</span> <span class="nx">context</span><span class="p">.</span><span class="nx">next_val</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">context</span><span class="p">.</span><span class="nx">direction</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="nx">context</span><span class="p">.</span><span class="nx">direction</span> <span class="o">=</span> <span class="mf">1</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="nx">changeContext</span><span class="p">();</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="s2">&quot;cell&quot;</span><span class="o">:</span> <span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">,</span>
        <span class="s2">&quot;push&quot;</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">val</span><span class="p">);</span>
        <span class="p">},</span>
        <span class="s2">&quot;replace&quot;</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
        <span class="p">},</span>
        <span class="s2">&quot;speed&quot;</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">context</span><span class="p">.</span><span class="nx">count_skip</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
        <span class="p">},</span>
        <span class="s2">&quot;step&quot;</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">context</span><span class="p">.</span><span class="nx">step</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
        <span class="p">},</span>
        <span class="s2">&quot;up&quot;</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">val</span> <span class="o">=</span> <span class="nx">val</span> <span class="o">||</span> <span class="mf">0.1</span><span class="p">;</span>
            <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mf">1</span><span class="p">]</span> <span class="o">+</span> <span class="nx">val</span><span class="p">);</span>
        <span class="p">},</span>
        <span class="s2">&quot;down&quot;</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">val</span> <span class="o">=</span> <span class="nx">val</span> <span class="o">||</span> <span class="o">-</span><span class="mf">0.1</span><span class="p">;</span>
            <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mf">1</span><span class="p">]</span> <span class="o">+</span> <span class="nx">val</span><span class="p">);</span>
        <span class="p">},</span>
       <span class="s2">&quot;move&quot;</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">current_count</span> <span class="o">&gt;=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">count_skip</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">context</span><span class="p">.</span><span class="nx">current_count</span> <span class="o">=</span> <span class="mf">1</span><span class="p">;</span>

                <span class="k">if</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">direction</span> <span class="o">==</span> <span class="mf">1</span><span class="p">)</span> <span class="p">{</span>
                    <span class="kd">var</span> <span class="nx">cmp</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
                        <span class="k">return</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">next_val</span><span class="p">);</span>
                    <span class="p">};</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="kd">var</span> <span class="nx">cmp</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
                        <span class="k">return</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">next_val</span> <span class="o">&gt;=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">());</span>
                    <span class="p">};</span>
                <span class="p">}</span>

                <span class="k">if</span> <span class="p">(</span><span class="nx">cmp</span><span class="p">())</span> <span class="p">{</span>
                    <span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">next_val</span><span class="p">);</span>
                    <span class="nx">context</span><span class="p">.</span><span class="nx">index</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">index</span> <span class="o">+</span> <span class="mf">1</span><span class="p">;</span>
                    <span class="k">if</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">index</span> <span class="o">===</span> <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span><span class="mf">1</span><span class="p">)</span> <span class="p">{</span>
                        <span class="k">if</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">reverse</span><span class="p">)</span> <span class="p">{</span>
                            <span class="nx">context</span><span class="p">.</span><span class="nx">index</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span>
                            <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">ramp</span><span class="p">.</span><span class="nx">reverse</span><span class="p">();</span>
                        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                            <span class="nx">context</span><span class="p">.</span><span class="nx">index</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">index</span> <span class="o">-</span> <span class="mf">1</span><span class="p">;</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                    <span class="nx">changeContext</span><span class="p">();</span>
                    <span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">()</span> <span class="o">+</span> <span class="nx">context</span><span class="p">.</span><span class="nx">step</span> <span class="o">*</span> <span class="nx">context</span><span class="p">.</span><span class="nx">direction</span><span class="p">);</span>
                    <span class="k">if</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">number</span><span class="p">)</span> <span class="nx">context</span><span class="p">.</span><span class="nx">number</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">());</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">()</span> <span class="o">+</span> <span class="nx">context</span><span class="p">.</span><span class="nx">step</span> <span class="o">*</span> <span class="nx">context</span><span class="p">.</span><span class="nx">direction</span><span class="p">);</span>
                    <span class="k">if</span> <span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">number</span><span class="p">)</span> <span class="nx">context</span><span class="p">.</span><span class="nx">number</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">());</span>
                <span class="p">}</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="nx">context</span><span class="p">.</span><span class="nx">current_count</span> <span class="o">+=</span> <span class="mf">1</span><span class="p">;</span>
            <span class="p">}</span>

           <span class="k">return</span> <span class="nx">context</span><span class="p">.</span><span class="nx">val</span><span class="p">();</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">timedKnob</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
    <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="p">{};</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">interval</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">interval</span> <span class="o">||</span> <span class="mf">100</span><span class="p">;</span>
    <span class="nx">context</span><span class="p">.</span><span class="nx">knob</span> <span class="o">=</span> <span class="nx">knob</span><span class="p">(</span><span class="nx">options</span><span class="p">);</span>

    <span class="nx">context</span><span class="p">.</span><span class="nx">timer</span> <span class="o">=</span> <span class="nx">setInterval</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
       <span class="nx">context</span><span class="p">.</span><span class="nx">knob</span><span class="p">.</span><span class="nx">move</span><span class="p">();</span>
    <span class="p">},</span> <span class="nx">context</span><span class="p">.</span><span class="nx">interval</span><span class="p">);</span>

    <span class="nx">context</span><span class="p">.</span><span class="nx">knob</span><span class="p">[</span><span class="s2">&quot;clear&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="nx">clearInterval</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nx">timer</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="nx">context</span><span class="p">.</span><span class="nx">knob</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="main-ui">
<h2>Main UI<a class="headerlink" href="#main-ui" title="Permalink to this headline">ΒΆ</a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>// Not working

.CodeMirror-selected,
.CodeMirror-focused,
.CodeMirror-activeline,
.CodeMirror-activeline-background {
    background: transparent;
    color: #882d2d;
    z-index: 5 !important;
}
</pre></div>
</div>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">bitrhythm</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">vstack</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;header-playback&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">hstack</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-2&quot;</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;button&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;btn btn-primary w-1/10 ml-2 mt-1&quot;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{addDial}</span><span class="p">&gt;</span>+ Dial<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;button&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;btn btn-primary w-1/10 ml-2 mt-1&quot;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{addNumber}</span><span class="p">&gt;</span>+ Number<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
                <span class="c">&lt;!-- &lt;button type=&quot;button&quot; class=&quot;btn btn-primary w-1/10 ml-2 mt-1&quot; onclick={addSample}&gt;+ Sample File&lt;/button&gt; --&gt;</span>
                <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;button&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;btn btn-primary w-1/10 ml-2 mt-1&quot;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{addSampleURL}</span><span class="p">&gt;</span>+ Sample URL<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>

            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-2&quot;</span> <span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">label</span> <span class="na">for</span><span class="o">=</span><span class="s">&quot;tempo-value&quot;</span><span class="p">&gt;</span>Tempo / Ticks<span class="p">&lt;/</span><span class="nt">label</span><span class="p">&gt;&lt;</span><span class="nt">br</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;text&quot;</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;tempo-value&quot;</span> <span class="na">value</span><span class="o">=</span><span class="s">{state.tempo}</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;width: 150px&quot;</span> <span class="na">onkeyup</span><span class="o">=</span><span class="s">{</span> <span class="na">editTempo</span> <span class="err">}</span><span class="p">/&gt;</span>
                <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;text&quot;</span>  <span class="na">class</span><span class="o">=</span><span class="s">&quot;mt-2&quot;</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;tick-value&quot;</span> <span class="na">value</span><span class="o">=</span><span class="s">{state.ticks}</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;width: 150px&quot;</span> <span class="na">onkeyup</span><span class="o">=</span><span class="s">{editTicks}/</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-2&quot;</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;min-width: 250px;&quot;</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">label</span> <span class="na">for</span><span class="o">=</span><span class="s">&quot;duration&quot;</span><span class="p">&gt;</span>Bars / Ticks / Seconds<span class="p">&lt;/</span><span class="nt">label</span><span class="p">&gt;&lt;</span><span class="nt">br</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;duration&quot;</span> <span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">hstack</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;mt-2 ml-2&quot;</span> <span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;button&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;btn btn-primary w-1/10 ml-2 mt-1&quot;</span>  <span class="na">onclick</span><span class="o">=</span><span class="s">{play}</span><span class="p">&gt;</span>Play<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;button&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;btn btn-primary ml-2&quot;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{save}</span><span class="p">&gt;</span>Save<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;button&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;btn btn-primary ml-2&quot;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{reset}</span><span class="p">&gt;</span>Reset<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;button&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;btn btn-primary ml-2&quot;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{reload}</span><span class="p">&gt;</span>Window Reload<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>

            <span class="p">&lt;</span><span class="nt">input</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-1&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;edit-mode&quot;</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;edit-mode&quot;</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;checkbox&quot;</span><span class="p">/&gt;</span>
            <span class="p">&lt;</span><span class="nt">label</span> <span class="na">for</span><span class="o">=</span><span class="s">&quot;edit-mode&quot;</span><span class="p">&gt;</span>Edit<span class="p">&lt;/</span><span class="nt">label</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">input</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-1&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;load-mode&quot;</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;load-mode&quot;</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;checkbox&quot;</span><span class="p">/&gt;</span>
            <span class="p">&lt;</span><span class="nt">label</span> <span class="na">for</span><span class="o">=</span><span class="s">&quot;load-mode&quot;</span><span class="p">&gt;</span>Execute Transition<span class="p">&lt;/</span><span class="nt">label</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">hstack</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">each</span><span class="o">=</span><span class="s">{</span> <span class="na">key</span><span class="err">,</span> <span class="na">index</span> <span class="na">in</span> <span class="na">state</span><span class="err">.</span><span class="na">samples</span><span class="err">}</span> <span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">div</span> <span class="na">if</span><span class="o">=</span><span class="s">{</span> <span class="na">state</span><span class="err">.</span><span class="na">samples</span> <span class="err">&amp;&amp;</span> <span class="na">state</span><span class="err">.</span><span class="na">samples</span><span class="err">[</span><span class="na">index</span><span class="err">]</span> <span class="err">}</span><span class="p">&gt;</span>
                    <span class="p">&lt;</span><span class="nt">sample</span>  <span class="na">setsample</span><span class="o">=</span><span class="s">{setSample}</span> <span class="na">rmsample</span><span class="o">=</span><span class="s">{rmSample}</span> <span class="na">samples</span><span class="o">=</span><span class="s">{state.samples}</span> <span class="na">ti</span><span class="o">=</span><span class="s">{index</span> <span class="err">+</span> <span class="na">1</span><span class="err">}</span><span class="p">&gt;&lt;/</span><span class="nt">sample</span><span class="p">&gt;</span>
                <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">hstack</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">hstack</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">each</span><span class="o">=</span><span class="s">{</span> <span class="na">key</span><span class="err">,</span> <span class="na">index</span> <span class="na">in</span> <span class="na">state</span><span class="err">.</span><span class="na">dials</span><span class="err">}</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">dial</span> <span class="na">rmdial</span><span class="o">=</span><span class="s">{rmDial}</span>  <span class="na">v</span><span class="o">=</span><span class="s">{state.dials[index]}</span> <span class="na">ti</span><span class="o">=</span><span class="s">{index</span> <span class="err">+</span> <span class="na">1</span><span class="err">}</span><span class="p">&gt;&lt;/</span><span class="nt">dial</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">hstack</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">hstack</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">each</span><span class="o">=</span><span class="s">{</span> <span class="na">key</span><span class="err">,</span> <span class="na">index</span> <span class="na">in</span> <span class="na">state</span><span class="err">.</span><span class="na">numbers</span><span class="err">}</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">number</span> <span class="na">rmnumber</span><span class="o">=</span><span class="s">{rmNumber}</span> <span class="na">v</span><span class="o">=</span><span class="s">{state.numbers[index]}</span> <span class="na">ti</span><span class="o">=</span><span class="s">{index</span> <span class="err">+</span> <span class="na">1</span><span class="err">}</span><span class="p">&gt;&lt;/</span><span class="nt">number</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">hstack</span><span class="p">&gt;</span>

    <span class="p">&lt;/</span><span class="nt">vstack</span><span class="p">&gt;</span>

    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;error&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;p-2&quot;</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;color: yellow !important; height: 32px; font-size: 12px;&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;canvas-container&quot;</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;position: relative;&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;p5&quot;</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;position: absolute; width: 100%; background: black&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">canvas</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;visual&quot;</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;position: absolute; width: 100%; background: black;&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">canvas</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;code&quot;</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;position: absolute;&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
    
<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
<span class="p">:</span><span class="nd">host</span> <span class="p">{</span>
    <span class="k">margin-top</span><span class="p">:</span> <span class="mi">4</span><span class="kt">vh</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="kd">var</span> <span class="nx">oldCode</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">oldPatterns</span> <span class="o">=</span> <span class="p">[];</span>

<span class="c1">// var audio = new Audio();</span>
<span class="c1">// audio.loop = true;</span>
<span class="kd">const</span> <span class="nx">actx</span> <span class="o">=</span> <span class="nx">Tone</span><span class="p">.</span><span class="nx">context</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">dest</span> <span class="o">=</span> <span class="nx">actx</span><span class="p">.</span><span class="nx">createMediaStreamDestination</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">recorder</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MediaRecorder</span><span class="p">(</span><span class="nx">dest</span><span class="p">.</span><span class="nx">stream</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">chunks</span> <span class="o">=</span> <span class="p">[];</span>
<span class="kd">var</span> <span class="nx">sampleURL</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">sam</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">loop</span><span class="p">;</span>
<span class="k">this</span><span class="p">.</span><span class="nx">props</span> <span class="o">=</span> <span class="nx">opts</span><span class="p">;</span>

<span class="k">this</span><span class="p">.</span><span class="nx">state</span> <span class="o">=</span> <span class="p">{</span>
    <span class="nx">mem</span><span class="o">:</span> <span class="p">{},</span>
    <span class="nx">dials</span><span class="o">:</span> <span class="p">[],</span>
    <span class="nx">numbers</span><span class="o">:</span> <span class="p">[],</span>
    <span class="nx">samples</span><span class="o">:</span> <span class="p">[],</span>
    <span class="nx">tempo</span><span class="o">:</span> <span class="mf">120</span><span class="p">,</span>
    <span class="nx">ticks</span><span class="o">:</span> <span class="mf">16</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">async</span> <span class="kd">function</span> <span class="nx">copyTextToClipboard</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">try</span> <span class="p">{</span> <span class="k">await</span> <span class="nx">navigator</span><span class="p">.</span><span class="nx">clipboard</span><span class="p">.</span><span class="nx">writeText</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span> <span class="p">}</span>
    <span class="k">catch</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;Error in copying text: &#39;</span><span class="p">,</span> <span class="nx">err</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="nx">shouldUpdate</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">nextOpts</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">this</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;mount&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#load-mode&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">();</span>
    <span class="nx">editor</span> <span class="o">=</span> <span class="nx">CodeMirror</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;code&quot;</span><span class="p">),</span> <span class="p">{</span>
        <span class="nx">mode</span><span class="o">:</span> <span class="s2">&quot;null&quot;</span><span class="p">,</span>
        <span class="nx">spellcheck</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="nx">autocorrect</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="nx">scrollbarStyle</span><span class="o">:</span> <span class="s2">&quot;null&quot;</span><span class="p">,</span>
        <span class="nx">lineWrapping</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="nx">lineNumbers</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="nx">styleActiveLine</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="nx">matchBrackets</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
        <span class="nx">value</span><span class="o">:</span> <span class="sb">`// track_no, pattern, current_bit, samples, sample and Tone are available as globals`</span>
    <span class="p">});</span>

    <span class="nx">editor</span><span class="p">.</span><span class="nx">setSize</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span> <span class="o">-</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;header-playback&quot;</span><span class="p">).</span><span class="nx">clientHeight</span> <span class="o">-</span> <span class="mf">160</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">song</span><span class="p">)</span> <span class="p">{</span>
        <span class="kd">const</span> <span class="nx">lib</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">JsonUrl</span><span class="p">(</span><span class="s1">&#39;lzma&#39;</span><span class="p">);</span>
        <span class="nx">lib</span><span class="p">.</span><span class="nx">decompress</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">song</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="nx">data</span> <span class="p">=&gt;</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">sample_names</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="s2">&quot;sample_names&quot;</span><span class="p">];</span>
            <span class="kd">var</span> <span class="nx">dial_count</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="s2">&quot;dial_count&quot;</span><span class="p">];</span>
            <span class="kd">var</span> <span class="nx">numbers_count</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="s2">&quot;numbers_count&quot;</span><span class="p">];</span>
            <span class="k">delete</span> <span class="nx">data</span><span class="p">[</span><span class="s2">&quot;sample_names&quot;</span><span class="p">];</span>
            <span class="k">delete</span> <span class="nx">data</span><span class="p">[</span><span class="s2">&quot;dial_count&quot;</span><span class="p">];</span>
            <span class="k">delete</span> <span class="nx">data</span><span class="p">[</span><span class="s2">&quot;numbers_count&quot;</span><span class="p">];</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">tempo</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">tempo</span><span class="p">;</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">ticks</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">ticks</span><span class="p">;</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">code</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">code</span><span class="p">;</span>
            <span class="nx">sample_names</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">url</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">self</span><span class="p">.</span><span class="nx">addURL</span><span class="p">(</span><span class="nx">url</span><span class="p">);</span>
            <span class="p">});</span>
            <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">dial_count</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">dials</span><span class="p">.</span><span class="nx">push</span><span class="p">({});</span>
            <span class="p">}</span>
            <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">numbers_count</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">numbers</span><span class="p">.</span><span class="nx">push</span><span class="p">({});</span>
            <span class="p">}</span>
            <span class="nx">editor</span><span class="p">.</span><span class="nx">setValue</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">code</span><span class="p">);</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
            <span class="nx">riot</span><span class="p">.</span><span class="nx">mount</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span>
        <span class="p">})</span>
    <span class="p">}</span>


<span class="p">});</span>


<span class="nx">pattern_clean</span><span class="p">(</span><span class="nx">p</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="nb">window</span><span class="p">.</span><span class="nx">pattern_clean</span><span class="p">(</span><span class="nx">p</span><span class="p">);</span>
<span class="p">}</span>

<span class="nx">save</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">code</span> <span class="o">=</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">getValue</span><span class="p">();</span>
    <span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="p">{</span>
        <span class="nx">tempo</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">tempo</span><span class="p">,</span>
        <span class="nx">dial_count</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">dials</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span>
        <span class="nx">numbers_count</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">numbers</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span>
        <span class="nx">sample_names</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">samples</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span><span class="k">return</span> <span class="nx">item</span><span class="p">[</span><span class="s2">&quot;__url&quot;</span><span class="p">]}),</span>
        <span class="nx">ticks</span><span class="o">:</span> <span class="mf">16</span><span class="p">,</span>
        <span class="nx">code</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">code</span><span class="p">,</span>
    <span class="p">};</span>
    <span class="kd">const</span> <span class="nx">lib</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">JsonUrl</span><span class="p">(</span><span class="s1">&#39;lzma&#39;</span><span class="p">);</span>
	<span class="nx">lib</span><span class="p">.</span><span class="nx">compress</span><span class="p">(</span><span class="nx">text</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="nx">encodedData</span> <span class="p">=&gt;</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">link</span> <span class="o">=</span> <span class="s2">&quot;/song/&quot;</span> <span class="o">+</span> <span class="nx">encodedData</span><span class="p">;</span>
        <span class="nb">window</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="nx">link</span><span class="p">,</span> <span class="s2">&quot;_blank&quot;</span><span class="p">);</span>
    <span class="p">});</span>
<span class="p">}</span>

<span class="nx">reload</span><span class="p">()</span> <span class="p">{</span>
    <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span> <span class="s2">&quot;//&quot;</span> <span class="o">+</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">host</span><span class="p">)</span>
<span class="p">}</span>

<span class="nx">reset</span><span class="p">()</span> <span class="p">{</span>

    <span class="nx">Tone</span><span class="p">.</span><span class="nx">Master</span><span class="p">.</span><span class="nx">mute</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">loop</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">loop</span><span class="p">.</span><span class="nx">stop</span><span class="p">();</span>
        <span class="nx">loop</span><span class="p">.</span><span class="nx">cancel</span><span class="p">();</span>
        <span class="nx">loop</span><span class="p">.</span><span class="nx">dispose</span><span class="p">();</span>
        <span class="nx">Tone</span><span class="p">.</span><span class="nx">Master</span><span class="p">.</span><span class="nx">mute</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;tempo-value&#39;</span><span class="p">).</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
    <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;tick-value&#39;</span><span class="p">).</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
    <span class="nx">editor</span><span class="p">.</span><span class="nx">setValue</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">);</span>

    <span class="k">this</span><span class="p">.</span><span class="nx">state</span> <span class="o">=</span> <span class="p">{</span>
        <span class="nx">mem</span><span class="o">:</span> <span class="p">{},</span>
        <span class="nx">dials</span><span class="o">:</span> <span class="p">[],</span>
        <span class="nx">samples</span><span class="o">:</span> <span class="p">[],</span>
        <span class="nx">tempo</span><span class="o">:</span> <span class="mf">120</span><span class="p">,</span>
        <span class="nx">ticks</span><span class="o">:</span> <span class="mf">16</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
    <span class="nx">riot</span><span class="p">.</span><span class="nx">mount</span><span class="p">(</span><span class="s1">&#39;bitrhythm&#39;</span><span class="p">,</span> <span class="p">{</span>
        <span class="nx">song</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">song</span>
    <span class="p">})</span>


<span class="p">}</span>

<span class="nx">editTempo</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">({</span>
        <span class="nx">tempo</span><span class="o">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span>
    <span class="p">})</span>
<span class="p">}</span>

<span class="nx">editTicks</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">({</span>
        <span class="nx">ticks</span><span class="o">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span>
    <span class="p">})</span>
<span class="p">}</span>

<span class="nx">$</span><span class="p">{</span><span class="nx">core_loop</span><span class="p">}</span>

<span class="nx">start</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">recorder</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
<span class="p">}</span>

<span class="nx">stop</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">recorder</span><span class="p">.</span><span class="nx">stop</span><span class="p">();</span>
<span class="p">}</span>

<span class="nx">addDial</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">dials</span><span class="p">.</span><span class="nx">push</span><span class="p">({});</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
<span class="p">}</span>

<span class="nx">addNumber</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">numbers</span><span class="p">.</span><span class="nx">push</span><span class="p">({});</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
<span class="p">}</span>

<span class="nx">addURL</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">samples</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span><span class="s2">&quot;__name&quot;</span><span class="o">:</span> <span class="nx">value</span><span class="p">});</span>
    <span class="kd">var</span> <span class="nx">sam</span><span class="p">;</span>
    <span class="nx">sam</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Tone</span><span class="p">.</span><span class="nx">Sampler</span><span class="p">({</span>
        <span class="nx">urls</span><span class="o">:</span>  <span class="p">{</span>
            <span class="s2">&quot;C3&quot;</span><span class="o">:</span> <span class="nx">value</span><span class="p">,</span>
        <span class="p">}</span>
    <span class="p">});</span>
    <span class="nx">sam</span><span class="p">[</span><span class="s2">&quot;__name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
    <span class="nx">sam</span><span class="p">[</span><span class="s2">&quot;__url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
    <span class="nx">self</span><span class="p">.</span><span class="nx">setSample</span><span class="p">(</span><span class="nx">sam</span><span class="p">,</span> <span class="nx">self</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">samples</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mf">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="nx">addSampleURL</span><span class="p">()</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
    <span class="nx">alertify</span><span class="p">.</span><span class="nx">prompt</span><span class="p">(</span> <span class="s1">&#39;Enter Sample URL&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span>
        <span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">evt</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">self</span><span class="p">.</span><span class="nx">addURL</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
            <span class="nx">alertify</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s1">&#39;Cancel&#39;</span><span class="p">)</span>
        <span class="p">});</span>
<span class="p">}</span>

<span class="nx">addSample</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">samples</span><span class="p">.</span><span class="nx">push</span><span class="p">({});</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
<span class="p">}</span>

<span class="nx">rmSample</span><span class="p">(</span><span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
   <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">samples</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="mf">1</span><span class="p">);</span>
   <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
<span class="p">}</span>

<span class="nx">rmDial</span><span class="p">(</span><span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
   <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">dials</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="mf">1</span><span class="p">);</span>
   <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
<span class="p">}</span>

<span class="nx">rmNumber</span><span class="p">(</span><span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
   <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">numbers</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="mf">1</span><span class="p">);</span>
   <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
<span class="p">}</span>

<span class="nx">setSample</span><span class="p">(</span><span class="nx">e</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">samples</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">e</span><span class="p">;</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
<span class="p">}</span>

<span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="p">&lt;/</span><span class="nt">bitrhythm</span><span class="p">&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="sample">
<h2>Sample<a class="headerlink" href="#sample" title="Permalink to this headline">ΒΆ</a></h2>
<p>You can add samples using the file upload. All samples are available as an array – samples. Initialise samples, global variables and synthesisers using the transition function and change the sample parameters using the same during live coding.</p>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">sample</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">vbox</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-2&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">vstack</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-2&quot;</span><span class="p">&gt;</span>
        <span class="c">&lt;!-- &lt;input type=&quot;file&quot; id={&quot;sample-file&quot; + this.props.ti} style=&quot;width: 120px;&quot;/&gt; --&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;max-width: 120px;text-overflow: ellipsis; white-space: nowrap;overflow: hidden;&quot;</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>{ getLast(this.props.ti -1)} <span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;cursor-pointer&quot;</span> <span class="na">id</span><span class="o">=</span><span class="s">{&quot;sample&quot;</span> <span class="err">+</span> <span class="na">this</span><span class="err">.</span><span class="na">props</span><span class="err">.</span><span class="na">ti</span><span class="err">}</span> <span class="na">onclick</span><span class="o">=</span><span class="s">{remove(this.props.ti</span> <span class="na">-1</span><span class="err">)}</span><span class="p">&gt;</span>(x)<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">vstack</span><span class="p">&gt;</span>
    <span class="p">&lt;/</span><span class="nt">vbox</span><span class="p">&gt;</span>

    <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">props</span> <span class="o">=</span> <span class="nx">opts</span><span class="p">;</span>

    <span class="nx">remove</span><span class="p">(</span><span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">rmsample</span><span class="p">(</span><span class="nx">index</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="nx">getLast</span> <span class="p">(</span><span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">samples</span> <span class="o">&amp;&amp;</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">samples</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">samples</span><span class="p">[</span><span class="nx">index</span><span class="p">][</span><span class="s2">&quot;__name&quot;</span><span class="p">])</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">e</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">samples</span><span class="p">[</span><span class="nx">index</span><span class="p">][</span><span class="s2">&quot;__name&quot;</span><span class="p">];</span>
            <span class="kd">var</span> <span class="nx">elems</span> <span class="o">=</span> <span class="nx">e</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">);</span>
            <span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="nx">elems</span><span class="p">[</span><span class="nx">elems</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mf">1</span><span class="p">];</span>
            <span class="k">return</span> <span class="nx">name</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">)</span>
            <span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>


    <span class="k">this</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;mount&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>

        <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
<span class="cm">/*</span>
<span class="cm">        var sample_file = $(&quot;#sample-file&quot; + this.props.ti).get(0);</span>
<span class="cm">        var sam;</span>

<span class="cm">        sample_file.addEventListener(&#39;change&#39;, (event) =&gt; {</span>
<span class="cm">            var file = event.srcElement.files[0];</span>
<span class="cm">            var a = new Audio();</span>
<span class="cm">            a.onloadedmetadata = (e) =&gt; {</span>
<span class="cm">                sam = new Tone.Sampler({</span>
<span class="cm">                    urls:  {</span>
<span class="cm">                        &quot;C3&quot;: URL.createObjectURL(file),</span>
<span class="cm">                    },</span>
<span class="cm">                    onload: () =&gt; {</span>
<span class="cm">                        this.update();</span>
<span class="cm">                        sam.triggerAttackRelease(&quot;C3&quot;, 0.5);</span>
<span class="cm">                    }</span>
<span class="cm">                });</span>

<span class="cm">                sam[&quot;__name&quot;] = file.name;</span>
<span class="cm">                sam[&quot;__url&quot;] = &quot;&quot;;</span>
<span class="cm">                // riot doesn&#39;t allow camelcase ?</span>
<span class="cm">                self.props.setsample(sam, self.props.ti - 1);</span>
<span class="cm">            }</span>
<span class="cm">            a.src = URL.createObjectURL(file);</span>
<span class="cm">        });</span>
<span class="cm">        */</span>

    <span class="p">});</span>
   <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">sample</span><span class="p">&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="app">
<h2>App<a class="headerlink" href="#app" title="Permalink to this headline">ΒΆ</a></h2>
<div class="highlight-hylang notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="k">import </span><span class="p">[</span><span class="nv">sanic</span> <span class="p">[</span><span class="nv">Sanic</span> <span class="nv">response</span><span class="p">]])</span>
<span class="p">(</span><span class="k">import </span><span class="p">[</span><span class="nv">sanic.response</span> <span class="p">[</span><span class="nv">json</span> <span class="nv">text</span><span class="p">]])</span>
<span class="p">(</span><span class="k">import </span><span class="p">[</span><span class="nv">sanic.exceptions</span> <span class="p">[</span><span class="nv">NotFound</span> <span class="nv">abort</span><span class="p">]])</span>
<span class="p">(</span><span class="k">import </span><span class="p">[</span><span class="nv">jinja2</span> <span class="p">[</span><span class="nv">Environment</span> <span class="nv">FileSystemLoader</span><span class="p">]])</span>
<span class="p">(</span><span class="k">import </span><span class="nv">re</span><span class="p">)</span>
<span class="p">(</span><span class="k">import </span><span class="nv">ipdb</span><span class="p">)</span>
<span class="p">(</span><span class="k">import </span><span class="nv">sys</span><span class="p">)</span>
<span class="p">(</span><span class="k">import </span><span class="nv">traceback</span><span class="p">)</span>
<span class="p">(</span><span class="k">import </span><span class="nv">json</span><span class="p">)</span>
<span class="p">(</span><span class="k">import </span><span class="nv">datetime</span><span class="p">)</span>
<span class="p">(</span><span class="k">import </span><span class="p">[</span><span class="nv">email.utils</span> <span class="p">[</span><span class="nv">format_datetime</span><span class="p">]])</span>
<span class="p">(</span><span class="k">import </span><span class="p">[</span><span class="nv">urllib.parse</span> <span class="p">[</span><span class="nv">urlparse</span><span class="p">]])</span>
<span class="p">(</span><span class="k">import </span><span class="nv">base64</span><span class="p">)</span>

<span class="p">(</span><span class="kd">setv </span><span class="nv">file-loader</span> <span class="p">(</span><span class="nf">FileSystemLoader</span> <span class="s">&quot;templates&quot;</span><span class="p">))</span>
<span class="p">(</span><span class="kd">setv </span><span class="nv">env</span> <span class="p">(</span><span class="nf">Environment</span> <span class="ss">:loader</span> <span class="nv">file-loader</span><span class="p">))</span>

<span class="p">(</span><span class="kd">setv </span><span class="nv">app</span> <span class="p">(</span><span class="nf">Sanic</span> <span class="s">&quot;Bitrhythm&quot;</span><span class="p">))</span>

<span class="p">(</span><span class="k">with</span><span class="nv">-decorator</span>
  <span class="p">(</span><span class="nf">app.exception</span> <span class="nv">NotFound</span><span class="p">)</span>
  <span class="p">(</span><span class="nf">defn/a</span> <span class="nv">ignore_404s</span> <span class="p">[</span><span class="nv">request</span> <span class="nv">exception</span><span class="p">]</span>
    <span class="p">(</span><span class="k">return</span> <span class="p">(</span><span class="nf">text</span> <span class="p">(</span><span class="nf">+</span> <span class="s">&quot;Yep, I totally found the page &quot;</span> <span class="nv">request.url</span><span class="p">)))</span>
  <span class="p">)</span>
<span class="p">)</span>

<span class="p">(</span><span class="k">with</span><span class="nv">-decorator</span>
  <span class="p">(</span><span class="nf">app.route</span> <span class="s">&quot;/song/&lt;name&gt;&quot;</span><span class="p">)</span>
  <span class="p">(</span><span class="nf">defn/a</span> <span class="nv">get-index</span> <span class="p">[</span><span class="nv">request</span> <span class="nv">name</span><span class="p">]</span>
    <span class="p">(</span><span class="kd">setv </span><span class="nv">template</span> <span class="p">(</span><span class="nf">env.get_template</span> <span class="s">&quot;index.html&quot;</span><span class="p">))</span>
    <span class="p">(</span><span class="k">return</span> <span class="p">(</span><span class="nf">response.html</span> <span class="p">(</span><span class="nf">template.render</span> <span class="p">{</span><span class="s">&quot;data&quot;</span> <span class="nv">name</span><span class="p">})))</span>
  <span class="p">)</span>
<span class="p">)</span>

<span class="p">(</span><span class="k">with</span><span class="nv">-decorator</span>
  <span class="p">(</span><span class="nf">app.route</span> <span class="s">&quot;/&quot;</span><span class="p">)</span>
  <span class="p">(</span><span class="nf">defn/a</span> <span class="nv">get-index</span> <span class="p">[</span><span class="nv">request</span><span class="p">]</span>
    <span class="p">(</span><span class="kd">setv </span><span class="nv">template</span> <span class="p">(</span><span class="nf">env.get_template</span> <span class="s">&quot;index.html&quot;</span><span class="p">))</span>
    <span class="p">(</span><span class="k">return</span> <span class="p">(</span><span class="nf">response.html</span> <span class="p">(</span><span class="nf">template.render</span> <span class="p">{</span><span class="s">&quot;data&quot;</span> <span class="s">&quot;&quot;</span><span class="p">})))</span>
  <span class="p">)</span>
<span class="p">)</span>

<span class="p">(</span><span class="k">with</span><span class="nv">-decorator</span>
  <span class="p">(</span><span class="nf">app.route</span> <span class="s">&quot;/issue&quot;</span><span class="p">)</span>
  <span class="p">(</span><span class="nf">defn/a</span> <span class="nv">get-index</span> <span class="p">[</span><span class="nv">request</span><span class="p">]</span>
    <span class="p">(</span><span class="kd">setv </span><span class="nv">template</span> <span class="p">(</span><span class="nf">env.get_template</span> <span class="s">&quot;page.html&quot;</span><span class="p">))</span>
    <span class="p">(</span><span class="k">return</span> <span class="p">(</span><span class="nf">response.html</span> <span class="p">(</span><span class="nf">template.render</span><span class="p">)))</span>
  <span class="p">)</span>
<span class="p">)</span>

<span class="p">(</span><span class="nf">app.static</span> <span class="s">&quot;/&quot;</span> <span class="s">&quot;./public&quot;</span><span class="p">)</span>

<span class="p">(</span><span class="nf">defmain</span> <span class="p">[</span><span class="o">&amp;</span><span class="k">rest </span><span class="nv">args</span><span class="p">]</span>
    <span class="p">(</span><span class="nf">app.run</span> <span class="ss">:host</span> <span class="s">&quot;0.0.0.0&quot;</span> <span class="ss">:port</span> <span class="mi">8015</span><span class="p">)</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="index">
<h2>Index<a class="headerlink" href="#index" title="Permalink to this headline">ΒΆ</a></h2>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&quot;en&quot;</span><span class="p">&gt;</span>

    <span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&quot;utf-8&quot;</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Bitrhythm<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">http-equiv</span><span class="o">=</span><span class="s">&quot;Cache-Control&quot;</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;no-cache, no-store, must-revalidate&quot;</span> <span class="p">/&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">http-equiv</span><span class="o">=</span><span class="s">&quot;Pragma&quot;</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;no-cache&quot;</span> <span class="p">/&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">http-equiv</span><span class="o">=</span><span class="s">&quot;Expires&quot;</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;0&quot;</span> <span class="p">/&gt;</span>

        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;Bitrhythm&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;description&quot;</span> <span class="na">xml:lang</span><span class="o">=</span><span class="s">&quot;en&quot;</span> <span class="na">lang</span><span class="o">=</span><span class="s">&quot;en&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;literate programming, p5, live coding, algorave, demoscene, creative programming, music, techno, programming, webaudio, webgl, p5, improvising&quot;</span><span class="p">&gt;</span>

       ${common_scripts}

        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;preconnect&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://fonts.gstatic.com&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,700;1,100;1,200;1,300;1,400;1,500;1,700&amp;display=swap&quot;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://fonts.googleapis.com/css2?family=Major+Mono+Display&amp;family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,700;1,100;1,200;1,300;1,400;1,500;1,700&amp;display=swap&quot;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://code.jquery.com/ui/1.12.0/jquery-ui.min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/micromodal/0.4.6/micromodal.min.js&quot;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&quot;sha512-RMMh+IHzfZLsVFo1rX9PBoysxrJJqjyOS31HYWftobWtv2At6KBTqKpvVDIWAjL5aiV+LjFqkQ6e53Rdw3VOBg==&quot;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&quot;anonymous&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdn.jsdelivr.net/npm/whenipress@1.8.0/dist/whenipress.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/alertify.min.js&quot;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&quot;sha512-JnjG+Wt53GspUQXQhc+c4j8SBERsgJAoHeehagKHlxQN+MtCCmFDghX9/AcbkkNRZptyZU4zC8utK59M5L45Iw==&quot;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&quot;anonymous&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/css/alertify.min.css&quot;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&quot;sha512-IXuoq1aFd2wXs4NqGskwX2Vb+I8UJ+tGJEu/Dc0zwLNKeQ7CW3Sr6v0yU3z5OQWe3eScVIkER4J9L7byrgR/fA==&quot;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&quot;anonymous&quot;</span> <span class="p">/&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/css/themes/default.min.css&quot;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&quot;sha512-RgUjDpwjEDzAb7nkShizCCJ+QTSLIiJO1ldtuxzs0UIBRH4QpOjUU9w47AF9ZlviqV/dOFGWF6o7l3lttEFb6g==&quot;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&quot;anonymous&quot;</span> <span class="p">/&gt;</span>

        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/json-url-master/dist/browser/json-url.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/riot-3.13.2/riot+compiler.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.1.2/tailwind.min.css&quot;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&quot;sha512-RntatPOhEcQEA81gC/esYoCkGkL7AYV7TeTPoU+R9zE44/yWxVvLIBfBSaMu78rhoDd73ZeRHXRJN5+aPEK53Q==&quot;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&quot;anonymous&quot;</span> <span class="p">/&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js&quot;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&quot;sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM&quot;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&quot;anonymous&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/lib/codemirror.css&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/addon/hint/show-hint.css&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/lib/codemirror.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/addon/hint/show-hint.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;http://esironal.github.io/cmtouch/addon/hint/xml-hint.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/addon/hint/html-hint.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/mode/xml/xml.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/mode/javascript/javascript.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/mode/css/css.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/mode/htmlmixed/htmlmixed.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/addon/selection/active-line.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/addon/edit/matchbrackets.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://esironal.github.io/cmtouch/theme/neonsyntax.css&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://unpkg.com/pyloncss@latest/css/pylon.css&quot;</span><span class="p">/&gt;</span>


        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/tune.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/misc.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">style</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;text/css&quot;</span><span class="p">&gt;</span>
<span class="nt">body</span> <span class="p">{</span>
    <span class="k">background</span><span class="p">:</span> <span class="kc">black</span><span class="p">;</span>
    <span class="k">color</span><span class="p">:</span> <span class="kc">white</span><span class="p">;</span>
    <span class="k">font-family</span><span class="p">:</span> <span class="s1">&#39;Roboto Mono&#39;</span><span class="p">,</span> <span class="kc">monospace</span><span class="p">;</span>
<span class="p">}</span>

<span class="nt">a</span> <span class="p">{</span>
    <span class="k">color</span><span class="p">:</span> <span class="kc">white</span><span class="p">;</span>
<span class="p">}</span>

<span class="nt">input</span> <span class="p">{</span>
    <span class="k">color</span><span class="p">:</span> <span class="kc">black</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="nc">btn</span> <span class="p">{</span>
    <span class="k">background</span><span class="p">:</span> <span class="kc">white</span><span class="p">;</span>
    <span class="k">color</span><span class="p">:</span> <span class="kc">black</span><span class="p">;</span>
    <span class="k">padding</span><span class="p">:</span> <span class="mi">4</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="nc">CodeMirror</span> <span class="p">{</span>
    <span class="k">font-size</span><span class="p">:</span> <span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
    <span class="k">width</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
    <span class="k">padding-left</span><span class="p">:</span> <span class="mi">4</span><span class="kt">px</span><span class="p">;</span>
    <span class="k">line-height</span><span class="p">:</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">background</span><span class="p">:</span> <span class="kc">transparent</span> <span class="cp">!important</span><span class="p">;</span>
    <span class="k">color</span><span class="p">:</span> <span class="kc">white</span> <span class="cp">!important</span><span class="p">;</span>
    <span class="k">font-family</span><span class="p">:</span> <span class="s1">&#39;Roboto Mono&#39;</span><span class="p">,</span> <span class="kc">monospace</span> <span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="nc">CodeMirror-vscrollbar</span><span class="o">,</span> <span class="p">.</span><span class="nc">CodeMirror-hscrollbar</span> <span class="p">{</span>
    <span class="k">overflow-x</span><span class="p">:</span> <span class="kc">hidden</span> <span class="cp">!important</span><span class="p">;</span>
    <span class="k">overflow-y</span><span class="p">:</span> <span class="kc">hidden</span> <span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="nc">CodeMirror-cursor</span> <span class="p">{</span>
  <span class="k">border-left</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">white</span> <span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="nc">CodeMirror</span> <span class="nt">pre</span><span class="o">,</span>
<span class="p">.</span><span class="nc">CodeMirror-line</span> <span class="o">&gt;</span> <span class="nt">span</span><span class="o">,</span>
<span class="p">.</span><span class="nc">CodeMirror-lines</span> <span class="p">{</span>
  <span class="k">padding</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>


        <span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;riot/tag&quot;</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/components/bitrhythm.tag&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;riot/tag&quot;</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/components/dial.tag&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;riot/tag&quot;</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/components/sample.tag&quot;</span> <span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;riot/tag&quot;</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/components/number.tag&quot;</span> <span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

        <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
            <span class="nb">window</span><span class="p">.</span><span class="nx">goatcounter</span> <span class="o">=</span> <span class="p">{</span>
                <span class="nx">path</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">location</span><span class="p">.</span><span class="nx">host</span> <span class="o">+</span> <span class="nx">p</span> <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
	    <span class="p">&lt;</span><span class="nt">script</span> <span class="na">data-goatcounter</span><span class="o">=</span><span class="s">&quot;https://analytics.xyzzyapps.link/count&quot;</span> <span class="na">async</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;//analytics.xyzzyapps.link/count.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
    <span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>

    <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;containera-full&quot;</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">hstack</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;mb-2&quot;</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">h5</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-4&quot;</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;/docs/index.html&quot;</span> <span class="na">target</span><span class="o">=</span><span class="s">&quot;_blank&quot;</span><span class="p">&gt;</span>Docs<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">h5</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">h5</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-4&quot;</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">target</span><span class="o">=</span><span class="s">&quot;_blank&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;/issue&quot;</span><span class="p">&gt;</span>Report bugs / Feedback<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">h5</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">h5</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-4&quot;</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;/song/XQAAAALHCwAAAAAAAABDKUqGU5vI8Eygv8VLc6H1NFIzdYQ4SmT-79BTKosH6Xje2IYnNRgEOpeuhg9Ej9Iz-_uEg-npGX0y9CmzyyVpwgaOUrKNlF-pzVXf3YmslEqBloRY0JslK5KapeSFSSH9ScweRgAPu9a4t1L0-t71Xb9Eb3KJ-lezPo7xcmK9xCnNGorm__kixtPuM_8L3YNc30OA3GMBPHu5pAH__cKjLF6k5mCGKsNp8WFWYQACckBR03VaZGhfZv946NYyFQlw6boXQuVis292UUboEkaCJ0CV5wGurbJUA7il2uX-okyMSjx7WVseVG-zDQ0wBjbMLNYnXzoT0kYxI_6-GOAOVamJJHTrkulVfd1k0AgzCHByI6zCNtWyBa3i_2ks4ncMec8vqsjAy8BhwFAbKAP1RDKh7MUxwsecBuzyLR0hKGddivZmPn-xyYB-p8-Xru_Min2-3Z_3YZal2_wv8s6cIcqPAJ4wf5DH29U7le-eRLcUN6lhK77651_xeU--z7A6E3NDQ6WEb6UPc-brxTz-L-wZwFwy95QkwAZw4bWR2LNW78DVdCSnMC8zf-DVWgFkKP9SU9iGQj6yk6E8qBAlZfd3YavthZBdwhs2mtzsvIL8qcBTBRhy2Fxx5n5tLq2lXuPkH19-cqIoJCHJUjiuGKWh3PqOAnTj9n2PejvNlp1GUMMixR7YMUofcLeA5oQCQpMSuIEP8sUshtk3zY35vG4xr3FfPj7OZiOQx5jRtMaw7l8xqFVm_PZ-kEgxoIVFtpZFcgsACnuBeJF1yZ2ss1GN95XEt9BsF3UY_UM1x8ePgY8BL4WH7BcHZRCOV2YZeRXZ6sYLNjKBjGVD_FAR_ZL6yd6l_1wqpQJPb3lL1fhBecNTcaXAn61RhySOvokAJ5TcrTtqdhsGEBUnaQOGRIfKU0NV4zPmgTm9TLASz5gs1VRoUZ06htWirfNfjiWNrbw8I9ggo8KMKwDZ2v4CnfqyL4eCpFNZjVIYOEWGGktLAadafQjdjOkWHWF8KIdr3uPBt1kXY_-IEkn11gjmn1q9ybgMLxriz7kWqzyawAEpqM27wzIwET2smzbJ-zHcx01rdHu3AqLMHk-AliQLGvGknluJNjWmK-WFwZUR8ZokJ6cVYW70a6X1dYWncQsPwyC3AOplDyUChlC_Rmgvz9fqeMs-fXub0odr01b7PFrraLWJ02Xk7trVq_Gqh8V2A2LATUKewJT05dG0bVJTBdM9n86C-mgyLf7s7JeNf9ul97CsS3BalNZ--N0hfkPbT_VPU9heFko9goG_mkF7Ky6FbtVpERCqw7UbvPgdFdIOEkoqPYEwAmjwzva2U-7cLo3g3uEQq1NBV3C8LijP10-1Avqu2df_R8XtykOk4H8yitylcxka4vSq1Jo2fv-wp74EiJi6Tn6T3epZJYXAMBRXRxozyl1r4lbOqRjDfqjWRTRrr8l9U2iKbAiIz6Ssy74Ic9sQABR9F4UahwsDQuJgjOHKdaLXmBHoPuD7nX_9mMYV&quot;</span><span class="p">&gt;</span>Example1<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">h5</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">h5</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-4&quot;</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;/song/XQAAAALYEwAAAAAAAABDKUqGU5vI8Eygv8VLc6H1NFIzdYQe5mT-79BTKosH6Xje2IYnNRgEOpeuhg9NTfIT-_uEg-npGX0y9CmzyyVpwgaOUrKNlF-pzVXf3YnQ2gSfpzY3zlYLujavQRq73hSEM-RaGxTxuud9naok9rMpYn-UCaNiF2zrnnqUB61s_22pYOE_9KuFo7vEJMCtU2bkxyNdgSXzwmIDuo8OyxcIh9HQP59UZbNRixlBnmw73PnywS5DJBoH8NEIAnlLpL4rqaokfN9Cfte0Id3929n26IjA7zVZF75ovX37KO1xT9iBa8gt-w8cvYBdIdVL5JUOrbf0ccVJSoXGFoM0U4GXoEDThw00FdKnfsq1WeJjEQt4Qn8f90TkkQgkpSajR9dA0AJBqKDuVeEgDoFsbVI-ZZVvJW2dD_9GIm5PpQSTzpuBslzD7ZJQSI3XA1g2F_QP4w6U4rOrTMZUQSr___s22d8Plp0FbffDCq8dri0C8kUYPqS_np_Nnr7sDY9KsxgNZJmUxYkt1XBTO3iWmR6RZ7OFk6PZ8R44NXwhvxbUEikMoboPSW1XPiV4xtCfZb4qE4yCP2xHPlEniUhcNrWc5608hrNkVfpQUmYLFvXFTyUHA4aOkRDoHf0jHwGzyBV-YanP65YlZpupZC4oW3bjhO01tfh_qYWNA_ZpDVCCXRoGZJfrBjkmaYom9Gd6mvGVzillbk6LD0_Amu_Zublb4_AZ1SAxKSWlMfbmbXQfW16RSMidtmTCKAMmF9LCONKcjTR_1P2vU3fPR7hBhRtbtNR0xNEfRstXJ81ZcyC5YTK8dnpMwMXKk5uoaBMDbochbAKXaswgZKIn2usyi5Z4pyQf8xCSheQawyYSA031ZHA3wRuq_7rjhn0bXZrEGnB0QFzxgM-dYsY7CUojKr8ziZGXGb9zoVHvGDI0SIFyFIrMs6kEzpZAq_CnJyqJi4nbbqfoHlE3nDyLNKFk1e4OHqPsU9G1LRNnHBwSjiJCnvZO_xv_VQbtWmQwLrT7j6PZeXvNOz-yKWQFcE-0RXn6-EuqT7LNTF1GSo2o9AFS5Z2PJqIXioD9ebr9xjFXNrfTdIe32dgcgQHVHNyjEIH22AABUQWYtHRvZQpcfsUjJQM140MJ8nmpjmxlhtAMEstPzbGYUKZdjhF1LkeePxXD46zniN9cFEtRPTNR9luP4W2rhfHnvP4_tRAipmQiB_6RSRvLaiVYfkYYXdzMkX_M5blfwCKQ-DyDFy0hTw3mYZ-SbYT11RVO-5dEm_YntYmgQOI1FI7AhMxpmyE27Lwb73oDO0SeS-SDj4T6nbfltfHdWDPFaeUWd12KRmI-E8AQCcnmJayoBnMXyXNw3muX0319WhuitTtab3n3vwZM1e7ku11q1rNoaA3VXLbBJdyS1Vxvdvm8Tled56S54siOsEYGRqmdiC3gO2ZGaBq68SJZ9zxe9yttNFEXFFgWYFnIn_EMSTNj1ILB0wkOQPzsjFXEEa3W6esXTujFuoHK05q4rrfYicKZkq01hfaoZcovIbDFNyGtpgEzn-BFPJXKWwqn5gkgrvZiYxVxG7a449Gjj_R2HqNbbiTmd1la0MKDnVLWv9yXXRdRLQrKC4Z2kAJIOdwxluk6fRBFzRWT_o046yjM-nvgp3KLJU-n_CWu3mgfmQi5vCbNxRczEeyaJGg3DJL-anxXk0A2CFsFCXRLccmhHV7MjQdh4sdvnvl3JO1Ypt1_nsBXQJqXvahwkjpEC5jzduvTd0rIHgDBAzO3PA7YNjWF_r1EmagtsB_1VFSRqAQdXjbEep8SLKNqv8N7ILkix2NeTM30r9xyXtXcGOOmoQK4AMk1tHBmQ4m6YYNalWXJ_aGIjdBgx4jgsRYjWp1H9qRr0wMkmG75zOSbuOy_lg5-C-xbszvp7B5YELZblpjnpXCW8AhXMWCLM_iG16lkgw24Z40VWh4Q9DCXoMgZmOXm-98WidEFfkMP_8L7sdQjWRxMAodkLhUkHnsBRlYNChmAexNvzKW3xiiDhC_k6qKRfldVgCGSBFfpldJF_8e7EyQ&quot;</span><span class="p">&gt;</span>Example2<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">h5</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">h5</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;ml-4&quot;</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;/docs/demo.html&quot;</span><span class="p">&gt;</span>See Demo Song // Techno<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">h5</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">hstack</span><span class="p">&gt;</span>

            <span class="p">&lt;</span><span class="nt">bitrhythm</span> <span class="na">song</span><span class="o">=</span><span class="s">&quot;{{data}}&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">bitrhythm</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>

    <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="nx">riot</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">bitrhythm</span> <span class="o">=</span> <span class="nx">riot</span><span class="p">.</span><span class="nx">mount</span><span class="p">(</span><span class="s1">&#39;bitrhythm&#39;</span><span class="p">);</span>
            <span class="nb">window</span><span class="p">.</span><span class="nx">bitrhythm</span> <span class="o">=</span> <span class="nx">bitrhythm</span><span class="p">[</span><span class="mf">0</span><span class="p">];</span>
            <span class="kd">var</span> <span class="nx">dial</span> <span class="o">=</span> <span class="nx">riot</span><span class="p">.</span><span class="nx">mount</span><span class="p">(</span><span class="s1">&#39;dial&#39;</span><span class="p">);</span>
            <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="nx">riot</span><span class="p">.</span><span class="nx">mount</span><span class="p">(</span><span class="s1">&#39;number&#39;</span><span class="p">);</span>
            <span class="kd">var</span> <span class="nx">sample</span> <span class="o">=</span> <span class="nx">riot</span><span class="p">.</span><span class="nx">mount</span><span class="p">(</span><span class="s1">&#39;sample&#39;</span><span class="p">);</span>
        <span class="p">})</span>
    <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>


    <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>

<span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="page">
<h2>Page<a class="headerlink" href="#page" title="Permalink to this headline">ΒΆ</a></h2>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&quot;en&quot;</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&quot;utf-8&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;width=device-width, initial-scale=1&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">http-equiv</span><span class="o">=</span><span class="s">&quot;Cache-Control&quot;</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;no-cache, no-store, must-revalidate&quot;</span> <span class="p">/&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">http-equiv</span><span class="o">=</span><span class="s">&quot;Pragma&quot;</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;no-cache&quot;</span> <span class="p">/&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">http-equiv</span><span class="o">=</span><span class="s">&quot;Expires&quot;</span> <span class="na">content</span><span class="o">=</span><span class="s">&quot;0&quot;</span> <span class="p">/&gt;</span>
        <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>About birthythm<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;icon&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;favicon.ico&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
        <span class="nt">html</span><span class="o">,</span> <span class="nt">body</span> <span class="p">{</span>
            <span class="k">margin</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
            <span class="k">width</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
            <span class="k">height</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
            <span class="k">padding</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="nt">iframe</span> <span class="p">{</span>
            <span class="k">position</span><span class="p">:</span><span class="kc">fixed</span><span class="p">;</span>
            <span class="k">top</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
            <span class="k">left</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
            <span class="k">bottom</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
            <span class="k">right</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
            <span class="k">width</span><span class="p">:</span><span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
            <span class="k">height</span><span class="p">:</span><span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
            <span class="k">border</span><span class="p">:</span><span class="kc">none</span><span class="p">;</span>
            <span class="k">margin</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
            <span class="k">padding</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
            <span class="k">overflow</span><span class="p">:</span><span class="kc">hidden</span><span class="p">;</span>
            <span class="k">z-index</span><span class="p">:</span><span class="mi">999999</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css&quot;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
            <span class="nb">window</span><span class="p">.</span><span class="nx">goatcounter</span> <span class="o">=</span> <span class="p">{</span>
                <span class="nx">path</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">location</span><span class="p">.</span><span class="nx">host</span> <span class="o">+</span> <span class="nx">p</span> <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">script</span> <span class="na">data-goatcounter</span><span class="o">=</span><span class="s">&quot;https://analytics.xyzzyapps.link/count&quot;</span> <span class="na">async</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;//analytics.xyzzyapps.link/count.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
    <span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">iframe</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://blog.xyzzyapps.link/bitrhythm-submit-issue-feedback&quot;</span> <span class="na">frameborder</span><span class="o">=</span><span class="s">&quot;0&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">iframe</span><span class="p">&gt;</span>
    <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="javascript">
<h2>Javascript<a class="headerlink" href="#javascript" title="Permalink to this headline">ΒΆ</a></h2>
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="kd">function</span> <span class="nx">initWinamp</span><span class="p">(</span><span class="nx">preset</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">can</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;visual&quot;</span><span class="p">);</span>
    <span class="nx">can</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span> <span class="o">-</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;header-playback&quot;</span><span class="p">).</span><span class="nx">clientHeight</span> <span class="o">-</span> <span class="mf">75</span><span class="p">;</span>
    <span class="nx">can</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">can_container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;canvas-container&quot;</span><span class="p">);</span>
    <span class="nx">can_container</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">visualizer</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">butterchurn</span><span class="p">.</span><span class="k">default</span><span class="p">.</span><span class="nx">createVisualizer</span><span class="p">(</span><span class="nx">Tone</span><span class="p">.</span><span class="nx">getContext</span><span class="p">().</span><span class="nx">rawContext</span><span class="p">,</span> <span class="nx">can</span><span class="p">,</span> <span class="p">{</span>
        <span class="nx">height</span><span class="o">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span> <span class="o">-</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;header-playback&quot;</span><span class="p">).</span><span class="nx">clientHeight</span> <span class="o">-</span> <span class="mf">75</span><span class="p">,</span>
        <span class="nx">width</span><span class="o">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span>
        <span class="nx">meshWidth</span><span class="o">:</span> <span class="mf">24</span><span class="p">,</span>
        <span class="nx">meshHeight</span><span class="o">:</span> <span class="mf">18</span><span class="p">,</span>
    <span class="p">});</span>
    <span class="nx">visualizer</span><span class="p">.</span><span class="nx">connectAudio</span><span class="p">(</span><span class="nx">Tone</span><span class="p">.</span><span class="nx">getContext</span><span class="p">().</span><span class="nx">destination</span><span class="p">);</span>
    <span class="kd">const</span> <span class="nx">presets</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">butterchurnPresets</span><span class="p">.</span><span class="nx">getPresets</span><span class="p">();</span>
    <span class="kd">const</span> <span class="nx">presetParam</span> <span class="o">=</span> <span class="nx">presets</span><span class="p">[</span><span class="nx">preset</span><span class="p">];</span>
    <span class="nx">visualizer</span><span class="p">.</span><span class="nx">loadPreset</span><span class="p">(</span><span class="nx">presetParam</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">);</span> <span class="c1">// 2nd argument is the number of seconds to blend presets</span>
    <span class="k">return</span> <span class="nx">visualizer</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">guard</span><span class="p">(</span><span class="nx">range</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">state</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="k">return</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">((</span><span class="nx">val</span> <span class="o">&gt;=</span> <span class="nx">range</span><span class="p">[</span><span class="mf">0</span><span class="p">])</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">val</span> <span class="o">&lt;=</span> <span class="nx">range</span><span class="p">[</span><span class="mf">1</span><span class="p">]))</span> <span class="p">{</span>
            <span class="nx">state</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
            <span class="k">return</span> <span class="nx">val</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="k">return</span> <span class="nx">state</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">hex2bin</span><span class="p">(</span><span class="nx">hex</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">letters</span> <span class="o">=</span> <span class="nx">hex</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;`1&#39;</span><span class="p">,</span><span class="s1">&#39;a&#39;</span><span class="p">);</span>
    <span class="nx">letters</span> <span class="o">=</span> <span class="nx">hex</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;`2&#39;</span><span class="p">,</span><span class="s1">&#39;b&#39;</span><span class="p">);</span>
    <span class="nx">letters</span> <span class="o">=</span> <span class="nx">hex</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;`3&#39;</span><span class="p">,</span><span class="s1">&#39;c&#39;</span><span class="p">);</span>
    <span class="nx">letters</span> <span class="o">=</span> <span class="nx">hex</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;`4&#39;</span><span class="p">,</span><span class="s1">&#39;d&#39;</span><span class="p">);</span>
    <span class="nx">letters</span> <span class="o">=</span> <span class="nx">hex</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;`5&#39;</span><span class="p">,</span><span class="s1">&#39;e&#39;</span><span class="p">);</span>
    <span class="nx">letters</span> <span class="o">=</span> <span class="nx">hex</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;`6&#39;</span><span class="p">,</span><span class="s1">&#39;f&#39;</span><span class="p">);</span>
    <span class="nx">letters</span> <span class="o">=</span> <span class="nx">letters</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span>
    <span class="kd">var</span> <span class="nx">bin</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
    <span class="nx">letters</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">letter</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;0&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;0000&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;1&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;0001&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;2&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;0010&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;3&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;0011&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;4&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;0100&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;5&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;0101&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;6&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;0110&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;7&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;0111&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;8&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;1000&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;9&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;1001&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;a&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;1010&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;b&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;1011&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;c&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;1100&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;d&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;1101&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;e&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;1110&quot;</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">letter</span> <span class="o">==</span> <span class="s2">&quot;f&quot;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">bin</span> <span class="o">+=</span> <span class="s2">&quot;1111&quot;</span><span class="p">;</span>
        <span class="p">}</span>

    <span class="p">})</span>
    <span class="k">return</span> <span class="nx">bin</span><span class="p">;</span>
<span class="p">}</span>


<span class="kd">function</span> <span class="nx">pattern_clean</span><span class="p">(</span><span class="nx">p</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">p</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="nx">p</span> <span class="o">=</span> <span class="nx">p</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/ /g</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">);</span>
    <span class="kd">var</span> <span class="nx">fc</span> <span class="o">=</span> <span class="nx">p</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)[</span><span class="mf">0</span><span class="p">];</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">fc</span><span class="o">==</span> <span class="s2">&quot;p&quot;</span><span class="p">)</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">ptype</span> <span class="o">=</span> <span class="s2">&quot;xo&quot;</span><span class="p">;</span>
        <span class="kd">var</span> <span class="nx">l</span> <span class="o">=</span> <span class="p">(</span><span class="nx">p</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mf">1</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">fc</span><span class="o">==</span> <span class="s2">&quot;b&quot;</span><span class="p">)</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">l</span> <span class="o">=</span> <span class="p">(</span><span class="nx">p</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mf">1</span><span class="p">);</span>
        <span class="kd">var</span> <span class="nx">ptype</span> <span class="o">=</span> <span class="s2">&quot;bin&quot;</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">ptype</span> <span class="o">=</span> <span class="s2">&quot;hex&quot;</span><span class="p">;</span>
        <span class="kd">var</span> <span class="nx">l</span> <span class="o">=</span> <span class="p">(</span><span class="nx">p</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">*</span> <span class="mf">4</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">if</span> <span class="p">(</span><span class="nx">ptype</span> <span class="o">==</span> <span class="s2">&quot;bin&quot;</span><span class="p">)</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">fp</span> <span class="o">=</span>  <span class="nx">p</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="mf">1</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">ptype</span> <span class="o">==</span> <span class="s2">&quot;xo&quot;</span><span class="p">)</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">fp</span> <span class="o">=</span> <span class="nx">p</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mf">1</span><span class="p">);</span>
        <span class="nx">fp</span> <span class="o">=</span> <span class="nx">fp</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/x/g</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">fp</span> <span class="o">=</span> <span class="nx">hex2bin</span><span class="p">(</span><span class="nx">p</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="nx">fp</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">download</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">filename</span><span class="p">,</span> <span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">file</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Blob</span><span class="p">([</span><span class="nx">data</span><span class="p">],</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nx">type</span> <span class="p">});</span>
    <span class="k">if</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">navigator</span><span class="p">.</span><span class="nx">msSaveOrOpenBlob</span><span class="p">)</span> <span class="c1">// IE10+</span>
        <span class="nb">window</span><span class="p">.</span><span class="nx">navigator</span><span class="p">.</span><span class="nx">msSaveOrOpenBlob</span><span class="p">(</span><span class="nx">file</span><span class="p">,</span> <span class="nx">filename</span><span class="p">);</span>
    <span class="k">else</span> <span class="p">{</span> <span class="c1">// Others</span>
        <span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;a&quot;</span><span class="p">),</span>
            <span class="nx">url</span> <span class="o">=</span> <span class="nx">URL</span><span class="p">.</span><span class="nx">createObjectURL</span><span class="p">(</span><span class="nx">file</span><span class="p">);</span>
        <span class="nx">a</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="nx">url</span><span class="p">;</span>
        <span class="nx">a</span><span class="p">.</span><span class="nx">download</span> <span class="o">=</span> <span class="nx">filename</span><span class="p">;</span>
        <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">a</span><span class="p">);</span>
        <span class="nx">a</span><span class="p">.</span><span class="nx">click</span><span class="p">();</span>
        <span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
            <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">removeChild</span><span class="p">(</span><span class="nx">a</span><span class="p">);</span>
            <span class="nb">window</span><span class="p">.</span><span class="nx">URL</span><span class="p">.</span><span class="nx">revokeObjectURL</span><span class="p">(</span><span class="nx">url</span><span class="p">);</span>
        <span class="p">},</span> <span class="mf">0</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// https://stackoverflow.com/questions/15762768/javascript-math-round-to-two-decimal-places</span>
<span class="kd">function</span> <span class="nx">roundTo</span><span class="p">(</span><span class="nx">n</span><span class="p">,</span> <span class="nx">digits</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">negative</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">digits</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">digits</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">n</span> <span class="o">&lt;</span> <span class="mf">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">negative</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
        <span class="nx">n</span> <span class="o">=</span> <span class="nx">n</span> <span class="o">*</span> <span class="o">-</span><span class="mf">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="kd">var</span> <span class="nx">multiplicator</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mf">10</span><span class="p">,</span> <span class="nx">digits</span><span class="p">);</span>
    <span class="nx">n</span> <span class="o">=</span> <span class="nb">parseFloat</span><span class="p">((</span><span class="nx">n</span> <span class="o">*</span> <span class="nx">multiplicator</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mf">11</span><span class="p">));</span>
    <span class="nx">n</span> <span class="o">=</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">/</span> <span class="nx">multiplicator</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">digits</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">negative</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">n</span> <span class="o">=</span> <span class="p">(</span><span class="nx">n</span> <span class="o">*</span> <span class="o">-</span><span class="mf">1</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">digits</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">n</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">$</span><span class="p">{</span><span class="nx">knob_code</span><span class="p">}</span>
</pre></div>
</div>
</div>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="changelog.html" title="previous page">Changelog</a>
    <a class='right-next' id="next-link" href="saving.html" title="next page">Saving and Sharing</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/midi.html.



















































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>MIDI and DAW Terms &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Samples" href="samples.html" />
    <link rel="prev" title="Limitations and Recording" href="limitations.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
            <div class="tocsection onthispage pt-5 pb-3">
                <i class="fas fa-list"></i> Contents
            </div>
            <nav id="bd-toc-nav">
                <ul class="visible nav section-nav flex-column">
 <li class="toc-h1 nav-item toc-entry">
  <a class="reference internal nav-link" href="#">
   MIDI and DAW Terms
  </a>
  <ul class="visible nav section-nav flex-column">
   <li class="toc-h2 nav-item toc-entry">
    <a class="reference internal nav-link" href="#midi">
     MIDI
    </a>
   </li>
  </ul>
 </li>
 <li class="toc-h1 nav-item toc-entry">
  <a class="reference internal nav-link" href="#usage">
   Usage
  </a>
  <ul class="visible nav section-nav flex-column">
   <li class="toc-h2 nav-item toc-entry">
    <a class="reference internal nav-link" href="#terms">
     Terms
    </a>
   </li>
  </ul>
 </li>
</ul>

            </nav>
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="midi-and-daw-terms">
<h1>MIDI and DAW Terms<a class="headerlink" href="#midi-and-daw-terms" title="Permalink to this headline">ΒΆ</a></h1>
<div class="section" id="midi">
<h2>MIDI<a class="headerlink" href="#midi" title="Permalink to this headline">ΒΆ</a></h2>
<p><a href="https://en.wikipedia.org/wiki/MIDI">MIDI</a> changed music.</p>
<p>Consider what a classically trained Musician needs to do, to make his
music heard.</p>
<p>He needs to,</p>
<ol class="simple">
<li><p>Write it</p></li>
<li><p>Get a bunch of musicians</p></li>
<li><p>Practice</p></li>
<li><p>Play</p></li>
<li><p>goto 1</p></li>
<li><p>Record the Final Cut in a Studio</p></li>
</ol>
<p>With MIDI,</p>
<ol class="simple">
<li><p>Write it. Save it, with a Software</p></li>
<li><p>Get the electronic instruments to play it for him
-or-
Get a computer Software to play it for him</p></li>
<li><p>Tweak</p></li>
<li><p>Record the Final Cut in Software or a Studio</p></li>
</ol>
<p>MIDI is - Musical Instrument Digital Interface.</p>
<p>It abstracts <a href="https://en.wikipedia.org/wiki/Musical_notation">Music Notation</a> into bytes.
Since its bytes, you can replay it with software.</p>
<p>MIDI made production,</p>
<ul class="simple">
<li><p>Dirt Cheap</p></li>
<li><p>Made Producers more efficient</p></li>
</ul>
<p>How about Audio Quality ?</p>
<ul class="simple">
<li><p>A Classical Ensemble still has its place. Panning is unique there.</p></li>
<li><p>But MIDI + Electronic Instrument increased the Range. It helped form whole new genres in Music like EDM, IDM, SynthPunk …</p></li>
</ul>
<p>Limitations ?</p>
<ul class="simple">
<li><p>MIDI is limited to 16 instruments.</p></li>
<li><p>Integers.</p></li>
<li><p>16 is a big number.</p></li>
<li><p><a href="https://en.wikipedia.org/wiki/Open_Sound_Control">OSC</a> overcomes these.</p></li>
</ul>
</div>
</div>
<div class="section" id="usage">
<h1>Usage<a class="headerlink" href="#usage" title="Permalink to this headline">ΒΆ</a></h1>
<p>To use MIDI you need,</p>
<ol>
<li><p>A Sequencer</p>
<p>This generates MIDI messages like,</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Command</span> <span class="n">param1</span> <span class="n">param2</span> <span class="n">param3</span>
<span class="n">Command</span> <span class="n">param1</span> <span class="n">param2</span>
<span class="n">Command</span> <span class="n">param1</span> <span class="n">param2</span> <span class="n">param3</span>
<span class="n">Command</span> <span class="n">param1</span> <span class="n">param2</span>
<span class="o">...</span>
</pre></div>
</div>
<p>Important messages are,</p>
<ol class="simple">
<li><p>Note On =&gt; Channel [1-16]**, Pitch[0-127], Volume[0-127]</p></li>
<li><p>Note Off                 β€œ</p></li>
<li><p>Controller =&gt; No [0-127], Value[0-127]</p></li>
</ol>
<p>** Channel 10 is reserved for Drums.</p>
<p>Note On and Note Off are typically sent by keys, buttons.
Controller Messages are typically sent by knobs and pedals.</p>
</li>
<li><p>A Synthesizer</p>
<p>This accepts MIDI data.
It Maps channels to DSP.
It Maps knobs** to effects like distortion and reverb.</p>
<p>** The positions of the knob are called patches.</p>
</li>
<li><p>A Sampler.</p>
<p>This accepts MIDI data.
It Maps channels to sound recordings.
It Maps knobs to effects like distortion and reverb.</p>
</li>
</ol>
<p>If you buy Music Hardware you have both 1 and 2.  The sequencing capabilities are limited in a synth,  so you can’t Edit MIDI data in the instrument.</p>
<p>Some notes,</p>
<ol class="simple">
<li><p>You can buy hardware and get a Synthesizer + a limited Sequencer.</p></li>
<li><p>You can buy A Sequencer and use a Computer as a Synthesizer</p></li>
</ol>
<p>or</p>
<ol class="simple">
<li><p>Use a Software Sequencer to Program your Synthesizer</p></li>
</ol>
<p>or</p>
<ol class="simple">
<li><p>Forget Hardware and go complete nuts with Software</p></li>
</ol>
<iframe width="480" height="360" src="//www.youtube.com/embed/VouHPeO4Gls" frameborder="0" allowfullscreen></iframe>
<p><a href="http://vimeo.com/93923609">Also, Robots love it.</a><p>
<div class="section" id="terms">
<h2>Terms<a class="headerlink" href="#terms" title="Permalink to this headline">ΒΆ</a></h2>
<p>Instruments used in Electronic Music</p>
<ul class="simple">
<li><p>Tr 909</p></li>
<li><p>Tr 303</p></li>
<li><p>Tr 808</p></li>
</ul>
<p>Instruments commonly used in Disco, Synth Wave and Funk</p>
<ul class="simple">
<li><p>Samplers</p></li>
<li><p>FM Synthesiser</p></li>
</ul>
<p>Rock Pedals used in</p>
<ul class="simple">
<li><p>Reverb (sludge)</p></li>
<li><p>Delay (slow rock)</p></li>
<li><p>Distortion (metal)</p></li>
</ul>
<p>DAW Terms</p>
<ul class="simple">
<li><p>track</p></li>
<li><p>sequencer</p></li>
<li><p>piano roll</p></li>
<li><p>OSC</p></li>
<li><p>sampler</p></li>
<li><p>soundfont</p></li>
<li><p>synthesizer (DSP, FM, AM, AS, SS, PM)</p></li>
<li><p>effect</p></li>
<li><p>mixer, LFO</p></li>
<li><p>automation, equalizer</p></li>
<li><p>filter</p></li>
<li><p>arpegiator</p></li>
</ul>
</div>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="limitations.html" title="previous page">Limitations and Recording</a>
    <a class='right-next' id="next-link" href="samples.html" title="next page">Samples</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/samples.html.





































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Samples &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Early Attempts" href="early-attempts.html" />
    <link rel="prev" title="MIDI and DAW Terms" href="midi.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="samples">
<h1>Samples<a class="headerlink" href="#samples" title="Permalink to this headline">ΒΆ</a></h1>
<p>You can use Sample URL to add samples from anywhere. Currently there are three samples available from the main site for use in the demos.</p>
<ul class="simple">
<li><p>/Kick01.wav</p></li>
<li><p>/Snare19.wav</p></li>
<li><p>/Closedhat01.wav</p></li>
<li><p>/MiscSynthStab04.wav</p></li>
<li><p>/Perc11.wav</p></li>
<li><p>/PianoStab03.wav</p></li>
<li><p>/Snare06.wav</p></li>
<li><p>/Snare12.wav</p></li>
<li><p>/Snare09.wav</p></li>
</ul>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="midi.html" title="previous page">MIDI and DAW Terms</a>
    <a class='right-next' id="next-link" href="early-attempts.html" title="next page">Early Attempts</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/saving.html.

















































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Saving and Sharing &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Bookmarks" href="bookmarks.html" />
    <link rel="prev" title="Concepts and Code Walkthrough" href="main.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="saving-and-sharing">
<h1>Saving and Sharing<a class="headerlink" href="#saving-and-sharing" title="Permalink to this headline">ΒΆ</a></h1>
<p>There is a save button that converts the state of bitrhythm into a url paramter. This means there is an upper limit on how much code you can write, making it useful for demoscene like situations. You can share the url with tinyurl.</p>
<p>To make a complete song use <code class="docutils literal notranslate"><span class="pre">bars</span></code> to trigger multiple transitions.</p>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="main.html" title="previous page">Concepts and Code Walkthrough</a>
    <a class='right-next' id="next-link" href="bookmarks.html" title="next page">Bookmarks</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/search.html.



















































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Search &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    
    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <script src="_static/searchtools.js"></script>
    <script src="_static/language_data.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="#" />
  <script src="searchindex.js" defer></script>
  
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    

  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <h1 id="search-documentation">Search</h1>
  <div id="fallback" class="admonition warning">
  <script>$('#fallback').hide();</script>
  <p>
    Please activate JavaScript to enable the search
    functionality.
  </p>
  </div>
  <p>
    Searching for multiple words only shows matches that contain
    all words.
  </p>
  <form action="" method="get">
    <input type="text" name="q" aria-labelledby="search-documentation" value="" />
    <input type="submit" value="search" />
    <span id="search-progress" style="padding-left: 10px"></span>
  </form>
  
  <div id="search-results">
  
  </div>

              </div>
              
        
        <div class='prev-next-bottom'>
            

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/source-code.html.































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Source Code and License &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Demo and Tutorial" href="demo.html" />
    <link rel="prev" title="What is bitrhythm about ?" href="what.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="source-code-and-license">
<h1>Source Code and License<a class="headerlink" href="#source-code-and-license" title="Permalink to this headline">ΒΆ</a></h1>
<p>The literate code framework wheel uses extensively in this project is available <a class="reference external" href="https://xyzzyapps.link/wheel">here</a>.</p>
<p>The documentation, demo code and the source code in the following webpages is distributed under <a class="reference external" href="https://creativecommons.org/licenses/by-nc-sa/4.0/">creative commons, attribution-noncommercial-sharealike license</a>. The source code is self-hosted using fossil <a class="reference external" href="https://fossil.xyzzyapps.link/bitrhythm/timeline">here</a>. You can report issues, browse and download the source code from fossil. An Iframe is provided below. You can also get the latest source code <a class="reference external" href="https://fossil.xyzzyapps.link/bitrhythm/download">here</a>.</p>
<iframe style="width:100%; height:75vh" src="https://fossil.xyzzyapps.link/bitrhythm/dir?ci=tip" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>Coding conventions</p>
<ol class="simple">
<li><p>4 Spaces</p></li>
<li><p>EcmaScript5</p></li>
</ol>
<p>Written using the Vim editor.</p>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="what.html" title="previous page">What is bitrhythm about ?</a>
    <a class='right-next' id="next-link" href="demo.html" title="next page">Demo and Tutorial</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/tweaking.html.

























































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>What exactly is Tweaking ? &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Limitations and Recording" href="limitations.html" />
    <link rel="prev" title="Demo and Tutorial" href="demo.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1">
  <a class="reference internal" href="what.html">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
            <div class="tocsection onthispage pt-5 pb-3">
                <i class="fas fa-list"></i> Contents
            </div>
            <nav id="bd-toc-nav">
                <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#is-bitrhythm-maths-heavy">
   Is Bitrhythm Maths heavy ?
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#dj-controls">
   DJ Controls
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#music-is-arrangement">
   Music is arrangement
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#see-also">
   See Also
  </a>
 </li>
</ul>

            </nav>
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="what-exactly-is-tweaking">
<h1>What exactly is Tweaking ?<a class="headerlink" href="#what-exactly-is-tweaking" title="Permalink to this headline">ΒΆ</a></h1>
<p>For that you need some context.</p>
<p>Historically speaking, music was an accompaniment for theatrical plays. A typical song has a Theme and develops Exposition / Conflict / Resolution through time. Its not a coincidence that the sonata and the dramatic structure share the same form. In a typical play you have scenes, transitions, sets in the background and characters in the foreground. While the play progresses and characters clash you get music alongside each of these elements. Every song has a title that guides the listener to what the song is about. Typical Scenes include intro, bridge, buildup, section, breakdown and climax. What is the intro about ?  What is the bridge about ?  What is the verse about ?  What is the chorus about ?  What are the sections about ? The essential question driving any story is how to be ? In a drama this question is answered with doubts, emotion, circularity, warnings from the chorus, exposition, rises, falls, reprisals, conclusions, contradictions, denouncements, confrontations, mistakes, reversals, recognition, revelation resolution, statements and breakdowns.</p>
<p>Modern music has evolved to be standalone but it retains elements of theatrical story telling. You can divide a song into verses and sections. In the documentation, we will use the terms from plays. Within each musical scene you typically have,</p>
<ul class="simple">
<li><p>Background: You use layers of rhythm and groove to set the mood.</p></li>
<li><p>Foreground: Lead (Soliloquy), Counterpoint (Character Conflict), Call Response(Dialogues), Motif, Ornaments (Exposition)</p></li>
</ul>
<p>In Electronic Music, the foreground is mainly developed using Layers(polyrhythms) and Tweaking. Tweaking and Layers effectively function for the purposes of Exposition and Conflict. Chorus, Fade, Drop are used for transitions typically in electronic music. Tweaking is also called knob-twisting by hardware users. To compare the foreground in others,</p>
<p>Classical Music: Counterpoint and Harmony<br />
Rock: Call Response</p>
<p>Now EDM - Dub, Techno and Jungle - are distinct musical genres. What could they possibly share ?</p>
<ol class="simple">
<li><p>All three uphold the primacy of Rhythm for start.</p></li>
<li><p>All three are instrumental.</p></li>
<li><p>Voices are used sparingly as samples.</p></li>
<li><p>All three have a tradition of live acts.</p></li>
<li><p>Dub Plates are common for these genres.</p></li>
<li><p>Melody is nothing but a repeating stab (motif)</p></li>
</ol>
<p>If you want to add a solo to EDM, you typically add a live instrument.</p>
<p>Dub Music is made by messing with the Recording Engineer’s Mixing desk. A prime example of tweaking.</p>
<iframe width="420" height="315" src="https://www.youtube.com/embed/oJs1wR8tLr4" frameborder="0" allowfullscreen></iframe>
<p>Techno is made by messing with Hardware or Hardware + Software.  Tweaking + Layering.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ppEhaH3jSzo" frameborder="0" allowfullscreen></iframe>
<p>Jungle is used as a catch all for Breakbeat, Hardcore as well. Jungle Music is made by messing with Hardware + Software combo. Complex Layering is used here.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/q72qoGYirwU" frameborder="0" allowfullscreen></iframe>
<p>Bitrhythm only supports rhythmic notations and is geared towards electronic music. My current goal is to produce an IDM track and Chiptune with it with complex rhythmic patterns. As for techno the current setup seems alright. Support will be added in the future for pitch manipulation in a different module or a different project. There is a piano module in the code with midi support but its currently deactivated.</p>
<p>You can treat a musical scale as no different than a drumset. The pentatanic scale approximately maps to a drumset and you can use techniques from <a class="reference external" href="https://www.youtube.com/watch?v=1qdyxML4tF0">melodic drumming</a> with multiple samples. This is typically how drummers approach guitars.</p>
<div class="section" id="is-bitrhythm-maths-heavy">
<h2>Is Bitrhythm Maths heavy ?<a class="headerlink" href="#is-bitrhythm-maths-heavy" title="Permalink to this headline">ΒΆ</a></h2>
<p>You will need some basic maths operations to understand and use bitrhythm effectively. These operations are about working with lists of numbers and lists of strings.</p>
<p>Some common operations on lists include</p>
<ul class="simple">
<li><p>Rotate</p></li>
<li><p>Invert</p></li>
<li><p>Slicing</p></li>
<li><p>Choose</p></li>
<li><p>Reverse</p></li>
<li><p>Shuffle</p></li>
<li><p>Filter</p></li>
<li><p>Map</p></li>
</ul>
<p>Other math operations are useful for working with envelope ranges,</p>
<ul class="simple">
<li><p>Clamp</p></li>
<li><p>Ramp</p></li>
<li><p>Waves</p></li>
</ul>
<p>Programming is not that difficult. Programming is about organising reactions to events. A typical event comes from</p>
<ol class="simple">
<li><p>The timer</p></li>
<li><p>User interface elements like sliders and dials</p></li>
<li><p>Data change</p></li>
</ol>
<p>A typical reaction to an event (often called a handler) either changes data or displays data. A data change triggers more events. Other programming concepts needed for birthythm</p>
<p>As Tone.js provides the bulk of sound generation in Bitrhythm you should make youself comfortable with its APIs.</p>
<p>You will also need to understand</p>
<ul class="simple">
<li><p>Conditions</p></li>
<li><p>Loops</p></li>
<li><p>Functions</p></li>
<li><p>Javascript Math.random</p></li>
<li><p>Modulo Arithmetic</p></li>
<li><p>SetInterval Timers</p></li>
</ul>
<p>What comes next - This is the pertinent question when composing music. If you are feeling adventurous you can try to use,</p>
<ol class="simple">
<li><p>Mathematical patterns like fibonacci series, geometric series,
pi, fractals …</p></li>
<li><p>Neo-Riemannian_theory, Combinatory theory</p></li>
<li><p>Sacred Geometry</p></li>
<li><p>Circle of fifths, chord progressions</p></li>
<li><p>Set transformations like inversion on Scales</p></li>
<li><p>Licks from books</p></li>
<li><p>Randomness, I Ching, Playing Cards</p></li>
</ol>
</div>
<div class="section" id="dj-controls">
<h2>DJ Controls<a class="headerlink" href="#dj-controls" title="Permalink to this headline">ΒΆ</a></h2>
<div class="admonition-todo admonition" id="id1">
<p class="admonition-title">Todo</p>
<p>Expand</p>
</div>
<p>Essentially a DJ is like a conductor. Loops are like individual instrumentalists.</p>
<ol class="simple">
<li><p>Cueing -&gt; Mute / Solo</p></li>
<li><p>Dynamics -&gt; Volume</p></li>
<li><p>Ornamentation -&gt; Cutoff</p></li>
<li><p>Tempo, Beat Counting -&gt; Beat Matching</p></li>
</ol>
</div>
<div class="section" id="music-is-arrangement">
<h2>Music is arrangement<a class="headerlink" href="#music-is-arrangement" title="Permalink to this headline">ΒΆ</a></h2>
<iframe width="420" height="315" src="https://www.youtube.com/embed/tprMEs-zfQA" frameborder="0" allowfullscreen></iframe>
</div>
<div class="section" id="see-also">
<h2>See Also<a class="headerlink" href="#see-also" title="Permalink to this headline">ΒΆ</a></h2>
<p>In screenplays you also have a <a class="reference external" href="https://www.youtube.com/watch?v=cG5zKwmXLgo">setup / payoff</a> dynamic.</p>
<p>Setup</p>
<ul class="simple">
<li><p>Obstacles</p></li>
<li><p>Challenges</p></li>
<li><p>Forces</p></li>
<li><p>Context</p></li>
</ul>
</div>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="demo.html" title="previous page">Demo and Tutorial</a>
    <a class='right-next' id="next-link" href="limitations.html" title="next page">Limitations and Recording</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added build/html/what.html.







































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>What is bitrhythm about ? &#8212; Bitrhythm&#39;s literate documentation</title>
    
  <link href="_static/css/theme.css" rel="stylesheet" />
  <link href="_static/css/index.c5995385ac14fb8791e8eb36b4908be2.css" rel="stylesheet" />

    
  <link rel="stylesheet"
    href="_static/vendor/fontawesome/5.13.0/css/all.min.css">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  <link rel="preload" as="font" type="font/woff2" crossorigin
    href="_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">

    
      

    
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/sphinx-book-theme.e8e5499552300ddf5d7adccae7cc3b70.css" type="text/css" />
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
    
  <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">

    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
    <script src="_static/analytics.js"></script>
    <script async="async" data-goatcounter="https://analytics.xyzzyapps.link/count" src="https://analytics.xyzzyapps.link/count.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Source Code and License" href="source-code.html" />
    <link rel="prev" title="Welcome to Bitrhythm’s documentation!" href="index.html" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="docsearch:language" content="en" />
    
  </head>
  <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
    
    <div class="container-fluid" id="banner"></div>

    

    <div class="container-xl">
      <div class="row">
          
<div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
    
        <div class="navbar-brand-box">
    <a class="navbar-brand text-wrap" href="index.html">
      
      
      <h1 class="site-logo" id="site-title">Bitrhythm's literate documentation</h1>
      
    </a>
</div><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
    <div class="bd-toc-item active">
        <p class="caption">
 <span class="caption-text">
  Table of Contents
 </span>
</p>
<ul class="current nav bd-sidenav">
 <li class="toctree-l1 current active">
  <a class="current reference internal" href="#">
   What is bitrhythm about ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="source-code.html">
   Source Code and License
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="demo.html">
   Demo and Tutorial
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="tweaking.html">
   What exactly is Tweaking ?
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="limitations.html">
   Limitations and Recording
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="midi.html">
   MIDI and DAW Terms
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="samples.html">
   Samples
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="early-attempts.html">
   Early Attempts
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="changelog.html">
   Changelog
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="main.html">
   Concepts and Code Walkthrough
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="saving.html">
   Saving and Sharing
  </a>
 </li>
 <li class="toctree-l1">
  <a class="reference internal" href="bookmarks.html">
   Bookmarks
  </a>
 </li>
</ul>

    </div>
</nav> <!-- To handle the deprecated key -->

<div class="navbar_extra_footer">
  
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>

</div>

</div>


          


          
<main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
    
    <div class="topbar container-xl fixed-top">
    <div class="topbar-contents row">
        <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
        <div class="col pl-md-4 topbar-main">
            
            <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
                data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
                aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
                title="Toggle navigation" data-toggle="tooltip" data-placement="left">
                <i class="fas fa-bars"></i>
                <i class="fas fa-arrow-left"></i>
                <i class="fas fa-arrow-up"></i>
            </button>
            
            
            <!-- Source interaction buttons -->

            <!-- Full screen (wrap in <a> to have style consistency -->

<a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
        data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
        title="Fullscreen mode"><i
            class="fas fa-expand"></i></button></a>

            <!-- Launch buttons -->

        </div>

        <!-- Table of contents -->
        <div class="d-none d-md-block col-md-2 bd-toc show">
            
            <div class="tocsection onthispage pt-5 pb-3">
                <i class="fas fa-list"></i> Contents
            </div>
            <nav id="bd-toc-nav">
                <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#about-author">
   About Author
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#support-this-project">
   Support this project
  </a>
 </li>
 <li class="toc-h2 nav-item toc-entry">
  <a class="reference internal nav-link" href="#future-features">
   Future Features
  </a>
 </li>
</ul>

            </nav>
        </div>
    </div>
</div>
    <div id="main-content" class="row">
        <div class="col-12 col-md-9 pl-md-3 pr-md-0">
        
              <div>
                
  <div class="section" id="what-is-bitrhythm-about">
<h1>What is bitrhythm about ?<a class="headerlink" href="#what-is-bitrhythm-about" title="Permalink to this headline">ΒΆ</a></h1>
<p>Currently this is how you can use code with music,</p>
<ol class="simple">
<li><p>VST plugins</p></li>
<li><p>DAW scripting</p></li>
<li><p>Embedded code to interact with electronics</p></li>
<li><p>ML approaches</p></li>
<li><p>Live coding</p></li>
<li><p>Use some weird algorithms / number sequences / hardcoded chords / random numbers</p></li>
<li><p>Web Audio / Audio Programming languages</p></li>
</ol>
<p>Bitrhythm offers 4-7.  In Bitrhythm you get a coding playground to explore and learn webaudio and webgl apis for the purposes of</p>
<ol class="simple">
<li><p>live visual programming</p></li>
<li><p>live audio programming</p></li>
<li><p>music sequencing</p></li>
<li><p>interactive music</p></li>
<li><p>audio visualisation</p></li>
<li><p>music learning</p></li>
</ol>
<p>Apart from the core html apis, you can also use the following libraries</p>
<ol class="simple">
<li><p>Tuna</p></li>
<li><p>Timbral</p></li>
<li><p>Tone.js</p></li>
<li><p>Underscore / Rambda</p></li>
<li><p>cellx</p></li>
<li><p>Magenta.js (Machine Learning)</p></li>
<li><p>Three.js / P5.js / D3 / Paper.js</p></li>
<li><p>Winamp Visualisations (butterchurn)</p></li>
</ol>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/tensorflow/1.2.8/tf.min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdn.jsdelivr.net/npm/@magenta/music@^1.0.0/es6/core.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdn.jsdelivr.net/npm/@magenta/music@^1.0.0/es6/music_vae.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">script</span> <span class="na">sec</span><span class="o">=</span><span class="s">&quot;https://mohayonao.github.io/timbre.js/timbre.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/tunajs/1.0.1/tuna-min.js&quot;</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;text/javascript&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/tone/14.7.77/Tone.js&quot;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&quot;sha512-gwSDP1iEKl4KG0wi3N89RAJU91s78jb/TGC6lsbF5IyR2c19Rn7Jl1icK4K4kUiJNwQUEPI7o98T+GJVWNuvIQ==&quot;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&quot;anonymous&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/teoria-master/teoria.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdn.jsdelivr.net/npm/p5@1.3.1/lib/p5.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdn.jsdelivr.net/npm/d3@5.7.0/dist/d3.min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://threejs.org/build/three.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.12.11/paper-full.min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdn.jsdelivr.net/npm/butterchurn@2.6.7/lib/butterchurn.min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdn.jsdelivr.net/npm/butterchurn-presets@2.4.7/lib/butterchurnPresets.min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdn.jsdelivr.net/npm/webmidi@2.0.0&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://code.jquery.com/jquery-3.4.1.min.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;/nexus-js/dist/NexusUI.js&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://cdnjs.cloudflare.com/ajax/libs/cellx/1.10.19/cellx.umd.min.js&quot;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&quot;sha512-ojEcAP3e6N+n5MDKPW6CexXzuLDahDPkNZmzyRV4t2zqh9nwljJNuV8JGa+xjpnAaGB/FhsAU7P6IHEP0dtJQA==&quot;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&quot;anonymous&quot;</span> <span class="na">referrerpolicy</span><span class="o">=</span><span class="s">&quot;no-referrer&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</pre></div>
</div>
<div class="section" id="about-author">
<h2>About Author<a class="headerlink" href="#about-author" title="Permalink to this headline">ΒΆ</a></h2>
<p>I make <a class="reference external" href="https://xyzzyapps.link">web apps</a> apps for a living. I started messing with algorithmic composition using pure data around 2011.  Although nothing much came out of it musically, it transformed the way I view programming. The unix pipes concept is identical to the data flow model in pure data; albeit with more connections.</p>
<p>For my music I moved onto Electribe, Renoise, Reaper and live looping with my guitar. I started exploring sonic pi in 2019 but TBH none of the live coding tools were doing what I wanted - basically tweaking /knob-twisting in techno so I started my work on this project. <a class="reference external" href="https://www.youtube.com/watch?v=adz1Gv5Lm34">This library</a> in sonic pi comes close to what I am trying todo with this project. In bitrhythm time is divided into ticks like renoise tracker.</p>
<p>After my initial work on the project in 2019, the project got sidetracked. After seeing <a class="reference external" href="https://www.vitling.xyz/toys/acid-banger/">endless acid banger</a> I had an epiphany to work on this project again. I was able to compose an endless and interactive dubtechno demo track. In March 2021, I also picked up on literate programming so this document will have both code and documentation intertwined.</p>
<p>The documentation for the literate programming project - wheel is <a class="reference external" href="https://xyzzyapps.link/wheel/">available here</a>.</p>
</div>
<div class="section" id="support-this-project">
<h2>Support this project<a class="headerlink" href="#support-this-project" title="Permalink to this headline">ΒΆ</a></h2>
<p>My goal is to make bitrhythm easy for both professionals and music learners. Support my work to get regular updates. Supporters will also get free accounts when I add pro features! Also get notified on latest developments and tutorials in the web audio world.</p>
<p><script src="https://gumroad.com/js/gumroad.js"></script><a class="gumroad-button" href="https://gumroad.com/l/kQSCv" target="_blank" rel="noopener"><span class="gumroad-button-logo"></span>Support Bitrhythm</a></p>
<p>You can find me on <a class="reference external" href="https://theaudioprogrammer.com/">theaudioprogrammer</a> and algorave discord as &#64;xyzzy.</p>
</div>
<div class="section" id="future-features">
<h2>Future Features<a class="headerlink" href="#future-features" title="Permalink to this headline">ΒΆ</a></h2>
<ul class="simple">
<li><p>Saving Songs</p></li>
<li><p>More Synths with Presets</p></li>
<li><p>Visualisation Presets</p></li>
<li><p>Autocomplete Rhythms and Chords</p></li>
<li><p>Automation Recording</p></li>
<li><p>Version Control</p></li>
<li><p>Record</p></li>
<li><p>Midi Support</p></li>
<li><p>More tutorials and examples on Web APIs</p></li>
<li><p>Synthesizer</p></li>
<li><p>Collaboration</p></li>
<li><p>Adding DJ Transition / Hints support</p></li>
</ul>
</div>
</div>


              </div>
              
        
        <div class='prev-next-bottom'>
            
    <a class='left-prev' id="prev-link" href="index.html" title="previous page">Welcome to Bitrhythm’s  documentation!</a>
    <a class='right-next' id="next-link" href="source-code.html" title="next page">Source Code and License</a>

        </div>
        
        </div>
    </div>
    <footer class="footer mt-5 mt-md-0">
    <div class="container">
      <p>
        
          By Xyzzy Apps<br/>
        
            &copy; Copyright (c) Xyzzy Apps, 2021.<br/>
      </p>
    </div>
  </footer>
</main>


      </div>
    </div>
  
  <script src="_static/js/index.1c5a1a01449ed65a7b51.js"></script>

  
  </body>
</html>

Added pidfile.



>
1
%1

Added public/Clap05.wav.

cannot compute difference between binary files

Added public/Closedhat01.wav.

cannot compute difference between binary files

Added public/Kick01.wav.

cannot compute difference between binary files

Added public/MiscSynthStab04.wav.

cannot compute difference between binary files

Added public/Perc11.wav.

cannot compute difference between binary files

Added public/PianoStab03.wav.

cannot compute difference between binary files

Added public/Snare06.wav.

cannot compute difference between binary files

Added public/Snare09.wav.

cannot compute difference between binary files

Added public/Snare12.wav.

cannot compute difference between binary files

Added public/Snare19.wav.

cannot compute difference between binary files

Added public/bootstrap-colorpicker/LICENSE.











































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MIT License

Copyright (c) 2017 Javi Aguilar

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Added public/bootstrap-colorpicker/README.md.































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<a class="readme-logo" href="https://farbelous.io/bootstrap-colorpicker">
    <img alt="Logo by @reallinfo" src="logo.png" width="128px" />
</a>

# Bootstrap Colorpicker

<!--version-->

[Bootstrap Colorpicker](https://github.com/farbelous/bootstrap-colorpicker/) is a modular color picker plugin for Bootstrap 4.

[![Build Status](https://img.shields.io/travis/farbelous/bootstrap-colorpicker/master.svg?style=flat-square)](https://travis-ci.org/farbelous/bootstrap-colorpicker)
[![npm](https://img.shields.io/npm/v/bootstrap-colorpicker.svg?style=flat-square)](https://www.npmjs.com/package/bootstrap-colorpicker)

## Install
You can get the latest version in many different ways:

- Downloading [a ZIP file from the releases](https://github.com/farbelous/bootstrap-colorpicker/releases)
- Cloning using Git: `git clone https://github.com/farbelous/bootstrap-colorpicker.git`
- Installing via NPM: `npm install bootstrap-colorpicker`
- Installing via Yarn: `yarn add bootstrap-colorpicker`
- Installing via Composer: `composer require itsjavi/bootstrap-colorpicker`

Note that the `dist` files are only distributed via the NPM and Yarn installations.

For the rest methods, you will need to generate the files initializing the project with `yarn install`
and then building the code using `npm run build`.

## Versions

<table class="table table-bordered table-striped">
  <thead>
    <tr>
        <th>Colorpicker version</th>
        <th>Compatible Bootstrap version</th>
        <th>Dependencies</th>
    </tr>
  </thead>
  <tbody>
    <tr>
        <td>
          <a href="https://github.com/farbelous/bootstrap-colorpicker/tree/v2.x">v2.x</a> <br>
          <a href="https://farbelous.github.io/bootstrap-colorpicker/v2">Documentation</a>
        </td>
        <td>(any)</td>
        <td>
          <ul>
            <li>jQuery >= 1.10</li>
            <li>Bootstrap CSS (input addon)</li>
          </ul>
        </td>
    </tr>
    <tr>
        <td>
          <a href="https://github.com/farbelous/bootstrap-colorpicker">v3.x</a> <br>
          <a href="https://farbelous.github.io/bootstrap-colorpicker">Documentation</a>
        </td>
        <td>Bootstrap 4</td>
        <td>
          <ul>
            <li>jQuery >= 2.1.0</li>
            <li>Bootstrap CSS (input addon, popover)</li>
            <li>Bootstrap JS Bundle (popover)</li>
          </ul>
        </td>
    </tr>
  </thead>
</table>


Note that the plugin may work without Bootstrap if your code is not using any of the mentioned Bootstrap
dependencies.


## Basic example

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <link href="//cdn.rawgit.com/twbs/bootstrap/v4.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <link href="dist/css/bootstrap-colorpicker.css" rel="stylesheet">
</head>
<body>
  <div class="jumbotron">
      <h1>Bootstrap Colorpicker Demo</h1>
      <input id="demo" type="text" class="form-control" value="rgb(255, 128, 0)" />
  </div>
  <script src="//code.jquery.com/jquery-3.3.1.js"></script>
  <script src="//cdn.rawgit.com/twbs/bootstrap/v4.1.3/dist/js/bootstrap.bundle.min.js"></script>
  <script src="dist/js/bootstrap-colorpicker.js"></script>
  <script>
    $(function () {
      // Basic instantiation:
      $('#demo').colorpicker();
      
      // Example using an event, to change the color of the .jumbotron background:
      $('#demo').on('colorpickerChange', function(event) {
        $('.jumbotron').css('background-color', event.color.toString());
      });
    });
  </script>
</body>
```

## Contributions
* [Issues](https://github.com/farbelous/bootstrap-colorpicker/issues)
* [Pull Requests](https://github.com/farbelous/bootstrap-colorpicker/pulls)
* [Milestones](https://github.com/farbelous/bootstrap-colorpicker/milestones)
* [Planned Features](https://github.com/farbelous/bootstrap-colorpicker/projects)

This project exists thanks to all the [people who contribute](https://github.com/farbelous/bootstrap-colorpicker/graphs/contributors).

Please read [CONTRIBUTING](https://github.com/farbelous/bootstrap-colorpicker/blob/master/.github/CONTRIBUTING.md) 
before sending a pull request or issue.

## License
The MIT License (MIT).
Please see the [License File](https://github.com/farbelous/bootstrap-colorpicker/blob/master/LICENSE) for more information.

## Credits

Written and maintained by [Javi Aguilar](https://itsjavi.com) and all other contributors.

*Based on Stefan Petre's color picker (2013).*

*Thanks to JetBrains for supporting this project.*

Added public/bootstrap-colorpicker/dist/LICENSE.











































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MIT License

Copyright (c) 2017 Javi Aguilar

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Added public/bootstrap-colorpicker/dist/README.md.































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<a class="readme-logo" href="https://farbelous.io/bootstrap-colorpicker">
    <img alt="Logo by @reallinfo" src="logo.png" width="128px" />
</a>

# Bootstrap Colorpicker

<!--version-->

[Bootstrap Colorpicker](https://github.com/farbelous/bootstrap-colorpicker/) is a modular color picker plugin for Bootstrap 4.

[![Build Status](https://img.shields.io/travis/farbelous/bootstrap-colorpicker/master.svg?style=flat-square)](https://travis-ci.org/farbelous/bootstrap-colorpicker)
[![npm](https://img.shields.io/npm/v/bootstrap-colorpicker.svg?style=flat-square)](https://www.npmjs.com/package/bootstrap-colorpicker)

## Install
You can get the latest version in many different ways:

- Downloading [a ZIP file from the releases](https://github.com/farbelous/bootstrap-colorpicker/releases)
- Cloning using Git: `git clone https://github.com/farbelous/bootstrap-colorpicker.git`
- Installing via NPM: `npm install bootstrap-colorpicker`
- Installing via Yarn: `yarn add bootstrap-colorpicker`
- Installing via Composer: `composer require itsjavi/bootstrap-colorpicker`

Note that the `dist` files are only distributed via the NPM and Yarn installations.

For the rest methods, you will need to generate the files initializing the project with `yarn install`
and then building the code using `npm run build`.

## Versions

<table class="table table-bordered table-striped">
  <thead>
    <tr>
        <th>Colorpicker version</th>
        <th>Compatible Bootstrap version</th>
        <th>Dependencies</th>
    </tr>
  </thead>
  <tbody>
    <tr>
        <td>
          <a href="https://github.com/farbelous/bootstrap-colorpicker/tree/v2.x">v2.x</a> <br>
          <a href="https://farbelous.github.io/bootstrap-colorpicker/v2">Documentation</a>
        </td>
        <td>(any)</td>
        <td>
          <ul>
            <li>jQuery >= 1.10</li>
            <li>Bootstrap CSS (input addon)</li>
          </ul>
        </td>
    </tr>
    <tr>
        <td>
          <a href="https://github.com/farbelous/bootstrap-colorpicker">v3.x</a> <br>
          <a href="https://farbelous.github.io/bootstrap-colorpicker">Documentation</a>
        </td>
        <td>Bootstrap 4</td>
        <td>
          <ul>
            <li>jQuery >= 2.1.0</li>
            <li>Bootstrap CSS (input addon, popover)</li>
            <li>Bootstrap JS Bundle (popover)</li>
          </ul>
        </td>
    </tr>
  </thead>
</table>


Note that the plugin may work without Bootstrap if your code is not using any of the mentioned Bootstrap
dependencies.


## Basic example

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <link href="//cdn.rawgit.com/twbs/bootstrap/v4.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <link href="dist/css/bootstrap-colorpicker.css" rel="stylesheet">
</head>
<body>
  <div class="jumbotron">
      <h1>Bootstrap Colorpicker Demo</h1>
      <input id="demo" type="text" class="form-control" value="rgb(255, 128, 0)" />
  </div>
  <script src="//code.jquery.com/jquery-3.3.1.js"></script>
  <script src="//cdn.rawgit.com/twbs/bootstrap/v4.1.3/dist/js/bootstrap.bundle.min.js"></script>
  <script src="dist/js/bootstrap-colorpicker.js"></script>
  <script>
    $(function () {
      // Basic instantiation:
      $('#demo').colorpicker();
      
      // Example using an event, to change the color of the .jumbotron background:
      $('#demo').on('colorpickerChange', function(event) {
        $('.jumbotron').css('background-color', event.color.toString());
      });
    });
  </script>
</body>
```

## Contributions
* [Issues](https://github.com/farbelous/bootstrap-colorpicker/issues)
* [Pull Requests](https://github.com/farbelous/bootstrap-colorpicker/pulls)
* [Milestones](https://github.com/farbelous/bootstrap-colorpicker/milestones)
* [Planned Features](https://github.com/farbelous/bootstrap-colorpicker/projects)

This project exists thanks to all the [people who contribute](https://github.com/farbelous/bootstrap-colorpicker/graphs/contributors).

Please read [CONTRIBUTING](https://github.com/farbelous/bootstrap-colorpicker/blob/master/.github/CONTRIBUTING.md) 
before sending a pull request or issue.

## License
The MIT License (MIT).
Please see the [License File](https://github.com/farbelous/bootstrap-colorpicker/blob/master/LICENSE) for more information.

## Credits

Written and maintained by [Javi Aguilar](https://itsjavi.com) and all other contributors.

*Based on Stefan Petre's color picker (2013).*

*Thanks to JetBrains for supporting this project.*

Added public/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css.































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
/*!
 * Bootstrap Colorpicker - Bootstrap Colorpicker is a modular color picker plugin for Bootstrap 4.
 * @package bootstrap-colorpicker
 * @version v3.1.2
 * @license MIT
 * @link https://farbelous.github.io/bootstrap-colorpicker/
 * @link https://github.com/farbelous/bootstrap-colorpicker.git
 */
.colorpicker {
  position: relative;
  display: none;
  font-size: inherit;
  color: inherit;
  text-align: left;
  list-style: none;
  background-color: #ffffff;
  background-clip: padding-box;
  border: 1px solid rgba(0, 0, 0, 0.2);
  padding: .75rem .75rem;
  width: 148px;
  border-radius: 4px;
  -webkit-box-sizing: content-box;
          box-sizing: content-box; }

.colorpicker.colorpicker-disabled,
.colorpicker.colorpicker-disabled * {
  cursor: default !important; }

.colorpicker div {
  position: relative; }

.colorpicker-popup {
  position: absolute;
  top: 100%;
  left: 0;
  float: left;
  margin-top: 1px;
  z-index: 1060; }

.colorpicker-popup.colorpicker-bs-popover-content {
  position: relative;
  top: auto;
  left: auto;
  float: none;
  margin: 0;
  z-index: initial;
  border: none;
  padding: 0.25rem 0;
  border-radius: 0;
  background: none;
  -webkit-box-shadow: none;
          box-shadow: none; }

.colorpicker:before,
.colorpicker:after {
  content: "";
  display: table;
  clear: both;
  line-height: 0; }

.colorpicker-clear {
  clear: both;
  display: block; }

.colorpicker:before {
  content: '';
  display: inline-block;
  border-left: 7px solid transparent;
  border-right: 7px solid transparent;
  border-bottom: 7px solid #ccc;
  border-bottom-color: rgba(0, 0, 0, 0.2);
  position: absolute;
  top: -7px;
  left: auto;
  right: 6px; }

.colorpicker:after {
  content: '';
  display: inline-block;
  border-left: 6px solid transparent;
  border-right: 6px solid transparent;
  border-bottom: 6px solid #ffffff;
  position: absolute;
  top: -6px;
  left: auto;
  right: 7px; }

.colorpicker.colorpicker-with-alpha {
  width: 170px; }

.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
  display: block; }

.colorpicker-saturation {
  position: relative;
  width: 126px;
  height: 126px;
  /* FF3.6+ */
  /* Chrome,Safari4+ */
  /* Chrome10+,Safari5.1+ */
  /* Opera 11.10+ */
  /* IE10+ */
  background: -webkit-gradient(linear, left top, left bottom, from(transparent), to(black)), -webkit-gradient(linear, left top, right top, from(white), to(rgba(255, 255, 255, 0)));
  background: linear-gradient(to bottom, transparent 0%, black 100%), linear-gradient(to right, white 0%, rgba(255, 255, 255, 0) 100%);
  /* W3C */
  cursor: crosshair;
  float: left;
  -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
          box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
  margin-bottom: 6px; }
  .colorpicker-saturation .colorpicker-guide {
    display: block;
    height: 6px;
    width: 6px;
    border-radius: 6px;
    border: 1px solid #000;
    -webkit-box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
            box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
    position: absolute;
    top: 0;
    left: 0;
    margin: -3px 0 0 -3px; }

.colorpicker-hue,
.colorpicker-alpha {
  position: relative;
  width: 16px;
  height: 126px;
  float: left;
  cursor: row-resize;
  margin-left: 6px;
  margin-bottom: 6px; }

.colorpicker-alpha-color {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%; }

.colorpicker-hue,
.colorpicker-alpha-color {
  -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
          box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); }

.colorpicker-hue .colorpicker-guide,
.colorpicker-alpha .colorpicker-guide {
  display: block;
  height: 4px;
  background: rgba(255, 255, 255, 0.8);
  border: 1px solid rgba(0, 0, 0, 0.4);
  position: absolute;
  top: 0;
  left: 0;
  margin-left: -2px;
  margin-top: -2px;
  right: -2px;
  z-index: 1; }

.colorpicker-hue {
  /* FF3.6+ */
  /* Chrome,Safari4+ */
  /* Chrome10+,Safari5.1+ */
  /* Opera 11.10+ */
  /* IE10+ */
  background: -webkit-gradient(linear, left bottom, left top, from(red), color-stop(8%, #ff8000), color-stop(17%, yellow), color-stop(25%, #80ff00), color-stop(33%, lime), color-stop(42%, #00ff80), color-stop(50%, cyan), color-stop(58%, #0080ff), color-stop(67%, blue), color-stop(75%, #8000ff), color-stop(83%, magenta), color-stop(92%, #ff0080), to(red));
  background: linear-gradient(to top, red 0%, #ff8000 8%, yellow 17%, #80ff00 25%, lime 33%, #00ff80 42%, cyan 50%, #0080ff 58%, blue 67%, #8000ff 75%, magenta 83%, #ff0080 92%, red 100%);
  /* W3C */ }

.colorpicker-alpha {
  background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
  background-size: 10px 10px;
  background-position: 0 0, 5px 5px;
  display: none; }

.colorpicker-bar {
  min-height: 16px;
  margin: 6px 0 0 0;
  clear: both;
  text-align: center;
  font-size: 10px;
  line-height: normal;
  max-width: 100%;
  -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
          box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); }
  .colorpicker-bar:before {
    content: "";
    display: table;
    clear: both; }

.colorpicker-bar.colorpicker-bar-horizontal {
  height: 126px;
  width: 16px;
  margin: 0 0 6px 0;
  float: left; }

.colorpicker-input-addon {
  position: relative; }

.colorpicker-input-addon i {
  display: inline-block;
  cursor: pointer;
  vertical-align: text-top;
  height: 16px;
  width: 16px;
  position: relative; }

.colorpicker-input-addon:before {
  content: "";
  position: absolute;
  width: 16px;
  height: 16px;
  display: inline-block;
  vertical-align: text-top;
  background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
  background-size: 10px 10px;
  background-position: 0 0, 5px 5px; }

.colorpicker.colorpicker-inline {
  position: relative;
  display: inline-block;
  float: none;
  z-index: auto;
  vertical-align: text-bottom; }

.colorpicker.colorpicker-horizontal {
  width: 126px;
  height: auto; }

.colorpicker.colorpicker-horizontal .colorpicker-bar {
  width: 126px; }

.colorpicker.colorpicker-horizontal .colorpicker-saturation {
  float: none;
  margin-bottom: 0; }

.colorpicker.colorpicker-horizontal .colorpicker-hue,
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
  float: none;
  width: 126px;
  height: 16px;
  cursor: col-resize;
  margin-left: 0;
  margin-top: 6px;
  margin-bottom: 0; }

.colorpicker.colorpicker-horizontal .colorpicker-hue .colorpicker-guide,
.colorpicker.colorpicker-horizontal .colorpicker-alpha .colorpicker-guide {
  position: absolute;
  display: block;
  bottom: -2px;
  left: 0;
  right: auto;
  height: auto;
  width: 4px; }

.colorpicker.colorpicker-horizontal .colorpicker-hue {
  /* FF3.6+ */
  /* Chrome,Safari4+ */
  /* Chrome10+,Safari5.1+ */
  /* Opera 11.10+ */
  /* IE10+ */
  background: -webkit-gradient(linear, right top, left top, from(red), color-stop(8%, #ff8000), color-stop(17%, yellow), color-stop(25%, #80ff00), color-stop(33%, lime), color-stop(42%, #00ff80), color-stop(50%, cyan), color-stop(58%, #0080ff), color-stop(67%, blue), color-stop(75%, #8000ff), color-stop(83%, magenta), color-stop(92%, #ff0080), to(red));
  background: linear-gradient(to left, red 0%, #ff8000 8%, yellow 17%, #80ff00 25%, lime 33%, #00ff80 42%, cyan 50%, #0080ff 58%, blue 67%, #8000ff 75%, magenta 83%, #ff0080 92%, red 100%);
  /* W3C */ }

.colorpicker.colorpicker-horizontal .colorpicker-alpha {
  background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
  background-size: 10px 10px;
  background-position: 0 0, 5px 5px; }

.colorpicker-inline:before,
.colorpicker-no-arrow:before,
.colorpicker-popup.colorpicker-bs-popover-content:before {
  content: none;
  display: none; }

.colorpicker-inline:after,
.colorpicker-no-arrow:after,
.colorpicker-popup.colorpicker-bs-popover-content:after {
  content: none;
  display: none; }

.colorpicker-alpha,
.colorpicker-saturation,
.colorpicker-hue {
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none; }

.colorpicker.colorpicker-visible,
.colorpicker-alpha.colorpicker-visible,
.colorpicker-saturation.colorpicker-visible,
.colorpicker-hue.colorpicker-visible,
.colorpicker-bar.colorpicker-visible {
  display: block; }

.colorpicker.colorpicker-hidden,
.colorpicker-alpha.colorpicker-hidden,
.colorpicker-saturation.colorpicker-hidden,
.colorpicker-hue.colorpicker-hidden,
.colorpicker-bar.colorpicker-hidden {
  display: none; }

.colorpicker-inline.colorpicker-visible {
  display: inline-block; }

.colorpicker.colorpicker-disabled:after {
  border: none;
  content: '';
  display: block;
  width: 100%;
  height: 100%;
  background: rgba(233, 236, 239, 0.33);
  top: 0;
  left: 0;
  right: auto;
  z-index: 2;
  position: absolute; }

.colorpicker.colorpicker-disabled .colorpicker-guide {
  display: none; }

/** EXTENSIONS **/
.colorpicker-preview {
  background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
  background-size: 10px 10px;
  background-position: 0 0, 5px 5px; }

.colorpicker-preview > div {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%; }

.colorpicker-bar.colorpicker-swatches {
  -webkit-box-shadow: none;
          box-shadow: none;
  height: auto; }

.colorpicker-swatches--inner {
  clear: both;
  margin-top: -6px; }

.colorpicker-swatch {
  position: relative;
  cursor: pointer;
  float: left;
  height: 16px;
  width: 16px;
  margin-right: 6px;
  margin-top: 6px;
  margin-left: 0;
  display: block;
  -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
          box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
  background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
  background-size: 10px 10px;
  background-position: 0 0, 5px 5px; }

.colorpicker-swatch--inner {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%; }

.colorpicker-swatch:nth-of-type(7n+0) {
  margin-right: 0; }

.colorpicker-with-alpha .colorpicker-swatch:nth-of-type(7n+0) {
  margin-right: 6px; }

.colorpicker-with-alpha .colorpicker-swatch:nth-of-type(8n+0) {
  margin-right: 0; }

.colorpicker-horizontal .colorpicker-swatch:nth-of-type(6n+0) {
  margin-right: 0; }

.colorpicker-horizontal .colorpicker-swatch:nth-of-type(7n+0) {
  margin-right: 6px; }

.colorpicker-horizontal .colorpicker-swatch:nth-of-type(8n+0) {
  margin-right: 6px; }

.colorpicker-swatch:last-of-type:after {
  content: "";
  display: table;
  clear: both; }

*[dir='rtl'] .colorpicker-element input,
.colorpicker-element[dir='rtl'] input,
.colorpicker-element input[dir='rtl'] {
  direction: ltr;
  text-align: right; }

/*# sourceMappingURL=bootstrap-colorpicker.css.map */

Added public/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css.map.

cannot compute difference between binary files

Added public/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css.

cannot compute difference between binary files

Added public/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css.map.

cannot compute difference between binary files

Added public/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
/*!
 * Bootstrap Colorpicker - Bootstrap Colorpicker is a modular color picker plugin for Bootstrap 4.
 * @package bootstrap-colorpicker
 * @version v3.1.2
 * @license MIT
 * @link https://farbelous.github.io/bootstrap-colorpicker/
 * @link https://github.com/farbelous/bootstrap-colorpicker.git
 */
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory(require("jquery"));
	else if(typeof define === 'function' && define.amd)
		define("bootstrap-colorpicker", ["jquery"], factory);
	else if(typeof exports === 'object')
		exports["bootstrap-colorpicker"] = factory(require("jquery"));
	else
		root["bootstrap-colorpicker"] = factory(root["jQuery"]);
})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, {
/******/ 				configurable: false,
/******/ 				enumerable: true,
/******/ 				get: getter
/******/ 			});
/******/ 		}
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 7);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {

module.exports = __WEBPACK_EXTERNAL_MODULE_0__;

/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Colorpicker extension class.
 */
var Extension = function () {
  /**
   * @param {Colorpicker} colorpicker
   * @param {Object} options
   */
  function Extension(colorpicker) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Extension);

    /**
     * The colorpicker instance
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * Extension options
     *
     * @type {Object}
     */
    this.options = options;

    if (!(this.colorpicker.element && this.colorpicker.element.length)) {
      throw new Error('Extension: this.colorpicker.element is not valid');
    }

    this.colorpicker.element.on('colorpickerCreate.colorpicker-ext', _jquery2.default.proxy(this.onCreate, this));
    this.colorpicker.element.on('colorpickerDestroy.colorpicker-ext', _jquery2.default.proxy(this.onDestroy, this));
    this.colorpicker.element.on('colorpickerUpdate.colorpicker-ext', _jquery2.default.proxy(this.onUpdate, this));
    this.colorpicker.element.on('colorpickerChange.colorpicker-ext', _jquery2.default.proxy(this.onChange, this));
    this.colorpicker.element.on('colorpickerInvalid.colorpicker-ext', _jquery2.default.proxy(this.onInvalid, this));
    this.colorpicker.element.on('colorpickerShow.colorpicker-ext', _jquery2.default.proxy(this.onShow, this));
    this.colorpicker.element.on('colorpickerHide.colorpicker-ext', _jquery2.default.proxy(this.onHide, this));
    this.colorpicker.element.on('colorpickerEnable.colorpicker-ext', _jquery2.default.proxy(this.onEnable, this));
    this.colorpicker.element.on('colorpickerDisable.colorpicker-ext', _jquery2.default.proxy(this.onDisable, this));
  }

  /**
   * Function called every time a new color needs to be created.
   * Return false to skip this resolver and continue with other extensions' ones
   * or return anything else to consider the color resolved.
   *
   * @param {ColorItem|String|*} color
   * @param {boolean} realColor if true, the color should resolve into a real (not named) color code
   * @return {ColorItem|String|*}
   */


  _createClass(Extension, [{
    key: 'resolveColor',
    value: function resolveColor(color) {
      var realColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;

      return false;
    }

    /**
     * Method called after the colorpicker is created
     *
     * @listens Colorpicker#colorpickerCreate
     * @param {Event} event
     */

  }, {
    key: 'onCreate',
    value: function onCreate(event) {}
    // to be extended


    /**
     * Method called after the colorpicker is destroyed
     *
     * @listens Colorpicker#colorpickerDestroy
     * @param {Event} event
     */

  }, {
    key: 'onDestroy',
    value: function onDestroy(event) {
      this.colorpicker.element.off('.colorpicker-ext');
    }

    /**
     * Method called after the colorpicker is updated
     *
     * @listens Colorpicker#colorpickerUpdate
     * @param {Event} event
     */

  }, {
    key: 'onUpdate',
    value: function onUpdate(event) {}
    // to be extended


    /**
     * Method called after the colorpicker color is changed
     *
     * @listens Colorpicker#colorpickerChange
     * @param {Event} event
     */

  }, {
    key: 'onChange',
    value: function onChange(event) {}
    // to be extended


    /**
     * Method called when the colorpicker color is invalid
     *
     * @listens Colorpicker#colorpickerInvalid
     * @param {Event} event
     */

  }, {
    key: 'onInvalid',
    value: function onInvalid(event) {}
    // to be extended


    /**
     * Method called after the colorpicker is hidden
     *
     * @listens Colorpicker#colorpickerHide
     * @param {Event} event
     */

  }, {
    key: 'onHide',
    value: function onHide(event) {}
    // to be extended


    /**
     * Method called after the colorpicker is shown
     *
     * @listens Colorpicker#colorpickerShow
     * @param {Event} event
     */

  }, {
    key: 'onShow',
    value: function onShow(event) {}
    // to be extended


    /**
     * Method called after the colorpicker is disabled
     *
     * @listens Colorpicker#colorpickerDisable
     * @param {Event} event
     */

  }, {
    key: 'onDisable',
    value: function onDisable(event) {}
    // to be extended


    /**
     * Method called after the colorpicker is enabled
     *
     * @listens Colorpicker#colorpickerEnable
     * @param {Event} event
     */

  }, {
    key: 'onEnable',
    value: function onEnable(event) {
      // to be extended
    }
  }]);

  return Extension;
}();

exports.default = Extension;

/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ColorItem = exports.HSVAColor = undefined;

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * Color manipulation class, specific for Bootstrap Colorpicker
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      */


var _color = __webpack_require__(16);

var _color2 = _interopRequireDefault(_color);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * HSVA color data class, containing the hue, saturation, value and alpha
 * information.
 */
var HSVAColor = function () {
  /**
   * @param {number|int} h
   * @param {number|int} s
   * @param {number|int} v
   * @param {number|int} a
   */
  function HSVAColor(h, s, v, a) {
    _classCallCheck(this, HSVAColor);

    this.h = isNaN(h) ? 0 : h;
    this.s = isNaN(s) ? 0 : s;
    this.v = isNaN(v) ? 0 : v;
    this.a = isNaN(h) ? 1 : a;
  }

  _createClass(HSVAColor, [{
    key: 'toString',
    value: function toString() {
      return this.h + ', ' + this.s + '%, ' + this.v + '%, ' + this.a;
    }
  }]);

  return HSVAColor;
}();

/**
 * HSVA color manipulation
 */


var ColorItem = function () {
  _createClass(ColorItem, [{
    key: 'api',


    /**
     * Applies a method of the QixColor API and returns a new Color object or
     * the return value of the method call.
     *
     * If no argument is provided, the internal QixColor object is returned.
     *
     * @param {String} fn QixColor function name
     * @param args QixColor function arguments
     * @example let darkerColor = color.api('darken', 0.25);
     * @example let luminosity = color.api('luminosity');
     * @example color = color.api('negate');
     * @example let qColor = color.api().negate();
     * @returns {ColorItem|QixColor|*}
     */
    value: function api(fn) {
      for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        args[_key - 1] = arguments[_key];
      }

      if (arguments.length === 0) {
        return this._color;
      }

      var result = this._color[fn].apply(this._color, args);

      if (!(result instanceof _color2.default)) {
        // return result of the method call
        return result;
      }

      return new ColorItem(result, this.format);
    }

    /**
     * Returns the original ColorItem constructor data,
     * plus a 'valid' flag to know if it's valid or not.
     *
     * @returns {{color: *, format: String, valid: boolean}}
     */

  }, {
    key: 'original',
    get: function get() {
      return this._original;
    }

    /**
     * @param {ColorItem|HSVAColor|QixColor|String|*|null} color Color data
     * @param {String|null} format Color model to convert to by default. Supported: 'rgb', 'hsl', 'hex'.
     */

  }], [{
    key: 'HSVAColor',


    /**
     * Returns the HSVAColor class
     *
     * @static
     * @example let colorData = new ColorItem.HSVAColor(360, 100, 100, 1);
     * @returns {HSVAColor}
     */
    get: function get() {
      return HSVAColor;
    }
  }]);

  function ColorItem() {
    var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

    _classCallCheck(this, ColorItem);

    this.replace(color, format);
  }

  /**
   * Replaces the internal QixColor object with a new one.
   * This also replaces the internal original color data.
   *
   * @param {ColorItem|HSVAColor|QixColor|String|*|null} color Color data to be parsed (if needed)
   * @param {String|null} format Color model to convert to by default. Supported: 'rgb', 'hsl', 'hex'.
   * @example color.replace('rgb(255,0,0)', 'hsl');
   * @example color.replace(hsvaColorData);
   */


  _createClass(ColorItem, [{
    key: 'replace',
    value: function replace(color) {
      var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

      format = ColorItem.sanitizeFormat(format);

      /**
       * @type {{color: *, format: String}}
       * @private
       */
      this._original = {
        color: color,
        format: format,
        valid: true
      };
      /**
       * @type {QixColor}
       * @private
       */
      this._color = ColorItem.parse(color);

      if (this._color === null) {
        this._color = (0, _color2.default)();
        this._original.valid = false;
        return;
      }

      /**
       * @type {*|string}
       * @private
       */
      this._format = format ? format : ColorItem.isHex(color) ? 'hex' : this._color.model;
    }

    /**
     * Parses the color returning a Qix Color object or null if cannot be
     * parsed.
     *
     * @param {ColorItem|HSVAColor|QixColor|String|*|null} color Color data
     * @example let qColor = ColorItem.parse('rgb(255,0,0)');
     * @static
     * @returns {QixColor|null}
     */

  }, {
    key: 'isValid',


    /**
     * Returns true if the color is valid, false if not.
     *
     * @returns {boolean}
     */
    value: function isValid() {
      return this._original.valid === true;
    }

    /**
     * Hue value from 0 to 360
     *
     * @returns {int}
     */

  }, {
    key: 'setHueRatio',


    /**
     * Sets the hue ratio, where 1.0 is 0, 0.5 is 180 and 0.0 is 360.
     *
     * @ignore
     * @param {number} h Ratio from 1.0 to 0.0
     */
    value: function setHueRatio(h) {
      this.hue = (1 - h) * 360;
    }

    /**
     * Sets the saturation value
     *
     * @param {int} value Integer from 0 to 100
     */

  }, {
    key: 'setSaturationRatio',


    /**
     * Sets the saturation ratio, where 1.0 is 100 and 0.0 is 0.
     *
     * @ignore
     * @param {number} s Ratio from 0.0 to 1.0
     */
    value: function setSaturationRatio(s) {
      this.saturation = s * 100;
    }

    /**
     * Sets the 'value' channel value
     *
     * @param {int} value Integer from 0 to 100
     */

  }, {
    key: 'setValueRatio',


    /**
     * Sets the value ratio, where 1.0 is 0 and 0.0 is 100.
     *
     * @ignore
     * @param {number} v Ratio from 1.0 to 0.0
     */
    value: function setValueRatio(v) {
      this.value = (1 - v) * 100;
    }

    /**
     * Sets the alpha value. It will be rounded to 2 decimals.
     *
     * @param {int} value Float from 0.0 to 1.0
     */

  }, {
    key: 'setAlphaRatio',


    /**
     * Sets the alpha ratio, where 1.0 is 0.0 and 0.0 is 1.0.
     *
     * @ignore
     * @param {number} a Ratio from 1.0 to 0.0
     */
    value: function setAlphaRatio(a) {
      this.alpha = 1 - a;
    }

    /**
     * Sets the default color format
     *
     * @param {String} value Supported: 'rgb', 'hsl', 'hex'
     */

  }, {
    key: 'isDesaturated',


    /**
     * Returns true if the saturation value is zero, false otherwise
     *
     * @returns {boolean}
     */
    value: function isDesaturated() {
      return this.saturation === 0;
    }

    /**
     * Returns true if the alpha value is zero, false otherwise
     *
     * @returns {boolean}
     */

  }, {
    key: 'isTransparent',
    value: function isTransparent() {
      return this.alpha === 0;
    }

    /**
     * Returns true if the alpha value is numeric and less than 1, false otherwise
     *
     * @returns {boolean}
     */

  }, {
    key: 'hasTransparency',
    value: function hasTransparency() {
      return this.hasAlpha() && this.alpha < 1;
    }

    /**
     * Returns true if the alpha value is numeric, false otherwise
     *
     * @returns {boolean}
     */

  }, {
    key: 'hasAlpha',
    value: function hasAlpha() {
      return !isNaN(this.alpha);
    }

    /**
     * Returns a new HSVAColor object, based on the current color
     *
     * @returns {HSVAColor}
     */

  }, {
    key: 'toObject',
    value: function toObject() {
      return new HSVAColor(this.hue, this.saturation, this.value, this.alpha);
    }

    /**
     * Alias of toObject()
     *
     * @returns {HSVAColor}
     */

  }, {
    key: 'toHsva',
    value: function toHsva() {
      return this.toObject();
    }

    /**
     * Returns a new HSVAColor object with the ratio values (from 0.0 to 1.0),
     * based on the current color.
     *
     * @ignore
     * @returns {HSVAColor}
     */

  }, {
    key: 'toHsvaRatio',
    value: function toHsvaRatio() {
      return new HSVAColor(this.hue / 360, this.saturation / 100, this.value / 100, this.alpha);
    }

    /**
     * Converts the current color to its string representation,
     * using the internal format of this instance.
     *
     * @returns {String}
     */

  }, {
    key: 'toString',
    value: function toString() {
      return this.string();
    }

    /**
     * Converts the current color to its string representation,
     * using the given format.
     *
     * @param {String|null} format Format to convert to. If empty or null, the internal format will be used.
     * @returns {String}
     */

  }, {
    key: 'string',
    value: function string() {
      var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;

      format = ColorItem.sanitizeFormat(format ? format : this.format);

      if (!format) {
        return this._color.round().string();
      }

      if (this._color[format] === undefined) {
        throw new Error('Unsupported color format: \'' + format + '\'');
      }

      var str = this._color[format]();

      return str.round ? str.round().string() : str;
    }

    /**
     * Returns true if the given color values equals this one, false otherwise.
     * The format is not compared.
     * If any of the colors is invalid, the result will be false.
     *
     * @param {ColorItem|HSVAColor|QixColor|String|*|null} color Color data
     *
     * @returns {boolean}
     */

  }, {
    key: 'equals',
    value: function equals(color) {
      color = color instanceof ColorItem ? color : new ColorItem(color);

      if (!color.isValid() || !this.isValid()) {
        return false;
      }

      return this.hue === color.hue && this.saturation === color.saturation && this.value === color.value && this.alpha === color.alpha;
    }

    /**
     * Creates a copy of this instance
     *
     * @returns {ColorItem}
     */

  }, {
    key: 'getClone',
    value: function getClone() {
      return new ColorItem(this._color, this.format);
    }

    /**
     * Creates a copy of this instance, only copying the hue value,
     * and setting the others to its max value.
     *
     * @returns {ColorItem}
     */

  }, {
    key: 'getCloneHueOnly',
    value: function getCloneHueOnly() {
      return new ColorItem([this.hue, 100, 100, 1], this.format);
    }

    /**
     * Creates a copy of this instance setting the alpha to the max.
     *
     * @returns {ColorItem}
     */

  }, {
    key: 'getCloneOpaque',
    value: function getCloneOpaque() {
      return new ColorItem(this._color.alpha(1), this.format);
    }

    /**
     * Converts the color to a RGB string
     *
     * @returns {String}
     */

  }, {
    key: 'toRgbString',
    value: function toRgbString() {
      return this.string('rgb');
    }

    /**
     * Converts the color to a Hexadecimal string
     *
     * @returns {String}
     */

  }, {
    key: 'toHexString',
    value: function toHexString() {
      return this.string('hex');
    }

    /**
     * Converts the color to a HSL string
     *
     * @returns {String}
     */

  }, {
    key: 'toHslString',
    value: function toHslString() {
      return this.string('hsl');
    }

    /**
     * Returns true if the color is dark, false otherwhise.
     * This is useful to decide a text color.
     *
     * @returns {boolean}
     */

  }, {
    key: 'isDark',
    value: function isDark() {
      return this._color.isDark();
    }

    /**
     * Returns true if the color is light, false otherwhise.
     * This is useful to decide a text color.
     *
     * @returns {boolean}
     */

  }, {
    key: 'isLight',
    value: function isLight() {
      return this._color.isLight();
    }

    /**
     * Generates a list of colors using the given hue-based formula or the given array of hue values.
     * Hue formulas can be extended using ColorItem.colorFormulas static property.
     *
     * @param {String|Number[]} formula Examples: 'complementary', 'triad', 'tetrad', 'splitcomplement', [180, 270]
     * @example let colors = color.generate('triad');
     * @example let colors = color.generate([45, 80, 112, 200]);
     * @returns {ColorItem[]}
     */

  }, {
    key: 'generate',
    value: function generate(formula) {
      var hues = [];

      if (Array.isArray(formula)) {
        hues = formula;
      } else if (!ColorItem.colorFormulas.hasOwnProperty(formula)) {
        throw new Error('No color formula found with the name \'' + formula + '\'.');
      } else {
        hues = ColorItem.colorFormulas[formula];
      }

      var colors = [],
          mainColor = this._color,
          format = this.format;

      hues.forEach(function (hue) {
        var levels = [hue ? (mainColor.hue() + hue) % 360 : mainColor.hue(), mainColor.saturationv(), mainColor.value(), mainColor.alpha()];

        colors.push(new ColorItem(levels, format));
      });

      return colors;
    }
  }, {
    key: 'hue',
    get: function get() {
      return this._color.hue();
    }

    /**
     * Saturation value from 0 to 100
     *
     * @returns {int}
     */
    ,


    /**
     * Sets the hue value
     *
     * @param {int} value Integer from 0 to 360
     */
    set: function set(value) {
      this._color = this._color.hue(value);
    }
  }, {
    key: 'saturation',
    get: function get() {
      return this._color.saturationv();
    }

    /**
     * Value channel value from 0 to 100
     *
     * @returns {int}
     */
    ,
    set: function set(value) {
      this._color = this._color.saturationv(value);
    }
  }, {
    key: 'value',
    get: function get() {
      return this._color.value();
    }

    /**
     * Alpha value from 0.0 to 1.0
     *
     * @returns {number}
     */
    ,
    set: function set(value) {
      this._color = this._color.value(value);
    }
  }, {
    key: 'alpha',
    get: function get() {
      var a = this._color.alpha();

      return isNaN(a) ? 1 : a;
    }

    /**
     * Default color format to convert to when calling toString() or string()
     *
     * @returns {String} 'rgb', 'hsl', 'hex' or ''
     */
    ,
    set: function set(value) {
      // 2 decimals max
      this._color = this._color.alpha(Math.round(value * 100) / 100);
    }
  }, {
    key: 'format',
    get: function get() {
      return this._format ? this._format : this._color.model;
    },
    set: function set(value) {
      this._format = ColorItem.sanitizeFormat(value);
    }
  }], [{
    key: 'parse',
    value: function parse(color) {
      if (color instanceof _color2.default) {
        return color;
      }

      if (color instanceof ColorItem) {
        return color._color;
      }

      var format = null;

      if (color instanceof HSVAColor) {
        color = [color.h, color.s, color.v, isNaN(color.a) ? 1 : color.a];
      } else {
        color = ColorItem.sanitizeString(color);
      }

      if (color === null) {
        return null;
      }

      if (Array.isArray(color)) {
        format = 'hsv';
      }

      try {
        return (0, _color2.default)(color, format);
      } catch (e) {
        return null;
      }
    }

    /**
     * Sanitizes a color string, adding missing hash to hexadecimal colors
     * and converting 'transparent' to a color code.
     *
     * @param {String|*} str Color string
     * @example let colorStr = ColorItem.sanitizeString('ffaa00');
     * @static
     * @returns {String|*}
     */

  }, {
    key: 'sanitizeString',
    value: function sanitizeString(str) {
      if (!(typeof str === 'string' || str instanceof String)) {
        return str;
      }

      if (str.match(/^[0-9a-f]{2,}$/i)) {
        return '#' + str;
      }

      if (str.toLowerCase() === 'transparent') {
        return '#FFFFFF00';
      }

      return str;
    }

    /**
     * Detects if a value is a string and a color in hexadecimal format (in any variant).
     *
     * @param {String} str
     * @example ColorItem.isHex('rgba(0,0,0)'); // false
     * @example ColorItem.isHex('ffaa00'); // true
     * @example ColorItem.isHex('#ffaa00'); // true
     * @static
     * @returns {boolean}
     */

  }, {
    key: 'isHex',
    value: function isHex(str) {
      if (!(typeof str === 'string' || str instanceof String)) {
        return false;
      }

      return !!str.match(/^#?[0-9a-f]{2,}$/i);
    }

    /**
     * Sanitizes a color format to one supported by web browsers.
     * Returns an empty string of the format can't be recognised.
     *
     * @param {String|*} format
     * @example ColorItem.sanitizeFormat('rgba'); // 'rgb'
     * @example ColorItem.isHex('hex8'); // 'hex'
     * @example ColorItem.isHex('invalid'); // ''
     * @static
     * @returns {String} 'rgb', 'hsl', 'hex' or ''.
     */

  }, {
    key: 'sanitizeFormat',
    value: function sanitizeFormat(format) {
      switch (format) {
        case 'hex':
        case 'hex3':
        case 'hex4':
        case 'hex6':
        case 'hex8':
          return 'hex';
        case 'rgb':
        case 'rgba':
        case 'keyword':
        case 'name':
          return 'rgb';
        case 'hsl':
        case 'hsla':
        case 'hsv':
        case 'hsva':
        case 'hwb': // HWB this is supported by Qix Color, but not by browsers
        case 'hwba':
          return 'hsl';
        default:
          return '';
      }
    }
  }]);

  return ColorItem;
}();

/**
 * List of hue-based color formulas used by ColorItem.prototype.generate()
 *
 * @static
 * @type {{complementary: number[], triad: number[], tetrad: number[], splitcomplement: number[]}}
 */


ColorItem.colorFormulas = {
  complementary: [180],
  triad: [0, 120, 240],
  tetrad: [0, 90, 180, 270],
  splitcomplement: [0, 72, 216]
};

exports.default = ColorItem;
exports.HSVAColor = HSVAColor;
exports.ColorItem = ColorItem;

/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";

/**
 * @module
 */

// adjust these values accordingly to the sass vars

Object.defineProperty(exports, "__esModule", {
  value: true
});
var sassVars = {
  'bar_size_short': 16,
  'base_margin': 6,
  'columns': 6
};

var sliderSize = sassVars.bar_size_short * sassVars.columns + sassVars.base_margin * (sassVars.columns - 1);

/**
 * Colorpicker default options
 */
exports.default = {
  /**
   * Custom class to be added to the `.colorpicker-element` element
   *
   * @type {String|null}
   * @default null
   */
  customClass: null,
  /**
   * Sets a initial color, ignoring the one from the element/input value or the data-color attribute.
   *
   * @type {(String|ColorItem|boolean)}
   * @default false
   */
  color: false,
  /**
   * Fallback color to use when the given color is invalid.
   * If false, the latest valid color will be used as a fallback.
   *
   * @type {String|ColorItem|boolean}
   * @default false
   */
  fallbackColor: false,
  /**
   * Forces an specific color format. If 'auto', it will be automatically detected the first time only,
   * but if null it will be always recalculated.
   *
   * Note that the ending 'a' of the format meaning "alpha" has currently no effect, meaning that rgb is the same as
   * rgba excepting if the alpha channel is disabled (see useAlpha).
   *
   * @type {('rgb'|'hex'|'hsl'|'auto'|null)}
   * @default 'auto'
   */
  format: 'auto',
  /**
   * Horizontal mode layout.
   *
   * If true, the hue and alpha channel bars will be rendered horizontally, above the saturation selector.
   *
   * @type {boolean}
   * @default false
   */
  horizontal: false,
  /**
   * Forces to show the colorpicker as an inline element.
   *
   * Note that if there is no container specified, the inline element
   * will be added to the body, so you may want to set the container option.
   *
   * @type {boolean}
   * @default false
   */
  inline: false,
  /**
   * Container where the colorpicker is appended to in the DOM.
   *
   * If is a string (CSS selector), the colorpicker will be placed inside this container.
   * If true, the `.colorpicker-element` element itself will be used as the container.
   * If false, the document body is used as the container, unless it is a popover (in this case it is appended to the
   * popover body instead).
   *
   * @type {String|boolean}
   * @default false
   */
  container: false,
  /**
   * Bootstrap Popover options.
   * The trigger, content and html options are always ignored.
   *
   * @type {boolean}
   * @default Object
   */
  popover: {
    animation: true,
    placement: 'bottom',
    fallbackPlacement: 'flip'
  },
  /**
   * If true, loads the 'debugger' extension automatically, which logs the events in the console
   * @type {boolean}
   * @default false
   */
  debug: false,
  /**
   * Child CSS selector for the colorpicker input.
   *
   * @type {String}
   * @default 'input'
   */
  input: 'input',
  /**
   * Child CSS selector for the colorpicker addon.
   * If it exists, the child <i> element background will be changed on color change.
   *
   * @type {String}
   * @default '.colorpicker-trigger, .colorpicker-input-addon'
   */
  addon: '.colorpicker-input-addon',
  /**
   * If true, the input content will be replaced always with a valid color,
   * if false, the invalid color will be left in the input,
   *   while the internal color object will still resolve into a valid one.
   *
   * @type {boolean}
   * @default true
   */
  autoInputFallback: true,
  /**
   * If true a hash will be prepended to hexadecimal colors.
   * If false, the hash will be removed.
   * This only affects the input values in hexadecimal format.
   *
   * @type {boolean}
   * @default true
   */
  useHashPrefix: true,
  /**
   * If true, the alpha channel bar will be displayed no matter what.
   *
   * If false, it will be always hidden and alpha channel will be disabled also programmatically, meaning that
   * the selected or typed color will be always opaque.
   *
   * If null, the alpha channel will be automatically disabled/enabled depending if the initial color format supports
   * alpha or not.
   *
   * @type {boolean}
   * @default true
   */
  useAlpha: true,
  /**
   * Colorpicker widget template
   * @type {String}
   * @example
   * <!-- This is the default template: -->
   * <div class="colorpicker">
   *   <div class="colorpicker-saturation"><i class="colorpicker-guide"></i></div>
   *   <div class="colorpicker-hue"><i class="colorpicker-guide"></i></div>
   *   <div class="colorpicker-alpha">
   *     <div class="colorpicker-alpha-color"></div>
   *     <i class="colorpicker-guide"></i>
   *   </div>
   * </div>
   */
  template: '<div class="colorpicker">\n      <div class="colorpicker-saturation"><i class="colorpicker-guide"></i></div>\n      <div class="colorpicker-hue"><i class="colorpicker-guide"></i></div>\n      <div class="colorpicker-alpha">\n        <div class="colorpicker-alpha-color"></div>\n        <i class="colorpicker-guide"></i>\n      </div>\n    </div>',
  /**
   *
   * Associative object with the extension class name and its config.
   * Colorpicker comes with many bundled extensions: debugger, palette, preview and swatches (a superset of palette).
   *
   * @type {Object[]}
   * @example
   *   extensions: [
   *     {
   *       name: 'swatches'
   *       options: {
   *         colors: {
   *           'primary': '#337ab7',
   *           'success': '#5cb85c',
   *           'info': '#5bc0de',
   *           'warning': '#f0ad4e',
   *           'danger': '#d9534f'
   *         },
   *         namesAsValues: true
   *       }
   *     }
   *   ]
   */
  extensions: [{
    name: 'preview',
    options: {
      showText: true
    }
  }],
  /**
   * Vertical sliders configuration
   * @type {Object}
   */
  sliders: {
    saturation: {
      selector: '.colorpicker-saturation',
      maxLeft: sliderSize,
      maxTop: sliderSize,
      callLeft: 'setSaturationRatio',
      callTop: 'setValueRatio'
    },
    hue: {
      selector: '.colorpicker-hue',
      maxLeft: 0,
      maxTop: sliderSize,
      callLeft: false,
      callTop: 'setHueRatio'
    },
    alpha: {
      selector: '.colorpicker-alpha',
      childSelector: '.colorpicker-alpha-color',
      maxLeft: 0,
      maxTop: sliderSize,
      callLeft: false,
      callTop: 'setAlphaRatio'
    }
  },
  /**
   * Horizontal sliders configuration
   * @type {Object}
   */
  slidersHorz: {
    saturation: {
      selector: '.colorpicker-saturation',
      maxLeft: sliderSize,
      maxTop: sliderSize,
      callLeft: 'setSaturationRatio',
      callTop: 'setValueRatio'
    },
    hue: {
      selector: '.colorpicker-hue',
      maxLeft: sliderSize,
      maxTop: 0,
      callLeft: 'setHueRatio',
      callTop: false
    },
    alpha: {
      selector: '.colorpicker-alpha',
      childSelector: '.colorpicker-alpha-color',
      maxLeft: sliderSize,
      maxTop: 0,
      callLeft: 'setAlphaRatio',
      callTop: false
    }
  }
};

/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _Extension2 = __webpack_require__(1);

var _Extension3 = _interopRequireDefault(_Extension2);

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var defaults = {
  /**
   * Key-value pairs defining a color alias and its CSS color representation.
   *
   * They can also be just an array of values. In that case, no special names are used, only the real colors.
   *
   * @type {Object|Array}
   * @default null
   * @example
   *  {
   *   'black': '#000000',
   *   'white': '#ffffff',
   *   'red': '#FF0000',
   *   'default': '#777777',
   *   'primary': '#337ab7',
   *   'success': '#5cb85c',
   *   'info': '#5bc0de',
   *   'warning': '#f0ad4e',
   *   'danger': '#d9534f'
   *  }
   *
   * @example ['#f0ad4e', '#337ab7', '#5cb85c']
   */
  colors: null,
  /**
   * If true, when a color swatch is selected the name (alias) will be used as input value,
   * otherwise the swatch real color value will be used.
   *
   * @type {boolean}
   * @default true
   */
  namesAsValues: true
};

/**
 * Palette extension
 * @ignore
 */

var Palette = function (_Extension) {
  _inherits(Palette, _Extension);

  _createClass(Palette, [{
    key: 'colors',


    /**
     * @returns {Object|Array}
     */
    get: function get() {
      return this.options.colors;
    }
  }]);

  function Palette(colorpicker) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Palette);

    var _this = _possibleConstructorReturn(this, (Palette.__proto__ || Object.getPrototypeOf(Palette)).call(this, colorpicker, _jquery2.default.extend(true, {}, defaults, options)));

    if (!Array.isArray(_this.options.colors) && _typeof(_this.options.colors) !== 'object') {
      _this.options.colors = null;
    }
    return _this;
  }

  /**
   * @returns {int}
   */


  _createClass(Palette, [{
    key: 'getLength',
    value: function getLength() {
      if (!this.options.colors) {
        return 0;
      }

      if (Array.isArray(this.options.colors)) {
        return this.options.colors.length;
      }

      if (_typeof(this.options.colors) === 'object') {
        return Object.keys(this.options.colors).length;
      }

      return 0;
    }
  }, {
    key: 'resolveColor',
    value: function resolveColor(color) {
      var realColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;

      if (this.getLength() <= 0) {
        return false;
      }

      // Array of colors
      if (Array.isArray(this.options.colors)) {
        if (this.options.colors.indexOf(color) >= 0) {
          return color;
        }
        if (this.options.colors.indexOf(color.toUpperCase()) >= 0) {
          return color.toUpperCase();
        }
        if (this.options.colors.indexOf(color.toLowerCase()) >= 0) {
          return color.toLowerCase();
        }
        return false;
      }

      if (_typeof(this.options.colors) !== 'object') {
        return false;
      }

      // Map of objects
      if (!this.options.namesAsValues || realColor) {
        return this.getValue(color, false);
      }
      return this.getName(color, this.getName('#' + color));
    }

    /**
     * Given a color value, returns the corresponding color name or defaultValue.
     *
     * @param {String} value
     * @param {*} defaultValue
     * @returns {*}
     */

  }, {
    key: 'getName',
    value: function getName(value) {
      var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

      if (!(typeof value === 'string') || !this.options.colors) {
        return defaultValue;
      }
      for (var name in this.options.colors) {
        if (!this.options.colors.hasOwnProperty(name)) {
          continue;
        }
        if (this.options.colors[name].toLowerCase() === value.toLowerCase()) {
          return name;
        }
      }
      return defaultValue;
    }

    /**
     * Given a color name, returns the corresponding color value or defaultValue.
     *
     * @param {String} name
     * @param {*} defaultValue
     * @returns {*}
     */

  }, {
    key: 'getValue',
    value: function getValue(name) {
      var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

      if (!(typeof name === 'string') || !this.options.colors) {
        return defaultValue;
      }
      if (this.options.colors.hasOwnProperty(name)) {
        return this.options.colors[name];
      }
      return defaultValue;
    }
  }]);

  return Palette;
}(_Extension3.default);

exports.default = Palette;

/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = {
	"aliceblue": [240, 248, 255],
	"antiquewhite": [250, 235, 215],
	"aqua": [0, 255, 255],
	"aquamarine": [127, 255, 212],
	"azure": [240, 255, 255],
	"beige": [245, 245, 220],
	"bisque": [255, 228, 196],
	"black": [0, 0, 0],
	"blanchedalmond": [255, 235, 205],
	"blue": [0, 0, 255],
	"blueviolet": [138, 43, 226],
	"brown": [165, 42, 42],
	"burlywood": [222, 184, 135],
	"cadetblue": [95, 158, 160],
	"chartreuse": [127, 255, 0],
	"chocolate": [210, 105, 30],
	"coral": [255, 127, 80],
	"cornflowerblue": [100, 149, 237],
	"cornsilk": [255, 248, 220],
	"crimson": [220, 20, 60],
	"cyan": [0, 255, 255],
	"darkblue": [0, 0, 139],
	"darkcyan": [0, 139, 139],
	"darkgoldenrod": [184, 134, 11],
	"darkgray": [169, 169, 169],
	"darkgreen": [0, 100, 0],
	"darkgrey": [169, 169, 169],
	"darkkhaki": [189, 183, 107],
	"darkmagenta": [139, 0, 139],
	"darkolivegreen": [85, 107, 47],
	"darkorange": [255, 140, 0],
	"darkorchid": [153, 50, 204],
	"darkred": [139, 0, 0],
	"darksalmon": [233, 150, 122],
	"darkseagreen": [143, 188, 143],
	"darkslateblue": [72, 61, 139],
	"darkslategray": [47, 79, 79],
	"darkslategrey": [47, 79, 79],
	"darkturquoise": [0, 206, 209],
	"darkviolet": [148, 0, 211],
	"deeppink": [255, 20, 147],
	"deepskyblue": [0, 191, 255],
	"dimgray": [105, 105, 105],
	"dimgrey": [105, 105, 105],
	"dodgerblue": [30, 144, 255],
	"firebrick": [178, 34, 34],
	"floralwhite": [255, 250, 240],
	"forestgreen": [34, 139, 34],
	"fuchsia": [255, 0, 255],
	"gainsboro": [220, 220, 220],
	"ghostwhite": [248, 248, 255],
	"gold": [255, 215, 0],
	"goldenrod": [218, 165, 32],
	"gray": [128, 128, 128],
	"green": [0, 128, 0],
	"greenyellow": [173, 255, 47],
	"grey": [128, 128, 128],
	"honeydew": [240, 255, 240],
	"hotpink": [255, 105, 180],
	"indianred": [205, 92, 92],
	"indigo": [75, 0, 130],
	"ivory": [255, 255, 240],
	"khaki": [240, 230, 140],
	"lavender": [230, 230, 250],
	"lavenderblush": [255, 240, 245],
	"lawngreen": [124, 252, 0],
	"lemonchiffon": [255, 250, 205],
	"lightblue": [173, 216, 230],
	"lightcoral": [240, 128, 128],
	"lightcyan": [224, 255, 255],
	"lightgoldenrodyellow": [250, 250, 210],
	"lightgray": [211, 211, 211],
	"lightgreen": [144, 238, 144],
	"lightgrey": [211, 211, 211],
	"lightpink": [255, 182, 193],
	"lightsalmon": [255, 160, 122],
	"lightseagreen": [32, 178, 170],
	"lightskyblue": [135, 206, 250],
	"lightslategray": [119, 136, 153],
	"lightslategrey": [119, 136, 153],
	"lightsteelblue": [176, 196, 222],
	"lightyellow": [255, 255, 224],
	"lime": [0, 255, 0],
	"limegreen": [50, 205, 50],
	"linen": [250, 240, 230],
	"magenta": [255, 0, 255],
	"maroon": [128, 0, 0],
	"mediumaquamarine": [102, 205, 170],
	"mediumblue": [0, 0, 205],
	"mediumorchid": [186, 85, 211],
	"mediumpurple": [147, 112, 219],
	"mediumseagreen": [60, 179, 113],
	"mediumslateblue": [123, 104, 238],
	"mediumspringgreen": [0, 250, 154],
	"mediumturquoise": [72, 209, 204],
	"mediumvioletred": [199, 21, 133],
	"midnightblue": [25, 25, 112],
	"mintcream": [245, 255, 250],
	"mistyrose": [255, 228, 225],
	"moccasin": [255, 228, 181],
	"navajowhite": [255, 222, 173],
	"navy": [0, 0, 128],
	"oldlace": [253, 245, 230],
	"olive": [128, 128, 0],
	"olivedrab": [107, 142, 35],
	"orange": [255, 165, 0],
	"orangered": [255, 69, 0],
	"orchid": [218, 112, 214],
	"palegoldenrod": [238, 232, 170],
	"palegreen": [152, 251, 152],
	"paleturquoise": [175, 238, 238],
	"palevioletred": [219, 112, 147],
	"papayawhip": [255, 239, 213],
	"peachpuff": [255, 218, 185],
	"peru": [205, 133, 63],
	"pink": [255, 192, 203],
	"plum": [221, 160, 221],
	"powderblue": [176, 224, 230],
	"purple": [128, 0, 128],
	"rebeccapurple": [102, 51, 153],
	"red": [255, 0, 0],
	"rosybrown": [188, 143, 143],
	"royalblue": [65, 105, 225],
	"saddlebrown": [139, 69, 19],
	"salmon": [250, 128, 114],
	"sandybrown": [244, 164, 96],
	"seagreen": [46, 139, 87],
	"seashell": [255, 245, 238],
	"sienna": [160, 82, 45],
	"silver": [192, 192, 192],
	"skyblue": [135, 206, 235],
	"slateblue": [106, 90, 205],
	"slategray": [112, 128, 144],
	"slategrey": [112, 128, 144],
	"snow": [255, 250, 250],
	"springgreen": [0, 255, 127],
	"steelblue": [70, 130, 180],
	"tan": [210, 180, 140],
	"teal": [0, 128, 128],
	"thistle": [216, 191, 216],
	"tomato": [255, 99, 71],
	"turquoise": [64, 224, 208],
	"violet": [238, 130, 238],
	"wheat": [245, 222, 179],
	"white": [255, 255, 255],
	"whitesmoke": [245, 245, 245],
	"yellow": [255, 255, 0],
	"yellowgreen": [154, 205, 50]
};


/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

/* MIT license */
var cssKeywords = __webpack_require__(5);

// NOTE: conversions should only return primitive values (i.e. arrays, or
//       values that give correct `typeof` results).
//       do not use box values types (i.e. Number(), String(), etc.)

var reverseKeywords = {};
for (var key in cssKeywords) {
	if (cssKeywords.hasOwnProperty(key)) {
		reverseKeywords[cssKeywords[key]] = key;
	}
}

var convert = module.exports = {
	rgb: {channels: 3, labels: 'rgb'},
	hsl: {channels: 3, labels: 'hsl'},
	hsv: {channels: 3, labels: 'hsv'},
	hwb: {channels: 3, labels: 'hwb'},
	cmyk: {channels: 4, labels: 'cmyk'},
	xyz: {channels: 3, labels: 'xyz'},
	lab: {channels: 3, labels: 'lab'},
	lch: {channels: 3, labels: 'lch'},
	hex: {channels: 1, labels: ['hex']},
	keyword: {channels: 1, labels: ['keyword']},
	ansi16: {channels: 1, labels: ['ansi16']},
	ansi256: {channels: 1, labels: ['ansi256']},
	hcg: {channels: 3, labels: ['h', 'c', 'g']},
	apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
	gray: {channels: 1, labels: ['gray']}
};

// hide .channels and .labels properties
for (var model in convert) {
	if (convert.hasOwnProperty(model)) {
		if (!('channels' in convert[model])) {
			throw new Error('missing channels property: ' + model);
		}

		if (!('labels' in convert[model])) {
			throw new Error('missing channel labels property: ' + model);
		}

		if (convert[model].labels.length !== convert[model].channels) {
			throw new Error('channel and label counts mismatch: ' + model);
		}

		var channels = convert[model].channels;
		var labels = convert[model].labels;
		delete convert[model].channels;
		delete convert[model].labels;
		Object.defineProperty(convert[model], 'channels', {value: channels});
		Object.defineProperty(convert[model], 'labels', {value: labels});
	}
}

convert.rgb.hsl = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var min = Math.min(r, g, b);
	var max = Math.max(r, g, b);
	var delta = max - min;
	var h;
	var s;
	var l;

	if (max === min) {
		h = 0;
	} else if (r === max) {
		h = (g - b) / delta;
	} else if (g === max) {
		h = 2 + (b - r) / delta;
	} else if (b === max) {
		h = 4 + (r - g) / delta;
	}

	h = Math.min(h * 60, 360);

	if (h < 0) {
		h += 360;
	}

	l = (min + max) / 2;

	if (max === min) {
		s = 0;
	} else if (l <= 0.5) {
		s = delta / (max + min);
	} else {
		s = delta / (2 - max - min);
	}

	return [h, s * 100, l * 100];
};

convert.rgb.hsv = function (rgb) {
	var rdif;
	var gdif;
	var bdif;
	var h;
	var s;

	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var v = Math.max(r, g, b);
	var diff = v - Math.min(r, g, b);
	var diffc = function (c) {
		return (v - c) / 6 / diff + 1 / 2;
	};

	if (diff === 0) {
		h = s = 0;
	} else {
		s = diff / v;
		rdif = diffc(r);
		gdif = diffc(g);
		bdif = diffc(b);

		if (r === v) {
			h = bdif - gdif;
		} else if (g === v) {
			h = (1 / 3) + rdif - bdif;
		} else if (b === v) {
			h = (2 / 3) + gdif - rdif;
		}
		if (h < 0) {
			h += 1;
		} else if (h > 1) {
			h -= 1;
		}
	}

	return [
		h * 360,
		s * 100,
		v * 100
	];
};

convert.rgb.hwb = function (rgb) {
	var r = rgb[0];
	var g = rgb[1];
	var b = rgb[2];
	var h = convert.rgb.hsl(rgb)[0];
	var w = 1 / 255 * Math.min(r, Math.min(g, b));

	b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));

	return [h, w * 100, b * 100];
};

convert.rgb.cmyk = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var c;
	var m;
	var y;
	var k;

	k = Math.min(1 - r, 1 - g, 1 - b);
	c = (1 - r - k) / (1 - k) || 0;
	m = (1 - g - k) / (1 - k) || 0;
	y = (1 - b - k) / (1 - k) || 0;

	return [c * 100, m * 100, y * 100, k * 100];
};

/**
 * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
 * */
function comparativeDistance(x, y) {
	return (
		Math.pow(x[0] - y[0], 2) +
		Math.pow(x[1] - y[1], 2) +
		Math.pow(x[2] - y[2], 2)
	);
}

convert.rgb.keyword = function (rgb) {
	var reversed = reverseKeywords[rgb];
	if (reversed) {
		return reversed;
	}

	var currentClosestDistance = Infinity;
	var currentClosestKeyword;

	for (var keyword in cssKeywords) {
		if (cssKeywords.hasOwnProperty(keyword)) {
			var value = cssKeywords[keyword];

			// Compute comparative distance
			var distance = comparativeDistance(rgb, value);

			// Check if its less, if so set as closest
			if (distance < currentClosestDistance) {
				currentClosestDistance = distance;
				currentClosestKeyword = keyword;
			}
		}
	}

	return currentClosestKeyword;
};

convert.keyword.rgb = function (keyword) {
	return cssKeywords[keyword];
};

convert.rgb.xyz = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;

	// assume sRGB
	r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
	g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
	b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);

	var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
	var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
	var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);

	return [x * 100, y * 100, z * 100];
};

convert.rgb.lab = function (rgb) {
	var xyz = convert.rgb.xyz(rgb);
	var x = xyz[0];
	var y = xyz[1];
	var z = xyz[2];
	var l;
	var a;
	var b;

	x /= 95.047;
	y /= 100;
	z /= 108.883;

	x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
	y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
	z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);

	l = (116 * y) - 16;
	a = 500 * (x - y);
	b = 200 * (y - z);

	return [l, a, b];
};

convert.hsl.rgb = function (hsl) {
	var h = hsl[0] / 360;
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var t1;
	var t2;
	var t3;
	var rgb;
	var val;

	if (s === 0) {
		val = l * 255;
		return [val, val, val];
	}

	if (l < 0.5) {
		t2 = l * (1 + s);
	} else {
		t2 = l + s - l * s;
	}

	t1 = 2 * l - t2;

	rgb = [0, 0, 0];
	for (var i = 0; i < 3; i++) {
		t3 = h + 1 / 3 * -(i - 1);
		if (t3 < 0) {
			t3++;
		}
		if (t3 > 1) {
			t3--;
		}

		if (6 * t3 < 1) {
			val = t1 + (t2 - t1) * 6 * t3;
		} else if (2 * t3 < 1) {
			val = t2;
		} else if (3 * t3 < 2) {
			val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
		} else {
			val = t1;
		}

		rgb[i] = val * 255;
	}

	return rgb;
};

convert.hsl.hsv = function (hsl) {
	var h = hsl[0];
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var smin = s;
	var lmin = Math.max(l, 0.01);
	var sv;
	var v;

	l *= 2;
	s *= (l <= 1) ? l : 2 - l;
	smin *= lmin <= 1 ? lmin : 2 - lmin;
	v = (l + s) / 2;
	sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);

	return [h, sv * 100, v * 100];
};

convert.hsv.rgb = function (hsv) {
	var h = hsv[0] / 60;
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;
	var hi = Math.floor(h) % 6;

	var f = h - Math.floor(h);
	var p = 255 * v * (1 - s);
	var q = 255 * v * (1 - (s * f));
	var t = 255 * v * (1 - (s * (1 - f)));
	v *= 255;

	switch (hi) {
		case 0:
			return [v, t, p];
		case 1:
			return [q, v, p];
		case 2:
			return [p, v, t];
		case 3:
			return [p, q, v];
		case 4:
			return [t, p, v];
		case 5:
			return [v, p, q];
	}
};

convert.hsv.hsl = function (hsv) {
	var h = hsv[0];
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;
	var vmin = Math.max(v, 0.01);
	var lmin;
	var sl;
	var l;

	l = (2 - s) * v;
	lmin = (2 - s) * vmin;
	sl = s * vmin;
	sl /= (lmin <= 1) ? lmin : 2 - lmin;
	sl = sl || 0;
	l /= 2;

	return [h, sl * 100, l * 100];
};

// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
convert.hwb.rgb = function (hwb) {
	var h = hwb[0] / 360;
	var wh = hwb[1] / 100;
	var bl = hwb[2] / 100;
	var ratio = wh + bl;
	var i;
	var v;
	var f;
	var n;

	// wh + bl cant be > 1
	if (ratio > 1) {
		wh /= ratio;
		bl /= ratio;
	}

	i = Math.floor(6 * h);
	v = 1 - bl;
	f = 6 * h - i;

	if ((i & 0x01) !== 0) {
		f = 1 - f;
	}

	n = wh + f * (v - wh); // linear interpolation

	var r;
	var g;
	var b;
	switch (i) {
		default:
		case 6:
		case 0: r = v; g = n; b = wh; break;
		case 1: r = n; g = v; b = wh; break;
		case 2: r = wh; g = v; b = n; break;
		case 3: r = wh; g = n; b = v; break;
		case 4: r = n; g = wh; b = v; break;
		case 5: r = v; g = wh; b = n; break;
	}

	return [r * 255, g * 255, b * 255];
};

convert.cmyk.rgb = function (cmyk) {
	var c = cmyk[0] / 100;
	var m = cmyk[1] / 100;
	var y = cmyk[2] / 100;
	var k = cmyk[3] / 100;
	var r;
	var g;
	var b;

	r = 1 - Math.min(1, c * (1 - k) + k);
	g = 1 - Math.min(1, m * (1 - k) + k);
	b = 1 - Math.min(1, y * (1 - k) + k);

	return [r * 255, g * 255, b * 255];
};

convert.xyz.rgb = function (xyz) {
	var x = xyz[0] / 100;
	var y = xyz[1] / 100;
	var z = xyz[2] / 100;
	var r;
	var g;
	var b;

	r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
	g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
	b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);

	// assume sRGB
	r = r > 0.0031308
		? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
		: r * 12.92;

	g = g > 0.0031308
		? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
		: g * 12.92;

	b = b > 0.0031308
		? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
		: b * 12.92;

	r = Math.min(Math.max(0, r), 1);
	g = Math.min(Math.max(0, g), 1);
	b = Math.min(Math.max(0, b), 1);

	return [r * 255, g * 255, b * 255];
};

convert.xyz.lab = function (xyz) {
	var x = xyz[0];
	var y = xyz[1];
	var z = xyz[2];
	var l;
	var a;
	var b;

	x /= 95.047;
	y /= 100;
	z /= 108.883;

	x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
	y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
	z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);

	l = (116 * y) - 16;
	a = 500 * (x - y);
	b = 200 * (y - z);

	return [l, a, b];
};

convert.lab.xyz = function (lab) {
	var l = lab[0];
	var a = lab[1];
	var b = lab[2];
	var x;
	var y;
	var z;

	y = (l + 16) / 116;
	x = a / 500 + y;
	z = y - b / 200;

	var y2 = Math.pow(y, 3);
	var x2 = Math.pow(x, 3);
	var z2 = Math.pow(z, 3);
	y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
	x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
	z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;

	x *= 95.047;
	y *= 100;
	z *= 108.883;

	return [x, y, z];
};

convert.lab.lch = function (lab) {
	var l = lab[0];
	var a = lab[1];
	var b = lab[2];
	var hr;
	var h;
	var c;

	hr = Math.atan2(b, a);
	h = hr * 360 / 2 / Math.PI;

	if (h < 0) {
		h += 360;
	}

	c = Math.sqrt(a * a + b * b);

	return [l, c, h];
};

convert.lch.lab = function (lch) {
	var l = lch[0];
	var c = lch[1];
	var h = lch[2];
	var a;
	var b;
	var hr;

	hr = h / 360 * 2 * Math.PI;
	a = c * Math.cos(hr);
	b = c * Math.sin(hr);

	return [l, a, b];
};

convert.rgb.ansi16 = function (args) {
	var r = args[0];
	var g = args[1];
	var b = args[2];
	var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization

	value = Math.round(value / 50);

	if (value === 0) {
		return 30;
	}

	var ansi = 30
		+ ((Math.round(b / 255) << 2)
		| (Math.round(g / 255) << 1)
		| Math.round(r / 255));

	if (value === 2) {
		ansi += 60;
	}

	return ansi;
};

convert.hsv.ansi16 = function (args) {
	// optimization here; we already know the value and don't need to get
	// it converted for us.
	return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
};

convert.rgb.ansi256 = function (args) {
	var r = args[0];
	var g = args[1];
	var b = args[2];

	// we use the extended greyscale palette here, with the exception of
	// black and white. normal palette only has 4 greyscale shades.
	if (r === g && g === b) {
		if (r < 8) {
			return 16;
		}

		if (r > 248) {
			return 231;
		}

		return Math.round(((r - 8) / 247) * 24) + 232;
	}

	var ansi = 16
		+ (36 * Math.round(r / 255 * 5))
		+ (6 * Math.round(g / 255 * 5))
		+ Math.round(b / 255 * 5);

	return ansi;
};

convert.ansi16.rgb = function (args) {
	var color = args % 10;

	// handle greyscale
	if (color === 0 || color === 7) {
		if (args > 50) {
			color += 3.5;
		}

		color = color / 10.5 * 255;

		return [color, color, color];
	}

	var mult = (~~(args > 50) + 1) * 0.5;
	var r = ((color & 1) * mult) * 255;
	var g = (((color >> 1) & 1) * mult) * 255;
	var b = (((color >> 2) & 1) * mult) * 255;

	return [r, g, b];
};

convert.ansi256.rgb = function (args) {
	// handle greyscale
	if (args >= 232) {
		var c = (args - 232) * 10 + 8;
		return [c, c, c];
	}

	args -= 16;

	var rem;
	var r = Math.floor(args / 36) / 5 * 255;
	var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
	var b = (rem % 6) / 5 * 255;

	return [r, g, b];
};

convert.rgb.hex = function (args) {
	var integer = ((Math.round(args[0]) & 0xFF) << 16)
		+ ((Math.round(args[1]) & 0xFF) << 8)
		+ (Math.round(args[2]) & 0xFF);

	var string = integer.toString(16).toUpperCase();
	return '000000'.substring(string.length) + string;
};

convert.hex.rgb = function (args) {
	var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
	if (!match) {
		return [0, 0, 0];
	}

	var colorString = match[0];

	if (match[0].length === 3) {
		colorString = colorString.split('').map(function (char) {
			return char + char;
		}).join('');
	}

	var integer = parseInt(colorString, 16);
	var r = (integer >> 16) & 0xFF;
	var g = (integer >> 8) & 0xFF;
	var b = integer & 0xFF;

	return [r, g, b];
};

convert.rgb.hcg = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var max = Math.max(Math.max(r, g), b);
	var min = Math.min(Math.min(r, g), b);
	var chroma = (max - min);
	var grayscale;
	var hue;

	if (chroma < 1) {
		grayscale = min / (1 - chroma);
	} else {
		grayscale = 0;
	}

	if (chroma <= 0) {
		hue = 0;
	} else
	if (max === r) {
		hue = ((g - b) / chroma) % 6;
	} else
	if (max === g) {
		hue = 2 + (b - r) / chroma;
	} else {
		hue = 4 + (r - g) / chroma + 4;
	}

	hue /= 6;
	hue %= 1;

	return [hue * 360, chroma * 100, grayscale * 100];
};

convert.hsl.hcg = function (hsl) {
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var c = 1;
	var f = 0;

	if (l < 0.5) {
		c = 2.0 * s * l;
	} else {
		c = 2.0 * s * (1.0 - l);
	}

	if (c < 1.0) {
		f = (l - 0.5 * c) / (1.0 - c);
	}

	return [hsl[0], c * 100, f * 100];
};

convert.hsv.hcg = function (hsv) {
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;

	var c = s * v;
	var f = 0;

	if (c < 1.0) {
		f = (v - c) / (1 - c);
	}

	return [hsv[0], c * 100, f * 100];
};

convert.hcg.rgb = function (hcg) {
	var h = hcg[0] / 360;
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	if (c === 0.0) {
		return [g * 255, g * 255, g * 255];
	}

	var pure = [0, 0, 0];
	var hi = (h % 1) * 6;
	var v = hi % 1;
	var w = 1 - v;
	var mg = 0;

	switch (Math.floor(hi)) {
		case 0:
			pure[0] = 1; pure[1] = v; pure[2] = 0; break;
		case 1:
			pure[0] = w; pure[1] = 1; pure[2] = 0; break;
		case 2:
			pure[0] = 0; pure[1] = 1; pure[2] = v; break;
		case 3:
			pure[0] = 0; pure[1] = w; pure[2] = 1; break;
		case 4:
			pure[0] = v; pure[1] = 0; pure[2] = 1; break;
		default:
			pure[0] = 1; pure[1] = 0; pure[2] = w;
	}

	mg = (1.0 - c) * g;

	return [
		(c * pure[0] + mg) * 255,
		(c * pure[1] + mg) * 255,
		(c * pure[2] + mg) * 255
	];
};

convert.hcg.hsv = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	var v = c + g * (1.0 - c);
	var f = 0;

	if (v > 0.0) {
		f = c / v;
	}

	return [hcg[0], f * 100, v * 100];
};

convert.hcg.hsl = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	var l = g * (1.0 - c) + 0.5 * c;
	var s = 0;

	if (l > 0.0 && l < 0.5) {
		s = c / (2 * l);
	} else
	if (l >= 0.5 && l < 1.0) {
		s = c / (2 * (1 - l));
	}

	return [hcg[0], s * 100, l * 100];
};

convert.hcg.hwb = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;
	var v = c + g * (1.0 - c);
	return [hcg[0], (v - c) * 100, (1 - v) * 100];
};

convert.hwb.hcg = function (hwb) {
	var w = hwb[1] / 100;
	var b = hwb[2] / 100;
	var v = 1 - b;
	var c = v - w;
	var g = 0;

	if (c < 1) {
		g = (v - c) / (1 - c);
	}

	return [hwb[0], c * 100, g * 100];
};

convert.apple.rgb = function (apple) {
	return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
};

convert.rgb.apple = function (rgb) {
	return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
};

convert.gray.rgb = function (args) {
	return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
};

convert.gray.hsl = convert.gray.hsv = function (args) {
	return [0, 0, args[0]];
};

convert.gray.hwb = function (gray) {
	return [0, 100, gray[0]];
};

convert.gray.cmyk = function (gray) {
	return [0, 0, 0, gray[0]];
};

convert.gray.lab = function (gray) {
	return [gray[0], 0, 0];
};

convert.gray.hex = function (gray) {
	var val = Math.round(gray[0] / 100 * 255) & 0xFF;
	var integer = (val << 16) + (val << 8) + val;

	var string = integer.toString(16).toUpperCase();
	return '000000'.substring(string.length) + string;
};

convert.rgb.gray = function (rgb) {
	var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
	return [val / 255 * 100];
};


/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _Colorpicker = __webpack_require__(8);

var _Colorpicker2 = _interopRequireDefault(_Colorpicker);

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var plugin = 'colorpicker';

_jquery2.default[plugin] = _Colorpicker2.default;

// Colorpicker jQuery Plugin API
_jquery2.default.fn[plugin] = function (option) {
  var fnArgs = Array.prototype.slice.call(arguments, 1),
      isSingleElement = this.length === 1,
      returnValue = null;

  var $elements = this.each(function () {
    var $this = (0, _jquery2.default)(this),
        inst = $this.data(plugin),
        options = (typeof option === 'undefined' ? 'undefined' : _typeof(option)) === 'object' ? option : {};

    // Create instance if does not exist
    if (!inst) {
      inst = new _Colorpicker2.default(this, options);
      $this.data(plugin, inst);
    }

    if (!isSingleElement) {
      return;
    }

    returnValue = $this;

    if (typeof option === 'string') {
      if (option === 'colorpicker') {
        // Return colorpicker instance: e.g. .colorpicker('colorpicker')
        returnValue = inst;
      } else if (_jquery2.default.isFunction(inst[option])) {
        // Return method call return value: e.g. .colorpicker('isEnabled')
        returnValue = inst[option].apply(inst, fnArgs);
      } else {
        // Return property value: e.g. .colorpicker('element')
        returnValue = inst[option];
      }
    }
  });

  return isSingleElement ? returnValue : $elements;
};

_jquery2.default.fn[plugin].constructor = _Colorpicker2.default;

/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _Extension = __webpack_require__(1);

var _Extension2 = _interopRequireDefault(_Extension);

var _options = __webpack_require__(3);

var _options2 = _interopRequireDefault(_options);

var _extensions = __webpack_require__(9);

var _extensions2 = _interopRequireDefault(_extensions);

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

var _SliderHandler = __webpack_require__(13);

var _SliderHandler2 = _interopRequireDefault(_SliderHandler);

var _PopupHandler = __webpack_require__(14);

var _PopupHandler2 = _interopRequireDefault(_PopupHandler);

var _InputHandler = __webpack_require__(15);

var _InputHandler2 = _interopRequireDefault(_InputHandler);

var _ColorHandler = __webpack_require__(22);

var _ColorHandler2 = _interopRequireDefault(_ColorHandler);

var _PickerHandler = __webpack_require__(23);

var _PickerHandler2 = _interopRequireDefault(_PickerHandler);

var _AddonHandler = __webpack_require__(24);

var _AddonHandler2 = _interopRequireDefault(_AddonHandler);

var _ColorItem = __webpack_require__(2);

var _ColorItem2 = _interopRequireDefault(_ColorItem);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var colorPickerIdCounter = 0;
var root = typeof self !== 'undefined' ? self : undefined; // window

/**
 * Colorpicker widget class
 */

var Colorpicker = function () {
  _createClass(Colorpicker, [{
    key: 'color',


    /**
     * Internal color object
     *
     * @type {Color|null}
     */
    get: function get() {
      return this.colorHandler.color;
    }

    /**
     * Internal color format
     *
     * @type {String|null}
     */

  }, {
    key: 'format',
    get: function get() {
      return this.colorHandler.format;
    }

    /**
     * Getter of the picker element
     *
     * @returns {jQuery|HTMLElement}
     */

  }, {
    key: 'picker',
    get: function get() {
      return this.pickerHandler.picker;
    }

    /**
     * @fires Colorpicker#colorpickerCreate
     * @param {Object|String} element
     * @param {Object} options
     * @constructor
     */

  }], [{
    key: 'Color',

    /**
     * Color class
     *
     * @static
     * @type {Color}
     */
    get: function get() {
      return _ColorItem2.default;
    }

    /**
     * Extension class
     *
     * @static
     * @type {Extension}
     */

  }, {
    key: 'Extension',
    get: function get() {
      return _Extension2.default;
    }
  }]);

  function Colorpicker(element, options) {
    _classCallCheck(this, Colorpicker);

    colorPickerIdCounter += 1;
    /**
     * The colorpicker instance number
     * @type {number}
     */
    this.id = colorPickerIdCounter;

    /**
     * Latest colorpicker event
     *
     * @type {{name: String, e: *}}
     */
    this.lastEvent = {
      alias: null,
      e: null
    };

    /**
     * The element that the colorpicker is bound to
     *
     * @type {*|jQuery}
     */
    this.element = (0, _jquery2.default)(element).addClass('colorpicker-element').attr('data-colorpicker-id', this.id);

    /**
     * @type {defaults}
     */
    this.options = _jquery2.default.extend(true, {}, _options2.default, options, this.element.data());

    /**
     * @type {boolean}
     * @private
     */
    this.disabled = false;

    /**
     * Extensions added to this instance
     *
     * @type {Extension[]}
     */
    this.extensions = [];

    /**
     * The element where the
     * @type {*|jQuery}
     */
    this.container = this.options.container === true || this.options.container !== true && this.options.inline === true ? this.element : this.options.container;

    this.container = this.container !== false ? (0, _jquery2.default)(this.container) : false;

    /**
     * @type {InputHandler}
     */
    this.inputHandler = new _InputHandler2.default(this);
    /**
     * @type {ColorHandler}
     */
    this.colorHandler = new _ColorHandler2.default(this);
    /**
     * @type {SliderHandler}
     */
    this.sliderHandler = new _SliderHandler2.default(this);
    /**
     * @type {PopupHandler}
     */
    this.popupHandler = new _PopupHandler2.default(this, root);
    /**
     * @type {PickerHandler}
     */
    this.pickerHandler = new _PickerHandler2.default(this);
    /**
     * @type {AddonHandler}
     */
    this.addonHandler = new _AddonHandler2.default(this);

    this.init();

    // Emit a create event
    (0, _jquery2.default)(_jquery2.default.proxy(function () {
      /**
       * (Colorpicker) When the Colorpicker instance has been created and the DOM is ready.
       *
       * @event Colorpicker#colorpickerCreate
       */
      this.trigger('colorpickerCreate');
    }, this));
  }

  /**
   * Initializes the plugin
   * @private
   */


  _createClass(Colorpicker, [{
    key: 'init',
    value: function init() {
      // Init addon
      this.addonHandler.bind();

      // Init input
      this.inputHandler.bind();

      // Init extensions (before initializing the color)
      this.initExtensions();

      // Init color
      this.colorHandler.bind();

      // Init picker
      this.pickerHandler.bind();

      // Init sliders and popup
      this.sliderHandler.bind();
      this.popupHandler.bind();

      // Inject into the DOM (this may make it visible)
      this.pickerHandler.attach();

      // Update all components
      this.update();

      if (this.inputHandler.isDisabled()) {
        this.disable();
      }
    }

    /**
     * Initializes the plugin extensions
     * @private
     */

  }, {
    key: 'initExtensions',
    value: function initExtensions() {
      var _this = this;

      if (!Array.isArray(this.options.extensions)) {
        this.options.extensions = [];
      }

      if (this.options.debug) {
        this.options.extensions.push({ name: 'debugger' });
      }

      // Register and instantiate extensions
      this.options.extensions.forEach(function (ext) {
        _this.registerExtension(Colorpicker.extensions[ext.name.toLowerCase()], ext.options || {});
      });
    }

    /**
     * Creates and registers the given extension
     *
     * @param {Extension} ExtensionClass The extension class to instantiate
     * @param {Object} [config] Extension configuration
     * @returns {Extension}
     */

  }, {
    key: 'registerExtension',
    value: function registerExtension(ExtensionClass) {
      var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

      var ext = new ExtensionClass(this, config);

      this.extensions.push(ext);
      return ext;
    }

    /**
     * Destroys the current instance
     *
     * @fires Colorpicker#colorpickerDestroy
     */

  }, {
    key: 'destroy',
    value: function destroy() {
      var color = this.color;

      this.sliderHandler.unbind();
      this.inputHandler.unbind();
      this.popupHandler.unbind();
      this.colorHandler.unbind();
      this.addonHandler.unbind();
      this.pickerHandler.unbind();

      this.element.removeClass('colorpicker-element').removeData('colorpicker', 'color').off('.colorpicker');

      /**
       * (Colorpicker) When the instance is destroyed with all events unbound.
       *
       * @event Colorpicker#colorpickerDestroy
       */
      this.trigger('colorpickerDestroy', color);
    }

    /**
     * Shows the colorpicker widget if hidden.
     * If the colorpicker is disabled this call will be ignored.
     *
     * @fires Colorpicker#colorpickerShow
     * @param {Event} [e]
     */

  }, {
    key: 'show',
    value: function show(e) {
      this.popupHandler.show(e);
    }

    /**
     * Hides the colorpicker widget.
     *
     * @fires Colorpicker#colorpickerHide
     * @param {Event} [e]
     */

  }, {
    key: 'hide',
    value: function hide(e) {
      this.popupHandler.hide(e);
    }

    /**
     * Toggles the colorpicker between visible and hidden.
     *
     * @fires Colorpicker#colorpickerShow
     * @fires Colorpicker#colorpickerHide
     * @param {Event} [e]
     */

  }, {
    key: 'toggle',
    value: function toggle(e) {
      this.popupHandler.toggle(e);
    }

    /**
     * Returns the current color value as string
     *
     * @param {String|*} [defaultValue]
     * @returns {String|*}
     */

  }, {
    key: 'getValue',
    value: function getValue() {
      var defaultValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;

      var val = this.colorHandler.color;

      val = val instanceof _ColorItem2.default ? val : defaultValue;

      if (val instanceof _ColorItem2.default) {
        return val.string(this.format);
      }

      return val;
    }

    /**
     * Sets the color manually
     *
     * @fires Colorpicker#colorpickerChange
     * @param {String|Color} val
     */

  }, {
    key: 'setValue',
    value: function setValue(val) {
      if (this.isDisabled()) {
        return;
      }
      var ch = this.colorHandler;

      if (ch.hasColor() && !!val && ch.color.equals(val) || !ch.hasColor() && !val) {
        // same color or still empty
        return;
      }

      ch.color = val ? ch.createColor(val, this.options.autoInputFallback) : null;

      /**
       * (Colorpicker) When the color is set programmatically with setValue().
       *
       * @event Colorpicker#colorpickerChange
       */
      this.trigger('colorpickerChange', ch.color, val);

      // force update if color has changed to empty
      this.update();
    }

    /**
     * Updates the UI and the input color according to the internal color.
     *
     * @fires Colorpicker#colorpickerUpdate
     */

  }, {
    key: 'update',
    value: function update() {
      if (this.colorHandler.hasColor()) {
        this.inputHandler.update();
      } else {
        this.colorHandler.assureColor();
      }

      this.addonHandler.update();
      this.pickerHandler.update();

      /**
       * (Colorpicker) Fired when the widget is updated.
       *
       * @event Colorpicker#colorpickerUpdate
       */
      this.trigger('colorpickerUpdate');
    }

    /**
     * Enables the widget and the input if any
     *
     * @fires Colorpicker#colorpickerEnable
     * @returns {boolean}
     */

  }, {
    key: 'enable',
    value: function enable() {
      this.inputHandler.enable();
      this.disabled = false;
      this.picker.removeClass('colorpicker-disabled');

      /**
       * (Colorpicker) When the widget has been enabled.
       *
       * @event Colorpicker#colorpickerEnable
       */
      this.trigger('colorpickerEnable');
      return true;
    }

    /**
     * Disables the widget and the input if any
     *
     * @fires Colorpicker#colorpickerDisable
     * @returns {boolean}
     */

  }, {
    key: 'disable',
    value: function disable() {
      this.inputHandler.disable();
      this.disabled = true;
      this.picker.addClass('colorpicker-disabled');

      /**
       * (Colorpicker) When the widget has been disabled.
       *
       * @event Colorpicker#colorpickerDisable
       */
      this.trigger('colorpickerDisable');
      return true;
    }

    /**
     * Returns true if this instance is enabled
     * @returns {boolean}
     */

  }, {
    key: 'isEnabled',
    value: function isEnabled() {
      return !this.isDisabled();
    }

    /**
     * Returns true if this instance is disabled
     * @returns {boolean}
     */

  }, {
    key: 'isDisabled',
    value: function isDisabled() {
      return this.disabled === true;
    }

    /**
     * Triggers a Colorpicker event.
     *
     * @param eventName
     * @param color
     * @param value
     */

  }, {
    key: 'trigger',
    value: function trigger(eventName) {
      var color = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
      var value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;

      this.element.trigger({
        type: eventName,
        colorpicker: this,
        color: color ? color : this.color,
        value: value ? value : this.getValue()
      });
    }
  }]);

  return Colorpicker;
}();

/**
 * Colorpicker extension classes, indexed by extension name
 *
 * @static
 * @type {Object} a map between the extension name and its class
 */


Colorpicker.extensions = _extensions2.default;

exports.default = Colorpicker;

/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Palette = exports.Swatches = exports.Preview = exports.Debugger = undefined;

var _Debugger = __webpack_require__(10);

var _Debugger2 = _interopRequireDefault(_Debugger);

var _Preview = __webpack_require__(11);

var _Preview2 = _interopRequireDefault(_Preview);

var _Swatches = __webpack_require__(12);

var _Swatches2 = _interopRequireDefault(_Swatches);

var _Palette = __webpack_require__(4);

var _Palette2 = _interopRequireDefault(_Palette);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

exports.Debugger = _Debugger2.default;
exports.Preview = _Preview2.default;
exports.Swatches = _Swatches2.default;
exports.Palette = _Palette2.default;
exports.default = {
  'debugger': _Debugger2.default,
  'preview': _Preview2.default,
  'swatches': _Swatches2.default,
  'palette': _Palette2.default
};

/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };

var _Extension2 = __webpack_require__(1);

var _Extension3 = _interopRequireDefault(_Extension2);

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

/**
 * Debugger extension class
 * @alias DebuggerExtension
 * @ignore
 */
var Debugger = function (_Extension) {
  _inherits(Debugger, _Extension);

  function Debugger(colorpicker) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Debugger);

    /**
     * @type {number}
     */
    var _this = _possibleConstructorReturn(this, (Debugger.__proto__ || Object.getPrototypeOf(Debugger)).call(this, colorpicker, options));

    _this.eventCounter = 0;
    if (_this.colorpicker.inputHandler.hasInput()) {
      _this.colorpicker.inputHandler.input.on('change.colorpicker-ext', _jquery2.default.proxy(_this.onChangeInput, _this));
    }
    return _this;
  }

  /**
   * @fires DebuggerExtension#colorpickerDebug
   * @param {string} eventName
   * @param {*} args
   */


  _createClass(Debugger, [{
    key: 'log',
    value: function log(eventName) {
      var _console;

      for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        args[_key - 1] = arguments[_key];
      }

      this.eventCounter += 1;

      var logMessage = '#' + this.eventCounter + ': Colorpicker#' + this.colorpicker.id + ' [' + eventName + ']';

      (_console = console).debug.apply(_console, [logMessage].concat(args));

      /**
       * Whenever the debugger logs an event, this other event is emitted.
       *
       * @event DebuggerExtension#colorpickerDebug
       * @type {object} The event object
       * @property {Colorpicker} colorpicker The Colorpicker instance
       * @property {ColorItem} color The color instance
       * @property {{debugger: DebuggerExtension, eventName: String, logArgs: Array, logMessage: String}} debug
       *  The debug info
       */
      this.colorpicker.element.trigger({
        type: 'colorpickerDebug',
        colorpicker: this.colorpicker,
        color: this.color,
        value: null,
        debug: {
          debugger: this,
          eventName: eventName,
          logArgs: args,
          logMessage: logMessage
        }
      });
    }
  }, {
    key: 'resolveColor',
    value: function resolveColor(color) {
      var realColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;

      this.log('resolveColor()', color, realColor);
      return false;
    }
  }, {
    key: 'onCreate',
    value: function onCreate(event) {
      this.log('colorpickerCreate');
      return _get(Debugger.prototype.__proto__ || Object.getPrototypeOf(Debugger.prototype), 'onCreate', this).call(this, event);
    }
  }, {
    key: 'onDestroy',
    value: function onDestroy(event) {
      this.log('colorpickerDestroy');
      this.eventCounter = 0;

      if (this.colorpicker.inputHandler.hasInput()) {
        this.colorpicker.inputHandler.input.off('.colorpicker-ext');
      }

      return _get(Debugger.prototype.__proto__ || Object.getPrototypeOf(Debugger.prototype), 'onDestroy', this).call(this, event);
    }
  }, {
    key: 'onUpdate',
    value: function onUpdate(event) {
      this.log('colorpickerUpdate');
    }

    /**
     * @listens Colorpicker#change
     * @param {Event} event
     */

  }, {
    key: 'onChangeInput',
    value: function onChangeInput(event) {
      this.log('input:change.colorpicker', event.value, event.color);
    }
  }, {
    key: 'onChange',
    value: function onChange(event) {
      this.log('colorpickerChange', event.value, event.color);
    }
  }, {
    key: 'onInvalid',
    value: function onInvalid(event) {
      this.log('colorpickerInvalid', event.value, event.color);
    }
  }, {
    key: 'onHide',
    value: function onHide(event) {
      this.log('colorpickerHide');
      this.eventCounter = 0;
    }
  }, {
    key: 'onShow',
    value: function onShow(event) {
      this.log('colorpickerShow');
    }
  }, {
    key: 'onDisable',
    value: function onDisable(event) {
      this.log('colorpickerDisable');
    }
  }, {
    key: 'onEnable',
    value: function onEnable(event) {
      this.log('colorpickerEnable');
    }
  }]);

  return Debugger;
}(_Extension3.default);

exports.default = Debugger;

/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };

var _Extension2 = __webpack_require__(1);

var _Extension3 = _interopRequireDefault(_Extension2);

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

/**
 * Color preview extension
 * @ignore
 */
var Preview = function (_Extension) {
  _inherits(Preview, _Extension);

  function Preview(colorpicker) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Preview);

    var _this = _possibleConstructorReturn(this, (Preview.__proto__ || Object.getPrototypeOf(Preview)).call(this, colorpicker, _jquery2.default.extend(true, {}, {
      template: '<div class="colorpicker-bar colorpicker-preview"><div /></div>',
      showText: true,
      format: colorpicker.format
    }, options)));

    _this.element = (0, _jquery2.default)(_this.options.template);
    _this.elementInner = _this.element.find('div');
    return _this;
  }

  _createClass(Preview, [{
    key: 'onCreate',
    value: function onCreate(event) {
      _get(Preview.prototype.__proto__ || Object.getPrototypeOf(Preview.prototype), 'onCreate', this).call(this, event);
      this.colorpicker.picker.append(this.element);
    }
  }, {
    key: 'onUpdate',
    value: function onUpdate(event) {
      _get(Preview.prototype.__proto__ || Object.getPrototypeOf(Preview.prototype), 'onUpdate', this).call(this, event);

      if (!event.color) {
        this.elementInner.css('backgroundColor', null).css('color', null).html('');
        return;
      }

      this.elementInner.css('backgroundColor', event.color.toRgbString());

      if (this.options.showText) {
        this.elementInner.html(event.color.string(this.options.format || this.colorpicker.format));

        if (event.color.isDark() && event.color.alpha > 0.5) {
          this.elementInner.css('color', 'white');
        } else {
          this.elementInner.css('color', 'black');
        }
      }
    }
  }]);

  return Preview;
}(_Extension3.default);

exports.default = Preview;

/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };

var _Palette2 = __webpack_require__(4);

var _Palette3 = _interopRequireDefault(_Palette2);

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var defaults = {
  barTemplate: '<div class="colorpicker-bar colorpicker-swatches">\n                    <div class="colorpicker-swatches--inner"></div>\n                </div>',
  swatchTemplate: '<i class="colorpicker-swatch"><i class="colorpicker-swatch--inner"></i></i>'
};

/**
 * Color swatches extension
 * @ignore
 */

var Swatches = function (_Palette) {
  _inherits(Swatches, _Palette);

  function Swatches(colorpicker) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Swatches);

    var _this = _possibleConstructorReturn(this, (Swatches.__proto__ || Object.getPrototypeOf(Swatches)).call(this, colorpicker, _jquery2.default.extend(true, {}, defaults, options)));

    _this.element = null;
    return _this;
  }

  _createClass(Swatches, [{
    key: 'isEnabled',
    value: function isEnabled() {
      return this.getLength() > 0;
    }
  }, {
    key: 'onCreate',
    value: function onCreate(event) {
      _get(Swatches.prototype.__proto__ || Object.getPrototypeOf(Swatches.prototype), 'onCreate', this).call(this, event);

      if (!this.isEnabled()) {
        return;
      }

      this.element = (0, _jquery2.default)(this.options.barTemplate);
      this.load();
      this.colorpicker.picker.append(this.element);
    }
  }, {
    key: 'load',
    value: function load() {
      var _this2 = this;

      var colorpicker = this.colorpicker,
          swatchContainer = this.element.find('.colorpicker-swatches--inner'),
          isAliased = this.options.namesAsValues === true && !Array.isArray(this.colors);

      swatchContainer.empty();

      _jquery2.default.each(this.colors, function (name, value) {
        var $swatch = (0, _jquery2.default)(_this2.options.swatchTemplate).attr('data-name', name).attr('data-value', value).attr('title', isAliased ? name + ': ' + value : value).on('mousedown.colorpicker touchstart.colorpicker', function (e) {
          var $sw = (0, _jquery2.default)(this);

          // e.preventDefault();

          colorpicker.setValue(isAliased ? $sw.attr('data-name') : $sw.attr('data-value'));
        });

        $swatch.find('.colorpicker-swatch--inner').css('background-color', value);

        swatchContainer.append($swatch);
      });

      swatchContainer.append((0, _jquery2.default)('<i class="colorpicker-clear"></i>'));
    }
  }]);

  return Swatches;
}(_Palette3.default);

exports.default = Swatches;

/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Class that handles all configured sliders on mouse or touch events.
 * @ignore
 */
var SliderHandler = function () {
  /**
   * @param {Colorpicker} colorpicker
   */
  function SliderHandler(colorpicker) {
    _classCallCheck(this, SliderHandler);

    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {*|String}
     * @private
     */
    this.currentSlider = null;
    /**
     * @type {{left: number, top: number}}
     * @private
     */
    this.mousePointer = {
      left: 0,
      top: 0
    };

    /**
     * @type {Function}
     */
    this.onMove = _jquery2.default.proxy(this.defaultOnMove, this);
  }

  /**
   * This function is called every time a slider guide is moved
   * The scope of "this" is the SliderHandler object.
   *
   * @param {int} top
   * @param {int} left
   */


  _createClass(SliderHandler, [{
    key: 'defaultOnMove',
    value: function defaultOnMove(top, left) {
      if (!this.currentSlider) {
        return;
      }

      var slider = this.currentSlider,
          cp = this.colorpicker,
          ch = cp.colorHandler;

      // Create a color object
      var color = !ch.hasColor() ? ch.getFallbackColor() : ch.color.getClone();

      // Adjust the guide position
      slider.guideStyle.left = left + 'px';
      slider.guideStyle.top = top + 'px';

      // Adjust the color
      if (slider.callLeft) {
        color[slider.callLeft](left / slider.maxLeft);
      }
      if (slider.callTop) {
        color[slider.callTop](top / slider.maxTop);
      }

      // Set the new color
      cp.setValue(color);
      cp.popupHandler.focus();
    }

    /**
     * Binds the colorpicker sliders to the mouse/touch events
     */

  }, {
    key: 'bind',
    value: function bind() {
      var sliders = this.colorpicker.options.horizontal ? this.colorpicker.options.slidersHorz : this.colorpicker.options.sliders;
      var sliderClasses = [];

      for (var sliderName in sliders) {
        if (!sliders.hasOwnProperty(sliderName)) {
          continue;
        }

        sliderClasses.push(sliders[sliderName].selector);
      }

      this.colorpicker.picker.find(sliderClasses.join(', ')).on('mousedown.colorpicker touchstart.colorpicker', _jquery2.default.proxy(this.pressed, this));
    }

    /**
     * Unbinds any event bound by this handler
     */

  }, {
    key: 'unbind',
    value: function unbind() {
      (0, _jquery2.default)(this.colorpicker.picker).off({
        'mousemove.colorpicker': _jquery2.default.proxy(this.moved, this),
        'touchmove.colorpicker': _jquery2.default.proxy(this.moved, this),
        'mouseup.colorpicker': _jquery2.default.proxy(this.released, this),
        'touchend.colorpicker': _jquery2.default.proxy(this.released, this)
      });
    }

    /**
     * Function triggered when clicking in one of the color adjustment bars
     *
     * @private
     * @fires Colorpicker#mousemove
     * @param {Event} e
     */

  }, {
    key: 'pressed',
    value: function pressed(e) {
      if (this.colorpicker.isDisabled()) {
        return;
      }
      this.colorpicker.lastEvent.alias = 'pressed';
      this.colorpicker.lastEvent.e = e;

      if (!e.pageX && !e.pageY && e.originalEvent && e.originalEvent.touches) {
        e.pageX = e.originalEvent.touches[0].pageX;
        e.pageY = e.originalEvent.touches[0].pageY;
      }
      // e.stopPropagation();
      // e.preventDefault();

      var target = (0, _jquery2.default)(e.target);

      // detect the slider and set the limits and callbacks
      var zone = target.closest('div');
      var sliders = this.colorpicker.options.horizontal ? this.colorpicker.options.slidersHorz : this.colorpicker.options.sliders;

      if (zone.is('.colorpicker')) {
        return;
      }

      this.currentSlider = null;

      for (var sliderName in sliders) {
        if (!sliders.hasOwnProperty(sliderName)) {
          continue;
        }

        var slider = sliders[sliderName];

        if (zone.is(slider.selector)) {
          this.currentSlider = _jquery2.default.extend({}, slider, { name: sliderName });
          break;
        } else if (slider.childSelector !== undefined && zone.is(slider.childSelector)) {
          this.currentSlider = _jquery2.default.extend({}, slider, { name: sliderName });
          zone = zone.parent(); // zone.parents(slider.selector).first() ?
          break;
        }
      }

      var guide = zone.find('.colorpicker-guide').get(0);

      if (this.currentSlider === null || guide === null) {
        return;
      }

      var offset = zone.offset();

      // reference to guide's style
      this.currentSlider.guideStyle = guide.style;
      this.currentSlider.left = e.pageX - offset.left;
      this.currentSlider.top = e.pageY - offset.top;
      this.mousePointer = {
        left: e.pageX,
        top: e.pageY
      };

      // TODO: fix moving outside the picker makes the guides to keep moving. The event needs to be bound to the window.
      /**
       * (window.document) Triggered on mousedown for the document object,
       * so the color adjustment guide is moved to the clicked position.
       *
       * @event Colorpicker#mousemove
       */
      (0, _jquery2.default)(this.colorpicker.picker).on({
        'mousemove.colorpicker': _jquery2.default.proxy(this.moved, this),
        'touchmove.colorpicker': _jquery2.default.proxy(this.moved, this),
        'mouseup.colorpicker': _jquery2.default.proxy(this.released, this),
        'touchend.colorpicker': _jquery2.default.proxy(this.released, this)
      }).trigger('mousemove');
    }

    /**
     * Function triggered when dragging a guide inside one of the color adjustment bars.
     *
     * @private
     * @param {Event} e
     */

  }, {
    key: 'moved',
    value: function moved(e) {
      this.colorpicker.lastEvent.alias = 'moved';
      this.colorpicker.lastEvent.e = e;

      if (!e.pageX && !e.pageY && e.originalEvent && e.originalEvent.touches) {
        e.pageX = e.originalEvent.touches[0].pageX;
        e.pageY = e.originalEvent.touches[0].pageY;
      }

      // e.stopPropagation();
      e.preventDefault(); // prevents scrolling on mobile

      var left = Math.max(0, Math.min(this.currentSlider.maxLeft, this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)));

      var top = Math.max(0, Math.min(this.currentSlider.maxTop, this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)));

      this.onMove(top, left);
    }

    /**
     * Function triggered when releasing the click in one of the color adjustment bars.
     *
     * @private
     * @param {Event} e
     */

  }, {
    key: 'released',
    value: function released(e) {
      this.colorpicker.lastEvent.alias = 'released';
      this.colorpicker.lastEvent.e = e;

      // e.stopPropagation();
      // e.preventDefault();

      (0, _jquery2.default)(this.colorpicker.picker).off({
        'mousemove.colorpicker': this.moved,
        'touchmove.colorpicker': this.moved,
        'mouseup.colorpicker': this.released,
        'touchend.colorpicker': this.released
      });
    }
  }]);

  return SliderHandler;
}();

exports.default = SliderHandler;

/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

var _options = __webpack_require__(3);

var _options2 = _interopRequireDefault(_options);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Handles everything related to the UI of the colorpicker popup: show, hide, position,...
 * @ignore
 */
var PopupHandler = function () {
  /**
   * @param {Colorpicker} colorpicker
   * @param {Window} root
   */
  function PopupHandler(colorpicker, root) {
    _classCallCheck(this, PopupHandler);

    /**
     * @type {Window}
     */
    this.root = root;
    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {jQuery}
     */
    this.popoverTarget = null;
    /**
     * @type {jQuery}
     */
    this.popoverTip = null;

    /**
     * If true, the latest click was inside the popover
     * @type {boolean}
     */
    this.clicking = false;
    /**
     * @type {boolean}
     */
    this.hidding = false;
    /**
     * @type {boolean}
     */
    this.showing = false;
  }

  /**
   * @private
   * @returns {jQuery|false}
   */


  _createClass(PopupHandler, [{
    key: 'bind',


    /**
     * Binds the different colorpicker elements to the focus/mouse/touch events so it reacts in order to show or
     * hide the colorpicker popup accordingly. It also adds the proper classes.
     */
    value: function bind() {
      var cp = this.colorpicker;

      if (cp.options.inline) {
        cp.picker.addClass('colorpicker-inline colorpicker-visible');
        return; // no need to bind show/hide events for inline elements
      }

      cp.picker.addClass('colorpicker-popup colorpicker-hidden');

      // there is no input or addon
      if (!this.hasInput && !this.hasAddon) {
        return;
      }

      // create Bootstrap 4 popover
      if (cp.options.popover) {
        this.createPopover();
      }

      // bind addon show/hide events
      if (this.hasAddon) {
        // enable focus on addons
        if (!this.addon.attr('tabindex')) {
          this.addon.attr('tabindex', 0);
        }

        this.addon.on({
          'mousedown.colorpicker touchstart.colorpicker': _jquery2.default.proxy(this.toggle, this)
        });

        this.addon.on({
          'focus.colorpicker': _jquery2.default.proxy(this.show, this)
        });

        this.addon.on({
          'focusout.colorpicker': _jquery2.default.proxy(this.hide, this)
        });
      }

      // bind input show/hide events
      if (this.hasInput && !this.hasAddon) {
        this.input.on({
          'mousedown.colorpicker touchstart.colorpicker': _jquery2.default.proxy(this.show, this),
          'focus.colorpicker': _jquery2.default.proxy(this.show, this)
        });

        this.input.on({
          'focusout.colorpicker': _jquery2.default.proxy(this.hide, this)
        });
      }

      // reposition popup on window resize
      (0, _jquery2.default)(this.root).on('resize.colorpicker', _jquery2.default.proxy(this.reposition, this));
    }

    /**
     * Unbinds any event bound by this handler
     */

  }, {
    key: 'unbind',
    value: function unbind() {
      if (this.hasInput) {
        this.input.off({
          'mousedown.colorpicker touchstart.colorpicker': _jquery2.default.proxy(this.show, this),
          'focus.colorpicker': _jquery2.default.proxy(this.show, this)
        });
        this.input.off({
          'focusout.colorpicker': _jquery2.default.proxy(this.hide, this)
        });
      }

      if (this.hasAddon) {
        this.addon.off({
          'mousedown.colorpicker touchstart.colorpicker': _jquery2.default.proxy(this.toggle, this)
        });
        this.addon.off({
          'focus.colorpicker': _jquery2.default.proxy(this.show, this)
        });
        this.addon.off({
          'focusout.colorpicker': _jquery2.default.proxy(this.hide, this)
        });
      }

      if (this.popoverTarget) {
        this.popoverTarget.popover('dispose');
      }

      (0, _jquery2.default)(this.root).off('resize.colorpicker', _jquery2.default.proxy(this.reposition, this));
      (0, _jquery2.default)(this.root.document).off('mousedown.colorpicker touchstart.colorpicker', _jquery2.default.proxy(this.hide, this));
      (0, _jquery2.default)(this.root.document).off('mousedown.colorpicker touchstart.colorpicker', _jquery2.default.proxy(this.onClickingInside, this));
    }
  }, {
    key: 'isClickingInside',
    value: function isClickingInside(e) {
      if (!e) {
        return false;
      }

      return this.isOrIsInside(this.popoverTip, e.currentTarget) || this.isOrIsInside(this.popoverTip, e.target) || this.isOrIsInside(this.colorpicker.picker, e.currentTarget) || this.isOrIsInside(this.colorpicker.picker, e.target);
    }
  }, {
    key: 'isOrIsInside',
    value: function isOrIsInside(container, element) {
      if (!container || !element) {
        return false;
      }

      element = (0, _jquery2.default)(element);

      return element.is(container) || container.find(element).length > 0;
    }
  }, {
    key: 'onClickingInside',
    value: function onClickingInside(e) {
      this.clicking = this.isClickingInside(e);
    }
  }, {
    key: 'createPopover',
    value: function createPopover() {
      var cp = this.colorpicker;

      this.popoverTarget = this.hasAddon ? this.addon : this.input;

      cp.picker.addClass('colorpicker-bs-popover-content');

      this.popoverTarget.popover(_jquery2.default.extend(true, {}, _options2.default.popover, cp.options.popover, { trigger: 'manual', content: cp.picker, html: true }));

      this.popoverTip = (0, _jquery2.default)(this.popoverTarget.popover('getTipElement').data('bs.popover').tip);
      this.popoverTip.addClass('colorpicker-bs-popover');

      this.popoverTarget.on('shown.bs.popover', _jquery2.default.proxy(this.fireShow, this));
      this.popoverTarget.on('hidden.bs.popover', _jquery2.default.proxy(this.fireHide, this));
    }

    /**
     * If the widget is not inside a container or inline, rearranges its position relative to its element offset.
     *
     * @param {Event} [e]
     * @private
     */

  }, {
    key: 'reposition',
    value: function reposition(e) {
      if (this.popoverTarget && this.isVisible()) {
        this.popoverTarget.popover('update');
      }
    }

    /**
     * Toggles the colorpicker between visible or hidden
     *
     * @fires Colorpicker#colorpickerShow
     * @fires Colorpicker#colorpickerHide
     * @param {Event} [e]
     */

  }, {
    key: 'toggle',
    value: function toggle(e) {
      if (this.isVisible()) {
        this.hide(e);
      } else {
        this.show(e);
      }
    }

    /**
     * Shows the colorpicker widget if hidden.
     *
     * @fires Colorpicker#colorpickerShow
     * @param {Event} [e]
     */

  }, {
    key: 'show',
    value: function show(e) {
      if (this.isVisible() || this.showing || this.hidding) {
        return;
      }

      this.showing = true;
      this.hidding = false;
      this.clicking = false;

      var cp = this.colorpicker;

      cp.lastEvent.alias = 'show';
      cp.lastEvent.e = e;

      // Prevent showing browser native HTML5 colorpicker
      if (e && (!this.hasInput || this.input.attr('type') === 'color') && e && e.preventDefault) {
        e.stopPropagation();
        e.preventDefault();
      }

      // If it's a popover, add event to the document to hide the picker when clicking outside of it
      if (this.isPopover) {
        (0, _jquery2.default)(this.root).on('resize.colorpicker', _jquery2.default.proxy(this.reposition, this));
      }

      // add visible class before popover is shown
      cp.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');

      if (this.popoverTarget) {
        this.popoverTarget.popover('show');
      } else {
        this.fireShow();
      }
    }
  }, {
    key: 'fireShow',
    value: function fireShow() {
      this.hidding = false;
      this.showing = false;

      if (this.isPopover) {
        // Add event to hide on outside click
        (0, _jquery2.default)(this.root.document).on('mousedown.colorpicker touchstart.colorpicker', _jquery2.default.proxy(this.hide, this));
        (0, _jquery2.default)(this.root.document).on('mousedown.colorpicker touchstart.colorpicker', _jquery2.default.proxy(this.onClickingInside, this));
      }

      /**
       * (Colorpicker) When show() is called and the widget can be shown.
       *
       * @event Colorpicker#colorpickerShow
       */
      this.colorpicker.trigger('colorpickerShow');
    }

    /**
     * Hides the colorpicker widget.
     * Hide is prevented when it is triggered by an event whose target element has been clicked/touched.
     *
     * @fires Colorpicker#colorpickerHide
     * @param {Event} [e]
     */

  }, {
    key: 'hide',
    value: function hide(e) {
      if (this.isHidden() || this.showing || this.hidding) {
        return;
      }

      var cp = this.colorpicker,
          clicking = this.clicking || this.isClickingInside(e);

      this.hidding = true;
      this.showing = false;
      this.clicking = false;

      cp.lastEvent.alias = 'hide';
      cp.lastEvent.e = e;

      // TODO: fix having to click twice outside when losing focus and last 2 clicks where inside the colorpicker

      // Prevent hide if triggered by an event and an element inside the colorpicker has been clicked/touched
      if (clicking) {
        this.hidding = false;
        return;
      }

      if (this.popoverTarget) {
        this.popoverTarget.popover('hide');
      } else {
        this.fireHide();
      }
    }
  }, {
    key: 'fireHide',
    value: function fireHide() {
      this.hidding = false;
      this.showing = false;

      var cp = this.colorpicker;

      // add hidden class after popover is hidden
      cp.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');

      // Unbind window and document events, since there is no need to keep them while the popup is hidden
      (0, _jquery2.default)(this.root).off('resize.colorpicker', _jquery2.default.proxy(this.reposition, this));
      (0, _jquery2.default)(this.root.document).off('mousedown.colorpicker touchstart.colorpicker', _jquery2.default.proxy(this.hide, this));
      (0, _jquery2.default)(this.root.document).off('mousedown.colorpicker touchstart.colorpicker', _jquery2.default.proxy(this.onClickingInside, this));

      /**
       * (Colorpicker) When hide() is called and the widget can be hidden.
       *
       * @event Colorpicker#colorpickerHide
       */
      cp.trigger('colorpickerHide');
    }
  }, {
    key: 'focus',
    value: function focus() {
      if (this.hasAddon) {
        return this.addon.focus();
      }
      if (this.hasInput) {
        return this.input.focus();
      }
      return false;
    }

    /**
     * Returns true if the colorpicker element has the colorpicker-visible class and not the colorpicker-hidden one.
     * False otherwise.
     *
     * @returns {boolean}
     */

  }, {
    key: 'isVisible',
    value: function isVisible() {
      return this.colorpicker.picker.hasClass('colorpicker-visible') && !this.colorpicker.picker.hasClass('colorpicker-hidden');
    }

    /**
     * Returns true if the colorpicker element has the colorpicker-hidden class and not the colorpicker-visible one.
     * False otherwise.
     *
     * @returns {boolean}
     */

  }, {
    key: 'isHidden',
    value: function isHidden() {
      return this.colorpicker.picker.hasClass('colorpicker-hidden') && !this.colorpicker.picker.hasClass('colorpicker-visible');
    }
  }, {
    key: 'input',
    get: function get() {
      return this.colorpicker.inputHandler.input;
    }

    /**
     * @private
     * @returns {boolean}
     */

  }, {
    key: 'hasInput',
    get: function get() {
      return this.colorpicker.inputHandler.hasInput();
    }

    /**
     * @private
     * @returns {jQuery|false}
     */

  }, {
    key: 'addon',
    get: function get() {
      return this.colorpicker.addonHandler.addon;
    }

    /**
     * @private
     * @returns {boolean}
     */

  }, {
    key: 'hasAddon',
    get: function get() {
      return this.colorpicker.addonHandler.hasAddon();
    }

    /**
     * @private
     * @returns {boolean}
     */

  }, {
    key: 'isPopover',
    get: function get() {
      return !this.colorpicker.options.inline && !!this.popoverTip;
    }
  }]);

  return PopupHandler;
}();

exports.default = PopupHandler;

/***/ }),
/* 15 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

var _ColorItem = __webpack_require__(2);

var _ColorItem2 = _interopRequireDefault(_ColorItem);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Handles everything related to the colorpicker input
 * @ignore
 */
var InputHandler = function () {
  /**
   * @param {Colorpicker} colorpicker
   */
  function InputHandler(colorpicker) {
    _classCallCheck(this, InputHandler);

    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {jQuery|false}
     */
    this.input = this.colorpicker.element.is('input') ? this.colorpicker.element : this.colorpicker.options.input ? this.colorpicker.element.find(this.colorpicker.options.input) : false;

    if (this.input && this.input.length === 0) {
      this.input = false;
    }

    this._initValue();
  }

  _createClass(InputHandler, [{
    key: 'bind',
    value: function bind() {
      if (!this.hasInput()) {
        return;
      }
      this.input.on({
        'keyup.colorpicker': _jquery2.default.proxy(this.onkeyup, this)
      });
      this.input.on({
        'change.colorpicker': _jquery2.default.proxy(this.onchange, this)
      });
    }
  }, {
    key: 'unbind',
    value: function unbind() {
      if (!this.hasInput()) {
        return;
      }
      this.input.off('.colorpicker');
    }
  }, {
    key: '_initValue',
    value: function _initValue() {
      if (!this.hasInput()) {
        return;
      }

      var val = '';

      [
      // candidates:
      this.input.val(), this.input.data('color'), this.input.attr('data-color')].map(function (item) {
        if (item && val === '') {
          val = item;
        }
      });

      if (val instanceof _ColorItem2.default) {
        val = this.getFormattedColor(val.string(this.colorpicker.format));
      } else if (!(typeof val === 'string' || val instanceof String)) {
        val = '';
      }

      this.input.prop('value', val);
    }

    /**
     * Returns the color string from the input value.
     * If there is no input the return value is false.
     *
     * @returns {String|boolean}
     */

  }, {
    key: 'getValue',
    value: function getValue() {
      if (!this.hasInput()) {
        return false;
      }

      return this.input.val();
    }

    /**
     * If the input element is present, it updates the value with the current color object color string.
     * If the value is changed, this method fires a "change" event on the input element.
     *
     * @param {String} val
     *
     * @fires Colorpicker#change
     */

  }, {
    key: 'setValue',
    value: function setValue(val) {
      if (!this.hasInput()) {
        return;
      }

      var inputVal = this.input.prop('value');

      val = val ? val : '';

      if (val === (inputVal ? inputVal : '')) {
        // No need to set value or trigger any event if nothing changed
        return;
      }

      this.input.prop('value', val);

      /**
       * (Input) Triggered on the input element when a new color is selected.
       *
       * @event Colorpicker#change
       */
      this.input.trigger({
        type: 'change',
        colorpicker: this.colorpicker,
        color: this.colorpicker.color,
        value: val
      });
    }

    /**
     * Returns the formatted color string, with the formatting options applied
     * (e.g. useHashPrefix)
     *
     * @param {String|null} val
     *
     * @returns {String}
     */

  }, {
    key: 'getFormattedColor',
    value: function getFormattedColor() {
      var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;

      val = val ? val : this.colorpicker.colorHandler.getColorString();

      if (!val) {
        return '';
      }

      val = this.colorpicker.colorHandler.resolveColorDelegate(val, false);

      if (this.colorpicker.options.useHashPrefix === false) {
        val = val.replace(/^#/g, '');
      }

      return val;
    }

    /**
     * Returns true if the widget has an associated input element, false otherwise
     * @returns {boolean}
     */

  }, {
    key: 'hasInput',
    value: function hasInput() {
      return this.input !== false;
    }

    /**
     * Returns true if the input exists and is disabled
     * @returns {boolean}
     */

  }, {
    key: 'isEnabled',
    value: function isEnabled() {
      return this.hasInput() && !this.isDisabled();
    }

    /**
     * Returns true if the input exists and is disabled
     * @returns {boolean}
     */

  }, {
    key: 'isDisabled',
    value: function isDisabled() {
      return this.hasInput() && this.input.prop('disabled') === true;
    }

    /**
     * Disables the input if any
     *
     * @fires Colorpicker#colorpickerDisable
     * @returns {boolean}
     */

  }, {
    key: 'disable',
    value: function disable() {
      if (this.hasInput()) {
        this.input.prop('disabled', true);
      }
    }

    /**
     * Enables the input if any
     *
     * @fires Colorpicker#colorpickerEnable
     * @returns {boolean}
     */

  }, {
    key: 'enable',
    value: function enable() {
      if (this.hasInput()) {
        this.input.prop('disabled', false);
      }
    }

    /**
     * Calls setValue with the current internal color value
     *
     * @fires Colorpicker#change
     */

  }, {
    key: 'update',
    value: function update() {
      if (!this.hasInput()) {
        return;
      }

      if (this.colorpicker.options.autoInputFallback === false && this.colorpicker.colorHandler.isInvalidColor()) {
        // prevent update if color is invalid, autoInputFallback is disabled and the last event is keyup.
        return;
      }

      this.setValue(this.getFormattedColor());
    }

    /**
     * Function triggered when the input has changed, so the colorpicker gets updated.
     *
     * @private
     * @param {Event} e
     * @returns {boolean}
     */

  }, {
    key: 'onchange',
    value: function onchange(e) {
      this.colorpicker.lastEvent.alias = 'input.change';
      this.colorpicker.lastEvent.e = e;

      var val = this.getValue();

      if (val !== e.value) {
        this.colorpicker.setValue(val);
      }
    }

    /**
     * Function triggered after a keyboard key has been released.
     *
     * @private
     * @param {Event} e
     * @returns {boolean}
     */

  }, {
    key: 'onkeyup',
    value: function onkeyup(e) {
      this.colorpicker.lastEvent.alias = 'input.keyup';
      this.colorpicker.lastEvent.e = e;

      var val = this.getValue();

      if (val !== e.value) {
        this.colorpicker.setValue(val);
      }
    }
  }]);

  return InputHandler;
}();

exports.default = InputHandler;

/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var colorString = __webpack_require__(17);
var convert = __webpack_require__(20);

var _slice = [].slice;

var skippedModels = [
	// to be honest, I don't really feel like keyword belongs in color convert, but eh.
	'keyword',

	// gray conflicts with some method names, and has its own method defined.
	'gray',

	// shouldn't really be in color-convert either...
	'hex'
];

var hashedModelKeys = {};
Object.keys(convert).forEach(function (model) {
	hashedModelKeys[_slice.call(convert[model].labels).sort().join('')] = model;
});

var limiters = {};

function Color(obj, model) {
	if (!(this instanceof Color)) {
		return new Color(obj, model);
	}

	if (model && model in skippedModels) {
		model = null;
	}

	if (model && !(model in convert)) {
		throw new Error('Unknown model: ' + model);
	}

	var i;
	var channels;

	if (typeof obj === 'undefined') {
		this.model = 'rgb';
		this.color = [0, 0, 0];
		this.valpha = 1;
	} else if (obj instanceof Color) {
		this.model = obj.model;
		this.color = obj.color.slice();
		this.valpha = obj.valpha;
	} else if (typeof obj === 'string') {
		var result = colorString.get(obj);
		if (result === null) {
			throw new Error('Unable to parse color from string: ' + obj);
		}

		this.model = result.model;
		channels = convert[this.model].channels;
		this.color = result.value.slice(0, channels);
		this.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;
	} else if (obj.length) {
		this.model = model || 'rgb';
		channels = convert[this.model].channels;
		var newArr = _slice.call(obj, 0, channels);
		this.color = zeroArray(newArr, channels);
		this.valpha = typeof obj[channels] === 'number' ? obj[channels] : 1;
	} else if (typeof obj === 'number') {
		// this is always RGB - can be converted later on.
		obj &= 0xFFFFFF;
		this.model = 'rgb';
		this.color = [
			(obj >> 16) & 0xFF,
			(obj >> 8) & 0xFF,
			obj & 0xFF
		];
		this.valpha = 1;
	} else {
		this.valpha = 1;

		var keys = Object.keys(obj);
		if ('alpha' in obj) {
			keys.splice(keys.indexOf('alpha'), 1);
			this.valpha = typeof obj.alpha === 'number' ? obj.alpha : 0;
		}

		var hashedKeys = keys.sort().join('');
		if (!(hashedKeys in hashedModelKeys)) {
			throw new Error('Unable to parse color from object: ' + JSON.stringify(obj));
		}

		this.model = hashedModelKeys[hashedKeys];

		var labels = convert[this.model].labels;
		var color = [];
		for (i = 0; i < labels.length; i++) {
			color.push(obj[labels[i]]);
		}

		this.color = zeroArray(color);
	}

	// perform limitations (clamping, etc.)
	if (limiters[this.model]) {
		channels = convert[this.model].channels;
		for (i = 0; i < channels; i++) {
			var limit = limiters[this.model][i];
			if (limit) {
				this.color[i] = limit(this.color[i]);
			}
		}
	}

	this.valpha = Math.max(0, Math.min(1, this.valpha));

	if (Object.freeze) {
		Object.freeze(this);
	}
}

Color.prototype = {
	toString: function () {
		return this.string();
	},

	toJSON: function () {
		return this[this.model]();
	},

	string: function (places) {
		var self = this.model in colorString.to ? this : this.rgb();
		self = self.round(typeof places === 'number' ? places : 1);
		var args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);
		return colorString.to[self.model](args);
	},

	percentString: function (places) {
		var self = this.rgb().round(typeof places === 'number' ? places : 1);
		var args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);
		return colorString.to.rgb.percent(args);
	},

	array: function () {
		return this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);
	},

	object: function () {
		var result = {};
		var channels = convert[this.model].channels;
		var labels = convert[this.model].labels;

		for (var i = 0; i < channels; i++) {
			result[labels[i]] = this.color[i];
		}

		if (this.valpha !== 1) {
			result.alpha = this.valpha;
		}

		return result;
	},

	unitArray: function () {
		var rgb = this.rgb().color;
		rgb[0] /= 255;
		rgb[1] /= 255;
		rgb[2] /= 255;

		if (this.valpha !== 1) {
			rgb.push(this.valpha);
		}

		return rgb;
	},

	unitObject: function () {
		var rgb = this.rgb().object();
		rgb.r /= 255;
		rgb.g /= 255;
		rgb.b /= 255;

		if (this.valpha !== 1) {
			rgb.alpha = this.valpha;
		}

		return rgb;
	},

	round: function (places) {
		places = Math.max(places || 0, 0);
		return new Color(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);
	},

	alpha: function (val) {
		if (arguments.length) {
			return new Color(this.color.concat(Math.max(0, Math.min(1, val))), this.model);
		}

		return this.valpha;
	},

	// rgb
	red: getset('rgb', 0, maxfn(255)),
	green: getset('rgb', 1, maxfn(255)),
	blue: getset('rgb', 2, maxfn(255)),

	hue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, function (val) { return ((val % 360) + 360) % 360; }), // eslint-disable-line brace-style

	saturationl: getset('hsl', 1, maxfn(100)),
	lightness: getset('hsl', 2, maxfn(100)),

	saturationv: getset('hsv', 1, maxfn(100)),
	value: getset('hsv', 2, maxfn(100)),

	chroma: getset('hcg', 1, maxfn(100)),
	gray: getset('hcg', 2, maxfn(100)),

	white: getset('hwb', 1, maxfn(100)),
	wblack: getset('hwb', 2, maxfn(100)),

	cyan: getset('cmyk', 0, maxfn(100)),
	magenta: getset('cmyk', 1, maxfn(100)),
	yellow: getset('cmyk', 2, maxfn(100)),
	black: getset('cmyk', 3, maxfn(100)),

	x: getset('xyz', 0, maxfn(100)),
	y: getset('xyz', 1, maxfn(100)),
	z: getset('xyz', 2, maxfn(100)),

	l: getset('lab', 0, maxfn(100)),
	a: getset('lab', 1),
	b: getset('lab', 2),

	keyword: function (val) {
		if (arguments.length) {
			return new Color(val);
		}

		return convert[this.model].keyword(this.color);
	},

	hex: function (val) {
		if (arguments.length) {
			return new Color(val);
		}

		return colorString.to.hex(this.rgb().round().color);
	},

	rgbNumber: function () {
		var rgb = this.rgb().color;
		return ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);
	},

	luminosity: function () {
		// http://www.w3.org/TR/WCAG20/#relativeluminancedef
		var rgb = this.rgb().color;

		var lum = [];
		for (var i = 0; i < rgb.length; i++) {
			var chan = rgb[i] / 255;
			lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);
		}

		return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
	},

	contrast: function (color2) {
		// http://www.w3.org/TR/WCAG20/#contrast-ratiodef
		var lum1 = this.luminosity();
		var lum2 = color2.luminosity();

		if (lum1 > lum2) {
			return (lum1 + 0.05) / (lum2 + 0.05);
		}

		return (lum2 + 0.05) / (lum1 + 0.05);
	},

	level: function (color2) {
		var contrastRatio = this.contrast(color2);
		if (contrastRatio >= 7.1) {
			return 'AAA';
		}

		return (contrastRatio >= 4.5) ? 'AA' : '';
	},

	isDark: function () {
		// YIQ equation from http://24ways.org/2010/calculating-color-contrast
		var rgb = this.rgb().color;
		var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
		return yiq < 128;
	},

	isLight: function () {
		return !this.isDark();
	},

	negate: function () {
		var rgb = this.rgb();
		for (var i = 0; i < 3; i++) {
			rgb.color[i] = 255 - rgb.color[i];
		}
		return rgb;
	},

	lighten: function (ratio) {
		var hsl = this.hsl();
		hsl.color[2] += hsl.color[2] * ratio;
		return hsl;
	},

	darken: function (ratio) {
		var hsl = this.hsl();
		hsl.color[2] -= hsl.color[2] * ratio;
		return hsl;
	},

	saturate: function (ratio) {
		var hsl = this.hsl();
		hsl.color[1] += hsl.color[1] * ratio;
		return hsl;
	},

	desaturate: function (ratio) {
		var hsl = this.hsl();
		hsl.color[1] -= hsl.color[1] * ratio;
		return hsl;
	},

	whiten: function (ratio) {
		var hwb = this.hwb();
		hwb.color[1] += hwb.color[1] * ratio;
		return hwb;
	},

	blacken: function (ratio) {
		var hwb = this.hwb();
		hwb.color[2] += hwb.color[2] * ratio;
		return hwb;
	},

	grayscale: function () {
		// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
		var rgb = this.rgb().color;
		var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
		return Color.rgb(val, val, val);
	},

	fade: function (ratio) {
		return this.alpha(this.valpha - (this.valpha * ratio));
	},

	opaquer: function (ratio) {
		return this.alpha(this.valpha + (this.valpha * ratio));
	},

	rotate: function (degrees) {
		var hsl = this.hsl();
		var hue = hsl.color[0];
		hue = (hue + degrees) % 360;
		hue = hue < 0 ? 360 + hue : hue;
		hsl.color[0] = hue;
		return hsl;
	},

	mix: function (mixinColor, weight) {
		// ported from sass implementation in C
		// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209
		if (!mixinColor || !mixinColor.rgb) {
			throw new Error('Argument to "mix" was not a Color instance, but rather an instance of ' + typeof mixinColor);
		}
		var color1 = mixinColor.rgb();
		var color2 = this.rgb();
		var p = weight === undefined ? 0.5 : weight;

		var w = 2 * p - 1;
		var a = color1.alpha() - color2.alpha();

		var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
		var w2 = 1 - w1;

		return Color.rgb(
				w1 * color1.red() + w2 * color2.red(),
				w1 * color1.green() + w2 * color2.green(),
				w1 * color1.blue() + w2 * color2.blue(),
				color1.alpha() * p + color2.alpha() * (1 - p));
	}
};

// model conversion methods and static constructors
Object.keys(convert).forEach(function (model) {
	if (skippedModels.indexOf(model) !== -1) {
		return;
	}

	var channels = convert[model].channels;

	// conversion methods
	Color.prototype[model] = function () {
		if (this.model === model) {
			return new Color(this);
		}

		if (arguments.length) {
			return new Color(arguments, model);
		}

		var newAlpha = typeof arguments[channels] === 'number' ? channels : this.valpha;
		return new Color(assertArray(convert[this.model][model].raw(this.color)).concat(newAlpha), model);
	};

	// 'static' construction methods
	Color[model] = function (color) {
		if (typeof color === 'number') {
			color = zeroArray(_slice.call(arguments), channels);
		}
		return new Color(color, model);
	};
});

function roundTo(num, places) {
	return Number(num.toFixed(places));
}

function roundToPlace(places) {
	return function (num) {
		return roundTo(num, places);
	};
}

function getset(model, channel, modifier) {
	model = Array.isArray(model) ? model : [model];

	model.forEach(function (m) {
		(limiters[m] || (limiters[m] = []))[channel] = modifier;
	});

	model = model[0];

	return function (val) {
		var result;

		if (arguments.length) {
			if (modifier) {
				val = modifier(val);
			}

			result = this[model]();
			result.color[channel] = val;
			return result;
		}

		result = this[model]().color[channel];
		if (modifier) {
			result = modifier(result);
		}

		return result;
	};
}

function maxfn(max) {
	return function (v) {
		return Math.max(0, Math.min(max, v));
	};
}

function assertArray(val) {
	return Array.isArray(val) ? val : [val];
}

function zeroArray(arr, length) {
	for (var i = 0; i < length; i++) {
		if (typeof arr[i] !== 'number') {
			arr[i] = 0;
		}
	}

	return arr;
}

module.exports = Color;


/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {

/* MIT license */
var colorNames = __webpack_require__(5);
var swizzle = __webpack_require__(18);

var reverseNames = {};

// create a list of reverse color names
for (var name in colorNames) {
	if (colorNames.hasOwnProperty(name)) {
		reverseNames[colorNames[name]] = name;
	}
}

var cs = module.exports = {
	to: {},
	get: {}
};

cs.get = function (string) {
	var prefix = string.substring(0, 3).toLowerCase();
	var val;
	var model;
	switch (prefix) {
		case 'hsl':
			val = cs.get.hsl(string);
			model = 'hsl';
			break;
		case 'hwb':
			val = cs.get.hwb(string);
			model = 'hwb';
			break;
		default:
			val = cs.get.rgb(string);
			model = 'rgb';
			break;
	}

	if (!val) {
		return null;
	}

	return {model: model, value: val};
};

cs.get.rgb = function (string) {
	if (!string) {
		return null;
	}

	var abbr = /^#([a-f0-9]{3,4})$/i;
	var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;
	var rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
	var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
	var keyword = /(\D+)/;

	var rgb = [0, 0, 0, 1];
	var match;
	var i;
	var hexAlpha;

	if (match = string.match(hex)) {
		hexAlpha = match[2];
		match = match[1];

		for (i = 0; i < 3; i++) {
			// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19
			var i2 = i * 2;
			rgb[i] = parseInt(match.slice(i2, i2 + 2), 16);
		}

		if (hexAlpha) {
			rgb[3] = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;
		}
	} else if (match = string.match(abbr)) {
		match = match[1];
		hexAlpha = match[3];

		for (i = 0; i < 3; i++) {
			rgb[i] = parseInt(match[i] + match[i], 16);
		}

		if (hexAlpha) {
			rgb[3] = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;
		}
	} else if (match = string.match(rgba)) {
		for (i = 0; i < 3; i++) {
			rgb[i] = parseInt(match[i + 1], 0);
		}

		if (match[4]) {
			rgb[3] = parseFloat(match[4]);
		}
	} else if (match = string.match(per)) {
		for (i = 0; i < 3; i++) {
			rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
		}

		if (match[4]) {
			rgb[3] = parseFloat(match[4]);
		}
	} else if (match = string.match(keyword)) {
		if (match[1] === 'transparent') {
			return [0, 0, 0, 0];
		}

		rgb = colorNames[match[1]];

		if (!rgb) {
			return null;
		}

		rgb[3] = 1;

		return rgb;
	} else {
		return null;
	}

	for (i = 0; i < 3; i++) {
		rgb[i] = clamp(rgb[i], 0, 255);
	}
	rgb[3] = clamp(rgb[3], 0, 1);

	return rgb;
};

cs.get.hsl = function (string) {
	if (!string) {
		return null;
	}

	var hsl = /^hsla?\(\s*([+-]?(?:\d*\.)?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
	var match = string.match(hsl);

	if (match) {
		var alpha = parseFloat(match[4]);
		var h = (parseFloat(match[1]) + 360) % 360;
		var s = clamp(parseFloat(match[2]), 0, 100);
		var l = clamp(parseFloat(match[3]), 0, 100);
		var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);

		return [h, s, l, a];
	}

	return null;
};

cs.get.hwb = function (string) {
	if (!string) {
		return null;
	}

	var hwb = /^hwb\(\s*([+-]?\d*[\.]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
	var match = string.match(hwb);

	if (match) {
		var alpha = parseFloat(match[4]);
		var h = ((parseFloat(match[1]) % 360) + 360) % 360;
		var w = clamp(parseFloat(match[2]), 0, 100);
		var b = clamp(parseFloat(match[3]), 0, 100);
		var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
		return [h, w, b, a];
	}

	return null;
};

cs.to.hex = function () {
	var rgba = swizzle(arguments);

	return (
		'#' +
		hexDouble(rgba[0]) +
		hexDouble(rgba[1]) +
		hexDouble(rgba[2]) +
		(rgba[3] < 1
			? (hexDouble(Math.round(rgba[3] * 255)))
			: '')
	);
};

cs.to.rgb = function () {
	var rgba = swizzle(arguments);

	return rgba.length < 4 || rgba[3] === 1
		? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'
		: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';
};

cs.to.rgb.percent = function () {
	var rgba = swizzle(arguments);

	var r = Math.round(rgba[0] / 255 * 100);
	var g = Math.round(rgba[1] / 255 * 100);
	var b = Math.round(rgba[2] / 255 * 100);

	return rgba.length < 4 || rgba[3] === 1
		? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'
		: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';
};

cs.to.hsl = function () {
	var hsla = swizzle(arguments);
	return hsla.length < 4 || hsla[3] === 1
		? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'
		: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';
};

// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
// (hwb have alpha optional & 1 is default value)
cs.to.hwb = function () {
	var hwba = swizzle(arguments);

	var a = '';
	if (hwba.length >= 4 && hwba[3] !== 1) {
		a = ', ' + hwba[3];
	}

	return 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';
};

cs.to.keyword = function (rgb) {
	return reverseNames[rgb.slice(0, 3)];
};

// helpers
function clamp(num, min, max) {
	return Math.min(Math.max(min, num), max);
}

function hexDouble(num) {
	var str = num.toString(16).toUpperCase();
	return (str.length < 2) ? '0' + str : str;
}


/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var isArrayish = __webpack_require__(19);

var concat = Array.prototype.concat;
var slice = Array.prototype.slice;

var swizzle = module.exports = function swizzle(args) {
	var results = [];

	for (var i = 0, len = args.length; i < len; i++) {
		var arg = args[i];

		if (isArrayish(arg)) {
			// http://jsperf.com/javascript-array-concat-vs-push/98
			results = concat.call(results, slice.call(arg));
		} else {
			results.push(arg);
		}
	}

	return results;
};

swizzle.wrap = function (fn) {
	return function () {
		return fn(swizzle(arguments));
	};
};


/***/ }),
/* 19 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = function isArrayish(obj) {
	if (!obj) {
		return false;
	}

	return obj instanceof Array || Array.isArray(obj) ||
		(obj.length >= 0 && obj.splice instanceof Function);
};


/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {

var conversions = __webpack_require__(6);
var route = __webpack_require__(21);

var convert = {};

var models = Object.keys(conversions);

function wrapRaw(fn) {
	var wrappedFn = function (args) {
		if (args === undefined || args === null) {
			return args;
		}

		if (arguments.length > 1) {
			args = Array.prototype.slice.call(arguments);
		}

		return fn(args);
	};

	// preserve .conversion property if there is one
	if ('conversion' in fn) {
		wrappedFn.conversion = fn.conversion;
	}

	return wrappedFn;
}

function wrapRounded(fn) {
	var wrappedFn = function (args) {
		if (args === undefined || args === null) {
			return args;
		}

		if (arguments.length > 1) {
			args = Array.prototype.slice.call(arguments);
		}

		var result = fn(args);

		// we're assuming the result is an array here.
		// see notice in conversions.js; don't use box types
		// in conversion functions.
		if (typeof result === 'object') {
			for (var len = result.length, i = 0; i < len; i++) {
				result[i] = Math.round(result[i]);
			}
		}

		return result;
	};

	// preserve .conversion property if there is one
	if ('conversion' in fn) {
		wrappedFn.conversion = fn.conversion;
	}

	return wrappedFn;
}

models.forEach(function (fromModel) {
	convert[fromModel] = {};

	Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
	Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});

	var routes = route(fromModel);
	var routeModels = Object.keys(routes);

	routeModels.forEach(function (toModel) {
		var fn = routes[toModel];

		convert[fromModel][toModel] = wrapRounded(fn);
		convert[fromModel][toModel].raw = wrapRaw(fn);
	});
});

module.exports = convert;


/***/ }),
/* 21 */
/***/ (function(module, exports, __webpack_require__) {

var conversions = __webpack_require__(6);

/*
	this function routes a model to all other models.

	all functions that are routed have a property `.conversion` attached
	to the returned synthetic function. This property is an array
	of strings, each with the steps in between the 'from' and 'to'
	color models (inclusive).

	conversions that are not possible simply are not included.
*/

function buildGraph() {
	var graph = {};
	// https://jsperf.com/object-keys-vs-for-in-with-closure/3
	var models = Object.keys(conversions);

	for (var len = models.length, i = 0; i < len; i++) {
		graph[models[i]] = {
			// http://jsperf.com/1-vs-infinity
			// micro-opt, but this is simple.
			distance: -1,
			parent: null
		};
	}

	return graph;
}

// https://en.wikipedia.org/wiki/Breadth-first_search
function deriveBFS(fromModel) {
	var graph = buildGraph();
	var queue = [fromModel]; // unshift -> queue -> pop

	graph[fromModel].distance = 0;

	while (queue.length) {
		var current = queue.pop();
		var adjacents = Object.keys(conversions[current]);

		for (var len = adjacents.length, i = 0; i < len; i++) {
			var adjacent = adjacents[i];
			var node = graph[adjacent];

			if (node.distance === -1) {
				node.distance = graph[current].distance + 1;
				node.parent = current;
				queue.unshift(adjacent);
			}
		}
	}

	return graph;
}

function link(from, to) {
	return function (args) {
		return to(from(args));
	};
}

function wrapConversion(toModel, graph) {
	var path = [graph[toModel].parent, toModel];
	var fn = conversions[graph[toModel].parent][toModel];

	var cur = graph[toModel].parent;
	while (graph[cur].parent) {
		path.unshift(graph[cur].parent);
		fn = link(conversions[graph[cur].parent][cur], fn);
		cur = graph[cur].parent;
	}

	fn.conversion = path;
	return fn;
}

module.exports = function (fromModel) {
	var graph = deriveBFS(fromModel);
	var conversion = {};

	var models = Object.keys(graph);
	for (var len = models.length, i = 0; i < len; i++) {
		var toModel = models[i];
		var node = graph[toModel];

		if (node.parent === null) {
			// no possible conversion, or this node is the source model.
			continue;
		}

		conversion[toModel] = wrapConversion(toModel, graph);
	}

	return conversion;
};



/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

var _ColorItem = __webpack_require__(2);

var _ColorItem2 = _interopRequireDefault(_ColorItem);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Handles everything related to the colorpicker color
 * @ignore
 */
var ColorHandler = function () {
  /**
   * @param {Colorpicker} colorpicker
   */
  function ColorHandler(colorpicker) {
    _classCallCheck(this, ColorHandler);

    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
  }

  /**
   * @returns {*|String|ColorItem}
   */


  _createClass(ColorHandler, [{
    key: 'bind',
    value: function bind() {
      // if the color option is set
      if (this.colorpicker.options.color) {
        this.color = this.createColor(this.colorpicker.options.color);
        return;
      }

      // if element[color] is empty and the input has a value
      if (!this.color && !!this.colorpicker.inputHandler.getValue()) {
        this.color = this.createColor(this.colorpicker.inputHandler.getValue(), this.colorpicker.options.autoInputFallback);
      }
    }
  }, {
    key: 'unbind',
    value: function unbind() {
      this.colorpicker.element.removeData('color');
    }

    /**
     * Returns the color string from the input value or the 'data-color' attribute of the input or element.
     * If empty, it returns the defaultValue parameter.
     *
     * @returns {String|*}
     */

  }, {
    key: 'getColorString',
    value: function getColorString() {
      if (!this.hasColor()) {
        return '';
      }

      return this.color.string(this.format);
    }

    /**
     * Sets the color value
     *
     * @param {String|ColorItem} val
     */

  }, {
    key: 'setColorString',
    value: function setColorString(val) {
      var color = val ? this.createColor(val) : null;

      this.color = color ? color : null;
    }

    /**
     * Creates a new color using the widget instance options (fallbackColor, format).
     *
     * @fires Colorpicker#colorpickerInvalid
     * @param {*} val
     * @param {boolean} fallbackOnInvalid
     * @returns {ColorItem}
     */

  }, {
    key: 'createColor',
    value: function createColor(val) {
      var fallbackOnInvalid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;

      var color = new _ColorItem2.default(this.resolveColorDelegate(val), this.format);

      if (!color.isValid()) {
        if (fallbackOnInvalid) {
          color = this.getFallbackColor();
        }

        /**
         * (Colorpicker) Fired when the color is invalid and the fallback color is going to be used.
         *
         * @event Colorpicker#colorpickerInvalid
         */
        this.colorpicker.trigger('colorpickerInvalid', color, val);
      }

      if (!this.isAlphaEnabled()) {
        // Alpha is disabled
        color.alpha = 1;
      }

      return color;
    }
  }, {
    key: 'getFallbackColor',
    value: function getFallbackColor() {
      if (this.fallback && this.fallback === this.color) {
        return this.color;
      }

      var fallback = this.resolveColorDelegate(this.fallback);
      var color = new _ColorItem2.default(fallback, this.format);

      if (!color.isValid()) {
        console.warn('The fallback color is invalid. Falling back to the previous color or black if any.');
        return this.color ? this.color : new _ColorItem2.default('#000000', this.format);
      }

      return color;
    }

    /**
     * @returns {ColorItem}
     */

  }, {
    key: 'assureColor',
    value: function assureColor() {
      if (!this.hasColor()) {
        this.color = this.getFallbackColor();
      }

      return this.color;
    }

    /**
     * Delegates the color resolution to the colorpicker extensions.
     *
     * @param {String|*} color
     * @param {boolean} realColor if true, the color should resolve into a real (not named) color code
     * @returns {ColorItem|String|*|null}
     */

  }, {
    key: 'resolveColorDelegate',
    value: function resolveColorDelegate(color) {
      var realColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;

      var extResolvedColor = false;

      _jquery2.default.each(this.colorpicker.extensions, function (name, ext) {
        if (extResolvedColor !== false) {
          // skip if resolved
          return;
        }
        extResolvedColor = ext.resolveColor(color, realColor);
      });

      return extResolvedColor ? extResolvedColor : color;
    }

    /**
     * Checks if there is a color object, that it is valid and it is not a fallback
     * @returns {boolean}
     */

  }, {
    key: 'isInvalidColor',
    value: function isInvalidColor() {
      return !this.hasColor() || !this.color.isValid();
    }

    /**
     * Returns true if the useAlpha option is exactly true, false otherwise
     * @returns {boolean}
     */

  }, {
    key: 'isAlphaEnabled',
    value: function isAlphaEnabled() {
      return this.colorpicker.options.useAlpha !== false;
    }

    /**
     * Returns true if the current color object is an instance of Color, false otherwise.
     * @returns {boolean}
     */

  }, {
    key: 'hasColor',
    value: function hasColor() {
      return this.color instanceof _ColorItem2.default;
    }
  }, {
    key: 'fallback',
    get: function get() {
      return this.colorpicker.options.fallbackColor ? this.colorpicker.options.fallbackColor : this.hasColor() ? this.color : null;
    }

    /**
     * @returns {String|null}
     */

  }, {
    key: 'format',
    get: function get() {
      if (this.colorpicker.options.format) {
        return this.colorpicker.options.format;
      }

      if (this.hasColor() && this.color.hasTransparency() && this.color.format.match(/^hex/)) {
        return this.isAlphaEnabled() ? 'rgba' : 'hex';
      }

      if (this.hasColor()) {
        return this.color.format;
      }

      return 'rgb';
    }

    /**
     * Internal color getter
     *
     * @type {ColorItem|null}
     */

  }, {
    key: 'color',
    get: function get() {
      return this.colorpicker.element.data('color');
    }

    /**
     * Internal color setter
     *
     * @ignore
     * @param {ColorItem|null} value
     */
    ,
    set: function set(value) {
      this.colorpicker.element.data('color', value);

      if (value instanceof _ColorItem2.default && this.colorpicker.options.format === 'auto') {
        // If format is 'auto', use the first parsed one from now on
        this.colorpicker.options.format = this.color.format;
      }
    }
  }]);

  return ColorHandler;
}();

exports.default = ColorHandler;

/***/ }),
/* 23 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _jquery = __webpack_require__(0);

var _jquery2 = _interopRequireDefault(_jquery);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Handles everything related to the colorpicker UI
 * @ignore
 */
var PickerHandler = function () {
  /**
   * @param {Colorpicker} colorpicker
   */
  function PickerHandler(colorpicker) {
    _classCallCheck(this, PickerHandler);

    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {jQuery}
     */
    this.picker = null;
  }

  _createClass(PickerHandler, [{
    key: 'bind',
    value: function bind() {
      /**
       * @type {jQuery|HTMLElement}
       */
      var picker = this.picker = (0, _jquery2.default)(this.options.template);

      if (this.options.customClass) {
        picker.addClass(this.options.customClass);
      }

      if (this.options.horizontal) {
        picker.addClass('colorpicker-horizontal');
      }

      if (this._supportsAlphaBar()) {
        this.options.useAlpha = true;
        picker.addClass('colorpicker-with-alpha');
      } else {
        this.options.useAlpha = false;
      }
    }
  }, {
    key: 'attach',
    value: function attach() {
      // Inject the colorpicker element into the DOM
      var pickerParent = this.colorpicker.container ? this.colorpicker.container : null;

      if (pickerParent) {
        this.picker.appendTo(pickerParent);
      }
    }
  }, {
    key: 'unbind',
    value: function unbind() {
      this.picker.remove();
    }
  }, {
    key: '_supportsAlphaBar',
    value: function _supportsAlphaBar() {
      return (this.options.useAlpha || this.colorpicker.colorHandler.hasColor() && this.color.hasTransparency()) && this.options.useAlpha !== false && (!this.options.format || this.options.format && !this.options.format.match(/^hex([36])?$/i));
    }

    /**
     * Changes the color adjustment bars using the current color object information.
     */

  }, {
    key: 'update',
    value: function update() {
      if (!this.colorpicker.colorHandler.hasColor()) {
        return;
      }

      var vertical = this.options.horizontal !== true,
          slider = vertical ? this.options.sliders : this.options.slidersHorz;

      var saturationGuide = this.picker.find('.colorpicker-saturation .colorpicker-guide'),
          hueGuide = this.picker.find('.colorpicker-hue .colorpicker-guide'),
          alphaGuide = this.picker.find('.colorpicker-alpha .colorpicker-guide');

      var hsva = this.color.toHsvaRatio();

      // Set guides position
      if (hueGuide.length) {
        hueGuide.css(vertical ? 'top' : 'left', (vertical ? slider.hue.maxTop : slider.hue.maxLeft) * (1 - hsva.h));
      }
      if (alphaGuide.length) {
        alphaGuide.css(vertical ? 'top' : 'left', (vertical ? slider.alpha.maxTop : slider.alpha.maxLeft) * (1 - hsva.a));
      }
      if (saturationGuide.length) {
        saturationGuide.css({
          'top': slider.saturation.maxTop - hsva.v * slider.saturation.maxTop,
          'left': hsva.s * slider.saturation.maxLeft
        });
      }

      // Set saturation hue background
      this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.getCloneHueOnly().toHexString()); // we only need hue

      // Set alpha color gradient
      var hexColor = this.color.toHexString();
      var alphaBg = '';

      if (this.options.horizontal) {
        alphaBg = 'linear-gradient(to right, ' + hexColor + ' 0%, transparent 100%)';
      } else {
        alphaBg = 'linear-gradient(to bottom, ' + hexColor + ' 0%, transparent 100%)';
      }

      this.picker.find('.colorpicker-alpha-color').css('background', alphaBg);
    }
  }, {
    key: 'options',
    get: function get() {
      return this.colorpicker.options;
    }
  }, {
    key: 'color',
    get: function get() {
      return this.colorpicker.colorHandler.color;
    }
  }]);

  return PickerHandler;
}();

exports.default = PickerHandler;

/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Handles everything related to the colorpicker addon
 * @ignore
 */

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var AddonHandler = function () {
  /**
   * @param {Colorpicker} colorpicker
   */
  function AddonHandler(colorpicker) {
    _classCallCheck(this, AddonHandler);

    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {jQuery}
     */
    this.addon = null;
  }

  _createClass(AddonHandler, [{
    key: 'hasAddon',
    value: function hasAddon() {
      return !!this.addon;
    }
  }, {
    key: 'bind',
    value: function bind() {
      /**
       * @type {*|jQuery}
       */
      this.addon = this.colorpicker.options.addon ? this.colorpicker.element.find(this.colorpicker.options.addon) : null;

      if (this.addon && this.addon.length === 0) {
        // not found
        this.addon = null;
      }
    }
  }, {
    key: 'unbind',
    value: function unbind() {
      if (this.hasAddon()) {
        this.addon.off('.colorpicker');
      }
    }

    /**
     * If the addon element is present, its background color is updated
     */

  }, {
    key: 'update',
    value: function update() {
      if (!this.colorpicker.colorHandler.hasColor() || !this.hasAddon()) {
        return;
      }

      var colorStr = this.colorpicker.colorHandler.getColorString();
      var styles = { 'background': colorStr };

      var icn = this.addon.find('i').eq(0);

      if (icn.length > 0) {
        icn.css(styles);
      } else {
        this.addon.css(styles);
      }
    }
  }]);

  return AddonHandler;
}();

exports.default = AddonHandler;

/***/ })
/******/ ]);
});
//# sourceMappingURL=bootstrap-colorpicker.js.map

Added public/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js.map.

cannot compute difference between binary files

Added public/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.min.js.

cannot compute difference between binary files

Added public/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.min.js.map.

cannot compute difference between binary files

Added public/bootstrap-colorpicker/logo.png.

cannot compute difference between binary files

Added public/bootstrap-colorpicker/package.json.





























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
{
  "_from": "bootstrap-colorpicker@^3.1.0",
  "_id": "bootstrap-colorpicker@3.1.2",
  "_inBundle": false,
  "_integrity": "sha512-yUWegXox8GYoXVtYdrEIN3QMOeEFbcSFGDadZu2pWmmMgTaw4ECX9T8GvYQzJkRusvK9uzi39FjE0W2k8lQECA==",
  "_location": "/bootstrap-colorpicker",
  "_phantomChildren": {},
  "_requested": {
    "type": "range",
    "registry": true,
    "raw": "bootstrap-colorpicker@^3.1.0",
    "name": "bootstrap-colorpicker",
    "escapedName": "bootstrap-colorpicker",
    "rawSpec": "^3.1.0",
    "saveSpec": null,
    "fetchSpec": "^3.1.0"
  },
  "_requiredBy": [
    "/"
  ],
  "_resolved": "https://registry.npmjs.org/bootstrap-colorpicker/-/bootstrap-colorpicker-3.1.2.tgz",
  "_shasum": "42737d7fb3f52b42ad9e33ac97f021252307dfae",
  "_spec": "bootstrap-colorpicker@^3.1.0",
  "_where": "/Users/itsjavi/Developer/github.com/farbelous/bootstrap-colorpicker-test",
  "author": {
    "name": "Javi Aguilar"
  },
  "ava": {
    "files": [
      "tests/**/*test.js"
    ],
    "source": [
      "src/js/**/*.{js,jsx}"
    ],
    "concurrency": 5,
    "failFast": true,
    "failWithoutAssertions": false,
    "tap": false,
    "powerAssert": false,
    "require": [
      "babel-register"
    ],
    "babel": "inherit"
  },
  "bugs": {
    "url": "https://github.com/farbelous/bootstrap-colorpicker/issues"
  },
  "bundleDependencies": false,
  "dependencies": {
    "bootstrap": ">=4.0",
    "jquery": ">=2.1.0"
  },
  "deprecated": false,
  "description": "Bootstrap Colorpicker is a modular color picker plugin for Bootstrap 4.",
  "devDependencies": {
    "ava": "^0.23.0",
    "babel-cli": "^6.26.0",
    "babel-eslint": "^8.0.2",
    "babel-loader": "^7.1.2",
    "babel-plugin-add-module-exports": "^0.2.1",
    "babel-preset-env": "^1.6.1",
    "color": "^3.0.0",
    "del": "^3.0.0",
    "eslint": "^4.11.0",
    "eslint-loader": "^1.9.0",
    "gh-pages": "^1.0.0",
    "gulp": "^3.9.1",
    "gulp-autoprefixer": "^4.0.0",
    "gulp-clean-css": "^3.9.0",
    "gulp-compile-handlebars": "^0.6.1",
    "gulp-header": "^1.8.9",
    "gulp-rename": "^1.2.2",
    "gulp-sass": "^2.3.2",
    "gulp-shell": "^0.6.3",
    "gulp-sourcemaps": "^2.6.1",
    "gulp-string-replace": "^1.1.1",
    "handlebars-layouts": "^3.1.4",
    "http-server": "^0.10.0",
    "jsdoc": "^3.5.5",
    "jsdom": "^11.3.0",
    "run-sequence": "^2.2.1",
    "uglifyjs-webpack-plugin": "^1.0.1",
    "webpack": "^3.8.1",
    "webpack-stream": "^4.0.0"
  },
  "homepage": "https://farbelous.github.io/bootstrap-colorpicker/",
  "keywords": [
    "bootstrap",
    "colorpicker"
  ],
  "license": "MIT",
  "main": "./dist/js/bootstrap-colorpicker.js",
  "name": "bootstrap-colorpicker",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/farbelous/bootstrap-colorpicker.git"
  },
  "scripts": {
    "build": "gulp clean && gulp dist && gulp docs && gulp docs:add-v2-docs",
    "build-dist": "gulp dist",
    "build-docs": "gulp dist && gulp docs && gulp docs:add-v2-docs",
    "build-npm": "npm run build && gulp npm-prepublish",
    "lint": "eslint ./src/js ./*.js ./test",
    "lint-fix": "eslint --fix ./src/js ./*.js ./test",
    "publish-docs": "npm run build && npm run test && gulp publish-gh-pages",
    "start": "http-server ./build/docs",
    "test": "npm run lint && ava --color --verbose"
  },
  "version": "3.1.2"
}

Added public/bootstrap-colorpicker/src/js/AddonHandler.js.





































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
'use strict';

/**
 * Handles everything related to the colorpicker addon
 * @ignore
 */
class AddonHandler {
  /**
   * @param {Colorpicker} colorpicker
   */
  constructor(colorpicker) {
    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {jQuery}
     */
    this.addon = null;
  }

  hasAddon() {
    return !!this.addon;
  }

  bind() {
    /**
     * @type {*|jQuery}
     */
    this.addon = this.colorpicker.options.addon ?
      this.colorpicker.element.find(this.colorpicker.options.addon) : null;

    if (this.addon && (this.addon.length === 0)) {
      // not found
      this.addon = null;
    }
  }

  unbind() {
    if (this.hasAddon()) {
      this.addon.off('.colorpicker');
    }
  }

  /**
   * If the addon element is present, its background color is updated
   */
  update() {
    if (!this.colorpicker.colorHandler.hasColor() || !this.hasAddon()) {
      return;
    }

    let colorStr = this.colorpicker.colorHandler.getColorString();
    let styles = {'background': colorStr};

    let icn = this.addon.find('i').eq(0);

    if (icn.length > 0) {
      icn.css(styles);
    } else {
      this.addon.css(styles);
    }
  }
}

export default AddonHandler;

Added public/bootstrap-colorpicker/src/js/ColorHandler.js.



























































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
'use strict';

import $ from 'jquery';
import ColorItem from './ColorItem';

/**
 * Handles everything related to the colorpicker color
 * @ignore
 */
class ColorHandler {
  /**
   * @param {Colorpicker} colorpicker
   */
  constructor(colorpicker) {
    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
  }

  /**
   * @returns {*|String|ColorItem}
   */
  get fallback() {
    return this.colorpicker.options.fallbackColor ?
      this.colorpicker.options.fallbackColor : (this.hasColor() ? this.color : null);
  }

  /**
   * @returns {String|null}
   */
  get format() {
    if (this.colorpicker.options.format) {
      return this.colorpicker.options.format;
    }

    if (this.hasColor() && this.color.hasTransparency() && this.color.format.match(/^hex/)) {
      return this.isAlphaEnabled() ? 'rgba' : 'hex';
    }

    if (this.hasColor()) {
      return this.color.format;
    }

    return 'rgb';
  }

  /**
   * Internal color getter
   *
   * @type {ColorItem|null}
   */
  get color() {
    return this.colorpicker.element.data('color');
  }

  /**
   * Internal color setter
   *
   * @ignore
   * @param {ColorItem|null} value
   */
  set color(value) {
    this.colorpicker.element.data('color', value);

    if ((value instanceof ColorItem) && (this.colorpicker.options.format === 'auto')) {
      // If format is 'auto', use the first parsed one from now on
      this.colorpicker.options.format = this.color.format;
    }
  }

  bind() {
    // if the color option is set
    if (this.colorpicker.options.color) {
      this.color = this.createColor(this.colorpicker.options.color);
      return;
    }

    // if element[color] is empty and the input has a value
    if (!this.color && !!this.colorpicker.inputHandler.getValue()) {
      this.color = this.createColor(
        this.colorpicker.inputHandler.getValue(), this.colorpicker.options.autoInputFallback
      );
    }
  }

  unbind() {
    this.colorpicker.element.removeData('color');
  }

  /**
   * Returns the color string from the input value or the 'data-color' attribute of the input or element.
   * If empty, it returns the defaultValue parameter.
   *
   * @returns {String|*}
   */
  getColorString() {
    if (!this.hasColor()) {
      return '';
    }

    return this.color.string(this.format);
  }

  /**
   * Sets the color value
   *
   * @param {String|ColorItem} val
   */
  setColorString(val) {
    let color = val ? this.createColor(val) : null;

    this.color = color ? color : null;
  }

  /**
   * Creates a new color using the widget instance options (fallbackColor, format).
   *
   * @fires Colorpicker#colorpickerInvalid
   * @param {*} val
   * @param {boolean} fallbackOnInvalid
   * @returns {ColorItem}
   */
  createColor(val, fallbackOnInvalid = true) {
    let color = new ColorItem(this.resolveColorDelegate(val), this.format);

    if (!color.isValid()) {
      if (fallbackOnInvalid) {
        color = this.getFallbackColor();
      }

      /**
       * (Colorpicker) Fired when the color is invalid and the fallback color is going to be used.
       *
       * @event Colorpicker#colorpickerInvalid
       */
      this.colorpicker.trigger('colorpickerInvalid', color, val);
    }

    if (!this.isAlphaEnabled()) {
      // Alpha is disabled
      color.alpha = 1;
    }

    return color;
  }

  getFallbackColor() {
    if (this.fallback && (this.fallback === this.color)) {
      return this.color;
    }

    let fallback = this.resolveColorDelegate(this.fallback);
    let color = new ColorItem(fallback, this.format);

    if (!color.isValid()) {
      console.warn('The fallback color is invalid. Falling back to the previous color or black if any.');
      return this.color ? this.color : new ColorItem('#000000', this.format);
    }

    return color;
  }

  /**
   * @returns {ColorItem}
   */
  assureColor() {
    if (!this.hasColor()) {
      this.color = this.getFallbackColor();
    }

    return this.color;
  }

  /**
   * Delegates the color resolution to the colorpicker extensions.
   *
   * @param {String|*} color
   * @param {boolean} realColor if true, the color should resolve into a real (not named) color code
   * @returns {ColorItem|String|*|null}
   */
  resolveColorDelegate(color, realColor = true) {
    let extResolvedColor = false;

    $.each(this.colorpicker.extensions, function (name, ext) {
      if (extResolvedColor !== false) {
        // skip if resolved
        return;
      }
      extResolvedColor = ext.resolveColor(color, realColor);
    });

    return extResolvedColor ? extResolvedColor : color;
  }

  /**
   * Checks if there is a color object, that it is valid and it is not a fallback
   * @returns {boolean}
   */
  isInvalidColor() {
    return !this.hasColor() || !this.color.isValid();
  }

  /**
   * Returns true if the useAlpha option is exactly true, false otherwise
   * @returns {boolean}
   */
  isAlphaEnabled() {
    return (this.colorpicker.options.useAlpha !== false);
  }

  /**
   * Returns true if the current color object is an instance of Color, false otherwise.
   * @returns {boolean}
   */
  hasColor() {
    return this.color instanceof ColorItem;
  }
}

export default ColorHandler;

Added public/bootstrap-colorpicker/src/js/ColorItem.js.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
/**
 * Color manipulation class, specific for Bootstrap Colorpicker
 */
import QixColor from 'color';

/**
 * HSVA color data class, containing the hue, saturation, value and alpha
 * information.
 */
class HSVAColor {
  /**
   * @param {number|int} h
   * @param {number|int} s
   * @param {number|int} v
   * @param {number|int} a
   */
  constructor(h, s, v, a) {
    this.h = isNaN(h) ? 0 : h;
    this.s = isNaN(s) ? 0 : s;
    this.v = isNaN(v) ? 0 : v;
    this.a = isNaN(h) ? 1 : a;
  }

  toString() {
    return `${this.h}, ${this.s}%, ${this.v}%, ${this.a}`;
  }
}

/**
 * HSVA color manipulation
 */
class ColorItem {

  /**
   * Returns the HSVAColor class
   *
   * @static
   * @example let colorData = new ColorItem.HSVAColor(360, 100, 100, 1);
   * @returns {HSVAColor}
   */
  static get HSVAColor() {
    return HSVAColor;
  }

  /**
   * Applies a method of the QixColor API and returns a new Color object or
   * the return value of the method call.
   *
   * If no argument is provided, the internal QixColor object is returned.
   *
   * @param {String} fn QixColor function name
   * @param args QixColor function arguments
   * @example let darkerColor = color.api('darken', 0.25);
   * @example let luminosity = color.api('luminosity');
   * @example color = color.api('negate');
   * @example let qColor = color.api().negate();
   * @returns {ColorItem|QixColor|*}
   */
  api(fn, ...args) {
    if (arguments.length === 0) {
      return this._color;
    }

    let result = this._color[fn].apply(this._color, args);

    if (!(result instanceof QixColor)) {
      // return result of the method call
      return result;
    }

    return new ColorItem(result, this.format);
  }

  /**
   * Returns the original ColorItem constructor data,
   * plus a 'valid' flag to know if it's valid or not.
   *
   * @returns {{color: *, format: String, valid: boolean}}
   */
  get original() {
    return this._original;
  }

  /**
   * @param {ColorItem|HSVAColor|QixColor|String|*|null} color Color data
   * @param {String|null} format Color model to convert to by default. Supported: 'rgb', 'hsl', 'hex'.
   */
  constructor(color = null, format = null) {
    this.replace(color, format);
  }

  /**
   * Replaces the internal QixColor object with a new one.
   * This also replaces the internal original color data.
   *
   * @param {ColorItem|HSVAColor|QixColor|String|*|null} color Color data to be parsed (if needed)
   * @param {String|null} format Color model to convert to by default. Supported: 'rgb', 'hsl', 'hex'.
   * @example color.replace('rgb(255,0,0)', 'hsl');
   * @example color.replace(hsvaColorData);
   */
  replace(color, format = null) {
    format = ColorItem.sanitizeFormat(format);

    /**
     * @type {{color: *, format: String}}
     * @private
     */
    this._original = {
      color: color,
      format: format,
      valid: true
    };
    /**
     * @type {QixColor}
     * @private
     */
    this._color = ColorItem.parse(color);

    if (this._color === null) {
      this._color = QixColor();
      this._original.valid = false;
      return;
    }

    /**
     * @type {*|string}
     * @private
     */
    this._format = format ? format :
      (ColorItem.isHex(color) ? 'hex' : this._color.model);
  }

  /**
   * Parses the color returning a Qix Color object or null if cannot be
   * parsed.
   *
   * @param {ColorItem|HSVAColor|QixColor|String|*|null} color Color data
   * @example let qColor = ColorItem.parse('rgb(255,0,0)');
   * @static
   * @returns {QixColor|null}
   */
  static parse(color) {
    if (color instanceof QixColor) {
      return color;
    }

    if (color instanceof ColorItem) {
      return color._color;
    }

    let format = null;

    if (color instanceof HSVAColor) {
      color = [color.h, color.s, color.v, isNaN(color.a) ? 1 : color.a];
    } else {
      color = ColorItem.sanitizeString(color);
    }

    if (color === null) {
      return null;
    }

    if (Array.isArray(color)) {
      format = 'hsv';
    }

    try {
      return QixColor(color, format);
    } catch (e) {
      return null;
    }
  }

  /**
   * Sanitizes a color string, adding missing hash to hexadecimal colors
   * and converting 'transparent' to a color code.
   *
   * @param {String|*} str Color string
   * @example let colorStr = ColorItem.sanitizeString('ffaa00');
   * @static
   * @returns {String|*}
   */
  static sanitizeString(str) {
    if (!(typeof str === 'string' || str instanceof String)) {
      return str;
    }

    if (str.match(/^[0-9a-f]{2,}$/i)) {
      return `#${str}`;
    }

    if (str.toLowerCase() === 'transparent') {
      return '#FFFFFF00';
    }

    return str;
  }

  /**
   * Detects if a value is a string and a color in hexadecimal format (in any variant).
   *
   * @param {String} str
   * @example ColorItem.isHex('rgba(0,0,0)'); // false
   * @example ColorItem.isHex('ffaa00'); // true
   * @example ColorItem.isHex('#ffaa00'); // true
   * @static
   * @returns {boolean}
   */
  static isHex(str) {
    if (!(typeof str === 'string' || str instanceof String)) {
      return false;
    }

    return !!str.match(/^#?[0-9a-f]{2,}$/i);
  }

  /**
   * Sanitizes a color format to one supported by web browsers.
   * Returns an empty string of the format can't be recognised.
   *
   * @param {String|*} format
   * @example ColorItem.sanitizeFormat('rgba'); // 'rgb'
   * @example ColorItem.isHex('hex8'); // 'hex'
   * @example ColorItem.isHex('invalid'); // ''
   * @static
   * @returns {String} 'rgb', 'hsl', 'hex' or ''.
   */
  static sanitizeFormat(format) {
    switch (format) {
      case 'hex':
      case 'hex3':
      case 'hex4':
      case 'hex6':
      case 'hex8':
        return 'hex';
      case 'rgb':
      case 'rgba':
      case 'keyword':
      case 'name':
        return 'rgb';
      case 'hsl':
      case 'hsla':
      case 'hsv':
      case 'hsva':
      case 'hwb': // HWB this is supported by Qix Color, but not by browsers
      case 'hwba':
        return 'hsl';
      default :
        return '';
    }
  }

  /**
   * Returns true if the color is valid, false if not.
   *
   * @returns {boolean}
   */
  isValid() {
    return this._original.valid === true;
  }

  /**
   * Hue value from 0 to 360
   *
   * @returns {int}
   */
  get hue() {
    return this._color.hue();
  }

  /**
   * Saturation value from 0 to 100
   *
   * @returns {int}
   */
  get saturation() {
    return this._color.saturationv();
  }

  /**
   * Value channel value from 0 to 100
   *
   * @returns {int}
   */
  get value() {
    return this._color.value();
  }

  /**
   * Alpha value from 0.0 to 1.0
   *
   * @returns {number}
   */
  get alpha() {
    let a = this._color.alpha();

    return isNaN(a) ? 1 : a;
  }

  /**
   * Default color format to convert to when calling toString() or string()
   *
   * @returns {String} 'rgb', 'hsl', 'hex' or ''
   */
  get format() {
    return this._format ? this._format : this._color.model;
  }

  /**
   * Sets the hue value
   *
   * @param {int} value Integer from 0 to 360
   */
  set hue(value) {
    this._color = this._color.hue(value);
  }

  /**
   * Sets the hue ratio, where 1.0 is 0, 0.5 is 180 and 0.0 is 360.
   *
   * @ignore
   * @param {number} h Ratio from 1.0 to 0.0
   */
  setHueRatio(h) {
    this.hue = ((1 - h) * 360);
  }

  /**
   * Sets the saturation value
   *
   * @param {int} value Integer from 0 to 100
   */
  set saturation(value) {
    this._color = this._color.saturationv(value);
  }

  /**
   * Sets the saturation ratio, where 1.0 is 100 and 0.0 is 0.
   *
   * @ignore
   * @param {number} s Ratio from 0.0 to 1.0
   */
  setSaturationRatio(s) {
    this.saturation = (s * 100);
  }

  /**
   * Sets the 'value' channel value
   *
   * @param {int} value Integer from 0 to 100
   */
  set value(value) {
    this._color = this._color.value(value);
  }

  /**
   * Sets the value ratio, where 1.0 is 0 and 0.0 is 100.
   *
   * @ignore
   * @param {number} v Ratio from 1.0 to 0.0
   */
  setValueRatio(v) {
    this.value = ((1 - v) * 100);
  }

  /**
   * Sets the alpha value. It will be rounded to 2 decimals.
   *
   * @param {int} value Float from 0.0 to 1.0
   */
  set alpha(value) {
    // 2 decimals max
    this._color = this._color.alpha(Math.round(value * 100) / 100);
  }

  /**
   * Sets the alpha ratio, where 1.0 is 0.0 and 0.0 is 1.0.
   *
   * @ignore
   * @param {number} a Ratio from 1.0 to 0.0
   */
  setAlphaRatio(a) {
    this.alpha = 1 - a;
  }

  /**
   * Sets the default color format
   *
   * @param {String} value Supported: 'rgb', 'hsl', 'hex'
   */
  set format(value) {
    this._format = ColorItem.sanitizeFormat(value);
  }

  /**
   * Returns true if the saturation value is zero, false otherwise
   *
   * @returns {boolean}
   */
  isDesaturated() {
    return this.saturation === 0;
  }

  /**
   * Returns true if the alpha value is zero, false otherwise
   *
   * @returns {boolean}
   */
  isTransparent() {
    return this.alpha === 0;
  }

  /**
   * Returns true if the alpha value is numeric and less than 1, false otherwise
   *
   * @returns {boolean}
   */
  hasTransparency() {
    return this.hasAlpha() && (this.alpha < 1);
  }

  /**
   * Returns true if the alpha value is numeric, false otherwise
   *
   * @returns {boolean}
   */
  hasAlpha() {
    return !isNaN(this.alpha);
  }

  /**
   * Returns a new HSVAColor object, based on the current color
   *
   * @returns {HSVAColor}
   */
  toObject() {
    return new HSVAColor(this.hue, this.saturation, this.value, this.alpha);
  }

  /**
   * Alias of toObject()
   *
   * @returns {HSVAColor}
   */
  toHsva() {
    return this.toObject();
  }

  /**
   * Returns a new HSVAColor object with the ratio values (from 0.0 to 1.0),
   * based on the current color.
   *
   * @ignore
   * @returns {HSVAColor}
   */
  toHsvaRatio() {
    return new HSVAColor(
      this.hue / 360,
      this.saturation / 100,
      this.value / 100,
      this.alpha
    );
  }

  /**
   * Converts the current color to its string representation,
   * using the internal format of this instance.
   *
   * @returns {String}
   */
  toString() {
    return this.string();
  }

  /**
   * Converts the current color to its string representation,
   * using the given format.
   *
   * @param {String|null} format Format to convert to. If empty or null, the internal format will be used.
   * @returns {String}
   */
  string(format = null) {
    format = ColorItem.sanitizeFormat(format ? format : this.format);

    if (!format) {
      return this._color.round().string();
    }

    if (this._color[format] === undefined) {
      throw new Error(`Unsupported color format: '${format}'`);
    }

    let str = this._color[format]();

    return str.round ? str.round().string() : str;
  }

  /**
   * Returns true if the given color values equals this one, false otherwise.
   * The format is not compared.
   * If any of the colors is invalid, the result will be false.
   *
   * @param {ColorItem|HSVAColor|QixColor|String|*|null} color Color data
   *
   * @returns {boolean}
   */
  equals(color) {
    color = (color instanceof ColorItem) ? color : new ColorItem(color);

    if (!color.isValid() || !this.isValid()) {
      return false;
    }

    return (
      this.hue === color.hue &&
      this.saturation === color.saturation &&
      this.value === color.value &&
      this.alpha === color.alpha
    );
  }

  /**
   * Creates a copy of this instance
   *
   * @returns {ColorItem}
   */
  getClone() {
    return new ColorItem(this._color, this.format);
  }

  /**
   * Creates a copy of this instance, only copying the hue value,
   * and setting the others to its max value.
   *
   * @returns {ColorItem}
   */
  getCloneHueOnly() {
    return new ColorItem([this.hue, 100, 100, 1], this.format);
  }

  /**
   * Creates a copy of this instance setting the alpha to the max.
   *
   * @returns {ColorItem}
   */
  getCloneOpaque() {
    return new ColorItem(this._color.alpha(1), this.format);
  }

  /**
   * Converts the color to a RGB string
   *
   * @returns {String}
   */
  toRgbString() {
    return this.string('rgb');
  }

  /**
   * Converts the color to a Hexadecimal string
   *
   * @returns {String}
   */
  toHexString() {
    return this.string('hex');
  }

  /**
   * Converts the color to a HSL string
   *
   * @returns {String}
   */
  toHslString() {
    return this.string('hsl');
  }

  /**
   * Returns true if the color is dark, false otherwhise.
   * This is useful to decide a text color.
   *
   * @returns {boolean}
   */
  isDark() {
    return this._color.isDark();
  }

  /**
   * Returns true if the color is light, false otherwhise.
   * This is useful to decide a text color.
   *
   * @returns {boolean}
   */
  isLight() {
    return this._color.isLight();
  }

  /**
   * Generates a list of colors using the given hue-based formula or the given array of hue values.
   * Hue formulas can be extended using ColorItem.colorFormulas static property.
   *
   * @param {String|Number[]} formula Examples: 'complementary', 'triad', 'tetrad', 'splitcomplement', [180, 270]
   * @example let colors = color.generate('triad');
   * @example let colors = color.generate([45, 80, 112, 200]);
   * @returns {ColorItem[]}
   */
  generate(formula) {
    let hues = [];

    if (Array.isArray(formula)) {
      hues = formula;
    } else if (!ColorItem.colorFormulas.hasOwnProperty(formula)) {
      throw new Error(`No color formula found with the name '${formula}'.`);
    } else {
      hues = ColorItem.colorFormulas[formula];
    }

    let colors = [], mainColor = this._color, format = this.format;

    hues.forEach(function (hue) {
      let levels = [
        hue ? ((mainColor.hue() + hue) % 360) : mainColor.hue(),
        mainColor.saturationv(),
        mainColor.value(),
        mainColor.alpha()
      ];

      colors.push(new ColorItem(levels, format));
    });

    return colors;
  }
}

/**
 * List of hue-based color formulas used by ColorItem.prototype.generate()
 *
 * @static
 * @type {{complementary: number[], triad: number[], tetrad: number[], splitcomplement: number[]}}
 */
ColorItem.colorFormulas = {
  complementary: [180],
  triad: [0, 120, 240],
  tetrad: [0, 90, 180, 270],
  splitcomplement: [0, 72, 216]
};

export default ColorItem;

export {
  HSVAColor,
  ColorItem
};

Added public/bootstrap-colorpicker/src/js/Colorpicker.js.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
'use strict';

import Extension from './Extension';
import defaults from './options';
import coreExtensions from 'extensions';
import $ from 'jquery';
import SliderHandler from './SliderHandler';
import PopupHandler from './PopupHandler';
import InputHandler from './InputHandler';
import ColorHandler from './ColorHandler';
import PickerHandler from './PickerHandler';
import AddonHandler from './AddonHandler';
import ColorItem from './ColorItem';

let colorPickerIdCounter = 0;
let root = (typeof self !== 'undefined' ? self : this); // window

/**
 * Colorpicker widget class
 */
class Colorpicker {
  /**
   * Color class
   *
   * @static
   * @type {Color}
   */
  static get Color() {
    return ColorItem;
  }

  /**
   * Extension class
   *
   * @static
   * @type {Extension}
   */
  static get Extension() {
    return Extension;
  }

  /**
   * Internal color object
   *
   * @type {Color|null}
   */
  get color() {
    return this.colorHandler.color;
  }

  /**
   * Internal color format
   *
   * @type {String|null}
   */
  get format() {
    return this.colorHandler.format;
  }

  /**
   * Getter of the picker element
   *
   * @returns {jQuery|HTMLElement}
   */
  get picker() {
    return this.pickerHandler.picker;
  }

  /**
   * @fires Colorpicker#colorpickerCreate
   * @param {Object|String} element
   * @param {Object} options
   * @constructor
   */
  constructor(element, options) {
    colorPickerIdCounter += 1;
    /**
     * The colorpicker instance number
     * @type {number}
     */
    this.id = colorPickerIdCounter;

    /**
     * Latest colorpicker event
     *
     * @type {{name: String, e: *}}
     */
    this.lastEvent = {
      alias: null,
      e: null
    };

    /**
     * The element that the colorpicker is bound to
     *
     * @type {*|jQuery}
     */
    this.element = $(element)
      .addClass('colorpicker-element')
      .attr('data-colorpicker-id', this.id);

    /**
     * @type {defaults}
     */
    this.options = $.extend(true, {}, defaults, options, this.element.data());

    /**
     * @type {boolean}
     * @private
     */
    this.disabled = false;

    /**
     * Extensions added to this instance
     *
     * @type {Extension[]}
     */
    this.extensions = [];

    /**
     * The element where the
     * @type {*|jQuery}
     */
    this.container = (
      this.options.container === true ||
      (this.options.container !== true && this.options.inline === true)
    ) ? this.element : this.options.container;

    this.container = (this.container !== false) ? $(this.container) : false;

    /**
     * @type {InputHandler}
     */
    this.inputHandler = new InputHandler(this);
    /**
     * @type {ColorHandler}
     */
    this.colorHandler = new ColorHandler(this);
    /**
     * @type {SliderHandler}
     */
    this.sliderHandler = new SliderHandler(this);
    /**
     * @type {PopupHandler}
     */
    this.popupHandler = new PopupHandler(this, root);
    /**
     * @type {PickerHandler}
     */
    this.pickerHandler = new PickerHandler(this);
    /**
     * @type {AddonHandler}
     */
    this.addonHandler = new AddonHandler(this);

    this.init();

    // Emit a create event
    $($.proxy(function () {
      /**
       * (Colorpicker) When the Colorpicker instance has been created and the DOM is ready.
       *
       * @event Colorpicker#colorpickerCreate
       */
      this.trigger('colorpickerCreate');
    }, this));
  }

  /**
   * Initializes the plugin
   * @private
   */
  init() {
    // Init addon
    this.addonHandler.bind();

    // Init input
    this.inputHandler.bind();

    // Init extensions (before initializing the color)
    this.initExtensions();

    // Init color
    this.colorHandler.bind();

    // Init picker
    this.pickerHandler.bind();

    // Init sliders and popup
    this.sliderHandler.bind();
    this.popupHandler.bind();

    // Inject into the DOM (this may make it visible)
    this.pickerHandler.attach();

    // Update all components
    this.update();

    if (this.inputHandler.isDisabled()) {
      this.disable();
    }
  }

  /**
   * Initializes the plugin extensions
   * @private
   */
  initExtensions() {
    if (!Array.isArray(this.options.extensions)) {
      this.options.extensions = [];
    }

    if (this.options.debug) {
      this.options.extensions.push({name: 'debugger'});
    }

    // Register and instantiate extensions
    this.options.extensions.forEach((ext) => {
      this.registerExtension(Colorpicker.extensions[ext.name.toLowerCase()], ext.options || {});
    });
  }

  /**
   * Creates and registers the given extension
   *
   * @param {Extension} ExtensionClass The extension class to instantiate
   * @param {Object} [config] Extension configuration
   * @returns {Extension}
   */
  registerExtension(ExtensionClass, config = {}) {
    let ext = new ExtensionClass(this, config);

    this.extensions.push(ext);
    return ext;
  }

  /**
   * Destroys the current instance
   *
   * @fires Colorpicker#colorpickerDestroy
   */
  destroy() {
    let color = this.color;

    this.sliderHandler.unbind();
    this.inputHandler.unbind();
    this.popupHandler.unbind();
    this.colorHandler.unbind();
    this.addonHandler.unbind();
    this.pickerHandler.unbind();

    this.element
      .removeClass('colorpicker-element')
      .removeData('colorpicker', 'color')
      .off('.colorpicker');

    /**
     * (Colorpicker) When the instance is destroyed with all events unbound.
     *
     * @event Colorpicker#colorpickerDestroy
     */
    this.trigger('colorpickerDestroy', color);
  }

  /**
   * Shows the colorpicker widget if hidden.
   * If the colorpicker is disabled this call will be ignored.
   *
   * @fires Colorpicker#colorpickerShow
   * @param {Event} [e]
   */
  show(e) {
    this.popupHandler.show(e);
  }

  /**
   * Hides the colorpicker widget.
   *
   * @fires Colorpicker#colorpickerHide
   * @param {Event} [e]
   */
  hide(e) {
    this.popupHandler.hide(e);
  }

  /**
   * Toggles the colorpicker between visible and hidden.
   *
   * @fires Colorpicker#colorpickerShow
   * @fires Colorpicker#colorpickerHide
   * @param {Event} [e]
   */
  toggle(e) {
    this.popupHandler.toggle(e);
  }

  /**
   * Returns the current color value as string
   *
   * @param {String|*} [defaultValue]
   * @returns {String|*}
   */
  getValue(defaultValue = null) {
    let val = this.colorHandler.color;

    val = (val instanceof ColorItem) ? val : defaultValue;

    if (val instanceof ColorItem) {
      return val.string(this.format);
    }

    return val;
  }

  /**
   * Sets the color manually
   *
   * @fires Colorpicker#colorpickerChange
   * @param {String|Color} val
   */
  setValue(val) {
    if (this.isDisabled()) {
      return;
    }
    let ch = this.colorHandler;

    if (
      (ch.hasColor() && !!val && ch.color.equals(val)) ||
      (!ch.hasColor() && !val)
    ) {
      // same color or still empty
      return;
    }

    ch.color = val ? ch.createColor(val, this.options.autoInputFallback) : null;

    /**
     * (Colorpicker) When the color is set programmatically with setValue().
     *
     * @event Colorpicker#colorpickerChange
     */
    this.trigger('colorpickerChange', ch.color, val);

    // force update if color has changed to empty
    this.update();
  }

  /**
   * Updates the UI and the input color according to the internal color.
   *
   * @fires Colorpicker#colorpickerUpdate
   */
  update() {
    if (this.colorHandler.hasColor()) {
      this.inputHandler.update();
    } else {
      this.colorHandler.assureColor();
    }

    this.addonHandler.update();
    this.pickerHandler.update();

    /**
     * (Colorpicker) Fired when the widget is updated.
     *
     * @event Colorpicker#colorpickerUpdate
     */
    this.trigger('colorpickerUpdate');
  }

  /**
   * Enables the widget and the input if any
   *
   * @fires Colorpicker#colorpickerEnable
   * @returns {boolean}
   */
  enable() {
    this.inputHandler.enable();
    this.disabled = false;
    this.picker.removeClass('colorpicker-disabled');

    /**
     * (Colorpicker) When the widget has been enabled.
     *
     * @event Colorpicker#colorpickerEnable
     */
    this.trigger('colorpickerEnable');
    return true;
  }

  /**
   * Disables the widget and the input if any
   *
   * @fires Colorpicker#colorpickerDisable
   * @returns {boolean}
   */
  disable() {
    this.inputHandler.disable();
    this.disabled = true;
    this.picker.addClass('colorpicker-disabled');

    /**
     * (Colorpicker) When the widget has been disabled.
     *
     * @event Colorpicker#colorpickerDisable
     */
    this.trigger('colorpickerDisable');
    return true;
  }

  /**
   * Returns true if this instance is enabled
   * @returns {boolean}
   */
  isEnabled() {
    return !this.isDisabled();
  }

  /**
   * Returns true if this instance is disabled
   * @returns {boolean}
   */
  isDisabled() {
    return this.disabled === true;
  }

  /**
   * Triggers a Colorpicker event.
   *
   * @param eventName
   * @param color
   * @param value
   */
  trigger(eventName, color = null, value = null) {
    this.element.trigger({
      type: eventName,
      colorpicker: this,
      color: color ? color : this.color,
      value: value ? value : this.getValue()
    });
  }
}

/**
 * Colorpicker extension classes, indexed by extension name
 *
 * @static
 * @type {Object} a map between the extension name and its class
 */
Colorpicker.extensions = coreExtensions;

export default Colorpicker;

Added public/bootstrap-colorpicker/src/js/Extension.js.



































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
'use strict';

import $ from 'jquery';

/**
 * Colorpicker extension class.
 */
class Extension {
  /**
   * @param {Colorpicker} colorpicker
   * @param {Object} options
   */
  constructor(colorpicker, options = {}) {
    /**
     * The colorpicker instance
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * Extension options
     *
     * @type {Object}
     */
    this.options = options;

    if (!(this.colorpicker.element && this.colorpicker.element.length)) {
      throw new Error('Extension: this.colorpicker.element is not valid');
    }

    this.colorpicker.element.on('colorpickerCreate.colorpicker-ext', $.proxy(this.onCreate, this));
    this.colorpicker.element.on('colorpickerDestroy.colorpicker-ext', $.proxy(this.onDestroy, this));
    this.colorpicker.element.on('colorpickerUpdate.colorpicker-ext', $.proxy(this.onUpdate, this));
    this.colorpicker.element.on('colorpickerChange.colorpicker-ext', $.proxy(this.onChange, this));
    this.colorpicker.element.on('colorpickerInvalid.colorpicker-ext', $.proxy(this.onInvalid, this));
    this.colorpicker.element.on('colorpickerShow.colorpicker-ext', $.proxy(this.onShow, this));
    this.colorpicker.element.on('colorpickerHide.colorpicker-ext', $.proxy(this.onHide, this));
    this.colorpicker.element.on('colorpickerEnable.colorpicker-ext', $.proxy(this.onEnable, this));
    this.colorpicker.element.on('colorpickerDisable.colorpicker-ext', $.proxy(this.onDisable, this));
  }

  /**
   * Function called every time a new color needs to be created.
   * Return false to skip this resolver and continue with other extensions' ones
   * or return anything else to consider the color resolved.
   *
   * @param {ColorItem|String|*} color
   * @param {boolean} realColor if true, the color should resolve into a real (not named) color code
   * @return {ColorItem|String|*}
   */
  resolveColor(color, realColor = true) {
    return false;
  }

  /**
   * Method called after the colorpicker is created
   *
   * @listens Colorpicker#colorpickerCreate
   * @param {Event} event
   */
  onCreate(event) {
    // to be extended
  }

  /**
   * Method called after the colorpicker is destroyed
   *
   * @listens Colorpicker#colorpickerDestroy
   * @param {Event} event
   */
  onDestroy(event) {
    this.colorpicker.element.off('.colorpicker-ext');
  }

  /**
   * Method called after the colorpicker is updated
   *
   * @listens Colorpicker#colorpickerUpdate
   * @param {Event} event
   */
  onUpdate(event) {
    // to be extended
  }

  /**
   * Method called after the colorpicker color is changed
   *
   * @listens Colorpicker#colorpickerChange
   * @param {Event} event
   */
  onChange(event) {
    // to be extended
  }

  /**
   * Method called when the colorpicker color is invalid
   *
   * @listens Colorpicker#colorpickerInvalid
   * @param {Event} event
   */
  onInvalid(event) {
    // to be extended
  }

  /**
   * Method called after the colorpicker is hidden
   *
   * @listens Colorpicker#colorpickerHide
   * @param {Event} event
   */
  onHide(event) {
    // to be extended
  }

  /**
   * Method called after the colorpicker is shown
   *
   * @listens Colorpicker#colorpickerShow
   * @param {Event} event
   */
  onShow(event) {
    // to be extended
  }

  /**
   * Method called after the colorpicker is disabled
   *
   * @listens Colorpicker#colorpickerDisable
   * @param {Event} event
   */
  onDisable(event) {
    // to be extended
  }

  /**
   * Method called after the colorpicker is enabled
   *
   * @listens Colorpicker#colorpickerEnable
   * @param {Event} event
   */
  onEnable(event) {
    // to be extended
  }
}

export default Extension;

Added public/bootstrap-colorpicker/src/js/InputHandler.js.







































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
'use strict';

import $ from 'jquery';
import ColorItem from './ColorItem';

/**
 * Handles everything related to the colorpicker input
 * @ignore
 */
class InputHandler {
  /**
   * @param {Colorpicker} colorpicker
   */
  constructor(colorpicker) {
    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {jQuery|false}
     */
    this.input = this.colorpicker.element.is('input') ? this.colorpicker.element : (this.colorpicker.options.input ?
      this.colorpicker.element.find(this.colorpicker.options.input) : false);

    if (this.input && (this.input.length === 0)) {
      this.input = false;
    }

    this._initValue();
  }

  bind() {
    if (!this.hasInput()) {
      return;
    }
    this.input.on({
      'keyup.colorpicker': $.proxy(this.onkeyup, this)
    });
    this.input.on({
      'change.colorpicker': $.proxy(this.onchange, this)
    });
  }

  unbind() {
    if (!this.hasInput()) {
      return;
    }
    this.input.off('.colorpicker');
  }

  _initValue() {
    if (!this.hasInput()) {
      return;
    }

    let val = '';

    [
      // candidates:
      this.input.val(),
      this.input.data('color'),
      this.input.attr('data-color')
    ].map((item) => {
      if (item && (val === '')) {
        val = item;
      }
    });

    if (val instanceof ColorItem) {
      val = this.getFormattedColor(val.string(this.colorpicker.format));
    } else if (!(typeof val === 'string' || val instanceof String)) {
      val = '';
    }

    this.input.prop('value', val);
  }

  /**
   * Returns the color string from the input value.
   * If there is no input the return value is false.
   *
   * @returns {String|boolean}
   */
  getValue() {
    if (!this.hasInput()) {
      return false;
    }

    return this.input.val();
  }

  /**
   * If the input element is present, it updates the value with the current color object color string.
   * If the value is changed, this method fires a "change" event on the input element.
   *
   * @param {String} val
   *
   * @fires Colorpicker#change
   */
  setValue(val) {
    if (!this.hasInput()) {
      return;
    }

    let inputVal = this.input.prop('value');

    val = val ? val : '';

    if (val === (inputVal ? inputVal : '')) {
      // No need to set value or trigger any event if nothing changed
      return;
    }

    this.input.prop('value', val);

    /**
     * (Input) Triggered on the input element when a new color is selected.
     *
     * @event Colorpicker#change
     */
    this.input.trigger({
      type: 'change',
      colorpicker: this.colorpicker,
      color: this.colorpicker.color,
      value: val
    });
  }

  /**
   * Returns the formatted color string, with the formatting options applied
   * (e.g. useHashPrefix)
   *
   * @param {String|null} val
   *
   * @returns {String}
   */
  getFormattedColor(val = null) {
    val = val ? val : this.colorpicker.colorHandler.getColorString();

    if (!val) {
      return '';
    }

    val = this.colorpicker.colorHandler.resolveColorDelegate(val, false);

    if (this.colorpicker.options.useHashPrefix === false) {
      val = val.replace(/^#/g, '');
    }

    return val;
  }

  /**
   * Returns true if the widget has an associated input element, false otherwise
   * @returns {boolean}
   */
  hasInput() {
    return (this.input !== false);
  }

  /**
   * Returns true if the input exists and is disabled
   * @returns {boolean}
   */
  isEnabled() {
    return this.hasInput() && !this.isDisabled();
  }

  /**
   * Returns true if the input exists and is disabled
   * @returns {boolean}
   */
  isDisabled() {
    return this.hasInput() && (this.input.prop('disabled') === true);
  }

  /**
   * Disables the input if any
   *
   * @fires Colorpicker#colorpickerDisable
   * @returns {boolean}
   */
  disable() {
    if (this.hasInput()) {
      this.input.prop('disabled', true);
    }
  }

  /**
   * Enables the input if any
   *
   * @fires Colorpicker#colorpickerEnable
   * @returns {boolean}
   */
  enable() {
    if (this.hasInput()) {
      this.input.prop('disabled', false);
    }
  }

  /**
   * Calls setValue with the current internal color value
   *
   * @fires Colorpicker#change
   */
  update() {
    if (!this.hasInput()) {
      return;
    }

    if (
      (this.colorpicker.options.autoInputFallback === false) &&
      this.colorpicker.colorHandler.isInvalidColor()
    ) {
      // prevent update if color is invalid, autoInputFallback is disabled and the last event is keyup.
      return;
    }

    this.setValue(this.getFormattedColor());
  }

  /**
   * Function triggered when the input has changed, so the colorpicker gets updated.
   *
   * @private
   * @param {Event} e
   * @returns {boolean}
   */
  onchange(e) {
    this.colorpicker.lastEvent.alias = 'input.change';
    this.colorpicker.lastEvent.e = e;

    let val = this.getValue();

    if (val !== e.value) {
      this.colorpicker.setValue(val);
    }
  }

  /**
   * Function triggered after a keyboard key has been released.
   *
   * @private
   * @param {Event} e
   * @returns {boolean}
   */
  onkeyup(e) {
    this.colorpicker.lastEvent.alias = 'input.keyup';
    this.colorpicker.lastEvent.e = e;

    let val = this.getValue();

    if (val !== e.value) {
      this.colorpicker.setValue(val);
    }
  }
}

export default InputHandler;

Added public/bootstrap-colorpicker/src/js/PickerHandler.js.

























































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
'use strict';

import $ from 'jquery';

/**
 * Handles everything related to the colorpicker UI
 * @ignore
 */
class PickerHandler {
  /**
   * @param {Colorpicker} colorpicker
   */
  constructor(colorpicker) {
    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {jQuery}
     */
    this.picker = null;
  }

  get options() {
    return this.colorpicker.options;
  }

  get color() {
    return this.colorpicker.colorHandler.color;
  }

  bind() {
    /**
     * @type {jQuery|HTMLElement}
     */
    let picker = this.picker = $(this.options.template);

    if (this.options.customClass) {
      picker.addClass(this.options.customClass);
    }

    if (this.options.horizontal) {
      picker.addClass('colorpicker-horizontal');
    }

    if (this._supportsAlphaBar()) {
      this.options.useAlpha = true;
      picker.addClass('colorpicker-with-alpha');
    } else {
      this.options.useAlpha = false;
    }
  }

  attach() {
    // Inject the colorpicker element into the DOM
    let pickerParent = this.colorpicker.container ? this.colorpicker.container : null;

    if (pickerParent) {
      this.picker.appendTo(pickerParent);
    }
  }

  unbind() {
    this.picker.remove();
  }

  _supportsAlphaBar() {
    return (
      (this.options.useAlpha || (this.colorpicker.colorHandler.hasColor() && this.color.hasTransparency())) &&
      (this.options.useAlpha !== false) &&
      (!this.options.format || (this.options.format && !this.options.format.match(/^hex([36])?$/i)))
    );
  }

  /**
   * Changes the color adjustment bars using the current color object information.
   */
  update() {
    if (!this.colorpicker.colorHandler.hasColor()) {
      return;
    }

    let vertical = (this.options.horizontal !== true),
      slider = vertical ? this.options.sliders : this.options.slidersHorz;

    let saturationGuide = this.picker.find('.colorpicker-saturation .colorpicker-guide'),
      hueGuide = this.picker.find('.colorpicker-hue .colorpicker-guide'),
      alphaGuide = this.picker.find('.colorpicker-alpha .colorpicker-guide');

    let hsva = this.color.toHsvaRatio();

    // Set guides position
    if (hueGuide.length) {
      hueGuide.css(vertical ? 'top' : 'left', (vertical ? slider.hue.maxTop : slider.hue.maxLeft) * (1 - hsva.h));
    }
    if (alphaGuide.length) {
      alphaGuide.css(vertical ? 'top' : 'left', (vertical ? slider.alpha.maxTop : slider.alpha.maxLeft) * (1 - hsva.a));
    }
    if (saturationGuide.length) {
      saturationGuide.css({
        'top': slider.saturation.maxTop - hsva.v * slider.saturation.maxTop,
        'left': hsva.s * slider.saturation.maxLeft
      });
    }

    // Set saturation hue background
    this.picker.find('.colorpicker-saturation')
      .css('backgroundColor', this.color.getCloneHueOnly().toHexString()); // we only need hue

    // Set alpha color gradient
    let hexColor = this.color.toHexString();
    let alphaBg = '';

    if (this.options.horizontal) {
      alphaBg = `linear-gradient(to right, ${hexColor} 0%, transparent 100%)`;
    } else {
      alphaBg = `linear-gradient(to bottom, ${hexColor} 0%, transparent 100%)`;
    }

    this.picker.find('.colorpicker-alpha-color').css('background', alphaBg);
  }
}

export default PickerHandler;

Added public/bootstrap-colorpicker/src/js/PopupHandler.js.



































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
'use strict';

import $ from 'jquery';
import _defaults from './options';

/**
 * Handles everything related to the UI of the colorpicker popup: show, hide, position,...
 * @ignore
 */
class PopupHandler {
  /**
   * @param {Colorpicker} colorpicker
   * @param {Window} root
   */
  constructor(colorpicker, root) {
    /**
     * @type {Window}
     */
    this.root = root;
    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {jQuery}
     */
    this.popoverTarget = null;
    /**
     * @type {jQuery}
     */
    this.popoverTip = null;

    /**
     * If true, the latest click was inside the popover
     * @type {boolean}
     */
    this.clicking = false;
    /**
     * @type {boolean}
     */
    this.hidding = false;
    /**
     * @type {boolean}
     */
    this.showing = false;
  }

  /**
   * @private
   * @returns {jQuery|false}
   */
  get input() {
    return this.colorpicker.inputHandler.input;
  }

  /**
   * @private
   * @returns {boolean}
   */
  get hasInput() {
    return this.colorpicker.inputHandler.hasInput();
  }

  /**
   * @private
   * @returns {jQuery|false}
   */
  get addon() {
    return this.colorpicker.addonHandler.addon;
  }

  /**
   * @private
   * @returns {boolean}
   */
  get hasAddon() {
    return this.colorpicker.addonHandler.hasAddon();
  }

  /**
   * @private
   * @returns {boolean}
   */
  get isPopover() {
    return !this.colorpicker.options.inline && !!this.popoverTip;
  }

  /**
   * Binds the different colorpicker elements to the focus/mouse/touch events so it reacts in order to show or
   * hide the colorpicker popup accordingly. It also adds the proper classes.
   */
  bind() {
    let cp = this.colorpicker;

    if (cp.options.inline) {
      cp.picker.addClass('colorpicker-inline colorpicker-visible');
      return; // no need to bind show/hide events for inline elements
    }

    cp.picker.addClass('colorpicker-popup colorpicker-hidden');

    // there is no input or addon
    if (!this.hasInput && !this.hasAddon) {
      return;
    }

    // create Bootstrap 4 popover
    if (cp.options.popover) {
      this.createPopover();
    }

    // bind addon show/hide events
    if (this.hasAddon) {
      // enable focus on addons
      if (!this.addon.attr('tabindex')) {
        this.addon.attr('tabindex', 0);
      }

      this.addon.on({
        'mousedown.colorpicker touchstart.colorpicker': $.proxy(this.toggle, this)
      });

      this.addon.on({
        'focus.colorpicker': $.proxy(this.show, this)
      });

      this.addon.on({
        'focusout.colorpicker': $.proxy(this.hide, this)
      });
    }

    // bind input show/hide events
    if (this.hasInput && !this.hasAddon) {
      this.input.on({
        'mousedown.colorpicker touchstart.colorpicker': $.proxy(this.show, this),
        'focus.colorpicker': $.proxy(this.show, this)
      });

      this.input.on({
        'focusout.colorpicker': $.proxy(this.hide, this)
      });
    }

    // reposition popup on window resize
    $(this.root).on('resize.colorpicker', $.proxy(this.reposition, this));
  }

  /**
   * Unbinds any event bound by this handler
   */
  unbind() {
    if (this.hasInput) {
      this.input.off({
        'mousedown.colorpicker touchstart.colorpicker': $.proxy(this.show, this),
        'focus.colorpicker': $.proxy(this.show, this)
      });
      this.input.off({
        'focusout.colorpicker': $.proxy(this.hide, this)
      });
    }

    if (this.hasAddon) {
      this.addon.off({
        'mousedown.colorpicker touchstart.colorpicker': $.proxy(this.toggle, this)
      });
      this.addon.off({
        'focus.colorpicker': $.proxy(this.show, this)
      });
      this.addon.off({
        'focusout.colorpicker': $.proxy(this.hide, this)
      });
    }

    if (this.popoverTarget) {
      this.popoverTarget.popover('dispose');
    }

    $(this.root).off('resize.colorpicker', $.proxy(this.reposition, this));
    $(this.root.document).off('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.hide, this));
    $(this.root.document).off('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.onClickingInside, this));
  }

  isClickingInside(e) {
    if (!e) {
      return false;
    }

    return (
      this.isOrIsInside(this.popoverTip, e.currentTarget) ||
      this.isOrIsInside(this.popoverTip, e.target) ||
      this.isOrIsInside(this.colorpicker.picker, e.currentTarget) ||
      this.isOrIsInside(this.colorpicker.picker, e.target)
    );
  }

  isOrIsInside(container, element) {
    if (!container || !element) {
      return false;
    }

    element = $(element);

    return (
      element.is(container) ||
      container.find(element).length > 0
    );
  }

  onClickingInside(e) {
    this.clicking = this.isClickingInside(e);
  }

  createPopover() {
    let cp = this.colorpicker;

    this.popoverTarget = this.hasAddon ? this.addon : this.input;

    cp.picker.addClass('colorpicker-bs-popover-content');

    this.popoverTarget.popover(
      $.extend(
        true,
        {},
        _defaults.popover,
        cp.options.popover,
        {trigger: 'manual', content: cp.picker, html: true}
      )
    );

    this.popoverTip = $(this.popoverTarget.popover('getTipElement').data('bs.popover').tip);
    this.popoverTip.addClass('colorpicker-bs-popover');

    this.popoverTarget.on('shown.bs.popover', $.proxy(this.fireShow, this));
    this.popoverTarget.on('hidden.bs.popover', $.proxy(this.fireHide, this));
  }

  /**
   * If the widget is not inside a container or inline, rearranges its position relative to its element offset.
   *
   * @param {Event} [e]
   * @private
   */
  reposition(e) {
    if (this.popoverTarget && this.isVisible()) {
      this.popoverTarget.popover('update');
    }
  }

  /**
   * Toggles the colorpicker between visible or hidden
   *
   * @fires Colorpicker#colorpickerShow
   * @fires Colorpicker#colorpickerHide
   * @param {Event} [e]
   */
  toggle(e) {
    if (this.isVisible()) {
      this.hide(e);
    } else {
      this.show(e);
    }
  }

  /**
   * Shows the colorpicker widget if hidden.
   *
   * @fires Colorpicker#colorpickerShow
   * @param {Event} [e]
   */
  show(e) {
    if (this.isVisible() || this.showing || this.hidding) {
      return;
    }

    this.showing = true;
    this.hidding = false;
    this.clicking = false;

    let cp = this.colorpicker;

    cp.lastEvent.alias = 'show';
    cp.lastEvent.e = e;

    // Prevent showing browser native HTML5 colorpicker
    if (
      (e && (!this.hasInput || this.input.attr('type') === 'color')) &&
      (e && e.preventDefault)
    ) {
      e.stopPropagation();
      e.preventDefault();
    }

    // If it's a popover, add event to the document to hide the picker when clicking outside of it
    if (this.isPopover) {
      $(this.root).on('resize.colorpicker', $.proxy(this.reposition, this));
    }

    // add visible class before popover is shown
    cp.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');

    if (this.popoverTarget) {
      this.popoverTarget.popover('show');
    } else {
      this.fireShow();
    }
  }

  fireShow() {
    this.hidding = false;
    this.showing = false;

    if (this.isPopover) {
      // Add event to hide on outside click
      $(this.root.document).on('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.hide, this));
      $(this.root.document).on('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.onClickingInside, this));
    }

    /**
     * (Colorpicker) When show() is called and the widget can be shown.
     *
     * @event Colorpicker#colorpickerShow
     */
    this.colorpicker.trigger('colorpickerShow');
  }

  /**
   * Hides the colorpicker widget.
   * Hide is prevented when it is triggered by an event whose target element has been clicked/touched.
   *
   * @fires Colorpicker#colorpickerHide
   * @param {Event} [e]
   */
  hide(e) {
    if (this.isHidden() || this.showing || this.hidding) {
      return;
    }

    let cp = this.colorpicker, clicking = (this.clicking || this.isClickingInside(e));

    this.hidding = true;
    this.showing = false;
    this.clicking = false;

    cp.lastEvent.alias = 'hide';
    cp.lastEvent.e = e;

    // TODO: fix having to click twice outside when losing focus and last 2 clicks where inside the colorpicker

    // Prevent hide if triggered by an event and an element inside the colorpicker has been clicked/touched
    if (clicking) {
      this.hidding = false;
      return;
    }

    if (this.popoverTarget) {
      this.popoverTarget.popover('hide');
    } else {
      this.fireHide();
    }
  }

  fireHide() {
    this.hidding = false;
    this.showing = false;

    let cp = this.colorpicker;

    // add hidden class after popover is hidden
    cp.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');

    // Unbind window and document events, since there is no need to keep them while the popup is hidden
    $(this.root).off('resize.colorpicker', $.proxy(this.reposition, this));
    $(this.root.document).off('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.hide, this));
    $(this.root.document).off('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.onClickingInside, this));

    /**
     * (Colorpicker) When hide() is called and the widget can be hidden.
     *
     * @event Colorpicker#colorpickerHide
     */
    cp.trigger('colorpickerHide');
  }

  focus() {
    if (this.hasAddon) {
      return this.addon.focus();
    }
    if (this.hasInput) {
      return this.input.focus();
    }
    return false;
  }

  /**
   * Returns true if the colorpicker element has the colorpicker-visible class and not the colorpicker-hidden one.
   * False otherwise.
   *
   * @returns {boolean}
   */
  isVisible() {
    return this.colorpicker.picker.hasClass('colorpicker-visible') &&
      !this.colorpicker.picker.hasClass('colorpicker-hidden');
  }

  /**
   * Returns true if the colorpicker element has the colorpicker-hidden class and not the colorpicker-visible one.
   * False otherwise.
   *
   * @returns {boolean}
   */
  isHidden() {
    return this.colorpicker.picker.hasClass('colorpicker-hidden') &&
      !this.colorpicker.picker.hasClass('colorpicker-visible');
  }
}

export default PopupHandler;

Added public/bootstrap-colorpicker/src/js/SliderHandler.js.













































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
'use strict';

import $ from 'jquery';

/**
 * Class that handles all configured sliders on mouse or touch events.
 * @ignore
 */
class SliderHandler {
  /**
   * @param {Colorpicker} colorpicker
   */
  constructor(colorpicker) {
    /**
     * @type {Colorpicker}
     */
    this.colorpicker = colorpicker;
    /**
     * @type {*|String}
     * @private
     */
    this.currentSlider = null;
    /**
     * @type {{left: number, top: number}}
     * @private
     */
    this.mousePointer = {
      left: 0,
      top: 0
    };

    /**
     * @type {Function}
     */
    this.onMove = $.proxy(this.defaultOnMove, this);
  }

  /**
   * This function is called every time a slider guide is moved
   * The scope of "this" is the SliderHandler object.
   *
   * @param {int} top
   * @param {int} left
   */
  defaultOnMove(top, left) {
    if (!this.currentSlider) {
      return;
    }

    let slider = this.currentSlider, cp = this.colorpicker, ch = cp.colorHandler;

    // Create a color object
    let color = !ch.hasColor() ? ch.getFallbackColor() : ch.color.getClone();

    // Adjust the guide position
    slider.guideStyle.left = left + 'px';
    slider.guideStyle.top = top + 'px';

    // Adjust the color
    if (slider.callLeft) {
      color[slider.callLeft](left / slider.maxLeft);
    }
    if (slider.callTop) {
      color[slider.callTop](top / slider.maxTop);
    }

    // Set the new color
    cp.setValue(color);
    cp.popupHandler.focus();
  }

  /**
   * Binds the colorpicker sliders to the mouse/touch events
   */
  bind() {
    let sliders = this.colorpicker.options.horizontal ? this.colorpicker
      .options.slidersHorz : this.colorpicker.options.sliders;
    let sliderClasses = [];

    for (let sliderName in sliders) {
      if (!sliders.hasOwnProperty(sliderName)) {
        continue;
      }

      sliderClasses.push(sliders[sliderName].selector);
    }

    this.colorpicker.picker.find(sliderClasses.join(', '))
      .on('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.pressed, this));
  }

  /**
   * Unbinds any event bound by this handler
   */
  unbind() {
    $(this.colorpicker.picker).off({
      'mousemove.colorpicker': $.proxy(this.moved, this),
      'touchmove.colorpicker': $.proxy(this.moved, this),
      'mouseup.colorpicker': $.proxy(this.released, this),
      'touchend.colorpicker': $.proxy(this.released, this)
    });
  }

  /**
   * Function triggered when clicking in one of the color adjustment bars
   *
   * @private
   * @fires Colorpicker#mousemove
   * @param {Event} e
   */
  pressed(e) {
    if (this.colorpicker.isDisabled()) {
      return;
    }
    this.colorpicker.lastEvent.alias = 'pressed';
    this.colorpicker.lastEvent.e = e;

    if (!e.pageX && !e.pageY && e.originalEvent && e.originalEvent.touches) {
      e.pageX = e.originalEvent.touches[0].pageX;
      e.pageY = e.originalEvent.touches[0].pageY;
    }
    // e.stopPropagation();
    // e.preventDefault();

    let target = $(e.target);

    // detect the slider and set the limits and callbacks
    let zone = target.closest('div');
    let sliders = this.colorpicker.options.horizontal ? this.colorpicker
      .options.slidersHorz : this.colorpicker.options.sliders;

    if (zone.is('.colorpicker')) {
      return;
    }

    this.currentSlider = null;

    for (let sliderName in sliders) {
      if (!sliders.hasOwnProperty(sliderName)) {
        continue;
      }

      let slider = sliders[sliderName];

      if (zone.is(slider.selector)) {
        this.currentSlider = $.extend({}, slider, {name: sliderName});
        break;
      } else if (slider.childSelector !== undefined && zone.is(slider.childSelector)) {
        this.currentSlider = $.extend({}, slider, {name: sliderName});
        zone = zone.parent(); // zone.parents(slider.selector).first() ?
        break;
      }
    }

    let guide = zone.find('.colorpicker-guide').get(0);

    if (this.currentSlider === null || guide === null) {
      return;
    }

    let offset = zone.offset();

    // reference to guide's style
    this.currentSlider.guideStyle = guide.style;
    this.currentSlider.left = e.pageX - offset.left;
    this.currentSlider.top = e.pageY - offset.top;
    this.mousePointer = {
      left: e.pageX,
      top: e.pageY
    };

    // TODO: fix moving outside the picker makes the guides to keep moving. The event needs to be bound to the window.
    /**
     * (window.document) Triggered on mousedown for the document object,
     * so the color adjustment guide is moved to the clicked position.
     *
     * @event Colorpicker#mousemove
     */
    $(this.colorpicker.picker).on({
      'mousemove.colorpicker': $.proxy(this.moved, this),
      'touchmove.colorpicker': $.proxy(this.moved, this),
      'mouseup.colorpicker': $.proxy(this.released, this),
      'touchend.colorpicker': $.proxy(this.released, this)
    }).trigger('mousemove');
  }

  /**
   * Function triggered when dragging a guide inside one of the color adjustment bars.
   *
   * @private
   * @param {Event} e
   */
  moved(e) {
    this.colorpicker.lastEvent.alias = 'moved';
    this.colorpicker.lastEvent.e = e;

    if (!e.pageX && !e.pageY && e.originalEvent && e.originalEvent.touches) {
      e.pageX = e.originalEvent.touches[0].pageX;
      e.pageY = e.originalEvent.touches[0].pageY;
    }

    // e.stopPropagation();
    e.preventDefault(); // prevents scrolling on mobile

    let left = Math.max(
      0,
      Math.min(
        this.currentSlider.maxLeft,
        this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)
      )
    );

    let top = Math.max(
      0,
      Math.min(
        this.currentSlider.maxTop,
        this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)
      )
    );

    this.onMove(top, left);
  }

  /**
   * Function triggered when releasing the click in one of the color adjustment bars.
   *
   * @private
   * @param {Event} e
   */
  released(e) {
    this.colorpicker.lastEvent.alias = 'released';
    this.colorpicker.lastEvent.e = e;

    // e.stopPropagation();
    // e.preventDefault();

    $(this.colorpicker.picker).off({
      'mousemove.colorpicker': this.moved,
      'touchmove.colorpicker': this.moved,
      'mouseup.colorpicker': this.released,
      'touchend.colorpicker': this.released
    });
  }
}

export default SliderHandler;

Added public/bootstrap-colorpicker/src/js/extensions/Debugger.js.















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
'use strict';

import Extension from 'Extension';
import $ from 'jquery';

/**
 * Debugger extension class
 * @alias DebuggerExtension
 * @ignore
 */
class Debugger extends Extension {
  constructor(colorpicker, options = {}) {
    super(colorpicker, options);

    /**
     * @type {number}
     */
    this.eventCounter = 0;
    if (this.colorpicker.inputHandler.hasInput()) {
      this.colorpicker.inputHandler.input.on('change.colorpicker-ext', $.proxy(this.onChangeInput, this));
    }
  }

  /**
   * @fires DebuggerExtension#colorpickerDebug
   * @param {string} eventName
   * @param {*} args
   */
  log(eventName, ...args) {
    this.eventCounter += 1;

    let logMessage = `#${this.eventCounter}: Colorpicker#${this.colorpicker.id} [${eventName}]`;

    console.debug(logMessage, ...args);

    /**
     * Whenever the debugger logs an event, this other event is emitted.
     *
     * @event DebuggerExtension#colorpickerDebug
     * @type {object} The event object
     * @property {Colorpicker} colorpicker The Colorpicker instance
     * @property {ColorItem} color The color instance
     * @property {{debugger: DebuggerExtension, eventName: String, logArgs: Array, logMessage: String}} debug
     *  The debug info
     */
    this.colorpicker.element.trigger({
      type: 'colorpickerDebug',
      colorpicker: this.colorpicker,
      color: this.color,
      value: null,
      debug: {
        debugger: this,
        eventName: eventName,
        logArgs: args,
        logMessage: logMessage
      }
    });
  }

  resolveColor(color, realColor = true) {
    this.log('resolveColor()', color, realColor);
    return false;
  }

  onCreate(event) {
    this.log('colorpickerCreate');
    return super.onCreate(event);
  }

  onDestroy(event) {
    this.log('colorpickerDestroy');
    this.eventCounter = 0;

    if (this.colorpicker.inputHandler.hasInput()) {
      this.colorpicker.inputHandler.input.off('.colorpicker-ext');
    }

    return super.onDestroy(event);
  }

  onUpdate(event) {
    this.log('colorpickerUpdate');
  }

  /**
   * @listens Colorpicker#change
   * @param {Event} event
   */
  onChangeInput(event) {
    this.log('input:change.colorpicker', event.value, event.color);
  }

  onChange(event) {
    this.log('colorpickerChange', event.value, event.color);
  }

  onInvalid(event) {
    this.log('colorpickerInvalid', event.value, event.color);
  }

  onHide(event) {
    this.log('colorpickerHide');
    this.eventCounter = 0;
  }

  onShow(event) {
    this.log('colorpickerShow');
  }

  onDisable(event) {
    this.log('colorpickerDisable');
  }

  onEnable(event) {
    this.log('colorpickerEnable');
  }
}

export default Debugger;

Added public/bootstrap-colorpicker/src/js/extensions/Palette.js.













































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
'use strict';

import Extension from 'Extension';
import $ from 'jquery';

let defaults = {
  /**
   * Key-value pairs defining a color alias and its CSS color representation.
   *
   * They can also be just an array of values. In that case, no special names are used, only the real colors.
   *
   * @type {Object|Array}
   * @default null
   * @example
   *  {
   *   'black': '#000000',
   *   'white': '#ffffff',
   *   'red': '#FF0000',
   *   'default': '#777777',
   *   'primary': '#337ab7',
   *   'success': '#5cb85c',
   *   'info': '#5bc0de',
   *   'warning': '#f0ad4e',
   *   'danger': '#d9534f'
   *  }
   *
   * @example ['#f0ad4e', '#337ab7', '#5cb85c']
   */
  colors: null,
  /**
   * If true, when a color swatch is selected the name (alias) will be used as input value,
   * otherwise the swatch real color value will be used.
   *
   * @type {boolean}
   * @default true
   */
  namesAsValues: true
};

/**
 * Palette extension
 * @ignore
 */
class Palette extends Extension {

  /**
   * @returns {Object|Array}
   */
  get colors() {
    return this.options.colors;
  }

  constructor(colorpicker, options = {}) {
    super(colorpicker, $.extend(true, {}, defaults, options));

    if ((!Array.isArray(this.options.colors)) && (typeof this.options.colors !== 'object')) {
      this.options.colors = null;
    }
  }

  /**
   * @returns {int}
   */
  getLength() {
    if (!this.options.colors) {
      return 0;
    }

    if (Array.isArray(this.options.colors)) {
      return this.options.colors.length;
    }

    if (typeof this.options.colors === 'object') {
      return Object.keys(this.options.colors).length;
    }

    return 0;
  }

  resolveColor(color, realColor = true) {
    if (this.getLength() <= 0) {
      return false;
    }

    // Array of colors
    if (Array.isArray(this.options.colors)) {
      if (this.options.colors.indexOf(color) >= 0) {
        return color;
      }
      if (this.options.colors.indexOf(color.toUpperCase()) >= 0) {
        return color.toUpperCase();
      }
      if (this.options.colors.indexOf(color.toLowerCase()) >= 0) {
        return color.toLowerCase();
      }
      return false;
    }

    if (typeof this.options.colors !== 'object') {
      return false;
    }

    // Map of objects
    if (!this.options.namesAsValues || realColor) {
      return this.getValue(color, false);
    }
    return this.getName(color, this.getName('#' + color));
  }

  /**
   * Given a color value, returns the corresponding color name or defaultValue.
   *
   * @param {String} value
   * @param {*} defaultValue
   * @returns {*}
   */
  getName(value, defaultValue = false) {
    if (!(typeof value === 'string') || !this.options.colors) {
      return defaultValue;
    }
    for (let name in this.options.colors) {
      if (!this.options.colors.hasOwnProperty(name)) {
        continue;
      }
      if (this.options.colors[name].toLowerCase() === value.toLowerCase()) {
        return name;
      }
    }
    return defaultValue;
  }

  /**
   * Given a color name, returns the corresponding color value or defaultValue.
   *
   * @param {String} name
   * @param {*} defaultValue
   * @returns {*}
   */
  getValue(name, defaultValue = false) {
    if (!(typeof name === 'string') || !this.options.colors) {
      return defaultValue;
    }
    if (this.options.colors.hasOwnProperty(name)) {
      return this.options.colors[name];
    }
    return defaultValue;
  }
}

export default Palette;

Added public/bootstrap-colorpicker/src/js/extensions/Preview.js.



















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
'use strict';

import Extension from 'Extension';
import $ from 'jquery';

/**
 * Color preview extension
 * @ignore
 */
class Preview extends Extension {
  constructor(colorpicker, options = {}) {
    super(colorpicker, $.extend(true, {},
      {
        template: '<div class="colorpicker-bar colorpicker-preview"><div /></div>',
        showText: true,
        format: colorpicker.format
      },
      options
    ));

    this.element = $(this.options.template);
    this.elementInner = this.element.find('div');
  }

  onCreate(event) {
    super.onCreate(event);
    this.colorpicker.picker.append(this.element);
  }

  onUpdate(event) {
    super.onUpdate(event);

    if (!event.color) {
      this.elementInner
        .css('backgroundColor', null)
        .css('color', null)
        .html('');
      return;
    }

    this.elementInner
      .css('backgroundColor', event.color.toRgbString());

    if (this.options.showText) {
      this.elementInner
        .html(event.color.string(this.options.format || this.colorpicker.format));

      if (event.color.isDark() && (event.color.alpha > 0.5)) {
        this.elementInner.css('color', 'white');
      } else {
        this.elementInner.css('color', 'black');
      }
    }
  }
}

export default Preview;

Added public/bootstrap-colorpicker/src/js/extensions/Swatches.js.















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
'use strict';

import Palette from './Palette';
import $ from 'jquery';

let defaults = {
  barTemplate: `<div class="colorpicker-bar colorpicker-swatches">
                    <div class="colorpicker-swatches--inner"></div>
                </div>`,
  swatchTemplate: '<i class="colorpicker-swatch"><i class="colorpicker-swatch--inner"></i></i>'
};

/**
 * Color swatches extension
 * @ignore
 */
class Swatches extends Palette {
  constructor(colorpicker, options = {}) {
    super(colorpicker, $.extend(true, {}, defaults, options));
    this.element = null;
  }

  isEnabled() {
    return this.getLength() > 0;
  }

  onCreate(event) {
    super.onCreate(event);

    if (!this.isEnabled()) {
      return;
    }

    this.element = $(this.options.barTemplate);
    this.load();
    this.colorpicker.picker.append(this.element);
  }

  load() {
    let colorpicker = this.colorpicker,
      swatchContainer = this.element.find('.colorpicker-swatches--inner'),
      isAliased = (this.options.namesAsValues === true) && !Array.isArray(this.colors);

    swatchContainer.empty();

    $.each(this.colors, (name, value) => {
      let $swatch = $(this.options.swatchTemplate)
        .attr('data-name', name)
        .attr('data-value', value)
        .attr('title', isAliased ? `${name}: ${value}` : value)
        .on('mousedown.colorpicker touchstart.colorpicker',
          function (e) {
            let $sw = $(this);

            // e.preventDefault();

            colorpicker.setValue(isAliased ? $sw.attr('data-name') : $sw.attr('data-value'));
          }
        );

      $swatch.find('.colorpicker-swatch--inner')
        .css('background-color', value);

      swatchContainer.append($swatch);
    });

    swatchContainer.append($('<i class="colorpicker-clear"></i>'));
  }
}

export default Swatches;

Added public/bootstrap-colorpicker/src/js/extensions/index.js.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import Debugger from './Debugger';
import Preview from './Preview';
import Swatches from './Swatches';
import Palette from './Palette';

export {
  Debugger, Preview, Swatches, Palette
};

export default {
  'debugger': Debugger,
  'preview': Preview,
  'swatches': Swatches,
  'palette': Palette
};

Added public/bootstrap-colorpicker/src/js/options.js.

































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
'use strict';
/**
 * @module
 */

// adjust these values accordingly to the sass vars
let sassVars = {
  'bar_size_short': 16,
  'base_margin': 6,
  'columns': 6
};

let sliderSize = (sassVars.bar_size_short * sassVars.columns) + (sassVars.base_margin * (sassVars.columns - 1));

/**
 * Colorpicker default options
 */
export default {
  /**
   * Custom class to be added to the `.colorpicker-element` element
   *
   * @type {String|null}
   * @default null
   */
  customClass: null,
  /**
   * Sets a initial color, ignoring the one from the element/input value or the data-color attribute.
   *
   * @type {(String|ColorItem|boolean)}
   * @default false
   */
  color: false,
  /**
   * Fallback color to use when the given color is invalid.
   * If false, the latest valid color will be used as a fallback.
   *
   * @type {String|ColorItem|boolean}
   * @default false
   */
  fallbackColor: false,
  /**
   * Forces an specific color format. If 'auto', it will be automatically detected the first time only,
   * but if null it will be always recalculated.
   *
   * Note that the ending 'a' of the format meaning "alpha" has currently no effect, meaning that rgb is the same as
   * rgba excepting if the alpha channel is disabled (see useAlpha).
   *
   * @type {('rgb'|'hex'|'hsl'|'auto'|null)}
   * @default 'auto'
   */
  format: 'auto',
  /**
   * Horizontal mode layout.
   *
   * If true, the hue and alpha channel bars will be rendered horizontally, above the saturation selector.
   *
   * @type {boolean}
   * @default false
   */
  horizontal: false,
  /**
   * Forces to show the colorpicker as an inline element.
   *
   * Note that if there is no container specified, the inline element
   * will be added to the body, so you may want to set the container option.
   *
   * @type {boolean}
   * @default false
   */
  inline: false,
  /**
   * Container where the colorpicker is appended to in the DOM.
   *
   * If is a string (CSS selector), the colorpicker will be placed inside this container.
   * If true, the `.colorpicker-element` element itself will be used as the container.
   * If false, the document body is used as the container, unless it is a popover (in this case it is appended to the
   * popover body instead).
   *
   * @type {String|boolean}
   * @default false
   */
  container: false,
  /**
   * Bootstrap Popover options.
   * The trigger, content and html options are always ignored.
   *
   * @type {boolean}
   * @default Object
   */
  popover: {
    animation: true,
    placement: 'bottom',
    fallbackPlacement: 'flip'
  },
  /**
   * If true, loads the 'debugger' extension automatically, which logs the events in the console
   * @type {boolean}
   * @default false
   */
  debug: false,
  /**
   * Child CSS selector for the colorpicker input.
   *
   * @type {String}
   * @default 'input'
   */
  input: 'input',
  /**
   * Child CSS selector for the colorpicker addon.
   * If it exists, the child <i> element background will be changed on color change.
   *
   * @type {String}
   * @default '.colorpicker-trigger, .colorpicker-input-addon'
   */
  addon: '.colorpicker-input-addon',
  /**
   * If true, the input content will be replaced always with a valid color,
   * if false, the invalid color will be left in the input,
   *   while the internal color object will still resolve into a valid one.
   *
   * @type {boolean}
   * @default true
   */
  autoInputFallback: true,
  /**
   * If true a hash will be prepended to hexadecimal colors.
   * If false, the hash will be removed.
   * This only affects the input values in hexadecimal format.
   *
   * @type {boolean}
   * @default true
   */
  useHashPrefix: true,
  /**
   * If true, the alpha channel bar will be displayed no matter what.
   *
   * If false, it will be always hidden and alpha channel will be disabled also programmatically, meaning that
   * the selected or typed color will be always opaque.
   *
   * If null, the alpha channel will be automatically disabled/enabled depending if the initial color format supports
   * alpha or not.
   *
   * @type {boolean}
   * @default true
   */
  useAlpha: true,
  /**
   * Colorpicker widget template
   * @type {String}
   * @example
   * <!-- This is the default template: -->
   * <div class="colorpicker">
   *   <div class="colorpicker-saturation"><i class="colorpicker-guide"></i></div>
   *   <div class="colorpicker-hue"><i class="colorpicker-guide"></i></div>
   *   <div class="colorpicker-alpha">
   *     <div class="colorpicker-alpha-color"></div>
   *     <i class="colorpicker-guide"></i>
   *   </div>
   * </div>
   */
  template: `<div class="colorpicker">
      <div class="colorpicker-saturation"><i class="colorpicker-guide"></i></div>
      <div class="colorpicker-hue"><i class="colorpicker-guide"></i></div>
      <div class="colorpicker-alpha">
        <div class="colorpicker-alpha-color"></div>
        <i class="colorpicker-guide"></i>
      </div>
    </div>`,
  /**
   *
   * Associative object with the extension class name and its config.
   * Colorpicker comes with many bundled extensions: debugger, palette, preview and swatches (a superset of palette).
   *
   * @type {Object[]}
   * @example
   *   extensions: [
   *     {
   *       name: 'swatches'
   *       options: {
   *         colors: {
   *           'primary': '#337ab7',
   *           'success': '#5cb85c',
   *           'info': '#5bc0de',
   *           'warning': '#f0ad4e',
   *           'danger': '#d9534f'
   *         },
   *         namesAsValues: true
   *       }
   *     }
   *   ]
   */
  extensions: [
    {
      name: 'preview',
      options: {
        showText: true
      }
    }
  ],
  /**
   * Vertical sliders configuration
   * @type {Object}
   */
  sliders: {
    saturation: {
      selector: '.colorpicker-saturation',
      maxLeft: sliderSize,
      maxTop: sliderSize,
      callLeft: 'setSaturationRatio',
      callTop: 'setValueRatio'
    },
    hue: {
      selector: '.colorpicker-hue',
      maxLeft: 0,
      maxTop: sliderSize,
      callLeft: false,
      callTop: 'setHueRatio'
    },
    alpha: {
      selector: '.colorpicker-alpha',
      childSelector: '.colorpicker-alpha-color',
      maxLeft: 0,
      maxTop: sliderSize,
      callLeft: false,
      callTop: 'setAlphaRatio'
    }
  },
  /**
   * Horizontal sliders configuration
   * @type {Object}
   */
  slidersHorz: {
    saturation: {
      selector: '.colorpicker-saturation',
      maxLeft: sliderSize,
      maxTop: sliderSize,
      callLeft: 'setSaturationRatio',
      callTop: 'setValueRatio'
    },
    hue: {
      selector: '.colorpicker-hue',
      maxLeft: sliderSize,
      maxTop: 0,
      callLeft: 'setHueRatio',
      callTop: false
    },
    alpha: {
      selector: '.colorpicker-alpha',
      childSelector: '.colorpicker-alpha-color',
      maxLeft: sliderSize,
      maxTop: 0,
      callLeft: 'setAlphaRatio',
      callTop: false
    }
  }
};

Added public/bootstrap-colorpicker/src/js/plugin.js.





































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
'use strict';

import Colorpicker from './Colorpicker';
import $ from 'jquery';

let plugin = 'colorpicker';

$[plugin] = Colorpicker;

// Colorpicker jQuery Plugin API
$.fn[plugin] = function (option) {
  let fnArgs = Array.prototype.slice.call(arguments, 1),
    isSingleElement = (this.length === 1),
    returnValue = null;

  let $elements = this.each(function () {
    let $this = $(this),
      inst = $this.data(plugin),
      options = ((typeof option === 'object') ? option : {});

    // Create instance if does not exist
    if (!inst) {
      inst = new Colorpicker(this, options);
      $this.data(plugin, inst);
    }

    if (!isSingleElement) {
      return;
    }

    returnValue = $this;

    if (typeof option === 'string') {
      if (option === 'colorpicker') {
        // Return colorpicker instance: e.g. .colorpicker('colorpicker')
        returnValue = inst;
      } else if ($.isFunction(inst[option])) {
        // Return method call return value: e.g. .colorpicker('isEnabled')
        returnValue = inst[option].apply(inst, fnArgs);
      } else {
        // Return property value: e.g. .colorpicker('element')
        returnValue = inst[option];
      }
    }
  });

  return isSingleElement ? returnValue : $elements;
};

$.fn[plugin].constructor = Colorpicker;

Added public/bootstrap-colorpicker/src/sass/colorpicker.scss.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
$outline-color: rgba(0, 0, 0, 0.2);
$box-shadow-outline: 0 0 0 1px $outline-color;
$bar-size-short: 16px !default;
$base-margin: 6px !default;
$columns: 6 !default; // this affects the number of swatches per row and the width of the color picker, saturation, etc.
$bar-size-large: ($bar-size-short * $columns) + ($base-margin * ($columns - 1));

@mixin bgCheckerBox($size: 10px) {
  background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0),
  linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0),
  rgb(255, 255, 255);
  background-size: $size $size;
  background-position: 0 0, $size/2 $size/2;
}

@mixin bgSaturation() {
  background: -moz-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%),
  -moz-linear-gradient(left, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%); /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 1))),
  -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 1)), color-stop(100%, rgba(255, 255, 255, 0))); /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%),
  -webkit-linear-gradient(left, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%); /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%),
  -o-linear-gradient(left, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%); /* Opera 11.10+ */
  background: -ms-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%),
  -ms-linear-gradient(left, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%); /* IE10+ */
  background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%),
  linear-gradient(to right, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%); /* W3C */
}

@mixin bgHueHorizontal() {
  background: -moz-linear-gradient(right, rgb(255, 0, 0) 0%, rgb(255, 128, 0) 8%, rgb(255, 255, 0) 17%, rgb(128, 255, 0) 25%, rgb(0, 255, 0) 33%, rgb(0, 255, 128) 42%, rgb(0, 255, 255) 50%, rgb(0, 128, 255) 58%, rgb(0, 0, 255) 67%, rgb(128, 0, 255) 75%, rgb(255, 0, 255) 83%, rgb(255, 0, 128) 92%, rgb(255, 0, 0) 100%); /* FF3.6+ */
  background: -webkit-gradient(linear, right top, left top, color-stop(0%, rgb(255, 0, 0)), color-stop(8%, rgb(255, 128, 0)), color-stop(17%, rgb(255, 255, 0)), color-stop(25%, rgb(128, 255, 0)), color-stop(33%, rgb(0, 255, 0)), color-stop(42%, rgb(0, 255, 128)), color-stop(50%, rgb(0, 255, 255)), color-stop(58%, rgb(0, 128, 255)), color-stop(67%, rgb(0, 0, 255)), color-stop(75%, rgb(128, 0, 255)), color-stop(83%, rgb(255, 0, 255)), color-stop(92%, rgb(255, 0, 128)), color-stop(100%, rgb(255, 0, 0))); /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(right, rgb(255, 0, 0) 0%, rgb(255, 128, 0) 8%, rgb(255, 255, 0) 17%, rgb(128, 255, 0) 25%, rgb(0, 255, 0) 33%, rgb(0, 255, 128) 42%, rgb(0, 255, 255) 50%, rgb(0, 128, 255) 58%, rgb(0, 0, 255) 67%, rgb(128, 0, 255) 75%, rgb(255, 0, 255) 83%, rgb(255, 0, 128) 92%, rgb(255, 0, 0) 100%); /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(right, rgb(255, 0, 0) 0%, rgb(255, 128, 0) 8%, rgb(255, 255, 0) 17%, rgb(128, 255, 0) 25%, rgb(0, 255, 0) 33%, rgb(0, 255, 128) 42%, rgb(0, 255, 255) 50%, rgb(0, 128, 255) 58%, rgb(0, 0, 255) 67%, rgb(128, 0, 255) 75%, rgb(255, 0, 255) 83%, rgb(255, 0, 128) 92%, rgb(255, 0, 0) 100%); /* Opera 11.10+ */
  background: -ms-linear-gradient(right, rgb(255, 0, 0) 0%, rgb(255, 128, 0) 8%, rgb(255, 255, 0) 17%, rgb(128, 255, 0) 25%, rgb(0, 255, 0) 33%, rgb(0, 255, 128) 42%, rgb(0, 255, 255) 50%, rgb(0, 128, 255) 58%, rgb(0, 0, 255) 67%, rgb(128, 0, 255) 75%, rgb(255, 0, 255) 83%, rgb(255, 0, 128) 92%, rgb(255, 0, 0) 100%); /* IE10+ */
  background: linear-gradient(to left, rgb(255, 0, 0) 0%, rgb(255, 128, 0) 8%, rgb(255, 255, 0) 17%, rgb(128, 255, 0) 25%, rgb(0, 255, 0) 33%, rgb(0, 255, 128) 42%, rgb(0, 255, 255) 50%, rgb(0, 128, 255) 58%, rgb(0, 0, 255) 67%, rgb(128, 0, 255) 75%, rgb(255, 0, 255) 83%, rgb(255, 0, 128) 92%, rgb(255, 0, 0) 100%); /* W3C */

}

@mixin bgHueVertical() {
  background: -moz-linear-gradient(bottom, rgba(255, 0, 0, 1) 0%, rgba(255, 128, 0, 1) 8%, rgba(255, 255, 0, 1) 17%, rgba(128, 255, 0, 1) 25%, rgba(0, 255, 0, 1) 33%, rgba(0, 255, 128, 1) 42%, rgba(0, 255, 255, 1) 50%, rgba(0, 128, 255, 1) 58%, rgba(0, 0, 255, 1) 67%, rgba(128, 0, 255, 1) 75%, rgba(255, 0, 255, 1) 83%, rgba(255, 0, 128, 1) 92%, rgba(255, 0, 0, 1) 100%); /* FF3.6+ */
  background: -webkit-gradient(linear, left bottom, left top, color-stop(0%, rgba(255, 0, 0, 1)), color-stop(8%, rgba(255, 128, 0, 1)), color-stop(17%, rgba(255, 255, 0, 1)), color-stop(25%, rgba(128, 255, 0, 1)), color-stop(33%, rgba(0, 255, 0, 1)), color-stop(42%, rgba(0, 255, 128, 1)), color-stop(50%, rgba(0, 255, 255, 1)), color-stop(58%, rgba(0, 128, 255, 1)), color-stop(67%, rgba(0, 0, 255, 1)), color-stop(75%, rgba(128, 0, 255, 1)), color-stop(83%, rgba(255, 0, 255, 1)), color-stop(92%, rgba(255, 0, 128, 1)), color-stop(100%, rgba(255, 0, 0, 1))); /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(bottom, rgba(255, 0, 0, 1) 0%, rgba(255, 128, 0, 1) 8%, rgba(255, 255, 0, 1) 17%, rgba(128, 255, 0, 1) 25%, rgba(0, 255, 0, 1) 33%, rgba(0, 255, 128, 1) 42%, rgba(0, 255, 255, 1) 50%, rgba(0, 128, 255, 1) 58%, rgba(0, 0, 255, 1) 67%, rgba(128, 0, 255, 1) 75%, rgba(255, 0, 255, 1) 83%, rgba(255, 0, 128, 1) 92%, rgba(255, 0, 0, 1) 100%); /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(bottom, rgba(255, 0, 0, 1) 0%, rgba(255, 128, 0, 1) 8%, rgba(255, 255, 0, 1) 17%, rgba(128, 255, 0, 1) 25%, rgba(0, 255, 0, 1) 33%, rgba(0, 255, 128, 1) 42%, rgba(0, 255, 255, 1) 50%, rgba(0, 128, 255, 1) 58%, rgba(0, 0, 255, 1) 67%, rgba(128, 0, 255, 1) 75%, rgba(255, 0, 255, 1) 83%, rgba(255, 0, 128, 1) 92%, rgba(255, 0, 0, 1) 100%); /* Opera 11.10+ */
  background: -ms-linear-gradient(bottom, rgba(255, 0, 0, 1) 0%, rgba(255, 128, 0, 1) 8%, rgba(255, 255, 0, 1) 17%, rgba(128, 255, 0, 1) 25%, rgba(0, 255, 0, 1) 33%, rgba(0, 255, 128, 1) 42%, rgba(0, 255, 255, 1) 50%, rgba(0, 128, 255, 1) 58%, rgba(0, 0, 255, 1) 67%, rgba(128, 0, 255, 1) 75%, rgba(255, 0, 255, 1) 83%, rgba(255, 0, 128, 1) 92%, rgba(255, 0, 0, 1) 100%); /* IE10+ */
  background: linear-gradient(to top, rgba(255, 0, 0, 1) 0%, rgba(255, 128, 0, 1) 8%, rgba(255, 255, 0, 1) 17%, rgba(128, 255, 0, 1) 25%, rgba(0, 255, 0, 1) 33%, rgba(0, 255, 128, 1) 42%, rgba(0, 255, 255, 1) 50%, rgba(0, 128, 255, 1) 58%, rgba(0, 0, 255, 1) 67%, rgba(128, 0, 255, 1) 75%, rgba(255, 0, 255, 1) 83%, rgba(255, 0, 128, 1) 92%, rgba(255, 0, 0, 1) 100%); /* W3C */
}

.colorpicker {
  position: relative;
  display: none;
  font-size: inherit;
  color: inherit;
  text-align: left;
  list-style: none;
  background-color: #ffffff;
  background-clip: padding-box;
  border: 1px solid $outline-color;
  //box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
  padding: .75rem .75rem;
  width: ($bar-size-large + $base-margin + $bar-size-short);
  border-radius: 4px;
  box-sizing: content-box;
}

.colorpicker.colorpicker-disabled,
.colorpicker.colorpicker-disabled * {
  cursor: default !important;
}

.colorpicker div {
  position: relative;
}

.colorpicker-popup {
  position: absolute;
  top: 100%;
  left: 0;
  float: left;
  margin-top: 1px;
  z-index: 1060;
}

.colorpicker-popup.colorpicker-bs-popover-content {
  position: relative;
  top: auto;
  left: auto;
  float: none;
  margin: 0;
  z-index: initial;
  border: none;
  padding: 0.25rem 0; // popover padding correction
  border-radius: 0;
  background: none;
  box-shadow: none;
}

.colorpicker:before,
.colorpicker:after {
  content: "";
  display: table;
  clear: both;
  line-height: 0;
}

.colorpicker-clear {
  clear: both;
  display: block;
}

.colorpicker:before {
  content: '';
  display: inline-block;
  border-left: 7px solid transparent;
  border-right: 7px solid transparent;
  border-bottom: 7px solid #ccc;
  border-bottom-color: $outline-color;
  position: absolute;
  top: -7px;
  left: auto;
  right: 6px;
}

.colorpicker:after {
  content: '';
  display: inline-block;
  border-left: 6px solid transparent;
  border-right: 6px solid transparent;
  border-bottom: 6px solid #ffffff;
  position: absolute;
  top: -6px;
  left: auto;
  right: 7px;
}

.colorpicker.colorpicker-with-alpha {
  width: ($bar-size-large + (($base-margin + $bar-size-short) * 2));
}

.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
  display: block;
}

.colorpicker-saturation {
  position: relative;
  width: $bar-size-large;
  height: $bar-size-large;
  @include bgSaturation();
  cursor: crosshair;
  float: left;
  box-shadow: $box-shadow-outline;
  margin-bottom: $base-margin;

  .colorpicker-guide {
    display: block;
    height: 6px;
    width: 6px;
    border-radius: 6px;
    border: 1px solid #000;
    box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
    position: absolute;
    top: 0;
    left: 0;
    margin: -3px 0 0 -3px;
  }
}

.colorpicker-hue,
.colorpicker-alpha {
  position: relative;
  width: $bar-size-short;
  height: $bar-size-large;
  float: left;
  cursor: row-resize;
  margin-left: $base-margin;
  margin-bottom: $base-margin;
}

.colorpicker-alpha-color {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.colorpicker-hue,
.colorpicker-alpha-color {
  box-shadow: $box-shadow-outline;
}

.colorpicker-hue .colorpicker-guide,
.colorpicker-alpha .colorpicker-guide {
  display: block;
  height: 4px;
  background: rgba(255, 255, 255, 0.8);
  border: 1px solid rgba(0, 0, 0, 0.4);
  position: absolute;
  top: 0;
  left: 0;
  margin-left: -2px;
  margin-top: -2px;
  right: -2px;
  z-index: 1;
}

.colorpicker-hue {
  @include bgHueVertical();
}

.colorpicker-alpha {
  @include bgCheckerBox();
  display: none;
}

.colorpicker-bar {
  min-height: $bar-size-short;
  margin: $base-margin 0 0 0;
  clear: both;
  text-align: center;
  font-size: 10px;
  line-height: normal;
  max-width: 100%;
  box-shadow: $box-shadow-outline;

  &:before {
    content: "";
    display: table;
    clear: both;
  }
}

.colorpicker-bar.colorpicker-bar-horizontal {
  height: $bar-size-large;
  width: $bar-size-short;
  margin: 0 0 $base-margin 0;
  float: left;
}

.colorpicker-input-addon {
  position: relative;
}

.colorpicker-input-addon i {
  display: inline-block;
  cursor: pointer;
  vertical-align: text-top;
  height: 16px;
  width: 16px;
  position: relative;
}

.colorpicker-input-addon:before {
  content: "";
  position: absolute;
  width: 16px;
  height: 16px;
  display: inline-block;
  vertical-align: text-top;
  @include bgCheckerBox();
}

.colorpicker.colorpicker-inline {
  position: relative;
  display: inline-block;
  float: none;
  z-index: auto;
  vertical-align: text-bottom;
}

.colorpicker.colorpicker-horizontal {
  width: $bar-size-large;
  height: auto;
}

.colorpicker.colorpicker-horizontal .colorpicker-bar {
  width: $bar-size-large;
}

.colorpicker.colorpicker-horizontal .colorpicker-saturation {
  float: none;
  margin-bottom: 0;
}

.colorpicker.colorpicker-horizontal .colorpicker-hue,
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
  float: none;
  width: $bar-size-large;
  height: $bar-size-short;
  cursor: col-resize;
  margin-left: 0;
  margin-top: $base-margin;
  margin-bottom: 0;
}

.colorpicker.colorpicker-horizontal .colorpicker-hue .colorpicker-guide,
.colorpicker.colorpicker-horizontal .colorpicker-alpha .colorpicker-guide {
  position: absolute;
  display: block;
  bottom: -2px;
  left: 0;
  right: auto;
  height: auto;
  width: 4px;
}

.colorpicker.colorpicker-horizontal .colorpicker-hue {
  @include bgHueHorizontal();
}

.colorpicker.colorpicker-horizontal .colorpicker-alpha {
  @include bgCheckerBox();
}

.colorpicker-inline:before,
.colorpicker-no-arrow:before,
.colorpicker-popup.colorpicker-bs-popover-content:before {
  content: none;
  display: none;
}

.colorpicker-inline:after,
.colorpicker-no-arrow:after,
.colorpicker-popup.colorpicker-bs-popover-content:after {
  content: none;
  display: none;
}


.colorpicker-alpha,
.colorpicker-saturation,
.colorpicker-hue {
  user-select: none;
}

.colorpicker,
.colorpicker-alpha,
.colorpicker-saturation,
.colorpicker-hue,
.colorpicker-bar {
  &.colorpicker-visible {
    display: block;
  }
}

.colorpicker,
.colorpicker-alpha,
.colorpicker-saturation,
.colorpicker-hue,
.colorpicker-bar {
  &.colorpicker-hidden {
    display: none;
  }
}

.colorpicker-inline.colorpicker-visible {
  display: inline-block;
}

.colorpicker.colorpicker-disabled:after {
  border: none;
  content: '';
  display: block;
  width: 100%;
  height: 100%;
  background: rgba(233, 236, 239, 0.33);
  top: 0;
  left: 0;
  right: auto;
  z-index: 2;
  position: absolute;
}

.colorpicker.colorpicker-disabled .colorpicker-guide {
  display: none;
}

/** EXTENSIONS **/

.colorpicker-preview {
  @include bgCheckerBox();
}

.colorpicker-preview > div {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}

.colorpicker-bar.colorpicker-swatches {
  box-shadow: none;
  height: auto;
}

.colorpicker-swatches--inner {
  clear: both;
  margin-top: -$base-margin;
}

.colorpicker-swatch {
  position: relative;
  cursor: pointer;
  float: left;
  height: $bar-size-short;
  width: $bar-size-short;
  margin-right: $base-margin;
  margin-top: $base-margin;
  margin-left: 0;
  display: block;
  box-shadow: $box-shadow-outline;
  @include bgCheckerBox();
}

.colorpicker-swatch--inner {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

// saturation + hue vertical (clear margin-right on nth column + 1)
.colorpicker-swatch:nth-of-type(#{$columns + 1}n+0) {
  margin-right: 0;
}

// saturation + hue + alpha vertical (clear margin-right on nth column + 2)
.colorpicker-with-alpha {
  .colorpicker-swatch:nth-of-type(#{$columns + 1}n+0) {
    margin-right: $base-margin;
  }

  .colorpicker-swatch:nth-of-type(#{$columns + 2}n+0) {
    margin-right: 0;
  }
}

// horizontal mode (clear margin-right on nth column)
.colorpicker-horizontal {
  .colorpicker-swatch:nth-of-type(#{$columns}n+0) {
    margin-right: 0;
  }

  .colorpicker-swatch:nth-of-type(#{$columns + 1}n+0) {
    margin-right: $base-margin;
  }

  .colorpicker-swatch:nth-of-type(#{$columns + 2}n+0) {
    margin-right: $base-margin;
  }
}

.colorpicker-swatch:last-of-type:after {
  content: "";
  display: table;
  clear: both;
}

// RTL writing mode support
*[dir='rtl'] .colorpicker-element input,
.colorpicker-element[dir='rtl'] input,
.colorpicker-element input[dir='rtl'] {
  direction: ltr;
  text-align: right;
}

Added public/bootstrap-colorpicker/yarn.lock.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


"@ava/babel-plugin-throws-helper@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz#2fc1fe3c211a71071a4eca7b8f7af5842cd1ae7c"
  integrity sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw=

"@ava/babel-preset-stage-4@^1.1.0":
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz#ae60be881a0babf7d35f52aba770d1f6194f76bd"
  integrity sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg==
  dependencies:
    babel-plugin-check-es2015-constants "^6.8.0"
    babel-plugin-syntax-trailing-function-commas "^6.20.0"
    babel-plugin-transform-async-to-generator "^6.16.0"
    babel-plugin-transform-es2015-destructuring "^6.19.0"
    babel-plugin-transform-es2015-function-name "^6.9.0"
    babel-plugin-transform-es2015-modules-commonjs "^6.18.0"
    babel-plugin-transform-es2015-parameters "^6.21.0"
    babel-plugin-transform-es2015-spread "^6.8.0"
    babel-plugin-transform-es2015-sticky-regex "^6.8.0"
    babel-plugin-transform-es2015-unicode-regex "^6.11.0"
    babel-plugin-transform-exponentiation-operator "^6.8.0"
    package-hash "^1.2.0"

"@ava/babel-preset-transform-test-files@^3.0.0":
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz#cded1196a8d8d9381a509240ab92e91a5ec069f7"
  integrity sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc=
  dependencies:
    "@ava/babel-plugin-throws-helper" "^2.0.0"
    babel-plugin-espower "^2.3.2"

"@ava/write-file-atomic@^2.2.0":
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz#d625046f3495f1f5e372135f473909684b429247"
  integrity sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA==
  dependencies:
    graceful-fs "^4.1.11"
    imurmurhash "^0.1.4"
    slide "^1.1.5"

"@babel/code-frame@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9"
  integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==
  dependencies:
    "@babel/highlight" "7.0.0-beta.44"

"@babel/generator@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42"
  integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==
  dependencies:
    "@babel/types" "7.0.0-beta.44"
    jsesc "^2.5.1"
    lodash "^4.2.0"
    source-map "^0.5.0"
    trim-right "^1.0.1"

"@babel/helper-function-name@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd"
  integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==
  dependencies:
    "@babel/helper-get-function-arity" "7.0.0-beta.44"
    "@babel/template" "7.0.0-beta.44"
    "@babel/types" "7.0.0-beta.44"

"@babel/helper-get-function-arity@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15"
  integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==
  dependencies:
    "@babel/types" "7.0.0-beta.44"

"@babel/helper-split-export-declaration@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc"
  integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==
  dependencies:
    "@babel/types" "7.0.0-beta.44"

"@babel/highlight@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5"
  integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==
  dependencies:
    chalk "^2.0.0"
    esutils "^2.0.2"
    js-tokens "^3.0.0"

"@babel/parser@^7.4.4":
  version "7.4.4"
  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6"
  integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==

"@babel/template@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f"
  integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==
  dependencies:
    "@babel/code-frame" "7.0.0-beta.44"
    "@babel/types" "7.0.0-beta.44"
    babylon "7.0.0-beta.44"
    lodash "^4.2.0"

"@babel/traverse@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966"
  integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==
  dependencies:
    "@babel/code-frame" "7.0.0-beta.44"
    "@babel/generator" "7.0.0-beta.44"
    "@babel/helper-function-name" "7.0.0-beta.44"
    "@babel/helper-split-export-declaration" "7.0.0-beta.44"
    "@babel/types" "7.0.0-beta.44"
    babylon "7.0.0-beta.44"
    debug "^3.1.0"
    globals "^11.1.0"
    invariant "^2.2.0"
    lodash "^4.2.0"

"@babel/types@7.0.0-beta.44":
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757"
  integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==
  dependencies:
    esutils "^2.0.2"
    lodash "^4.2.0"
    to-fast-properties "^2.0.0"

"@concordance/react@^1.0.0":
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/@concordance/react/-/react-1.0.0.tgz#fcf3cad020e5121bfd1c61d05bc3516aac25f734"
  integrity sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ==
  dependencies:
    arrify "^1.0.1"

"@gulp-sourcemaps/identity-map@1.X":
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9"
  integrity sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==
  dependencies:
    acorn "^5.0.3"
    css "^2.2.1"
    normalize-path "^2.1.1"
    source-map "^0.6.0"
    through2 "^2.0.3"

"@gulp-sourcemaps/map-sources@1.X":
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
  integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o=
  dependencies:
    normalize-path "^2.0.1"
    through2 "^2.0.3"

abab@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f"
  integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==

abbrev@1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==

acorn-dynamic-import@^2.0.0:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
  integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=
  dependencies:
    acorn "^4.0.3"

acorn-globals@^4.1.0:
  version "4.3.2"
  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006"
  integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==
  dependencies:
    acorn "^6.0.1"
    acorn-walk "^6.0.1"

acorn-jsx@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
  integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
  dependencies:
    acorn "^3.0.4"

acorn-walk@^6.0.1:
  version "6.1.1"
  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
  integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==

acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.5.0, acorn@^5.5.3:
  version "5.7.3"
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
  integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==

acorn@^3.0.4:
  version "3.3.0"
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
  integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=

acorn@^4.0.3:
  version "4.0.13"
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
  integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=

acorn@^6.0.1:
  version "6.1.1"
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
  integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==

ajv-keywords@^2.1.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
  integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=

ajv-keywords@^3.1.0:
  version "3.4.0"
  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d"
  integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==

ajv@^5.2.3, ajv@^5.3.0:
  version "5.5.2"
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
  integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
  dependencies:
    co "^4.6.0"
    fast-deep-equal "^1.0.0"
    fast-json-stable-stringify "^2.0.0"
    json-schema-traverse "^0.3.0"

ajv@^6.1.0, ajv@^6.5.5:
  version "6.10.0"
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
  integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
  dependencies:
    fast-deep-equal "^2.0.1"
    fast-json-stable-stringify "^2.0.0"
    json-schema-traverse "^0.4.1"
    uri-js "^4.2.2"

align-text@^0.1.1, align-text@^0.1.3:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
  integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=
  dependencies:
    kind-of "^3.0.2"
    longest "^1.0.1"
    repeat-string "^1.5.2"

amdefine@>=0.0.4:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
  integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=

ansi-align@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
  integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
  dependencies:
    string-width "^2.0.0"

ansi-colors@^1.0.1:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
  integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==
  dependencies:
    ansi-wrap "^0.1.0"

ansi-cyan@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873"
  integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=
  dependencies:
    ansi-wrap "0.1.0"

ansi-escapes@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b"
  integrity sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=

ansi-escapes@^3.0.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
  integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==

ansi-gray@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
  integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
  dependencies:
    ansi-wrap "0.1.0"

ansi-red@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
  integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=
  dependencies:
    ansi-wrap "0.1.0"

ansi-regex@^2.0.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=

ansi-regex@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
  integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=

ansi-styles@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
  integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=

ansi-styles@^3.1.0, ansi-styles@^3.2.1:
  version "3.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
  dependencies:
    color-convert "^1.9.0"

ansi-styles@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
  integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=

ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
  integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=

anymatch@^1.3.0:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
  integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==
  dependencies:
    micromatch "^2.1.5"
    normalize-path "^2.0.0"

anymatch@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
  integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
  dependencies:
    micromatch "^3.1.4"
    normalize-path "^2.1.1"

aproba@^1.0.3, aproba@^1.1.1:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
  integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==

archy@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
  integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=

are-we-there-yet@~1.1.2:
  version "1.1.5"
  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
  integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
  dependencies:
    delegates "^1.0.0"
    readable-stream "^2.0.6"

argparse@^1.0.7:
  version "1.0.10"
  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
  dependencies:
    sprintf-js "~1.0.2"

arr-diff@^1.0.1:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
  integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo=
  dependencies:
    arr-flatten "^1.0.1"
    array-slice "^0.2.3"

arr-diff@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
  integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=
  dependencies:
    arr-flatten "^1.0.1"

arr-diff@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=

arr-exclude@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/arr-exclude/-/arr-exclude-1.0.0.tgz#dfc7c2e552a270723ccda04cf3128c8cbfe5c631"
  integrity sha1-38fC5VKicHI8zaBM8xKMjL/lxjE=

arr-flatten@^1.0.1, arr-flatten@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==

arr-union@^2.0.1:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d"
  integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=

arr-union@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=

array-differ@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
  integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=

array-each@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
  integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=

array-equal@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
  integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=

array-find-index@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
  integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=

array-slice@^0.2.3:
  version "0.2.3"
  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
  integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU=

array-slice@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
  integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==

array-union@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
  integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
  dependencies:
    array-uniq "^1.0.1"

array-uniq@^1.0.1, array-uniq@^1.0.2:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
  integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=

array-unique@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
  integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=

array-unique@^0.3.2:
  version "0.3.2"
  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=

arrify@^1.0.0, arrify@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
  integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=

asn1.js@^4.0.0:
  version "4.10.1"
  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
  integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
  dependencies:
    bn.js "^4.0.0"
    inherits "^2.0.1"
    minimalistic-assert "^1.0.0"

asn1@~0.2.3:
  version "0.2.4"
  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
  integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
  dependencies:
    safer-buffer "~2.1.0"

assert-plus@1.0.0, assert-plus@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
  integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=

assert@^1.1.1:
  version "1.5.0"
  resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
  integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
  dependencies:
    object-assign "^4.1.1"
    util "0.10.3"

assign-symbols@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=

async-each@^1.0.0, async-each@^1.0.1:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
  integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==

async-foreach@^0.1.3:
  version "0.1.3"
  resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
  integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=

async-limiter@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
  integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==

async@2.6.1:
  version "2.6.1"
  resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
  integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==
  dependencies:
    lodash "^4.17.10"

async@^1.5.2:
  version "1.5.2"
  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
  integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=

async@^2.1.2, async@^2.1.5:
  version "2.6.2"
  resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
  integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==
  dependencies:
    lodash "^4.17.11"

asynckit@^0.4.0:
  version "0.4.0"
  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
  integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=

atob@^2.1.1:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==

auto-bind@^1.1.0:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.2.1.tgz#807f7910b0210db9eefe133f3492c28e89698b96"
  integrity sha512-/W9yj1yKmBLwpexwAujeD9YHwYmRuWFGV8HWE7smQab797VeHa4/cnE2NFeDhA+E+5e/OGBI8763EhLjfZ/MXA==

autoprefixer@^7.0.0:
  version "7.2.6"
  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc"
  integrity sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==
  dependencies:
    browserslist "^2.11.3"
    caniuse-lite "^1.0.30000805"
    normalize-range "^0.1.2"
    num2fraction "^1.2.2"
    postcss "^6.0.17"
    postcss-value-parser "^3.2.3"

ava-init@^0.2.0:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/ava-init/-/ava-init-0.2.1.tgz#75ac4c8553326290d2866e63b62fa7035684bd58"
  integrity sha512-lXwK5LM+2g1euDRqW1mcSX/tqzY1QU7EjKpqayFPPtNRmbSYZ8RzPO5tqluTToijmtjp2M+pNpVdbcHssC4glg==
  dependencies:
    arr-exclude "^1.0.0"
    execa "^0.7.0"
    has-yarn "^1.0.0"
    read-pkg-up "^2.0.0"
    write-pkg "^3.1.0"

ava@^0.23.0:
  version "0.23.0"
  resolved "https://registry.yarnpkg.com/ava/-/ava-0.23.0.tgz#beed11730adef74a857761b62b8882bf16d5a038"
  integrity sha512-ZsVwO8UENDoZHlYQOEBv6oSGuUiZ8AFqaa+OhTv/McwC+4Y2V9skip5uYwN3egT9I9c+mKzLWA9lXUv7D6g8ZA==
  dependencies:
    "@ava/babel-preset-stage-4" "^1.1.0"
    "@ava/babel-preset-transform-test-files" "^3.0.0"
    "@ava/write-file-atomic" "^2.2.0"
    "@concordance/react" "^1.0.0"
    ansi-escapes "^2.0.0"
    ansi-styles "^3.1.0"
    arr-flatten "^1.0.1"
    array-union "^1.0.1"
    array-uniq "^1.0.2"
    arrify "^1.0.0"
    auto-bind "^1.1.0"
    ava-init "^0.2.0"
    babel-core "^6.17.0"
    bluebird "^3.0.0"
    caching-transform "^1.0.0"
    chalk "^2.0.1"
    chokidar "^1.4.2"
    clean-stack "^1.1.1"
    clean-yaml-object "^0.1.0"
    cli-cursor "^2.1.0"
    cli-spinners "^1.0.0"
    cli-truncate "^1.0.0"
    co-with-promise "^4.6.0"
    code-excerpt "^2.1.0"
    common-path-prefix "^1.0.0"
    concordance "^3.0.0"
    convert-source-map "^1.2.0"
    core-assert "^0.2.0"
    currently-unhandled "^0.4.1"
    debug "^3.0.1"
    dot-prop "^4.1.0"
    empower-core "^0.6.1"
    equal-length "^1.0.0"
    figures "^2.0.0"
    find-cache-dir "^1.0.0"
    fn-name "^2.0.0"
    get-port "^3.0.0"
    globby "^6.0.0"
    has-flag "^2.0.0"
    hullabaloo-config-manager "^1.1.0"
    ignore-by-default "^1.0.0"
    import-local "^0.1.1"
    indent-string "^3.0.0"
    is-ci "^1.0.7"
    is-generator-fn "^1.0.0"
    is-obj "^1.0.0"
    is-observable "^0.2.0"
    is-promise "^2.1.0"
    js-yaml "^3.8.2"
    last-line-stream "^1.0.0"
    lodash.clonedeepwith "^4.5.0"
    lodash.debounce "^4.0.3"
    lodash.difference "^4.3.0"
    lodash.flatten "^4.2.0"
    loud-rejection "^1.2.0"
    make-dir "^1.0.0"
    matcher "^1.0.0"
    md5-hex "^2.0.0"
    meow "^3.7.0"
    ms "^2.0.0"
    multimatch "^2.1.0"
    observable-to-promise "^0.5.0"
    option-chain "^1.0.0"
    package-hash "^2.0.0"
    pkg-conf "^2.0.0"
    plur "^2.0.0"
    pretty-ms "^3.0.0"
    require-precompiled "^0.1.0"
    resolve-cwd "^2.0.0"
    safe-buffer "^5.1.1"
    slash "^1.0.0"
    source-map-support "^0.4.0"
    stack-utils "^1.0.1"
    strip-ansi "^4.0.0"
    strip-bom-buf "^1.0.0"
    supports-color "^4.0.0"
    time-require "^0.1.2"
    trim-off-newlines "^1.0.1"
    unique-temp-dir "^1.0.0"
    update-notifier "^2.3.0"

aws-sign2@~0.7.0:
  version "0.7.0"
  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
  integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=

aws4@^1.8.0:
  version "1.8.0"
  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
  integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==

babel-cli@^6.26.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1"
  integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE=
  dependencies:
    babel-core "^6.26.0"
    babel-polyfill "^6.26.0"
    babel-register "^6.26.0"
    babel-runtime "^6.26.0"
    commander "^2.11.0"
    convert-source-map "^1.5.0"
    fs-readdir-recursive "^1.0.0"
    glob "^7.1.2"
    lodash "^4.17.4"
    output-file-sync "^1.1.2"
    path-is-absolute "^1.0.1"
    slash "^1.0.0"
    source-map "^0.5.6"
    v8flags "^2.1.1"
  optionalDependencies:
    chokidar "^1.6.1"

babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
  integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
  dependencies:
    chalk "^1.1.3"
    esutils "^2.0.2"
    js-tokens "^3.0.2"

babel-core@^6.17.0, babel-core@^6.26.0:
  version "6.26.3"
  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
  integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
  dependencies:
    babel-code-frame "^6.26.0"
    babel-generator "^6.26.0"
    babel-helpers "^6.24.1"
    babel-messages "^6.23.0"
    babel-register "^6.26.0"
    babel-runtime "^6.26.0"
    babel-template "^6.26.0"
    babel-traverse "^6.26.0"
    babel-types "^6.26.0"
    babylon "^6.18.0"
    convert-source-map "^1.5.1"
    debug "^2.6.9"
    json5 "^0.5.1"
    lodash "^4.17.4"
    minimatch "^3.0.4"
    path-is-absolute "^1.0.1"
    private "^0.1.8"
    slash "^1.0.0"
    source-map "^0.5.7"

babel-eslint@^8.0.2:
  version "8.2.6"
  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9"
  integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==
  dependencies:
    "@babel/code-frame" "7.0.0-beta.44"
    "@babel/traverse" "7.0.0-beta.44"
    "@babel/types" "7.0.0-beta.44"
    babylon "7.0.0-beta.44"
    eslint-scope "3.7.1"
    eslint-visitor-keys "^1.0.0"

babel-generator@^6.1.0, babel-generator@^6.26.0:
  version "6.26.1"
  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
  integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
  dependencies:
    babel-messages "^6.23.0"
    babel-runtime "^6.26.0"
    babel-types "^6.26.0"
    detect-indent "^4.0.0"
    jsesc "^1.3.0"
    lodash "^4.17.4"
    source-map "^0.5.7"
    trim-right "^1.0.1"

babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
  integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
  dependencies:
    babel-helper-explode-assignable-expression "^6.24.1"
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-helper-call-delegate@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
  integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
  dependencies:
    babel-helper-hoist-variables "^6.24.1"
    babel-runtime "^6.22.0"
    babel-traverse "^6.24.1"
    babel-types "^6.24.1"

babel-helper-define-map@^6.24.1:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
  integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
  dependencies:
    babel-helper-function-name "^6.24.1"
    babel-runtime "^6.26.0"
    babel-types "^6.26.0"
    lodash "^4.17.4"

babel-helper-explode-assignable-expression@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
  integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
  dependencies:
    babel-runtime "^6.22.0"
    babel-traverse "^6.24.1"
    babel-types "^6.24.1"

babel-helper-function-name@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
  integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
  dependencies:
    babel-helper-get-function-arity "^6.24.1"
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"
    babel-traverse "^6.24.1"
    babel-types "^6.24.1"

babel-helper-get-function-arity@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
  integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
  dependencies:
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-helper-hoist-variables@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
  integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
  dependencies:
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-helper-optimise-call-expression@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
  integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
  dependencies:
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-helper-regex@^6.24.1:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
  integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
  dependencies:
    babel-runtime "^6.26.0"
    babel-types "^6.26.0"
    lodash "^4.17.4"

babel-helper-remap-async-to-generator@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
  integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
  dependencies:
    babel-helper-function-name "^6.24.1"
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"
    babel-traverse "^6.24.1"
    babel-types "^6.24.1"

babel-helper-replace-supers@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
  integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
  dependencies:
    babel-helper-optimise-call-expression "^6.24.1"
    babel-messages "^6.23.0"
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"
    babel-traverse "^6.24.1"
    babel-types "^6.24.1"

babel-helpers@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
  integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
  dependencies:
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"

babel-loader@^7.1.2:
  version "7.1.5"
  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68"
  integrity sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==
  dependencies:
    find-cache-dir "^1.0.0"
    loader-utils "^1.0.2"
    mkdirp "^0.5.1"

babel-messages@^6.23.0:
  version "6.23.0"
  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
  integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-add-module-exports@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25"
  integrity sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=

babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.8.0:
  version "6.22.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
  integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-espower@^2.3.2:
  version "2.4.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-2.4.0.tgz#9f92c080e9adfe73f69baed7ab3e24f649009373"
  integrity sha512-/+SRpy7pKgTI28oEHfn1wkuM5QFAdRq8WNsOOih1dVrdV6A/WbNbRZyl0eX5eyDgtb0lOE27PeDFuCX2j8OxVg==
  dependencies:
    babel-generator "^6.1.0"
    babylon "^6.1.0"
    call-matcher "^1.0.0"
    core-js "^2.0.0"
    espower-location-detector "^1.0.0"
    espurify "^1.6.0"
    estraverse "^4.1.1"

babel-plugin-syntax-async-functions@^6.8.0:
  version "6.13.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
  integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=

babel-plugin-syntax-exponentiation-operator@^6.8.0:
  version "6.13.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
  integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=

babel-plugin-syntax-trailing-function-commas@^6.20.0, babel-plugin-syntax-trailing-function-commas@^6.22.0:
  version "6.22.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
  integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=

babel-plugin-transform-async-to-generator@^6.16.0, babel-plugin-transform-async-to-generator@^6.22.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
  integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
  dependencies:
    babel-helper-remap-async-to-generator "^6.24.1"
    babel-plugin-syntax-async-functions "^6.8.0"
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-arrow-functions@^6.22.0:
  version "6.22.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
  integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
  version "6.22.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
  integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-block-scoping@^6.23.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
  integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
  dependencies:
    babel-runtime "^6.26.0"
    babel-template "^6.26.0"
    babel-traverse "^6.26.0"
    babel-types "^6.26.0"
    lodash "^4.17.4"

babel-plugin-transform-es2015-classes@^6.23.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
  integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
  dependencies:
    babel-helper-define-map "^6.24.1"
    babel-helper-function-name "^6.24.1"
    babel-helper-optimise-call-expression "^6.24.1"
    babel-helper-replace-supers "^6.24.1"
    babel-messages "^6.23.0"
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"
    babel-traverse "^6.24.1"
    babel-types "^6.24.1"

babel-plugin-transform-es2015-computed-properties@^6.22.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
  integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
  dependencies:
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"

babel-plugin-transform-es2015-destructuring@^6.19.0, babel-plugin-transform-es2015-destructuring@^6.23.0:
  version "6.23.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
  integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
  integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
  dependencies:
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-plugin-transform-es2015-for-of@^6.23.0:
  version "6.23.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
  integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.9.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
  integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
  dependencies:
    babel-helper-function-name "^6.24.1"
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-plugin-transform-es2015-literals@^6.22.0:
  version "6.22.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
  integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
  integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
  dependencies:
    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"

babel-plugin-transform-es2015-modules-commonjs@^6.18.0, babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
  version "6.26.2"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
  integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
  dependencies:
    babel-plugin-transform-strict-mode "^6.24.1"
    babel-runtime "^6.26.0"
    babel-template "^6.26.0"
    babel-types "^6.26.0"

babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
  integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
  dependencies:
    babel-helper-hoist-variables "^6.24.1"
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"

babel-plugin-transform-es2015-modules-umd@^6.23.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
  integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
  dependencies:
    babel-plugin-transform-es2015-modules-amd "^6.24.1"
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"

babel-plugin-transform-es2015-object-super@^6.22.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
  integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
  dependencies:
    babel-helper-replace-supers "^6.24.1"
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-parameters@^6.21.0, babel-plugin-transform-es2015-parameters@^6.23.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
  integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
  dependencies:
    babel-helper-call-delegate "^6.24.1"
    babel-helper-get-function-arity "^6.24.1"
    babel-runtime "^6.22.0"
    babel-template "^6.24.1"
    babel-traverse "^6.24.1"
    babel-types "^6.24.1"

babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
  integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
  dependencies:
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.8.0:
  version "6.22.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
  integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.8.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
  integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
  dependencies:
    babel-helper-regex "^6.24.1"
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-plugin-transform-es2015-template-literals@^6.22.0:
  version "6.22.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
  integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
  version "6.23.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
  integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
  dependencies:
    babel-runtime "^6.22.0"

babel-plugin-transform-es2015-unicode-regex@^6.11.0, babel-plugin-transform-es2015-unicode-regex@^6.22.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
  integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
  dependencies:
    babel-helper-regex "^6.24.1"
    babel-runtime "^6.22.0"
    regexpu-core "^2.0.0"

babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.8.0:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
  integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
  dependencies:
    babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
    babel-plugin-syntax-exponentiation-operator "^6.8.0"
    babel-runtime "^6.22.0"

babel-plugin-transform-regenerator@^6.22.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
  integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
  dependencies:
    regenerator-transform "^0.10.0"

babel-plugin-transform-strict-mode@^6.24.1:
  version "6.24.1"
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
  integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
  dependencies:
    babel-runtime "^6.22.0"
    babel-types "^6.24.1"

babel-polyfill@^6.26.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
  integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=
  dependencies:
    babel-runtime "^6.26.0"
    core-js "^2.5.0"
    regenerator-runtime "^0.10.5"

babel-preset-env@^1.6.1:
  version "1.7.0"
  resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
  integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
  dependencies:
    babel-plugin-check-es2015-constants "^6.22.0"
    babel-plugin-syntax-trailing-function-commas "^6.22.0"
    babel-plugin-transform-async-to-generator "^6.22.0"
    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
    babel-plugin-transform-es2015-block-scoping "^6.23.0"
    babel-plugin-transform-es2015-classes "^6.23.0"
    babel-plugin-transform-es2015-computed-properties "^6.22.0"
    babel-plugin-transform-es2015-destructuring "^6.23.0"
    babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
    babel-plugin-transform-es2015-for-of "^6.23.0"
    babel-plugin-transform-es2015-function-name "^6.22.0"
    babel-plugin-transform-es2015-literals "^6.22.0"
    babel-plugin-transform-es2015-modules-amd "^6.22.0"
    babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
    babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
    babel-plugin-transform-es2015-modules-umd "^6.23.0"
    babel-plugin-transform-es2015-object-super "^6.22.0"
    babel-plugin-transform-es2015-parameters "^6.23.0"
    babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
    babel-plugin-transform-es2015-spread "^6.22.0"
    babel-plugin-transform-es2015-sticky-regex "^6.22.0"
    babel-plugin-transform-es2015-template-literals "^6.22.0"
    babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
    babel-plugin-transform-es2015-unicode-regex "^6.22.0"
    babel-plugin-transform-exponentiation-operator "^6.22.0"
    babel-plugin-transform-regenerator "^6.22.0"
    browserslist "^3.2.6"
    invariant "^2.2.2"
    semver "^5.3.0"

babel-register@^6.26.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
  integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
  dependencies:
    babel-core "^6.26.0"
    babel-runtime "^6.26.0"
    core-js "^2.5.0"
    home-or-tmp "^2.0.0"
    lodash "^4.17.4"
    mkdirp "^0.5.1"
    source-map-support "^0.4.15"

babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
  integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
  dependencies:
    core-js "^2.4.0"
    regenerator-runtime "^0.11.0"

babel-template@^6.24.1, babel-template@^6.26.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
  integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
  dependencies:
    babel-runtime "^6.26.0"
    babel-traverse "^6.26.0"
    babel-types "^6.26.0"
    babylon "^6.18.0"
    lodash "^4.17.4"

babel-traverse@^6.24.1, babel-traverse@^6.26.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
  integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
  dependencies:
    babel-code-frame "^6.26.0"
    babel-messages "^6.23.0"
    babel-runtime "^6.26.0"
    babel-types "^6.26.0"
    babylon "^6.18.0"
    debug "^2.6.8"
    globals "^9.18.0"
    invariant "^2.2.2"
    lodash "^4.17.4"

babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
  version "6.26.0"
  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
  integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
  dependencies:
    babel-runtime "^6.26.0"
    esutils "^2.0.2"
    lodash "^4.17.4"
    to-fast-properties "^1.0.3"

babylon@7.0.0-beta.44:
  version "7.0.0-beta.44"
  resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d"
  integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==

babylon@^6.1.0, babylon@^6.18.0:
  version "6.18.0"
  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
  integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==

balanced-match@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
  integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=

base64-js@^1.0.2:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
  integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==

base@^0.11.1:
  version "0.11.2"
  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
  dependencies:
    cache-base "^1.0.1"
    class-utils "^0.3.5"
    component-emitter "^1.2.1"
    define-property "^1.0.0"
    isobject "^3.0.1"
    mixin-deep "^1.2.0"
    pascalcase "^0.1.1"

bcrypt-pbkdf@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
  integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
  dependencies:
    tweetnacl "^0.14.3"

beeper@^1.0.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
  integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=

big.js@^5.2.2:
  version "5.2.2"
  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==

binary-extensions@^1.0.0:
  version "1.13.1"
  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
  integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==

block-stream@*:
  version "0.0.9"
  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
  integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
  dependencies:
    inherits "~2.0.0"

bluebird@^3.0.0, bluebird@^3.5.1, bluebird@^3.5.4:
  version "3.5.4"
  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714"
  integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==

bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
  version "4.11.8"
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
  integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==

bootstrap@>=4.0:
  version "4.3.1"
  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac"
  integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==

boxen@^1.2.1:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
  integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
  dependencies:
    ansi-align "^2.0.0"
    camelcase "^4.0.0"
    chalk "^2.0.1"
    cli-boxes "^1.0.0"
    string-width "^2.0.0"
    term-size "^1.2.0"
    widest-line "^2.0.0"

brace-expansion@^1.0.0, brace-expansion@^1.1.7:
  version "1.1.11"
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
  dependencies:
    balanced-match "^1.0.0"
    concat-map "0.0.1"

braces@^1.8.2:
  version "1.8.5"
  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
  integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=
  dependencies:
    expand-range "^1.8.1"
    preserve "^0.2.0"
    repeat-element "^1.1.2"

braces@^2.3.1, braces@^2.3.2:
  version "2.3.2"
  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
  dependencies:
    arr-flatten "^1.1.0"
    array-unique "^0.3.2"
    extend-shallow "^2.0.1"
    fill-range "^4.0.0"
    isobject "^3.0.1"
    repeat-element "^1.1.2"
    snapdragon "^0.8.1"
    snapdragon-node "^2.0.1"
    split-string "^3.0.2"
    to-regex "^3.0.1"

brorand@^1.0.1:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=

browser-process-hrtime@^0.1.2:
  version "0.1.3"
  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4"
  integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==

browserify-aes@^1.0.0, browserify-aes@^1.0.4:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
  integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
  dependencies:
    buffer-xor "^1.0.3"
    cipher-base "^1.0.0"
    create-hash "^1.1.0"
    evp_bytestokey "^1.0.3"
    inherits "^2.0.1"
    safe-buffer "^5.0.1"

browserify-cipher@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
  integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
  dependencies:
    browserify-aes "^1.0.4"
    browserify-des "^1.0.0"
    evp_bytestokey "^1.0.0"

browserify-des@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
  integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
  dependencies:
    cipher-base "^1.0.1"
    des.js "^1.0.0"
    inherits "^2.0.1"
    safe-buffer "^5.1.2"

browserify-rsa@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
  integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
  dependencies:
    bn.js "^4.1.0"
    randombytes "^2.0.1"

browserify-sign@^4.0.0:
  version "4.0.4"
  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
  integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
  dependencies:
    bn.js "^4.1.1"
    browserify-rsa "^4.0.0"
    create-hash "^1.1.0"
    create-hmac "^1.1.2"
    elliptic "^6.0.0"
    inherits "^2.0.1"
    parse-asn1 "^5.0.0"

browserify-zlib@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
  integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
  dependencies:
    pako "~1.0.5"

browserslist@^2.11.3:
  version "2.11.3"
  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2"
  integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==
  dependencies:
    caniuse-lite "^1.0.30000792"
    electron-to-chromium "^1.3.30"

browserslist@^3.2.6:
  version "3.2.8"
  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
  integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
  dependencies:
    caniuse-lite "^1.0.30000844"
    electron-to-chromium "^1.3.47"

buf-compare@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a"
  integrity sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=

buffer-from@^1.0.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
  integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==

buffer-xor@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
  integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=

buffer@^4.3.0:
  version "4.9.1"
  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
  integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
  dependencies:
    base64-js "^1.0.2"
    ieee754 "^1.1.4"
    isarray "^1.0.0"

builtin-status-codes@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
  integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=

cacache@^10.0.4:
  version "10.0.4"
  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
  integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==
  dependencies:
    bluebird "^3.5.1"
    chownr "^1.0.1"
    glob "^7.1.2"
    graceful-fs "^4.1.11"
    lru-cache "^4.1.1"
    mississippi "^2.0.0"
    mkdirp "^0.5.1"
    move-concurrently "^1.0.1"
    promise-inflight "^1.0.1"
    rimraf "^2.6.2"
    ssri "^5.2.4"
    unique-filename "^1.1.0"
    y18n "^4.0.0"

cache-base@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
  dependencies:
    collection-visit "^1.0.0"
    component-emitter "^1.2.1"
    get-value "^2.0.6"
    has-value "^1.0.0"
    isobject "^3.0.1"
    set-value "^2.0.0"
    to-object-path "^0.3.0"
    union-value "^1.0.0"
    unset-value "^1.0.0"

caching-transform@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1"
  integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=
  dependencies:
    md5-hex "^1.2.0"
    mkdirp "^0.5.1"
    write-file-atomic "^1.1.4"

call-matcher@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.1.0.tgz#23b2c1bc7a8394c8be28609d77ddbd5786680432"
  integrity sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw==
  dependencies:
    core-js "^2.0.0"
    deep-equal "^1.0.0"
    espurify "^1.6.0"
    estraverse "^4.0.0"

call-signature@0.0.2:
  version "0.0.2"
  resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996"
  integrity sha1-qEq8glpV70yysCi9dOIFpluaSZY=

caller-path@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
  integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
  dependencies:
    callsites "^0.2.0"

callsites@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
  integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=

camelcase-keys@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
  integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
  dependencies:
    camelcase "^2.0.0"
    map-obj "^1.0.0"

camelcase@^1.0.2:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
  integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=

camelcase@^2.0.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
  integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=

camelcase@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
  integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=

camelcase@^4.0.0, camelcase@^4.1.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
  integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=

caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844:
  version "1.0.30000967"
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz#a5039577806fccee80a04aaafb2c0890b1ee2f73"
  integrity sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==

capture-stack-trace@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
  integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==

caseless@~0.12.0:
  version "0.12.0"
  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
  integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=

catharsis@^0.8.10:
  version "0.8.10"
  resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.10.tgz#364198c1fbf084ae17028ee33ec7db53ca942ee6"
  integrity sha512-l2OUaz/3PU3MZylspVFJvwHCVfWyvcduPq4lv3AzZ2pJzZCo7kNKFNyatwujD7XgvGkNAE/Jhhbh2uARNwNkfw==
  dependencies:
    lodash "^4.17.11"

center-align@^0.1.1:
  version "0.1.3"
  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
  integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60=
  dependencies:
    align-text "^0.1.3"
    lazy-cache "^1.0.3"

chalk@^0.4.0:
  version "0.4.0"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
  integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=
  dependencies:
    ansi-styles "~1.0.0"
    has-color "~0.1.0"
    strip-ansi "~0.1.0"

chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
  dependencies:
    ansi-styles "^2.2.1"
    escape-string-regexp "^1.0.2"
    has-ansi "^2.0.0"
    strip-ansi "^3.0.0"
    supports-color "^2.0.0"

chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1:
  version "2.4.2"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
  dependencies:
    ansi-styles "^3.2.1"
    escape-string-regexp "^1.0.5"
    supports-color "^5.3.0"

chardet@^0.4.0:
  version "0.4.2"
  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
  integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=

chokidar@^1.4.2, chokidar@^1.6.1:
  version "1.7.0"
  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
  integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=
  dependencies:
    anymatch "^1.3.0"
    async-each "^1.0.0"
    glob-parent "^2.0.0"
    inherits "^2.0.1"
    is-binary-path "^1.0.0"
    is-glob "^2.0.0"
    path-is-absolute "^1.0.0"
    readdirp "^2.0.0"
  optionalDependencies:
    fsevents "^1.0.0"

chokidar@^2.0.2:
  version "2.1.5"
  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d"
  integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==
  dependencies:
    anymatch "^2.0.0"
    async-each "^1.0.1"
    braces "^2.3.2"
    glob-parent "^3.1.0"
    inherits "^2.0.3"
    is-binary-path "^1.0.0"
    is-glob "^4.0.0"
    normalize-path "^3.0.0"
    path-is-absolute "^1.0.0"
    readdirp "^2.2.1"
    upath "^1.1.1"
  optionalDependencies:
    fsevents "^1.2.7"

chownr@^1.0.1, chownr@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
  integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==

ci-info@^1.5.0:
  version "1.6.0"
  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
  integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==

cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
  integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
  dependencies:
    inherits "^2.0.1"
    safe-buffer "^5.0.1"

circular-json@^0.3.1:
  version "0.3.3"
  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
  integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==

class-utils@^0.3.5:
  version "0.3.6"
  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
  dependencies:
    arr-union "^3.1.0"
    define-property "^0.2.5"
    isobject "^3.0.0"
    static-extend "^0.1.1"

clean-css@4.2.1:
  version "4.2.1"
  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
  integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==
  dependencies:
    source-map "~0.6.0"

clean-stack@^1.1.1:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31"
  integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=

clean-yaml-object@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68"
  integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=

cli-boxes@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
  integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=

cli-cursor@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
  integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
  dependencies:
    restore-cursor "^2.0.0"

cli-spinners@^1.0.0:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
  integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==

cli-truncate@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086"
  integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==
  dependencies:
    slice-ansi "^1.0.0"
    string-width "^2.0.0"

cli-width@^2.0.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
  integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=

cliui@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
  integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=
  dependencies:
    center-align "^0.1.1"
    right-align "^0.1.1"
    wordwrap "0.0.2"

cliui@^3.2.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
  integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
  dependencies:
    string-width "^1.0.1"
    strip-ansi "^3.0.1"
    wrap-ansi "^2.0.0"

clone-buffer@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
  integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=

clone-stats@^0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
  integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=

clone-stats@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
  integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=

clone@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
  integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=

clone@^1.0.0, clone@^1.0.2:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
  integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=

clone@^2.1.1:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
  integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=

cloneable-readable@^1.0.0:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65"
  integrity sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==
  dependencies:
    inherits "^2.0.1"
    process-nextick-args "^2.0.0"
    readable-stream "^2.3.5"

co-with-promise@^4.6.0:
  version "4.6.0"
  resolved "https://registry.yarnpkg.com/co-with-promise/-/co-with-promise-4.6.0.tgz#413e7db6f5893a60b942cf492c4bec93db415ab7"
  integrity sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc=
  dependencies:
    pinkie-promise "^1.0.0"

co@^4.6.0:
  version "4.6.0"
  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
  integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=

code-excerpt@^2.1.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-2.1.1.tgz#5fe3057bfbb71a5f300f659ef2cc0a47651ba77c"
  integrity sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw==
  dependencies:
    convert-to-spaces "^1.0.1"

code-point-at@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
  integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=

collection-visit@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
  dependencies:
    map-visit "^1.0.0"
    object-visit "^1.0.0"

color-convert@^1.9.0, color-convert@^1.9.1:
  version "1.9.3"
  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
  dependencies:
    color-name "1.1.3"

color-name@1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=

color-name@^1.0.0:
  version "1.1.4"
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==

color-string@^1.5.2:
  version "1.5.3"
  resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
  integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
  dependencies:
    color-name "^1.0.0"
    simple-swizzle "^0.2.2"

color-support@^1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
  integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==

color@^3.0.0:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/color/-/color-3.1.1.tgz#7abf5c0d38e89378284e873c207ae2172dcc8a61"
  integrity sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==
  dependencies:
    color-convert "^1.9.1"
    color-string "^1.5.2"

colors@1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
  integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=

combined-stream@^1.0.6, combined-stream@~1.0.6:
  version "1.0.7"
  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
  integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
  dependencies:
    delayed-stream "~1.0.0"

commander@2.15.1:
  version "2.15.1"
  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
  integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==

commander@^2.11.0, commander@~2.20.0:
  version "2.20.0"
  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
  integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==

commander@~2.13.0:
  version "2.13.0"
  resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
  integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==

common-path-prefix@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0"
  integrity sha1-zVL28HEuC6q5fW+XModPIvR3UsA=

commondir@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
  integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=

component-emitter@^1.2.1:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==

concat-map@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=

concat-stream@^1.5.0, concat-stream@^1.6.0:
  version "1.6.2"
  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
  integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
  dependencies:
    buffer-from "^1.0.0"
    inherits "^2.0.3"
    readable-stream "^2.2.2"
    typedarray "^0.0.6"

concat-with-sourcemaps@*:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e"
  integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==
  dependencies:
    source-map "^0.6.1"

concordance@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/concordance/-/concordance-3.0.0.tgz#b2286af54405fc995fc7345b0b106d8dd073cb29"
  integrity sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ==
  dependencies:
    date-time "^2.1.0"
    esutils "^2.0.2"
    fast-diff "^1.1.1"
    function-name-support "^0.2.0"
    js-string-escape "^1.0.1"
    lodash.clonedeep "^4.5.0"
    lodash.flattendeep "^4.4.0"
    lodash.merge "^4.6.0"
    md5-hex "^2.0.0"
    semver "^5.3.0"
    well-known-symbols "^1.0.0"

configstore@^3.0.0:
  version "3.1.2"
  resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
  integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==
  dependencies:
    dot-prop "^4.1.0"
    graceful-fs "^4.1.2"
    make-dir "^1.0.0"
    unique-string "^1.0.0"
    write-file-atomic "^2.0.0"
    xdg-basedir "^3.0.0"

console-browserify@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
  integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
  dependencies:
    date-now "^0.1.4"

console-control-strings@^1.0.0, console-control-strings@~1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
  integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=

constants-browserify@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
  integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=

convert-source-map@1.X, convert-source-map@^1.2.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
  version "1.6.0"
  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
  integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
  dependencies:
    safe-buffer "~5.1.1"

convert-to-spaces@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715"
  integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=

copy-concurrently@^1.0.0:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
  integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
  dependencies:
    aproba "^1.1.1"
    fs-write-stream-atomic "^1.0.8"
    iferr "^0.1.5"
    mkdirp "^0.5.1"
    rimraf "^2.5.4"
    run-queue "^1.0.0"

copy-descriptor@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=

core-assert@^0.2.0:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f"
  integrity sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=
  dependencies:
    buf-compare "^1.0.0"
    is-error "^2.2.0"

core-js@^2.0.0, core-js@^2.4.0, core-js@^2.5.0:
  version "2.6.5"
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895"
  integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==

core-util-is@1.0.2, core-util-is@~1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=

corser@~2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87"
  integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=

create-ecdh@^4.0.0:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
  integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
  dependencies:
    bn.js "^4.1.0"
    elliptic "^6.0.0"

create-error-class@^3.0.0:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
  integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
  dependencies:
    capture-stack-trace "^1.0.0"

create-hash@^1.1.0, create-hash@^1.1.2:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
  dependencies:
    cipher-base "^1.0.1"
    inherits "^2.0.1"
    md5.js "^1.3.4"
    ripemd160 "^2.0.1"
    sha.js "^2.4.0"

create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
  dependencies:
    cipher-base "^1.0.3"
    create-hash "^1.1.0"
    inherits "^2.0.1"
    ripemd160 "^2.0.0"
    safe-buffer "^5.0.1"
    sha.js "^2.4.8"

cross-spawn@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
  integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
  dependencies:
    lru-cache "^4.0.1"
    which "^1.2.9"

cross-spawn@^5.0.1, cross-spawn@^5.1.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
  integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
  dependencies:
    lru-cache "^4.0.1"
    shebang-command "^1.2.0"
    which "^1.2.9"

crypto-browserify@^3.11.0:
  version "3.12.0"
  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
  integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
  dependencies:
    browserify-cipher "^1.0.0"
    browserify-sign "^4.0.0"
    create-ecdh "^4.0.0"
    create-hash "^1.1.0"
    create-hmac "^1.1.0"
    diffie-hellman "^5.0.0"
    inherits "^2.0.1"
    pbkdf2 "^3.0.3"
    public-encrypt "^4.0.0"
    randombytes "^2.0.0"
    randomfill "^1.0.3"

crypto-random-string@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
  integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=

css@2.X, css@^2.2.1:
  version "2.2.4"
  resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
  integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
  dependencies:
    inherits "^2.0.3"
    source-map "^0.6.1"
    source-map-resolve "^0.5.2"
    urix "^0.1.0"

cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
  version "0.3.6"
  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad"
  integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==

cssstyle@^1.0.0:
  version "1.2.2"
  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077"
  integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==
  dependencies:
    cssom "0.3.x"

currently-unhandled@^0.4.1:
  version "0.4.1"
  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
  integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
  dependencies:
    array-find-index "^1.0.1"

cyclist@~0.2.2:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
  integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=

d@1:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
  integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=
  dependencies:
    es5-ext "^0.10.9"

dashdash@^1.12.0:
  version "1.14.1"
  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
  integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
  dependencies:
    assert-plus "^1.0.0"

data-urls@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
  integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
  dependencies:
    abab "^2.0.0"
    whatwg-mimetype "^2.2.0"
    whatwg-url "^7.0.0"

date-now@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
  integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=

date-time@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/date-time/-/date-time-0.1.1.tgz#ed2f6d93d9790ce2fd66d5b5ff3edd5bbcbf3b07"
  integrity sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=

date-time@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2"
  integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==
  dependencies:
    time-zone "^1.0.0"

dateformat@^2.0.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
  integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=

debug-fabulous@1.X:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e"
  integrity sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==
  dependencies:
    debug "3.X"
    memoizee "0.4.X"
    object-assign "4.X"

debug@3.X, debug@^3.0.1, debug@^3.1.0, debug@^3.2.6:
  version "3.2.6"
  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
  integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
  dependencies:
    ms "^2.1.1"

debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
  version "2.6.9"
  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
  dependencies:
    ms "2.0.0"

debug@^4.1.0:
  version "4.1.1"
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
  integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
  dependencies:
    ms "^2.1.1"

decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
  integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=

decode-uri-component@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=

deep-equal@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
  integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=

deep-extend@^0.6.0:
  version "0.6.0"
  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
  integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==

deep-is@~0.1.3:
  version "0.1.3"
  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
  integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=

defaults@^1.0.0:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
  integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
  dependencies:
    clone "^1.0.2"

define-property@^0.2.5:
  version "0.2.5"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
  dependencies:
    is-descriptor "^0.1.0"

define-property@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
  dependencies:
    is-descriptor "^1.0.0"

define-property@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
  dependencies:
    is-descriptor "^1.0.2"
    isobject "^3.0.1"

del@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
  integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=
  dependencies:
    globby "^6.1.0"
    is-path-cwd "^1.0.0"
    is-path-in-cwd "^1.0.0"
    p-map "^1.1.1"
    pify "^3.0.0"
    rimraf "^2.2.8"

delayed-stream@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
  integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=

delegates@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
  integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=

deprecated@^0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
  integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=

des.js@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
  integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
  dependencies:
    inherits "^2.0.1"
    minimalistic-assert "^1.0.0"

detect-file@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
  integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=

detect-indent@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
  integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
  dependencies:
    repeating "^2.0.0"

detect-indent@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
  integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=

detect-libc@^1.0.2:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
  integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=

detect-newline@2.X:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
  integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=

diffie-hellman@^5.0.0:
  version "5.0.3"
  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
  integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
  dependencies:
    bn.js "^4.1.0"
    miller-rabin "^4.0.0"
    randombytes "^2.0.0"

doctrine@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
  integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
  dependencies:
    esutils "^2.0.2"

domain-browser@^1.1.1:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
  integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==

domexception@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
  integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
  dependencies:
    webidl-conversions "^4.0.2"

dot-prop@^4.1.0:
  version "4.2.0"
  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
  integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
  dependencies:
    is-obj "^1.0.0"

duplexer2@0.0.2:
  version "0.0.2"
  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
  integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=
  dependencies:
    readable-stream "~1.1.9"

duplexer3@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
  integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=

duplexify@^3.4.2, duplexify@^3.6.0:
  version "3.7.1"
  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
  integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
  dependencies:
    end-of-stream "^1.0.0"
    inherits "^2.0.1"
    readable-stream "^2.0.0"
    stream-shift "^1.0.0"

ecc-jsbn@~0.1.1:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
  integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
  dependencies:
    jsbn "~0.1.0"
    safer-buffer "^2.1.0"

ecstatic@^2.0.0:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-2.2.1.tgz#b5087fad439dd9dd49d31e18131454817fe87769"
  integrity sha512-ztE4WqheoWLh3wv+HQwy7dACnvNY620coWpa+XqY6R2cVWgaAT2lUISU1Uf7JpdLLJCURktJOaA9av2AOzsyYQ==
  dependencies:
    he "^1.1.1"
    mime "^1.2.11"
    minimist "^1.1.0"
    url-join "^2.0.2"

electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.47:
  version "1.3.133"
  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.133.tgz#c47639c19b91feee3e22fad69f5556142007008c"
  integrity sha512-lyoC8aoqbbDqsprb6aPdt9n3DpOZZzdz/T4IZKsR0/dkZIxnJVUjjcpOSwA66jPRIOyDAamCTAUqweU05kKNSg==

elliptic@^6.0.0:
  version "6.4.1"
  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a"
  integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==
  dependencies:
    bn.js "^4.4.0"
    brorand "^1.0.1"
    hash.js "^1.0.0"
    hmac-drbg "^1.0.0"
    inherits "^2.0.1"
    minimalistic-assert "^1.0.0"
    minimalistic-crypto-utils "^1.0.0"

emojis-list@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
  integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=

empower-core@^0.6.1:
  version "0.6.2"
  resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.2.tgz#5adef566088e31fba80ba0a36df47d7094169144"
  integrity sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=
  dependencies:
    call-signature "0.0.2"
    core-js "^2.0.0"

end-of-stream@^1.0.0, end-of-stream@^1.1.0:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
  integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
  dependencies:
    once "^1.4.0"

end-of-stream@~0.1.5:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
  integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8=
  dependencies:
    once "~1.3.0"

enhanced-resolve@^3.4.0:
  version "3.4.1"
  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
  integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=
  dependencies:
    graceful-fs "^4.1.2"
    memory-fs "^0.4.0"
    object-assign "^4.0.1"
    tapable "^0.2.7"

entities@~1.1.1:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
  integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==

equal-length@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c"
  integrity sha1-IcoRLUirJLTh5//A5TOdMf38J0w=

errno@^0.1.3, errno@~0.1.7:
  version "0.1.7"
  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
  integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
  dependencies:
    prr "~1.0.1"

error-ex@^1.2.0, error-ex@^1.3.1:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
  dependencies:
    is-arrayish "^0.2.1"

es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
  version "0.10.50"
  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778"
  integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==
  dependencies:
    es6-iterator "~2.0.3"
    es6-symbol "~3.1.1"
    next-tick "^1.0.0"

es6-error@^4.0.1, es6-error@^4.0.2:
  version "4.1.1"
  resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
  integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==

es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
  version "2.0.3"
  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
  integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
  dependencies:
    d "1"
    es5-ext "^0.10.35"
    es6-symbol "^3.1.1"

es6-map@^0.1.3:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
  integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=
  dependencies:
    d "1"
    es5-ext "~0.10.14"
    es6-iterator "~2.0.1"
    es6-set "~0.1.5"
    es6-symbol "~3.1.1"
    event-emitter "~0.3.5"

es6-set@~0.1.5:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
  integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=
  dependencies:
    d "1"
    es5-ext "~0.10.14"
    es6-iterator "~2.0.1"
    es6-symbol "3.1.1"
    event-emitter "~0.3.5"

es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
  integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
  dependencies:
    d "1"
    es5-ext "~0.10.14"

es6-weak-map@^2.0.1, es6-weak-map@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
  integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=
  dependencies:
    d "1"
    es5-ext "^0.10.14"
    es6-iterator "^2.0.1"
    es6-symbol "^3.1.1"

escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=

escape-string-regexp@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
  integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==

escodegen@^1.9.1:
  version "1.11.1"
  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510"
  integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==
  dependencies:
    esprima "^3.1.3"
    estraverse "^4.2.0"
    esutils "^2.0.2"
    optionator "^0.8.1"
  optionalDependencies:
    source-map "~0.6.1"

escope@^3.6.0:
  version "3.6.0"
  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
  integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=
  dependencies:
    es6-map "^0.1.3"
    es6-weak-map "^2.0.1"
    esrecurse "^4.1.0"
    estraverse "^4.1.1"

eslint-loader@^1.9.0:
  version "1.9.0"
  resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.9.0.tgz#7e1be9feddca328d3dcfaef1ad49d5beffe83a13"
  integrity sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==
  dependencies:
    loader-fs-cache "^1.0.0"
    loader-utils "^1.0.2"
    object-assign "^4.0.1"
    object-hash "^1.1.4"
    rimraf "^2.6.1"

eslint-scope@3.7.1:
  version "3.7.1"
  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
  integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=
  dependencies:
    esrecurse "^4.1.0"
    estraverse "^4.1.1"

eslint-scope@^3.7.1:
  version "3.7.3"
  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
  integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==
  dependencies:
    esrecurse "^4.1.0"
    estraverse "^4.1.1"

eslint-visitor-keys@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
  integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==

eslint@^4.11.0:
  version "4.19.1"
  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
  integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
  dependencies:
    ajv "^5.3.0"
    babel-code-frame "^6.22.0"
    chalk "^2.1.0"
    concat-stream "^1.6.0"
    cross-spawn "^5.1.0"
    debug "^3.1.0"
    doctrine "^2.1.0"
    eslint-scope "^3.7.1"
    eslint-visitor-keys "^1.0.0"
    espree "^3.5.4"
    esquery "^1.0.0"
    esutils "^2.0.2"
    file-entry-cache "^2.0.0"
    functional-red-black-tree "^1.0.1"
    glob "^7.1.2"
    globals "^11.0.1"
    ignore "^3.3.3"
    imurmurhash "^0.1.4"
    inquirer "^3.0.6"
    is-resolvable "^1.0.0"
    js-yaml "^3.9.1"
    json-stable-stringify-without-jsonify "^1.0.1"
    levn "^0.3.0"
    lodash "^4.17.4"
    minimatch "^3.0.2"
    mkdirp "^0.5.1"
    natural-compare "^1.4.0"
    optionator "^0.8.2"
    path-is-inside "^1.0.2"
    pluralize "^7.0.0"
    progress "^2.0.0"
    regexpp "^1.0.1"
    require-uncached "^1.0.3"
    semver "^5.3.0"
    strip-ansi "^4.0.0"
    strip-json-comments "~2.0.1"
    table "4.0.2"
    text-table "~0.2.0"

espower-location-detector@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5"
  integrity sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=
  dependencies:
    is-url "^1.2.1"
    path-is-absolute "^1.0.0"
    source-map "^0.5.0"
    xtend "^4.0.0"

espree@^3.5.4:
  version "3.5.4"
  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
  integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
  dependencies:
    acorn "^5.5.0"
    acorn-jsx "^3.0.0"

esprima@^3.1.3:
  version "3.1.3"
  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
  integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=

esprima@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==

espurify@^1.6.0:
  version "1.8.1"
  resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.8.1.tgz#5746c6c1ab42d302de10bd1d5bf7f0e8c0515056"
  integrity sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==
  dependencies:
    core-js "^2.0.0"

esquery@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
  integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
  dependencies:
    estraverse "^4.0.0"

esrecurse@^4.1.0:
  version "4.2.1"
  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
  integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
  dependencies:
    estraverse "^4.1.0"

estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
  version "4.2.0"
  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
  integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=

esutils@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
  integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=

event-emitter@^0.3.5, event-emitter@~0.3.5:
  version "0.3.5"
  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
  integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
  dependencies:
    d "1"
    es5-ext "~0.10.14"

eventemitter3@^3.0.0:
  version "3.1.2"
  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
  integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==

events@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
  integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==

evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
  integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
  dependencies:
    md5.js "^1.3.4"
    safe-buffer "^5.1.1"

execa@^0.7.0:
  version "0.7.0"
  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
  integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
  dependencies:
    cross-spawn "^5.0.1"
    get-stream "^3.0.0"
    is-stream "^1.1.0"
    npm-run-path "^2.0.0"
    p-finally "^1.0.0"
    signal-exit "^3.0.0"
    strip-eof "^1.0.0"

expand-brackets@^0.1.4:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
  integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=
  dependencies:
    is-posix-bracket "^0.1.0"

expand-brackets@^2.1.4:
  version "2.1.4"
  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
  dependencies:
    debug "^2.3.3"
    define-property "^0.2.5"
    extend-shallow "^2.0.1"
    posix-character-classes "^0.1.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

expand-range@^1.8.1:
  version "1.8.2"
  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
  integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=
  dependencies:
    fill-range "^2.1.0"

expand-tilde@^2.0.0, expand-tilde@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
  integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
  dependencies:
    homedir-polyfill "^1.0.1"

extend-shallow@^1.1.2:
  version "1.1.4"
  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071"
  integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=
  dependencies:
    kind-of "^1.1.0"

extend-shallow@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
  dependencies:
    is-extendable "^0.1.0"

extend-shallow@^3.0.0, extend-shallow@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
  dependencies:
    assign-symbols "^1.0.0"
    is-extendable "^1.0.1"

extend@^3.0.0, extend@^3.0.1, extend@~3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==

external-editor@^2.0.4:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
  integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
  dependencies:
    chardet "^0.4.0"
    iconv-lite "^0.4.17"
    tmp "^0.0.33"

extglob@^0.3.1:
  version "0.3.2"
  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
  integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=
  dependencies:
    is-extglob "^1.0.0"

extglob@^2.0.4:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
  dependencies:
    array-unique "^0.3.2"
    define-property "^1.0.0"
    expand-brackets "^2.1.4"
    extend-shallow "^2.0.1"
    fragment-cache "^0.2.1"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

extsprintf@1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
  integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=

extsprintf@^1.2.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
  integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=

fancy-log@^1.1.0, fancy-log@^1.3.2:
  version "1.3.3"
  resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
  integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
  dependencies:
    ansi-gray "^0.1.1"
    color-support "^1.1.3"
    parse-node-version "^1.0.0"
    time-stamp "^1.0.0"

fast-deep-equal@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
  integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=

fast-deep-equal@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
  integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=

fast-diff@^1.1.1:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
  integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==

fast-json-stable-stringify@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
  integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=

fast-levenshtein@~2.0.4:
  version "2.0.6"
  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
  integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=

figures@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
  integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
  dependencies:
    escape-string-regexp "^1.0.5"

file-entry-cache@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
  integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
  dependencies:
    flat-cache "^1.2.1"
    object-assign "^4.0.1"

filename-regex@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
  integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=

filename-reserved-regex@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4"
  integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=

filenamify-url@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/filenamify-url/-/filenamify-url-1.0.0.tgz#b32bd81319ef5863b73078bed50f46a4f7975f50"
  integrity sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=
  dependencies:
    filenamify "^1.0.0"
    humanize-url "^1.0.0"

filenamify@^1.0.0:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5"
  integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=
  dependencies:
    filename-reserved-regex "^1.0.0"
    strip-outer "^1.0.0"
    trim-repeated "^1.0.0"

fill-range@^2.1.0:
  version "2.2.4"
  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
  integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
  dependencies:
    is-number "^2.1.0"
    isobject "^2.0.0"
    randomatic "^3.0.0"
    repeat-element "^1.1.2"
    repeat-string "^1.5.2"

fill-range@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
  dependencies:
    extend-shallow "^2.0.1"
    is-number "^3.0.0"
    repeat-string "^1.6.1"
    to-regex-range "^2.1.0"

find-cache-dir@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
  integrity sha1-yN765XyKUqinhPnjHFfHQumToLk=
  dependencies:
    commondir "^1.0.1"
    mkdirp "^0.5.1"
    pkg-dir "^1.0.0"

find-cache-dir@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
  integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=
  dependencies:
    commondir "^1.0.1"
    make-dir "^1.0.0"
    pkg-dir "^2.0.0"

find-index@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
  integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=

find-up@^1.0.0:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
  integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
  dependencies:
    path-exists "^2.0.0"
    pinkie-promise "^2.0.0"

find-up@^2.0.0, find-up@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
  dependencies:
    locate-path "^2.0.0"

findup-sync@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
  integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
  dependencies:
    detect-file "^1.0.0"
    is-glob "^3.1.0"
    micromatch "^3.0.4"
    resolve-dir "^1.0.1"

fined@^1.0.1:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
  integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
  dependencies:
    expand-tilde "^2.0.2"
    is-plain-object "^2.0.3"
    object.defaults "^1.1.0"
    object.pick "^1.2.0"
    parse-filepath "^1.0.1"

first-chunk-stream@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
  integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=

flagged-respawn@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
  integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==

flat-cache@^1.2.1:
  version "1.3.4"
  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
  integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
  dependencies:
    circular-json "^0.3.1"
    graceful-fs "^4.1.2"
    rimraf "~2.6.2"
    write "^0.2.1"

flush-write-stream@^1.0.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
  integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
  dependencies:
    inherits "^2.0.3"
    readable-stream "^2.3.6"

fn-name@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7"
  integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=

follow-redirects@^1.0.0:
  version "1.7.0"
  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76"
  integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==
  dependencies:
    debug "^3.2.6"

for-in@^1.0.1, for-in@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=

for-own@^0.1.4:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
  integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=
  dependencies:
    for-in "^1.0.1"

for-own@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
  integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
  dependencies:
    for-in "^1.0.1"

forever-agent@~0.6.1:
  version "0.6.1"
  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
  integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=

form-data@~2.3.2:
  version "2.3.3"
  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
  integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
  dependencies:
    asynckit "^0.4.0"
    combined-stream "^1.0.6"
    mime-types "^2.1.12"

fragment-cache@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
  dependencies:
    map-cache "^0.2.2"

from2@^2.1.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
  integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
  dependencies:
    inherits "^2.0.1"
    readable-stream "^2.0.0"

fs-extra@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd"
  integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==
  dependencies:
    graceful-fs "^4.1.2"
    jsonfile "^4.0.0"
    universalify "^0.1.0"

fs-minipass@^1.2.5:
  version "1.2.5"
  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
  integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==
  dependencies:
    minipass "^2.2.1"

fs-readdir-recursive@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
  integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==

fs-write-stream-atomic@^1.0.8:
  version "1.0.10"
  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
  integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
  dependencies:
    graceful-fs "^4.1.2"
    iferr "^0.1.5"
    imurmurhash "^0.1.4"
    readable-stream "1 || 2"

fs.realpath@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=

fsevents@^1.0.0, fsevents@^1.2.7:
  version "1.2.9"
  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f"
  integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==
  dependencies:
    nan "^2.12.1"
    node-pre-gyp "^0.12.0"

fstream@^1.0.0, fstream@^1.0.2:
  version "1.0.11"
  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
  integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=
  dependencies:
    graceful-fs "^4.1.2"
    inherits "~2.0.0"
    mkdirp ">=0.5 0"
    rimraf "2"

function-name-support@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/function-name-support/-/function-name-support-0.2.0.tgz#55d3bfaa6eafd505a50f9bc81fdf57564a0bb071"
  integrity sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE=

functional-red-black-tree@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=

gauge@~2.7.3:
  version "2.7.4"
  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
  integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
  dependencies:
    aproba "^1.0.3"
    console-control-strings "^1.0.0"
    has-unicode "^2.0.0"
    object-assign "^4.1.0"
    signal-exit "^3.0.0"
    string-width "^1.0.1"
    strip-ansi "^3.0.1"
    wide-align "^1.1.0"

gaze@^0.5.1:
  version "0.5.2"
  resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
  integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=
  dependencies:
    globule "~0.1.0"

gaze@^1.0.0:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
  integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
  dependencies:
    globule "^1.0.0"

get-caller-file@^1.0.1:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
  integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==

get-port@^3.0.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
  integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=

get-stdin@^4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
  integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=

get-stream@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
  integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=

get-value@^2.0.3, get-value@^2.0.6:
  version "2.0.6"
  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=

getpass@^0.1.1:
  version "0.1.7"
  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
  integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
  dependencies:
    assert-plus "^1.0.0"

gh-pages@^1.0.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-1.2.0.tgz#1acb92801078f7c038a167f447221d1496ccfbee"
  integrity sha512-cGLYAvxtlQ1iTwAS4g7FreZPXoE/g62Fsxln2mmR19mgs4zZI+XJ+wVVUhBFCF/0+Nmvbq+abyTWue1m1BSnmg==
  dependencies:
    async "2.6.1"
    commander "2.15.1"
    filenamify-url "^1.0.0"
    fs-extra "^5.0.0"
    globby "^6.1.0"
    graceful-fs "4.1.11"
    rimraf "^2.6.2"

glob-base@^0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
  integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=
  dependencies:
    glob-parent "^2.0.0"
    is-glob "^2.0.0"

glob-parent@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
  integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=
  dependencies:
    is-glob "^2.0.0"

glob-parent@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
  integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
  dependencies:
    is-glob "^3.1.0"
    path-dirname "^1.0.0"

glob-stream@^3.1.5:
  version "3.1.18"
  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
  integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=
  dependencies:
    glob "^4.3.1"
    glob2base "^0.0.12"
    minimatch "^2.0.1"
    ordered-read-streams "^0.1.0"
    through2 "^0.6.1"
    unique-stream "^1.0.0"

glob-watcher@^0.0.6:
  version "0.0.6"
  resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
  integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=
  dependencies:
    gaze "^0.5.1"

glob2base@^0.0.12:
  version "0.0.12"
  resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
  integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=
  dependencies:
    find-index "^0.1.1"

glob@^4.3.1:
  version "4.5.3"
  resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
  integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=
  dependencies:
    inflight "^1.0.4"
    inherits "2"
    minimatch "^2.0.1"
    once "^1.3.0"

glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
  version "7.1.4"
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
  integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
  dependencies:
    fs.realpath "^1.0.0"
    inflight "^1.0.4"
    inherits "2"
    minimatch "^3.0.4"
    once "^1.3.0"
    path-is-absolute "^1.0.0"

glob@~3.1.21:
  version "3.1.21"
  resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
  integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=
  dependencies:
    graceful-fs "~1.2.0"
    inherits "1"
    minimatch "~0.2.11"

global-dirs@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
  integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
  dependencies:
    ini "^1.3.4"

global-modules@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
  integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
  dependencies:
    global-prefix "^1.0.1"
    is-windows "^1.0.1"
    resolve-dir "^1.0.0"

global-prefix@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
  integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
  dependencies:
    expand-tilde "^2.0.2"
    homedir-polyfill "^1.0.1"
    ini "^1.3.4"
    is-windows "^1.0.1"
    which "^1.2.14"

globals@^11.0.1, globals@^11.1.0:
  version "11.12.0"
  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==

globals@^9.18.0:
  version "9.18.0"
  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
  integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==

globby@^6.0.0, globby@^6.1.0:
  version "6.1.0"
  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
  integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
  dependencies:
    array-union "^1.0.1"
    glob "^7.0.3"
    object-assign "^4.0.1"
    pify "^2.0.0"
    pinkie-promise "^2.0.0"

globule@^1.0.0:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
  integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==
  dependencies:
    glob "~7.1.1"
    lodash "~4.17.10"
    minimatch "~3.0.2"

globule@~0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
  integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=
  dependencies:
    glob "~3.1.21"
    lodash "~1.0.1"
    minimatch "~0.2.11"

glogg@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f"
  integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==
  dependencies:
    sparkles "^1.0.0"

got@^6.7.1:
  version "6.7.1"
  resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
  integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
  dependencies:
    create-error-class "^3.0.0"
    duplexer3 "^0.1.4"
    get-stream "^3.0.0"
    is-redirect "^1.0.0"
    is-retry-allowed "^1.0.0"
    is-stream "^1.0.0"
    lowercase-keys "^1.0.0"
    safe-buffer "^5.0.1"
    timed-out "^4.0.0"
    unzip-response "^2.0.1"
    url-parse-lax "^1.0.0"

graceful-fs@4.1.11:
  version "4.1.11"
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
  integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=

graceful-fs@4.X, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
  version "4.1.15"
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
  integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==

graceful-fs@^3.0.0:
  version "3.0.11"
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
  integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=
  dependencies:
    natives "^1.1.0"

graceful-fs@~1.2.0:
  version "1.2.3"
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
  integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=

gulp-autoprefixer@^4.0.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-4.1.0.tgz#064af73cc02cadac8ff34d0bf93ffdfb94ea12aa"
  integrity sha1-Bkr3PMAsrayP800L+T/9+5TqEqo=
  dependencies:
    autoprefixer "^7.0.0"
    fancy-log "^1.3.2"
    plugin-error "^0.1.2"
    postcss "^6.0.1"
    through2 "^2.0.0"
    vinyl-sourcemaps-apply "^0.2.0"

gulp-clean-css@^3.9.0:
  version "3.10.0"
  resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.10.0.tgz#bccd4605eff104bfa4980014cc4b3c24c571736d"
  integrity sha512-7Isf9Y690o/Q5MVjEylH1H7L8WeZ89woW7DnhD5unTintOdZb67KdOayRgp9trUFo+f9UyJtuatV42e/+kghPg==
  dependencies:
    clean-css "4.2.1"
    plugin-error "1.0.1"
    through2 "2.0.3"
    vinyl-sourcemaps-apply "0.2.1"

gulp-compile-handlebars@^0.6.1:
  version "0.6.1"
  resolved "https://registry.yarnpkg.com/gulp-compile-handlebars/-/gulp-compile-handlebars-0.6.1.tgz#9cc1d9cb951105dfae530928d2a904a14d74c5d3"
  integrity sha1-nMHZy5URBd+uUwko0qkEoU10xdM=
  dependencies:
    gulp-util "^3.0.3"
    handlebars ">=3.0.0"
    through2 "^0.6.3"

gulp-header@^1.8.9:
  version "1.8.12"
  resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz#ad306be0066599127281c4f8786660e705080a84"
  integrity sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==
  dependencies:
    concat-with-sourcemaps "*"
    lodash.template "^4.4.0"
    through2 "^2.0.0"

gulp-rename@^1.2.2:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd"
  integrity sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==

gulp-sass@^2.3.2:
  version "2.3.2"
  resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-2.3.2.tgz#82b7ab90fe902cdc34c04f180d92f2c34902dd52"
  integrity sha1-grerkP6QLNw0wE8YDZLyw0kC3VI=
  dependencies:
    gulp-util "^3.0"
    lodash.clonedeep "^4.3.2"
    node-sass "^3.4.2"
    through2 "^2.0.0"
    vinyl-sourcemaps-apply "^0.2.0"

gulp-shell@^0.6.3:
  version "0.6.5"
  resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.6.5.tgz#f07b204ad8ad1c2659f7a1b6d76efa16d416a759"
  integrity sha512-f3m1WcS0o2B72/PGj1Jbv9zYR9rynBh/EQJv64n01xQUo7j7anols0eww9GG/WtDTzGVQLrupVDYkifRFnj5Zg==
  dependencies:
    async "^2.1.5"
    chalk "^2.3.0"
    fancy-log "^1.3.2"
    lodash "^4.17.4"
    lodash.template "^4.4.0"
    plugin-error "^0.1.2"
    through2 "^2.0.3"

gulp-sourcemaps@^2.6.1:
  version "2.6.5"
  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz#a3f002d87346d2c0f3aec36af7eb873f23de8ae6"
  integrity sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==
  dependencies:
    "@gulp-sourcemaps/identity-map" "1.X"
    "@gulp-sourcemaps/map-sources" "1.X"
    acorn "5.X"
    convert-source-map "1.X"
    css "2.X"
    debug-fabulous "1.X"
    detect-newline "2.X"
    graceful-fs "4.X"
    source-map "~0.6.0"
    strip-bom-string "1.X"
    through2 "2.X"

gulp-string-replace@^1.1.1:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/gulp-string-replace/-/gulp-string-replace-1.1.2.tgz#26e646ae1201954d07cce9172ed25efbcd01d171"
  integrity sha512-8T0eE2SIKPxhG4YNgVM6SEoKRXKh4mRgNT3N/0zXLBGTN4y/E9Y+TR+1gDCrqi431RNkS6ZeLlJ24rKNrdVzYQ==
  dependencies:
    chalk "^2.4.1"
    extend "^3.0.1"
    fancy-log "^1.3.2"
    plugin-error "^1.0.1"
    replacestream "^4.0.3"
    through2 "^2.0.3"

gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.3:
  version "3.0.8"
  resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
  integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08=
  dependencies:
    array-differ "^1.0.0"
    array-uniq "^1.0.2"
    beeper "^1.0.0"
    chalk "^1.0.0"
    dateformat "^2.0.0"
    fancy-log "^1.1.0"
    gulplog "^1.0.0"
    has-gulplog "^0.1.0"
    lodash._reescape "^3.0.0"
    lodash._reevaluate "^3.0.0"
    lodash._reinterpolate "^3.0.0"
    lodash.template "^3.0.0"
    minimist "^1.1.0"
    multipipe "^0.1.2"
    object-assign "^3.0.0"
    replace-ext "0.0.1"
    through2 "^2.0.0"
    vinyl "^0.5.0"

gulp@^3.9.1:
  version "3.9.1"
  resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
  integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=
  dependencies:
    archy "^1.0.0"
    chalk "^1.0.0"
    deprecated "^0.0.1"
    gulp-util "^3.0.0"
    interpret "^1.0.0"
    liftoff "^2.1.0"
    minimist "^1.1.0"
    orchestrator "^0.3.0"
    pretty-hrtime "^1.0.0"
    semver "^4.1.0"
    tildify "^1.0.0"
    v8flags "^2.0.2"
    vinyl-fs "^0.3.0"

gulplog@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
  integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U=
  dependencies:
    glogg "^1.0.0"

handlebars-layouts@^3.1.4:
  version "3.1.4"
  resolved "https://registry.yarnpkg.com/handlebars-layouts/-/handlebars-layouts-3.1.4.tgz#26b3beb931b4b877dfbf7e6feaf4058ee6228b02"
  integrity sha1-JrO+uTG0uHffv35v6vQFjuYiiwI=

handlebars@>=3.0.0:
  version "4.1.2"
  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67"
  integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==
  dependencies:
    neo-async "^2.6.0"
    optimist "^0.6.1"
    source-map "^0.6.1"
  optionalDependencies:
    uglify-js "^3.1.4"

har-schema@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
  integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=

har-validator@~5.1.0:
  version "5.1.3"
  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
  integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
  dependencies:
    ajv "^6.5.5"
    har-schema "^2.0.0"

has-ansi@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
  dependencies:
    ansi-regex "^2.0.0"

has-color@~0.1.0:
  version "0.1.7"
  resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f"
  integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=

has-flag@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
  integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=

has-flag@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=

has-gulplog@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
  integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=
  dependencies:
    sparkles "^1.0.0"

has-unicode@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
  integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=

has-value@^0.3.1:
  version "0.3.1"
  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
  dependencies:
    get-value "^2.0.3"
    has-values "^0.1.4"
    isobject "^2.0.0"

has-value@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
  dependencies:
    get-value "^2.0.6"
    has-values "^1.0.0"
    isobject "^3.0.0"

has-values@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=

has-values@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
  dependencies:
    is-number "^3.0.0"
    kind-of "^4.0.0"

has-yarn@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-1.0.0.tgz#89e25db604b725c8f5976fff0addc921b828a5a7"
  integrity sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac=

hash-base@^3.0.0:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
  integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
  dependencies:
    inherits "^2.0.1"
    safe-buffer "^5.0.1"

hash.js@^1.0.0, hash.js@^1.0.3:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
  integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
  dependencies:
    inherits "^2.0.3"
    minimalistic-assert "^1.0.1"

he@^1.1.1:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==

hmac-drbg@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
  dependencies:
    hash.js "^1.0.3"
    minimalistic-assert "^1.0.0"
    minimalistic-crypto-utils "^1.0.1"

home-or-tmp@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
  integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
  dependencies:
    os-homedir "^1.0.0"
    os-tmpdir "^1.0.1"

homedir-polyfill@^1.0.1:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
  integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
  dependencies:
    parse-passwd "^1.0.0"

hosted-git-info@^2.1.4:
  version "2.7.1"
  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
  integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==

html-encoding-sniffer@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
  integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
  dependencies:
    whatwg-encoding "^1.0.1"

http-proxy@^1.8.1:
  version "1.17.0"
  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a"
  integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==
  dependencies:
    eventemitter3 "^3.0.0"
    follow-redirects "^1.0.0"
    requires-port "^1.0.0"

http-server@^0.10.0:
  version "0.10.0"
  resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.10.0.tgz#b2a446b16a9db87ed3c622ba9beb1b085b1234a7"
  integrity sha1-sqRGsWqduH7TxiK6m+sbCFsSNKc=
  dependencies:
    colors "1.0.3"
    corser "~2.0.0"
    ecstatic "^2.0.0"
    http-proxy "^1.8.1"
    opener "~1.4.0"
    optimist "0.6.x"
    portfinder "^1.0.13"
    union "~0.4.3"

http-signature@~1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
  integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
  dependencies:
    assert-plus "^1.0.0"
    jsprim "^1.2.2"
    sshpk "^1.7.0"

https-browserify@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
  integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=

hullabaloo-config-manager@^1.1.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz#1d9117813129ad035fd9e8477eaf066911269fe3"
  integrity sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A==
  dependencies:
    dot-prop "^4.1.0"
    es6-error "^4.0.2"
    graceful-fs "^4.1.11"
    indent-string "^3.1.0"
    json5 "^0.5.1"
    lodash.clonedeep "^4.5.0"
    lodash.clonedeepwith "^4.5.0"
    lodash.isequal "^4.5.0"
    lodash.merge "^4.6.0"
    md5-hex "^2.0.0"
    package-hash "^2.0.0"
    pkg-dir "^2.0.0"
    resolve-from "^3.0.0"
    safe-buffer "^5.0.1"

humanize-url@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/humanize-url/-/humanize-url-1.0.1.tgz#f4ab99e0d288174ca4e1e50407c55fbae464efff"
  integrity sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=
  dependencies:
    normalize-url "^1.0.0"
    strip-url-auth "^1.0.0"

iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4:
  version "0.4.24"
  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
  dependencies:
    safer-buffer ">= 2.1.2 < 3"

ieee754@^1.1.4:
  version "1.1.13"
  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
  integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==

iferr@^0.1.5:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
  integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=

ignore-by-default@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
  integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=

ignore-walk@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
  integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
  dependencies:
    minimatch "^3.0.4"

ignore@^3.3.3:
  version "3.3.10"
  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
  integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==

import-lazy@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
  integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=

import-local@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8"
  integrity sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=
  dependencies:
    pkg-dir "^2.0.0"
    resolve-cwd "^2.0.0"

imurmurhash@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
  integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=

in-publish@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
  integrity sha1-4g/146KvwmkDILbcVSaCqcf631E=

indent-string@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
  integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
  dependencies:
    repeating "^2.0.0"

indent-string@^3.0.0, indent-string@^3.1.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
  integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=

indexof@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
  integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=

inflight@^1.0.4:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
  dependencies:
    once "^1.3.0"
    wrappy "1"

inherits@1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
  integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=

inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
  version "2.0.3"
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
  integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=

inherits@2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
  integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=

ini@^1.3.4, ini@~1.3.0:
  version "1.3.5"
  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==

inquirer@^3.0.6:
  version "3.3.0"
  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
  integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
  dependencies:
    ansi-escapes "^3.0.0"
    chalk "^2.0.0"
    cli-cursor "^2.1.0"
    cli-width "^2.0.0"
    external-editor "^2.0.4"
    figures "^2.0.0"
    lodash "^4.3.0"
    mute-stream "0.0.7"
    run-async "^2.2.0"
    rx-lite "^4.0.8"
    rx-lite-aggregates "^4.0.8"
    string-width "^2.1.0"
    strip-ansi "^4.0.0"
    through "^2.3.6"

interpret@^1.0.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
  integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==

invariant@^2.2.0, invariant@^2.2.2:
  version "2.2.4"
  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
  integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
  dependencies:
    loose-envify "^1.0.0"

invert-kv@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
  integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=

irregular-plurals@^1.0.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766"
  integrity sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=

is-absolute@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
  integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
  dependencies:
    is-relative "^1.0.0"
    is-windows "^1.0.1"

is-accessor-descriptor@^0.1.6:
  version "0.1.6"
  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
  dependencies:
    kind-of "^3.0.2"

is-accessor-descriptor@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
  dependencies:
    kind-of "^6.0.0"

is-arrayish@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=

is-arrayish@^0.3.1:
  version "0.3.2"
  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
  integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==

is-binary-path@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
  integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
  dependencies:
    binary-extensions "^1.0.0"

is-buffer@^1.1.5:
  version "1.1.6"
  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==

is-ci@^1.0.10, is-ci@^1.0.7:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
  integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
  dependencies:
    ci-info "^1.5.0"

is-data-descriptor@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
  dependencies:
    kind-of "^3.0.2"

is-data-descriptor@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
  dependencies:
    kind-of "^6.0.0"

is-descriptor@^0.1.0:
  version "0.1.6"
  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
  dependencies:
    is-accessor-descriptor "^0.1.6"
    is-data-descriptor "^0.1.4"
    kind-of "^5.0.0"

is-descriptor@^1.0.0, is-descriptor@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
  dependencies:
    is-accessor-descriptor "^1.0.0"
    is-data-descriptor "^1.0.0"
    kind-of "^6.0.2"

is-dotfile@^1.0.0:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
  integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=

is-equal-shallow@^0.1.3:
  version "0.1.3"
  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
  integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=
  dependencies:
    is-primitive "^2.0.0"

is-error@^2.2.0:
  version "2.2.2"
  resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843"
  integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==

is-extendable@^0.1.0, is-extendable@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=

is-extendable@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
  dependencies:
    is-plain-object "^2.0.4"

is-extglob@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
  integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=

is-extglob@^2.1.0, is-extglob@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=

is-finite@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
  integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
  dependencies:
    number-is-nan "^1.0.0"

is-fullwidth-code-point@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
  integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
  dependencies:
    number-is-nan "^1.0.0"

is-fullwidth-code-point@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
  integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=

is-generator-fn@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
  integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=

is-glob@^2.0.0, is-glob@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
  integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=
  dependencies:
    is-extglob "^1.0.0"

is-glob@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
  dependencies:
    is-extglob "^2.1.0"

is-glob@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
  integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
  dependencies:
    is-extglob "^2.1.1"

is-installed-globally@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
  integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
  dependencies:
    global-dirs "^0.1.0"
    is-path-inside "^1.0.0"

is-npm@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
  integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=

is-number@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
  integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=
  dependencies:
    kind-of "^3.0.2"

is-number@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
  dependencies:
    kind-of "^3.0.2"

is-number@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
  integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==

is-obj@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
  integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=

is-observable@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2"
  integrity sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=
  dependencies:
    symbol-observable "^0.2.2"

is-path-cwd@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
  integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=

is-path-in-cwd@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
  integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==
  dependencies:
    is-path-inside "^1.0.0"

is-path-inside@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
  integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
  dependencies:
    path-is-inside "^1.0.1"

is-plain-obj@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
  integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=

is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
  dependencies:
    isobject "^3.0.1"

is-posix-bracket@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
  integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=

is-primitive@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
  integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU=

is-promise@^2.1, is-promise@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
  integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=

is-redirect@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
  integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=

is-relative@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
  integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
  dependencies:
    is-unc-path "^1.0.0"

is-resolvable@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
  integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==

is-retry-allowed@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
  integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=

is-stream@^1.0.0, is-stream@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
  integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=

is-typedarray@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=

is-unc-path@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
  integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
  dependencies:
    unc-path-regex "^0.1.2"

is-url@^1.2.1:
  version "1.2.4"
  resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
  integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==

is-utf8@^0.2.0, is-utf8@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
  integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=

is-windows@^1.0.1, is-windows@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==

isarray@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
  integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=

isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=

isexe@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=

isobject@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
  dependencies:
    isarray "1.0.0"

isobject@^3.0.0, isobject@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=

isstream@~0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
  integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=

jquery@>=2.1.0:
  version "3.4.1"
  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2"
  integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==

js-base64@^2.1.8:
  version "2.5.1"
  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121"
  integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==

js-string-escape@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
  integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=

js-tokens@^3.0.0, js-tokens@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
  integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=

"js-tokens@^3.0.0 || ^4.0.0":
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==

js-yaml@^3.8.2, js-yaml@^3.9.1:
  version "3.13.1"
  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
  integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
  dependencies:
    argparse "^1.0.7"
    esprima "^4.0.0"

js2xmlparser@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.0.tgz#ae14cc711b2892083eed6e219fbc993d858bc3a5"
  integrity sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==
  dependencies:
    xmlcreate "^2.0.0"

jsbn@~0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
  integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=

jsdoc@^3.5.5:
  version "3.6.1"
  resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.1.tgz#f60276a1033feaf20191965605383f75d9166279"
  integrity sha512-mMMsst31b8c7/Z6ewnO6ORIdVMwsobg1enX9b/2XAzW8mM3KuMANRWcMD1KMBq91IAUMOIhC5NsXu7xvNQrRyQ==
  dependencies:
    "@babel/parser" "^7.4.4"
    bluebird "^3.5.4"
    catharsis "^0.8.10"
    escape-string-regexp "^2.0.0"
    js2xmlparser "^4.0.0"
    klaw "^3.0.0"
    markdown-it "^8.4.2"
    markdown-it-anchor "^5.0.2"
    marked "^0.6.2"
    mkdirp "^0.5.1"
    requizzle "^0.2.2"
    strip-json-comments "^3.0.1"
    taffydb "2.6.2"
    underscore "~1.9.1"

jsdom@^11.3.0:
  version "11.12.0"
  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
  integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==
  dependencies:
    abab "^2.0.0"
    acorn "^5.5.3"
    acorn-globals "^4.1.0"
    array-equal "^1.0.0"
    cssom ">= 0.3.2 < 0.4.0"
    cssstyle "^1.0.0"
    data-urls "^1.0.0"
    domexception "^1.0.1"
    escodegen "^1.9.1"
    html-encoding-sniffer "^1.0.2"
    left-pad "^1.3.0"
    nwsapi "^2.0.7"
    parse5 "4.0.0"
    pn "^1.1.0"
    request "^2.87.0"
    request-promise-native "^1.0.5"
    sax "^1.2.4"
    symbol-tree "^3.2.2"
    tough-cookie "^2.3.4"
    w3c-hr-time "^1.0.1"
    webidl-conversions "^4.0.2"
    whatwg-encoding "^1.0.3"
    whatwg-mimetype "^2.1.0"
    whatwg-url "^6.4.1"
    ws "^5.2.0"
    xml-name-validator "^3.0.0"

jsesc@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
  integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=

jsesc@^2.5.1:
  version "2.5.2"
  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==

jsesc@~0.5.0:
  version "0.5.0"
  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
  integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=

json-loader@^0.5.4:
  version "0.5.7"
  resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
  integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==

json-parse-better-errors@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
  integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==

json-schema-traverse@^0.3.0:
  version "0.3.1"
  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
  integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=

json-schema-traverse@^0.4.1:
  version "0.4.1"
  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
  integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==

json-schema@0.2.3:
  version "0.2.3"
  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
  integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=

json-stable-stringify-without-jsonify@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
  integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=

json-stringify-safe@~5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
  integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=

json5@^0.5.1:
  version "0.5.1"
  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
  integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=

json5@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
  dependencies:
    minimist "^1.2.0"

jsonfile@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
  integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
  optionalDependencies:
    graceful-fs "^4.1.6"

jsprim@^1.2.2:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
  integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
  dependencies:
    assert-plus "1.0.0"
    extsprintf "1.3.0"
    json-schema "0.2.3"
    verror "1.10.0"

kind-of@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
  integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=

kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
  dependencies:
    is-buffer "^1.1.5"

kind-of@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
  dependencies:
    is-buffer "^1.1.5"

kind-of@^5.0.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==

kind-of@^6.0.0, kind-of@^6.0.2:
  version "6.0.2"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
  integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==

klaw@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146"
  integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==
  dependencies:
    graceful-fs "^4.1.9"

last-line-stream@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/last-line-stream/-/last-line-stream-1.0.0.tgz#d1b64d69f86ff24af2d04883a2ceee14520a5600"
  integrity sha1-0bZNafhv8kry0EiDos7uFFIKVgA=
  dependencies:
    through2 "^2.0.0"

latest-version@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
  integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
  dependencies:
    package-json "^4.0.0"

lazy-cache@^1.0.3:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
  integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4=

lcid@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
  integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
  dependencies:
    invert-kv "^1.0.0"

left-pad@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
  integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==

levn@^0.3.0, levn@~0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
  integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
  dependencies:
    prelude-ls "~1.1.2"
    type-check "~0.3.2"

liftoff@^2.1.0:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
  integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=
  dependencies:
    extend "^3.0.0"
    findup-sync "^2.0.0"
    fined "^1.0.1"
    flagged-respawn "^1.0.0"
    is-plain-object "^2.0.4"
    object.map "^1.0.0"
    rechoir "^0.6.2"
    resolve "^1.1.7"

linkify-it@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db"
  integrity sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==
  dependencies:
    uc.micro "^1.0.1"

load-json-file@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
  integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
  dependencies:
    graceful-fs "^4.1.2"
    parse-json "^2.2.0"
    pify "^2.0.0"
    pinkie-promise "^2.0.0"
    strip-bom "^2.0.0"

load-json-file@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
  integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
  dependencies:
    graceful-fs "^4.1.2"
    parse-json "^2.2.0"
    pify "^2.0.0"
    strip-bom "^3.0.0"

load-json-file@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
  integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
  dependencies:
    graceful-fs "^4.1.2"
    parse-json "^4.0.0"
    pify "^3.0.0"
    strip-bom "^3.0.0"

loader-fs-cache@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086"
  integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==
  dependencies:
    find-cache-dir "^0.1.1"
    mkdirp "0.5.1"

loader-runner@^2.3.0:
  version "2.4.0"
  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
  integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==

loader-utils@^1.0.2, loader-utils@^1.1.0:
  version "1.2.3"
  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
  integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
  dependencies:
    big.js "^5.2.2"
    emojis-list "^2.0.0"
    json5 "^1.0.1"

locate-path@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
  integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
  dependencies:
    p-locate "^2.0.0"
    path-exists "^3.0.0"

lodash._basecopy@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
  integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=

lodash._basetostring@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
  integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=

lodash._basevalues@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
  integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=

lodash._getnative@^3.0.0:
  version "3.9.1"
  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
  integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=

lodash._isiterateecall@^3.0.0:
  version "3.0.9"
  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
  integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=

lodash._reescape@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
  integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=

lodash._reevaluate@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
  integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=

lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
  integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=

lodash._root@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
  integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=

lodash.assign@^4.2.0:
  version "4.2.0"
  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
  integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=

lodash.clone@^4.3.2:
  version "4.5.0"
  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
  integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=

lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0:
  version "4.5.0"
  resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
  integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=

lodash.clonedeepwith@^4.5.0:
  version "4.5.0"
  resolved "https://registry.yarnpkg.com/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz#6ee30573a03a1a60d670a62ef33c10cf1afdbdd4"
  integrity sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ=

lodash.debounce@^4.0.3:
  version "4.0.8"
  resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
  integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=

lodash.difference@^4.3.0:
  version "4.5.0"
  resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
  integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=

lodash.escape@^3.0.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
  integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=
  dependencies:
    lodash._root "^3.0.0"

lodash.flatten@^4.2.0:
  version "4.4.0"
  resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
  integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=

lodash.flattendeep@^4.4.0:
  version "4.4.0"
  resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
  integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=

lodash.isarguments@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
  integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=

lodash.isarray@^3.0.0:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
  integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=

lodash.isequal@^4.5.0:
  version "4.5.0"
  resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
  integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=

lodash.keys@^3.0.0:
  version "3.1.2"
  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
  integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=
  dependencies:
    lodash._getnative "^3.0.0"
    lodash.isarguments "^3.0.0"
    lodash.isarray "^3.0.0"

lodash.merge@^4.6.0:
  version "4.6.1"
  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
  integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==

lodash.restparam@^3.0.0:
  version "3.6.1"
  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
  integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=

lodash.some@^4.2.2:
  version "4.6.0"
  resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
  integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=

lodash.sortby@^4.7.0:
  version "4.7.0"
  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
  integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=

lodash.template@^3.0.0:
  version "3.6.2"
  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
  integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=
  dependencies:
    lodash._basecopy "^3.0.0"
    lodash._basetostring "^3.0.0"
    lodash._basevalues "^3.0.0"
    lodash._isiterateecall "^3.0.0"
    lodash._reinterpolate "^3.0.0"
    lodash.escape "^3.0.0"
    lodash.keys "^3.0.0"
    lodash.restparam "^3.0.0"
    lodash.templatesettings "^3.0.0"

lodash.template@^4.4.0:
  version "4.4.0"
  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
  integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=
  dependencies:
    lodash._reinterpolate "~3.0.0"
    lodash.templatesettings "^4.0.0"

lodash.templatesettings@^3.0.0:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
  integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=
  dependencies:
    lodash._reinterpolate "^3.0.0"
    lodash.escape "^3.0.0"

lodash.templatesettings@^4.0.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
  integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=
  dependencies:
    lodash._reinterpolate "~3.0.0"

lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@~4.17.10:
  version "4.17.11"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
  integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==

lodash@~1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
  integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=

longest@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
  integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=

loose-envify@^1.0.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
  integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
  dependencies:
    js-tokens "^3.0.0 || ^4.0.0"

loud-rejection@^1.0.0, loud-rejection@^1.2.0:
  version "1.6.0"
  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
  integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
  dependencies:
    currently-unhandled "^0.4.1"
    signal-exit "^3.0.0"

lowercase-keys@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
  integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==

lru-cache@2:
  version "2.7.3"
  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
  integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=

lru-cache@^4.0.1, lru-cache@^4.1.1:
  version "4.1.5"
  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
  integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
  dependencies:
    pseudomap "^1.0.2"
    yallist "^2.1.2"

lru-queue@0.1:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
  integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=
  dependencies:
    es5-ext "~0.10.2"

make-dir@^1.0.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
  integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
  dependencies:
    pify "^3.0.0"

make-iterator@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
  integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
  dependencies:
    kind-of "^6.0.2"

map-cache@^0.2.0, map-cache@^0.2.2:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=

map-obj@^1.0.0, map-obj@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
  integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=

map-visit@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
  dependencies:
    object-visit "^1.0.0"

markdown-it-anchor@^5.0.2:
  version "5.0.2"
  resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.0.2.tgz#cdd917a05b7bf92fb736a6dae3385c6d0d0fa552"
  integrity sha512-AFM/woBI8QDJMS/9+MmsBMT5/AR+ImfOsunQZTZhzcTmna3rIzAzbOh5E0l6mlFM/i9666BpUtkqQ9bS7WApCg==

markdown-it@^8.4.2:
  version "8.4.2"
  resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54"
  integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==
  dependencies:
    argparse "^1.0.7"
    entities "~1.1.1"
    linkify-it "^2.0.0"
    mdurl "^1.0.1"
    uc.micro "^1.0.5"

marked@^0.6.2:
  version "0.6.2"
  resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.2.tgz#c574be8b545a8b48641456ca1dbe0e37b6dccc1a"
  integrity sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==

matcher@^1.0.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2"
  integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==
  dependencies:
    escape-string-regexp "^1.0.4"

math-random@^1.0.1:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c"
  integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==

md5-hex@^1.2.0, md5-hex@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4"
  integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=
  dependencies:
    md5-o-matic "^0.1.1"

md5-hex@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33"
  integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=
  dependencies:
    md5-o-matic "^0.1.1"

md5-o-matic@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3"
  integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=

md5.js@^1.3.4:
  version "1.3.5"
  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
  integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
  dependencies:
    hash-base "^3.0.0"
    inherits "^2.0.1"
    safe-buffer "^5.1.2"

mdurl@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
  integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=

mem@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
  integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
  dependencies:
    mimic-fn "^1.0.0"

memoizee@0.4.X:
  version "0.4.14"
  resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57"
  integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==
  dependencies:
    d "1"
    es5-ext "^0.10.45"
    es6-weak-map "^2.0.2"
    event-emitter "^0.3.5"
    is-promise "^2.1"
    lru-queue "0.1"
    next-tick "1"
    timers-ext "^0.1.5"

memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
  version "0.4.1"
  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
  integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
  dependencies:
    errno "^0.1.3"
    readable-stream "^2.0.1"

meow@^3.7.0:
  version "3.7.0"
  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
  integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
  dependencies:
    camelcase-keys "^2.0.0"
    decamelize "^1.1.2"
    loud-rejection "^1.0.0"
    map-obj "^1.0.1"
    minimist "^1.1.3"
    normalize-package-data "^2.3.4"
    object-assign "^4.0.1"
    read-pkg-up "^1.0.1"
    redent "^1.0.0"
    trim-newlines "^1.0.0"

micromatch@^2.1.5:
  version "2.3.11"
  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
  integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=
  dependencies:
    arr-diff "^2.0.0"
    array-unique "^0.2.1"
    braces "^1.8.2"
    expand-brackets "^0.1.4"
    extglob "^0.3.1"
    filename-regex "^2.0.0"
    is-extglob "^1.0.0"
    is-glob "^2.0.1"
    kind-of "^3.0.2"
    normalize-path "^2.0.1"
    object.omit "^2.0.0"
    parse-glob "^3.0.4"
    regex-cache "^0.4.2"

micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
  version "3.1.10"
  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
  integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
  dependencies:
    arr-diff "^4.0.0"
    array-unique "^0.3.2"
    braces "^2.3.1"
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    extglob "^2.0.4"
    fragment-cache "^0.2.1"
    kind-of "^6.0.2"
    nanomatch "^1.2.9"
    object.pick "^1.3.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.2"

miller-rabin@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
  integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
  dependencies:
    bn.js "^4.0.0"
    brorand "^1.0.1"

mime-db@1.40.0:
  version "1.40.0"
  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
  integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==

mime-types@^2.1.12, mime-types@~2.1.19:
  version "2.1.24"
  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
  integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
  dependencies:
    mime-db "1.40.0"

mime@^1.2.11:
  version "1.6.0"
  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==

mimic-fn@^1.0.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
  integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==

minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
  integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==

minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=

minimatch@^2.0.1:
  version "2.0.10"
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
  integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=
  dependencies:
    brace-expansion "^1.0.0"

minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
  dependencies:
    brace-expansion "^1.1.7"

minimatch@~0.2.11:
  version "0.2.14"
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
  integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=
  dependencies:
    lru-cache "2"
    sigmund "~1.0.0"

minimist@0.0.8:
  version "0.0.8"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
  integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=

minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
  integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=

minimist@~0.0.1:
  version "0.0.10"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
  integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=

minipass@^2.2.1, minipass@^2.3.4:
  version "2.3.5"
  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
  integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
  dependencies:
    safe-buffer "^5.1.2"
    yallist "^3.0.0"

minizlib@^1.1.1:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
  integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==
  dependencies:
    minipass "^2.2.1"

mississippi@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
  integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==
  dependencies:
    concat-stream "^1.5.0"
    duplexify "^3.4.2"
    end-of-stream "^1.1.0"
    flush-write-stream "^1.0.0"
    from2 "^2.1.0"
    parallel-transform "^1.1.0"
    pump "^2.0.1"
    pumpify "^1.3.3"
    stream-each "^1.1.0"
    through2 "^2.0.0"

mixin-deep@^1.2.0:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
  integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
  dependencies:
    for-in "^1.0.2"
    is-extendable "^1.0.1"

mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
  version "0.5.1"
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
  integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
  dependencies:
    minimist "0.0.8"

move-concurrently@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
  integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
  dependencies:
    aproba "^1.1.1"
    copy-concurrently "^1.0.0"
    fs-write-stream-atomic "^1.0.8"
    mkdirp "^0.5.1"
    rimraf "^2.5.4"
    run-queue "^1.0.3"

ms@2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=

ms@^2.0.0, ms@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
  integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==

multimatch@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
  integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=
  dependencies:
    array-differ "^1.0.0"
    array-union "^1.0.1"
    arrify "^1.0.0"
    minimatch "^3.0.0"

multipipe@^0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
  integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=
  dependencies:
    duplexer2 "0.0.2"

mute-stream@0.0.7:
  version "0.0.7"
  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
  integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=

nan@^2.12.1, nan@^2.3.2:
  version "2.13.2"
  resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
  integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==

nanomatch@^1.2.9:
  version "1.2.13"
  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
  dependencies:
    arr-diff "^4.0.0"
    array-unique "^0.3.2"
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    fragment-cache "^0.2.1"
    is-windows "^1.0.2"
    kind-of "^6.0.2"
    object.pick "^1.3.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

natives@^1.1.0:
  version "1.1.6"
  resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb"
  integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==

natural-compare@^1.4.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=

needle@^2.2.1:
  version "2.3.1"
  resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.1.tgz#d272f2f4034afb9c4c9ab1379aabc17fc85c9388"
  integrity sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg==
  dependencies:
    debug "^4.1.0"
    iconv-lite "^0.4.4"
    sax "^1.2.4"

neo-async@^2.5.0, neo-async@^2.6.0:
  version "2.6.0"
  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835"
  integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==

next-tick@1, next-tick@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
  integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=

node-gyp@^3.3.1:
  version "3.8.0"
  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
  integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
  dependencies:
    fstream "^1.0.0"
    glob "^7.0.3"
    graceful-fs "^4.1.2"
    mkdirp "^0.5.0"
    nopt "2 || 3"
    npmlog "0 || 1 || 2 || 3 || 4"
    osenv "0"
    request "^2.87.0"
    rimraf "2"
    semver "~5.3.0"
    tar "^2.0.0"
    which "1"

node-libs-browser@^2.0.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77"
  integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==
  dependencies:
    assert "^1.1.1"
    browserify-zlib "^0.2.0"
    buffer "^4.3.0"
    console-browserify "^1.1.0"
    constants-browserify "^1.0.0"
    crypto-browserify "^3.11.0"
    domain-browser "^1.1.1"
    events "^3.0.0"
    https-browserify "^1.0.0"
    os-browserify "^0.3.0"
    path-browserify "0.0.0"
    process "^0.11.10"
    punycode "^1.2.4"
    querystring-es3 "^0.2.0"
    readable-stream "^2.3.3"
    stream-browserify "^2.0.1"
    stream-http "^2.7.2"
    string_decoder "^1.0.0"
    timers-browserify "^2.0.4"
    tty-browserify "0.0.0"
    url "^0.11.0"
    util "^0.11.0"
    vm-browserify "0.0.4"

node-pre-gyp@^0.12.0:
  version "0.12.0"
  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149"
  integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==
  dependencies:
    detect-libc "^1.0.2"
    mkdirp "^0.5.1"
    needle "^2.2.1"
    nopt "^4.0.1"
    npm-packlist "^1.1.6"
    npmlog "^4.0.2"
    rc "^1.2.7"
    rimraf "^2.6.1"
    semver "^5.3.0"
    tar "^4"

node-sass@^3.4.2:
  version "3.13.1"
  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-3.13.1.tgz#7240fbbff2396304b4223527ed3020589c004fc2"
  integrity sha1-ckD7v/I5YwS0IjUn7TAgWJwAT8I=
  dependencies:
    async-foreach "^0.1.3"
    chalk "^1.1.1"
    cross-spawn "^3.0.0"
    gaze "^1.0.0"
    get-stdin "^4.0.1"
    glob "^7.0.3"
    in-publish "^2.0.0"
    lodash.assign "^4.2.0"
    lodash.clonedeep "^4.3.2"
    meow "^3.7.0"
    mkdirp "^0.5.1"
    nan "^2.3.2"
    node-gyp "^3.3.1"
    npmlog "^4.0.0"
    request "^2.61.0"
    sass-graph "^2.1.1"

"nopt@2 || 3":
  version "3.0.6"
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
  integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
  dependencies:
    abbrev "1"

nopt@^4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
  integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
  dependencies:
    abbrev "1"
    osenv "^0.1.4"

normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
  dependencies:
    hosted-git-info "^2.1.4"
    resolve "^1.10.0"
    semver "2 || 3 || 4 || 5"
    validate-npm-package-license "^3.0.1"

normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
  integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
  dependencies:
    remove-trailing-separator "^1.0.1"

normalize-path@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==

normalize-range@^0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
  integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=

normalize-url@^1.0.0:
  version "1.9.1"
  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
  integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
  dependencies:
    object-assign "^4.0.1"
    prepend-http "^1.0.0"
    query-string "^4.1.0"
    sort-keys "^1.0.0"

npm-bundled@^1.0.1:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
  integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==

npm-packlist@^1.1.6:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc"
  integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==
  dependencies:
    ignore-walk "^3.0.1"
    npm-bundled "^1.0.1"

npm-run-path@^2.0.0:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
  integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
  dependencies:
    path-key "^2.0.0"

"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
  version "4.1.2"
  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
  integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
  dependencies:
    are-we-there-yet "~1.1.2"
    console-control-strings "~1.1.0"
    gauge "~2.7.3"
    set-blocking "~2.0.0"

num2fraction@^1.2.2:
  version "1.2.2"
  resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
  integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=

number-is-nan@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
  integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=

nwsapi@^2.0.7:
  version "2.1.4"
  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f"
  integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==

oauth-sign@~0.9.0:
  version "0.9.0"
  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
  integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==

object-assign@4.X, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
  version "4.1.1"
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=

object-assign@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
  integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=

object-copy@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
  dependencies:
    copy-descriptor "^0.1.0"
    define-property "^0.2.5"
    kind-of "^3.0.3"

object-hash@^1.1.4:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
  integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==

object-visit@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
  dependencies:
    isobject "^3.0.0"

object.defaults@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
  integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
  dependencies:
    array-each "^1.0.1"
    array-slice "^1.0.0"
    for-own "^1.0.0"
    isobject "^3.0.0"

object.map@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
  integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
  dependencies:
    for-own "^1.0.0"
    make-iterator "^1.0.0"

object.omit@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
  integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=
  dependencies:
    for-own "^0.1.4"
    is-extendable "^0.1.1"

object.pick@^1.2.0, object.pick@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
  dependencies:
    isobject "^3.0.1"

observable-to-promise@^0.5.0:
  version "0.5.0"
  resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-0.5.0.tgz#c828f0f0dc47e9f86af8a4977c5d55076ce7a91f"
  integrity sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=
  dependencies:
    is-observable "^0.2.0"
    symbol-observable "^1.0.4"

once@^1.3.0, once@^1.3.1, once@^1.4.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
  dependencies:
    wrappy "1"

once@~1.3.0:
  version "1.3.3"
  resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
  integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=
  dependencies:
    wrappy "1"

onetime@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
  integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
  dependencies:
    mimic-fn "^1.0.0"

opener@~1.4.0:
  version "1.4.3"
  resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8"
  integrity sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=

optimist@0.6.x, optimist@^0.6.1:
  version "0.6.1"
  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
  integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY=
  dependencies:
    minimist "~0.0.1"
    wordwrap "~0.0.2"

option-chain@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/option-chain/-/option-chain-1.0.0.tgz#938d73bd4e1783f948d34023644ada23669e30f2"
  integrity sha1-k41zvU4Xg/lI00AjZEraI2aeMPI=

optionator@^0.8.1, optionator@^0.8.2:
  version "0.8.2"
  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
  integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
  dependencies:
    deep-is "~0.1.3"
    fast-levenshtein "~2.0.4"
    levn "~0.3.0"
    prelude-ls "~1.1.2"
    type-check "~0.3.2"
    wordwrap "~1.0.0"

orchestrator@^0.3.0:
  version "0.3.8"
  resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
  integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=
  dependencies:
    end-of-stream "~0.1.5"
    sequencify "~0.0.7"
    stream-consume "~0.1.0"

ordered-read-streams@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
  integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=

os-browserify@^0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
  integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=

os-homedir@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
  integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=

os-locale@^1.4.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
  integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
  dependencies:
    lcid "^1.0.0"

os-locale@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
  integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
  dependencies:
    execa "^0.7.0"
    lcid "^1.0.0"
    mem "^1.1.0"

os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=

osenv@0, osenv@^0.1.4:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
  integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
  dependencies:
    os-homedir "^1.0.0"
    os-tmpdir "^1.0.0"

output-file-sync@^1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
  integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=
  dependencies:
    graceful-fs "^4.1.4"
    mkdirp "^0.5.1"
    object-assign "^4.1.0"

p-finally@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
  integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=

p-limit@^1.1.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
  integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
  dependencies:
    p-try "^1.0.0"

p-locate@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
  integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
  dependencies:
    p-limit "^1.1.0"

p-map@^1.1.1:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
  integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==

p-try@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
  integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=

package-hash@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-1.2.0.tgz#003e56cd57b736a6ed6114cc2b81542672770e44"
  integrity sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=
  dependencies:
    md5-hex "^1.3.0"

package-hash@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-2.0.0.tgz#78ae326c89e05a4d813b68601977af05c00d2a0d"
  integrity sha1-eK4ybIngWk2BO2hgGXevBcANKg0=
  dependencies:
    graceful-fs "^4.1.11"
    lodash.flattendeep "^4.4.0"
    md5-hex "^2.0.0"
    release-zalgo "^1.0.0"

package-json@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
  integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
  dependencies:
    got "^6.7.1"
    registry-auth-token "^3.0.1"
    registry-url "^3.0.3"
    semver "^5.1.0"

pako@~1.0.5:
  version "1.0.10"
  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
  integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==

parallel-transform@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
  integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=
  dependencies:
    cyclist "~0.2.2"
    inherits "^2.0.3"
    readable-stream "^2.1.5"

parse-asn1@^5.0.0:
  version "5.1.4"
  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc"
  integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==
  dependencies:
    asn1.js "^4.0.0"
    browserify-aes "^1.0.0"
    create-hash "^1.1.0"
    evp_bytestokey "^1.0.0"
    pbkdf2 "^3.0.3"
    safe-buffer "^5.1.1"

parse-filepath@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
  integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
  dependencies:
    is-absolute "^1.0.0"
    map-cache "^0.2.0"
    path-root "^0.1.1"

parse-glob@^3.0.4:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
  integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw=
  dependencies:
    glob-base "^0.3.0"
    is-dotfile "^1.0.0"
    is-extglob "^1.0.0"
    is-glob "^2.0.0"

parse-json@^2.2.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
  integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
  dependencies:
    error-ex "^1.2.0"

parse-json@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
  integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
  dependencies:
    error-ex "^1.3.1"
    json-parse-better-errors "^1.0.1"

parse-ms@^0.1.0:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-0.1.2.tgz#dd3fa25ed6c2efc7bdde12ad9b46c163aa29224e"
  integrity sha1-3T+iXtbC78e93hKtm0bBY6opIk4=

parse-ms@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d"
  integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=

parse-node-version@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
  integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==

parse-passwd@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
  integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=

parse5@4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
  integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==

pascalcase@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=

path-browserify@0.0.0:
  version "0.0.0"
  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
  integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=

path-dirname@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
  integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=

path-exists@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
  integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
  dependencies:
    pinkie-promise "^2.0.0"

path-exists@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
  integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=

path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=

path-is-inside@^1.0.1, path-is-inside@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
  integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=

path-key@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
  integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=

path-parse@^1.0.6:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
  integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==

path-root-regex@^0.1.0:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
  integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=

path-root@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
  integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
  dependencies:
    path-root-regex "^0.1.0"

path-type@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
  integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
  dependencies:
    graceful-fs "^4.1.2"
    pify "^2.0.0"
    pinkie-promise "^2.0.0"

path-type@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
  integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
  dependencies:
    pify "^2.0.0"

pbkdf2@^3.0.3:
  version "3.0.17"
  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
  integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
  dependencies:
    create-hash "^1.1.2"
    create-hmac "^1.1.4"
    ripemd160 "^2.0.1"
    safe-buffer "^5.0.1"
    sha.js "^2.4.8"

performance-now@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
  integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=

pify@^2.0.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
  integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=

pify@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
  integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=

pinkie-promise@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670"
  integrity sha1-0dpn9UglY7t89X8oauKCLs+/NnA=
  dependencies:
    pinkie "^1.0.0"

pinkie-promise@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
  integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
  dependencies:
    pinkie "^2.0.0"

pinkie@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-1.0.0.tgz#5a47f28ba1015d0201bda7bf0f358e47bec8c7e4"
  integrity sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=

pinkie@^2.0.0:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=

pkg-conf@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058"
  integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=
  dependencies:
    find-up "^2.0.0"
    load-json-file "^4.0.0"

pkg-dir@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
  integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q=
  dependencies:
    find-up "^1.0.0"

pkg-dir@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
  integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
  dependencies:
    find-up "^2.1.0"

plugin-error@1.0.1, plugin-error@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
  integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==
  dependencies:
    ansi-colors "^1.0.1"
    arr-diff "^4.0.0"
    arr-union "^3.1.0"
    extend-shallow "^3.0.2"

plugin-error@^0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace"
  integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=
  dependencies:
    ansi-cyan "^0.1.1"
    ansi-red "^0.1.1"
    arr-diff "^1.0.1"
    arr-union "^2.0.1"
    extend-shallow "^1.1.2"

plur@^2.0.0:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a"
  integrity sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=
  dependencies:
    irregular-plurals "^1.0.0"

pluralize@^7.0.0:
  version "7.0.0"
  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
  integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==

pn@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
  integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==

portfinder@^1.0.13:
  version "1.0.20"
  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
  integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==
  dependencies:
    async "^1.5.2"
    debug "^2.2.0"
    mkdirp "0.5.x"

posix-character-classes@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=

postcss-value-parser@^3.2.3:
  version "3.3.1"
  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
  integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==

postcss@^6.0.1, postcss@^6.0.17:
  version "6.0.23"
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
  integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
  dependencies:
    chalk "^2.4.1"
    source-map "^0.6.1"
    supports-color "^5.4.0"

prelude-ls@~1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
  integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=

prepend-http@^1.0.0, prepend-http@^1.0.1:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
  integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=

preserve@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
  integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=

pretty-hrtime@^1.0.0:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
  integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=

pretty-ms@^0.2.1:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6"
  integrity sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=
  dependencies:
    parse-ms "^0.1.0"

pretty-ms@^3.0.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25"
  integrity sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q==
  dependencies:
    parse-ms "^1.0.0"

private@^0.1.6, private@^0.1.8:
  version "0.1.8"
  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
  integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==

process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
  integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==

process@^0.11.10:
  version "0.11.10"
  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=

progress@^2.0.0:
  version "2.0.3"
  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==

promise-inflight@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
  integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=

prr@~1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
  integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=

pseudomap@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
  integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=

psl@^1.1.24, psl@^1.1.28:
  version "1.1.31"
  resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
  integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==

public-encrypt@^4.0.0:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
  integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
  dependencies:
    bn.js "^4.1.0"
    browserify-rsa "^4.0.0"
    create-hash "^1.1.0"
    parse-asn1 "^5.0.0"
    randombytes "^2.0.1"
    safe-buffer "^5.1.2"

pump@^2.0.0, pump@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
  integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
  dependencies:
    end-of-stream "^1.1.0"
    once "^1.3.1"

pumpify@^1.3.3:
  version "1.5.1"
  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
  integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
  dependencies:
    duplexify "^3.6.0"
    inherits "^2.0.3"
    pump "^2.0.0"

punycode@1.3.2:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
  integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=

punycode@^1.2.4, punycode@^1.4.1:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
  integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=

punycode@^2.1.0, punycode@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==

qs@~2.3.3:
  version "2.3.3"
  resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404"
  integrity sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=

qs@~6.5.2:
  version "6.5.2"
  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
  integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==

query-string@^4.1.0:
  version "4.3.4"
  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
  integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
  dependencies:
    object-assign "^4.1.0"
    strict-uri-encode "^1.0.0"

querystring-es3@^0.2.0:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
  integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=

querystring@0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
  integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=

randomatic@^3.0.0:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
  integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
  dependencies:
    is-number "^4.0.0"
    kind-of "^6.0.0"
    math-random "^1.0.1"

randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
  dependencies:
    safe-buffer "^5.1.0"

randomfill@^1.0.3:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
  integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
  dependencies:
    randombytes "^2.0.5"
    safe-buffer "^5.1.0"

rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
  version "1.2.8"
  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
  integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
  dependencies:
    deep-extend "^0.6.0"
    ini "~1.3.0"
    minimist "^1.2.0"
    strip-json-comments "~2.0.1"

read-pkg-up@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
  integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
  dependencies:
    find-up "^1.0.0"
    read-pkg "^1.0.0"

read-pkg-up@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
  integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
  dependencies:
    find-up "^2.0.0"
    read-pkg "^2.0.0"

read-pkg@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
  integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
  dependencies:
    load-json-file "^1.0.0"
    normalize-package-data "^2.3.2"
    path-type "^1.0.0"

read-pkg@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
  integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
  dependencies:
    load-json-file "^2.0.0"
    normalize-package-data "^2.3.2"
    path-type "^2.0.0"

"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
  version "2.3.6"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
  integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.3"
    isarray "~1.0.0"
    process-nextick-args "~2.0.0"
    safe-buffer "~5.1.1"
    string_decoder "~1.1.1"
    util-deprecate "~1.0.1"

"readable-stream@>=1.0.33-1 <1.1.0-0":
  version "1.0.34"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
  integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.1"
    isarray "0.0.1"
    string_decoder "~0.10.x"

readable-stream@~1.1.9:
  version "1.1.14"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
  integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.1"
    isarray "0.0.1"
    string_decoder "~0.10.x"

readdirp@^2.0.0, readdirp@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
  integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
  dependencies:
    graceful-fs "^4.1.11"
    micromatch "^3.1.10"
    readable-stream "^2.0.2"

rechoir@^0.6.2:
  version "0.6.2"
  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
  integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
  dependencies:
    resolve "^1.1.6"

redent@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
  integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
  dependencies:
    indent-string "^2.1.0"
    strip-indent "^1.0.1"

regenerate@^1.2.1:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
  integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==

regenerator-runtime@^0.10.5:
  version "0.10.5"
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
  integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=

regenerator-runtime@^0.11.0:
  version "0.11.1"
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
  integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==

regenerator-transform@^0.10.0:
  version "0.10.1"
  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
  integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
  dependencies:
    babel-runtime "^6.18.0"
    babel-types "^6.19.0"
    private "^0.1.6"

regex-cache@^0.4.2:
  version "0.4.4"
  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
  integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==
  dependencies:
    is-equal-shallow "^0.1.3"

regex-not@^1.0.0, regex-not@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
  dependencies:
    extend-shallow "^3.0.2"
    safe-regex "^1.1.0"

regexpp@^1.0.1:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
  integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==

regexpu-core@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
  integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
  dependencies:
    regenerate "^1.2.1"
    regjsgen "^0.2.0"
    regjsparser "^0.1.4"

registry-auth-token@^3.0.1:
  version "3.4.0"
  resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
  integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
  dependencies:
    rc "^1.1.6"
    safe-buffer "^5.0.1"

registry-url@^3.0.3:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
  integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
  dependencies:
    rc "^1.0.1"

regjsgen@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
  integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=

regjsparser@^0.1.4:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
  integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
  dependencies:
    jsesc "~0.5.0"

release-zalgo@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730"
  integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=
  dependencies:
    es6-error "^4.0.1"

remove-trailing-separator@^1.0.1:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
  integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=

repeat-element@^1.1.2:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
  integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==

repeat-string@^1.5.2, repeat-string@^1.6.1:
  version "1.6.1"
  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
  integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=

repeating@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
  integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
  dependencies:
    is-finite "^1.0.0"

replace-ext@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
  integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=

replace-ext@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
  integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=

replacestream@^4.0.3:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36"
  integrity sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==
  dependencies:
    escape-string-regexp "^1.0.3"
    object-assign "^4.0.1"
    readable-stream "^2.0.2"

request-promise-core@1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
  integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
  dependencies:
    lodash "^4.17.11"

request-promise-native@^1.0.5:
  version "1.0.7"
  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59"
  integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==
  dependencies:
    request-promise-core "1.1.2"
    stealthy-require "^1.1.1"
    tough-cookie "^2.3.3"

request@^2.61.0, request@^2.87.0:
  version "2.88.0"
  resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
  integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
  dependencies:
    aws-sign2 "~0.7.0"
    aws4 "^1.8.0"
    caseless "~0.12.0"
    combined-stream "~1.0.6"
    extend "~3.0.2"
    forever-agent "~0.6.1"
    form-data "~2.3.2"
    har-validator "~5.1.0"
    http-signature "~1.2.0"
    is-typedarray "~1.0.0"
    isstream "~0.1.2"
    json-stringify-safe "~5.0.1"
    mime-types "~2.1.19"
    oauth-sign "~0.9.0"
    performance-now "^2.1.0"
    qs "~6.5.2"
    safe-buffer "^5.1.2"
    tough-cookie "~2.4.3"
    tunnel-agent "^0.6.0"
    uuid "^3.3.2"

require-directory@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
  integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=

require-main-filename@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
  integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=

require-precompiled@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa"
  integrity sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo=

require-uncached@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
  integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
  dependencies:
    caller-path "^0.1.0"
    resolve-from "^1.0.0"

requires-port@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
  integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=

requizzle@^0.2.2:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.2.tgz#df991c0cffbbbdde721504c1455f68f53f7c7bd1"
  integrity sha512-oJ6y7JcUJkblRGhMByGNcszeLgU0qDxNKFCiUZR1XyzHyVsev+Mxb1tyygxLd1ORsKee1SA5BInFdUwY64GE/A==
  dependencies:
    lodash "^4.17.11"

resolve-cwd@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
  integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
  dependencies:
    resolve-from "^3.0.0"

resolve-dir@^1.0.0, resolve-dir@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
  integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
  dependencies:
    expand-tilde "^2.0.0"
    global-modules "^1.0.0"

resolve-from@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
  integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=

resolve-from@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
  integrity sha1-six699nWiBvItuZTM17rywoYh0g=

resolve-url@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=

resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0:
  version "1.10.1"
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18"
  integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==
  dependencies:
    path-parse "^1.0.6"

restore-cursor@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
  integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
  dependencies:
    onetime "^2.0.0"
    signal-exit "^3.0.2"

ret@~0.1.10:
  version "0.1.15"
  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==

right-align@^0.1.1:
  version "0.1.3"
  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
  integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8=
  dependencies:
    align-text "^0.1.1"

rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2:
  version "2.6.3"
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
  dependencies:
    glob "^7.1.3"

ripemd160@^2.0.0, ripemd160@^2.0.1:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
  integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
  dependencies:
    hash-base "^3.0.0"
    inherits "^2.0.1"

run-async@^2.2.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
  integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
  dependencies:
    is-promise "^2.1.0"

run-queue@^1.0.0, run-queue@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
  integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
  dependencies:
    aproba "^1.1.1"

run-sequence@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-2.2.1.tgz#1ce643da36fd8c7ea7e1a9329da33fc2b8898495"
  integrity sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==
  dependencies:
    chalk "^1.1.3"
    fancy-log "^1.3.2"
    plugin-error "^0.1.2"

rx-lite-aggregates@^4.0.8:
  version "4.0.8"
  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
  integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=
  dependencies:
    rx-lite "*"

rx-lite@*, rx-lite@^4.0.8:
  version "4.0.8"
  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
  integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=

safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
  version "5.1.2"
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==

safe-regex@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
  dependencies:
    ret "~0.1.10"

"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==

sass-graph@^2.1.1:
  version "2.2.4"
  resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
  integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=
  dependencies:
    glob "^7.0.0"
    lodash "^4.0.0"
    scss-tokenizer "^0.2.3"
    yargs "^7.0.0"

sax@^1.2.4:
  version "1.2.4"
  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==

schema-utils@^0.4.5:
  version "0.4.7"
  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
  integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
  dependencies:
    ajv "^6.1.0"
    ajv-keywords "^3.1.0"

scss-tokenizer@^0.2.3:
  version "0.2.3"
  resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
  integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
  dependencies:
    js-base64 "^2.1.8"
    source-map "^0.4.2"

semver-diff@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
  integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
  dependencies:
    semver "^5.0.3"

"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0:
  version "5.7.0"
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
  integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==

semver@^4.1.0:
  version "4.3.6"
  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
  integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=

semver@~5.3.0:
  version "5.3.0"
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
  integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=

sequencify@~0.0.7:
  version "0.0.7"
  resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
  integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=

serialize-javascript@^1.4.0:
  version "1.7.0"
  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65"
  integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==

set-blocking@^2.0.0, set-blocking@~2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=

set-value@^0.4.3:
  version "0.4.3"
  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
  integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
  dependencies:
    extend-shallow "^2.0.1"
    is-extendable "^0.1.1"
    is-plain-object "^2.0.1"
    to-object-path "^0.3.0"

set-value@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
  integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==
  dependencies:
    extend-shallow "^2.0.1"
    is-extendable "^0.1.1"
    is-plain-object "^2.0.3"
    split-string "^3.0.1"

setimmediate@^1.0.4:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
  integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=

sha.js@^2.4.0, sha.js@^2.4.8:
  version "2.4.11"
  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
  integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
  dependencies:
    inherits "^2.0.1"
    safe-buffer "^5.0.1"

shebang-command@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
  integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
  dependencies:
    shebang-regex "^1.0.0"

shebang-regex@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
  integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=

sigmund@~1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
  integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=

signal-exit@^3.0.0, signal-exit@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
  integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=

simple-swizzle@^0.2.2:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
  integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
  dependencies:
    is-arrayish "^0.3.1"

slash@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
  integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=

slice-ansi@1.0.0, slice-ansi@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
  integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==
  dependencies:
    is-fullwidth-code-point "^2.0.0"

slide@^1.1.5:
  version "1.1.6"
  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
  integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=

snapdragon-node@^2.0.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
  dependencies:
    define-property "^1.0.0"
    isobject "^3.0.0"
    snapdragon-util "^3.0.1"

snapdragon-util@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
  dependencies:
    kind-of "^3.2.0"

snapdragon@^0.8.1:
  version "0.8.2"
  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
  dependencies:
    base "^0.11.1"
    debug "^2.2.0"
    define-property "^0.2.5"
    extend-shallow "^2.0.1"
    map-cache "^0.2.2"
    source-map "^0.5.6"
    source-map-resolve "^0.5.0"
    use "^3.1.0"

sort-keys@^1.0.0:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
  integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
  dependencies:
    is-plain-obj "^1.0.0"

sort-keys@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
  integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=
  dependencies:
    is-plain-obj "^1.0.0"

source-list-map@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
  integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==

source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
  version "0.5.2"
  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
  integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
  dependencies:
    atob "^2.1.1"
    decode-uri-component "^0.2.0"
    resolve-url "^0.2.1"
    source-map-url "^0.4.0"
    urix "^0.1.0"

source-map-support@^0.4.0, source-map-support@^0.4.15:
  version "0.4.18"
  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
  integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
  dependencies:
    source-map "^0.5.6"

source-map-url@^0.4.0:
  version "0.4.0"
  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
  integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=

source-map@^0.4.2:
  version "0.4.4"
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
  integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
  dependencies:
    amdefine ">=0.0.4"

source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
  version "0.5.7"
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=

source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
  version "0.6.1"
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==

sparkles@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
  integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==

spdx-correct@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
  integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
  dependencies:
    spdx-expression-parse "^3.0.0"
    spdx-license-ids "^3.0.0"

spdx-exceptions@^2.1.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
  integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==

spdx-expression-parse@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
  integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
  dependencies:
    spdx-exceptions "^2.1.0"
    spdx-license-ids "^3.0.0"

spdx-license-ids@^3.0.0:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1"
  integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==

split-string@^3.0.1, split-string@^3.0.2:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
  dependencies:
    extend-shallow "^3.0.0"

sprintf-js@~1.0.2:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=

sshpk@^1.7.0:
  version "1.16.1"
  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
  integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
  dependencies:
    asn1 "~0.2.3"
    assert-plus "^1.0.0"
    bcrypt-pbkdf "^1.0.0"
    dashdash "^1.12.0"
    ecc-jsbn "~0.1.1"
    getpass "^0.1.1"
    jsbn "~0.1.0"
    safer-buffer "^2.0.2"
    tweetnacl "~0.14.0"

ssri@^5.2.4:
  version "5.3.0"
  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
  integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==
  dependencies:
    safe-buffer "^5.1.1"

stack-utils@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
  integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==

static-extend@^0.1.1:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
  dependencies:
    define-property "^0.2.5"
    object-copy "^0.1.0"

stealthy-require@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
  integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=

stream-browserify@^2.0.1:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
  integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
  dependencies:
    inherits "~2.0.1"
    readable-stream "^2.0.2"

stream-consume@~0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48"
  integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==

stream-each@^1.1.0:
  version "1.2.3"
  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
  integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
  dependencies:
    end-of-stream "^1.1.0"
    stream-shift "^1.0.0"

stream-http@^2.7.2:
  version "2.8.3"
  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
  integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
  dependencies:
    builtin-status-codes "^3.0.0"
    inherits "^2.0.1"
    readable-stream "^2.3.6"
    to-arraybuffer "^1.0.0"
    xtend "^4.0.0"

stream-shift@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
  integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=

strict-uri-encode@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
  integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=

string-width@^1.0.1, string-width@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
  integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
  dependencies:
    code-point-at "^1.0.0"
    is-fullwidth-code-point "^1.0.0"
    strip-ansi "^3.0.0"

"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
  integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
  dependencies:
    is-fullwidth-code-point "^2.0.0"
    strip-ansi "^4.0.0"

string_decoder@^1.0.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
  integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
  dependencies:
    safe-buffer "~5.1.0"

string_decoder@~0.10.x:
  version "0.10.31"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
  integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=

string_decoder@~1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
  dependencies:
    safe-buffer "~5.1.0"

strip-ansi@^3.0.0, strip-ansi@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
  dependencies:
    ansi-regex "^2.0.0"

strip-ansi@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
  integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
  dependencies:
    ansi-regex "^3.0.0"

strip-ansi@~0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
  integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=

strip-bom-buf@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572"
  integrity sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=
  dependencies:
    is-utf8 "^0.2.1"

strip-bom-string@1.X:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
  integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=

strip-bom@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
  integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=
  dependencies:
    first-chunk-stream "^1.0.0"
    is-utf8 "^0.2.0"

strip-bom@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
  integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
  dependencies:
    is-utf8 "^0.2.0"

strip-bom@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
  integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=

strip-eof@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
  integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=

strip-indent@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
  integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
  dependencies:
    get-stdin "^4.0.1"

strip-json-comments@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
  integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==

strip-json-comments@~2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
  integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=

strip-outer@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
  integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
  dependencies:
    escape-string-regexp "^1.0.2"

strip-url-auth@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/strip-url-auth/-/strip-url-auth-1.0.1.tgz#22b0fa3a41385b33be3f331551bbb837fa0cd7ae"
  integrity sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=

supports-color@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=

supports-color@^4.0.0, supports-color@^4.2.1:
  version "4.5.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
  integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=
  dependencies:
    has-flag "^2.0.0"

supports-color@^5.3.0, supports-color@^5.4.0:
  version "5.5.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
  dependencies:
    has-flag "^3.0.0"

symbol-observable@^0.2.2:
  version "0.2.4"
  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
  integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=

symbol-observable@^1.0.4:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
  integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==

symbol-tree@^3.2.2:
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
  integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=

table@4.0.2:
  version "4.0.2"
  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
  integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==
  dependencies:
    ajv "^5.2.3"
    ajv-keywords "^2.1.0"
    chalk "^2.1.0"
    lodash "^4.17.4"
    slice-ansi "1.0.0"
    string-width "^2.1.1"

taffydb@2.6.2:
  version "2.6.2"
  resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268"
  integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=

tapable@^0.2.7:
  version "0.2.9"
  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8"
  integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==

tar@^2.0.0:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
  integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=
  dependencies:
    block-stream "*"
    fstream "^1.0.2"
    inherits "2"

tar@^4:
  version "4.4.8"
  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
  integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
  dependencies:
    chownr "^1.1.1"
    fs-minipass "^1.2.5"
    minipass "^2.3.4"
    minizlib "^1.1.1"
    mkdirp "^0.5.0"
    safe-buffer "^5.1.2"
    yallist "^3.0.2"

term-size@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
  integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
  dependencies:
    execa "^0.7.0"

text-table@^0.2.0, text-table@~0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
  integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=

through2@2.0.3:
  version "2.0.3"
  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
  integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=
  dependencies:
    readable-stream "^2.1.5"
    xtend "~4.0.1"

through2@2.X, through2@^2.0.0, through2@^2.0.3:
  version "2.0.5"
  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
  dependencies:
    readable-stream "~2.3.6"
    xtend "~4.0.1"

through2@^0.6.1, through2@^0.6.3:
  version "0.6.5"
  resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
  integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=
  dependencies:
    readable-stream ">=1.0.33-1 <1.1.0-0"
    xtend ">=4.0.0 <4.1.0-0"

through@^2.3.6, through@^2.3.8:
  version "2.3.8"
  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
  integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=

tildify@^1.0.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
  integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=
  dependencies:
    os-homedir "^1.0.0"

time-require@^0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/time-require/-/time-require-0.1.2.tgz#f9e12cb370fc2605e11404582ba54ef5ca2b2d98"
  integrity sha1-+eEss3D8JgXhFARYK6VO9corLZg=
  dependencies:
    chalk "^0.4.0"
    date-time "^0.1.1"
    pretty-ms "^0.2.1"
    text-table "^0.2.0"

time-stamp@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
  integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=

time-zone@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d"
  integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=

timed-out@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
  integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=

timers-browserify@^2.0.4:
  version "2.0.10"
  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
  integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==
  dependencies:
    setimmediate "^1.0.4"

timers-ext@^0.1.5:
  version "0.1.7"
  resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
  integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
  dependencies:
    es5-ext "~0.10.46"
    next-tick "1"

tmp@^0.0.33:
  version "0.0.33"
  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
  integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
  dependencies:
    os-tmpdir "~1.0.2"

to-arraybuffer@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
  integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=

to-fast-properties@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
  integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=

to-fast-properties@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
  integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=

to-object-path@^0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
  dependencies:
    kind-of "^3.0.2"

to-regex-range@^2.1.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
  dependencies:
    is-number "^3.0.0"
    repeat-string "^1.6.1"

to-regex@^3.0.1, to-regex@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
  dependencies:
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    regex-not "^1.0.2"
    safe-regex "^1.1.0"

tough-cookie@^2.3.3, tough-cookie@^2.3.4:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
  integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
  dependencies:
    psl "^1.1.28"
    punycode "^2.1.1"

tough-cookie@~2.4.3:
  version "2.4.3"
  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
  integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
  dependencies:
    psl "^1.1.24"
    punycode "^1.4.1"

tr46@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
  integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
  dependencies:
    punycode "^2.1.0"

trim-newlines@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
  integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=

trim-off-newlines@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
  integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM=

trim-repeated@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
  integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE=
  dependencies:
    escape-string-regexp "^1.0.2"

trim-right@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
  integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=

tty-browserify@0.0.0:
  version "0.0.0"
  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
  integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=

tunnel-agent@^0.6.0:
  version "0.6.0"
  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
  integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
  dependencies:
    safe-buffer "^5.0.1"

tweetnacl@^0.14.3, tweetnacl@~0.14.0:
  version "0.14.5"
  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
  integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=

type-check@~0.3.2:
  version "0.3.2"
  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
  integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
  dependencies:
    prelude-ls "~1.1.2"

typedarray@^0.0.6:
  version "0.0.6"
  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
  integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=

uc.micro@^1.0.1, uc.micro@^1.0.5:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
  integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==

uglify-es@^3.3.4:
  version "3.3.9"
  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
  integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==
  dependencies:
    commander "~2.13.0"
    source-map "~0.6.1"

uglify-js@^2.8.29:
  version "2.8.29"
  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
  integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0=
  dependencies:
    source-map "~0.5.1"
    yargs "~3.10.0"
  optionalDependencies:
    uglify-to-browserify "~1.0.0"

uglify-js@^3.1.4:
  version "3.5.11"
  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.11.tgz#833442c0aa29b3a7d34344c7c63adaa3f3504f6a"
  integrity sha512-izPJg8RsSyqxbdnqX36ExpbH3K7tDBsAU/VfNv89VkMFy3z39zFjunQGsSHOlGlyIfGLGprGeosgQno3bo2/Kg==
  dependencies:
    commander "~2.20.0"
    source-map "~0.6.1"

uglify-to-browserify@~1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
  integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc=

uglifyjs-webpack-plugin@^0.4.6:
  version "0.4.6"
  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
  integrity sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=
  dependencies:
    source-map "^0.5.6"
    uglify-js "^2.8.29"
    webpack-sources "^1.0.1"

uglifyjs-webpack-plugin@^1.0.1:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de"
  integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==
  dependencies:
    cacache "^10.0.4"
    find-cache-dir "^1.0.0"
    schema-utils "^0.4.5"
    serialize-javascript "^1.4.0"
    source-map "^0.6.1"
    uglify-es "^3.3.4"
    webpack-sources "^1.1.0"
    worker-farm "^1.5.2"

uid2@0.0.3:
  version "0.0.3"
  resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
  integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=

unc-path-regex@^0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
  integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=

underscore@~1.9.1:
  version "1.9.1"
  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
  integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==

union-value@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
  integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=
  dependencies:
    arr-union "^3.1.0"
    get-value "^2.0.6"
    is-extendable "^0.1.1"
    set-value "^0.4.3"

union@~0.4.3:
  version "0.4.6"
  resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0"
  integrity sha1-GY+9rrolTniLDvy2MLwR8kopWeA=
  dependencies:
    qs "~2.3.3"

unique-filename@^1.1.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
  integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
  dependencies:
    unique-slug "^2.0.0"

unique-slug@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6"
  integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==
  dependencies:
    imurmurhash "^0.1.4"

unique-stream@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
  integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=

unique-string@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
  integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
  dependencies:
    crypto-random-string "^1.0.0"

unique-temp-dir@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385"
  integrity sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=
  dependencies:
    mkdirp "^0.5.1"
    os-tmpdir "^1.0.1"
    uid2 "0.0.3"

universalify@^0.1.0:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
  integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==

unset-value@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
  dependencies:
    has-value "^0.3.1"
    isobject "^3.0.0"

unzip-response@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
  integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=

upath@^1.1.1:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
  integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==

update-notifier@^2.3.0:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
  integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
  dependencies:
    boxen "^1.2.1"
    chalk "^2.0.1"
    configstore "^3.0.0"
    import-lazy "^2.1.0"
    is-ci "^1.0.10"
    is-installed-globally "^0.1.0"
    is-npm "^1.0.0"
    latest-version "^3.0.0"
    semver-diff "^2.0.0"
    xdg-basedir "^3.0.0"

uri-js@^4.2.2:
  version "4.2.2"
  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
  integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
  dependencies:
    punycode "^2.1.0"

urix@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=

url-join@^2.0.2:
  version "2.0.5"
  resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728"
  integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=

url-parse-lax@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
  integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
  dependencies:
    prepend-http "^1.0.1"

url@^0.11.0:
  version "0.11.0"
  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
  integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
  dependencies:
    punycode "1.3.2"
    querystring "0.2.0"

use@^3.1.0:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==

user-home@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
  integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA=

util-deprecate@~1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=

util@0.10.3:
  version "0.10.3"
  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
  integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
  dependencies:
    inherits "2.0.1"

util@^0.11.0:
  version "0.11.1"
  resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
  integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
  dependencies:
    inherits "2.0.3"

uuid@^3.3.2:
  version "3.3.2"
  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
  integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==

v8flags@^2.0.2, v8flags@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
  integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=
  dependencies:
    user-home "^1.1.1"

validate-npm-package-license@^3.0.1:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
  dependencies:
    spdx-correct "^3.0.0"
    spdx-expression-parse "^3.0.0"

verror@1.10.0:
  version "1.10.0"
  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
  integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
  dependencies:
    assert-plus "^1.0.0"
    core-util-is "1.0.2"
    extsprintf "^1.2.0"

vinyl-fs@^0.3.0:
  version "0.3.14"
  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
  integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=
  dependencies:
    defaults "^1.0.0"
    glob-stream "^3.1.5"
    glob-watcher "^0.0.6"
    graceful-fs "^3.0.0"
    mkdirp "^0.5.0"
    strip-bom "^1.0.0"
    through2 "^0.6.1"
    vinyl "^0.4.0"

vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
  integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=
  dependencies:
    source-map "^0.5.1"

vinyl@^0.4.0:
  version "0.4.6"
  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
  integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc=
  dependencies:
    clone "^0.2.0"
    clone-stats "^0.0.1"

vinyl@^0.5.0:
  version "0.5.3"
  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
  integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=
  dependencies:
    clone "^1.0.0"
    clone-stats "^0.0.1"
    replace-ext "0.0.1"

vinyl@^2.1.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86"
  integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==
  dependencies:
    clone "^2.1.1"
    clone-buffer "^1.0.0"
    clone-stats "^1.0.0"
    cloneable-readable "^1.0.0"
    remove-trailing-separator "^1.0.1"
    replace-ext "^1.0.0"

vm-browserify@0.0.4:
  version "0.0.4"
  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
  integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=
  dependencies:
    indexof "0.0.1"

w3c-hr-time@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
  integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=
  dependencies:
    browser-process-hrtime "^0.1.2"

watchpack@^1.4.0:
  version "1.6.0"
  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
  integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
  dependencies:
    chokidar "^2.0.2"
    graceful-fs "^4.1.2"
    neo-async "^2.5.0"

webidl-conversions@^4.0.2:
  version "4.0.2"
  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
  integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==

webpack-sources@^1.0.1, webpack-sources@^1.1.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
  integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==
  dependencies:
    source-list-map "^2.0.0"
    source-map "~0.6.1"

webpack-stream@^4.0.0:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-4.0.3.tgz#96399fd7911b94c264bfc59e356738a89b5ca136"
  integrity sha512-Tx7ks7Of/JiPz7/tUM4WqSg4OcXF4m4OzNSaEzNA1TNXQaiTHIjiKqUoL79wGXbFt2q1IP8VG5DcEdaxifY5Ew==
  dependencies:
    fancy-log "^1.3.2"
    lodash.clone "^4.3.2"
    lodash.some "^4.2.2"
    memory-fs "^0.4.1"
    plugin-error "^1.0.1"
    supports-color "^5.3.0"
    through "^2.3.8"
    vinyl "^2.1.0"
    webpack "^3.4.1"

webpack@^3.4.1, webpack@^3.8.1:
  version "3.12.0"
  resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74"
  integrity sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==
  dependencies:
    acorn "^5.0.0"
    acorn-dynamic-import "^2.0.0"
    ajv "^6.1.0"
    ajv-keywords "^3.1.0"
    async "^2.1.2"
    enhanced-resolve "^3.4.0"
    escope "^3.6.0"
    interpret "^1.0.0"
    json-loader "^0.5.4"
    json5 "^0.5.1"
    loader-runner "^2.3.0"
    loader-utils "^1.1.0"
    memory-fs "~0.4.1"
    mkdirp "~0.5.0"
    node-libs-browser "^2.0.0"
    source-map "^0.5.3"
    supports-color "^4.2.1"
    tapable "^0.2.7"
    uglifyjs-webpack-plugin "^0.4.6"
    watchpack "^1.4.0"
    webpack-sources "^1.0.1"
    yargs "^8.0.2"

well-known-symbols@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-1.0.0.tgz#73c78ae81a7726a8fa598e2880801c8b16225518"
  integrity sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg=

whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
  integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
  dependencies:
    iconv-lite "0.4.24"

whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
  integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==

whatwg-url@^6.4.1:
  version "6.5.0"
  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
  integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==
  dependencies:
    lodash.sortby "^4.7.0"
    tr46 "^1.0.1"
    webidl-conversions "^4.0.2"

whatwg-url@^7.0.0:
  version "7.0.0"
  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd"
  integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==
  dependencies:
    lodash.sortby "^4.7.0"
    tr46 "^1.0.1"
    webidl-conversions "^4.0.2"

which-module@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
  integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=

which-module@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
  integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=

which@1, which@^1.2.14, which@^1.2.9:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
  dependencies:
    isexe "^2.0.0"

wide-align@^1.1.0:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
  integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
  dependencies:
    string-width "^1.0.2 || 2"

widest-line@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
  integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
  dependencies:
    string-width "^2.1.1"

window-size@0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
  integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=

wordwrap@0.0.2:
  version "0.0.2"
  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
  integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=

wordwrap@~0.0.2:
  version "0.0.3"
  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
  integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=

wordwrap@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
  integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=

worker-farm@^1.5.2:
  version "1.7.0"
  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
  integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
  dependencies:
    errno "~0.1.7"

wrap-ansi@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
  integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
  dependencies:
    string-width "^1.0.1"
    strip-ansi "^3.0.1"

wrappy@1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=

write-file-atomic@^1.1.4:
  version "1.3.4"
  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
  integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=
  dependencies:
    graceful-fs "^4.1.11"
    imurmurhash "^0.1.4"
    slide "^1.1.5"

write-file-atomic@^2.0.0:
  version "2.4.2"
  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9"
  integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==
  dependencies:
    graceful-fs "^4.1.11"
    imurmurhash "^0.1.4"
    signal-exit "^3.0.2"

write-json-file@^2.2.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
  integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=
  dependencies:
    detect-indent "^5.0.0"
    graceful-fs "^4.1.2"
    make-dir "^1.0.0"
    pify "^3.0.0"
    sort-keys "^2.0.0"
    write-file-atomic "^2.0.0"

write-pkg@^3.1.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21"
  integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==
  dependencies:
    sort-keys "^2.0.0"
    write-json-file "^2.2.0"

write@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
  integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
  dependencies:
    mkdirp "^0.5.1"

ws@^5.2.0:
  version "5.2.2"
  resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
  integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==
  dependencies:
    async-limiter "~1.0.0"

xdg-basedir@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
  integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=

xml-name-validator@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
  integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==

xmlcreate@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.1.tgz#2ec38bd7b708d213fd1a90e2431c4af9c09f6a52"
  integrity sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==

"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
  integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=

y18n@^3.2.1:
  version "3.2.1"
  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
  integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=

y18n@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
  integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==

yallist@^2.1.2:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
  integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=

yallist@^3.0.0, yallist@^3.0.2:
  version "3.0.3"
  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
  integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==

yargs-parser@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
  integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
  dependencies:
    camelcase "^3.0.0"

yargs-parser@^7.0.0:
  version "7.0.0"
  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
  integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k=
  dependencies:
    camelcase "^4.1.0"

yargs@^7.0.0:
  version "7.1.0"
  resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
  integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
  dependencies:
    camelcase "^3.0.0"
    cliui "^3.2.0"
    decamelize "^1.1.1"
    get-caller-file "^1.0.1"
    os-locale "^1.4.0"
    read-pkg-up "^1.0.1"
    require-directory "^2.1.1"
    require-main-filename "^1.0.1"
    set-blocking "^2.0.0"
    string-width "^1.0.2"
    which-module "^1.0.0"
    y18n "^3.2.1"
    yargs-parser "^5.0.0"

yargs@^8.0.2:
  version "8.0.2"
  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
  integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A=
  dependencies:
    camelcase "^4.1.0"
    cliui "^3.2.0"
    decamelize "^1.1.1"
    get-caller-file "^1.0.1"
    os-locale "^2.0.0"
    read-pkg-up "^2.0.0"
    require-directory "^2.1.1"
    require-main-filename "^1.0.1"
    set-blocking "^2.0.0"
    string-width "^2.0.0"
    which-module "^2.0.0"
    y18n "^3.2.1"
    yargs-parser "^7.0.0"

yargs@~3.10.0:
  version "3.10.0"
  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
  integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=
  dependencies:
    camelcase "^1.0.2"
    cliui "^2.1.0"
    decamelize "^1.0.0"
    window-size "0.1.0"

Added public/closed/ff_ddt_120_kit_loop_falling_chord_Gmin.wav.

cannot compute difference between binary files

Added public/closed/ff_ddt_synth_terrier_Gmin.wav.

cannot compute difference between binary files

Added public/closed/pdh_120_bass_tease_Dmin.wav.

cannot compute difference between binary files

Added public/closed/pdh_120_drum_loop_hidden_hat.wav.

cannot compute difference between binary files

Added public/closed/pdh_hat_one_shot_opeen_synthetic_flint.wav.

cannot compute difference between binary files

Added public/closed/pdh_kick_one_shot_synthetic_low_alex.wav.

cannot compute difference between binary files

Added public/closed/pdh_snare_one_shot_synthetic_beef.wav.

cannot compute difference between binary files

Added public/closed/pdh_snare_one_shot_synthetic_crunch.wav.

cannot compute difference between binary files

Added public/components/bitrhythm.tag.











































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389

<bitrhythm>

<div>
    <vstack id="header-playback">
        <hstack>
            <div class="ml-2">
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addDial}>+ Dial</button>
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addNumber}>+ Number</button>
                <!-- <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addSample}>+ Sample File</button> -->
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addSampleURL}>+ Sample URL</button>
            </div>

            <div class="ml-2" >
                <label for="tempo-value">Tempo / Ticks</label><br>
                <input type="text" id="tempo-value" value={state.tempo} style="width: 150px" onkeyup={ editTempo }/>
                <input type="text"  class="mt-2" id="tick-value" value={state.ticks} style="width: 150px" onkeyup={editTicks}/>
            </div>
            <div class="ml-2" style="min-width: 250px;">
                <label for="duration">Bars / Ticks / Seconds</label><br>
                <div id="duration" ></div>
            </div>
        </hstack>

        <div class="mt-2 ml-2" >
            <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1"  onclick={play}>Play</button>
            <button type="button" class="btn btn-primary ml-2" onclick={save}>Save</button>
            <button type="button" class="btn btn-primary ml-2" onclick={reset}>Reset</button>
            <button type="button" class="btn btn-primary ml-2" onclick={reload}>Window Reload</button>

            <input class="ml-1" name="edit-mode" id="edit-mode" type="checkbox"/>
            <label for="edit-mode">Edit</label>
            <input class="ml-1" name="load-mode" id="load-mode" type="checkbox"/>
            <label for="load-mode">Execute Transition</label>
        </div>

        <hstack>
            <div each={ key, index in state.samples} >
                <div if={ state.samples && state.samples[index] }>
                    <sample  setsample={setSample} rmsample={rmSample} samples={state.samples} ti={index + 1}></sample>
                </div>
            </div>
        </hstack>

        <hstack>
            <div each={ key, index in state.dials}>
                <dial rmdial={rmDial}  v={state.dials[index]} ti={index + 1}></dial>
            </div>
        </hstack>

        <hstack>
            <div each={ key, index in state.numbers}>
                <number rmnumber={rmNumber} v={state.numbers[index]} ti={index + 1}></number>
            </div>
        </hstack>

    </vstack>

    <div id="error" class="p-2" style="color: yellow !important; height: 32px; font-size: 12px;"></div>
    <div id="canvas-container" style="position: relative;">
        <div id="p5" style="position: absolute; width: 100%; background: black"></div>
        <canvas id="visual" style="position: absolute; width: 100%; background: black;"></canvas>
        <div id="code" style="position: absolute;"></div>
    </div>
    
</div>

<style>
:host {
    margin-top: 4vh;
}
</style>

<script>
var oldCode = "";
var oldPatterns = [];

// var audio = new Audio();
// audio.loop = true;
const actx = Tone.context;
const dest = actx.createMediaStreamDestination();
const recorder = new MediaRecorder(dest.stream);
let chunks = [];
var sampleURL = "";
var sam;
var loop;
this.props = opts;

this.state = {
    mem: {},
    dials: [],
    numbers: [],
    samples: [],
    tempo: 120,
    ticks: 16,
}

async function copyTextToClipboard(text) {
    try { await navigator.clipboard.writeText(text); }
    catch(err) {
        alert('Error in copying text: ', err);
    }
}

shouldUpdate(data, nextOpts) {
    return true;
}

this.on('mount', function() {
    var self = this;
    $("#load-mode").click();
    editor = CodeMirror(document.getElementById("code"), {
        mode: "null",
        spellcheck: false,
        autocorrect: false,
        scrollbarStyle: "null",
        lineWrapping: false,
        lineNumbers: false,
        styleActiveLine: false,
        matchBrackets: false,
        value: `// track_no, pattern, current_bit, samples, sample and Tone are available as globals`
    });

    editor.setSize(null, window.innerHeight - document.getElementById("header-playback").clientHeight - 160);

    if (this.props.song) {
        const lib = window.JsonUrl('lzma');
        lib.decompress(this.props.song).then(data => {
            var sample_names = data["sample_names"];
            var dial_count = data["dial_count"];
            var numbers_count = data["numbers_count"];
            delete data["sample_names"];
            delete data["dial_count"];
            delete data["numbers_count"];
            this.state.tempo = data.tempo;
            this.state.ticks = data.ticks;
            this.state.code = data.code;
            sample_names.map(function (url) {
                self.addURL(url);
            });
            for (var i = 0; i < dial_count; i++) {
                this.state.dials.push({});
            }
            for (var i = 0; i < numbers_count; i++) {
                this.state.numbers.push({});
            }
            editor.setValue(this.state.code);
            this.update();
            riot.mount('');
        })
    }


});


pattern_clean(p) {
    return window.pattern_clean(p);
}

save() {
    this.state.code = editor.getValue();
    var text = {
        tempo: this.state.tempo,
        dial_count: this.state.dials.length,
        numbers_count: this.state.numbers.length,
        sample_names: this.state.samples.map(function (item) {return item["__url"]}),
        ticks: 16,
        code: this.state.code,
    };
    const lib = window.JsonUrl('lzma');
	lib.compress(text).then(encodedData => {
        var link = "/song/" + encodedData;
        window.open(link, "_blank");
    });
}

reload() {
    window.location.replace( "//" + window.location.host)
}

reset() {

    Tone.Master.mute = true;
    if (loop) {
        loop.stop();
        loop.cancel();
        loop.dispose();
        Tone.Master.mute = false;
    }
    document.getElementById('tempo-value').disabled = false;
    document.getElementById('tick-value').disabled = false;
    editor.setValue("");

    this.state = {
        mem: {},
        dials: [],
        samples: [],
        tempo: 120,
        ticks: 16,
    }

    this.update();
    riot.mount('bitrhythm', {
        song: this.props.song
    })


}

editTempo(e) {
    this.update({
        tempo: e.target.value
    })
}

editTicks(e) {
    this.update({
        ticks: e.target.value
    })
}



async play() {
    var self = this;
    var cellx = window.cellx.cellx;

    await Tone.start();
    Tone.Transport.start();
    Tone.Transport.bpm.value = this.state.tempo;
    Tone.Transport.swing.value = 0;

    var transition = function () {
    }

    var always = function () {
    }


    var render_loop = function () {
    }

    var animation = function () {
        render_loop();
        window.requestAnimationFrame(animation)
    }

    Tone.Master.mute = false;
    document.getElementById('tempo-value').disabled = true;
    document.getElementById('tick-value').disabled = true;

    var mem = self.state.mem;
    var handlers = {};
    var count = -1;

    var text = editor.getValue();
    editor.on("change", function () {
            text = editor.getValue();
    });

    var patterns = [ cellx("0000") ]; // need this for first eval

    var bars = 0;
    var tick = 0;

    loop = new Tone.ToneEvent((time, chord) => {
        count = count + 1;
        tick = (count % this.state.ticks);
        if (tick === 0) ++bars;

        $("#duration").html("" + bars + "." + tick + " / " + count + " / " + window.roundTo(Tone.Transport.seconds, 2));

        for (var i = 0; i < patterns.length; i++) {
            var samples = this.state.samples;
            var dials = self.state.dials;
            var numbers = self.state.numbers;

            if (document.getElementById('edit-mode').checked) {
                p = oldPatterns[i];
            } else {
                var p = patterns[i];
                oldPatterns[i] = p;
            }
            if (p && p.length !== 0) {
                var track_no = i + 1;
                var pattern = pattern_clean(p());
                var isHit = (pattern.split('')[tick] == "1") ? true : false;

                try {
                    if (document.getElementById('edit-mode').checked) {
                        eval(oldCode);
                    } else {
                        eval(text);
                        if (document.getElementById('load-mode').checked) {
                            document.getElementById('load-mode').checked = false;
                            transition();
                        }
                        oldCode = text;
                    }
                    $("#error").html("");
                } catch (ex) {
                    $("#error").html(ex);
                    eval(oldCode);
                }
            }
        }
    }, []);
    loop.loop = true;
    loop.loopEnd = this.state.ticks + "n";
    loop.start();

   window.requestAnimationFrame(animation)

}


start() {
    recorder.start();
}

stop() {
    recorder.stop();
}

addDial() {
    this.state.dials.push({});
    this.update();
}

addNumber() {
    this.state.numbers.push({});
    this.update();
}

addURL(value) {
    var self = this;
    this.state.samples.push({"__name": value});
    var sam;
    sam = new Tone.Sampler({
        urls:  {
            "C3": value,
        }
    });
    sam["__name"] = value;
    sam["__url"] = value;
    self.setSample(sam, self.state.samples.length - 1);
}

addSampleURL() {
    var self = this;
    alertify.prompt( 'Enter Sample URL', '', ''
        , function(evt, value) {
            self.addURL(value);
        }
        , function() {
            alertify.error('Cancel')
        });
}

addSample() {
    this.state.samples.push({});
    this.update();
}

rmSample(index) {
   this.state.samples.splice(index, 1);
   this.update();
}

rmDial(index) {
   this.state.dials.splice(index, 1);
   this.update();
}

rmNumber(index) {
   this.state.numbers.splice(index, 1);
   this.update();
}

setSample(e, i) {
    this.state.samples[i] = e;
    this.update();
}

</script>

</bitrhythm>

Added public/components/dial.tag.





































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

<dial>
    <vbox>
        <div class="ml-4">
            <hstack>
                <div id={"knob" + props.ti}></div>
                <div class="mt-1" style="height: 22px" id={"knob-value" + props.ti}></div>
                <span class="cursor-pointer" id={"sample" + this.props.ti} onclick={remove(this.props.ti -1)}>(x)</span>
            </hstack>
        </div>
    </vbox>

    <script>

this.props = opts;

remove(index) {
    return () => {
        this.props.rmdial(index);
    }
}

this.on("mount", () => {
    if (opts.v) {

        Nexus.colors.accent = "#000000"
        Nexus.colors.fill = "#ffffff"

        var cell = window.cellx.cellx(0.5);
        var dial = new Nexus.Dial('#knob' + this.props.ti, {
            'size': [45, 45],
            'value': 0.5
        });
        cell.onChange(evt => {
            if (evt.data.prevValue !== evt.data.value) {
                dial.value = evt.data.value;
            }
        });
        dial.colorize("accent","#000")
        dial.on('change', (val) => {
            val = window.roundTo(val, 4);
            $('#knob-value' + this.props.ti).html(val);
            cell(val);
        });
       this.props.v["cell"] = cell;
    }
});
   </script>

</dial>

Added public/components/number.tag.



























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

<number>
    <vbox>
        <div  class="ml-4">
            <hstack>
            <div id={"number" + props.ti}></div>
            <div class="mt-1" style="height: 22px" id={"number-value" + props.ti}></div>
            <span class="cursor-pointer" onclick={remove(this.props.ti -1)}>(x)</span>
        </hstack>
        </div>
    </vbox>

    <script>

this.props = opts;

    remove(index) {
        return () => {
            this.props.rmnumber(index);
        }
    }

this.on("mount", () => {
    if (opts.v) {

        Nexus.colors.accent = "#000000"
        Nexus.colors.fill = "#ffffff"

        var cell = window.cellx.cellx(0)
        var number = new Nexus.Number('#number' + this.props.ti, {
            'value': 0,
            'step': 0.01
        });
        cell.onChange(evt => {
            if (evt.data.prevValue !== evt.data.value) {
                number.value = evt.data.value;
            }
        });

        this.props.v["v"] = cell;
    }
});
   </script>

</number>

Added public/components/piano.riot.





















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<piano>

    <div class="row">
        <virtual each={ key, index in state.keys }>
            <div class="col-sm-1">
                <div class="dial" data-index={index}></div>
                <button onclick={() => play(key.freq, index)}>
                    {key.freq}
                </button>
            </div>
        </virtual>
    </div>
    <div class='piano-container'></div>
    <form>
        <fieldset>
            <legend><input type="radio" name="option-type" value="octave" checked> Octave Size</legend>
            <input type="number" min=1 max=9 id="octaveChanger" value="1">
        </fieldset>
        <fieldset class="range">
            <input type="number" min=0 max=10 id="startOctave" value="3" disabled>
            <span>to</span>
            <input type="number" min=0 max=10 id="endOctave" value="5" disabled>
        </fieldset>
        <fieldset>
            <legend>Locale</legend>
            <label>Show names: <input type="checkbox" id="names"></label>
        </fieldset>
    </form>

    <style>
        button {
            background-color: #fcfcf9;
            border: 2px solid #222;
            color: #222;
            height: 16vh;
            width: 8vw;
            border-radius: 8px;
            margin: -2px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            font-size: 16px;
            font-weight: bold;
            font-size: small;
        }

        button:active {
            background-color: #f4f4e8;
        }
    </style>


    <script>


        var osc = new Tone.Oscillator({
            "type": "sine",
            "frequency": 440,
        });

        var env = new Tone.AmplitudeEnvelope({
            "curve": "linear",
            "attack": 0.2,
            "decay": 0.1,
            "sustain": 0,
            "release": 0
        }).toMaster();


        env.attackCurve = "linear";
        env.decayCurve = "linear";
        env.releaseCurve = "linear";

        osc.connect(env).start();


        export default {

            onBeforeMount(props, state) {
                // initial state
                this.state = {
                    keys: [{ "freq": 440 }, { "freq": 880 }],
                }
            },

            onMounted() {
                var dials = containerDiv.getElementsByClassName('dial');
                dials.map((e) => {

                    console.log(e)

                    var index = $(e).data('index');

                    var dial = new Nexus.Dial(e, {
                        'size': [200, 200],
                        'min': 0,
                        'max': 880,
                        'step': 1,
                        'value': 440
                    });

                    dial.off('change');

                    dial.on('change', (v) => {
                        console.log(v);
                        this.state["keys"][index]["freq"] = v;
                    })

                })
            },


            play(freq, index) {
                osc.frequency.value = freq;
                env.triggerAttackRelease();
            }
        }


    </script>

</piano>

Added public/components/rhythmroll.riot.





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

<rhythmroll>

    <div class="row mt-3">
            <div class="col-md-3">
                <input type="text" class="form form-control mt-1" id="pattern-{props.ti}" onkeyup={updateCall} value={props.v} style="width:250px"/>
            </div>
            <div class="col-md-5 mt-2">
                <div style="display:inline; border: 1px dotted black;font-size: 16px; padding: 2px"
                    each={ (key, index) in pattern_clean($("#pattern-" + scope.props.ti).val()).split('')}
                    class="roll-{index + 1} roll">
                    {key}
                </div>
            </div>
    </div>

    <script>

        export default {
            updateCall() {
                this.update();
            },
            onBeforeMount(props, state) {
                // initial state
           },
           pattern_clean(p) {
                return window.pattern_clean(p)
           }
        }
   </script>

</rhythmroll>
 

Added public/components/rhythmroll.tag.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

<rhythmroll>

    <div class="row mt-3">
            <div class="col-md-3">
                <input type="text" class="form form-control mt-1" id="pattern-{props.ti}" onkeyup={updateCall} value={props.v} style="width:250px"/>
            </div>
            <div class="col-md-5 mt-2">
                <div style="display:inline; border: 1px dotted black;font-size: 16px; padding: 2px"
                    each={ key, index in pattern_clean($("#pattern-" + props.ti).val()).split('')}
                    class="roll-{index + 1} roll">
                    {key}
                </div>
            </div>
    </div>

    <script>
        this.props = opts;

            updateCall() {
                this.update();
            }
   </script>

</rhythmroll>

Added public/components/sample.tag.







































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

<sample>
    <vbox class="ml-2">
        <vstack class="ml-2">
        <!-- <input type="file" id={"sample-file" + this.props.ti} style="width: 120px;"/> -->
        <div style="max-width: 120px;text-overflow: ellipsis; white-space: nowrap;overflow: hidden;">
            <span>{ getLast(this.props.ti -1)} </span>
            <span class="cursor-pointer" id={"sample" + this.props.ti} onclick={remove(this.props.ti -1)}>(x)</span>
        </div>
        </vstack>
    </vbox>

    <script>
    this.props = opts;

    remove(index) {
        return () => {
            this.props.rmsample(index);
        }
    }

    getLast (index) {
        if (this.props.samples && this.props.samples[index] && this.props.samples[index]["__name"]) {
            var e = this.props.samples[index]["__name"];
            var elems = e.split("/");
            var name = elems[elems.length - 1];
            return name;
        } else {
            console.log(this.props)
            return "";
        }
    }


    this.on("mount", function () {

        var self = this;
/*
        var sample_file = $("#sample-file" + this.props.ti).get(0);
        var sam;

        sample_file.addEventListener('change', (event) => {
            var file = event.srcElement.files[0];
            var a = new Audio();
            a.onloadedmetadata = (e) => {
                sam = new Tone.Sampler({
                    urls:  {
                        "C3": URL.createObjectURL(file),
                    },
                    onload: () => {
                        this.update();
                        sam.triggerAttackRelease("C3", 0.5);
                    }
                });

                sam["__name"] = file.name;
                sam["__url"] = "";
                // riot doesn't allow camelcase ?
                self.props.setsample(sam, self.props.ti - 1);
            }
            a.src = URL.createObjectURL(file);
        });
        */

    });
   </script>
</sample>

Added public/examples/Korg-01W-16Ft-Piano-C1.wav.

cannot compute difference between binary files

Added public/examples/basic.json.



>
1
{"keys":[{"freq":"523.25","top":0,"left":0,"width":"64px","height":"64px","color":"#ffffff","textColor":"#000000"},{"freq":"554.37","top":0,"left":0,"width":"64px","height":"64px","color":"#000000","textColor":"#FFFFFF"},{"freq":"587.33","top":0,"left":0,"width":"64px","height":"64px","color":"#FFFFFF","textColor":"#000000"},{"freq":"622.25","top":0,"left":0,"width":"64px","height":"64px","color":"#000000","textColor":"#FFFFFF"},{"freq":"659.25","top":0,"left":0,"width":"64px","height":"64px","color":"#FFFFFF","textColor":"#000000"},{"freq":"698.46","top":0,"left":0,"width":"64px","height":"64px","color":"#FFFFFF","textColor":"#000000"},{"freq":"739.99","top":0,"left":0,"width":"64px","height":"64px","color":"#000000","textColor":"#FFFFFF"},{"freq":"783.99","top":0,"left":0,"width":"64px","height":"64px","color":"#FFFFFF","textColor":"#000000"},{"freq":"830.61","top":0,"left":0,"width":"64px","height":"64px","color":"#000000","textColor":"#FFFFFF"},{"freq":"880","top":0,"left":0,"width":"64px","height":"64px","color":"#FFFFFF","textColor":"#000000"},{"freq":"932.33","top":0,"left":0,"width":"64px","height":"64px","color":"#000000","textColor":"#FFFFFF"},{"freq":"987.77","top":0,"left":0,"width":"64px","height":"64px","color":"#FFFFFF","textColor":"#000000"},{"freq":"1046.5","top":0,"left":0,"width":"64px","height":"64px","color":"#FFFFFF","textColor":"#000000"}]}

Added public/json-url-master/LICENSE.











































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MIT License

Copyright (c) Facebook, Inc. and its affiliates.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Added public/json-url-master/README.md.

































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# json-url

[![npm downloads][downloads-image]][downloads-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url]

Generate URL-safe representations of some arbtirary JSON data in as small a space as possible that can be shared in a bookmark / link.

Although designed to work in Node, a standalone client-side library is provided that can be used directly on the browser.

## Usage

### Compress

```
	var codec = require('json-url')('lzw');
	var obj = { one: 1, two: 2, three: [1,2,3], four: 'red pineapples' };
	codec.compress(obj).then(result => console.log(result));
	/* Result: woTCo29uZQHCo3R3bwLCpXRocmVlwpMBAgPCpGZvdXLCrsSOZCBwacSDYXBwbGVz */
```

### Decompress

```
	var codec = require('json-url')('lzma');
	codec.decompress(someCompressedString).then(json => { /* operate on json */ })
```

### Stats

```
	var codec = require('json-url')('lzstring');
	codec.stats(obj).then(
		({ rawencoded, compressedencoded, compression }) => {
			console.log(`Raw URI-encoded JSON string length: ${rawencoded}`);
			console.log(`Compressed URI-encoded JSON string length: ${compressedencoded}`);
			console.log(`Compression ratio (raw / compressed): ${compression}`);
		}
	);
```

### Standalone Browser Bundle

```
<script type="text/javascript" src="/dist/browser/json-url.js"></script>
<script>
	const lib = JsonUrl('lzma'); // JsonUrl is added to the window object
	lib.compress(parsed).then(output => { result.value = output; });
</script>
```

To see it in action, download the source code and run `npm run example`, or simply visit [this link](http://jsbin.com/cayuhox).

* The browser bundle is generated using Webpack and consists of multiple chunks, with the main chunk entry point located at `dist/browser/json-url.js`. Chunks must be located in the same folder as the main module itself.
* I've tried my best to reduce the bundle sizes, but the module (at least the entry) is still surprisingly large on the browser (56kb minified, 20kb gzipped). Most of it is due to the buffer.js shim, and partly due to the regenerator-runtime - I may revisit this later to try and improve efficiency.

## Usage Notes

* Although not all algorithms are asynchronous, all functions return Promises to ensure compatibility.
* Instantiate an instance with appropriate compression codec before using.
* Valid codecs:
	* lzw
	* lzma
	* lzstring - runs lzstring against a stringified JSON instead of using MessagePack on JSON
	* pack - this just uses MessagePack and converts the binary buffer into a Base64 URL-safe representation, without any other compression

## Motivation

Typically when you want to shorten a long URL with large amounts of data parameters, the approach is to generate a "short URL" where compression is achieved by using a third-party service which stores the true URL and redirects the user (e.g. bit.ly or goo.gl).

However, if you want to:

* share bookmarks with virtually unlimited combinations of state and/or
* want to avoid the third-party dependency

you would encode the data structure (typically JSON) in your URL, but this often results in very large URLs.

This approach differs by removing that third-party dependency and encodes it using common compression algorithms such as LZW or LZMA.

Note: It is arguable that a custom dictionary / domain specific encoding would ultimately provide better compression, but here we want to
* avoid maintaining such a dictionary and/or
* retain cross-application compatibility (otherwise you need a shared dictionary)

## Approach

I explored several options, the most popular one being [MessagePack][1]. However, I noticed that it did not give the best possible compression as compared to [LZMA][2] and [LZW][3].

At first I tried to apply the binary compression directly on a stringified JSON, then I realised that packing it first resulted in better compression.

For small JS objects, LZW largely outperformed LZMA, but for the most part you'd probably be looking to compress large JSON data rather than small amounts (otherwise a simple stringify + base64 is sufficient). You can choose to use whatever codec suits you best.

In addition, there is now support for [LZSTRING][5], although the URI encoding still uses urlsafe-base64 because LZSTRING still uses unsafe characters via their `compressToURIEncodedString` method - notably the [`+` character][6]

Finally, I went with [urlsafe-base64][4] to encode it in a URL-friendly format.

## TODO

Find a way to improve bundle sizes for browser usage.

[1]: http://msgpack.org/index.html
[2]: https://www.npmjs.com/package/lzma
[3]: https://www.npmjs.com/package/node-lzw
[4]: https://www.npmjs.com/package/urlsafe-base64
[5]: http://pieroxy.net/blog/pages/lz-string/index.html
[6]: https://github.com/pieroxy/lz-string/blob/master/libs/lz-string.js#L15

[downloads-image]: https://img.shields.io/npm/dm/json-url.svg?style=flat-square
[downloads-url]: https://www.npmjs.com/package/json-url
[travis-image]: https://travis-ci.org/masotime/json-url.svg?bxeranch=master
[travis-url]: https://travis-ci.org/masotime/json-url
[daviddm-image]: https://david-dm.org/masotime/json-url.svg?theme=shields.io
[daviddm-url]: https://david-dm.org/masotime/json-url
[coverage-image]: https://coveralls.io/repos/github/masotime/json-url/badge.svg?branch=master
[coverage-url]: https://coveralls.io/github/masotime/json-url?branch=master

Added public/json-url-master/dist/browser/json-url-lzstring.js.



>
1
(window.webpackJsonpJsonUrl=window.webpackJsonpJsonUrl||[]).push([[0],{16:function(o,r,n){var e,t=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",t={},s={compressToBase64:function(o){if(null==o)return"";var r=s._compress(o,6,(function(o){return n.charAt(o)}));switch(r.length%4){default:case 0:return r;case 1:return r+"===";case 2:return r+"==";case 3:return r+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:s._decompress(r.length,32,(function(e){return o(n,r.charAt(e))}))},compressToUTF16:function(o){return null==o?"":s._compress(o,15,(function(o){return r(o+32)}))+" "},decompressFromUTF16:function(o){return null==o?"":""==o?null:s._decompress(o.length,16384,(function(r){return o.charCodeAt(r)-32}))},compressToUint8Array:function(o){for(var r=s.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;e<t;e++){var i=r.charCodeAt(e);n[2*e]=i>>>8,n[2*e+1]=i%256}return n},decompressFromUint8Array:function(o){if(null==o)return s.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;e<t;e++)n[e]=256*o[2*e]+o[2*e+1];var i=[];return n.forEach((function(o){i.push(r(o))})),s.decompress(i.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":s._compress(o,6,(function(o){return e.charAt(o)}))},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),s._decompress(r.length,32,(function(n){return o(e,r.charAt(n))})))},compress:function(o){return s._compress(o,16,(function(o){return r(o)}))},_compress:function(o,r,n){if(null==o)return"";var e,t,s,i={},p={},c="",a="",u="",l=2,f=3,h=2,d=[],m=0,w=0;for(s=0;s<o.length;s+=1)if(c=o.charAt(s),Object.prototype.hasOwnProperty.call(i,c)||(i[c]=f++,p[c]=!0),a=u+c,Object.prototype.hasOwnProperty.call(i,a))u=a;else{if(Object.prototype.hasOwnProperty.call(p,u)){if(u.charCodeAt(0)<256){for(e=0;e<h;e++)m<<=1,w==r-1?(w=0,d.push(n(m)),m=0):w++;for(t=u.charCodeAt(0),e=0;e<8;e++)m=m<<1|1&t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t>>=1}else{for(t=1,e=0;e<h;e++)m=m<<1|t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t=0;for(t=u.charCodeAt(0),e=0;e<16;e++)m=m<<1|1&t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t>>=1}0==--l&&(l=Math.pow(2,h),h++),delete p[u]}else for(t=i[u],e=0;e<h;e++)m=m<<1|1&t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t>>=1;0==--l&&(l=Math.pow(2,h),h++),i[a]=f++,u=String(c)}if(""!==u){if(Object.prototype.hasOwnProperty.call(p,u)){if(u.charCodeAt(0)<256){for(e=0;e<h;e++)m<<=1,w==r-1?(w=0,d.push(n(m)),m=0):w++;for(t=u.charCodeAt(0),e=0;e<8;e++)m=m<<1|1&t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t>>=1}else{for(t=1,e=0;e<h;e++)m=m<<1|t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t=0;for(t=u.charCodeAt(0),e=0;e<16;e++)m=m<<1|1&t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t>>=1}0==--l&&(l=Math.pow(2,h),h++),delete p[u]}else for(t=i[u],e=0;e<h;e++)m=m<<1|1&t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t>>=1;0==--l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;e<h;e++)m=m<<1|1&t,w==r-1?(w=0,d.push(n(m)),m=0):w++,t>>=1;for(;;){if(m<<=1,w==r-1){d.push(n(m));break}w++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:s._decompress(o.length,32768,(function(r){return o.charCodeAt(r)}))},_decompress:function(o,n,e){var t,s,i,p,c,a,u,l=[],f=4,h=4,d=3,m="",w=[],v={val:e(0),position:n,index:1};for(t=0;t<3;t+=1)l[t]=t;for(i=0,c=Math.pow(2,2),a=1;a!=c;)p=v.val&v.position,v.position>>=1,0==v.position&&(v.position=n,v.val=e(v.index++)),i|=(p>0?1:0)*a,a<<=1;switch(i){case 0:for(i=0,c=Math.pow(2,8),a=1;a!=c;)p=v.val&v.position,v.position>>=1,0==v.position&&(v.position=n,v.val=e(v.index++)),i|=(p>0?1:0)*a,a<<=1;u=r(i);break;case 1:for(i=0,c=Math.pow(2,16),a=1;a!=c;)p=v.val&v.position,v.position>>=1,0==v.position&&(v.position=n,v.val=e(v.index++)),i|=(p>0?1:0)*a,a<<=1;u=r(i);break;case 2:return""}for(l[3]=u,s=u,w.push(u);;){if(v.index>o)return"";for(i=0,c=Math.pow(2,d),a=1;a!=c;)p=v.val&v.position,v.position>>=1,0==v.position&&(v.position=n,v.val=e(v.index++)),i|=(p>0?1:0)*a,a<<=1;switch(u=i){case 0:for(i=0,c=Math.pow(2,8),a=1;a!=c;)p=v.val&v.position,v.position>>=1,0==v.position&&(v.position=n,v.val=e(v.index++)),i|=(p>0?1:0)*a,a<<=1;l[h++]=r(i),u=h-1,f--;break;case 1:for(i=0,c=Math.pow(2,16),a=1;a!=c;)p=v.val&v.position,v.position>>=1,0==v.position&&(v.position=n,v.val=e(v.index++)),i|=(p>0?1:0)*a,a<<=1;l[h++]=r(i),u=h-1,f--;break;case 2:return w.join("")}if(0==f&&(f=Math.pow(2,d),d++),l[u])m=l[u];else{if(u!==h)return null;m=s+s.charAt(0)}w.push(m),l[h++]=s+m.charAt(0),s=m,0==--f&&(f=Math.pow(2,d),d++)}}};return s}();void 0!==(e=function(){return t}.call(r,n,r,o))&&(o.exports=e)}}]);

Added public/json-url-master/dist/browser/json-url-lzw.js.



>
1
(window.webpackJsonpJsonUrl=window.webpackJsonpJsonUrl||[]).push([[1],{17:function(n,o,t){"use strict";var r=function(){};r.prototype.encode=function(n){for(var o,t={},r=(n+"").split(""),e=[],p=r[0],h=256,c=1;c<r.length;c++)null!=t[p+(o=r[c])]?p+=o:(e.push(p.length>1?t[p]:p.charCodeAt(0)),t[p+o]=h,h++,p=o);e.push(p.length>1?t[p]:p.charCodeAt(0));for(c=0;c<e.length;c++)e[c]=String.fromCharCode(e[c]);return e.join("")},r.prototype.decode=function(n){for(var o,t={},r=(n+"").split(""),e=r[0],p=e,h=[e],c=256,s=1;s<r.length;s++){var i=r[s].charCodeAt(0);o=i<256?r[s]:t[i]?t[i]:p+e,h.push(o),e=o.charAt(0),t[c]=p+e,c++,p=o}return h.join("")},n.exports=new r}}]);

Added public/json-url-master/dist/browser/json-url-msgpack.js.



>
1
(window.webpackJsonpJsonUrl=window.webpackJsonpJsonUrl||[]).push([[3],{49:function(n,o){},51:function(n,o){},55:function(n,o){},57:function(n,o){}}]);

Added public/json-url-master/dist/browser/json-url-safe64.js.



>
1
(window.webpackJsonpJsonUrl=window.webpackJsonpJsonUrl||[]).push([[4],{14:function(e,n,r){e.exports=r(61)},61:function(e,n,r){(function(e){n.version="1.0.0",n.encode=function(e){return e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},n.decode=function(n){return n=(n+=Array(5-n.length%4).join("=")).replace(/\-/g,"+").replace(/\_/g,"/"),new e(n,"base64")},n.validate=function(e){return/^[A-Za-z0-9\-_]+$/.test(e)}}).call(this,r(3).Buffer)}}]);

Added public/json-url-master/dist/browser/json-url-single.js.

cannot compute difference between binary files

Added public/json-url-master/dist/browser/json-url-vendors~lzma.js.

cannot compute difference between binary files

Added public/json-url-master/dist/browser/json-url-vendors~msgpack.js.

cannot compute difference between binary files

Added public/json-url-master/dist/browser/json-url.js.

cannot compute difference between binary files

Added public/json-url-master/dist/node/browser-index.js.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _index = _interopRequireDefault(require("./index.js"));

/* global document */
// adapted from https://github.com/webpack/webpack/issues/595
function getCurrentScriptSrc() {
  if (document.currentScript) return document.currentScript.src; // this is unreliable if the script is loaded asynchronously

  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1].src;
}

function derivePath(scriptSrc) {
  return scriptSrc.substring(0, scriptSrc.lastIndexOf('/'));
} // allows webpack to dynamically load chunks on the same path as where the index script is loaded.


__webpack_public_path__ = derivePath(getCurrentScriptSrc()) + '/'; // eslint-disable-line

var _default = _index["default"];
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/codecs/index.js.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _lzma = _interopRequireDefault(require("./lzma"));

var _lzstring = _interopRequireDefault(require("./lzstring"));

var _lzw = _interopRequireDefault(require("./lzw"));

var _pack = _interopRequireDefault(require("./pack"));

var _default = {
  lzma: _lzma["default"],
  lzstring: _lzstring["default"],
  lzw: _lzw["default"],
  pack: _pack["default"]
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/codecs/lzma.js.















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _loaders = _interopRequireDefault(require("../loaders"));

var _default = {
  pack: true,
  encode: true,
  compress: function () {
    var _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(input) {
      var lzma;
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.next = 2;
              return _loaders["default"].lzma();

            case 2:
              lzma = _context.sent;
              return _context.abrupt("return", new Promise(function (ok, fail) {
                return lzma.compress(input, 9, function (byteArray, err) {
                  if (err) return fail(err);
                  return ok(Buffer.from(byteArray));
                });
              }));

            case 4:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    function compress(_x) {
      return _compress.apply(this, arguments);
    }

    return compress;
  }(),
  decompress: function () {
    var _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(input) {
      var lzma;
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.next = 2;
              return _loaders["default"].lzma();

            case 2:
              lzma = _context2.sent;
              return _context2.abrupt("return", new Promise(function (ok, fail) {
                return lzma.decompress(input, function (byteArray, err) {
                  if (err) return fail(err);
                  return ok(Buffer.from(byteArray));
                });
              }));

            case 4:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));

    function decompress(_x2) {
      return _decompress.apply(this, arguments);
    }

    return decompress;
  }()
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/codecs/lzstring.js.























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _loaders = _interopRequireDefault(require("../loaders"));

var _default = {
  pack: false,
  encode: true,
  compress: function () {
    var _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(string) {
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.t0 = Buffer;
              _context.next = 3;
              return _loaders["default"].lzstring();

            case 3:
              _context.t1 = _context.sent.compressToUint8Array(string);
              return _context.abrupt("return", _context.t0.from.call(_context.t0, _context.t1));

            case 5:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    function compress(_x) {
      return _compress.apply(this, arguments);
    }

    return compress;
  }(),
  decompress: function () {
    var _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(buffer) {
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.next = 2;
              return _loaders["default"].lzstring();

            case 2:
              return _context2.abrupt("return", _context2.sent.decompressFromUint8Array(buffer));

            case 3:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));

    function decompress(_x2) {
      return _decompress.apply(this, arguments);
    }

    return decompress;
  }()
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/codecs/lzw.js.



























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _loaders = _interopRequireDefault(require("../loaders"));

var _default = {
  pack: true,
  encode: true,
  compress: function () {
    var _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(input) {
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.t0 = Buffer;
              _context.next = 3;
              return _loaders["default"].lzw();

            case 3:
              _context.t1 = _context.sent.encode(input.toString('binary'));
              return _context.abrupt("return", _context.t0.from.call(_context.t0, _context.t1));

            case 5:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    function compress(_x) {
      return _compress.apply(this, arguments);
    }

    return compress;
  }(),
  decompress: function () {
    var _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(input) {
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.t0 = Buffer;
              _context2.next = 3;
              return _loaders["default"].lzw();

            case 3:
              _context2.t1 = _context2.sent.decode(input);
              return _context2.abrupt("return", _context2.t0.from.call(_context2.t0, _context2.t1, 'binary'));

            case 5:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));

    function decompress(_x2) {
      return _decompress.apply(this, arguments);
    }

    return decompress;
  }()
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/codecs/pack.js.































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _default = {
  pack: true,
  encode: true,
  compress: function () {
    var _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_) {
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              return _context.abrupt("return", _);

            case 1:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    function compress(_x) {
      return _compress.apply(this, arguments);
    }

    return compress;
  }(),
  decompress: function () {
    var _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_) {
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              return _context2.abrupt("return", _);

            case 1:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));

    function decompress(_x2) {
      return _decompress.apply(this, arguments);
    }

    return decompress;
  }()
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/index.js.

















































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = createClient;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _codecs = _interopRequireDefault(require("./codecs"));

var _loaders = _interopRequireDefault(require("./loaders"));

var twoDigitPercentage = function twoDigitPercentage(val) {
  return Math.floor(val * 10000) / 10000;
};

function createClient(algorithm) {
  if (!Object.prototype.hasOwnProperty.call(_codecs["default"], algorithm)) throw new Error("No such algorithm ".concat(algorithm));
  var _ALGORITHMS$algorithm = _codecs["default"][algorithm],
      pack = _ALGORITHMS$algorithm.pack,
      encode = _ALGORITHMS$algorithm.encode;

  function compress(_x) {
    return _compress.apply(this, arguments);
  }

  function _compress() {
    _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(json) {
      var packed, compressed, encoded;
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              if (!pack) {
                _context.next = 6;
                break;
              }

              _context.next = 3;
              return _loaders["default"].msgpack();

            case 3:
              _context.t0 = _context.sent.encode(json);
              _context.next = 7;
              break;

            case 6:
              _context.t0 = JSON.stringify(json);

            case 7:
              packed = _context.t0;
              _context.next = 10;
              return _codecs["default"][algorithm].compress(packed);

            case 10:
              compressed = _context.sent;

              if (!encode) {
                _context.next = 17;
                break;
              }

              _context.next = 14;
              return _loaders["default"].safe64();

            case 14:
              _context.t1 = _context.sent.encode(compressed);
              _context.next = 18;
              break;

            case 17:
              _context.t1 = compressed;

            case 18:
              encoded = _context.t1;
              return _context.abrupt("return", encoded);

            case 20:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));
    return _compress.apply(this, arguments);
  }

  function decompress(_x2) {
    return _decompress.apply(this, arguments);
  }

  function _decompress() {
    _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(string) {
      var decoded, decompressed, unpacked;
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              if (!encode) {
                _context2.next = 6;
                break;
              }

              _context2.next = 3;
              return _loaders["default"].safe64();

            case 3:
              _context2.t0 = _context2.sent.decode(string);
              _context2.next = 7;
              break;

            case 6:
              _context2.t0 = string;

            case 7:
              decoded = _context2.t0;
              _context2.next = 10;
              return _codecs["default"][algorithm].decompress(decoded);

            case 10:
              decompressed = _context2.sent;

              if (!pack) {
                _context2.next = 17;
                break;
              }

              _context2.next = 14;
              return _loaders["default"].msgpack();

            case 14:
              _context2.t1 = _context2.sent.decode(decompressed);
              _context2.next = 18;
              break;

            case 17:
              _context2.t1 = JSON.parse(decompressed);

            case 18:
              unpacked = _context2.t1;
              return _context2.abrupt("return", unpacked);

            case 20:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));
    return _decompress.apply(this, arguments);
  }

  function stats(_x3) {
    return _stats.apply(this, arguments);
  }

  function _stats() {
    _stats = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(json) {
      var raw, rawencoded, compressed;
      return _regenerator["default"].wrap(function _callee3$(_context3) {
        while (1) {
          switch (_context3.prev = _context3.next) {
            case 0:
              raw = JSON.stringify(json);
              rawencoded = encodeURIComponent(raw);
              _context3.next = 4;
              return compress(json);

            case 4:
              compressed = _context3.sent;
              return _context3.abrupt("return", {
                raw: raw.length,
                rawencoded: rawencoded.length,
                compressedencoded: compressed.length,
                compression: twoDigitPercentage(rawencoded.length / compressed.length)
              });

            case 6:
            case "end":
              return _context3.stop();
          }
        }
      }, _callee3);
    }));
    return _stats.apply(this, arguments);
  }

  return {
    compress: compress,
    decompress: decompress,
    stats: stats
  };
}

module.exports = exports["default"];

Added public/json-url-master/dist/node/loaders.js.





















































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _interopRequireWildcard2 = _interopRequireDefault(require("@babel/runtime/helpers/interopRequireWildcard"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

// centralize all chunks in one file
var _default = {
  msgpack: function msgpack() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
      var module, factory;
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('msgpack5'));
              });

            case 2:
              module = _context.sent;
              factory = module["default"] || module;
              return _context.abrupt("return", factory());

            case 5:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }))();
  },
  safe64: function safe64() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('urlsafe-base64'));
              });

            case 2:
              return _context2.abrupt("return", _context2.sent);

            case 3:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }))();
  },
  lzma: function lzma() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
      var lzma;
      return _regenerator["default"].wrap(function _callee3$(_context3) {
        while (1) {
          switch (_context3.prev = _context3.next) {
            case 0:
              _context3.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('lzma'));
              });

            case 2:
              lzma = _context3.sent;
              return _context3.abrupt("return", lzma.compress ? lzma : lzma.LZMA);

            case 4:
            case "end":
              return _context3.stop();
          }
        }
      }, _callee3);
    }))();
  },
  lzstring: function lzstring() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
      return _regenerator["default"].wrap(function _callee4$(_context4) {
        while (1) {
          switch (_context4.prev = _context4.next) {
            case 0:
              _context4.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('lz-string'));
              });

            case 2:
              return _context4.abrupt("return", _context4.sent);

            case 3:
            case "end":
              return _context4.stop();
          }
        }
      }, _callee4);
    }))();
  },
  lzw: function lzw() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
      var module, lzw;
      return _regenerator["default"].wrap(function _callee5$(_context5) {
        while (1) {
          switch (_context5.prev = _context5.next) {
            case 0:
              _context5.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('node-lzw'));
              });

            case 2:
              module = _context5.sent;
              lzw = module["default"] || module;
              return _context5.abrupt("return", lzw);

            case 5:
            case "end":
              return _context5.stop();
          }
        }
      }, _callee5);
    }))();
  }
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/main/browser-index.js.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _index = _interopRequireDefault(require("./index.js"));

/* global document */
// adapted from https://github.com/webpack/webpack/issues/595
function getCurrentScriptSrc() {
  if (document.currentScript) return document.currentScript.src; // this is unreliable if the script is loaded asynchronously

  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1].src;
}

function derivePath(scriptSrc) {
  return scriptSrc.substring(0, scriptSrc.lastIndexOf('/'));
} // allows webpack to dynamically load chunks on the same path as where the index script is loaded.


__webpack_public_path__ = derivePath(getCurrentScriptSrc()) + '/'; // eslint-disable-line

var _default = _index["default"];
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/main/codecs/index.js.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _lzma = _interopRequireDefault(require("./lzma"));

var _lzstring = _interopRequireDefault(require("./lzstring"));

var _lzw = _interopRequireDefault(require("./lzw"));

var _pack = _interopRequireDefault(require("./pack"));

var _default = {
  lzma: _lzma["default"],
  lzstring: _lzstring["default"],
  lzw: _lzw["default"],
  pack: _pack["default"]
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/main/codecs/lzma.js.















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _loaders = _interopRequireDefault(require("../loaders"));

var _default = {
  pack: true,
  encode: true,
  compress: function () {
    var _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(input) {
      var lzma;
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.next = 2;
              return _loaders["default"].lzma();

            case 2:
              lzma = _context.sent;
              return _context.abrupt("return", new Promise(function (ok, fail) {
                return lzma.compress(input, 9, function (byteArray, err) {
                  if (err) return fail(err);
                  return ok(Buffer.from(byteArray));
                });
              }));

            case 4:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    function compress(_x) {
      return _compress.apply(this, arguments);
    }

    return compress;
  }(),
  decompress: function () {
    var _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(input) {
      var lzma;
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.next = 2;
              return _loaders["default"].lzma();

            case 2:
              lzma = _context2.sent;
              return _context2.abrupt("return", new Promise(function (ok, fail) {
                return lzma.decompress(input, function (byteArray, err) {
                  if (err) return fail(err);
                  return ok(Buffer.from(byteArray));
                });
              }));

            case 4:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));

    function decompress(_x2) {
      return _decompress.apply(this, arguments);
    }

    return decompress;
  }()
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/main/codecs/lzstring.js.























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _loaders = _interopRequireDefault(require("../loaders"));

var _default = {
  pack: false,
  encode: true,
  compress: function () {
    var _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(string) {
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.t0 = Buffer;
              _context.next = 3;
              return _loaders["default"].lzstring();

            case 3:
              _context.t1 = _context.sent.compressToUint8Array(string);
              return _context.abrupt("return", _context.t0.from.call(_context.t0, _context.t1));

            case 5:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    function compress(_x) {
      return _compress.apply(this, arguments);
    }

    return compress;
  }(),
  decompress: function () {
    var _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(buffer) {
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.next = 2;
              return _loaders["default"].lzstring();

            case 2:
              return _context2.abrupt("return", _context2.sent.decompressFromUint8Array(buffer));

            case 3:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));

    function decompress(_x2) {
      return _decompress.apply(this, arguments);
    }

    return decompress;
  }()
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/main/codecs/lzw.js.



























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _loaders = _interopRequireDefault(require("../loaders"));

var _default = {
  pack: true,
  encode: true,
  compress: function () {
    var _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(input) {
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.t0 = Buffer;
              _context.next = 3;
              return _loaders["default"].lzw();

            case 3:
              _context.t1 = _context.sent.encode(input.toString('binary'));
              return _context.abrupt("return", _context.t0.from.call(_context.t0, _context.t1));

            case 5:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    function compress(_x) {
      return _compress.apply(this, arguments);
    }

    return compress;
  }(),
  decompress: function () {
    var _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(input) {
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.t0 = Buffer;
              _context2.next = 3;
              return _loaders["default"].lzw();

            case 3:
              _context2.t1 = _context2.sent.decode(input);
              return _context2.abrupt("return", _context2.t0.from.call(_context2.t0, _context2.t1, 'binary'));

            case 5:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));

    function decompress(_x2) {
      return _decompress.apply(this, arguments);
    }

    return decompress;
  }()
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/main/codecs/pack.js.































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _default = {
  pack: true,
  encode: true,
  compress: function () {
    var _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_) {
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              return _context.abrupt("return", _);

            case 1:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));

    function compress(_x) {
      return _compress.apply(this, arguments);
    }

    return compress;
  }(),
  decompress: function () {
    var _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_) {
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              return _context2.abrupt("return", _);

            case 1:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));

    function decompress(_x2) {
      return _decompress.apply(this, arguments);
    }

    return decompress;
  }()
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/dist/node/main/index.js.

















































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = createClient;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _codecs = _interopRequireDefault(require("./codecs"));

var _loaders = _interopRequireDefault(require("./loaders"));

var twoDigitPercentage = function twoDigitPercentage(val) {
  return Math.floor(val * 10000) / 10000;
};

function createClient(algorithm) {
  if (!Object.prototype.hasOwnProperty.call(_codecs["default"], algorithm)) throw new Error("No such algorithm ".concat(algorithm));
  var _ALGORITHMS$algorithm = _codecs["default"][algorithm],
      pack = _ALGORITHMS$algorithm.pack,
      encode = _ALGORITHMS$algorithm.encode;

  function compress(_x) {
    return _compress.apply(this, arguments);
  }

  function _compress() {
    _compress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(json) {
      var packed, compressed, encoded;
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              if (!pack) {
                _context.next = 6;
                break;
              }

              _context.next = 3;
              return _loaders["default"].msgpack();

            case 3:
              _context.t0 = _context.sent.encode(json);
              _context.next = 7;
              break;

            case 6:
              _context.t0 = JSON.stringify(json);

            case 7:
              packed = _context.t0;
              _context.next = 10;
              return _codecs["default"][algorithm].compress(packed);

            case 10:
              compressed = _context.sent;

              if (!encode) {
                _context.next = 17;
                break;
              }

              _context.next = 14;
              return _loaders["default"].safe64();

            case 14:
              _context.t1 = _context.sent.encode(compressed);
              _context.next = 18;
              break;

            case 17:
              _context.t1 = compressed;

            case 18:
              encoded = _context.t1;
              return _context.abrupt("return", encoded);

            case 20:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }));
    return _compress.apply(this, arguments);
  }

  function decompress(_x2) {
    return _decompress.apply(this, arguments);
  }

  function _decompress() {
    _decompress = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(string) {
      var decoded, decompressed, unpacked;
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              if (!encode) {
                _context2.next = 6;
                break;
              }

              _context2.next = 3;
              return _loaders["default"].safe64();

            case 3:
              _context2.t0 = _context2.sent.decode(string);
              _context2.next = 7;
              break;

            case 6:
              _context2.t0 = string;

            case 7:
              decoded = _context2.t0;
              _context2.next = 10;
              return _codecs["default"][algorithm].decompress(decoded);

            case 10:
              decompressed = _context2.sent;

              if (!pack) {
                _context2.next = 17;
                break;
              }

              _context2.next = 14;
              return _loaders["default"].msgpack();

            case 14:
              _context2.t1 = _context2.sent.decode(decompressed);
              _context2.next = 18;
              break;

            case 17:
              _context2.t1 = JSON.parse(decompressed);

            case 18:
              unpacked = _context2.t1;
              return _context2.abrupt("return", unpacked);

            case 20:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }));
    return _decompress.apply(this, arguments);
  }

  function stats(_x3) {
    return _stats.apply(this, arguments);
  }

  function _stats() {
    _stats = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(json) {
      var raw, rawencoded, compressed;
      return _regenerator["default"].wrap(function _callee3$(_context3) {
        while (1) {
          switch (_context3.prev = _context3.next) {
            case 0:
              raw = JSON.stringify(json);
              rawencoded = encodeURIComponent(raw);
              _context3.next = 4;
              return compress(json);

            case 4:
              compressed = _context3.sent;
              return _context3.abrupt("return", {
                raw: raw.length,
                rawencoded: rawencoded.length,
                compressedencoded: compressed.length,
                compression: twoDigitPercentage(rawencoded.length / compressed.length)
              });

            case 6:
            case "end":
              return _context3.stop();
          }
        }
      }, _callee3);
    }));
    return _stats.apply(this, arguments);
  }

  return {
    compress: compress,
    decompress: decompress,
    stats: stats
  };
}

module.exports = exports["default"];

Added public/json-url-master/dist/node/main/loaders.js.





















































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _interopRequireWildcard2 = _interopRequireDefault(require("@babel/runtime/helpers/interopRequireWildcard"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

// centralize all chunks in one file
var _default = {
  msgpack: function msgpack() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
      var module, factory;
      return _regenerator["default"].wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              _context.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('msgpack5'));
              });

            case 2:
              module = _context.sent;
              factory = module["default"] || module;
              return _context.abrupt("return", factory());

            case 5:
            case "end":
              return _context.stop();
          }
        }
      }, _callee);
    }))();
  },
  safe64: function safe64() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
      return _regenerator["default"].wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('urlsafe-base64'));
              });

            case 2:
              return _context2.abrupt("return", _context2.sent);

            case 3:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2);
    }))();
  },
  lzma: function lzma() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
      var lzma;
      return _regenerator["default"].wrap(function _callee3$(_context3) {
        while (1) {
          switch (_context3.prev = _context3.next) {
            case 0:
              _context3.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('lzma'));
              });

            case 2:
              lzma = _context3.sent;
              return _context3.abrupt("return", lzma.compress ? lzma : lzma.LZMA);

            case 4:
            case "end":
              return _context3.stop();
          }
        }
      }, _callee3);
    }))();
  },
  lzstring: function lzstring() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
      return _regenerator["default"].wrap(function _callee4$(_context4) {
        while (1) {
          switch (_context4.prev = _context4.next) {
            case 0:
              _context4.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('lz-string'));
              });

            case 2:
              return _context4.abrupt("return", _context4.sent);

            case 3:
            case "end":
              return _context4.stop();
          }
        }
      }, _callee4);
    }))();
  },
  lzw: function lzw() {
    return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
      var module, lzw;
      return _regenerator["default"].wrap(function _callee5$(_context5) {
        while (1) {
          switch (_context5.prev = _context5.next) {
            case 0:
              _context5.next = 2;
              return Promise.resolve().then(function () {
                return (0, _interopRequireWildcard2["default"])(require('node-lzw'));
              });

            case 2:
              module = _context5.sent;
              lzw = module["default"] || module;
              return _context5.abrupt("return", lzw);

            case 5:
            case "end":
              return _context5.stop();
          }
        }
      }, _callee5);
    }))();
  }
};
exports["default"] = _default;
module.exports = exports["default"];

Added public/json-url-master/examples/browser/test.html.























































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<!doctype html>
<html>
	<head>
		<title>json-url demo page</title>
		<style type="text/css">
			body {
				padding: 0;
				margin: 0;
				font-family: Helvetica Neue, Segoe UI, Roboto, sans-serif;
			}

			header {
				font-family: Iowan Old Style, serif;
				margin: 0;
				padding: 1em 0;
				background-color: #333;
				text-align: center;
				color: white;
			}

			header > h1 {
				margin: 0;
			}

			#container {
				padding: 1em;
			}


			*, input, button, select {
				box-sizing: border-box;
			}

			label {
				width: 10em;
				display: inline-block;
				vertical-align: top;
			}

			input, button, select, textarea {
				border: 1px solid #333;
				border-radius: .2em;
				padding: .2em;
				font-size: 16px;
			}

			#json {
				width: 30em;
				height: 10em;
				font-family: Menlo, monospace;
			}

			button {
				background-color: #ccc;
				padding: .2em 1em;
				transition: .2s ease;
			}

			button:hover, button:focus {
				background-color: #eee;
				cursor: pointer;
			}


			#container > div {
				margin-bottom: .5em;
			}

			#result, #decompressed {
				font-family: Menlo, monospace;
				background-color: #eee;
				min-height: 10em;
				padding: 0.5em;
				border-radius: .2em;
				width: 100%;
			}

			footer {
				background-color :#333;
				color: white;
				position: fixed;
				bottom: 0;
				left: 0;
				display: block;
				width: 100%;
				text-align: center;
			}
		</style>
	</head>
	<body>
		<header>
			<h1>json-url demo</h1>
			<small>Proudly written in vanilla.js&trade;</small>
		</header>
		<div id="container">
			<div>
				<label for="algorithm">Algorithm</label>
				<select id="algorithm" name="algorithm">
					<option value="lzw">lzw</option>
					<option value="lzma">lzma</option>
					<option value="lzstring">lzstring</option>
					<option value="pack">pack</option>
				</select>
			</div>
			<div>
				<label for="json">JSON Input</label>
				<textarea id="json" name="json"></textarea>
			</div>
			<button id="generate" type="button">Generate</button>
			<div>
				<h3>Result</h3>
				<textarea class="intput-output" id="result">
				</textarea>
			</div>
			<button id="decompress" type="button">Decompress</button>
			<div>
				<h3>Decompression</h3>
				<textarea class="input-output" id="decompressed">
				</textarea>
			</div>
		</div>
	</body>
	<script type="text/javascript" src="/dist/browser/json-url.js"></script>
	<script>
		/* eslint-disable */
		json.value = JSON.stringify({
			roses: 'red',
			violets: 'blue',
			fruits: [ 'apple', 2 ]
		}, null, 2);
			algorithm.addEventListener('change', () => {
				result.value = '';
				decompressed.value = '';
				generate.click();
			});
			generate.addEventListener('click', () => {
				try {
					const parsed = JSON.parse(json.value);
					const lib = JsonUrl(algorithm.value);
					lib.compress(parsed).then(output => { result.value = output; });
				} catch (err) {
					result.value = `Unable to compress. Reason: ${err}`;
				}
			});
			decompress.addEventListener('click', () => {
				try {
					const compressed = result.value.trim();
					const lib = JsonUrl(algorithm.value);
					lib.decompress(compressed).then(output => { decompressed.value = JSON.stringify(output, null, 2); })
				} catch (err) {
					decompressed.value = `Unable to decompress. Reason: ${err}`;
				}
			});
	</script>
</html>

Added public/json-url-master/karma.conf.js.



















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* eslint-disable import/unambiguous */
const webpackConfig = require('./webpack.config.js');

// karma-webpack 2.x breaking fix
delete webpackConfig.entry;

// note: these mods mutate the original config
const MODS = { // eslint-disable-line no-unused-vars
	dontAliasLzma(config) {
		config.module.rules
			.filter(rule => rule.use && rule.use.loader === 'babel-loader')
			.forEach(rule => rule.use.options.plugins
				.filter(plugin => plugin[0] === 'module-resolver')
				.forEach(plugin => plugin[1].alias && delete plugin[1].alias.lzma)
			);
		return config;
	},
	dontUglify(config) {
		config.plugins = [];
		return config;
	}
}

module.exports = config => {
	config.set({
		frameworks: ['mocha'],
		files: ['test/index.js'],
		reporters: ['progress'],
		port: 9876,
		colors: true,
		logLevel: config.LOG_DEBUG,
		browsers: ['ChromeHeadless'],
		autoWatch: false, // if true, Karma will not exit after the tests
		concurrency: Infinity,
		preprocessors: {
			// add webpack as preprocessor
			'test/index.js': ['webpack'],
		},
		webpack: webpackConfig
	});
}

Added public/json-url-master/package-lock.json.

more than 10,000 changes

Added public/json-url-master/package.json.





































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
{
	"name": "json-url",
	"version": "3.0.0",
	"description": "Compress JSON into compact base64 URI-friendly notation",
	"main": "dist/node/index.js",
	"browser": "dist/browser/json-url-single.js",
	"scripts": {
		"lint": "eslint src/*",
		"compile": "rm -rf dist/; mkdir dist & wait & npm run compile:node & npm run compile:webpack & npm run compile:webpack:single",
		"compile:node": "babel --plugins @babel/plugin-transform-runtime,add-module-exports -d dist/node src src/main",
		"compile:webpack": "webpack",
		"compile:webpack:single": "webpack --config webpack.config.single.js",
		"prepublish": "npm test && npm run compile",
		"test": "npm run lint && npm run test:node && npm run test:karma",
		"test:node": "BABEL_ENV=test nyc mocha test/index.js --timeout 120000",
		"test:karma": "karma start --single-run",
		"perf": "babel-node test/perf.js",
		"coverage": "nyc report --reporter=text-lcov | coveralls",
		"example": "open http://localhost:8000/examples/browser/test.html & static-server --port 8000"
	},
	"repository": {
		"type": "git",
		"url": "https://github.com/masotime/json-url"
	},
	"author": "Benjamin Goh <masotime@gmail.com>",
	"license": "ISC",
	"dependencies": {
		"@babel/runtime-corejs2": "^7.0.0",
		"bluebird": "^3.0.6",
		"lz-string": "^1.4.4",
		"lzma": "^2.3.2",
		"msgpack5": "^4.2.1",
		"node-lzw": "^0.3.1",
		"urlsafe-base64": "^1.0.0"
	},
	"devDependencies": {
		"@babel/cli": "^7.0.0",
		"@babel/core": "^7.0.0",
		"@babel/node": "^7.0.0",
		"@babel/plugin-proposal-class-properties": "^7.0.0",
		"@babel/plugin-proposal-decorators": "^7.0.0",
		"@babel/plugin-proposal-do-expressions": "^7.0.0",
		"@babel/plugin-proposal-export-default-from": "^7.0.0",
		"@babel/plugin-proposal-export-namespace-from": "^7.0.0",
		"@babel/plugin-proposal-function-bind": "^7.0.0",
		"@babel/plugin-proposal-function-sent": "^7.0.0",
		"@babel/plugin-proposal-json-strings": "^7.0.0",
		"@babel/plugin-proposal-logical-assignment-operators": "^7.0.0",
		"@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0",
		"@babel/plugin-proposal-numeric-separator": "^7.0.0",
		"@babel/plugin-proposal-optional-chaining": "^7.0.0",
		"@babel/plugin-proposal-pipeline-operator": "^7.0.0",
		"@babel/plugin-proposal-throw-expressions": "^7.0.0",
		"@babel/plugin-syntax-dynamic-import": "^7.0.0",
		"@babel/plugin-syntax-import-meta": "^7.0.0",
		"@babel/plugin-transform-runtime": "^7.0.0",
		"@babel/polyfill": "^7.0.0",
		"@babel/preset-env": "^7.0.0",
		"@babel/register": "^7.6.2",
		"@babel/runtime": "^7.6.3",
		"babel-eslint": "^9.0.0",
		"babel-loader": "^8.0.0",
		"babel-plugin-add-module-exports": "^0",
		"babel-plugin-dynamic-import-node": "^1.1.0",
		"babel-plugin-istanbul": "^5.2.0",
		"babel-plugin-module-resolver": "^3.2.0",
		"coveralls": "^3.0.2",
		"eslint": "^6.6.0",
		"eslint-import-resolver-babel-module": "^5.1.0",
		"eslint-plugin-import": "^2.18.2",
		"karma": "^6.3.2",
		"karma-chrome-launcher": "^2.2.0",
		"karma-mocha": "^2.0.0",
		"karma-webpack": "^3.0.5",
		"mocha": "^8.3.2",
		"nyc": "^14.1.1",
		"static-server": "^2.0.5",
		"uglifyjs-webpack-plugin": "^0.4.6",
		"webpack": "^4.42.1",
		"webpack-cli": "^3.3.11"
	}
}

Added public/json-url-master/src/main/browser-index.js.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* global document */
import createClient from './index.js';

// adapted from https://github.com/webpack/webpack/issues/595
function getCurrentScriptSrc() {
	if (document.currentScript) return document.currentScript.src;

	// this is unreliable if the script is loaded asynchronously
	const scripts = document.getElementsByTagName('script');
	return scripts[scripts.length-1].src;
}

function derivePath(scriptSrc) {
	return scriptSrc.substring(0, scriptSrc.lastIndexOf('/'));
}

// allows webpack to dynamically load chunks on the same path as where the index script is loaded.
__webpack_public_path__ = derivePath(getCurrentScriptSrc()) + '/'; // eslint-disable-line

export default createClient;

Added public/json-url-master/src/main/codecs/index.js.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
import lzma from 'main/codecs/lzma';
import lzstring from 'main/codecs/lzstring';
import lzw from 'main/codecs/lzw';
import pack from 'main/codecs/pack';

export default {
	lzma, lzstring, lzw, pack
};

Added public/json-url-master/src/main/codecs/lzma.js.

















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import LOADERS from 'main/loaders';

export default {
	pack: true,
	encode: true,
	compress: async input => {
		const lzma = await LOADERS.lzma();
		return new Promise((ok, fail) =>
			lzma.compress(input, 9, (byteArray, err) => {
				if (err) return fail(err);
				return ok(Buffer.from(byteArray));
			})
		)
	},
	decompress: async input => {
		const lzma = await LOADERS.lzma();
		return new Promise((ok, fail) =>
			lzma.decompress(input, (byteArray, err) => {
				if (err) return fail(err);
				return ok(Buffer.from(byteArray));
			})
		)
	}
};

Added public/json-url-master/src/main/codecs/lzstring.js.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
import LOADERS from 'main/loaders';

export default {
	pack: false,
	encode: true,
	compress: async string => Buffer.from((await LOADERS.lzstring()).compressToUint8Array(string)),
	decompress: async buffer => (await LOADERS.lzstring()).decompressFromUint8Array(buffer)
};

Added public/json-url-master/src/main/codecs/lzw.js.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
import LOADERS from 'main/loaders';

export default {
	pack: true,
	encode: true,
	compress: async input => Buffer.from((await LOADERS.lzw()).encode(input.toString('binary'))),
	decompress: async input => Buffer.from((await LOADERS.lzw()).decode(input), 'binary')
};

Added public/json-url-master/src/main/codecs/pack.js.













>
>
>
>
>
>
1
2
3
4
5
6
export default {
	pack: true,
	encode: true,
	compress: async _ => _,
	decompress: async _ => _
};

Added public/json-url-master/src/main/index.js.















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import ALGORITHMS from 'main/codecs';
import LOADERS from 'main/loaders';

const twoDigitPercentage = val => Math.floor(val * 10000) / 10000;

export default function createClient(algorithm) {
	if (!Object.prototype.hasOwnProperty.call(ALGORITHMS, algorithm)) throw new Error(`No such algorithm ${algorithm}`);

	const { pack, encode } = ALGORITHMS[algorithm];

	async function compress(json) {
		const packed = pack ? (await LOADERS.msgpack()).encode(json) : JSON.stringify(json);
		const compressed = await ALGORITHMS[algorithm].compress(packed);
		const encoded = encode ? (await LOADERS.safe64()).encode(compressed) : compressed;
		return encoded;
	}

	async function decompress(string) {
		const decoded = encode ? (await LOADERS.safe64()).decode(string) : string;
		const decompressed = await ALGORITHMS[algorithm].decompress(decoded);
		const unpacked = pack ? (await LOADERS.msgpack()).decode(decompressed) : JSON.parse(decompressed);
		return unpacked;
	}

	async function stats(json) {
		const raw = JSON.stringify(json);
		const rawencoded = encodeURIComponent(raw);
		const compressed = await compress(json);

		return {
			raw: raw.length,
			rawencoded: rawencoded.length,
			compressedencoded: compressed.length,
			compression: twoDigitPercentage(rawencoded.length / compressed.length)
		};
	}

	return { compress, decompress, stats };
}

Added public/json-url-master/src/main/loaders.js.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// centralize all chunks in one file
export default {
	async msgpack() {
		const module = await import(/* webpackChunkName: "msgpack" */ 'msgpack5');
		const factory = module.default || module;
		return factory();
	},
	async safe64() {
		return await import(/* webpackChunkName: "safe64" */ 'urlsafe-base64');
	},
	async lzma() {
		const lzma = await import(/* webpackChunkName: "lzma" */ 'lzma');

		// this special condition is present because the web minified version has a slightly different export
		return lzma.compress ? lzma : lzma.LZMA;
	},
	async lzstring() {
		return await import(/* webpackChunkName: "lzstring" */ 'lz-string');
	},
	async lzw() {
		const module = await import(/* webpackChunkName: "lzw" */ 'node-lzw');
		const lzw = module.default || module;
		return lzw;
	}
};

Added public/json-url-master/test/index.js.







































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* global describe, it */
import assert from 'assert';
import createClient from 'main';
import { validate } from 'urlsafe-base64';
import samples from './samples.json'

describe('json-url', () => {
	samples.forEach(sample => {
		describe(`When attempting to compress ${JSON.stringify(sample).slice(0, 50)}...`, () => {
			['pack', 'lzw', 'lzma', 'lzstring'].forEach(algorithm => {
				describe(`using the ${algorithm} algorithm`, () => {
					const client = createClient(algorithm);

					it('compresses JSON via #compress to base64 format', async () => {
						const compressed = await client.compress(sample);
						assert.ok(validate(compressed), `${compressed} is not valid base64`);
					});

					it('can decompress JSON compressed via #compress using #decompress', async () => {
						const compressed = await client.compress(sample);
						const decompressed = await client.decompress(compressed);
						assert.equal(JSON.stringify(decompressed), JSON.stringify(sample));
					});

					it('returns stats { rawencoded, compressedencoded, compression } via #stats', async () => {
						const result = await client.stats(sample);
						assert.ok(result['rawencoded']);
						assert.ok(result['compressedencoded']);
						assert.ok(result['compression']);
					});
				}); // each algorithm
			});
		}); // each sample
	});
});

Added public/json-url-master/test/perf.js.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import jsonUrl from 'main/index.js';
import samples from './samples.json';
import ALGORITHMS from 'main/compress';

const algorithms = Object.keys(ALGORITHMS);

async function main() {

	const results = new Array(samples.length);

	for (const algorithm of algorithms) {
		const lib = jsonUrl(algorithm);
		let counter = 0;
		for (const datum of samples) {
			const { raw, rawencoded, compressedencoded, compression } = await lib.stats(datum);
			results[counter] = results[counter] || {};
			results[counter].raw = raw;
			results[counter].rawencoded = rawencoded;
			results[counter][algorithm] = {
				ratio: compression,
				compressed: compressedencoded
			};
			counter += 1;
		}
	}

	console.log(JSON.stringify(results, null, 2));
}

main();

Added public/json-url-master/test/samples.json.





























































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
[
	{
		"filters": {
			"amenities": [4, 55, 23],
			"budget_max": 80000,
			"budget_min": 50000,
			"event_types": [1, 2, 3],
			"neighborhoods": [4, 55, 502]
		},
		"page": 1,
		"search_fields": {
			"end_time": "11:00pm",
			"guests": "50",
			"region": 8,
			"start_date": "11-23-2015",
			"start_time": "8:00pm"
		},
		"search_for_name": "Name Search Test"
	},
	{
		"setup": {
			"protocol": "NVP"
		},
		"use": {
			"master": {
				"stage": "NO"
			}
		},
		"common_request_params": {
			"version": "123",
			"method": "SetExpressCheckout"
		},
		"NVP": {
			"SetExpressCheckout": {
				"AMT": "16",
				"CANCELURL": "http://xotoolslvs01.qa.paypal.com/ectest/cancel.html",
				"L_AMT0": "8",
				"L_NAME0": "Test Item fewarwerwerw",
				"L_QTY0": "2",
				"PAYMENTACTION": "Sale",
				"RETURNURL": "http://xotoolslvs01.qa.paypal.com/ectest/return.html",
				"_custom0__name": "L_DESC0",
				"_custom0": "hello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello world"
			}
		}
	},
	{
		"zh": {
			"name": "China",
			"continent": "Asia",
			"flagColors": [
				"red",
				"yellow"
			],
			"leader": {
				"name": "δΉ  θΏ‘εΉ³-δΉ ",
				"title": "President",
				"term": 137
			},
			"population": 1370000000
		},
		"in": {
			"name": "India",
			"continent": "",
			"a": true,
			"b": false,
			"c": null,
			"emptyArray": [],
			"emptyObject": {},
			"flagColors": [
				"orange",
				"white",
				"green"
			],
			"leader": {
				"name": "Narendra\nModi.",
				"title": "Prime Minister",
				"term": 119
			},
			"population": 1190000000
		},
		"array": [
			"asdf",
			[
				3,
				4
			]
		]
	},
	{
		"one": 1
	},
	{
		"one": 1,
		"two": 2,
		"three": 3
	},
	{
		"_id": "55d54e11bf8bf51e99245818",
		"index": 0,
		"guid": "f1205498-83a2-4f9d-ba60-ded5585c0e67",
		"isActive": false,
		"balance": "$2,370.15",
		"picture": "http://placehold.it/32x32",
		"age": 28,
		"eyeColor": "green",
		"name": {
			"first": "Jill",
			"last": "Pennington"
		},
		"company": "GAZAK",
		"email": "jill.pennington@gazak.co.uk",
		"phone": "+1 (998) 584-3321",
		"address": "517 Coles Street, Skyland, Montana, 7661",
		"about": "Pariatur tempor consequat amet do incididunt aute nulla. Pariatur reprehenderit nostrud quis mollit duis ipsum ut consequat mollit qui. Ullamco reprehenderit nostrud nulla nisi ipsum adipisicing esse. Et ullamco in reprehenderit fugiat consectetur sunt laborum est. Magna sit consectetur commodo tempor dolore sint id dolor Lorem Lorem. Ex nisi ea occaecat nisi. Voluptate enim in aliquip laborum consectetur eu commodo enim excepteur ex.",
		"registered": "Saturday, July 26, 2014 3:55 PM",
		"latitude": "74.180645",
		"longitude": "-80.748226",
		"tags": [
			"anim",
			"est",
			"excepteur",
			"esse",
			"voluptate",
			"nulla",
			"anim",
			"custom_tag"
		],
		"range": [
			0,
			1,
			2,
			3,
			4,
			5,
			6,
			7,
			8,
			9
		],
		"friends": [
			{
				"id": 0,
				"name": "Frazier Schwartz"
			},
			{
				"id": 1,
				"name": "Ellis Fuller"
			},
			{
				"id": 2,
				"name": "Laurel Hill"
			}
		],
		"greeting": "Hello, Jill! You have 9 unread messages.",
		"favoriteFruit": "apple"
	},
	{
		"_id": "55d54e11e47640367e1e8a29",
		"index": 1,
		"guid": "edb46838-ba45-4de1-8a8a-71a7503d5a2d",
		"isActive": true,
		"balance": "$3,282.70",
		"picture": "http://placehold.it/32x32",
		"age": 35,
		"eyeColor": "brown",
		"name": {
			"first": "Eliza",
			"last": "Mcdaniel"
		},
		"company": "GENMOM",
		"email": "eliza.mcdaniel@genmom.name",
		"phone": "+1 (991) 496-2864",
		"address": "532 Jewel Street, Outlook, Utah, 2237",
		"about": "Aliquip ea et mollit in excepteur anim duis adipisicing laboris esse occaecat. Mollit tempor et duis sit tempor irure sint sit id enim eiusmod. Amet consectetur esse commodo nostrud dolore excepteur in laboris aliqua cillum elit velit adipisicing deserunt. Ut excepteur ad quis ea velit aliqua tempor consectetur.",
		"registered": "Sunday, August 17, 2014 1:04 AM",
		"latitude": "-39.904477",
		"longitude": "71.117407",
		"tags": [
			"anim",
			"est",
			"excepteur",
			"esse",
			"voluptate",
			"nulla",
			"anim",
			"custom_tag"
		],
		"range": [
			0,
			1,
			2,
			3,
			4,
			5,
			6,
			7,
			8,
			9
		],
		"friends": [
			{
				"id": 0,
				"name": "Frazier Schwartz"
			},
			{
				"id": 1,
				"name": "Ellis Fuller"
			},
			{
				"id": 2,
				"name": "Laurel Hill"
			}
		],
		"greeting": "Hello, Eliza! You have 9 unread messages.",
		"favoriteFruit": "banana"
	},
	{
		"_id": "55d54e118f4a1f5c6749e9fa",
		"index": 2,
		"guid": "854040fa-6f9d-481b-990e-d2877dbee2d4",
		"isActive": false,
		"balance": "$3,010.47",
		"picture": "http://placehold.it/32x32",
		"age": 40,
		"eyeColor": "brown",
		"name": {
			"first": "Robert",
			"last": "Burch"
		},
		"company": "ACRODANCE",
		"email": "robert.burch@acrodance.biz",
		"phone": "+1 (876) 431-2360",
		"address": "139 Cornelia Street, Collins, Oklahoma, 671",
		"about": "Voluptate anim est velit reprehenderit sit ut magna non commodo. Commodo veniam sit non commodo nisi enim. Sint adipisicing culpa cillum exercitation irure consequat laboris laborum.",
		"registered": "Wednesday, September 17, 2014 9:16 AM",
		"latitude": "-18.778534",
		"longitude": "-77.0815",
		"tags": [
			"anim",
			"est",
			"excepteur",
			"esse",
			"voluptate",
			"nulla",
			"anim",
			"custom_tag"
		],
		"range": [
			0,
			1,
			2,
			3,
			4,
			5,
			6,
			7,
			8,
			9
		],
		"friends": [
			{
				"id": 0,
				"name": "Frazier Schwartz"
			},
			{
				"id": 1,
				"name": "Ellis Fuller"
			},
			{
				"id": 2,
				"name": "Laurel Hill"
			}
		],
		"greeting": "Hello, Robert! You have 6 unread messages.",
		"favoriteFruit": "strawberry"
	},
	{
		"_id": "55d54e1161c743c696e550b9",
		"index": 3,
		"guid": "a9bc9cc1-f159-44c0-af72-0832a4a05ed6",
		"isActive": false,
		"balance": "$2,632.61",
		"picture": "http://placehold.it/32x32",
		"age": 32,
		"eyeColor": "green",
		"name": {
			"first": "Mae",
			"last": "Fowler"
		},
		"company": "JUNIPOOR",
		"email": "mae.fowler@junipoor.org",
		"phone": "+1 (825) 426-2682",
		"address": "316 Pineapple Street, Hegins, New York, 5565",
		"about": "Voluptate elit non magna excepteur velit voluptate. Eu aliqua Lorem eiusmod ut quis amet cillum consequat. Do magna ex laborum incididunt est proident dolore tempor in ullamco. Commodo irure labore nulla voluptate in voluptate minim mollit enim aliqua minim excepteur ad esse.",
		"registered": "Thursday, June 18, 2015 10:05 PM",
		"latitude": "-62.526412",
		"longitude": "-54.420474",
		"tags": [
			"anim",
			"est",
			"excepteur",
			"esse",
			"voluptate",
			"nulla",
			"anim",
			"custom_tag"
		],
		"range": [
			0,
			1,
			2,
			3,
			4,
			5,
			6,
			7,
			8,
			9
		],
		"friends": [
			{
				"id": 0,
				"name": "Frazier Schwartz"
			},
			{
				"id": 1,
				"name": "Ellis Fuller"
			},
			{
				"id": 2,
				"name": "Laurel Hill"
			}
		],
		"greeting": "Hello, Mae! You have 9 unread messages.",
		"favoriteFruit": "banana"
	},
	{
		"_id": "55d54e1134a6c7726d4311b7",
		"index": 4,
		"guid": "7b5cbc42-3c27-41fd-bec4-08e34581ce26",
		"isActive": false,
		"balance": "$2,232.78",
		"picture": "http://placehold.it/32x32",
		"age": 39,
		"eyeColor": "blue",
		"name": {
			"first": "Casey",
			"last": "Evans"
		},
		"company": "NETERIA",
		"email": "casey.evans@neteria.ca",
		"phone": "+1 (989) 576-2758",
		"address": "940 Norfolk Street, Keller, Iowa, 6578",
		"about": "Do Lorem ullamco laborum ex qui qui ea ullamco deserunt aliquip reprehenderit sint dolore. Amet est dolor minim officia. Non irure sint mollit aute sunt ad enim id ullamco amet excepteur minim. Deserunt cillum esse do cupidatat cupidatat dolor nostrud proident pariatur laborum minim incididunt. Adipisicing eiusmod nulla aliquip in ea commodo anim irure ex qui culpa sint. Cupidatat fugiat est laboris culpa occaecat veniam qui eiusmod. Laborum qui dolore est ipsum anim.",
		"registered": "Monday, August 25, 2014 11:26 PM",
		"latitude": "52.117994",
		"longitude": "-9.442317",
		"tags": [
			"anim",
			"est",
			"excepteur",
			"esse",
			"voluptate",
			"nulla",
			"anim",
			"custom_tag"
		],
		"range": [
			0,
			1,
			2,
			3,
			4,
			5,
			6,
			7,
			8,
			9
		],
		"friends": [
			{
				"id": 0,
				"name": "Frazier Schwartz"
			},
			{
				"id": 1,
				"name": "Ellis Fuller"
			},
			{
				"id": 2,
				"name": "Laurel Hill"
			}
		],
		"greeting": "Hello, Casey! You have 5 unread messages.",
		"favoriteFruit": "apple"
	}
]

Added public/json-url-master/webpack.config.js.































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* eslint-disable import/unambiguous */
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
	entry: './src/main/browser-index.js',
	output: {
		library: 'JsonUrl',
		libraryTarget: 'umd',
		libraryExport: 'default',
		filename: 'json-url.js',
		chunkFilename: 'json-url-[name].js',
		path: __dirname + '/dist/browser'
	},
	module: {
		rules: [
			{
				test: /\.js$/,
				exclude: /(node_modules|bower_components)/,
				use: {
					loader: 'babel-loader',
					options: {
						babelrc: false,
						presets: ['@babel/preset-env'],
						plugins: [
							'@babel/plugin-syntax-dynamic-import',
							['module-resolver',
								{
									root: ["src"],
									alias: {
										lzma: require.resolve('lzma/src/lzma_worker-min'),
										bluebird: require.resolve('bluebird/js/browser/bluebird.core.min.js')
									}
								}
							],
							'@babel/plugin-transform-runtime',
						]
					}
				}
			}
		],
	},
	plugins: [
		new UglifyJSPlugin({
			comments: false
		})
	]
};

Added public/json-url-master/webpack.config.single.js.

















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* eslint-disable import/unambiguous */
const webpack = require('webpack');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
	entry: './src/main/browser-index.js',
	output: {
		library: 'JsonUrl',
		libraryTarget: 'umd',
		libraryExport: 'default',
		filename: 'json-url-single.js',
		path: __dirname + '/dist/browser'
	},
	module: {
		rules: [
			{
				test: /\.js$/,
				exclude: /(node_modules|bower_components)/,
				use: {
					loader: 'babel-loader',
					options: {
						babelrc: false,
						presets: ['@babel/preset-env'],
						plugins: [
							'@babel/plugin-syntax-dynamic-import',
							['module-resolver',
								{
									root: ["src"],
									alias: {
										lzma: require.resolve('lzma/src/lzma_worker-min'),
										bluebird: require.resolve('bluebird/js/browser/bluebird.core.min.js')
									}
								}
							],
							'@babel/plugin-transform-runtime',
						]
					}
				}
			}
		],
	},
	node: {
		global: false
	},
	plugins: [
		new UglifyJSPlugin({
			comments: false
		}),
		new webpack.optimize.LimitChunkCountPlugin({
			maxChunks: 1
		}),
		new webpack.DefinePlugin({
			 global: 'window'
		})
	]
};

Added public/misc.js.































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271

function initWinamp(preset) {
    var can = document.getElementById("visual");
    can.height = window.innerHeight - document.getElementById("header-playback").clientHeight - 75;
    can.width = window.innerWidth;
    var can_container = document.getElementById("canvas-container");
    can_container.width = window.innerWidth;
    var visualizer = window.butterchurn.default.createVisualizer(Tone.getContext().rawContext, can, {
        height: window.innerHeight - document.getElementById("header-playback").clientHeight - 75,
        width: window.innerWidth,
        meshWidth: 24,
        meshHeight: 18,
    });
    visualizer.connectAudio(Tone.getContext().destination);
    const presets = window.butterchurnPresets.getPresets();
    const presetParam = presets[preset];
    visualizer.loadPreset(presetParam, 0.0); // 2nd argument is the number of seconds to blend presets
    return visualizer;
}

function guard(range) {
    var state = null;
    return function (val) {
        if ((val >= range[0]) && (val <= range[1])) {
            state = val;
            return val;
        } else {
            return state;
        }
    }
}

function hex2bin(hex) {
    var letters = hex.replace('`1','a');
    letters = hex.replace('`2','b');
    letters = hex.replace('`3','c');
    letters = hex.replace('`4','d');
    letters = hex.replace('`5','e');
    letters = hex.replace('`6','f');
    letters = letters.split('');
    var bin = "";
    letters.map(function(letter) {
        if (letter == "0") {
            bin += "0000";
        }
        if (letter == "1") {
            bin += "0001";
        }
        else if (letter == "2") {
            bin += "0010";
        }
        else if (letter == "3") {
            bin += "0011";
        }
        else if (letter == "4") {
            bin += "0100";
        }
        else if (letter == "5") {
            bin += "0101";
        }
        else if (letter == "6") {
            bin += "0110";
        }
        else if (letter == "7") {
            bin += "0111";
        }
        else if (letter == "8") {
            bin += "1000";
        }
        else if (letter == "9") {
            bin += "1001";
        }
        else if (letter == "a") {
            bin += "1010";
        }
        else if (letter == "b") {
            bin += "1011";
        }
        else if (letter == "c") {
            bin += "1100";
        }
        else if (letter == "d") {
            bin += "1101";
        }
        else if (letter == "e") {
            bin += "1110";
        }
        else if (letter == "f") {
            bin += "1111";
        }

    })
    return bin;
}


function pattern_clean(p) {
    if (!p) {
        return "";
    }
    p = p.replace(/ /g, "");
    var fc = p.split('')[0];
    if (fc== "p") {
        var ptype = "xo";
        var l = (p.length - 1);
    }
    else if (fc== "b") {
        var l = (p.length - 1);
        var ptype = "bin";
    }
    else {
        var ptype = "hex";
        var l = (p.length) * 4;
    }

    if (ptype == "bin") {
        var fp =  p.substring(1);
    } else if (ptype == "xo") {
        var fp = p.substr(1);
        fp = fp.replace(/x/g, "1");
    } else {
        var fp = hex2bin(p);
    }

    return fp;
}

function download(data, filename, type) {
    var file = new Blob([data], { type: type });
    if (window.navigator.msSaveOrOpenBlob) // IE10+
        window.navigator.msSaveOrOpenBlob(file, filename);
    else { // Others
        var a = document.createElement("a"),
            url = URL.createObjectURL(file);
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        setTimeout(function () {
            document.body.removeChild(a);
            window.URL.revokeObjectURL(url);
        }, 0);
    }
}

// https://stackoverflow.com/questions/15762768/javascript-math-round-to-two-decimal-places
function roundTo(n, digits) {
    var negative = false;
    if (digits === undefined) {
        digits = 0;
    }
    if (n < 0) {
        negative = true;
        n = n * -1;
    }
    var multiplicator = Math.pow(10, digits);
    n = parseFloat((n * multiplicator).toFixed(11));
    n = (Math.round(n) / multiplicator).toFixed(digits);
    if (negative) {
        n = (n * -1).toFixed(digits);
    }
    return n;
}


function knob(options) {
    options = options || {};
    var context = {};
    context.ramp = options.ramp || [0 , 1];
    context.count_skip = options.speed || 4;
    context.step = options.step || 0.01;
    context.reverse = options.reverse || true;
    context.number = options.number || null;

    context.current_count = 0;
    context.index = 0;
    context.val = window.cellx.cellx(options.initial || 0.5)

    function changeContext() {
        context.next_val = context.ramp[context.index + 1];

        context.val(context.ramp[context.index]);
        if (context.val() > context.next_val) {
            context.direction = -1;
        } else {
            context.direction = 1;
        }
    }

    changeContext();

    return {
        "cell": context.val,
        "push": function (val) {
            context.ramp.push(val);
        },
        "replace": function (val) {
            context.ramp = val;
        },
        "speed": function (val) {
            context.count_skip = val;
        },
        "step": function (val) {
            context.step = val;
        },
        "up": function (val) {
            val = val || 0.1;
            context.ramp.push(context.ramp[context.ramp.length - 1] + val);
        },
        "down": function (val) {
            val = val || -0.1;
            context.ramp.push(context.ramp[context.ramp.length - 1] + val);
        },
       "move": function () {
            if (context.current_count >= context.count_skip) {
                context.current_count = 1;

                if (context.direction == 1) {
                    var cmp = function () {
                        return (context.val() >= context.next_val);
                    };
                } else {
                    var cmp = function () {
                        return (context.next_val >= context.val());
                    };
                }

                if (cmp()) {
                    context.val(context.next_val);
                    context.index = context.index + 1;
                    if (context.index === context.ramp.length -1) {
                        if (context.reverse) {
                            context.index = 0;
                            context.ramp = context.ramp.reverse();
                        } else {
                            context.index = context.index - 1;
                        }
                    }
                    changeContext();
                    context.val(context.val() + context.step * context.direction);
                    if (context.number) context.number(context.val());
                } else {
                    context.val(context.val() + context.step * context.direction);
                    if (context.number) context.number(context.val());
                }
            } else {
                context.current_count += 1;
            }

           return context.val();
        }
    }
}

function timedKnob(options) {
    options = options || {};
    var context = {};
    context.interval = options.interval || 100;
    context.knob = knob(options);

    context.timer = setInterval(function () {
       context.knob.move();
    }, context.interval);

    context.knob["clear"] = function () {
        clearInterval(context.timer);
    }

    return context.knob;
}

Added public/nexus-js/CHANGELOG.md.





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Changelog

All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.

### [2.1.6](https://github.com/nexus-js/ui/compare/v2.1.5...v2.1.6) (2020-08-29)

### [2.1.5](https://github.com/nexus-js/ui/compare/v2.1.4...v2.1.5) (2020-07-26)

### [2.1.4](https://github.com/nexus-js/ui/compare/v2.1.3...v2.1.4) (2020-06-05)

### [2.1.3](https://github.com/nexus-js/ui/compare/v2.1.2...v2.1.3) (2020-05-17)


### Bug Fixes

* ([#138](https://github.com/nexus-js/ui/issues/138)) [#179](https://github.com/nexus-js/ui/issues/179) ([f08069c](https://github.com/nexus-js/ui/commit/f08069c1473b783dd802b1291cc02863e8b6a997))
* Nexus.tune.createScale() does not produce expected scale ([#138](https://github.com/nexus-js/ui/issues/138)) ([449fbd5](https://github.com/nexus-js/ui/commit/449fbd5be320bc63bd6f385b2fe6ee33b8a18d85))
* numberOfSliders does not change number of sliders for Multislider ([#161](https://github.com/nexus-js/ui/issues/161)) ([bdb3700](https://github.com/nexus-js/ui/commit/bdb370014a3a2d01f485adaa87632b38eb23dd92))

### [2.1.2](https://github.com/nexus-js/ui/compare/v2.1.1...v2.1.2) (2020-03-31)

### [2.1.1](https://github.com/nexus-js/ui/compare/v2.1.0...v2.1.1) (2020-03-31)

## [2.1.0](https://github.com/nexus-js/ui/compare/v2.0.13...v2.1.0) (2020-03-31)


### Features

* add padding to sequencer ([#150](https://github.com/nexus-js/ui/issues/150)) [#178](https://github.com/nexus-js/ui/issues/178) ([1672cc3](https://github.com/nexus-js/ui/commit/1672cc36c57cc2c2531c01121b0226a918473307))
* add padding to sequencer ([#150](https://github.com/nexus-js/ui/issues/150)) [#178](https://github.com/nexus-js/ui/issues/178) ([b50f1b6](https://github.com/nexus-js/ui/commit/b50f1b6940296befeb995364a6654c682fdb66e7))
* support for vertical orientation ([#115](https://github.com/nexus-js/ui/issues/115)) ([bb24906](https://github.com/nexus-js/ui/commit/bb24906be84e343fb1168c9cac1e893375670439))
* support for vertical orientation ([#115](https://github.com/nexus-js/ui/issues/115)) ([2dd86ad](https://github.com/nexus-js/ui/commit/2dd86ad45ba940483d018078a3b8283d5e916ae6))

### [2.0.13](https://github.com/nexus-js/ui/compare/v2.0.12...v2.0.13) (2020-03-17)

Added public/nexus-js/CODE_OF_CONDUCT.md.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting active members of the project team. All complaints will  be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

Added public/nexus-js/CONTRIBUTING.md.















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Contributing

A pre-emptive thank you for contributing! Open Source projects like this one survive with the active participation of community members who can help push it forward.

When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change. 

## Pull Request Process

Before sending a Pull Request, please make sure that you're assigned the task on a GitHub issue.

* A Pull Request has a higher chance of being accepted if the work has been acknowledged and assigned by the team.
* If a relevant issue exists, please discuss on the issue and get it assigned to yourself on Github.
* If no relevant issue exists, open a new issue and get it assigned to yourself on GitHub.
* Please do not commit any build / install dependencies directly to the repo.
* Whenever possible, update the JSDocs annotations and/or README.md with relevant changes. Online documentation is generated by running `npm run docgen`.
* Increase the version numbers in any examples files and the README.md to the new version that this Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/).
  * We use [standard-version](https://github.com/conventional-changelog/standard-version) to automatically bump versions in the package.json and write to the CHANGELOG.
  * Call it using `npm run release`.
* Please respond to discussion during Review of your Pull Request.

## Code of Conduct

This project and everyone participating in it is governed by the [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code.

Added public/nexus-js/README.md.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
# NexusUI 

##### Version 2

NexusUI is a JavaScript toolkit of web audio interfaces and other helper methods for building instruments in the browser.

For more info, see the [website](http://nexus-js.github.io/ui/).

For documentation and tutorials, see [the API](http://nexus-js.github.io/ui/api/).

Join us on our [Discord](https://discord.gg/gFMXnyK) to chat about NexusUI current and future developments. Also join us if you need help using any of the components.

Added public/nexus-js/api/api.json.

more than 10,000 changes

Added public/nexus-js/api/index.html.



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
<!doctype html>
<html>

<head>
  <meta charset='utf-8' />
  <title>NexusUI API</title>
  <meta name='viewport' content='width=device-width,initial-scale=1'>
  <link rel="icon" type="image/png" href="../favicon.png" />
  <link href="https://fonts.googleapis.com/css?family=Muli:400,700" rel="stylesheet">
  <script src="js/jquery.js"></script>
  <link rel='stylesheet' href='prism/prism.css' />
  <script src="prism/prism.js"></script>
  <script src="js/moustache.min.js"></script>
  <script src="../dist/NexusUI.js"></script>
  <script src="js/Tone9.js"></script>
</head>

<body class='documentation'>


  <div id="menu-tab" onclick="toggleSidebar()">
    <img src="media/hamburger.png" width="40px">
  </div>

  <div id="sidebar" class="menuClosed" onmouseover="document.body.style.overflow='hidden';" onmouseout="document.body.style.overflow='auto';">

    <h2>NexusUI</h2>
    <a href="#intro">Getting Started</a><br />
    <a href="#colors">Changing Colors</a><br />
    <a href="#rack">Creating a Rack</a><br />
    <a href="#sync">Syncing Number Boxes</a><br />

    <h2>Interfaces</h2>

    <h3>Core</h3>
    <a href="#Button">Button</a><br />
    <a href="#Dial">Dial</a><br />
    <a href="#Number">Number</a><br />
    <a href="#Position">Position</a><br />
    <a href="#Slider">Slider</a><br />
    <a href="#Toggle">Toggle</a><br />

    <h3>General</h3>
    <a href="#Envelope">Envelope</a><br />
    <a href="#Multislider">Multislider</a><br />
    <a href="#Piano">Piano</a><br />
    <a href="#RadioButton">RadioButton</a><br />
    <a href="#Select">Select</a><br />
    <!--  <a href="#Range">range</a><br /> -->
    <a href="#Sequencer">Sequencer</a><br />
    <a href="#TextButton">TextButton</a><br />
    <!--  <a href="#Waveform">waveform</a><br /> -->


    <h3>Mobile</h3>
    <a href="#Tilt">Tilt</a><br />

    <h3>Spatialization</h3>
    <a href="#Pan">Pan</a><br />
    <a href="#Pan2D">Pan2D</a><br />

    <h3>Visualization</h3>
    <a href="#Meter">Meter</a><br />
    <a href="#Oscilloscope">Oscilloscope</a><br />
    <a href="#Spectrogram">Spectrogram</a><br />


    <h2>Tuning</h2>
    <a href="#tune">Tune</a><br />

    <h2>Timing</h2>
    <a href="#interval">Interval</a><br />

    <h2>Models</h2>
    <a href="#counter">Counter</a><br />
    <a href="#sequence">Sequence</a><br />
    <a href="#drunk">Drunk</a><br />
    <a href="#matrix">Matrix</a><br />

    <h2>Helpers</h2>
    <a href="#ri">ri (random integer)</a><br />
    <a href="#rf">rf (random float)</a><br />
    <a href="#clip">clip</a><br />
    <a href="#scale">scale</a><br />
    <a href="#mtof">mtof</a><br />
    <a href="#interp">interp</a><br />
    <a href="#pick">pick</a><br />
    <a href="#octave">octave</a><br />
    <a href="#distance">distance</a><br />
    <a href="#average">average</a><br />
    <a href="#coin">coin</a><br />

  </div>

  <div id="tutorial" class="tutorial">

    <div id="target"></div>

    <script id="template" type="x-tmpl-mustache">
      <h2>{{ name }}</h2>

    <div class="overview" >
    {{ description }}
      <br />
      <div id="demo">
        {{{ demo }}}
      </div>
    </div>


    {{#examples}}
      <div class="code-basic">
        {{title}}:
        <pre class="example"><code class="language-javascript">{{ description }}</code></pre>
      </div>
    {{/examples}}


    <div class="output">
      <h4>Events</h4>
      {{ #outputs }}
        <h5>{{{ name }}}</h5>
        {{{ description }}} <br />
        {{ #example }}
          <pre class="example"><code class="language-javascript">{{ example }}</code></pre>
        {{ /example }}
      {{ /outputs }}
    </div>


    <h4>Properties & Methods</h4>

    <div class="properties">

      {{#properties}}
        <div class="property">
          <div class="property-name">{{ name }}</div>
          <div class="property-type">{{{ type }}}</div>
          <div class="property-description">{{{ description }}}</div>
          {{ #example }}
            <pre class="example property-example"><code class="language-javascript">{{ code }}</code></pre>
            <div class="example-toggle">Example</div>
          {{ /example }}
        </div>
      {{/properties}}

    </div>

    <div class="methods">

      {{#methods}}
        <div class="method">
          <div class="method-name">{{ name }}(
            {{#parameters}}
              {{name}}{{^last}}, {{/last}}
            {{/parameters}}
          )</div>
          <div class="method-description">{{{ description }}}</div>
          {{ #example }}
            <pre class="example method-example"><code class="language-javascript">{{ code }}</code></pre>
            <div class="example-toggle">Example</div>
          {{ /example }}
        </div>
      {{/methods}}

    </div>



    <div class="examples">

      {{#tutorials}}
        <div class="codepen">
          <h3>Example: {{name}}</h3>
          {{{codepen}}}
          {{description}}
        </div>
      {{/tutorials}}

    </div>

    </script>










    <script id="helper-template" type="x-tmpl-mustache">

      <h2>Helper Methods</h2>

      {{#helpers}}
        <div class="method" id="{{ name }}">
          <div class="method-name">{{ name }}(
            {{#parameters}}
              {{name}}{{^last}}, {{/last}}
            {{/parameters}}
          )</div>
          <div class="method-description">{{{ description }}}</div>
          <table style="padding: 5px">
            {{#parameters}}
              <tr>
                  <td style="padding:5px 10px">
                    <b>{{name}}:</b>
                  </td>
                  <td style="padding:5px 10px">
                    <i>{{type}}</i>
                  </td>
                  <td style="padding:5px 10px">
                    {{description}}
                  </td>
              </tr>
            {{/parameters}}
          </table>
          <pre class="example"><code class="language-javascript">{{ example }}</code></pre>
        </div>
      {{/helpers}}

      <br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />

    </script>

  </div>












  <!--

  GETTING STARTED

  -->

  <div id="intro" class="custom-tutorial" style="display:none">
    &nbsp;
    <h1 style="margin: 5px auto;width:100%;font-size:27pt;font-weight:700;">NexusUI</h1>
    <h2 style="margin: 10px auto 0px;width:100%;font-size:18pt;font-weight:normal">Web Audio Interfaces</h2>
    <h3 style="margin: 10px auto 0px;width:100%;font-size:14pt;font-weight:normal">Version 2</h3>

    <div style="margin:0px auto">

      <div id="splash-demo" style="width:400px;text-align:center;margin:0 auto">
      </div>


      <p class="lib-overview">
        NexusUI is a collection of HTML5 interfaces and Javascript helper functions to assist with building web audio instruments in the browser.
      </p>

      <p class="lib-overview">
        In addition to interfaces, the toolkit contains some helpers for tuning and timing. It does not provide any sound-making capabilities –– for that, check out <a href="http://tonejs.github.io" target="blank">Tone.js</a>, <a href="https://github.com/sebpiq/WebPd" target="blank">WebPD</a>, <a
          href="https://github.com/charlieroberts/gibber.audio.lib" target="blank">Gibber.lib</a>, or the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API" target="blank">Web Audio API</a>.
      </p>

      <p class="lib-overview">
        This toolkit is designed to help you rapidly prototype your musical ideas. It is lacking some features which would be useful for production –– for example, these interfaces are <b>not responsive</b> (they do not understand percentage widths and heights). NexusUI is an ongoing open-source
        project; please get in touch on GitHub if you would like to contribute.
      </p>


    </div>

    <h5>Setup</h5>

    <p>
      Download <a href="https://cdn.jsdelivr.net/npm/nexusui@latest/dist/NexusUI.js" download>NexusUI.js</a>. <br />
      (The link grabs the latest version of the file directly from our NPM.)
    </p>

    <p>
      Or access on a CDN if you want a hosted file:
    </p>
    <ul>
      <li><a href="https://cdn.jsdelivr.net/npm/nexusui@latest/dist/NexusUI.js">Development</a></li>
      <li><a href="https://cdn.jsdelivr.net/npm/nexusui@latest/dist/NexusUI.min.js">Production</a></li>
    </ul>



    <p>
      Link to NexusUI.js in your HTML file.
    </p>

    <pre><code class="language-html">
&lt;html&gt;
  &lt;head&gt;
    &lt;script src="path/to/NexusUI.js"&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;

  &lt;/body&gt;
&lt;/html&gt;
       </code></pre>

    <h5>Creating an Interface</h5>

    <p>
      You can transform regular HTML elements into NexusUI interfaces (&lt;div&gt; is recommended). By default, the interface component will adopt the height and width of the target element as specified in your CSS or in the element's style. Alternatively, you can specify the interface component's
      size in JavaScript when you create it (see the API for each interface).
    </p>

    <pre><code class="language-html">
&lt;html&gt;
  &lt;head&gt;
    &lt;script src="path/to/NexusUI.js"&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;

    &lt;div id="dial"&gt;&lt;/div&gt;

    &lt;script&gt;
      var dial = new Nexus.Dial('#dial')
    &lt;/script&gt;

  &lt;/body&gt;
&lt;/html&gt;
       </code></pre>

    <p>
      You can also transform many elements at once by <a href="#rack">creating a rack</a>.
    </p>




    <h5>Dynamically Adding and Removing Interfaces</h5>

    <p>
      You can also dynamically add interfaces to your page at any point using <b>Nexus.Add</b>. This lets you add many interfaces to the same parent element. You can later remove the interface using the interface's <b>.destroy()</b> method.
    </p>

    <pre><code class="language-html">
&lt;html&gt;
 &lt;head&gt;
   &lt;script src="path/to/NexusUI.js"&gt;&lt;/script&gt;
 &lt;/head&gt;
 &lt;body&gt;

   &lt;div id="instrument"&gt;&lt;/div&gt;

   &lt;script&gt;
     var dial = Nexus.Add.Dial('#instrument',{
       'size': [100,100]
     });

     var slider = Nexus.Add.Slider('#instrument',{
       'size': [25,100]
     });

     // then, to remove them tlater
     dial.destroy();
     slider.destroy();
   &lt;/script&gt;

 &lt;/body&gt;
&lt;/html&gt;
      </code></pre>

    <!--
       <p data-height="265" data-theme-id="0" data-slug-hash="GmEJVL" data-default-tab="html,result" data-user="taylorbf" data-embed-version="2" data-pen-title="Basic Dial" class="codepen">See the Pen <a href="https://codepen.io/taylorbf/pen/GmEJVL/">Basic Dial</a> by Ben Taylor (<a href="http://codepen.io/taylorbf">@taylorbf</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

       <p data-height="265" data-theme-id="0" data-slug-hash="ygGMxq" data-default-tab="js,result" data-user="taylorbf" data-embed-version="2" data-pen-title="MT Test" class="codepen">See the Pen <a href="http://codepen.io/taylorbf/pen/ygGMxq/">MT Test</a> by Ben Taylor (<a href="http://codepen.io/taylorbf">@taylorbf</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script> -->


    <h5>Listening for Interaction Events</h5>

    <p>
      Every NexusUI interface fires an event function when the interface is interacted with or changed programatically through the interface's API. If you use Node.JS, this syntax should look familiar –– every NexusUI interface extends Node.js's built-in EventEmitter.
    </p>

    <pre><code class="language-js">
var dial = new Nexus.Dial("#dial");

dial.on('change',function(v) {
  // v holds the new numeric value of the dial
});
       </code></pre>

    <p>
      Many of the core interfaces also fire events on mouse click and mouse release. The following interfaces accept click and release events: button, dial, number, pan, pan2d, position, slider, textbutton, toggle. We hope to develop this feature for all interfaces in the future.
    </p>

    <pre><code class="language-js">
 var slider = new Nexus.Slider("#slider");

 slider.on('click',function() {
   console.log('clicked!');
 });

 slider.on('release',function() {
   console.log('released');
 });
        </code></pre>

    <!--   <p>
        Example:
       </p>

       <p data-height="265" data-theme-id="0" data-slug-hash="jmwPgq" data-default-tab="js,result" data-user="taylorbf" data-embed-version="2" data-pen-title="Dial Event" class="codepen">See the Pen <a href="https://codepen.io/taylorbf/pen/jmwPgq/">Dial Event</a> by Ben Taylor (<a href="http://codepen.io/taylorbf">@taylorbf</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

    <!--   <p data-height="265" data-theme-id="0" data-slug-hash="YVQXEL" data-default-tab="js,result" data-user="taylorbf" data-embed-version="2" data-pen-title="MT - Interface Event Demo" class="codepen">See the Pen <a href="http://codepen.io/taylorbf/pen/YVQXEL/">MT - Interface Event Demo</a> by Ben Taylor (<a href="http://codepen.io/taylorbf">@taylorbf</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script> -->

    <h5>Interface Options</h5>

    <p>
      Each interface has an API through which you can customize its values and interaction modes. Common options include:
      <ul>
        <li>
          Setting a numeric range for the value of the interface
        </li>
        <li>
          Absolute or relative mouse interaction
        </li>
        <li>
          Vertical, horizontal, or radial (for dials) interaction &amp; orientation
        </li>
      </ul>
    </p>

    <p>
      Example:
    </p>

    <p data-height="265" data-theme-id="0" data-slug-hash="BRZNvg" data-default-tab="js,result" data-user="taylorbf" data-embed-version="2" data-pen-title="MT - Interface Options Demo" class="codepen">See the Pen <a href="http://codepen.io/taylorbf/pen/BRZNvg/">MT - Interface Options Demo</a> by Ben
      Taylor (<a href="http://codepen.io/taylorbf">@taylorbf</a>) on <a href="http://codepen.io">CodePen</a>.</p>
    <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

    <h5>Documentation</h5>

    <p>
      Check out the API for more details on interface options, as well as for tutorials on tuning and timing mechanisms.
    </p>

    <br /><br /><br />


  </div>














  <!--

      COLORS

      -->

  <div id="colors" class="custom-tutorial" style="display:none">
    &nbsp;
    <h1 style="margin: 5px auto;width:100%;font-size:27pt;font-weight:700;">Colors</h1>


    <p>
      You can change an interface's colors using <b>.colorize()</b>
    </p>

    <p data-height="266" data-theme-id="0" data-slug-hash="eRdNaB" data-default-tab="js,result" data-user="taylorbf" data-embed-version="2" data-pen-title="Colors" class="codepen">See the Pen <a href="https://codepen.io/taylorbf/pen/eRdNaB/">Colors</a> by Ben Taylor (<a
        href="https://codepen.io/taylorbf">@taylorbf</a>) on <a href="https://codepen.io">CodePen</a>.</p>
    <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>


    <br /><br />
    Alternately, you can set <b>Nexus.colors</b>, which will be inherited by every interface created from that point on. This is useful if you want all of your interface components to share the same color scheme.
    <a href="https://codepen.io/taylorbf/pen/zzKGgz">See example on CodePen.</a>

    <br /><br />

    <!--  <p data-height="265" data-theme-id="0" data-slug-hash="zzKGgz" data-default-tab="result" data-user="taylorbf" data-embed-version="2" data-pen-title="Colors - Inheritance" class="codepen">See the Pen <a href="https://codepen.io/taylorbf/pen/zzKGgz/">Colors - Inheritance</a> by Ben Taylor (<a href="https://codepen.io/taylorbf">@taylorbf</a>) on <a href="https://codepen.io">CodePen</a>.</p>
          <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script> -->

    <!--  <p data-height="265" data-theme-id="0" data-slug-hash="zzKGgz" data-default-tab="js,result" data-user="taylorbf" data-embed-version="2" data-pen-title="Colors - Inheritance" class="codepen">See the Pen <a href="https://codepen.io/taylorbf/pen/zzKGgz/">Colors - Inheritance</a> by Ben Taylor (<a href="https://codepen.io/taylorbf">@taylorbf</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script> -->

    A complete list of color properties used in the interfaces are:
    <b>accent</b>,
    <b>fill</b>,
    <b>dark</b>,
    <b>light</b>,
    <b>mediumDark</b>,
    <b>mediumLight</b>.
    Not all interfaces use all of these colors.

  </div>











  <!--

        RACK

        -->

  <div id="rack" class="custom-tutorial" style="display:none">
    &nbsp;
    <h1 style="margin: 5px auto;width:100%;font-size:27pt;font-weight:700;">Creating a Rack</h1>


    <p>
      You can create many interface components at once using <b>Nexus.Rack()</b>. Here is an example:
    </p>

    <p data-height="265" data-theme-id="0" data-slug-hash="RgGMJm" data-default-tab="html,result" data-user="taylorbf" data-embed-version="2" data-pen-title="Creating a Rack" class="codepen">See the Pen <a href="https://codepen.io/taylorbf/pen/RgGMJm/">Creating a Rack</a> by Ben Taylor (<a
        href="https://codepen.io/taylorbf">@taylorbf</a>) on <a href="https://codepen.io">CodePen</a>.</p>
    <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

    <!--<iframe width="100%" height="300" src="//jsfiddle.net/suncannon/e8vtubc2/1/embedded/js,html,result/dark/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
-->
    <br /><br />


    First, create an element that will be the container of the rack.
    <br /><br />
    Inside that container, create several elements with <b>nexus-ui</b> attributes describing what type of interface it should transform into, such as <b>nexus-ui="dial"</b>.
    <br /><br />
    Give each interface element an ID which will be used to identify it in JavaScript later.
    <br /><br />
    In your JavaScript, use <b>new Nexus.Rack("#containerID")</b> to transform the container element into a rack. When this happens, any elements inside the container with valid <b>nexus-ui</b> attributes will be transformed into interface elements.


    <h5>Using a Custom Attribute</h5>

    <p>
      Nexus.Rack optionally lets you specify which attribute to look for ('nexus-ui' by default). This is useful for using NexusUI with React, which requires <i>data-</i> attribute prefixes.
    </p>

    <p>
      HTML:
    </p>

    <pre><code class="language-html">
  &lt;div id="target"&gt;
    &lt;div data-nx="dial"&gt;&lt;/div&gt;
  &lt;/div&gt;
                </code></pre>


    <p>
      JS:
    </p>

    <pre><code class="language-javascript">
  var synth = new Nexus.Rack("#target",{
    attribute: 'data-nx'
  })
                </code></pre>


    <br /><br />

    <h5>Rack Methods</h5>

    <b>.hide()</b><br />
    <b>.show()</b><br />
    <b>.colorize()</b> (See <a href="#colors">changing colors</a>)
    <br />
    <br /><br />


  </div>


  </div>









  <!--

          SYNCING NUMBER BOXES

          -->

  <div id="sync" class="custom-tutorial" style="display:none">
    &nbsp;
    <h1 style="margin: 5px auto;width:100%;font-size:27pt;font-weight:700;">Linking a Number Box to a Dial or Slider</h1>


    <p>
      A number box can be linked to the value of a dial or slider using <b>.link()</b>

      <br /><br />
      In this case, when the dial or slider is updated, the number box will show its numeric value. When the number box is updated or interacted with, the dial or slider will be updated to the new value as well.

    </p>

    <p data-height="265" data-theme-id="0" data-slug-hash="owdpxy" data-default-tab="js,result" data-user="taylorbf" data-embed-version="2" data-pen-title="Number Box Sync" class="codepen">See the Pen <a href="https://codepen.io/taylorbf/pen/owdpxy/">Number Box Sync</a> by Ben Taylor (<a
        href="https://codepen.io/taylorbf">@taylorbf</a>) on <a href="https://codepen.io">CodePen</a>.</p>
    <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

  </div>






  <!--

NEXUS.TUNE

-->

  <div id="tune" class="custom-tutorial" style="display:none">
    <h2>Tuning</h2>

    <p>
      <b>Nexus.note()</b> and <b>Nexus.tune</b> offer ways to manage pitches and scales.
    </p>

    <pre><code class="language-javascript">
// Nexus.note(0) returns the frequency of the 1st note of the scale
synth.frequency.value = Nexus.note(0);

// Nexus.note(2) returns the frequency of the 3rd note of the scale
synth.frequency.value = Nexus.note(2);
     </code></pre>

    <p>
      By default the scale is an equal-tempered major scale. An API for changing the scale is below.
    </p>

    <p>
      This approach emphasizes algorithmic composition by using numbers to traverse musical scales.
    </p>


    <!-- section -->

    <h3>Turning Scale Degrees to Frequency Values</h3>
    <p>
      <b>Nexus.note()</b> provides a method for turning scale degrees into frequency values which your web audio synth will understand.
    </p>

    <pre>
       <code class="language-javascript">
// Nexus.note(0) returns the frequency of 1st note of the scale
synth.frequency.value = Nexus.note(0);

// Nexus.note(1) returns the frequency of 2nd note of the scale
synth.frequency.value = Nexus.note(1);

// Negative numbers wrap to a lower octave
// Nexus.note(-1) returns the frequency of the top note of the scale, 1 octave lower
synth.frequency.value = Nexus.note(-1);

// You can also specify the octave using an optional second parameter
// Nexus.note(0,2) returns the frequency of the 1st note of the scale, 2 octaves up.
synth.frequency.value = Nexus.note(0,2);

// Nexus.note(0,-1) returns the frequency of the 1st note of the scale, 1 octave lower
synth.frequency.value = Nexus.note(0,-1);
    </code></pre>

    <p>
      By using counters or number generators in tandem with <b>Nexus.note()</b>, you can play scales, arpeggios, etc.
    </p>

    <pre>
       <code class="language-javascript">
 // Play 5 octaves of the major scale

 var counter = new Nexus.Counter( 0, 36 );

 var beat = new Nexus.Interval(200,function() {
   synth.frequency.value = Nexus.note( counter.next() );
 })
       </code>
     </pre>




    <h3>Getting Pitch Ratios or adjusted MIDI values</h3>
    <p>
      If working with an audio sample, you may wish to tune your sample by changing its playback speed.

      You can use <b>Nexus.tune.ratio()</b> to get the frequency ratio of a note to the root of your scale. This ratio can be used to set the playback speed of your sample.

      <pre>
        <code class="language-javascript">
// This gives you the pitch ratio between the 5th note in scale and the root.
Nexus.tune.ratio(4)  // returns 1.49830693925

// You can use this to set the playback speed of a sampler
sampler.playbackRate = Nexus.tune.ratio(4)
        </code>
      </pre>

    </p>



    <h3>Changing the Scale</h3>
    <p>
      By default, the scale is an equal-tempered major scale.
    </p>
    <p>
      We do not provide any other built-in scales. However, we provide two ways for you to create your own scale.
    </p>

    <h4>Describing a Scale</h4>

    To define your own scale, you can call <b>.createScale()</b> with a list of the chromatic scale degrees you want in your scale.

    <pre><code class="language-javascript">
// Create a minor scale
Nexus.tune.createScale(0,2,3,5,7,8,10);

// Now, Nexus.note() will refer to the scale you defined
Nexus.note(0) // returns the frequency number of the root
Nexus.note(1) // returns the frequency number of a Major 2nd
Nexus.note(2) // returns the frequency number of a Minor 3rd
    </code></pre>


    <h4>Describing a Just Intonation Scale</h4>

    You can also define <a href="https://en.wikipedia.org/wiki/Just_intonation">just intonation</a> scales.

    To do so, call <b>.createJIScale()</b> with your own list of pitch ratios.

    <pre><code class="language-javascript">
// Create a major scale in just intonation
Nexus.tune.createJIScale( 1/1, 9/8, 5/4, 4/3, 3/2, 8/5, 5/3, 15/8 );


// Now, Nexus.note() will refer to the scale you defined
Nexus.note(0) // returns the frequency number for ratio 1/1
Nexus.note(1) // returns the frequency number for ratio 9/8
Nexus.note(2) // returns the frequency number for ratio 5/4
    </code></pre>



    <h3>Changing the root </h3>
    <p>
      By default, the root of the scale is Middle C. Therefore, <b>Nexus.note(0)</b> returns the frequency for Middle C.
    </p>

    <p>
      You can set the root using <b>Nexus.tune.root</b>, which is a frequency value.
    </p>

    <pre><code class="language-javascript">
// Set the root to 3 octaves below Middle C.
Nexus.tune.root = Nexus.note(0,-3);
    </code></pre>

    In this way, you can change your scale root on the fly by setting it to other notes of the scale you are currently using.

    <p>
      The root can also be set using traditional musical values like "C3" or "A1". This is the only place in this toolkit where this type of music notation is used.
    </p>

    <pre><code class="language-javascript">
// Set the root to low A.
Nexus.tune.root = "A1";
    </code></pre>


    <p>
      You can also set Nexus.tune.root direction to a frequency value, for example if you are working in Just Intonation.
    </p>

    <pre><code class="language-javascript">
// Set the root of your scale to 120hz.
Nexus.tune.root = 120;
    </code></pre>


    <!--

    <h3>Examples</h3>

    <p>
      Codepen for: scale over 5 octaves
    </p>

    <p>
      Codepen for: arpeggio
    </p>

    <p>
      Codepen for: melody and rhythm
    </p>

    <p>
      Codepen for: custom scales
    </p>

    <!--     <pre><code class="language-javascript">
    // Every 100ms, play a random note from a random octave in the major scale
    mt.interval(100,function() {
     var scaleDegree = mt.ri( 0, mt.tune.scale.length );
     var octave = mt.ri( -3 , 3 );
     synth1.frequency.value = mt.tune.note( scaleDegree, octave ); // returns the root
    })
         </code></pre> -->




  </div>








  <!--

  TIMING

  -->

  <div id="interval" class="custom-tutorial" style="display:none">
    <h2>Timing</h2>

    <p>
      <b>Nexus.Interval</b> creates a repeating pulse using <a href="http://github.com/sebpiq/WAAClock">WAAClock</a>.
    </p>

    <pre><code class="language-javascript">
// Create a pulse of 100ms. At each pulse, the callback function is executed.

var interval = new Nexus.Interval(100, function() {
  console.log('beep');
})
       </code></pre>

    <p>
      This interval uses a web audio context to handle timing, so it is more accurate than a regular <b>setInterval</b> or <b>setTimeout</b>
    </p>




    <h3>Autostart</h3>

    <p>
      Be default, the interval will automatically start when it is created.
      However a third parameter can set autostart to false.
    </p>

    <pre><code class="language-javascript">
// Create a pulse that does not autostart.

var interval = new Nexus.Interval(100, function() {
  console.log('beep');
}, false)
      </code></pre>


    <!-- section -->

    <h3>Changing the Interval Period</h3>
    <pre><code class="language-javascript">
// Change your interval period to 200ms.
interval.ms(200)
      </code></pre>


    <!-- section -->
    <h3>All methods</h3>
    <pre><code class="language-javascript">
// Create a pulse of 1 second
var interval = new Nexus.Interval(1000, function() {
  console.log('beep');
})

// Stop the pulse
interval.stop();

// Start the pulse
interval.start();

// Change the interval time
interval.ms(200);

// Change the function that is called at each pulse
interval.event = function() {
  console.log("bloop");
}
      </code></pre>


  </div>


















  <!--

  MT.MATRIX

  -->

  <div id="matrix" class="custom-tutorial" style="display:none">
    <h2>Matrix Model</h2>

    <p>
      The Matrix Model lets you read, write, and manipulate a two-dimensional array of data (such as the data that is visualized by a <a href="#Sequencer">sequencer</a>).
    </p>
    <br />
    Creating a Matrix Model from scratch...
    <pre><code class="language-javascript">
matrix = new Nexus.Matrix(5,10);
       </code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10)
document.write(matrix.formatAsText())
</script>



</pre>






    <h3>Accessing a Matrix's Values</h3>
    <br />
    <b>matrix.pattern</b> contains a 2-dimensional JavaScript array. <b>matrix.pattern[0]</b> contains an array of the first row's values. <b>matrix.pattern[0][0]</b> contains the value of the first cell in the first row.
    <br /><br />

    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
console.log( matrix.pattern );

</code></pre>

    <br /><br /><br />








    <h3>Toggling cells</h3>
    <br />
    <b>matrix.toggle</b> flips a cell or group of cells to their opposite state
    <br /><br />

    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.toggle.cell(2,2)

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.toggle.cell(2,2)
document.write(matrix.formatAsText())
</script>



</pre>




    <pre><code class="language-javascript">
matrix.toggle.row(2)

</code></pre>

    <pre><script>
matrix.toggle.row(2)
document.write(matrix.formatAsText())
</script>



</pre>




    <pre><code class="language-javascript">
matrix.toggle.column(2)

</code></pre>

    <pre><script>
matrix.toggle.column(2)
document.write(matrix.formatAsText())
</script>



</pre>


    <pre><code class="language-javascript">
matrix.toggle.all()

</code></pre>

    <pre><script>
matrix.toggle.all()
document.write(matrix.formatAsText())
</script>



</pre>










    <!-- -->



    <h3>Setting cells</h3>
    <br />
    <b>matrix.toggle</b> flips a cell or group of cells to their opposite state
    <br /><br />

    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.set.cell(0,0,1)

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.set.cell(0,0,1)
document.write(matrix.formatAsText())
</script>



</pre>




    <pre><code class="language-javascript">
matrix.set.row(0,[0,1,0,1,0,1,0,1,0,1])

</code></pre>

    <pre><script>
matrix.set.row(0,[0,1,0,1,0,1,0,1,0,1])
document.write(matrix.formatAsText())
</script>



</pre>




    <pre><code class="language-javascript">
matrix.set.column(0,[0,1,1,1,0])

</code></pre>

    <pre><script>
matrix.set.column(0,[0,1,1,1,0])
document.write(matrix.formatAsText())
</script>



</pre>


    <pre><code class="language-javascript">
matrix.set.all([
  [0,1,0,1,0,1,0,1,0,1],
  [0,1,0,1,0,1,0,1,0,1],
  [0,1,0,1,0,1,0,1,0,1],
  [0,1,0,1,0,1,0,1,0,1],
  [0,1,0,1,0,1,0,1,0,1]
])

</code></pre>

    <pre><script>
matrix.set.all([
  [0,1,0,1,0,1,0,1,0,1],
  [0,1,0,1,0,1,0,1,0,1],
  [0,1,0,1,0,1,0,1,0,1],
  [0,1,0,1,0,1,0,1,0,1],
  [0,1,0,1,0,1,0,1,0,1]
])
document.write(matrix.formatAsText())
</script>



</pre>












    <!-- -->



    <h3>Rotating</h3>
    <br />
    <b>matrix.rotate</b> moves parts of the matrix to the right or left
    <br /><br />

    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.toggle.cell(0,0)

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.toggle.cell(0,0)
document.write(matrix.formatAsText())
</script>



</pre>




    <pre><code class="language-javascript">
matrix.rotate.row(0)

</code></pre>

    <pre><script>
matrix.rotate.row(0)
document.write(matrix.formatAsText())
</script>



</pre>



    <pre><code class="language-javascript">
matrix.rotate.row(0,4)

</code></pre>

    <pre><script>
matrix.rotate.row(0,4)
document.write(matrix.formatAsText())
</script>



</pre>




    <pre><code class="language-javascript">
matrix.rotate.column(5)

</code></pre>

    <pre><script>
matrix.rotate.column(5)
document.write(matrix.formatAsText())
</script>



</pre>


    <pre><code class="language-javascript">
matrix.rotate.all(2)

</code></pre>

    <pre><script>
matrix.rotate.all(2)
document.write(matrix.formatAsText())
</script>



</pre>










    <!-- -->



    <h3>Populating with Patterns</h3>
    <br />
    <b>matrix.populate</b> can set row or column using a pattern.
    <br /><br />

    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.populate.row( 0, [0,1] )

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.populate.row( 0, [0,1] )
document.write(matrix.formatAsText())
</script>



</pre>



    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.populate.column( 0, [0,1] )

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.populate.column( 0, [0,1] )
document.write(matrix.formatAsText())
</script>



</pre>



    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.populate.all( [0,1] )

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.populate.all( [0,1] )
document.write(matrix.formatAsText())
</script>



</pre>










    <!-- -->



    <h3>Populating with Probability</h3>
    <br />
    <b>matrix.populate</b> can set row or column using a pattern of probability values.
    <br /><br />

    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.populate.row( 0, [0.3, 0.6] )

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.populate.row( 0, [0.3, 0.3] )
document.write(matrix.formatAsText())
</script>



</pre>



    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.populate.column( 0, [0.5] )

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.populate.column( 0, [0.5] )
document.write(matrix.formatAsText())
</script>



</pre>



    <pre><code class="language-javascript">
var matrix = new Nexus.Matrix(5,10);
matrix.populate.all( [0.2, 0.5, 0.2, 0.8] )

</code></pre>

    <pre><script>
var matrix = new Nexus.Matrix(5,10);
matrix.populate.all( [0.2, 0.5, 0.2, 0.8] )
document.write(matrix.formatAsText())
</script>



</pre>







    <!--     <pre><code class="language-javascript">
  // Every 100ms, play a random note from a random octave in the major scale
  mt.interval(100,function() {
   var scaleDegree = mt.ri( 0, mt.tune.scale.length );
   var octave = mt.ri( -3 , 3 );
   synth1.frequency.value = mt.tune.note( scaleDegree, octave ); // returns the root
  })
       </code></pre> -->

    <h3>Matrix and the Sequencer Interface</h3>

    The sequencer interface uses a matrix model to hold its grid of values. You can use any of the above matrix manipulation methods on your sequencer grid, using the sequencer's <b>.matrix</b> property.
    <pre><code class="language-javascript">
  var sequencer = new Nexus.Sequencer("#target",5,10);
  sequencer.matrix.toggle.row(2);
  sequencer.matrix.set.row(1, [0,1,0,1,0,1,0,1,0,1])
      </code></pre>

    <br /><br /><br /><br />


  </div>





  <!--

    MT.COUNTER

    -->

  <div id="counter" class="custom-tutorial" style="display:none">
    <h2>Counter Model</h2>

    <p>
      A Counter model is an object with a minimal API for counting up or down.
    </p>
    <pre><code class="language-javascript">
counter = new Nexus.Counter(0,10)
counter.next()    // returns 0
counter.next()    // returns 1
counter.next()    // returns 2
// ...
counter.next()    // returns 9
counter.next()    // returns 10
counter.next()    // returns 0
         </code></pre>

    <!-- section -->

    <h3>Modes</h3>

    The counter method takes an optional third argument for the counting mode, which can be <b>up</b>, <b>down</b>, <b>drunk</b> (randomly chooses to step up or down), or <b>random</b> (chooses a random number from within the counting range).

    <pre><code class="language-javascript">
counter = new Nexus.Counter(0,10,"down")
counter.next()    // returns 10
counter.next()    // returns 9
counter.next()    // returns 8
        </code></pre>

    <h3>Properties</h3>

    <pre><code class="language-javascript">
counter.min = 10
counter.max = 100
counter.mode = "down"
counter.value = 50  // jumps the counter to this value
        </code></pre>


  </div>




  <!--

      MT.SEQUENCE

      -->

  <div id="sequence" class="custom-tutorial" style="display:none">
    <h2>Sequence Model</h2>

    <p>
      A Sequence model steps through a series of numeric values defined by you.
    </p>
    <pre><code class="language-javascript">
var sequence = new Nexus.Sequence([1,3,5,7])
sequence.next()    // returns 1
sequence.next()    // returns 3
sequence.next()    // returns 5
sequence.next()    // returns 7
sequence.next()    // returns 1
sequence.next()    // returns 3
         </code></pre>

    <!-- section -->

    <h3>Modes</h3>

    The sequence model takes an optional second argument for the sequence mode, which can be <b>up</b>, <b>down</b>, <b>drunk</b> (randomly chooses to step up or down), or <b>random</b> (chooses a random number from within the counting range).

    <pre><code class="language-javascript">
var sequence = new Nexus.Sequence([1,3,5,7],"down")
sequence.next()    // returns 7
sequence.next()    // returns 5
sequence.next()    // returns 3
sequence.next()    // returns 1
sequence.next()    // returns 7
sequence.next()    // returns 5
        </code></pre>

    <h3>Properties</h3>

    <pre><code class="language-javascript">
sequence.values = [2,4,5,8]   // updates the sequence of values
sequence.mode = "drunk"
sequence.value = 2   // this jumps to where the '2' value is in the sequence, which is index 0.
        </code></pre>


  </div>




  <!--

      MT.DRUNK

      -->

  <div id="drunk" class="custom-tutorial" style="display:none">
    <h2>Drunk Model</h2>

    <p>
      A Drunk Model does a "drunk walk" through a given range, meaning it will randomly step up or down by a given increment.
    </p>
    <pre><code class="language-javascript">
// This drunk model has a range of 0 to 100
// Its starting value is 50
// Its stepping increment is 10
var drunk = new Nexus.Drunk(0,100,50,10)
drunk.next()    // returns 40
drunk.next()    // returns 50
drunk.next()    // returns 40
drunk.next()    // returns 30
drunk.next()    // returns 40
drunk.next()    // returns 30
         </code></pre>

    <!-- section -->


    <h3>Properties</h3>

    <pre><code class="language-javascript">
drunk.min = 100
drunk.max = 1000
drunk.increment = 100
drunk.value = 500   // jumps to this value
        </code></pre>


  </div>







</body>

<script>
  var Unformatted = {}
  var API = {}
  var Helpers = []
  Nexus.context = Tone.context;

  $.getJSON('api.json', function (data) {
    data.forEach(function (entry) {
      Unformatted[entry.name] = entry
    })

    // Parse Helper doc into Helpers object
    for (var key in Unformatted) {
      if (LoadLinks.Helper.indexOf(key) >= 0) {
        var unformatted = Unformatted[key]
        var entry = {
          name: unformatted.name,
          parameters: unformatted.params,
          description: unformatted.description.children[0].children[0].value,
          returns: {
            type: unformatted.returns[0].type,
            description: unformatted.returns[0].description.children[0].children[0].value
          },
          example: unformatted.examples[0].description,
        }
        if (entry.parameters && entry.parameters.length > 0) {
          let params = []
          entry.parameters.forEach(function (param) {
            params.push({
              name: param.name,
              type: param.type.name,
              description: param.description.children[0].children[0].value
            })
          })
          entry.parameters = params
          entry.parameters[entry.parameters.length - 1].last = true
        }
        Helpers.push(entry);
      }
    }


    // Parse interface documentation into API object
    for (var key in Unformatted) {
      var unformatted = Unformatted[key]
      var entry = {
        name: unformatted.name,
        examples: unformatted.examples,
        outputs: []
      }
      var exampleTypes = ['Basic', 'With Options']
      if (entry.examples) {
        for (var i = 0; i < entry.examples.length; i++) {
          entry.examples[i].title = exampleTypes[i];
        }
      }
      for (var i = 0; i < unformatted.tags.length; i++) {
        if (unformatted.tags[i].title === "output") {
          var name = unformatted.tags[i].description.split('\n').slice(0, 1)[0]
          var desc = unformatted.tags[i].description.split('\n').slice(1).join("\n")
          entry.outputs.push({
            name: name,
            description: desc,
            example: ''
          })
        } else if (unformatted.tags[i].title === "outputexample") {
          if (entry.outputs.length - 1 >= 0) {
            entry.outputs[entry.outputs.length - 1].example = unformatted.tags[i].description
          }
        }
        entry[unformatted.tags[i].title] = unformatted.tags[i].description
      }


      // collect members
      var members = unformatted.members.instance

      //get inherited members
      if (unformatted.augments) {
        for (var i = 0; i < unformatted.augments.length; i++) {
          var name = unformatted.augments[i].name
          if (name != "EventEmitter") {
            members = members.concat(Unformatted[name].members.instance)
            if (Unformatted[name].augments) {
              unformatted.augments.push(Unformatted[name].augments[0])
            }
          }
        }
      }

      //sort members
      entry.properties = []
      entry.methods = []
      for (var i = 0; i < members.length; i++) {
        if (members[i].kind == "function") {
          var method = {
            name: members[i].name,
            parameters: [],
            description: members[i].description.children[0].children[0].value,
            returns: false,
            example: false,
          }
          for (var j = 0; j < members[i].tags.length; j++) {
            var tag = members[i].tags[j]
            switch (tag.title) {
              case 'type':
                method.type = tag.type.name
                break;
              case 'example':
                method.example = {
                  code: tag.description
                }
                break;
            }
          }
          /*  parameters */
          if (members[i].params && members[i].params.length > 0) {
            for (var j = 0; j < members[i].params.length; j++) {
              method.parameters.push({
                name: members[i].params[j].name
                //  type: members[i].params[j].name,
              })
            }
            method.parameters[method.parameters.length - 1].last = true
          }

          entry.methods.push(method)
        } else {
          var property = {
            name: members[i].name,
            description: members[i].description.children[0].children[0].value,
            type: '',
            example: false
          }
          for (var j = 0; j < members[i].tags.length; j++) {
            var tag = members[i].tags[j]
            switch (tag.title) {
              case 'type':
                property.type = tag.type.name
                if (TypeLinks.indexOf(property.type) >= 0) {
                  property.type = '<a href="#' + property.type + '">' + property.type + '</a>';
                }
                break;
              case 'example':
                property.example = {
                  code: tag.description
                }
                break;
            }
          }
          entry.properties.push(property);
        }
      }

      /* alphabetize members */
      //  for (var i=0; i<entry.properties.length;i++) {
      entry.properties.sort(function (a, b) {
        return a.name.localeCompare(b.name);
      });
      entry.methods.sort(function (a, b) {
        return a.name.localeCompare(b.name);
      });
      //  }



      entry.tutorials = []
      for (var i = 0; i < unformatted.tags.length; i++) {
        if (unformatted.tags[i].title == 'tutorial') {
          var contents = unformatted.tags[i].description
          var name = contents.split("\n")[0]
          var codepen = contents.split("\n")[1]
          var description = contents.split("\n")[2]
          entry.tutorials.push({
            description: description,
            name: name,
            codepen: '<p data-height="265" data-theme-id="0" data-slug-hash="' + codepen + '" data-default-tab="js,result" data-user="taylorbf" data-embed-version="2" data-pen-title="' + codepen + '" class="codepen">See the Pen <a href="http://codepen.io/taylorbf/pen/' + codepen + '/">' +
              codepen + '</a> by Ben Taylor (<a href="http://codepen.io/taylorbf">@taylorbf</a>) on <a href="http://codepen.io">CodePen</a>.</p><scr' + 'ipt async src="https://production-assets.codepen.io/assets/embed/ei.js"></scr' + 'ipt>'
          })
        }
      }



      API[key] = entry
    }


    //load hash
    if (window.location.hash) {
      var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
      load(hash);
    } else {
      window.location.hash = "#intro";
    }

    window.addEventListener("hashchange", function () {
      var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
      load(hash);
      toggleSidebar(false);
      window.scrollTo(0, 0);
    }, false);

  });

  var instrument = false
  var player = player = new Tone.Player("media/D-sharp.mp3");

  function doc(name) {
    //  if (window.location.hash.substring(1)!=name) {
    //    window.location.hash = name;
    //  }
    var entry = API[name];
    var template = $('#template').html();
    Mustache.parse(template); // optional, speeds up future uses
    var rendered = Mustache.render(template, entry);
    $('#target').html(rendered);
    Prism.highlightAll();

    if (instrument) {
      try {
        instrument.empty()
      } catch (e) {
        console.log(e);
      }
    }
    instrument = new Nexus.Rack("demo");

    $(".example-toggle").click(function () {
      $(this).parent().find(".example").toggle();
    })

    if (name == "Waveform") {
      player.load("media/D-sharp.mp3", function () {
        instrument["Waveform1"].load(player.buffer._buffer)
      })
    } else if (["Meter", "Oscilloscope", "Spectrogram"].indexOf(name) > -1) {
      player.load("media/D-sharp.mp3", function () {
        player.loopStart = 0;
        player.loopEnd = 3;
        player.loop = true;
        instrument[name + "1"].connect(player, 2);
        player.start();
      })
    }
  }


  function tut(name) {
    //  if (window.location.hash.substring(1)!=name) {
    //    window.location.hash = name;
    //  }
    $('#target').empty();
    if ($("#" + name).length > 0) {
      $("#" + name).clone().appendTo('#target').show()
      Prism.highlightAll();



      if (instrument) {
        try {
          instrument.empty();
        } catch (e) {
          console.log(e);
        }
      }

      if (name == "intro") {
        var splashRack = new Nexus.Rack("splash-demo");
      }

      //  instrument = mt.rack("target");
    }
  }

  function helper(name) {

    //  if (window.location.hash.substring(1)!=name) {
    //    window.location.hash = name;
    //  }


    if (instrument) {
      try {
        instrument.empty();
      } catch (e) {
        console.log(e);
      }
    }

    var entry = {
      "helpers": Helpers
    }
    var template = $('#helper-template').html();
    Mustache.parse(template); // optional, speeds up future uses
    var rendered = Mustache.render(template, entry);

    $('#target').html(rendered);
    Prism.highlightAll();

    $('html, body').animate({
      scrollTop: $("#" + name).offset().top - 20
    }, 50);


    /*  $("#"+name).css("background-color","#0af");
      $("#"+name).css("transition","background-color 1s ease");
      $("#"+name).css("background-color","#fff"); */



  }

  var TypeLinks = [
    "matrix",
    "counter",
    "interval",
  ]

  var LoadLinks = {
    "Doc": [
      'Button', 'Dial', 'Number', 'Position', 'Slider', 'Toggle',
      'Envelope', 'Sequencer', 'Multislider', 'Piano', 'RadioButton', 'Select',
      'Range', 'TextButton', 'Waveform', 'Tilt', 'Pan', 'Pan2D', 'Meter',
      'Oscilloscope', 'Spectrogram'
    ],
    "Tut": [
      'tune', 'interval', 'counter', 'sequence', 'drunk', 'matrix', 'intro', 'colors', 'rack', 'sync'
    ],
    "Helper": [
      'ri', 'rf', 'clip', 'scale', 'mtof', 'interp', 'pick', 'octave', 'distance', 'average', 'coin'
    ]
  }

  function load(name) {
    if (LoadLinks.Doc.indexOf(name) >= 0) {
      doc(name);
    } else if (LoadLinks.Tut.indexOf(name) >= 0) {
      tut(name);
    } else if (LoadLinks.Helper.indexOf(name) >= 0) {
      helper(name);
    }
    window.scrollTo(0, 0);
    document.getElementById("target").scrollTop = 0
  }

  var menuOpen = false;

  function toggleSidebar(on) {
    if (on || on == false) {
      menuOpen = !on;
    }
    if (menuOpen) {
      $("#sidebar").removeClass("menuOpen")
      $("#sidebar").addClass("menuClosed")
      menuOpen = false;
    } else {
      $("#sidebar").removeClass("menuClosed")
      $("#sidebar").addClass("menuOpen")
      menuOpen = true;
    }
  }
</script>
<style>
  body {
    font-family: 'Muli', helvetica;
    padding: 0;
    margin: 0;
    width: 100%;
    user-select: #000 !important;
  }

  #menu-tab {
    display: none;
  }

  #sidebar {
    position: fixed;
    height: 100%;
    top: 0px;
    overflow: auto;
    width: 225px;
    padding: 10px 15px 15px;
    box-sizing: border-box;
    z-index: 5;
  }

  #tutorial {
    margin-left: 225px;
  }

  #target {
    width: 100%;
  }

  h1,
  h2,
  h3 {
    line-height: 1em;
    padding: 0;
    font-weight: 700;
  }

  h1 {
    margin: 20px 0px 5px;
  }

  h2 {
    margin: 20px 0px 5px;
    font-size: 20px;
  }

  h3 {
    margin: 10px 0px 5px;
    font-size: 16px;
  }

  #sidebar a {
    line-height: 1.3em;
    color: #555;
    text-decoration: none;
  }

  #sidebar a:hover {
    text-decoration: underline;
  }

  #tutorial a {
    line-height: 1.3em;
    color: #09d;
    text-decoration: none;
  }

  #tutorial a:hover {
    text-decoration: underline;
  }



  /* Doc Tutorial Entry */
  .tutorial {
    margin-left: 225px;
    padding: 0px 20px;
    height: 100%;
    overflow: auto;
    box-sizing: border-box;
    font-weight: 400;
    font-size: 15px;
  }

  .tutorial .overview {
    padding-bottom: 20px;
  }

  .tutorial #demo {
    margin-top: 10px;
  }

  .tutorial h2 {
    font-size: 35px;
  }

  .tutorial h3 {
    font-size: 30px;
  }

  .tutorial h4 {
    font-size: 25px;
    margin: 35px 0px 10px;
  }

  .tutorial h5 {
    font-size: 20px;
    margin: 20px 0px 10px;
  }

  /*
  .tutorial .output, .tutorial .properties, .tutorial .codepen {
  	border-top: solid 0px #ccc;
  	margin-top:30px;
  	padding:30px 0px 0px;
  } */

  .tutorial .properties {
    padding: 0px 0px 0px;
  }

  .tutorial .property-name,
  .tutorial .method-name {
    font-weight: 700;
    padding: 0px 20px 0px 0px;
    font-size: 17px;
    display: inline-block;

  }

  .tutorial .property-type,
  .tutorial .method-type {
    display: inline-block;
    font-style: italic;
    color: #aaa;
  }

  .tutorial .property-description,
  .tutorial .method-description {
    padding: 5px 0px;
    font-size: 15px;
    color: #333;
    letter-spacing: 0.2px;
  }

  .tutorial .property-example,
  .tutorial .method-example {
    padding: 20px;
    display: none;
  }

  .tutorial .property,
  .tutorial .method {
    border: solid 1px #555;
    padding: 10px 20px;
    border-left-width: 1px;
    margin: 20px 0px;
    border-bottom: none;
    border-right: none;
    position: relative;
  }

  .tutorial .example-toggle {
    position: absolute;
    top: 0px;
    right: 0px;
    border: solid 1px #555;
    color: #333;
    padding: 3px 6px;
    font-size: 11px;
    border-top: none;
    cursor: pointer;
  }

  .tutorial .example-toggle:hover {
    background-color: #eee;
  }


  .custom-tutorial pre {
    padding: 0px 25px;
  }

  .custom-tutorial h3 {
    margin-top: 30px;
  }

  [nexus-ui] {
    display: inline-block;
  }




  /* Getting Started section*/

  .lib-overview {
    font-size: 13pt;
  }

  #intro h5 {
    margin-top: 35px;
    font-size: 20pt;
  }




  @media (max-width: 730px) {
    body {
      height: auto;
    }

    #menu-tab {
      background-color: #000;
      color: #fff;
      text-align: left;
      padding: 20px 20px;
      overflow: auto;
      cursor: pointer;
      display: block;
      position: fixed;
      top: 0px;
      right: 0px;
      width: 100%;
      height: 32px;
    }

    #menu-tab img {
      float: right;
    }

    #sidebar {
      width: 100%;
      position: absolute;
      top: 70px;
      padding-bottom: 100px;
      /* display:none; */
      overflow: auto;
      height: 100%;
      background-color: white;
      z-index: 3;
    }

    #sidebar a,
    #sidebar h2,
    #sidebar h3 {
      font-size: 120%;
    }

    #tutorial {
      margin-left: 0px;
      margin-top: 70px;
    }

    .menuClosed {
      display: none;
    }

    .menuOpen {
      display: block;
    }
  }
</style>
<script>
  window.scrollTo(0, 0);
</script>

<script>
  (function (i, s, o, g, r, a, m) {
    i['GoogleAnalyticsObject'] = r;
    i[r] = i[r] || function () {
      (i[r].q = i[r].q || []).push(arguments)
    }, i[r].l = 1 * new Date();
    a = s.createElement(o),
      m = s.getElementsByTagName(o)[0];
    a.async = 1;
    a.src = g;
    m.parentNode.insertBefore(a, m)
  })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');

  ga('create', 'UA-42209714-3', 'auto');
  ga('send', 'pageview');
</script>

</html>

Added public/nexus-js/api/js/Tone9.js.

more than 10,000 changes

Added public/nexus-js/api/js/jquery.js.

cannot compute difference between binary files

Added public/nexus-js/api/js/moustache.min.js.

cannot compute difference between binary files

Added public/nexus-js/api/media/D-sharp.mp3.

cannot compute difference between binary files

Added public/nexus-js/api/media/hamburger.png.

cannot compute difference between binary files

Added public/nexus-js/api/media/hamburger.svg.



>
1
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><symbol id="a" viewBox="0 -24 24 24"><path d="M2-19h20v3h-20v-3zm0 5h20v3h-20v-3zm0 8v-3h20v3h-20z" fill="#ffffff"/><path fill="none" d="M24-24h-24v24h24z"/></symbol><use xlink:href="#a" width="24" height="24" y="-24" transform="scale(1 -1)" overflow="visible"/></svg>

Added public/nexus-js/api/media/piano-f3.mp3.

cannot compute difference between binary files

Added public/nexus-js/api/prism/prism.css.























































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */
/**
 * prism.js default theme for JavaScript, CSS and HTML
 * Based on dabblet (http://dabblet.com)
 * @author Lea Verou
 */

code[class*="language-"],
pre[class*="language-"] {
	color: black;
	background: none;
	text-shadow: 0 1px white;
	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
	text-align: left;
	white-space: pre;
	word-spacing: normal;
	word-break: normal;
	word-wrap: normal;
	line-height: 1.5;

	-moz-tab-size: 4;
	-o-tab-size: 4;
	tab-size: 4;

	-webkit-hyphens: none;
	-moz-hyphens: none;
	-ms-hyphens: none;
	hyphens: none;
}

pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
	text-shadow: none;
	background: #b3d4fc;
}

pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
code[class*="language-"]::selection, code[class*="language-"] ::selection {
	text-shadow: none;
	background: #b3d4fc;
}

@media print {
	code[class*="language-"],
	pre[class*="language-"] {
		text-shadow: none;
	}
}

/* Code blocks */
pre[class*="language-"] {
	padding: 1em;
	margin: .5em 0;
	overflow: auto;
}

:not(pre) > code[class*="language-"],
pre[class*="language-"] {
	background: #f5f2f0;
}

/* Inline code */
:not(pre) > code[class*="language-"] {
	padding: .1em;
	border-radius: .3em;
	white-space: normal;
}

.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
	color: slategray;
}

.token.punctuation {
	color: #999;
}

.namespace {
	opacity: .7;
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
	color: #905;
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
	color: #690;
}

.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
	color: #a67f59;
	background: hsla(0, 0%, 100%, .5);
}

.token.atrule,
.token.attr-value,
.token.keyword {
	color: #07a;
}

.token.function {
	color: #DD4A68;
}

.token.regex,
.token.important,
.token.variable {
	color: #e90;
}

.token.important,
.token.bold {
	font-weight: bold;
}
.token.italic {
	font-style: italic;
}

.token.entity {
	cursor: help;
}

Added public/nexus-js/api/prism/prism.js.













>
>
>
>
>
>
1
2
3
4
5
6
/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(\w+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function(e){var t=n.util.type(e);switch(t){case"Object":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=n.util.clone(e[r]));return a;case"Array":return e.map&&e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var a=n.util.clone(n.languages[e]);for(var r in t)a[r]=t[r];return a},insertBefore:function(e,t,a,r){r=r||n.languages;var l=r[e];if(2==arguments.length){a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(l[i]=a[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in a)a.hasOwnProperty(i)&&(o[i]=a[i]);o[s]=l[s]}return n.languages.DFS(n.languages,function(t,n){n===r[e]&&t!=e&&(this[t]=o)}),r[e]=o},DFS:function(e,t,a,r){r=r||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],a||l),"Object"!==n.util.type(e[l])||r[n.util.objId(e[l])]?"Array"!==n.util.type(e[l])||r[n.util.objId(e[l])]||(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,r)):(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,r)))}},plugins:{},highlightAll:function(e,t){var a={callback:t,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",a);for(var r,l=a.elements||document.querySelectorAll(a.selector),i=0;r=l[i++];)n.highlightElement(r,e===!0,a.callback)},highlightElement:function(t,a,r){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,""])[1].toLowerCase(),i=n.languages[l]),t.className=t.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+l);var s=t.textContent,u={element:t,language:l,grammar:i,code:s};if(n.hooks.run("before-sanity-check",u),!u.code||!u.grammar)return u.code&&(u.element.textContent=u.code),n.hooks.run("complete",u),void 0;if(n.hooks.run("before-highlight",u),a&&_self.Worker){var g=new Worker(n.filename);g.onmessage=function(e){u.highlightedCode=e.data,n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,r&&r.call(u.element),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},g.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=n.highlight(u.code,u.grammar,u.language),n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,r&&r.call(t),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},highlight:function(e,t,r){var l=n.tokenize(e,t);return a.stringify(n.util.encode(l),r)},tokenize:function(e,t){var a=n.Token,r=[e],l=t.rest;if(l){for(var i in l)t[i]=l[i];delete t.rest}e:for(var i in t)if(t.hasOwnProperty(i)&&t[i]){var o=t[i];o="Array"===n.util.type(o)?o:[o];for(var s=0;s<o.length;++s){var u=o[s],g=u.inside,c=!!u.lookbehind,h=!!u.greedy,f=0,d=u.alias;if(h&&!u.pattern.global){var p=u.pattern.toString().match(/[imuy]*$/)[0];u.pattern=RegExp(u.pattern.source,p+"g")}u=u.pattern||u;for(var m=0,y=0;m<r.length;y+=r[m].length,++m){var v=r[m];if(r.length>e.length)break e;if(!(v instanceof a)){u.lastIndex=0;var b=u.exec(v),k=1;if(!b&&h&&m!=r.length-1){if(u.lastIndex=y,b=u.exec(e),!b)break;for(var w=b.index+(c?b[1].length:0),_=b.index+b[0].length,P=m,A=y,j=r.length;j>P&&_>A;++P)A+=r[P].length,w>=A&&(++m,y=A);if(r[m]instanceof a||r[P-1].greedy)continue;k=P-m,v=e.slice(y,A),b.index-=y}if(b){c&&(f=b[1].length);var w=b.index+f,b=b[0].slice(f),_=w+b.length,x=v.slice(0,w),O=v.slice(_),S=[m,k];x&&S.push(x);var N=new a(i,g?n.tokenize(b,g):b,d,b,h);S.push(N),O&&S.push(O),Array.prototype.splice.apply(r,S)}}}}}return r},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length,this.greedy=!!r};if(a.stringify=function(e,t,r){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join("");var l={type:e.type,content:a.stringify(e.content,t,r),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:r};if("comment"==l.type&&(l.attributes.spellcheck="true"),e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,"&quot;")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+"</"+l.tag+">"},!_self.document)return _self.addEventListener?(_self.addEventListener("message",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,l=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return r&&(n.filename=r.src,!document.addEventListener||n.manual||r.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:/<!--[\w\W]*?-->/,prolog:/<\?[\w\W]+?\?>/,doctype:/<!DOCTYPE[\w\W]+?>/i,cdata:/<!\[CDATA\[[\w\W]*?]]>/i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;
Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:{pattern:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:{pattern:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*\*?|\/|~|\^|%|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\\\|\\?[^\\])*?`/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript"}}),Prism.languages.js=Prism.languages.javascript;

Added public/nexus-js/dist/NexusUI.js.

cannot compute difference between binary files

Added public/nexus-js/dist/NexusUI.map.



>
1
{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap b2f31a6100da0c2ff488","webpack:///./index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA,aAAY,CAAC;;;;KAEN,OAAO,uCAAM,sIAAY;;kBAEjB,OAAO,C","file":"./dist/NexusUI.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Nexus\"] = factory();\n\telse\n\t\troot[\"Nexus\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b2f31a6100da0c2ff488","'use strict';\n\nimport NexusUI from './lib/main';\n\nexport default NexusUI;\n\n\n\n// WEBPACK FOOTER //\n// ./~/jshint-loader!./index.js"],"sourceRoot":""}

Added public/nexus-js/dist/NexusUI.min.js.

cannot compute difference between binary files

Added public/nexus-js/dist/NexusUI.min.map.

cannot compute difference between binary files

Added public/nexus-js/example/add.html.































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!doctype html>
<html>

<head>
  <meta charset="utf-8" />
  <title>Musician's Toolkit</title>
  <script src="../dist/NexusUI.js"></script>
  <script src="../api/js/jquery.js"></script>
  <script src="js/Tone9.js"></script>
  <meta name="viewport" content="width=200, initial-scale=1">
</head>
<body style="margin:0;padding:0;">


  <div style="font-size:25px;margin:10px;">
    Testing Sandbox
  </div>

  <div id="target"></div>


</body>
<style>
body {
  font-family:helvetica;
}
[nexus-ui] {
  margin:10px;
  float:left;
}
#target {
  width:500px;
  height:500px;
  border:dashed 2px #333;
}
</style>
<script>

  for (var i=0;i<10;i++) {
    var thing = new Nexus.Add.Dial('#target',{
      size: [100,100],
      value: i*0.1
    })
  }

</script>
</html>

Added public/nexus-js/example/all.html.





































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<!doctype html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Musician's Toolkit</title>
  <script src="../dist/NexusUI.js"></script>
  <script src="js/Tone9.js"></script>
  <meta name="viewport" content="width=200, initial-scale=1">
</head>
<body style="margin:0;padding:0;">
  <div id="all-interfaces">
    <div nexus-ui="dial"></div>
    <div nexus-ui="slider"></div>
    <div nexus-ui="toggle" id="toggle"></div>
    <div nexus-ui="position" id="position"></div>
    <div nexus-ui="button" id="button"></div>
    <div nexus-ui="textbutton" id="textbutton"></div>
    <div nexus-ui="radiobutton" id="radiobutton"></div>
    <div nexus-ui="number" id="number"></div>
    <div nexus-ui="select" id="select"></div>
    <div nexus-ui="piano" id="piano"></div>
    <div nexus-ui="sequencer" id="sequencer"></div>
    <div nexus-ui="pan2d" id="pan2D"></div>
    <div nexus-ui="tilt" id="tilt"></div>
    <div nexus-ui="multislider"></div>
    <div nexus-ui="pan" id="pan"></div>
    <div nexus-ui="envelope" id="envelope"></div>
    <div nexus-ui="oscilloscope" id="oscilloscope"></div>
    <div nexus-ui="meter" id="meter"></div>
    <div nexus-ui="spectrogram" id="spectrogram"></div>
  </div>
</body>
<style>
#all-interfaces {
  width:500px;
  margin:20px auto;
  font-family:helvetica, sans-serif;
}
[nexus-ui] {
  margin:15px auto;
  display:block;
}
#synth1 {
  margin: 50px auto;
  display:block;
  width: 300px;
}
</style>
<script>

  Nexus.context = Tone.context;

  ui = new Nexus.Rack('#all-interfaces');
  ui.tilt.active = false

  var player2 = new Tone.Player("./media/D-sharp.mp3")
  //play as soon as the buffer is loaded
  player2.autostart = true;
  player2.loop = true;

  ui.oscilloscope.connect(player2)
  ui.meter.connect(player2);
  ui.spectrogram.connect(player2);

</script>
</html>

Added public/nexus-js/example/demo.html.









































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<!doctype html>
<html>

<head>
  <meta charset="utf-8" />
  <title>Musician's Toolkit</title>
  <script src="../dist/NexusUI.js"></script>
  <script src="js/Tone9.js"></script>
  <meta name="viewport" content="width=200, initial-scale=1">
</head>
<body style="margin:0;padding:0;">


  <div style="font-size:20px;padding:20px;text-align:center;margin-top:40px;">
    NexusUI Basic Demo
  </div>

  <button id="mobileStart">Press to Init Mobile Audio</button>

  <div id="drone" style=>
    <div style="background-color:#fff;border:solid 1px #ccc;width:200px;padding:20px;margin:0 auto;">
      <div>
        <div nexus-ui="toggle" id="power" style="width:40px;height:25px;float:left;margin:0"></div>
        <span style="height:25px;line-height:28px;margin-left:10px">Power On</span>
      </div>
      <div style="overflow:auto">
        <div style="padding:15px 0px 0px;width:200px;overflow:auto">
          <div nexus-ui="slider" id="timbre" style="width:200px;height:25px;display:inline-block;"></div>
          <div style="display:inline-block;float:left;padding:3px 0px 0px">Timbre</div>
        </div>
        <div style="padding:15px 0px 0px;width:200px;overflow:auto">
          <div nexus-ui="pan" id="pan" style="width:200px;height:25px;display:inline-block;"></div>
          <div style="display:inline-block;float:left;padding:3px 0px 0px">Pan</div>
        </div>

        <div style="padding:15px 0px 0px;width:200px;overflow:auto">
          <div nexus-ui="position" id="filter" style="width:200px;height:150px;display:inline-block;"></div>
          <div style="display:inline-block;float:left;padding:3px 0px 0px">Filter</div>
        </div>

      </div>


      <div>
        <div nexus-ui="spectrogram" id="spectrogram" style="width:240px;height:50px;margin-left:-20px;margin-bottom:-20px;"></div>
      </div>
    </div>

  </div>


<style>

body {
  font-family:helvetica;
  font-weight:300;
  background-color:#f3f3f3;
  color:#333;
}
[nexus-ui] {
  margin:0px;
}
</style>
</body>
<script>

  Nexus.context = Tone.context;

  mobileStart = document.getElementById('mobileStart')
  mobileStart.addEventListener('touchend',function() {
    var osc = Nexus.context.createOscillator()
    osc.connect(Nexus.context.destination)
    osc.start(0)
    osc.stop(0.1)
    Nexus.clock.start();
  })

  Nexus.colors.accent = "#2cc";



  drone = new Nexus.Rack('#drone');

  droneSynth = {
    fm: new Tone.FMOscillator(100, "sawtooth", "sawtooth").start(),
    fm2: new Tone.FMOscillator(112.5, "sawtooth", "sawtooth").start(),
    vol: new Tone.Volume(-Infinity),
    pan: new Tone.Panner(0),
    filter: new Tone.Filter(100, "bandpass"),
    verb: new Tone.Freeverb(),
    compressor: new Tone.Compressor(-30, 10)
  }

  droneSynth.fm.connect( droneSynth.filter )
  droneSynth.fm2.connect( droneSynth.filter );
  droneSynth.filter.chain( droneSynth.compressor, droneSynth.vol, droneSynth.pan, droneSynth.verb, Tone.Master)


  droneSynth.fm.harmonicity.value = 4
  droneSynth.fm2.harmonicity.value = 4


  drone.power.on('change',function(v) {
    if (v) {
      droneSynth.vol.volume.rampTo(-20,1)
    } else {
      droneSynth.vol.volume.rampTo(-Infinity,1)
    }
  })

  drone.timbre.min = 10
  drone.timbre.max = 20
  drone.timbre.on('change',function(v) {
    droneSynth.fm.modulationIndex.rampTo(v,0.1)
    droneSynth.fm2.modulationIndex.rampTo(v,0.1)
  })
  drone.timbre.value = 0


  drone.pan.on('change',function(v) {
    droneSynth.pan.pan.value = v.value;
  })



  drone.filter.minX = 0
  drone.filter.maxX = 1400
  drone.filter.minY = 0
  drone.filter.maxY = 10

  drone.filter.on('change',function(v) {
    droneSynth.filter.frequency.value = v.x;
    droneSynth.filter.Q.value = v.y;
  })



    droneSynth.verb.wet.value = 0.2


    drone.spectrogram.connect(Tone.Master);
    drone.spectrogram.colorize("fill","#fff")
    drone.spectrogram.colorize("accent","#2cc")



</script>
</html>

Added public/nexus-js/example/js/Tone9.js.

more than 10,000 changes

Added public/nexus-js/example/link.html.





















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!doctype html>
<html>

<head>
  <meta charset="utf-8" />
  <title>Musician's Toolkit</title>
  <script src="../dist/NexusUI.js"></script>
  <script src="js/Tone9.js"></script>
  <meta name="viewport" content="width=200, initial-scale=1">
</head>
<body style="margin:0;padding:0;">
  <div id="all-interfaces">
    <span nexus-ui="Dial" id="dial"></span><br />
    &nbsp; <span nexus-ui="Number" id="number"></span>
  </div>
</body>
<script>

  Nexus.context = Tone.context;

  ui = new Nexus.Rack('all-interfaces');

  ui.number.link(ui.dial)

</script>
</html>

Added public/nexus-js/example/media/D-sharp.mp3.

cannot compute difference between binary files

Added public/nexus-js/example/media/piano-f3.mp3.

cannot compute difference between binary files

Added public/nexus-js/example/misc-testing.html.











































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!doctype html>
<html>

<head>
  <meta charset="utf-8" />
  <title>Musician's Toolkit</title>
  <script src="../dist/NexusUI.js"></script>
  <script src="../api/js/jquery.js"></script>
  <script src="js/Tone9.js"></script>
  <meta name="viewport" content="width=200, initial-scale=1">
</head>

<body style="margin:0;padding:0;">


  <div style="font-size:25px;margin:10px;">
    Testing Sandbox
  </div>

  <div id="target"></div>


</body>
<style>
  body {
    font-family: helvetica;
  }

  [nexus-ui] {
    margin: 10px;
    float: left;
  }

  #target {
    width: 500px;
    height: 500px;
    border: dashed 2px #333;
  }
</style>
<script>
  var thing = new Nexus.Sequencer('#target',{
    'size': [400,200],
    'mode': 'toggle',
    'rows': 5,
    'columns': 10,
   })

  thing.on('change', x => console.log(x))


</script>

</html>

Added public/nexus-js/example/sizing.html.

















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!doctype html>
<html>

<head>
  <meta charset="utf-8" />
  <title>Musician's Toolkit</title>
  <script src="../dist/NexusUI.js"></script>
  <script src="../api/js/jquery.js"></script>
  <script src="js/Tone9.js"></script>
  <meta name="viewport" content="width=200, initial-scale=1">
</head>
<body style="margin:0;padding:0;">


  <div style="font-size:25px;margin:10px;">
    Testing Sandbox
  </div>

  <div id="target"></div>


</body>
<style>
body {
  font-family:helvetica;
}
[nexus-ui] {
  margin:10px;
}
#target {
  width:500px;
  height:40px;
}
</style>
<script>

  var thing = new Nexus.Slider('#target')

</script>
</html>

Added public/nexus-js/example/tilt.html.



















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!doctype html>
<html>

<head>
  <meta charset="utf-8" />
  <title>Musician's Toolkit</title>
  <script src="../dist/NexusUI.js"></script>
  <script src="js/Tone9.js"></script>
  <meta name="viewport" content="width=200, initial-scale=1">
</head>
<body style="margin:0;padding:0;">



  <div style="font-size:25px;">
    NexusUI Tilt Test
  </div>

  <span id="tilt"></span>

  <div id="debugX">~</div>
  <div id="debugY">~</div>
  <div id="debugZ">~</div>

</body>
<style>
body {
  font-family:helvetica;
}
[nexus-ui], div {
  margin:10px;
}
</style>
<script>

  Nexus.context = Tone.context;

  tilt = new Nexus.Tilt('#tilt');

  debuxX = document.getElementById("debugX");
  debuxY = document.getElementById("debugY");
  tilt.on('change',function(v) {
    if (v) {
      if (v.x) {
        debugX.innerHTML = ~~(v.x * 1000);
      }
      if (v.y) {
        debugY.innerHTML = ~~(v.y * 1000);
      }
      if (v.z) {
        debugZ.innerHTML = ~~(v.z * 1000);
      }
    }
  })

</script>
</html>

Added public/nexus-js/example/toggle.html.





















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!doctype html>
<html>

<head>
  <meta charset="utf-8" />
  <title>Musician's Toolkit</title>
  <script src="../dist/NexusUI.js"></script>
  <script src="js/Tone9.js"></script>
  <meta name="viewport" content="width=200, initial-scale=1">
</head>
<body style="margin:0;padding:0;">



  <div style="font-size:25px;">
    Toggle Test
  </div>

  <span id="toggle"></span>


</body>
<style>
body {
  font-family:helvetica;
}
[nexus-ui], div {
  margin:10px;
}
</style>
<script>

  Nexus.context = Tone.context;

  toggle = new Nexus.Toggle('#toggle', {
    state: true
  });



</script>
</html>

Added public/nexus-js/favicon.png.

cannot compute difference between binary files

Added public/nexus-js/index.html.









































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
<!doctype html>
<html>
<head>
	
<!--Author: Ben Taylor -->
	<title>Nexus Web Audio Interfaces</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<meta name="viewport" content="initial-scale=1., user-scalable=no, width=device-width"/>
	<link rel="icon" type="image/png" href="favicon.png" />
	<!-- fonts -->
	<link href="https://fonts.googleapis.com/css?family=Muli" rel="stylesheet">
	<link href='http://fonts.googleapis.com/css?family=Open+Sans:300,400,600' rel='stylesheet' type='text/css'>
	<!-- jquery links -->
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
	<script type="text/javascript" src="api/js/Tone9.js"></script>
	<!-- nexus links -->
	<script type="text/javascript" src="dist/NexusUI.js"></script>

  <link rel='stylesheet' href='api/prism/prism.css' />
  <script src="api/prism/prism.js"></script>

	<meta name="twitter:card" content="summary_large_image">
	<meta name="twitter:site" content="@suncanon">
	<meta name="twitter:creator" content="@suncanon">
	<meta name="twitter:title" content="NexusUI: Web Audio Interfaces">
	<meta name="twitter:description" content="A JavaScript toolkit for building instruments in the browser.">
	<meta name="twitter:image" content="https://nexus-js.github.io/ui/images/card.png">

</head>
<body>

<style>

	body {
		line-height:normal;
		font-family:'Open Sans', helvetica neue;
	}

	.row {
		max-width:none;
	}

	a {
		color: rgb(20, 160, 170);
	}

	a:hover {
		text-decoration:underline;
	}

	h1, h2, h3 {
		font-family: "Muli", sans-serif;
		font-weight: 300;
		color:#333;
		font-size:20pt;
		display:block;
		line-height:20pt;
		padding:3px 0px;
		margin:0px 0px;
	}

	h2 {
		font-size:16pt;
	}

	h3 {
		padding-top:0px;
		font-size:13pt;
		font-weight: 1000;
	}


	.codedisplay {
		border:solid 0px #aaa;
		outline:none;
		background-color:#f7f7f7;
		font-family: courier;
		font-size:10pt;
		color:#19b;
		padding:20px !important;
		border-radius:6px;
		box-shadow:none;
		-webkit-box-shadow:none;
		resize:none;
		width:100%;
	}

	textarea {
		user-select:none;
		-webkit-user-select:none;
		-moz-user-select: none;
	}

	.dl {
		border-radius:5px;
		border:none;
		font-weight:normal;
		padding:10px 20px;
		text-decoration:none;
		cursor:pointer;
		transition:0.2s;
		display:inline-block;
		margin:20px auto;

		margin: 5px 10px 0px 0px;
		padding:4px 20px;
		border-radius:0px;
	}

	.dl-one, .dl-one:visited {
		background-color: rgb(34, 187, 187);
		color:white !important;
	}

	.dl-two, .dl-two:visited {
		background-color:#ddd;
		color:#000 !important;
	}

	.dl-one:hover {
		background-color:rgb(34, 187, 187);
		color:white;
		text-decoration:none;
	}

	.dl-two:hover {
		background-color:#ccc;
		color:#111;
		text-decoration:none;
	}

	button {
		outline:none;
	}

	#column {
		width:600px;
		margin:50px auto;
	}

	@media screen and (max-width: 900px) {
		#column {
			width: auto;
			padding:0px 40px;
		}
	}

</style>

<!-- general container -->
<div id="column">

	<div style="overflow:auto;height:212px">

		<h1>NexusUI</h1>
		<h2>Web Audio Interfaces</h2><br>
		<div id="demorack" style="margin-top:10px">

			<div style="float:left">
				<div nexus-ui="dial" id="demo2" style="width:80px;height:70px;margin-top:10px;"></div>
				<div nexus-ui="number" id="demo3" style="width:50px;height:25px;margin:5px auto 0px;"></div>
			</div>
			<div nexus-ui="slider" id="demosl1" style="width:20px;height:100px;float:left;margin:10px 0px 0px 5px;"></div>
			<div nexus-ui="slider" id="demosl2" style="width:20px;height:100px;float:left;margin:10px 0px 0px 5px;"></div>
			<div nexus-ui="slider" id="demosl3" style="width:20px;height:100px;float:left;margin:10px 0px 0px 5px;"></div>
			<div nexus-ui="sequencer" id="demo4" style="width:200px;height:100px;float:left;margin:10px 0px 0px 5px;"></div>

		</div>

		<script>

		Nexus.context = Tone.context;

		var rack1 = new Nexus.Rack("demorack")
		rack1.demo3.link(rack1.demo2)
		rack1.demosl1.value = 0.7
		rack1.demosl2.value = 0.5
		rack1.demosl3.value = 0.3
		rack1.demo2.value = 0.5
		rack1.demo4.columns = 10;
		rack1.demo4.matrix.set.all([
			[0,0,0,0,0,0,0,0,0,0],
			[0,0,0,0,0,0,0,0,0,0],
			[0,0,0,1,0,0,0,0,1,0],
			[0,0,1,0,1,0,0,1,0,1],
			[1,0,0,0,0,1,0,0,0,0]
		])
		rack1.demo4.start();

		</script>

	</div>


	<div style="clear:both;margin:40px 0px 0px;">

		<p class="overview">
      NexusUI is a collection of HTML5 interfaces and Javascript helper functions to assist with building web audio instruments in the browser.
    </p>

    <p class="overview">
			In addition to interfaces, it offers a few helper methods for <b>tuning</b> and <b>timing</b>.
			It does not provide any sound-making capabilities –– for that, check out the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API" target="blank">Web Audio API</a> or web audio libraries such as <a href="http://tonejs.github.io" target="blank">Tone.js</a>, <a href="https://github.com/sebpiq/WebPd" target="blank">WebPD</a>, or <a href="https://github.com/charlieroberts/gibber.audio.lib" target="blank">Gibber</a>.
    </p>

		<div style="margin:40px auto 40px;">
			<a class="dl dl-one" href="api/">Documentation</a>
			<a class="dl dl-two" href="https://github.com/nexus-js/ui/">View on Github</a>
		</div>

	</div>

	<hr />

	<div style="margin:25px 0px;" id="example">

		<b>Example</b><br />

		<br />

		<button id="mobileStart" style="display:none;width:200px;margin:5px 3px;">Press to Initialize Mobile Audio</button>

		<!-- result goes here -->

		<div id="power" style="width:40px;height:17px;margin:15px 0px;"></div>
		<div id="volume" style="width:200px;height:20px;margin:5px 3px;"></div>


		<script>

var power = new Nexus.Toggle("#power");
var gain = new Nexus.Slider("#volume");

// Create a sound source using Tone.js
var volume = new Tone.Volume(-Infinity).toMaster();
var synth = new Tone.Oscillator(300,"sine").connect(volume);

// Add event listeners
power.on('change',function(value) {
	value ? synth.start() : synth.stop();
});


gain.on('change',function(value) {
	volume.volume.rampTo(value,.1)
});
gain.min = -100
gain.max = 0
gain.value = -30

		</script>




		<br /><br />
		HTML

		<pre class="codedisplay language-html"><code>&lt;div id="power"&gt;&lt;div&gt;
&lt;div id="gain"&gt;&lt;div&gt;</code></pre>

		<br /><br />
		JS

		<pre class="codedisplay language-javascript"><code>// Create interfaces
var power = new Nexus.Toggle("#power");
var gain = new Nexus.Slider("#gain");

// Create a sound source
var volume = new Tone.Volume(-Infinity).toMaster();
var synth = new Tone.Oscillator(300,"sine").connect(volume);

// Listen for interface events
power.on('change',function(v) {
	v ? synth.start() : synth.stop();
});

gain.on('change',function(v) {
	volume.volume.rampTo(v,.1)
});
gain.min = -100;
gain.max = 0;
gain.value = -30;</code></pre>

	<!--	<br /><br />
		CSS

		<pre class="codedisplay language-css"><code>#power {
width:40px;
height:17px;
margin:15px 0px;
}

#echo {
width:200px;
height:20px;
margin:5px 3px;
}</code></pre>
-->

	</div>

	<br>

	<hr />

	<div style="margin:25px 0px 25px;">

		<b>Support</b><br /><br />
		NexusUI is an open-source project which is maintained in my spare time. If you enjoy NexusUI, please considering supporting its continued development and keeping it open-source.<br><br>
		<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
		<input type="hidden" name="cmd" value="_donations" />
		<input type="hidden" name="business" value="KTKBDBXH39L6U" />
		<input type="hidden" name="currency_code" value="USD" />
		<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" title="PayPal - The safer, easier way to pay online!" alt="Donate with PayPal button" />
		<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1" />
		</form>

	</div>


</div>


<!-- FOOTER -->
<div style="font-size:10pt;color:#aaa;padding:30px;text-align:center;margin-top:20px;background-color:#eee;">

	<div style="font-size:35pt;margin:5px auto 20px;color:#dadada;width:100px;text-align:center;">Β©</div>
	experimental music & digital media @ louisiana state univeristy 2013-2016<br />
	ben taylor 2017-2019

</div>



<script>
    Prism.highlightAll();
</script>



<!-- GOOGLE ANALYTICS -->

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-42209714-2', 'auto');
  ga('send', 'pageview');

</script>

</body>
</html>

Added public/nexus-js/index.js.











>
>
>
>
>
1
2
3
4
5
'use strict';

import NexusUI from './lib/main';

export default NexusUI;

Added public/nexus-js/lib/components/buttontemplate.js.





























































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
'use strict';

let svg = require('../util/svg');
let math = require('../util/math');
let ToggleModel = require('../models/toggle');
let Interface = require('../core/interface');

/**
Button Template
*/

export default class ButtonTemplate extends Interface {

  constructor(args,options,defaults) {

    super(args,options,defaults);

    this.mode = this.settings.mode || 'button';

    this.position = {
      x: 0,
      y: 0
    };

    this._state = new ToggleModel(this.settings.state);

  }

  buildInterface() {
    this.pad = svg.create('circle');
    this.pad.setAttribute('fill', '#d18');
    this.pad.setAttribute('stroke', '#d18');
    this.pad.setAttribute('stroke-width', 4);

    this.element.appendChild(this.pad);

    this.interactionTarget = this.pad;

    this.sizeInterface();
  }

  sizeInterface() {
    this.pad.setAttribute('cx',this.width/2);
    this.pad.setAttribute('cy',this.height/2);
    this.pad.setAttribute('r', Math.min(this.width,this.height) / 2 - 2);
  }

  render() {
    if (!this.state) {
      this.pad.setAttribute('fill', this.colors.fill);
      this.pad.setAttribute('stroke', this.colors.mediumLight);
    } else {
      this.pad.setAttribute('fill', this.colors.accent);
      this.pad.setAttribute('stroke', this.colors.accent);
    }
  }

  down(paintbrush) {
    switch (this.mode) {
      case 'impulse':
        this.turnOn();
        if (this.timeout) {
          clearTimeout(this.timeout);
        }
        this.timeout = setTimeout(this.turnOff.bind(this),30);
    //    this.emit('change',this.state);
        break;
      case 'button':
        this.turnOn();
    //    this.emit('change',this.state);
        break;
      case 'aftertouch':
        this.position = {
          x: math.clip(this.mouse.x / this.width,0,1),
          y: math.clip(1-this.mouse.y / this.height,0,1)
        };
        this.turnOn();
    //    this.emit('change',{
    //      state: this.state,
    //      x: this.position.x,
    //      y: this.position.y,
    //    });
        break;
      case 'toggle':
        this.flip(paintbrush);
    //    this.emit('change',this.state);
        break;
    }

  }

  bend(mouse) {
    if (this.mode==='aftertouch') {
      this.mouse = mouse || this.mouse;
      this.position = {
        x: math.clip(this.mouse.x / this.width,0,1),
        y: math.clip(1 - this.mouse.y / this.height,0,1)
      };
      this.emit('change',{
        state: this.state,
        x: this.position.x,
        y: this.position.y,
      });
      this.render();
    }
  }

  up() {
    switch (this.mode) {
      case 'button':
        this.turnOff();
      //  this.emit('change',this.state);
        break;
      case 'aftertouch':
        this.turnOff();
        this.position = {
          x: math.clip(this.mouse.x / this.width,0,1),
          y: math.clip(1 - this.mouse.y / this.height,0,1)
        };
      //  this.emit('change',{
      //    state: this.state,
      //    x: this.position.x,
      //    y: this.position.y,
      //  });
        break;
    }
  }

  /* overwritable interaction handlers */

  click() {
    this.down();
  }
  move() {
    this.bend();
  }
  release() {
    this.up();
  }

  /**
  Whether the button is on (pressed) or off (not pressed)
  @type {boolean}
  @example button.state = true;
  */
  get state() {
    return this._state.state;
  }
  set state(value) {
    this._state.flip(value);
    if (this.mode==='aftertouch') {
      this.emit('change',{
        state: this.state,
        x: this.position.x,
        y: this.position.y,
      });
    } else {
      this.emit('change',this.state);
    }
    this.render();
  }

  /**
  Change the button to its alternate state (off=>on, on=>off), or flip it to a specified state.
  @param value {boolean} (Optional) State to flip to.
  @example button.flip();
  */
  flip(value) {
    this._state.flip(value);
    if (this.mode==='aftertouch') {
      this.emit('change',{
        state: this.state,
        x: this.position.x,
        y: this.position.y,
      });
    } else {
      this.emit('change',this.state);
    }
    this.render();
  }

  /**
  Turn the button's state to true.
  @example button.turnOn();
  */
  turnOn(emitting) {
    this._state.on();
    if (emitting!==false) {
      if (this.mode==='aftertouch') {
        this.emit('change',{
          state: this.state,
          x: this.position.x,
          y: this.position.y,
        });
      } else {
        this.emit('change',this.state);
      }
    }
    this.render();
  }

  /**
  Turn the button's state to false.
  @example button.turnOff();
  */
  turnOff(emitting) {
    this._state.off();
    if (emitting!==false) {
      if (this.mode==='aftertouch') {
        this.emit('change',{
          state: this.state,
          x: this.position.x,
          y: this.position.y,
        });
      } else {
        this.emit('change',this.state);
      }
    }
    this.render();
  }

}

Added public/nexus-js/lib/components/rangeslider.js.































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
'use strict';

let svg = require('../util/svg');
let RangeModel = require('../models/range');
let math = require('../util/math');

import Interface from '../core/interface';
import * as Interaction from '../util/interaction';

export default class RangeSlider extends Interface  {

  constructor() {

    let options = [];

    let defaults = {
      'size': [100,30],
      'mode': 'select'
    };

    super(arguments,options,defaults);

    this.min = this.settings.min;
    this.max = this.settings.max;
    this.step = this.settings.step;
    this.mode = this.settings.mode;

    this.range = new RangeModel(this.min,this.max,this.step);

    if (this.mode==='drag') {
      this.position = {
        center: new Interaction.Handle('relative','horizontal',[0,this.width],[this.height,0]),
        size: new Interaction.Handle('relative','vertical',[0,this.width],[this.height,0])
      };
      this.position.size.sensitivity = 0.2;
    } else if (this.mode==='select') {
      this.position = {
        center: new Interaction.Handle('relative','horizontal',[0,this.width],[this.height,0]),
        start: new Interaction.Handle('relative','horizontal',[0,this.width],[this.height,0]),
        end: new Interaction.Handle('relative','horizontal',[0,this.width],[this.height,0])
      //  size: new Interaction.Handle('relative','vertical',[0,this.width],[this.height,0])
      };
    }

    this.init();
    return this;
  }

  buildFrame() {
      this.element = svg.create('svg');
      this.element.setAttribute('x',0);
      this.element.setAttribute('y',0);
      this.parent.appendChild(this.element);
  }

  buildInterface() {

    this.dummy = svg.create('rect');
    this.dummy.setAttribute('width', '100%');
    this.dummy.setAttribute('height', '100%');
    this.dummy.setAttribute('x',0);
    this.dummy.setAttribute('y',0);
    this.dummy.setAttribute('fill','none');

    this.element.appendChild(this.dummy);

    this.ref = svg.create('g');
    this.ref.setAttribute('width', '100%');
    this.ref.setAttribute('height', '100%');
    this.ref.setAttribute('x',0);
    this.ref.setAttribute('y',0);
    this.ref.setAttribute('fill','none');

    this.element.appendChild(this.ref);

    this.bar = svg.create('rect');
    this.bar.setAttribute('x',0);
    this.bar.setAttribute('y',0);
    this.bar.setAttribute('stroke-width','0');
    this.bar.setAttribute('fill-opacity','0.4');

    this.arrowL = svg.create('rect');
    this.arrowL.setAttribute('x',0);
    this.arrowL.setAttribute('y',0);
    this.arrowL.setAttribute('fill-opacity','0.7');

    this.arrowL.addEventListener('mousedown', (e) => {
      e.preventDefault();
      e.stopPropagation();
    });

    this.arrowR = svg.create('rect');
    this.arrowR.setAttribute('fill-opacity','0.7');

    this.arrowR.addEventListener('mousedown', (e) => {
      e.preventDefault();
      e.stopPropagation();
    });

    this.ref.appendChild(this.arrowL);
    this.ref.appendChild(this.arrowR);
    this.ref.appendChild(this.bar);

    this.resize();

  }

  colorInterface() {
    this.bar.setAttribute('fill',this.colors.accent);
    this.bar.setAttribute('stroke',this.colors.accent);
    this.arrowL.setAttribute('fill',this.colors.accent);
    this.arrowR.setAttribute('fill',this.colors.accent);
  }

  resize(w,h) {
    this.width = w || this.width;
    this.height = h || this.height;
    this.element.setAttribute('width',this.width);
    this.element.setAttribute('height',this.height);
    this.bar.setAttribute('width', (this.range.end.normalized - this.range.start.normalized) * this.width );
    this.bar.setAttribute('height',this.height);
    this.arrowL.setAttribute('width', 3);
    this.arrowL.setAttribute('height',this.height);
    this.arrowR.setAttribute('width', 3);
    this.arrowR.setAttribute('height',this.height);
    this.arrowR.setAttribute('x',this.bar.getAttribute('width'));
    this.arrowR.setAttribute('y',0);
    if (this.mode==='drag') {
      this.position.center.resize([0,this.width],[this.height,0]);
      this.position.size.resize([0,this.width],[this.height,0]);
    } else if (this.mode==='select') {
      this.position.center.resize([0,this.width],[this.height,0]);
      this.position.start.resize([0,this.width],[this.height,0]);
      this.position.end.resize([0,this.width],[this.height,0]);
    }
    this.render();
  }

  render() {
    this.ref.setAttribute('transform', 'translate(' + this.range.start.normalized * this.width + ', 0)');
    this.bar.setAttribute('width', (this.range.end.normalized - this.range.start.normalized) * this.width );
    this.arrowR.setAttribute('x',this.bar.getAttribute('width') - 3);
  }

  click() {
    this.hasMoved = false;
    console.log('slider clicked');

    if (this.mode==='drag') {
      this.position.center.anchor = this.mouse;
      this.position.size.anchor = this.mouse;
    } else if (this.mode==='select') {
      this.position.center.anchor = this.mouse;
    }
    //this.range.center = math.scale(this.mouse.x,0,this.width,this.min,this.max);
    this.render();
  }

  move() {
    if(this.clicked){
      this.hasMoved = true;
      if (this.mode==='drag') {

        this.position.center.update( this.mouse );
        this.range.center = math.scale(this.position.center.value,0,1,this.min,this.max);
        //this.range.center = math.scale(this.mouse.x,0,this.width,this.min,this.max);

        this.position.size.update( this.mouse );
        this.range.size = math.scale(this.position.size.value,0,1,this.min,this.max);

        this.render();
      }
      else if (this.mode==='select') {
        this.position.center.update( this.mouse );
        this.range.center = math.scale(this.position.center.value,0,1,this.min,this.max);
        this.render();
      }
    }
  }

  release() {
    if (!this.hasMoved) {
      this.destroy();
    }
    this.render();
  }

  get start() {
    return this.range.start.value;
  }

  set start(value) {
  //  console.log("start is being set to", value);
    this.range.start.value = value;
    this.updatePosition();
  }

  get end() {
    return this.range.end.value;
  }

  set end(value ) {
  //  console.log("end is being set to", value);
    this.range.end.value = value;
    this.updatePosition();
  }

  updatePosition() {
  //  console.log("updatePosition is being set");
    let start = this.range.start.normalized;
    //        console.log("updatePosition start", start);
    let end = this.range.end.normalized;
    //        console.log("updatePosition end", end);
    let center = (end+start)/2;
    let size = end - start;

    //    console.log("updatePosition center", center);
    //        console.log("updatePosition size", size);
    this.position.center.update(center);
    this.position.size.update(size);
  }

}

Added public/nexus-js/lib/components/slidertemplate.js.

















































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
'use strict';

let svg = require('../util/svg');
let Interface = require('../core/interface');
let Step = require('../models/step');
import * as Interaction from '../util/interaction';

export default class SliderTemplate extends Interface {

  constructor(args,options,defaults) {

    super(args,options,defaults);

    this.orientation = this.settings.orientation;

  //  this.mode = this.settings.mode;

    this.hasKnob = this.settings.hasKnob;

    // this.step should eventually be get/set
    // updating it will update the _value step model
  //  this.step = this.settings.step; // float

    this._value = new Step(this.settings.scale[0], this.settings.scale[1], this.settings.step, this.settings.value);

    this.init();

    this.position = new Interaction.Handle(this.settings.mode,this.orientation,[0,this.width],[this.height,0]);
    this.position.value = this._value.normalized;

    this.value = this._value.value;

    this.emit('change',this.value);

  }

  buildInterface() {

    this.bar = svg.create('rect');
    this.fillbar = svg.create('rect');
    this.knob = svg.create('circle');

    this.element.appendChild(this.bar);
    this.element.appendChild(this.fillbar);
    this.element.appendChild(this.knob);

    this.sizeInterface();



  }

  sizeInterface() {


    if (!this.settings.orientation) {
      if (this.width < this.height) {
        this.orientation = 'vertical';
      } else {
        this.orientation = 'horizontal';
      }
    }

    let x, y, w, h, barOffset, cornerRadius;
    this.knobData = {
      level: 0,
      r: 0
    };

    if (this.orientation === 'vertical') {
      this.thickness = this.width / 2;
    	x = this.width/2;
    	y = 0;
    	w = this.thickness;
    	h = this.height;
      this.knobData.r = this.thickness * 0.8;
    	this.knobData.level = h-this.normalized*h;
      barOffset = 'translate('+this.thickness*(-1)/2+',0)';
      cornerRadius = w/2;
    } else {
      this.thickness = this.height / 2;
    	x = 0;
    	y = this.height/2;
    	w = this.width;
    	h = this.thickness;
      this.knobData.r = this.thickness * 0.8;
    	this.knobData.level = this.normalized*w;
      barOffset = 'translate(0,'+this.thickness*(-1)/2+')';
      cornerRadius = h/2;
    }

    this.bar.setAttribute('x',x);
    this.bar.setAttribute('y',y);
    this.bar.setAttribute('transform',barOffset);
    this.bar.setAttribute('rx',cornerRadius); // corner radius
    this.bar.setAttribute('ry',cornerRadius);
    this.bar.setAttribute('width',w);
    this.bar.setAttribute('height',h);

    if (this.orientation === 'vertical') {
      this.fillbar.setAttribute('x',x);
      this.fillbar.setAttribute('y',this.knobData.level);
      this.fillbar.setAttribute('width',w);
      this.fillbar.setAttribute('height',h-this.knobData.level);
    } else {
      this.fillbar.setAttribute('x',0);
      this.fillbar.setAttribute('y',y);
      this.fillbar.setAttribute('width',this.knobData.level);
      this.fillbar.setAttribute('height',h);
    }
    this.fillbar.setAttribute('transform',barOffset);
    this.fillbar.setAttribute('rx',cornerRadius);
    this.fillbar.setAttribute('ry',cornerRadius);

    if (this.orientation === 'vertical') {
      this.knob.setAttribute('cx',x);
      this.knob.setAttribute('cy',this.knobData.level);
    } else {
      this.knob.setAttribute('cx',this.knobData.level);
      this.knob.setAttribute('cy',y);
    }
    this.knob.setAttribute('r',this.knobData.r);


    if (this.position) {
      this.position.resize([0,this.width],[this.height,0]);
    }

  }

  colorInterface() {

    this.bar.setAttribute('fill', this.colors.fill);
    this.fillbar.setAttribute('fill', this.colors.accent);
    this.knob.setAttribute('fill', this.colors.accent);
    if (!this.hasKnob) {
      this.knob.setAttribute('fill','none');
    }

  }

  render() {
    if (!this.clicked) {
      this.knobData.r = this.thickness*0.75;
    }
    this.knob.setAttribute('r',this.knobData.r);

    if (this.orientation === 'vertical') {
       this.knobData.level = this._value.normalized*this.height;
       this.knob.setAttribute('cy',this.height - this.knobData.level);
       this.fillbar.setAttribute('y',this.height - this.knobData.level);
       this.fillbar.setAttribute('height',this.knobData.level);
    } else {
       this.knobData.level = this._value.normalized*this.width;
       this.knob.setAttribute('cx',this.knobData.level);
       this.fillbar.setAttribute('x',0);
       this.fillbar.setAttribute('width',this.knobData.level);
    }
  }

  down() {
    this.clicked = true;
    this.knobData.r = this.thickness*0.9;
    this.position.anchor = this.mouse;
    this.slide();
  }

  slide() {
    if (this.clicked) {
      this.position.update(this.mouse);
      this.value = this._value.updateNormal( this.position.value );
      this.emit('change',this.value);
    }
  }

  up() {
    this.clicked = false;
    this.render();
  }

  get normalized() {
    return this._value.normalized;
  }

  /**
  The slider's current value. If set manually, will update the interface and trigger the output event.
  @type {number}
  @example slider.value = 10;
  */
  get value() {
    return this._value.value;
  }
  set value(v) {
    this._value.update(v);
    this.position.value = this._value.normalized;
    this.render();
  }

  /**
  Lower limit of the sliders's output range
  @type {number}
  @example slider.min = 1000;
  */
  get min() {
    return this._value.min;
  }
  set min(v) {
    this._value.min = v;
  }

  /**
  Upper limit of the slider's output range
  @type {number}
  @example slider.max = 1000;
  */
  get max() {
    return this._value.max;
  }
  set max(v) {
    this._value.max = v;
  }

  /**
  The increment that the slider's value changes by.
  @type {number}
  @example slider.step = 5;
  */
  get step() {
    return this._value.step;
  }
  set step(v) {
    this._value.step = v;
  }

  /**
  Absolute mode (slider's value jumps to mouse click position) or relative mode (mouse drag changes value relative to its current position). Default: "relative".
  @type {string}
  @example slider.mode = "relative";
  */
  get mode() {
    return this.position.mode;
  }
  set mode(v) {
    this.position.mode = v;
  }


}

Added public/nexus-js/lib/core/interface.js.





































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
'use strict';

let svg = require('../util/svg');
let dom = require('../util/dom');
let util = require('../util/util');
let touch = require('../util/touch');
const EventEmitter = require('events');

import { colors } from '../main';

/**
Interface
*/
export default class Interface extends EventEmitter {

  constructor(args,options,defaults) {
    super();
    this.type = this.constructor.name;
    this.settings = this.parseSettings(args,options,defaults);
    this.mouse = {};
    this.wait = false;
    this.colors = {};
    let defaultColors = colors(); // jshint ignore:line
    this.colors.accent = defaultColors.accent;
    this.colors.fill = defaultColors.fill;
    this.colors.light = defaultColors.light;
    this.colors.dark = defaultColors.dark;
    this.colors.mediumLight = defaultColors.mediumLight;
    this.colors.mediumDark = defaultColors.mediumDark;
  }

  parseSettings(args,options,defaults) {

    options.unshift('target');
    defaults.defaultSize = defaults.size.splice(0,2);
    defaults.size = false;

    let settings = {
      'target': document.body,
      'colors': {}, // should inherit from a colors module,
      'snapWithParent': true,
      'event': function() {},
      'component': false
    };

    for (let key in defaults) {
      settings[key] = defaults[key];
    }

    for (let i=0; i<args.length; i++) {
      // grabs the next argument
      let setting = args[i];
      // if it's an object, it must be the settings object
      if ( util.isObject(setting) ) {
        for ( let key in setting ) {
          settings[key] = setting[key];
        }
      // if it's a function, it must be the event setting
      } else if (typeof setting === 'function') {
        settings.event = setting;
      // otherwise, consider it one of the widget's custom options
      } else if (options.length>=1) {
        // grab the first option -- i.e. 'target'
        let key = options.splice(0,1)[0];
        settings[key] = setting;
      }
    }

    /*  handle common settings  */

    // target
    this.parent = dom.parseElement(settings.target);

    // nexus-ui attribute
    if (this.parent && this.parent instanceof HTMLElement && !settings.component) {
      if (!this.parent.hasAttribute('nexus-ui')) {
        this.parent.setAttribute('nexus-ui','');
      }
    }

    // size

    if (settings.size && Array.isArray(settings.size) && settings.snapWithParent) {
      this.width = settings.size[0];
      this.height = settings.size[1];
      this.parent.style.width = this.width + 'px';
      this.parent.style.height = this.height + 'px';
    } else if (settings.snapWithParent && !settings.component) {

      this.width = parseFloat(window.getComputedStyle(this.parent, null).getPropertyValue('width').replace('px',''));
      this.height = parseFloat(window.getComputedStyle(this.parent, null).getPropertyValue('height').replace('px',''));

      if (this.width==5000) {
        this.width = settings.defaultSize[0];
        this.parent.style.width = this.parent.width = this.width + 'px';
      }
      if (this.height==5000) {
        this.height = settings.defaultSize[1];
        this.parent.style.height = this.parent.height = this.height + 'px';
      }

    } else {
      settings.size = settings.defaultSize;
      this.width = settings.size[0];
      this.height = settings.size[1];
    }

    // event
    if (settings.event) {
      this.event = this.on('change', settings.event);
    } else {
      this.event = false;
    }

    return settings;

  }

  init() {
    this.buildFrame();
    this.buildInterface();
    this.sizeInterface();
    this.attachListeners();
    this.colorInterface();
    this.finalTouches();
  }

  buildFrame() {
    this.element = svg.create('svg');
    this.element.setAttribute('width',this.width);
    this.element.setAttribute('height',this.height);
    this.parent.appendChild(this.element);
  }

  buildInterface() {}
  sizeInterface() {}
  colorInterface() {}

  attachListeners() {

    this.interactionTarget = this.interactionTarget || this.element;

    // Setup interaction
    if (touch.exists) {
      this.interactionTarget.addEventListener('touchstart', evt => this.preTouch(evt));
      this.interactionTarget.addEventListener('touchmove', evt => this.preTouchMove(evt));
      this.interactionTarget.addEventListener('touchend', evt => this.preTouchRelease(evt));
    }
    this.boundPreMove = evt => this.preMove(evt);
    this.boundPreRelease = evt => this.preRelease(evt);
    this.interactionTarget.addEventListener('mousedown', evt => this.preClick(evt));
  }

  finalTouches() {
    this.element.style.cursor = 'pointer';
  }

  preClick(e) {
    // 10000 getComputedStyle calls takes 100 ms.
    // .:. one takes about .01ms
    if (this.element instanceof HTMLElement) {
      this.width = window.getComputedStyle(this.element, null).getPropertyValue('width').replace('px','');
    }
    // 10000 getComputedStyle calls takes 40 ms.
    // .:. one takes about .004ms
    this.offset = dom.findPosition(this.element);
    this.mouse = dom.locateMouse(e,this.offset);
    this.clicked = true;
    this.click();
    this.moveEvent = document.addEventListener('mousemove', this.boundPreMove);
    this.releaseEvent = document.addEventListener('mouseup', this.boundPreRelease);
    this.emit('click');
    e.preventDefault();
    e.stopPropagation();
  }

  preMove(e) {
    if (!this.wait) {
      this.mouse = dom.locateMouse(e,this.offset);
      this.move();
      this.wait = true;
      setTimeout(() => { this.wait = false; },25);
    }
    e.preventDefault();
    e.stopPropagation();
  }

  preRelease(e) {
    this.mouse = dom.locateMouse(e,this.offset);
    this.clicked = false;
    this.release();
    this.emit('release');
    document.removeEventListener('mousemove',this.boundPreMove);
    document.removeEventListener('mouseup',this.boundPreRelease);
    e.preventDefault();
    e.stopPropagation();
  }

  click() {

  }

  move() {

  }

  release() {

  }


  /* touch */

  preTouch(e) {
    if (this.element instanceof HTMLElement) {
      this.width = window.getComputedStyle(this.element, null).getPropertyValue('width').replace('px','');
    }
    this.offset = dom.findPosition(this.element);
    this.mouse = dom.locateTouch(e,this.offset);
    this.clicked = true;
    this.touch(e);
    this.emit('click');
    e.preventDefault();
    e.stopPropagation();
  }

  preTouchMove(e) {
    if (this.clicked) {
      this.mouse = dom.locateTouch(e,this.offset);
      this.touchMove();
      e.preventDefault();
      e.stopPropagation();
    }
  }

  preTouchRelease(e) {
    this.mouse = dom.locateTouch(e, this.offset);
    this.clicked = false;
    this.touchRelease();
    this.emit('release');
    e.preventDefault();
    e.stopPropagation();
  }

  touch() {
    this.click();
  }

  touchMove() {
    this.move();
  }

  touchRelease() {
    this.release();
  }

  /**
  * Resize the interface
  * @param width {number} New width in pixels
  * @param height {number} New height in pixels
  *
  * @example
  * button.resize(100,100);
  */
  resize(width,height) {
    this.width = width;
    this.height = height;
    this.parent.style.width = this.width+'px';
    this.parent.style.height = this.height+'px';
    this.element.setAttribute('width',this.width);
    this.element.setAttribute('height',this.height);
    this.sizeInterface();
  }

  empty() {
    while (this.element.lastChild) {
      this.element.removeChild(this.element.lastChild);
    }
  }

  /**
  * Remove the interface from the page and cancel its event listener(s).
  *
  * @example
  * button.destroy();
  */
  destroy() {
    this.empty();
    this.parent.removeChild(this.element);
    this.removeAllListeners();
    if (this.instrument) {
      delete this.instrument[this.id];
    }
    this.customDestroy();
  }

  customDestroy() {

  }

  colorize(type,color) {
    this.colors[type] = color;
    this.colorInterface();
  }

}

Added public/nexus-js/lib/core/rack.js.



































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/*
Main concept:
synth = new Nexus.Rack('elementID');

Transform all elements inside the div
synth.elementID will hold the first slider interface

2) In future, potentially writing a rack that is re-usable?
Could also take JSON

new Nexus.Rack('#target',{
  pre: () => {
    create some divs here, or some audio code
  },
  interface: {
    slider1: Nexus.add.slider({
      top:10,
      left:10,
      width:50,
      height:100,
      min: 0,
      max: 100,
      step: 1
    }),
    wave1: Nexus.add.waveform({
      file: './path/to/file.mp3',
      width:500,
      height:100,
      mode: 'range'
    })
  },
  init: () => {
    // some audio init code goes here...
  }
});

*/

import * as transform from '../util/transform';
import dom from '../util/dom';

import { colors } from '../main';

export default class Rack {

  constructor(target, settings) {

    this.meta = {};
    this.meta.target = target;
    this.meta.parent = dom.parseElement(target); // should be a generic function for parsing a 'target' argument that checks for string/DOM/jQUERY
    this.meta.colors = {};

    if (settings) {
      this.meta.attribute = settings.attribute || 'nexus-ui';
      this.meta.title = settings.name || false;
      this.meta.open = settings.open || false;
    } else {
      this.meta.attribute = 'nexus-ui';
      this.meta.title = false;
      this.meta.open = false;
    }

    let defaultColors = colors(); // jshint ignore:line
    this.meta.colors.accent = defaultColors.accent;
    this.meta.colors.fill = defaultColors.fill;
    this.meta.colors.light = defaultColors.light;
    this.meta.colors.dark = defaultColors.dark;
    this.meta.colors.mediumLight = defaultColors.mediumLight;
    this.meta.colors.mediumDark = defaultColors.mediumDark;
    this.buildInterface();
    this.colorInterface();
  }

  buildInterface() {
    this.meta.parent.style.boxSizing = 'border-box';
    this.meta.parent.style.userSelect = 'none';
    this.meta.parent.style.mozUserSelect = 'none';
    this.meta.parent.style.webkitUserSelect = 'none';

    this.meta.contents = document.createElement('div');

    while (this.meta.parent.childNodes.length > 0) {
        this.meta.contents.appendChild(this.meta.parent.childNodes[0]);
    }

    this.meta.contents.style.padding = '0px';
    this.meta.contents.style.boxSizing = 'border-box';

    if (this.meta.title) {
      this.meta.titleBar = document.createElement('div');
      this.meta.titleBar.innerHTML = this.meta.title;
      this.meta.titleBar.style.fontFamily = 'arial';
      this.meta.titleBar.style.position = 'relative';
      this.meta.titleBar.style.color = '#888';
      this.meta.titleBar.style.padding = '7px';
      this.meta.titleBar.style.fontSize = '12px';

      this.meta.button = document.createElement('div');
      this.meta.button.style.position = 'absolute';
      this.meta.button.style.top = '5px' ;
      this.meta.button.style.right = '5px' ;
      this.meta.button.innerHTML = '-';
      this.meta.button.style.padding = '0px 5px 2px';
      this.meta.button.style.lineHeight = '12px';
      this.meta.button.style.fontSize = '15px';

      this.meta.button.style.cursor = 'pointer';

      this.meta.button.addEventListener('mouseover', () => {
        this.meta.button.style.backgroundColor = this.meta.colors.mediumDark;
      });
      this.meta.button.addEventListener('mouseleave', () => {
        this.meta.button.style.backgroundColor = this.meta.colors.mediumLight;
      });
      this.meta.button.addEventListener('click', () => {
        if (this.meta.open) {
          this.hide();
        } else {
          this.show();
        }
      });


      this.meta.titleBar.appendChild(this.meta.button);

      this.meta.parent.appendChild(this.meta.titleBar);
    }
    this.meta.parent.appendChild(this.meta.contents);

  //  var width = this.meta.parent.style.width = getComputedStyle(this.meta.parent).getPropertyValue('width');
//    this.meta.parent.style.width = width;

    let ui = transform.section(this.meta.target, this.meta.attribute);
    for (var key in ui) {
      this[key] = ui[key];
    }
  }

  colorInterface() {
    if (this.meta.title) {
      this.meta.button.style.backgroundColor = this.meta.colors.mediumLight;
      this.meta.button.style.border = 'solid 0px '+this.meta.colors.fill;
      this.meta.parent.style.border = 'solid 1px '+this.meta.colors.mediumLight;
      this.meta.parent.style.backgroundColor = this.meta.colors.light;
      this.meta.titleBar.style.backgroundColor = this.meta.colors.fill;
    }
  }

  show() {
    this.meta.contents.style.display = 'block';
    this.meta.open = true;
  }

  hide() {
    this.meta.contents.style.display = 'none';
    this.meta.open = false;
  }

  colorize(type,color) {
    for (var key in this) {
      if (this[key].colorize) {
        this[key].colorize(type,color);
      }
    }
    this.meta.colors[type] = color;
    this.colorInterface();
  }

  empty() {
    for (var key in this) {
      if (this[key].destroy) {
        this[key].destroy();
      }
    }
  }

}

Added public/nexus-js/lib/interfaces/button.js.

















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
'use strict';

let svg = require('../util/svg');
let ButtonTemplate = require('../components/buttontemplate');

/**
* Button
*
* @description Circular button with optional aftertouch.
*
* @demo <span nexus-ui="button"></span>
*
* @example
* var button = new Nexus.Button('#target')
*
* @example
* var button = new Nexus.Button('#target',{
*   'size': [80,80],
*   'mode': 'aftertouch',
*   'state': false
* })
*
* @output
* change
* Fires any time the interface's value changes. <br>
* In <b>button mode</b>, <b>toggle mode</b>, and <b>impulse mode</b>, the output data is a boolean describing the state of the button.<br>
* In <b>aftertouch mode</b>, the output data is an object containing x (0-1) and y (0-1) positions of aftertouch.
*
* @outputexample
* button.on('change',function(v) {
*   // v is the value of the button
*   console.log(v);
* })
*
*/

export default class Button extends ButtonTemplate {

  constructor() {

    let options = ['mode'];


    let defaults = {
      'size': [80,80],
      'mode': 'aftertouch', // button, aftertouch, impulse, toggle
      'state': false
    };

    super(arguments,options,defaults);


    /**
    * Interaction mode: supports "button", "aftertouch", "impulse", or "toggle"
    * @type {string}
    * @example button.mode = 'toggle';
    */
    this.mode = this.settings.mode;

    this.init();
    this.render();

  }

  buildInterface() {
    this.pad = svg.create('circle');
    this.element.appendChild(this.pad);

    this.interactionTarget = this.pad;

    // only used if in 'aftertouch' mode
    this.defs = svg.create('defs');
    this.element.appendChild(this.defs);

    this.gradient = svg.radialGradient(this.defs,2);

    this.gradient.stops[0].setAttribute('offset', '30%');

    this.gradient.stops[1].setAttribute('offset', '100%');

  }

  sizeInterface() {

    this.pad.setAttribute('cx',this.width/2);
    this.pad.setAttribute('cy',this.height/2);
    this.pad.setAttribute('r', Math.min(this.width,this.height) / 2 - this.width/40);
    this.pad.setAttribute('stroke-width', this.width/20);
  }

  colorInterface() {

    this.gradient.stops[0].setAttribute('stop-color', this.colors.accent);
    this.gradient.stops[1].setAttribute('stop-color', this.colors.fill);
    this.render();
  }

  /*
  * Update the visual interface using its current state
  *
  * @example
  * button.render();
  */
  render() {
    if (!this.state) {
      this.pad.setAttribute('fill', this.colors.fill);
      this.pad.setAttribute('stroke', this.colors.mediumLight);
    } else {
      if (this.mode==='aftertouch') {
        this.pad.setAttribute('stroke', 'url(#'+this.gradient.id+')');
        this.gradient.element.setAttribute('cx', (this.position.x*100)+'%');
        this.gradient.element.setAttribute('cy', ((1-this.position.y)*100)+'%');
      } else {
        this.pad.setAttribute('stroke', this.colors.accent);
      }
      this.pad.setAttribute('fill', this.colors.accent);
    }
  }

}

Added public/nexus-js/lib/interfaces/dial.js.























































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
'use strict';

let svg = require('../util/svg');
let math = require('../util/math');
let Interface = require('../core/interface');
let Step = require('../models/step');
import * as Interaction from '../util/interaction';

/**
* Dial
*
*
* @description Dial with radial or linear interaction.
*
* @demo <span nexus-ui="dial"></span>
*
* @example
* var dial = new Nexus.Dial('#target')
*
* @example
* var dial = new Nexus.Dial('#target',{
*   'size': [75,75],
*   'interaction': 'radial', // "radial", "vertical", or "horizontal"
*   'mode': 'relative', // "absolute" or "relative"
*   'min': 0,
*   'max': 1,
*   'step': 0,
*   'value': 0
* })
*
* @output
* change
* Fires any time the interface's value changes. <br>
* The event data is the number value of the interface.
*
* @outputexample
* dial.on('change',function(v) {
*   console.log(v);
* })
*
* @tutorial
* Dial
* ygGMxq
*
*/

export default class Dial extends Interface {

  constructor() {

    let options = ['min','max','value'];

    let defaults = {
      'size': [75,75],
      'interaction': 'radial', // radial, vertical, horizontal
      'mode': 'relative', // absolute, relative
      'min': 0,
      'max': 1,
      'step': 0,
      'value': 0
    };

    super(arguments,options,defaults);

    this.interaction = this.settings.interaction;

    this._value = new Step(this.settings.min, this.settings.max, this.settings.step, this.settings.value);

    this.position = new Interaction.Handle(this.settings.mode,this.interaction,[0,this.width],[this.height,0]);

    this.init();

    this.value = this._value.value;

    this.position.value = this._value.normalized;

    this.previousAngle = false;

    this.emit('change',this.value);

  }

  buildInterface() {

    this.background = svg.create('circle');
    this.screw = svg.create('circle');
    this.handle = svg.create('path');
    this.handle2 = svg.create('path');
    this.handleFill = svg.create('path');
    this.handle2Fill = svg.create('path');
    this.handleLine = svg.create('path');

    this.element.appendChild(this.background);
    this.element.appendChild(this.handle);
    this.element.appendChild(this.handle2);
    this.element.appendChild(this.handleFill);
    this.element.appendChild(this.handle2Fill);
    this.element.appendChild(this.handleLine);
    this.element.appendChild(this.screw);

  }


  sizeInterface() {

    this.position.resize([0,this.width],[this.height,0]);

    let center = {
      x: this.width/2,
      y: this.height/2
    };

    let diameter = Math.min(this.width,this.height);

    this.background.setAttribute('cx', center.x);
    this.background.setAttribute('cy', center.y);
    this.background.setAttribute('r', diameter/2-diameter/40);

    this.screw.setAttribute('cx', center.x);
    this.screw.setAttribute('cy', center.y);
    this.screw.setAttribute('r', diameter/12);

    let value = this.value;

    let handlePoints = {
      start: Math.PI*1.5,
      end: math.clip( math.scale(value,0,0.5,Math.PI*1.5,Math.PI*0.5) , Math.PI*0.5, Math.PI*1.5 )
    };
    let handle2Points = {
      start: Math.PI*2.5,
      end: math.clip( math.scale(value,0.5,1,Math.PI*2.5,Math.PI*1.5) , Math.PI*1.5, Math.PI*2.5 )
    };

    let handlePath = svg.arc(center.x, center.y, diameter/2-diameter/40, handlePoints.start, handlePoints.end);
    let handle2Path = svg.arc(center.x, center.y, diameter/2-diameter/40, handle2Points.start, handle2Points.end);

    this.handle.setAttribute('d',handlePath);
    this.handle.setAttribute('stroke-width', diameter/20);
    this.handle.setAttribute('fill', 'none');

    this.handle2.setAttribute('d',handle2Path);
    this.handle2.setAttribute('stroke-width', diameter/20);
    this.handle2.setAttribute('fill', 'none');

    handlePath += ' L '+center.x+' '+center.y;

    this.handleFill.setAttribute('d',handlePath);
    this.handleFill.setAttribute('fill-opacity', '0.3');

    handle2Path += ' L '+center.x+' '+center.y;

    this.handle2Fill.setAttribute('d',handle2Path);
    this.handle2Fill.setAttribute('fill-opacity', '0.3');

    let arcEndingA;
    if (value < 0.5) {
      arcEndingA = handlePoints.end;
    } else {
      arcEndingA = handle2Points.end;
    }

    let arcEndingX = center.x + Math.cos(arcEndingA) * (diameter/2);
    let arcEndingY = center.y + Math.sin(arcEndingA) * (diameter/2) * -1;

    this.handleLine.setAttribute('d','M '+center.x+' '+center.y+' L '+arcEndingX+' '+arcEndingY);
    this.handleLine.setAttribute('stroke-width', diameter/20);

  }

  colorInterface() {
    this.background.setAttribute('fill', this.colors.fill);
    this.screw.setAttribute('fill', this.colors.accent);
    this.handle.setAttribute('stroke', this.colors.accent);
    this.handle2.setAttribute('stroke', this.colors.accent);
    this.handleFill.setAttribute('fill', this.colors.accent);
    this.handle2Fill.setAttribute('fill', this.colors.accent);
    this.handleLine.setAttribute('stroke', this.colors.accent);

  }

  render() {
    let value = this._value.normalized;

    let center = {
      x: this.width/2,
      y: this.height/2
    };

    let diameter = Math.min(this.width,this.height);

    let handlePoints = {
      start: Math.PI*1.5,
      end: math.clip( math.scale(value,0,0.5,Math.PI*1.5,Math.PI*0.5) , Math.PI*0.5, Math.PI*1.5 )
    };
    let handle2Points = {
      start: Math.PI *2.5,
      end: math.clip( math.scale(value,0.5,1,Math.PI*2.5,Math.PI*1.5) , Math.PI*1.5, Math.PI*2.5 )
    };

    let handlePath = svg.arc(center.x, center.y, diameter/2-diameter/40, handlePoints.start, handlePoints.end);
    let handle2Path = svg.arc(center.x, center.y, diameter/2-diameter/40, handle2Points.start, handle2Points.end);

    this.handle.setAttribute('d',handlePath);
    this.handle2.setAttribute('d',handle2Path);


    handlePath += ' L '+center.x+' '+center.y;

    this.handleFill.setAttribute('d',handlePath);

    handle2Path += ' L '+center.x+' '+center.y;

    this.handle2Fill.setAttribute('d',handle2Path);

    let arcEndingA;
    if (value <= 0.5) {
      arcEndingA = handlePoints.end;
    } else {
      arcEndingA = handle2Points.end;
    }

    let arcEndingX = center.x + Math.cos(arcEndingA) * (diameter/2);
    let arcEndingY = center.y + Math.sin(arcEndingA) * (diameter/2) * -1;

    this.handleLine.setAttribute('d','M '+center.x+' '+center.y+' L '+arcEndingX+' '+arcEndingY);

  }


  click() {
    if (this.mode==='relative') {
      this.previousAngle = false;
    }
    this.position.anchor = this.mouse;
    this.position.value = this._value.normalized;
    this.move();
   }

  move() {
    if (this.clicked) {

      this.position.update(this.mouse);

      let angle = this.position.value*Math.PI*2;

      if (angle < 0 ) { angle += (Math.PI*2); }

      if (this.mode === 'relative') {
        if (this.previousAngle !== false && Math.abs(this.previousAngle - angle) > 2) {
          if (this.previousAngle > 3) {
            angle = Math.PI*2;
          } else {
            angle = 0;
          }
        }
      } /* else {
        if (this.previousAngle !== false && Math.abs(this.previousAngle - angle) > 2) {
          if (this.previousAngle > 3) {
            angle = Math.PI*2;
          } else {
            angle = 0;
          }
        }
      } */
      this.previousAngle = angle;

      let realValue = angle / (Math.PI*2);

      this.value = this._value.updateNormal( realValue );

      if (this.mode === 'relative') {
        this.position.value = realValue;
      }

      this.emit('change',this._value.value);

      this.render();

    }
  }

  release() {
  }

  /*
  Dial's value. When set, it will automatically be adjust to fit min/max/step settings of the interface.
  @type {number}
  @example dial.value = 10;

  get value() {
    return this._value.value;
  }

  set value(value) {
    this._value.update(value);
    this.emit('change',this.value);
    this.render();
  }
*/

    /**
    Dial's value. When set, it will automatically be adjust to fit min/max/step settings of the interface.
    @type {number}
    @example dial.value = 10;
    */
    get value() {
      return this._value.value;
    }
    set value(v) {
      this._value.update(v);
      this.position.value = this._value.normalized;
      this.emit('change',this._value.value);
      this.render();
    }

    /**
    Lower limit of the dial's output range
    @type {number}
    @example dial.min = 1000;
    */
    get min() {
      return this._value.min;
    }
    set min(v) {
      this._value.min = v;
    }

    /**
    Upper limit of the dial's output range
    @type {number}
    @example dial.max = 1000;
    */
    get max() {
      return this._value.max;
    }
    set max(v) {
      this._value.max = v;
    }

    /**
    The increment that the dial's value changes by.
    @type {number}
    @example dial.step = 5;
    */
    get step() {
      return this._value.step;
    }
    set step(v) {
      this._value.step = v;
    }

    /**
    Absolute mode (dial's value jumps to mouse click position) or relative mode (mouse drag changes value relative to its current position). Default: "relative".
    @type {string}
    @example dial.mode = "relative";
    */
    get mode() {
      return this.position.mode;
    }
    set mode(v) {
      this.position.mode = v;
    }


  /**
  Normalized value of the dial.
  @type {number}
  @example dial.normalized = 0.5;
  */
  get normalized() {
    return this._value.normalized;
  }

  set normalized(v) {
    this._value.updateNormal(v);
    this.emit('change',this.value);
  }

}

Added public/nexus-js/lib/interfaces/index.js.















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
export default {
  Position: require('./position'),
  Slider: require('./slider'),
  Toggle: require('./toggle'),
/*  Range: require('./rangeslider'),
  Waveform: require('./waveform'), */
  Button: require('./button'),
  TextButton: require('./textbutton'),
  RadioButton: require('./radiobutton'),
  Number: require('./number'),
  Select: require('./select'),
  Dial: require('./dial'),
  Piano: require('./piano'),
  Sequencer: require('./sequencer'),
  Pan2D: require('./pan2d'),
  Tilt: require('./tilt'),
  Multislider: require('./multislider'),
  Pan: require('./pan'),
  Envelope: require('./envelope'),
  Spectrogram: require('./spectrogram'),
  Meter: require('./meter'),
  Oscilloscope: require('./oscilloscope')
};

Added public/nexus-js/lib/interfaces/meter.js.











































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
'use strict';

let dom = require('../util/dom');
let math = require('../util/math');
let Interface = require('../core/interface');

/**
 * Meter
 *
 * @description Stereo decibel meter
 *
 * @demo <span nexus-ui="meter"></span>
 *
 * @example
 * var meter = new Nexus.Meter('#target')
 * meter.connect(myWebAudioNode)
 *
 * @example
 * var meter = new Nexus.Meter('#target', {
 *   size: [75,75]
 * })
 * meter.connect(myWebAudioNode)
 *
 * @output
 * &nbsp;
 * No events
 *
 */

export default class Meter extends Interface {
  constructor() {
    let options = [];

    let defaults = {
      size: [30, 100]
    };

    super(arguments, options, defaults);

    this.channels = 2;
    this.splitter = null;
    this.analysers = [];
    this.bufferLength = 0;
    this.dataArray = null;
    this.active = false;
    this.source = null;
    this.db = -Infinity;

    this.init();

    this.meterWidth = this.canvas.element.width / this.channels;

    this.render();
  }

  buildFrame() {
    this.canvas = new dom.SmartCanvas(this.parent);
    this.element = this.canvas.element;
  }

  sizeInterface() {
    this.canvas.resize(this.width, this.height);
  }

  colorInterface() {
    this.canvas.element.style.backgroundColor = this.colors.fill;
  }

  render() {
    if (this.active) {
      requestAnimationFrame(this.render.bind(this));
    }

    this.canvas.context.fillStyle = this.colors.fill;
    this.canvas.context.fillRect(
      0,
      0,
      this.canvas.element.width,
      this.canvas.element.height
    );

    for (let i = 0; i < this.analysers.length; i++) {
      if (this.source) {
        this.analysers[i].getFloatTimeDomainData(this.dataArray);

        let rms = 0;

        for (let i = 0; i < this.dataArray.length; i++) {
          rms += this.dataArray[i] * this.dataArray[i];
        }

        rms = Math.sqrt(rms / this.dataArray.length);

        this.db = 20 * Math.log10(rms);
      } else if (this.db > -200 && this.db !== -Infinity) {
        this.db -= 1;
      } else {
        this.db = -Infinity;
      }

      //console.log(db)

      if (this.db > -70) {
        let linear = math.normalize(this.db, -70, 5);
        let exp = linear * linear;
        let y = math.scale(exp, 0, 1, this.element.height, 0);

        this.canvas.context.fillStyle = this.colors.accent;
        this.canvas.context.fillRect(
          this.meterWidth * i,
          y,
          this.meterWidth,
          this.canvas.element.height - y
        );

        //console.log("rendering...")
      }
    }
  }

  /**
  Equivalent to "patching in" an audio node to visualize.
  @param node {AudioNode} The audio node to visualize
  @param channels {number} (optional) The number of channels in the source node to watch. If not specified, the interface will look for a .channelCount property on the input node. If it does not exist, the interface will default to 1 channel.
  @example meter.connect( Tone.Master, 2 );
  */
  connect(node, channels) {
    if (this.source) {
      this.disconnect();
    }

    this.channels = channels || node.channelCount || 2;

    this.splitter = node.context.createChannelSplitter(this.channels);

    this.analysers = [];
    for (let i = 0; i < this.channels; i++) {
      const analyser = node.context.createAnalyser();
      analyser.fftSize = 1024;
      analyser.smoothingTimeConstant = 1;
      this.splitter.connect(analyser, i);
      this.analysers.push(analyser);
    }
    this.bufferLength = this.analysers[0].frequencyBinCount;
    this.dataArray = new Float32Array(this.bufferLength);

    this.active = true;

    this.meterWidth = this.canvas.element.width / this.channels;

    this.source = node;
    this.source.connect(this.splitter);

    this.render();
  }

  /**
  Stop visualizing the source node and disconnect it.
  */
  disconnect() {
    if (this.source) {
      this.source.disconnect(this.splitter);
    }

    this.splitter = null;
    this.analysers = [];
    this.bufferLength = 0;
    this.dataArray = null;
    this.active = false;
    this.source = null;
  }

  click() {
    this.active = !this.active && this.source;
    this.render();
  }

  customDestroy() {
    this.active = false;
  }
}

Added public/nexus-js/lib/interfaces/multislider.js.























































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
'use strict';

let math = require('../util/math');
let svg = require('../util/svg');
let Interface = require('../core/interface');

/**
 * Multislider
 *
 * @description Multislider
 *
 * @demo <span nexus-ui="multislider"></span>
 *
 * @example
 * var multislider = new Nexus.Multislider('#target')
 *
 * @example
 * var multislider = new Nexus.Multislider('#target',{
 *  'size': [200,100],
 *  'numberOfSliders': 5,
 *  'min': 0,
 *  'max': 1,
 *  'step': 0,
 *  'candycane': 3,
 *  'values': [0.9,0.8,0.7,0.6,0.5,0.4,0.3,0.2,0.1],
 *  'smoothing': 0,
 *  'mode': 'bar'  // 'bar' or 'line'
 *})
 *
 * @output
 * change
 * Fires any time the interface's value changes. <br>
 * The event data is an object containing <i>index</i> and <i>value</i> properties
 *
 * @outputexample
 * multislider.on('change',function(v) {
 *   console.log(v);
 * })
 *
 */

export default class Multislider extends Interface {
  constructor() {
    let options = ['value'];

    let defaults = {
      size: [200, 100],
      numberOfSliders: 5,
      min: 0,
      max: 1,
      step: 0,
      candycane: 3,
      values: [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1],
      smoothing: 0,
      mode: 'bar' // 'bar', 'line'
    };

    super(arguments, options, defaults);

    this._numberOfSliders = this.settings.numberOfSliders;
    this._min = this.settings.min;
    this._max = this.settings.max;
    this._step = this.settings.step;

    this._mode = this.settings.mode;

    /**
    The current values of the slider. NOTE: Use this only to get the current values. Setting this array will not update the multislider. To set the multislider's values, use setSlider() or setAllSliders()
    @type {Array}
    */
    const vs = this.settings.values;
    this.values = vs.length > this._numberOfSliders ? vs.slice(0, this._numberOfSliders) : vs.concat(Array(this._numberOfSliders - vs.length).fill(0));

    this.candycane = this.settings.candycane;

    this.sliderWidth = this.width / this.values.length;

    /**
    Applies a simple low-pass filter to the multislider as it is interacted with. A smoothing of 0 will be no smoothing. A smoothing of 1 will smooth 1 slider on each side of the interaction. A smoothing of 2 will smooth 2 sliders on each side, and so on.
    @type {Number}
    */
    this.smoothing = this.settings.smoothing;

    this.init();
    this.render();
  }

  buildInterface() {
    if (this._mode == 'line') {
      this.line = svg.create('polyline');
      this.line.setAttribute('stroke-width', 2);
      this.line.setAttribute('fill', 'none');

      this.element.appendChild(this.line);

      this.fill = svg.create('polyline');
      this.fill.setAttribute('fill-opacity', '0.2');

      this.element.appendChild(this.fill);

      this.nodes = [];

      this.values.forEach(
        function(value, index) {
          let node = svg.create('circle');

          node.setAttribute('cx', this.getX(index));
          node.setAttribute('cy', this.getY(value));

          this.element.appendChild(node);
          this.nodes.push(node);
        }.bind(this)
      );
    } else {
      this.bars = [];
      this.caps = [];

      this.values.forEach(
        function(value, index) {
          let bar = svg.create('rect');

          let x = this.getBarX(index);
          let y = this.getY(value);

          bar.setAttribute('x', x - 0.1);
          bar.setAttribute('y', y);
          bar.setAttribute('width', this.sliderWidth + 0.2);
          bar.setAttribute('height', this.height);
          bar.setAttribute(
            'opacity',
            1 - ((index % this.candycane) + 1) / (this.candycane + 1)
          );

          this.element.appendChild(bar);
          this.bars.push(bar);

          let cap = svg.create('rect');

          cap.setAttribute('x', x - 0.1);
          cap.setAttribute('y', y);
          cap.setAttribute('width', this.sliderWidth + 0.2);
          cap.setAttribute('height', 5);

          this.element.appendChild(cap);
          this.caps.push(cap);
        }.bind(this)
      );
    }
  }

  getBarX(index) {
    return this.getX(index) - this.sliderWidth / 2;
  }

  getX(index) {
    //return Math.floor( index * this.sliderWidth + this.sliderWidth/2 );
    return index * this.sliderWidth + this.sliderWidth / 2;
  }

  getY(value) {
    return math.scale(value, this._min, this._max, this.height, 0); //(1 - value) * this.height;
  }

  getValueFromY(y) {
    let scaleAdjusted = math.scale(y, this.height, 0, this._min, this._max);
    return this.adjustValueToStep(scaleAdjusted);
  }

  getIndexFromX(x) {
    return math.clip(
      Math.floor((x / this.width) * this.values.length),
      0,
      this.values.length - 1
    );
  }

  adjustValueToStep(value) {
    if (!this._step) {
      return value;
    }
    let offset = value % this._step;
    value = value - (value % this._step);
    if (offset > this._step / 2) {
      value += this._step;
    }
    return value;
  }

  adjustAllValues() {
    this.values.forEach(
      function(value, index) {
        value = this.adjustValueToStep(value);
        this.values[index] = math.clip(value, this._min, this._max);
      }.bind(this)
    );
  }

  getNormalizedValues() {
    this.normalizedValues = [];
    this.values.forEach(
      function(value) {
        this.normalizedValues.push(
          math.scale(value, this._min, this._max, 0, 1)
        );
      }.bind(this)
    );
  }

  colorInterface() {
    this.element.style.backgroundColor = this.colors.fill;

    if (this._mode == 'line') {
      this.line.setAttribute('stroke', this.colors.accent);
      this.fill.setAttribute('fill', this.colors.accent);
      this.nodes.forEach(node => {
        node.setAttribute('fill', this.colors.accent);
      });
    } else {
      this.bars.forEach(bar => {
        bar.setAttribute('fill', this.colors.accent);
      });
      this.caps.forEach(cap => {
        cap.setAttribute('fill', this.colors.accent);
      });
    }
  }

  sizeInterface() {
    this.sliderWidth = this.width / this.values.length;

    if (this._mode == 'line') {
      this.nodes.forEach(
        function(node) {
          let r = ~~(Math.min(this.width, this.height) / 50) + 2;
          r = Math.min(this.sliderWidth, r);
          node.setAttribute('r', r);
        }.bind(this)
      );
    }

    this.render();
  }

  render() {
    if (this._mode == 'line') {
      let data = '0 ' + this.getY(this.values[0]) + ', ';

      this.values.forEach((value, index) => {
        let x = this.getX(index);
        let y = this.getY(value);
        data += x + ' ' + y + ', ';
        this.nodes[index].setAttribute('cx', this.getX(index));
        this.nodes[index].setAttribute('cy', this.getY(value));
      });

      data += this.width + ' ' + this.getY(this.values[this.values.length - 1]);

      this.line.setAttribute('points', data);

      // fill data
      // add bottom corners

      data += ', ' + this.width + ' ' + this.height + ', ';
      data += '0 ' + this.height;

      this.fill.setAttribute('points', data);
    } else {
      this.values.forEach((value, index) => {
        this.bars[index].setAttribute('y', this.getY(value));
        this.caps[index].setAttribute('y', this.getY(value));
      });
    }
  }

  click() {
    this.hasMoved = false;
    this.previousSlider = false;
    this.move();
  }

  move() {
    if (this.clicked) {
      this.mouse.x = math.clip(this.mouse.x, 0, this.width);
      this.mouse.y = math.clip(this.mouse.y, 0, this.height);
      this.hasMoved = true;

      this.selectedSlider = this.getIndexFromX(this.mouse.x);

      this.values[this.selectedSlider] = this.getValueFromY(this.mouse.y);

      /* handle interpolation for in-between sliders */

      if (this.previousSlider !== false) {
        let distance = Math.abs(this.previousSlider - this.selectedSlider);
        if (distance > 1) {
          let low = Math.min(this.previousSlider, this.selectedSlider);
          let high = Math.max(this.previousSlider, this.selectedSlider);
          let lowValue = this.values[low];
          let highValue = this.values[high];
          for (let i = low; i < high; i++) {
            this.values[i] = math.interp(
              (i - low) / distance,
              lowValue,
              highValue
            );
            this.values[i] = this.adjustValueToStep(this.values[i]);
          }
        }
      }

      if (this.smoothing > 0) {
        for (var i = 1; i <= this.smoothing; i++) {
          let downCenter = this.selectedSlider - i;
          let upCenter = this.selectedSlider + i;

          if (downCenter >= 1) {
            let downLowerNeighbor = downCenter - 1 >= 0 ? downCenter - 1 : 0;
            let downUpperNeighbor = downCenter + 1;
            this.values[downCenter] =
              (this.values[downLowerNeighbor] +
                this.values[downUpperNeighbor]) /
              2;
            this.values[downCenter] = this.adjustValueToStep(
              this.values[downCenter]
            );
          }

          if (upCenter < this.values.length - 1) {
            let upLowerNeighbor = upCenter - 1;
            let upUpperNeighbor = upCenter + 1 < this.values.length ? upCenter + 1 : this.values.length - 1;
            this.values[upCenter] =
              (this.values[upLowerNeighbor] + this.values[upUpperNeighbor]) / 2;
            this.values[upCenter] = this.adjustValueToStep(
              this.values[upCenter]
            );
          }
        }
      }

      this.previousSlider = this.selectedSlider;

      this.emit('change', this.values);
      this.render();
    }
  }

  // would be a cool API call to have for later...
  scan() {}

  update(index, value) {
    this.values[index] = this.adjustValueToStep(value);
    this.emit('change', {
      index: index,
      value: value
    });
  }

  /**
  Get the number of sliders
  @type {Number}
  */
  get numberOfSliders() {
    return this.values.length;
  }

  /**
  Lower limit of the multislider's output range
  @type {number}
  @example multislider.min = 1000;
  */
  get min() {
    return this._min;
  }
  set min(v) {
    this._min = v;
    this.adjustAllValues();
    this.render();
  }

  /**
  Upper limit of the multislider's output range
  @type {number}
  @example multislider.max = 1000;
  */
  get max() {
    return this._max;
  }
  set max(v) {
    this._max = v;
    this.adjustAllValues();
    this.render();
  }

  /**
  The increment that the multislider's value changes by.
  @type {number}
  @example multislider.step = 5;
  */
  get step() {
    return this._step;
  }
  set step(v) {
    this._step = v;
    this.adjustAllValues();
    this.render();
  }

  /**
  Set the value of an individual slider
  @param index {number} Slider index
  @param value {number} New slider value
  @example
  // Set the first slider to value 0.5
  multislider.setSlider(0,0.5)
  */
  setSlider(index, value) {
    this.values[index] = this.adjustValueToStep(value);
    this.values[index] = math.clip(this.values[index], this._min, this._max);
    this.emit('change', {
      index: index,
      value: value
    });
  }

  /**
  Set the value of all sliders at once. If the size of the input array does not match the current number of sliders, the value array will repeat until all sliders have been set. I.e. an input array of length 1 will set all sliders to that value.
  @param values {Array} All slider values
  @example
  multislider.setAllSliders([0.2,0.3,0.4,0.5,0.6])
  */
  setAllSliders(values) {
    let previousLength = this.values.length;
    let newLength = values.length;
    this.values = values;
    this.adjustAllValues();
    if (previousLength != newLength) {
      this.empty();
      this.buildInterface();
      this.colorInterface();
    }
    this.sizeInterface();
  }
}

Added public/nexus-js/lib/interfaces/number.js.













































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
'use strict';

let Interface = require('../core/interface');
let Step = require('../models/step');
let math = require('../util/math');
let util = require('../util/util');

/**
* Number
*
* @description Number interface which is controllable by dragging or typing.
*
* @demo <span nexus-ui="number"></span>
*
* @example
* var number = new Nexus.Number('#target')
*
* @example
* var number = new Nexus.Number('#target',{
*   'size': [60,30],
*   'value': 0,
*   'min': 0,
*   'max': 20000,
*   'step': 1
* })
*
* @output
* change
* Fires any time the interface's value changes. <br>
* The event data is the number value of the interface.
*
* @outputexample
* number.on('change',function(v) {
*   console.log(v);
* })
*
*
*/


export default class Number extends Interface {

  constructor() {

    let options = ['value'];

    let defaults = {
      'size': [60,30],
      'value': 0,
      'min': 0,
      'max': 20000,
      'step': 1
    };

    super(arguments,options,defaults);

    this._value = new Step(this.settings.min,this.settings.max,this.settings.step,this.settings.value);

    /*
    Default: 2. How many decimal places to clip the number's visual rendering to. This does not affect number's actual value output -- for that, set the step property to .01, .1, or 1.
    @type {number}
    @example number.decimalPlaces = 2;
    */
    this.decimalPlaces = 2;
    this.actual = 0;

    this.max = this._value.max;

    this.min = this._value.min;

    this.step = this._value.step;

    this.init();
    this.render();

  }

  buildFrame() {
    this.element = document.createElement('input');
    this.element.type = 'text';

    this.element.addEventListener('blur', function () {
      this.element.style.backgroundColor = this.colors.fill;
      this.element.style.color = this.colors.dark;
      if (this.element.value !== this.value) {
        this.value = parseFloat(this.element.value);
        this.render();
      }
    }.bind(this));

    util.setInputFilter(this.element, function(value) {
      return /^-?\d*\.?\d*$/.test(value); });

    this.element.addEventListener('keydown', function (e) {
      if (e.which===13) {
        this.element.blur();
        this.value = this.element.value;
        this.emit('change',this.value);
        this.render();
      }
    }.bind(this), true);

    this.parent.appendChild(this.element);

  }

  sizeInterface() {

    this._minDimension = Math.min(this.width,this.height);

    let styles = 'width: ' + this.width + 'px;';
    styles += 'height: ' + this.height + 'px;';
    styles += 'background-color: #e7e7e7;';
    styles += 'color: #333;';
    styles += 'font-family: arial;';
    styles += 'font-weight: 500;';
    styles += 'font-size:' + this._minDimension/2 + 'px;';
  //  styles += 'highlight: #d18;';
    styles += 'border: none;';
    styles += 'outline: none;';
    styles += 'padding: '+this._minDimension/4+'px '+this._minDimension/4+'px;';
    styles += 'box-sizing: border-box;';
    styles += 'userSelect: text;';
    styles += 'mozUserSelect: text;';
    styles += 'webkitUserSelect: text;';
    this.element.style.cssText += styles;

    // to add eventually
    // var css = '#'+this.elementID+'::selection{ background-color: transparent }';

    this.element.value = this.value;

  }

  colorInterface() {
      this.element.style.backgroundColor = this.colors.fill;
      this.element.style.color = this.colors.dark;
  }

  render() {

    this.element.value = math.prune(this.value,this.decimalPlaces);

  }

  click() {
    this.hasMoved = false;
    this.element.readOnly = true;
	  this.actual = this.value;
    this.initial = { y: this.mouse.y };
    this.changeFactor = math.invert( this.mouse.x / this.width );
  }

  move() {
    this.hasMoved = true;
    if (this.clicked) {

      let newvalue = this.actual - (this.mouse.y - this.initial.y) * ( math.clip( this.max-this.min, 0, 1000 ) / 200 ) * Math.pow(this.changeFactor,2);
      this.value = newvalue;

  		this.render();
      if (this._value.changed) {
        this.emit('change',this.value);
      }

  	}
  }

  release() {
    if (!this.hasMoved) {
      this.element.readOnly = false;
  		this.element.focus();
  		this.element.setSelectionRange(0, this.element.value.length);
  		this.element.style.backgroundColor = this.colors.accent;
  		this.element.style.color = this.colors.light;
    } else {
      document.body.focus();
    }
  }

  /**
  Connect this number interface to a dial or slider
  @param {Interface} element Element to connect to.
  @example number.link(slider)
  */
  link(destination) {
    this.min = destination.min;
    this.max = destination.max;
    this.step = destination.step;
    destination.on('change',(v) => {
      this.passiveUpdate(v);
    });
    this.on('change',(v) => {
      destination.value = v;
    });
    this.value = destination.value;
  /*  return {
      listener1: listener1,
      listener2: listener2,
      destroy: () => {
        listener1.remove() (or similar)
        listener2.remove() (or similar)
      }
    } */
  }

  passiveUpdate(v) {
    this._value.update(v);
    this.render();
  }

  /**
  The interface's current value. If set manually, will update the interface and trigger the output event.
  @type {number}
  @example number.value = 10;
  */
  get value() {
    return this._value.value;
  }
  set value(v) {
    this._value.update(v);
    this.emit('change',this.value);
    this.render();
  }

  /**
  Lower limit of the number's output range
  @type {number}
  @example number.min = 1000;
  */
  get min() {
    return this._value.min;
  }
  set min(v) {
    this._value.min = v;
  }

  /**
  Upper limit of the number's output range
  @type {number}
  @example number.max = 1000;
  */
  get max() {
    return this._value.max;
  }
  set max(v) {
    this._value.max = v;
  }

  /**
  The increment that the number's value changes by.
  @type {number}
  @example number.step = 5;
  */
  get step() {
    return this._value.step;
  }
  set step(v) {
    this._value.step = v;
  }

}

Added public/nexus-js/lib/interfaces/oscilloscope.js.





































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
'use strict';

let dom = require('../util/dom');
let Interface = require('../core/interface');

/**
 * Oscilloscope
 *
 * @description Visualizes a waveform's stream of values.
 *
 * @demo <span nexus-ui="oscilloscope"></span>
 *
 * @example
 * var oscilloscope = new Nexus.Oscilloscope('#target')
 * oscilloscope.connect(myWebAudioNode)
 *
 * @example
 * var oscilloscope = new Nexus.Oscilloscope('#target',{
 *   'size': [300,150]
 * })
 * oscilloscope.connect(myWebAudioNode)
 *
 * @output
 * &nbsp;
 * No events
 *
 */

export default class Oscilloscope extends Interface {
  constructor() {
    let options = [];

    let defaults = {
      size: [300, 150]
    };

    super(arguments, options, defaults);

    this.analyser = null;
    this.bufferLength = 0;
    this.dataArray = null;

    this.active = false;

    this.source = null;

    this.init();

    this.render();
  }

  buildFrame() {
    this.canvas = new dom.SmartCanvas(this.parent);
    this.element = this.canvas.element;
  }

  sizeInterface() {
    this.canvas.resize(this.width, this.height);
  }

  colorInterface() {
    this.canvas.element.style.backgroundColor = this.colors.fill;
  }

  render() {
    if (this.active) {
      requestAnimationFrame(this.render.bind(this));
    }

    if (this.analyser) {
      this.analyser.getByteTimeDomainData(this.dataArray);
    }

    this.canvas.context.fillStyle = this.colors.fill;
    this.canvas.context.fillRect(
      0,
      0,
      this.canvas.element.width,
      this.canvas.element.height
    );

    this.canvas.context.lineWidth = ~~(this.height / 100 + 2);
    this.canvas.context.strokeStyle = this.colors.accent;

    this.canvas.context.beginPath();

    if (this.source) {
      var sliceWidth = (this.canvas.element.width * 1.0) / this.bufferLength;
      var x = 0;

      for (var i = 0; i < this.bufferLength; i++) {
        var v = this.dataArray[i] / 128.0;
        var y = (v * this.canvas.element.height) / 2;

        if (i === 0) {
          this.canvas.context.moveTo(x, y);
        } else {
          this.canvas.context.lineTo(x, y);
        }

        x += sliceWidth;
      }
    } else {
      this.canvas.context.moveTo(0, this.canvas.element.height / 2);
      this.canvas.context.lineTo(
        this.canvas.element.width,
        this.canvas.element.height / 2
      );
    }

    this.canvas.context.stroke();
  }

  /**
  Equivalent to "patching in" an audio node to visualize.
  @param node {AudioNode} The audio node to visualize
  @example oscilloscope.connect( Tone.Master );
  */

  connect(node) {
    if (this.source) {
      this.disconnect();
    }

    this.analyser = node.context.createAnalyser();
    this.analyser.fftSize = 2048;
    this.bufferLength = this.analyser.frequencyBinCount;
    this.dataArray = new Uint8Array(this.bufferLength);
    this.analyser.getByteTimeDomainData(this.dataArray);

    this.active = true;

    this.source = node;
    this.source.connect(this.analyser);

    this.render();
  }

  /**
  Stop visualizing the source node and disconnect it.
  */
  disconnect() {
    if (this.source) {
      this.source.disconnect(this.analyser);
    }

    this.analyser = null;
    this.bufferLength = 0;
    this.dataArray = null;
    this.active = false;
    this.source = null;
  }

  click() {
    this.active = !this.active && this.source;
    this.render();
  }

  customDestroy() {
    this.active = false;
  }
}

Added public/nexus-js/lib/interfaces/pan.js.



















































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
'use strict';

let svg = require('../util/svg');
let math = require('../util/math');
let Interface = require('../core/interface');
let Step = require('../models/step');
import * as Interaction from '../util/interaction';

/**
* Pan
*
* @description Stereo crossfader.
*
* @demo <span nexus-ui="pan"></span>
*
* @example
* var pan = new Nexus.Pan('#target')
*
* @output
* change
* Fires any time the interface's value changes. <br>
* The event data is an object containing the interface's <i>value</i> (-1 to 1), as well as <i>L</i> and <i>R</i> amplitude values (0-1) for left and right speakers, calculated by a square-root crossfade algorithm.
*
* @outputexample
* pan.on('change',function(v) {
*   console.log(v);
* })
*
*
*/

export default class Pan extends Interface {

  constructor() {

    let options = ['scale','value'];

    let defaults = {
      'size': [120,20],
      'orientation': 'horizontal',
      'mode': 'relative',
      'scale': [-1,1],
      'step': 0,
      'value': 0,
      'hasKnob': true
    };

    super(arguments,options,defaults);

    this.orientation = this.settings.orientation;

    this.mode = this.settings.mode;

    this.hasKnob = this.settings.hasKnob;

    // this.step should eventually be get/set
    // updating it will update the _value step model
    this.step = this.settings.step; // float

    this._value = new Step(this.settings.scale[0], this.settings.scale[1], this.settings.step, this.settings.value);

    this.init();

    this.position = new Interaction.Handle(this.mode,this.orientation,[0,this.width],[this.height,0]);
    this.position.value = this._value.normalized;

    this.value = this._value.value;

    this.emit('change',this.value);

  }

  buildInterface() {

    this.bar = svg.create('rect');
    this.knob = svg.create('circle');

    this.element.appendChild(this.bar);
    this.element.appendChild(this.knob);

  }

  sizeInterface() {

    if (this.position) {
      this.position.resize([0,this.width],[this.height,0]);
    }

    if (this.width < this.height) {
      this.orientation = 'vertical';
    } else {
      this.orientation = 'horizontal';
    }

    let x, y, w, h, barOffset, cornerRadius;
    this.knobData = {
      level: 0,
      r: 0
    };

    if (this.orientation === 'vertical') {
      this.thickness = this.width / 2;
    	x = this.width/2;
    	y = 0;
    	w = this.thickness;
    	h = this.height;
      this.knobData.r = this.thickness * 0.8;
    	this.knobData.level = h-this.knobData.r-this.normalized*(h-this.knobData.r*2);
      barOffset = 'translate('+this.thickness*(-1)/2+',0)';
      cornerRadius = w/2;
    } else {
      this.thickness = this.height / 2;
    	x = 0;
    	y = this.height/2;
    	w = this.width;
    	h = this.thickness;
      this.knobData.r = this.thickness * 0.8;
    	this.knobData.level = this.normalized*(w-this.knobData.r*2)+this.knobData.r;
      barOffset = 'translate(0,'+this.thickness*(-1)/2+')';
      cornerRadius = h/2;
    }

    this.bar.setAttribute('x',x);
    this.bar.setAttribute('y',y);
    this.bar.setAttribute('transform',barOffset);
    this.bar.setAttribute('rx',cornerRadius); // corner radius
    this.bar.setAttribute('ry',cornerRadius);
    this.bar.setAttribute('width',w);
    this.bar.setAttribute('height',h);

    if (this.orientation === 'vertical') {
      this.knob.setAttribute('cx',x);
      this.knob.setAttribute('cy',this.knobData.level);
    } else {
      this.knob.setAttribute('cx',this.knobData.level);
      this.knob.setAttribute('cy',y);
    }
    this.knob.setAttribute('r',this.knobData.r);

  }

  colorInterface() {

    this.bar.setAttribute('fill', this.colors.fill);
    this.knob.setAttribute('fill', this.colors.accent);

    if (!this.hasKnob) {
      this.knob.setAttribute('fill','transparent');
    }

  }

  render() {
    if (!this.clicked) {
      this.knobData.r = this.thickness*0.75;
    }
    this.knob.setAttribute('r',this.knobData.r);

    if (this.orientation === 'vertical') {
  	   this.knobData.level = this.knobData.r+this._value.normalized*(this.height-this.knobData.r*2);
       this.knob.setAttribute('cy',this.height - this.knobData.level);
    } else {
  	   this.knobData.level = this._value.normalized*(this.width-this.knobData.r*2)+this.knobData.r;
       this.knob.setAttribute('cx',this.knobData.level);
    }
  }


  click() {
    this.knobData.r = this.thickness*0.9;
    this.position.anchor = this.mouse;
    this.move();
  }

  move() {
    if (this.clicked) {
      this.position.update(this.mouse);

      this.value = this._value.updateNormal( this.position.value );

      this.emit('change',{
        value: this.value,
        L: Math.pow( math.scale(this.value,-1,1,1,0), 2),
        R: Math.pow( math.scale(this.value,-1,1,0,1), 2)
      });

    }
  }

  release() {
    this.render();
  }

  /**
  The position of crossfader, from -1 (left) to 1 (right). Setting this value updates the interface and triggers the output event.
  @type {number}
  */
  get value() {
    return this._value.value;
  }

  set value(value) {
    this._value.update(value);
    this.position.value = this._value.normalized;
    this.emit('change',{
      value: this.value,
      L: Math.pow( math.scale(this.value,-1,1,1,0), 2),
      R: Math.pow( math.scale(this.value,-1,1,0,1), 2)
    });
    this.render();
  }

  get normalized() {
    return this._value.normalized;
  }

}

Added public/nexus-js/lib/interfaces/pan2d.js.







































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
'use strict';

let svg = require('../util/svg');
let math = require('../util/math');
let Interface = require('../core/interface');
let Step = require('../models/step');
import * as Interaction from '../util/interaction';

/**
* Pan2D
*
* @description Interface for moving a sound around an array of speakers. Speaker locations can be customized. The interface calculates the closeness of the sound source to each speaker and returns that distance as a numeric value.
*
* @demo <span nexus-ui="pan2D"></span>
*
* @example
* var pan2d = new Nexus.Pan2d('#target')
*
* @example
* var pan2d = new Nexus.Pan2D('#target',{
*   'size': [200,200],
*   'range': 0.5,  // detection radius of each speaker
*   'mode': 'absolute',   // 'absolute' or 'relative' sound movement
*   'speakers': [  // the speaker [x,y] positions
*       [0.5,0.2],
*       [0.75,0.25],
*       [0.8,0.5],
*       [0.75,0.75],
*       [0.5,0.8],
*       [0.25,0.75]
*       [0.2,0.5],
*       [0.25,0.25]
*   ]
* })
*
* @output
* change
* Fires any time the "source" node's position changes. <br>
* The event data is an array of the amplitudes (0-1), representing the level of each speaker (as calculated by its distance to the audio source).
*
* @outputexample
* pan2d.on('change',function(v) {
*   console.log(v);
* })
*
*/

export default class Pan2D extends Interface {

  constructor() {

    let options = ['range'];

    let defaults = {
      'size': [200,200],
      'range': 0.5,
      'mode': 'absolute',
      'speakers': [
        [0.5,0.2],
        [0.75,0.25],
        [0.8,0.5],
        [0.75,0.75],
        [0.5,0.8],
        [0.25,0.75],
        [0.2,0.5],
        [0.25,0.25]
      ]
    };

    super(arguments,options,defaults);

    this.value = {
      x: new Step(0,1,0,0.5),
      y: new Step(0,1,0,0.5)
    };

    /**
    Absolute or relative mouse interaction. In "absolute" mode, the source node will jump to your mouse position on mouse click. In "relative" mode, it does not.
    */
    this.mode = this.settings.mode;

    this.position = {
      x: new Interaction.Handle(this.mode,'horizontal',[0,this.width],[this.height,0]),
      y: new Interaction.Handle(this.mode,'vertical',[0,this.width],[this.height,0])
    };
    this.position.x.value = this.value.x.normalized;
    this.position.y.value = this.value.y.normalized;

    /**
    An array of speaker locations. Update this with .moveSpeaker() or .moveAllSpeakers()
    */
    this.speakers = this.settings.speakers;

    /**
    Rewrite: The maximum distance from a speaker that the source node can be for it to be heard from that speaker. A low range (0.1) will result in speakers only playing when the sound is very close it. Default is 0.5 (half of the interface).
    */
    this.range = this.settings.range;

    /**
    The current levels for each speaker. This is calculated when a source node or speaker node is moved through interaction or programatically.
    */
    this.levels = [];

    this.init();

    this.calculateLevels();
    this.render();

  }

  buildInterface() {

    this.knob = svg.create('circle');


    this.element.appendChild(this.knob);


    // add speakers
    this.speakerElements = [];

    for (let i=0;i<this.speakers.length;i++) {
      let speakerElement = svg.create('circle');

      this.element.appendChild(speakerElement);

      this.speakerElements.push(speakerElement);
    }

  }

  sizeInterface() {

        this._minDimension = Math.min(this.width,this.height);

        this.knobRadius = {
          off: ~~(this._minDimension/100) * 3 + 5,
        };
        this.knobRadius.on = this.knobRadius.off * 2;

        this.knob.setAttribute('cx',this.width/2);
        this.knob.setAttribute('cy',this.height/2);
        this.knob.setAttribute('r',this.knobRadius.off);

        for (let i=0;i<this.speakers.length;i++) {
          let speakerElement = this.speakerElements[i];
          let speaker = this.speakers[i];
          speakerElement.setAttribute('cx',speaker[0]*this.width);
          speakerElement.setAttribute('cy',speaker[1]*this.height);
          speakerElement.setAttribute('r',this._minDimension/20 + 5);
          speakerElement.setAttribute('fill-opacity', '0');
        }

      this.position.x.resize([0,this.width],[this.height,0]);
      this.position.y.resize([0,this.width],[this.height,0]);

        // next, need to
        // resize positions
        // calculate speaker distances
      this.calculateLevels();
      this.render();

  }

  colorInterface() {

    this.element.style.backgroundColor = this.colors.fill;
    this.knob.setAttribute('fill', this.colors.mediumLight);

    for (let i=0;i<this.speakers.length;i++) {
      let speakerElement = this.speakerElements[i];
      speakerElement.setAttribute('fill', this.colors.accent);
      speakerElement.setAttribute('stroke', this.colors.accent);
    }

  }

  render() {
    this.knobCoordinates = {
      x: this.value.x.normalized * this.width,
      y: this.height - this.value.y.normalized * this.height
    };

    this.knob.setAttribute('cx',this.knobCoordinates.x);
    this.knob.setAttribute('cy',this.knobCoordinates.y);
  }


  click() {
    this.position.x.anchor = this.mouse;
    this.position.y.anchor = this.mouse;
    this.move();
  }

  move() {
    if (this.clicked) {
      this.position.x.update(this.mouse);
      this.position.y.update(this.mouse);
      // position.x and position.y are normalized
      // so are the levels
      // likely don't need this.value at all -- only used for drawing
      // not going to be a 'step' or 'min' and 'max' in this one.
      this.calculateLevels();
      this.emit('change',this.levels);
      this.render();
    }
  }

  release() {
    this.render();
  }

  get normalized() {
    return {
      x: this.value.x.normalized,
      y: this.value.y.normalized
    };
  }

  calculateLevels() {
    this.value.x.updateNormal( this.position.x.value );
    this.value.y.updateNormal( this.position.y.value );
    this.levels = [];
    this.speakers.forEach((s,i) => {
      let distance = math.distance(s[0]*this.width,s[1]*this.height,this.position.x.value*this.width,(1-this.position.y.value)*this.height);
      let level = math.clip(1-distance/(this.range*this.width),0,1);
      this.levels.push(level);
      this.speakerElements[i].setAttribute('fill-opacity', level);
    });
  }

  /**
  Move the audio source node and trigger the output event.
  @param x {number} New x location, normalized 0-1
  @param y {number} New y location, normalized 0-1
  */
  moveSource(x,y) {
    let location = {
      x: x*this.width,
      y: y*this.height
    };
    this.position.x.update(location);
    this.position.y.update(location);
    this.calculateLevels();
    this.emit('change',this.levels);
    this.render();
  }

  /**
  Move a speaker node and trigger the output event.
  @param index {number} Index of the speaker to move
  @param x {number} New x location, normalized 0-1
  @param y {number} New y location, normalized 0-1
  */
  moveSpeaker(index,x,y) {

    this.speakers[index] = [x,y];
    this.speakerElements[index].setAttribute('cx', x*this.width);
    this.speakerElements[index].setAttribute('cy', y*this.height);
    this.calculateLevels();
    this.emit('change',this.levels);
    this.render();

  }

  /**
  Set all speaker locations
  @param locations {Array} Array of speaker locations. Each item in the array should be an array of normalized x and y coordinates.

  setSpeakers(locations) {

  }
  */

}

Added public/nexus-js/lib/interfaces/piano.js.





































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
'use strict';

let svg = require('../util/svg');
let Interface = require('../core/interface');
let ButtonTemplate = require('../components/buttontemplate');
let touch = require('../util/touch');

class PianoKey extends ButtonTemplate {

  constructor() {

    let options = ['value','note','color'];

    let defaults = {
      'size': [80,80],
      'target': false,
      'mode': 'button',
      'value': 0
    };

    super(arguments,options,defaults);

    this.note = this.settings.note;
    this.color = this.settings.color;

    this.colors = {
      'w': '#fff',
      'b': '#666',
    };

    this.init();
    this.render();

  }

  buildFrame() {
    this.element = svg.create('svg');
    this.element.setAttribute('width',this.width);
    this.element.setAttribute('height',this.height);
    this.parent.appendChild(this.element);
  }

  buildInterface() {

    this.pad = svg.create('rect');

    this.element.appendChild(this.pad);

    this.interactionTarget = this.pad;

    /* events */

    if (!touch.exists) {

      this.click = () => {
      //  console.log('click');
        this.piano.interacting = true;
        this.piano.paintbrush = !this.state;
        this.down(this.piano.paintbrush);
      };

      this.pad.addEventListener('mouseover', () => {
        if (this.piano.interacting) {
      //    console.log('mouseover');
          this.down(this.piano.paintbrush);
        }
      });


      this.move = () => {
        if (this.piano.interacting) {
        //  console.log('move');
          this.bend();
        }
      };


      this.release = () => {
        this.piano.interacting = false;
      //  console.log('release');
      //  this.up();
      };
      this.pad.addEventListener('mouseup', () => {
        if (this.piano.interacting) {
        //  console.log('mouseup');
          this.up();
        }
      });
      this.pad.addEventListener('mouseout', () => {
        if (this.piano.interacting) {
        //  console.log('mouseout');
          this.up();
        }
      });

    }

  }

  sizeInterface() {

        //let radius = Math.min(this.width,this.height) / 5;
        let radius = 0;

        this.pad.setAttribute('x',0.5);
        this.pad.setAttribute('y',0.5);
        if (this.width > 2) {
          this.pad.setAttribute('width', this.width - 1);
        } else {
          this.pad.setAttribute('width', this.width);
        }
        if (this.height > 2) {
          this.pad.setAttribute('height', this.height);
        } else {
          this.pad.setAttribute('height', this.height);
        }
        this.pad.setAttribute('rx', radius);
        this.pad.setAttribute('ry', radius);

  }

  render() {
    if (!this.state) {
      this.pad.setAttribute('fill', this.colors[this.color]);
    } else {
      this.pad.setAttribute('fill', this.colors.accent);
    }
  }

}

/**
* Piano
*
* @description Piano keyboard interface
*
* @demo <div nexus-ui="piano"></div>
*
* @example
* var piano = new Nexus.Piano('#target')
*
* @example
* var piano = new Nexus.Piano('#target',{
*     'size': [500,125],
*     'mode': 'button',  // 'button', 'toggle', or 'impulse'
*     'lowNote': 24,
*     'highNote': 60
* })
*
* @output
* change
* Fires any time a new key is pressed or released <br>
* The event data is an object containing <i>note</i> and <i>state</i> properties.
*
* @outputexample
* piano.on('change',function(v) {
*   console.log(v);
* })
*
*/

export default class Piano extends Interface {

  constructor() {

    let options = ['value'];

    let defaults = {
      'size': [500,125],
      'lowNote': 24,
      'highNote': 60,
      'mode': 'button'
    };

    super(arguments,options,defaults);

    this.keyPattern = ['w','b','w','b','w','w','b','w','b','w','b','w'];

    this.paintbrush = false;

    this.mode = this.settings.mode;

    this.range = {
      low: this.settings.lowNote,
      high: this.settings.highNote
    };

    this.range.size = this.range.high - this.range.low + 1;

    this.keys = [];

    this.toggleTo = false;

    this.init();
    this.render();

  }

  buildFrame() {
    this.element = document.createElement('div');
    this.element.style.position = 'relative';
    this.element.style.borderRadius = '0px';
    this.element.style.display = 'block';
    this.element.style.width = '100%';
    this.element.style.height = '100%';
    this.parent.appendChild(this.element);
  }

  buildInterface() {

    this.keys = [];

    for (let i=0;i<this.range.size;i++) {

      let container = document.createElement('span');
      let scaleIndex = (i+this.range.low) % this.keyPattern.length;

      let key = new PianoKey(container, {
          component: true,
          note: i+this.range.low,
          color: this.keyPattern[scaleIndex],
          mode: this.mode
        }, this.keyChange.bind(this,i+this.range.low));

      key.piano = this;

      if (touch.exists) {
        key.pad.index = i;
        key.preClick = key.preMove = key.preRelease = () => {};
        key.click = key.move = key.release = () => {};
        key.preTouch = key.preTouchMove = key.preTouchRelease = () => {};
        key.touch = key.touchMove = key.touchRelease = () => {};
      }

      this.keys.push(key);
      this.element.appendChild(container);

    }
    if (touch.exists) {
      this.addTouchListeners();
    }

  }

  sizeInterface() {

    let keyX = 0;

    let keyPositions = [];

    for (let i=0;i<this.range.size;i++) {

      keyPositions.push(keyX);

      let scaleIndex = (i+this.range.low) % this.keyPattern.length;
      let nextScaleIndex = (i+1+this.range.low) % this.keyPattern.length;
      if (i+1+this.range.low >= this.range.high) {
        keyX += 1;
      } else if (this.keyPattern[scaleIndex] === 'w' && this.keyPattern[nextScaleIndex] === 'w') {
        keyX += 1;
      } else {
        keyX += 0.5;
      }
    }
    let keysWide = keyX;


  //  let padding = this.width / 120;
    let padding = 1;
    let buttonWidth = (this.width-padding*2) / keysWide;
    let buttonHeight = (this.height-padding*2) / 2;

    for (let i=0;i<this.keys.length;i++) {

      let container = this.keys[i].parent;
      container.style.position = 'absolute';
      container.style.left = (keyPositions[i]*buttonWidth+padding) + 'px';
      if (this.keys[i].color === 'w') {
        container.style.top = (padding) + 'px';
        this.keys[i].resize(buttonWidth, buttonHeight*2);
      } else {
        container.style.zIndex = 1;
        container.style.top = padding+'px';
        this.keys[i].resize(buttonWidth, buttonHeight*1.1);
      }

    }

  }

  colorInterface() {

    // Piano keys don't actually have a stroke border
    // They have space between them, which shows the Piano bg color
    this.element.style.backgroundColor = this.colors.mediumLight;

    for (let i=0;i<this.keys.length;i++) {
      this.keys[i].colors = {
        'w': this.colors.light,
        'b': this.colors.dark,
        'accent': this.colors.accent,
        'border': this.colors.mediumLight
      };
      this.keys[i].colorInterface();
      this.keys[i].render();
    }


  }

  keyChange(note,on) {
    // emit data for any key turning on/off
    // "note" is the note value
    // "on" is a boolean whether it is on or off
    // in aftertouch mode, "on: is an object with state/x/y properties
    var data = {
      note: note
    };
    if (typeof on === 'object') {
      data.state = on.state;
    //  data.x = on.x
    //  data.y = on.y
    } else {
      data.state = on;
    }
    this.emit('change',data);
  }

  /* drag(note,on) {
    this.emit('change',{
      note: note,
      state: on
    });
  } */

  render() {
    // loop through and render the keys?
  }

  addTouchListeners() {
    this.preClick = this.preMove = this.preRelease = () => {};
    this.click = this.move = this.release = () => {};
    this.preTouch = this.preTouchMove = this.preTouchRelease = () => {};
    this.touch = this.touchMove = this.touchRelease = () => {};

    const allActiveTouches = {};
    const keys = this.keys;

    function cloneTouch(touch) {
      return { identifier: touch.identifier, clientX: touch.clientX, clientY: touch.clientY };
    }

    function updateKeyState() {
      const allActiveKeys = {};

      // Check/set "key-down" status for all keys that are currently touched.
      Object.keys(allActiveTouches).forEach(id => {
        const touch = allActiveTouches[id];
        const el = document.elementFromPoint(touch.clientX, touch.clientY);
        let key = el ? keys[el.index] : null;
        if (key) {
          allActiveKeys[el.index] = id;
          if (!key.state) {
            key.down();
          }
        } else {
          delete allActiveTouches[id];
        }
      });

      // Set "key-up" status for all keys that are untouched.
      keys.forEach(key => {
        if (key.state && !allActiveKeys[key.pad.index]) {
          key.up();
        }
      });
    }

    function handleTouchStartAndMove(e) {
      e.preventDefault();
      e.stopPropagation();
      for (let i = 0; i < e.changedTouches.length; i++){
        const touch = e.changedTouches[i];
        allActiveTouches[touch.identifier] = cloneTouch(touch);
      }
      updateKeyState();
    }

    function handleTouchEnd(e) {
      e.preventDefault();
      e.stopPropagation();
      for (let i = 0; i < e.changedTouches.length; i++){
        const touch = e.changedTouches[i];
        delete allActiveTouches[touch.identifier];
      }
      updateKeyState();
    }

    this.element.addEventListener('touchstart', handleTouchStartAndMove);
    this.element.addEventListener('touchmove', handleTouchStartAndMove);
    this.element.addEventListener('touchend', handleTouchEnd);
  }

  /**
  Define the pitch range (lowest and highest note) of the piano keyboard.
  @param low {number} MIDI note value of the lowest note on the keyboard
  @param high {number} MIDI note value of the highest note on the keyboard
  */
  setRange(low,high) {
    this.range.low = low;
    this.range.high = high;
    this.empty();
    this.buildInterface();
  }

  /**
  Turn a key on or off using its MIDI note value;
  @param note {number} MIDI note value of the key to change
  @param on {boolean} Whether the note should turn on or off
  */
  toggleKey(note, on) {
    this.keys[note-this.range.low].flip(on);
  }

  /**
  Turn a key on or off using its key index on the piano interface.
  @param index {number} Index of the key to change
  @param on {boolean} Whether the note should turn on or off
  */
  toggleIndex(index, on) {
    this.keys[index].flip(on);
  }

}

Added public/nexus-js/lib/interfaces/position.js.



























































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301

'use strict';

let svg = require('../util/svg');
let Interface = require('../core/interface');
let Step = require('../models/step');
import * as Interaction from '../util/interaction';

/**
* Position
*
* @description Two-dimensional touch slider.
*
* @demo <span nexus-ui="position"></span>
*
* @example
* var position = new Nexus.Position('#target')
*
* @example
* var position = new Nexus.Position('#target',{
*   'size': [200,200],
*   'mode': 'absolute',  // "absolute" or "relative"
*   'x': 0.5,  // initial x value
*   'minX': 0,
*   'maxX': 1,
*   'stepX': 0,
*   'y': 0.5,  // initial y value
*   'minY': 0,
*   'maxY': 1,
*   'stepY': 0
* })
*
* @output
* change
* Fires any time the interface's value changes. <br>
* The event data is an object with x and y properties containing the x and y values of the interface.
*
* @outputexample
* position.on('change',function(v) {
*   console.log(v);
* })
*
*
*/

export default class Position extends Interface {

  constructor() {

    let options = ['value'];

    let defaults = {
      'size': [200,200],
      'mode': 'absolute',
      'minX': 0,
      'maxX': 1,
      'stepX': 0,
      'x': 0.5,
      'minY': 0,
      'maxY': 1,
      'stepY': 0,
      'y': 0.5
    };

    super(arguments,options,defaults);


    this._x = new Step( this.settings.minX, this.settings.maxX, this.settings.stepX, this.settings.x );
    this._y = new Step( this.settings.minY, this.settings.maxY, this.settings.stepY, this.settings.y );

    this.position = {
      x: new Interaction.Handle(this.settings.mode,'horizontal',[0,this.width],[this.height,0]),
      y: new Interaction.Handle(this.settings.mode,'vertical',[0,this.width],[this.height,0])
    };
    this.position.x.value = this._x.normalized;
    this.position.y.value = this._y.normalized;

    this.init();
    this.render();

  }

  buildInterface() {

    this.knob = svg.create('circle');
    this.element.appendChild(this.knob);
    
  }

  sizeInterface() {

      this.position.x.resize([0,this.width],[this.height,0]);
      this.position.y.resize([0,this.width],[this.height,0]);

      this._minDimension = Math.min(this.width,this.height);

      this.knobRadius = {
        off: ~~(this._minDimension/100) * 5 + 5,
      };
      this.knobRadius.on = this.knobRadius.off * 2;

      this.knob.setAttribute('cx',this.width/2);
      this.knob.setAttribute('cy',this.height/2);
      this.knob.setAttribute('r',this.knobRadius.off);
  }

  colorInterface() {
      this.element.style.backgroundColor = this.colors.fill;
      this.knob.setAttribute('fill', this.colors.accent);
  }

  render() {
    if (this.clicked) {
    //  this.knobRadius = 30;
      this.knob.setAttribute('r',this.knobRadius.on);
    } else {
    //  this.knobRadius = 15;
      this.knob.setAttribute('r',this.knobRadius.off);
    }

    this.knobCoordinates = {
      x: this._x.normalized * this.width,
      y: this.height - this._y.normalized * this.height
    };

    this.knob.setAttribute('cx',this.knobCoordinates.x);
    this.knob.setAttribute('cy',this.knobCoordinates.y);
  }


  click() {
    this.position.x.anchor = this.mouse;
    this.position.y.anchor = this.mouse;
    this.move();
  }

  move() {
    if (this.clicked) {
      this.position.x.update(this.mouse);
      this.position.y.update(this.mouse);
      this._x.updateNormal( this.position.x.value );
      this._y.updateNormal( this.position.y.value );
      this.emit('change',{
        x: this._x.value,
        y: this._y.value
      });
      this.render();
    }
  }

  release() {
    this.render();
  }

  /**
  * The interface's x value. When set, it will automatically adjust to fit min/max/step settings of the interface.
  * @type {object}
  * @example position.x = 0.5;
  */

  get x() {
    return this._x.value;
  }

  set x(value) {
    this._x.update(value);
    this.emit('change',{
      x: this._x.value,
      y: this._y.value
    });
    this.render();
  }

  /**
  * The interface's y values. When set, it will automatically adjust to fit min/max/step settings of the interface.
  * @type {object}
  * @example position.x = 0.5;
  */

  get y() {
    return this._y.value;
  }

  set y(value) {
    this._y.update(value);
    this.emit('change',{
      x: this._x.value,
      y: this._y.value
    });
    this.render();
  }



  get normalized() {
    return {
      x: this._x.normalized,
      y: this._y.normalized
    };
  }

  /**
  * The lower limit of value on the x axis
  * @type {object}
  */
  get minX() {
    return this._x.min;
  }

  set minX(v) {
    this._x.min = v;
    this.render();
  }

  /**
  * The lower limit of value on the y axis
  * @type {object}
  */
  get minY() {
    return this._y.min;
  }

  set minY(v) {
    this._y.min = v;
    this.render();
  }


  /**
  * The upper limit of value on the x axis
  * @type {object}
  */
  get maxX() {
    return this._x.max;
  }

  set maxX(v) {
    this._x.max = v;
    this.render();
  }


  /**
  * The upper limit of value on the y axis
  * @type {object}
  */
  get maxY() {
    return this._y.max;
  }

  set maxY(v) {
    this._y.max = v;
    this.render();
  }


  /**
  * The incremental step of values on the x axis
  * @type {object}
  */
  get stepX() {
    return this._x.step;
  }

  set stepX(v) {
    this._x.step = v;
    this.render();
  }


  /**
  * The incremental step of values on the y axis
  * @type {object}
  */
  get stepY() {
    return this._y.step;
  }

  set stepY(v) {
    this._y.step = v;
    this.render();
  }


  /**
  Absolute mode (position's value jumps to mouse click position) or relative mode (mouse drag changes value relative to its current position). Default: "absolute".
  @type {string}
  @example position.mode = "relative";
  */
  get mode() {
    return this.position.x.mode;
  }
  set mode(v) {
    this.position.x.mode = v;
    this.position.y.mode = v;
  }




}

Added public/nexus-js/lib/interfaces/radiobutton.js.









































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
'use strict';

//let svg = require('../util/svg');
let Interface = require('../core/interface');
let Button = require('../interfaces/button');

/**
 * RadioButton
 *
 * @description An array of buttons. By default, selecting one button will deselect all other buttons, but this can be customized using the API below.
 *
 * @demo <div nexus-ui="RadioButton"></div>
 *
 * @example
 * var radiobutton = new Nexus.RadioButton('#target')
 *
 * @example
 * var radiobutton = new Nexus.RadioButton('#target',{
 *   'size': [120,25],
 *   'numberOfButtons': 4,
 *   'active': -1
 * })
 *
 * @output
 * change
 * Fires any time the interface's value changes. <br>
 * The event data an <i>integer</i>, the index of the button that is currently on. If no button is selected, the value will be -1.
 *
 * @outputexample
 * radiobutton.on('change',function(v) {
 *   console.log(v);
 * })
 *
 */

export default class RadioButton extends Interface {
  constructor() {
    let options = ['value'];

    let defaults = {
      size: [120, 25],
      numberOfButtons: 4,
      active: -1
    };

    super(arguments, options, defaults);

    this.buttons = [];
    this._numberOfButtons = this.settings.numberOfButtons;
    this.active = this.settings.active;

    this.init();
    this.render();
  }

  buildFrame() {
    this.element = document.createElement('div');
    this.parent.appendChild(this.element);
  }

  buildInterface() {
    for (let i = 0; i < this._numberOfButtons; i++) {
      let container = document.createElement('span');

      let button = new Button(
        container,
        {
          mode: 'toggle',
          component: true
        },
        this.update.bind(this, i)
      );

      this.buttons.push(button);
      this.element.appendChild(container);
    }
  }

  sizeInterface() {
    let orientation;
    if (this.width > this.height) {
      orientation = 'horizontal';
    } else {
      orientation = 'vertical';
    }

    let buttonWidth =
      this.width / (orientation === 'vertical' ? 1 : this._numberOfButtons);
    let buttonHeight =
      this.height / (orientation === 'vertical' ? this._numberOfButtons : 1);

    for (let i = 0; i < this._numberOfButtons; i++) {
      this.buttons[i].resize(buttonWidth, buttonHeight);
    }
  }

  colorInterface() {
    for (let i = 0; i < this._numberOfButtons; i++) {
      this.buttons[i].colors = this.colors;
      this.buttons[i].render();
    }
  }

  update(index) {
    if (this.buttons[index].state) {
      this.select(index);
    } else {
      this.deselect();
    }
    //  this.render();
  }

  render() {
    for (let i = 0; i < this.buttons.length; i++) {
      if (i === this.active) {
        this.buttons[i].turnOn(false);
      } else {
        this.buttons[i].turnOff(false);
      }
    }
  }

  /**
  Select one button and deselect all other buttons.
  @param index {number} The index of the button to select
  */
  select(index) {
    if (index >= 0 && index < this.buttons.length) {
      this.active = index;
      this.emit('change', this.active);
      this.render();
    }
  }

  /**
  Deselect all buttons.
  */
  deselect() {
    this.active = -1;
    this.emit('change', this.active);
    this.render();
  }

  get numberOfButtons() {
    return this._numberOfButtons;
  }

  /**
   * Update how many buttons are in the interface
   * @param  {number} buttons How many buttons are in the interface
   */
  set numberOfButtons(buttons) {
    this._numberOfButtons = buttons;
    for (let i = 0; i < this.buttons.length; i++) {
      this.buttons[i].destroy();
    }
    this.buttons = [];
    //  for (let i=0;i<this.buttons.length;i++) {
    //    this.buttons[i].destroy();
    //  }
    this.empty();
    this.buildInterface();
  }
}

Added public/nexus-js/lib/interfaces/select.js.



















































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
'use strict';

let Interface = require('../core/interface');

/**
* Select
*
* @description Dropdown menu
*
* @demo <span nexus-ui="select"></span>
*
* @example
* var select = new Nexus.Select('#target')
*
* @example
* var select = new Nexus.Select('#target',{
*   'size': [100,30],
*   'options': ['default','options']
* })
*
* @output
* change
* Fires any time the interface's value changes. <br>
* The event data is an object containing the text value of the selected option, as well as the numeric index of the selection.
*
* @outputexample
* select.on('change',function(v) {
*   console.log(v);
* })
*
*
*/


export default class Select extends Interface {

  constructor() {

    let options = ['value'];

    let defaults = {
       'size': [100,30],
       'options': ['default','options']
    };

    super(arguments,options,defaults);

    this._selectedIndex = -1;
    this._value = false;

    this._options = this.settings.options;

    this.init();
    this.render();

  }

  buildFrame() {
    this.element = document.createElement('select');
    this.element.style.fontSize = this.height/2+'px';
    this.element.style.outline = 'none';
    this.element.style.highlight = 'none';
    this.element.style.width = this.width+'px';
    this.element.style.height = this.height+'px';

    this.boundRender = this.render.bind(this);

    this.element.addEventListener('change', this.boundRender);

    this.parent.appendChild(this.element);

  }

  attachListeners() {

  }

  buildInterface() {

    this.defineOptions();

  }

  colorInterface() {
    this.element.style.backgroundColor = this.colors.fill;
    this.element.style.color = this.colors.dark;
    this.element.style.border = 'solid 0px '+this.colors.mediumLight;
  }

  render() {

    this._value = this.element.options[this.element.selectedIndex].text;
    this._selectedIndex = this.element.selectedIndex;
    this.emit('change',{
      value: this._value,
      index: this._selectedIndex
    });

  }

  click() {

  }

  move() {

  }

  release() {

  }

  /**
   * Update the list of options. This removes all existing options and creates a new list of options.
   * @param  {array} options New array of options
   */

  defineOptions(options) {

  /*  function removeOptions(selectbox)
    {
        var i;
        for(i = selectbox.options.length - 1 ; i >= 0 ; i--)
        {
            selectbox.remove(i);
        }
    }
    //using the function:
    removeOptions(document.getElementById("mySelectObject")); */


    if (options) {
      this._options = options;
    }

    for(let i=this.element.options.length-1; i >= 0; i--) {
      this.element.remove(i);
    }

    for(let i=0;i<this._options.length;i++) {
      this.element.options.add(new Option(this._options[i], i));
    }

  }


  /**
  The text of the option that is currently selected. If set, will update the interface and trigger the output event.
  @type {String}
  @example select.value = "sawtooth";
  */
  get value() {
    return this._value;
  }
  set value(v) {
    this._value = v;
    for(let i=0;i<this.element.options.length;i++) {
      if (v === this.element.options[i].text) {
        this.selectedIndex = i;
        break;
      }
    }
  }


  /**
  The numeric index of the option that is currently selected. If set, will update the interface and trigger the output event.
  @type {number}
  @example select.selectedIndex = 2;
  */
  get selectedIndex() {
    return this._selectedIndex;
  }
  set selectedIndex(v) {
    this._selectedIndex = v;
    this.element.selectedIndex = v;
    this.render();
  }

  customDestroy() {
    this.element.removeEventListener('change', this.boundRender);
  }


}

Added public/nexus-js/lib/interfaces/sequencer.js.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
'use strict';

let svg = require('../util/svg');
let dom = require('../util/dom');
let Interface = require('../core/interface');
let ButtonTemplate = require('../components/buttontemplate');
let MatrixModel = require('../models/matrix');
let CounterModel = require('../models/counter');
let Interval = require('../time/interval');
let touch = require('../util/touch');

class MatrixCell extends ButtonTemplate {
  constructor() {
    let options = ['value'];

    let defaults = {
      size: [80, 80],
      target: false,
      mode: 'toggle',
      value: 0,
      paddingRow: 2,
      paddingColumn: 2
    };

    super(arguments, options, defaults);

    this.index = this.settings.index;
    this.row = this.settings.row;
    this.column = this.settings.column;

    this.matrix = this.settings.matrix;

    /**
     *  Amount of row padding
     *  @type {number}
     */
    this.paddingRow = this.settings.paddingRow || defaults.paddingRow;

    /**
     *  Amount of column padding
     *  @type {number}
     */
    this.paddingColumn = this.settings.paddingColumn || defaults.paddingColumn;

    this.interacting = false;
    this.paintbrush = false;

    this.init();
    this.render();
  }

  buildFrame() {
    this.element = svg.create('svg');
    this.element.setAttribute('width', this.width);
    this.element.setAttribute('height', this.height);
    this.element.style.top = '0px';
    this.element.style.left = '0px';
    this.element.style.position = 'absolute';
    this.parent.appendChild(this.element);
  }

  buildInterface() {
    this.pad = svg.create('rect');
    this.element.appendChild(this.pad);

    this.interactionTarget = this.pad;

    /* events */

    if (!touch.exists) {
      this.click = () => {
        this.matrix.interacting = true;
        this.matrix.paintbrush = !this.state;
        this.down(this.matrix.paintbrush);
      };
      this.pad.addEventListener('mouseover', () => {
        if (this.matrix.interacting) {
          this.down(this.matrix.paintbrush);
        }
      });

      this.move = () => {};
      this.pad.addEventListener('mousemove', e => {
        if (this.matrix.interacting) {
          if (!this.offset) {
            this.offset = dom.findPosition(this.element);
          }
          this.mouse = dom.locateMouse(e, this.offset);
          this.bend();
        }
      });

      this.release = () => {
        this.matrix.interacting = false;
      };
      this.pad.addEventListener('mouseup', () => {
        if (this.matrix.interacting) {
          this.up();
        }
      });
      this.pad.addEventListener('mouseout', () => {
        if (this.matrix.interacting) {
          this.up();
        }
      });
    }
  }

  sizeInterface() {
    this.pad.setAttribute('x', this.paddingColumn / 2);
    this.pad.setAttribute('y', this.paddingRow / 2);
    if (this.width > 2) {
      this.pad.setAttribute('width', this.width - this.paddingColumn);
    } else {
      this.pad.setAttribute('width', this.width);
    }
    if (this.height > 2) {
      this.pad.setAttribute('height', this.height - this.paddingRow);
    } else {
      this.pad.setAttribute('height', this.height);
    }
    this.pad.setAttribute('fill', this.matrix.colors.fill);
  }

  render() {
    if (!this.state) {
      this.pad.setAttribute('fill', this.matrix.colors.fill);
    } else {
      this.pad.setAttribute('fill', this.matrix.colors.accent);
    }
  }
}

/**
 * Sequencer
 *
 * @description Grid of buttons with built-in step sequencer.
 *
 * @demo <div nexus-ui="sequencer" style="width:400px;height:200px;"></div>
 *
 * @example
 * var sequencer = new Nexus.Sequencer('#target')
 *
 * @example
 * var sequencer = new Nexus.Sequencer('#target',{
 *  'size': [400,200],
 *  'mode': 'toggle',
 *  'rows': 5,
 *  'columns': 10,
 *  'paddingRow': 10,
 *  'paddingColumn': 20
 *})
 *
 * @output
 * change
 * Fires whenever a value is received. For example, when clicking a cell from off to on. <br>
 * The event data is an object containing <i>row</i> (number), <i>column</i> (number), and <i>state</i> (boolean) properties.
 *
 * @outputexample
 * sequencer.on('change',function(v) {
 *   console.log(v);
 * })
 *
 * @output
 * step
 * Fires any time the sequencer steps to the next column, in sequece mode. <br>
 * The event data is an <i>array</i> containing all values in the column, <i>bottom row first</i>.
 *
 * @outputexample
 * sequencer.on('step',function(v) {
 *   console.log(v);
 * })
 */

export default class Sequencer extends Interface {
  constructor() {
    let options = ['value'];

    let defaults = {
      size: [400, 200],
      mode: 'toggle',
      rows: 5,
      columns: 10
    };

    super(arguments, options, defaults);

    this.active = -1;

    /**
     * Button interaction mode: see Button
     * @type {string}
     * @example button.mode = 'toggle';
     */
    this.mode = this.settings.mode;

    /**
     * The interval object which controls timing and sequence scheduling.
     * @type {interval}
     */
    this.interval = new Interval(200, function() {}, false); // jshint ignore:line

    /**
     * A Matrix model containing methods for manipulating the sequencer's array of values. To learn how to manipulate the matrix, read about the matrix model.
     * @type {matrix}
     */
    this.matrix = new MatrixModel(this.settings.rows, this.settings.columns);
    this.matrix.ui = this;

    /**
     * A Counter model which the sequencer steps through. For example, you could use this model to step through the sequencer in reverse, randomly, or in a drunk walk.
     * @type {counter}
     */
    this.stepper = new CounterModel(0, this.columns);

    this.paddingRow = this.settings.paddingRow;
    this.paddingColumn = this.settings.paddingColumn;

    this.init();
  }

  buildFrame() {
    this.element = document.createElement('div');
    this.element.style.position = 'relative';
    this.element.style.display = 'block';
    this.element.style.width = '100%';
    this.element.style.height = '100%';
    this.parent.appendChild(this.element);
    if (touch.exists) {
      this.addTouchListeners();
    }
  }

  buildInterface() {
    this.cells = [];
    for (let i = 0; i < this.matrix.length; i++) {
      let location = this.matrix.locate(i);
      // returns {row,col}

      let container = document.createElement('span');
      container.style.position = 'absolute';

      let cell = new MatrixCell(
        container,
        {
          component: true,
          index: i,
          row: location.row,
          column: location.column,
          mode: this.mode,
          matrix: this,
          paddingRow: this.paddingRow,
          paddingColumn: this.paddingColumn
        },
        this.keyChange.bind(this, i)
      );

      //  cell.matrix = this;
      if (touch.exists) {
        cell.pad.index = i;
        cell.preClick = cell.preMove = cell.preRelease = () => {};
        cell.click = cell.move = cell.release = () => {};
        cell.preTouch = cell.preTouchMove = cell.preTouchRelease = () => {};
        cell.touch = cell.touchMove = cell.touchRelease = () => {};
      }

      this.cells.push(cell);
      this.element.appendChild(container);
    }
    this.sizeInterface();
  }

  sizeInterface() {
    let cellWidth = this.width / this.columns;
    let cellHeight = this.height / this.rows;

    for (let i = 0; i < this.cells.length; i++) {
      let container = this.cells[i].parent;
      container.style.left = this.cells[i].column * cellWidth + 'px';
      container.style.top = this.cells[i].row * cellHeight + 'px';
      this.cells[i].resize(cellWidth, cellHeight);
    }
  }

  colorInterface() {
    for (var i = 0; i < this.cells.length; i++) {
      this.cells[i].render();
    }
  }

  update() {
    //  console.log("updating...")
    //on = on || false;
    this.matrix.iterate((r, c, i) => {
      //  console.log(this.matrix.pattern[r][c], this.cells[i].state);
      if (this.matrix.pattern[r][c] !== this.cells[i].state) {
        if (this.matrix.pattern[r][c] > 0) {
          this.cells[i].turnOn();
        } else {
          this.cells[i].turnOff();
        }
      }
    });
  }

  // update => cell.turnOn => cell.emit => keyChange (seq.emit) => matrix.set.cell => update
  //
  // interaction => keyChange => matrix.set.cell => update => cell.turnOn
  //                                             => emit
  //
  // set.cell => update => needs to emit.

  keyChange(note, on) {
    // emit data for any key turning on/off
    // i is the note index
    // v is whether it is on or off
    let cell = this.matrix.locate(note);
    //  this.matrix.set.cell(cell.column,cell.row,on);
    this.matrix.pattern[cell.row][cell.column] = on;
    var data = {
      row: cell.row,
      column: cell.column,
      state: on
    };
    this.emit('change', data);
  }

  render() {
    if (this.stepper.value >= 0) {
      this.matrix.iterate((r, c, i) => {
        if (c === this.stepper.value) {
          this.cells[i].pad.setAttribute('stroke', this.colors.mediumLight);
          this.cells[i].pad.setAttribute('stroke-width', '1');
          this.cells[i].pad.setAttribute('stroke-opacity', '1');
        } else {
          this.cells[i].pad.setAttribute('stroke', 'none');
        }
      });
    }
  }

  /**
   * Start sequencing
   * @param  {number} ms Beat tempo in milliseconds
   */
  start(ms) {
    this.interval.event = this.next.bind(this);
    if (ms) {
      this.interval.ms(ms);
    }
    this.interval.start();
  }

  /**
  Stop sequencing
  */
  stop() {
    this.interval.stop();
  }

  /**
  Manually jump to the next column and trigger the 'change' event. The "next" column is determined by your mode of sequencing.
  */
  next() {
    this.stepper.next();
    this.emit('step', this.matrix.column(this.stepper.value).reverse());
    this.render();
  }

  addTouchListeners() {
    this.preClick = this.preMove = this.preRelease = () => {};
    this.click = this.move = this.release = () => {};
    this.preTouch = this.preTouchMove = this.preTouchRelease = () => {};
    this.touch = this.touchMove = this.touchRelease = () => {};

    this.currentElement = false;

    this.element.addEventListener('touchstart', e => {
      let element = document.elementFromPoint(
        e.targetTouches[0].clientX,
        e.targetTouches[0].clientY
      );
      let cell = this.cells[element.index];
      this.paintbrush = !cell.state;
      cell.down(this.paintbrush);
      this.currentElement = element.index;
      e.preventDefault();
      e.stopPropagation();
    });

    this.element.addEventListener('touchmove', e => {
      let element = document.elementFromPoint(
        e.targetTouches[0].clientX,
        e.targetTouches[0].clientY
      );
      let cell = this.cells[element.index];
      if (element.index !== this.currentElement) {
        if (this.currentElement >= 0) {
          let pastCell = this.cells[this.currentElement];
          pastCell.up();
        }
        cell.down(this.paintbrush);
      } else {
        cell.bend();
      }
      this.currentElement = element.index;
      e.preventDefault();
      e.stopPropagation();
    });

    this.element.addEventListener('touchend', e => {
      // no touches to calculate because none remaining
      let cell = this.cells[this.currentElement];
      cell.up();
      this.interacting = false;
      this.currentElement = false;
      e.preventDefault();
      e.stopPropagation();
    });
  }

  /**
  Number of rows in the sequencer
  @type {number}
  */
  get rows() {
    return this.matrix.rows;
  }

  set rows(v) {
    this.matrix.rows = v;
    this.empty();
    this.buildInterface();
    this.update();
  }

  /**
  Number of columns in the sequencer
  @type {number}
  */
  get columns() {
    return this.matrix.columns;
  }

  set columns(v) {
    this.matrix.columns = v;
    this.stepper.max = v;
    this.empty();
    this.buildInterface();
    this.update();
  }
}

Added public/nexus-js/lib/interfaces/slider.js.











































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
'use strict';

let svg = require('../util/svg');
let Interface = require('../core/interface');
let Step = require('../models/step');
import * as Interaction from '../util/interaction';

/**
* Slider
*
* @description Horizontal or vertical slider with settable interaction modes.
*
* @demo <span nexus-ui="slider" step=0.2></span>
*
* @example
* var slider = new Nexus.Slider('#target')
*
* @example
* var slider = new Nexus.Slider('#target',{
*     'size': [120,20],
*     'mode': 'relative',  // 'relative' or 'absolute'
*     'min': 0,
*     'max': 1,
*     'step': 0,
*     'value': 0
* })
*
* @output
* change
* Fires when the interface's value changes. <br>
* Event data: <i>number</i> The number value of the interface.
*
* @outputexample
* slider.on('change',function(v) {
*   console.log(v);
* })
*
*
*/

export default class Slider extends Interface {

  constructor() {

    let options = ['min','max','value'];

    let defaults = {
      'size': [120,20],
      'mode': 'relative',  // 'relative' or 'absolute'
      'min': 0,
      'max': 1,
      'step': 0,
      'value': 0
    };

    super(arguments,options,defaults);

    this.orientation = 'vertical'; // This will change automatically to 'horizontal'if the interface is wider than it is tall.

    this._value = new Step(this.settings.min, this.settings.max, this.settings.step, this.settings.value);

    this.position = new Interaction.Handle(this.settings.mode,this.orientation,[0,this.width],[this.height,0]);
    this.position.value = this._value.normalized;

    this.init();

    this.position.direction = this.orientation;

    this.emit('change',this.value);

  }

  buildInterface() {

    this.bar = svg.create('rect');
    this.fillbar = svg.create('rect');
    this.knob = svg.create('circle');

    this.element.appendChild(this.bar);
    this.element.appendChild(this.fillbar);
    this.element.appendChild(this.knob);

  }

  sizeInterface() {

    if (this.width < this.height) {
      this.orientation = 'vertical';
      this.position.direction = 'vertical';
    } else {
      this.orientation = 'horizontal';
      this.position.direction = 'horizontal';
    }

    if (this.position) {
      this.position.resize([0,this.width],[this.height,0]);
    }

    let x, y, w, h, barOffset, cornerRadius;
    this.knobData = {
      level: 0,
      r: 0
    };

    if (this.orientation === 'vertical') {
      this.thickness = this.width / 2;
    	x = this.width/2;
    	y = 0;
    	w = this.thickness;
    	h = this.height;
      this.knobData.r = this.thickness * 0.8;
    	this.knobData.level = h-this.knobData.r-this.normalized*(h-this.knobData.r*2);
      barOffset = 'translate('+this.thickness*(-1)/2+',0)';
      cornerRadius = w/2;
    } else {
      this.thickness = this.height / 2;
    	x = 0;
    	y = this.height/2;
    	w = this.width;
    	h = this.thickness;
      this.knobData.r = this.thickness * 0.8;
    	this.knobData.level = this.normalized*(w-this.knobData.r*2)+this.knobData.r;
      barOffset = 'translate(0,'+this.thickness*(-1)/2+')';
      cornerRadius = h/2;
    }

    this.bar.setAttribute('x',x);
    this.bar.setAttribute('y',y);
    this.bar.setAttribute('transform',barOffset);
    this.bar.setAttribute('rx',cornerRadius); // corner radius
    this.bar.setAttribute('ry',cornerRadius);
    this.bar.setAttribute('width',w);
    this.bar.setAttribute('height',h);

    if (this.orientation === 'vertical') {
      this.fillbar.setAttribute('x',x);
      this.fillbar.setAttribute('y',this.knobData.level);
      this.fillbar.setAttribute('width',w);
      this.fillbar.setAttribute('height',h-this.knobData.level);
    } else {
      this.fillbar.setAttribute('x',0);
      this.fillbar.setAttribute('y',y);
      this.fillbar.setAttribute('width',this.knobData.level);
      this.fillbar.setAttribute('height',h);
    }
    this.fillbar.setAttribute('transform',barOffset);
    this.fillbar.setAttribute('rx',cornerRadius);
    this.fillbar.setAttribute('ry',cornerRadius);

    if (this.orientation === 'vertical') {
      this.knob.setAttribute('cx',x);
      this.knob.setAttribute('cy',this.knobData.level);
    } else {
      this.knob.setAttribute('cx',this.knobData.level);
      this.knob.setAttribute('cy',y);
    }
    this.knob.setAttribute('r',this.knobData.r);

  }

  colorInterface() {
    this.bar.setAttribute('fill', this.colors.fill);
    this.fillbar.setAttribute('fill', this.colors.accent);
    this.knob.setAttribute('fill', this.colors.accent);
  }


  render() {
    if (!this.clicked) {
      this.knobData.r = this.thickness*0.75;
    }
    this.knob.setAttribute('r',this.knobData.r);

    if (this.orientation === 'vertical') {
  	   this.knobData.level = this.knobData.r+this._value.normalized*(this.height-this.knobData.r*2);
       this.knob.setAttribute('cy',this.height - this.knobData.level);
       this.fillbar.setAttribute('y',this.height - this.knobData.level);
       this.fillbar.setAttribute('height',this.knobData.level);
    } else {
  	   this.knobData.level = this._value.normalized*(this.width-this.knobData.r*2)+this.knobData.r;
       this.knob.setAttribute('cx',this.knobData.level);
       this.fillbar.setAttribute('x',0);
       this.fillbar.setAttribute('width',this.knobData.level);
    }
  }


  click() {
    this.knobData.r = this.thickness*0.9;
    this.position.anchor = this.mouse;
    this.move();
  }

  move() {
    if (this.clicked) {
      this.position.update(this.mouse);
      this._value.updateNormal( this.position.value );
      this.emit('change',this._value.value);
      this.render();

    }
  }

  release() {
    this.render();
  }

  get normalized() {
    return this._value.normalized;
  }

  /**
  The slider's current value. If set manually, will update the interface and trigger the output event.
  @type {number}
  @example slider.value = 10;
  */
  get value() {
    return this._value.value;
  }
  set value(v) {
    this._value.update(v);
    this.position.value = this._value.normalized;
    this.emit('change',this._value.value);
    this.render();
  }

  /**
  Lower limit of the sliders's output range
  @type {number}
  @example slider.min = 1000;
  */
  get min() {
    return this._value.min;
  }
  set min(v) {
    this._value.min = v;
  }

  /**
  Upper limit of the slider's output range
  @type {number}
  @example slider.max = 1000;
  */
  get max() {
    return this._value.max;
  }
  set max(v) {
    this._value.max = v;
  }

  /**
  The increment that the slider's value changes by.
  @type {number}
  @example slider.step = 5;
  */
  get step() {
    return this._value.step;
  }
  set step(v) {
    this._value.step = v;
  }

  /**
  Absolute mode (slider's value jumps to mouse click position) or relative mode (mouse drag changes value relative to its current position). Default: "relative".
  @type {string}
  @example slider.mode = "relative";
  */
  get mode() {
    return this.position.mode;
  }
  set mode(v) {
    this.position.mode = v;
  }



}

Added public/nexus-js/lib/interfaces/spectrogram.js.





















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
'use strict';

let dom = require('../util/dom');
let Interface = require('../core/interface');

/**
 * Spectrogram
 *
 * @description Audio spectrum visualization
 *
 * @demo <span nexus-ui="spectrogram"></span>
 *
 * @example
 * var spectrogram = new Nexus.Spectrogram('#target')
 * spectrogram.connect(myWebAudioNode)
 *
 * @example
 * var spectrogram = new Nexus.Spectrogram('#target',{
 *   'size': [300,150]
 * })
 * spectrogram.connect(myWebAudioNode)
 *
 * @output
 * &nbsp;
 * No events
 *
 */

export default class Spectrogram extends Interface {
  constructor() {
    let options = [];

    let defaults = {
      size: [300, 150]
    };

    super(arguments, options, defaults);

    this.analyser = null;
    this.bufferLength = 0;
    this.dataArray = null;
    this.active = false;
    this.source = null;

    this.init();
  }

  buildFrame() {
    this.canvas = new dom.SmartCanvas(this.parent);
    this.element = this.canvas.element;
  }

  sizeInterface() {
    this.canvas.resize(this.width, this.height);
  }

  colorInterface() {
    this.canvas.element.style.backgroundColor = this.colors.fill;
  }

  render() {
    if (this.active) {
      requestAnimationFrame(this.render.bind(this));
    }

    if (this.analyser) {
      this.analyser.getByteFrequencyData(this.dataArray);
    }

    this.canvas.context.fillStyle = this.colors.fill;
    this.canvas.context.fillRect(
      0,
      0,
      this.canvas.element.width,
      this.canvas.element.height
    );

    if (this.source && this.dataArray) {
      //console.log(this.dataArray);

      let barWidth = this.canvas.element.width / this.bufferLength;
      let barHeight;
      let x = 0;

      let definition = this.canvas.element.width / 50;

      for (let i = 0; i < this.bufferLength; i = i + definition) {
        barHeight = Math.max.apply(
          null,
          this.dataArray.subarray(i, i + definition)
        );
        barHeight /= 255;
        barHeight *= this.canvas.element.height;

        this.canvas.context.fillStyle = this.colors.accent;
        this.canvas.context.fillRect(
          x,
          this.canvas.element.height - barHeight,
          barWidth * definition,
          barHeight
        );

        x += barWidth * definition;
      }
    }
  }

  /**
  Equivalent to "patching in" an audio node to visualize.
  @param node {AudioNode} The audio node to visualize
  @example spectrogram.connect( Tone.Master );
  */
  connect(node) {
    if (this.source) {
      this.disconnect();
    }

    this.analyser = node.context.createAnalyser();
    this.analyser.fftSize = 2048;
    this.bufferLength = this.analyser.frequencyBinCount;
    this.dataArray = new Uint8Array(this.bufferLength);

    this.active = true;

    this.source = node;
    this.source.connect(this.analyser);

    this.render();
  }

  /**
  Stop visualizing the source node and disconnect it.
  */
  disconnect() {
    if (this.source) {
      this.source.disconnect(this.analyser);
    }

    this.analyser = null;
    this.bufferLength = 0;
    this.dataArray = null;
    this.active = false;
    this.source = null;
  }

  click() {
    this.active = !this.active && this.source;
    this.render();
  }

  customDestroy() {
    this.active = false;
  }
}

Added public/nexus-js/lib/interfaces/textbutton.js.





















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
'use strict';

let ButtonTemplate = require('../components/buttontemplate');

/**
* TextButton
*
* @description Text button
*
* @demo <span nexus-ui="textButton"></span>
*
* @example
* var textbutton = new Nexus.TextButton('#target')
*
* @example
* var textbutton = new Nexus.TextButton('#target',{
*     'size': [150,50],
*     'state': false,
*     'text': 'Play',
*     'alternateText': 'Stop'
* })
*
* @output
* change
* Fires any time the interface's value changes. <br>
* The event data is a <i>string</i> of the text on the button at the moment it was clicked.
*
* @outputexample
* textbutton.on('change',function(v) {
*   console.log(v);
* })
*
*/

export default class TextButton extends ButtonTemplate {

  constructor() {

    let options = ['value'];

    let defaults = {
      'size': [150,50],
      'state': false,
      'text': 'Play'
    };

    super(arguments,options,defaults);

    this._text = this.settings.text;

    if(this.settings.alternate){ //TODO: Remove this conditional in a breaking-changes release
      this.settings.alternateText = this.settings.alternate;
      console.warn("'alternate' initiator is deprecated. Use 'alternateText' instead.");
    }
    this._alternateText = this.settings.alternateText;
    this.mode = (this.settings.alternateText) ? 'toggle' : 'button';
    this.init();
    this.render();

    this.state = this.settings.state;

  }

  buildFrame() {

    this.element = document.createElement('div');
    this.parent.appendChild(this.element);

    this.textElement = document.createElement('div');
    this.textElement.innerHTML = this._text;
    this.element.appendChild(this.textElement);
  }

  buildInterface() {

  }

  colorInterface() {
    this.element.style.color = this.colors.dark;
    this.render();
  }

  sizeInterface() {
      let textsize = this.height/3;
      let textsize2 = (this.width / (this._text.length + 2) );
      textsize = Math.min(textsize,textsize2);
      if (this.alternateText) {
        let textsize3 = (this.width / (this.alternateText.length + 2) );
        textsize = Math.min(textsize,textsize3);
      }
      let styles = 'width: ' + this.width + 'px;';
      styles += 'height: ' + this.height + 'px;';
      styles += 'padding: '+(this.height-textsize)/2+'px 0px;';
      styles += 'box-sizing: border-box;';
      styles += 'text-align: center;';
      styles += 'font-family: inherit;';
      styles += 'font-weight: 700;';
      styles += 'opacity: 1;';
      styles += 'font-size:' + textsize + 'px;';
      this.textElement.style.cssText = styles;
      this.render();
  }

  render() {
    if (!this.state) {
      this.element.style.backgroundColor = this.colors.fill;
      this.textElement.style.color = this.colors.dark;
      this.textElement.innerHTML = this._text;
    } else {
      this.element.style.backgroundColor = this.colors.accent;
      this.textElement.style.color = this.colors.fill;
      if (this.alternateText) {
        this.textElement.innerHTML = this._alternateText;
      } else {
        this.textElement.innerHTML = this._text;
      }
    }
  }

  /**
  The text to display when the button is in its "on" state. If set, this puts the button in "toggle" mode.
  @type {String}
  */
  get alternateText() {
    return this._alternateText;
  }

  set alternateText(text) {
    if (text) {
      this.mode = 'toggle';
    } else {
      this.mode = 'button';
    }
    this._alternateText = text;
    this.render();
  }


  /**
  The text to display. (If .alternateText exists, then this .text will only be displayed when the button is in its "off" state.)
  @type {String}
  */
  get text() {
    return this._text;
  }

  set text(text) {
    this._text = text;
    this.sizeInterface();
    this.render();
  }


}

Added public/nexus-js/lib/interfaces/tilt.js.











































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
'use strict';

let math = require('../util/math');
let svg = require('../util/svg');
let Interface = require('../core/interface');

/**
* Tilt
*
* @description Device tilt sensor with 2 or 3 axes (depending on your device and browser).
*
* @demo <span nexus-ui='tilt'></span>
*
* @example
* var tilt = new Nexus.Tilt('#target')
*
* @output
* change
* Fires at a regular interval, as long as this interface is active (see the interface's <i>.active</i> property)<br>
* The event data is an <i>object</i> containing x (number) and y (number) properties which represent the current tilt state of the device.
*
* @outputexample
* tilt.on('change',function(v) {
*   console.log(v);
* })
*
*
*/

export default class Tilt extends Interface {

  constructor() {

    let options = ['value'];

    let defaults = {
      'size': [80,80]
    };

    super(arguments,options,defaults);

    this._active = true;

    this.init();

    // add event listener for device orientation

  	this.boundUpdate = this.update.bind(this);
  //	this.boundMozTilt = this.mozTilt.bind(this)

  	if (window.DeviceOrientationEvent) {
  		this.orientationListener = window.addEventListener('deviceorientation', this.boundUpdate, false);
  	} else {
      this._active = false;
      this.colorInterface();
    }



      /*else if (window.OrientationEvent) {
  //	  	window.addEventListener('MozOrientation', this.boundMozTilt, false);
  	} else {
  	  	console.log('Not supported on your device or browser.');
  	} */


  }


  buildInterface() {

    this.title = svg.create('text');
    this.circleX = svg.create('circle');
    this.circleY = svg.create('circle');
    this.circleZ = svg.create('circle');

    this.barX = svg.create('path');
    this.barY = svg.create('path');
    this.barZ = svg.create('path');

    this.barX2 = svg.create('path');
    this.barY2 = svg.create('path');
    this.barZ2 = svg.create('path');

    this.barX.setAttribute('opacity','0.8');
    this.barY.setAttribute('opacity','0.8');
    this.barZ.setAttribute('opacity','0.8');
    this.barX2.setAttribute('opacity','0.8');
    this.barY2.setAttribute('opacity','0.8');
    this.barZ2.setAttribute('opacity','0.8');

    this.circleX.setAttribute('cx',this.width*3/12);
    this.circleX.setAttribute('cy',this.height*3/4);
    this.circleX.setAttribute('r',this.height/10);
    this.circleX.setAttribute('opacity','0.4');

    this.circleY.setAttribute('cx',this.width*6/12);
    this.circleY.setAttribute('cy',this.height*3/4);
    this.circleY.setAttribute('r',this.height/10);
    this.circleY.setAttribute('opacity','0.4');

    this.circleZ.setAttribute('cx',this.width*9/12);
    this.circleZ.setAttribute('cy',this.height*3/4);
    this.circleZ.setAttribute('r',this.height/10);
    this.circleZ.setAttribute('opacity','0.4');


    this.barX.setAttribute('stroke-width',Math.round(this.height/30));
    this.barY.setAttribute('stroke-width',Math.round(this.height/30));
    this.barZ.setAttribute('stroke-width',Math.round(this.height/30));

    this.barX.setAttribute('fill', 'none');
    this.barY.setAttribute('fill', 'none');
    this.barZ.setAttribute('fill', 'none');

    this.barX2.setAttribute('stroke-width',Math.round(this.height/30));
    this.barY2.setAttribute('stroke-width',Math.round(this.height/30));
    this.barZ2.setAttribute('stroke-width',Math.round(this.height/30));

    this.barX2.setAttribute('fill', 'none');
    this.barY2.setAttribute('fill', 'none');
    this.barZ2.setAttribute('fill', 'none');


    this.title.setAttribute('x',this.width/2);
    this.title.setAttribute('y',this.height/3+7);
    this.title.setAttribute('font-size','15px');
    this.title.setAttribute('font-weight','bold');
    this.title.setAttribute('letter-spacing','2px');
    this.title.setAttribute('opacity','0.7');
    this.title.setAttribute('text-anchor','middle');
    this.title.textContent = 'TILT';


    this.element.appendChild(this.circleX);
    this.element.appendChild(this.circleY);
    this.element.appendChild(this.circleZ);

    this.element.appendChild(this.barX);
    this.element.appendChild(this.barY);
    this.element.appendChild(this.barZ);

    this.element.appendChild(this.barX2);
    this.element.appendChild(this.barY2);
    this.element.appendChild(this.barZ2);

    this.element.appendChild(this.title);

  }

  colorInterface() {

    if (this._active) {
      this.element.style.backgroundColor = this.colors.accent;
      this.circleX.setAttribute('fill',this.colors.light);
      this.circleY.setAttribute('fill',this.colors.light);
      this.circleZ.setAttribute('fill',this.colors.light);
      this.circleX.setAttribute('stroke',this.colors.light);
      this.circleY.setAttribute('stroke',this.colors.light);
      this.circleZ.setAttribute('stroke',this.colors.light);
      this.barX.setAttribute('stroke',this.colors.light);
      this.barY.setAttribute('stroke',this.colors.light);
      this.barZ.setAttribute('stroke',this.colors.light);
      this.barX2.setAttribute('stroke',this.colors.light);
      this.barY2.setAttribute('stroke',this.colors.light);
      this.barZ2.setAttribute('stroke',this.colors.light);
      this.title.setAttribute('fill',this.colors.light);
    } else {
      this.element.style.backgroundColor = this.colors.fill;
      this.circleX.setAttribute('fill',this.colors.mediumLight);
      this.circleY.setAttribute('fill',this.colors.mediumLight);
      this.circleZ.setAttribute('fill',this.colors.mediumLight);
      this.circleX.setAttribute('stroke',this.colors.mediumLight);
      this.circleY.setAttribute('stroke',this.colors.mediumLight);
      this.circleZ.setAttribute('stroke',this.colors.mediumLight);
      this.barX.setAttribute('stroke',this.colors.mediumLight);
      this.barY.setAttribute('stroke',this.colors.mediumLight);
      this.barZ.setAttribute('stroke',this.colors.mediumLight);
      this.barX2.setAttribute('stroke',this.colors.mediumLight);
      this.barY2.setAttribute('stroke',this.colors.mediumLight);
      this.barZ2.setAttribute('stroke',this.colors.mediumLight);
      this.title.setAttribute('fill',this.colors.mediumLight);
    }

  }

  update(v) {
    if (this._active){

      let y = v.beta;
      let x = v.gamma;
      let z = v.alpha;

      // take the original -90 to 90 scale and normalize it 0-1
      x = math.scale(x,-90,90,0,1);
      y = math.scale(y,-90,90,0,1);
      z = math.scale(z,0,360,0,1);


      let handlePoints = {
        start: Math.PI*1.5,
        end: math.clip( math.scale(x,0,0.5,Math.PI*1.5,Math.PI*0.5) , Math.PI*0.5, Math.PI*1.5 )
      };
      let handle2Points = {
        start: Math.PI*2.5,
        end: math.clip( math.scale(x,0.5,1,Math.PI*2.5,Math.PI*1.5) , Math.PI*1.5, Math.PI*2.5 )
      };

      let handlePath = svg.arc(this.circleX.cx.baseVal.value, this.circleX.cy.baseVal.value, this.circleX.r.baseVal.value, handlePoints.start, handlePoints.end);
      let handle2Path = svg.arc(this.circleX.cx.baseVal.value, this.circleX.cy.baseVal.value, this.circleX.r.baseVal.value, handle2Points.start, handle2Points.end);

      this.barX.setAttribute('d', handlePath);
      this.barX2.setAttribute('d', handle2Path);





      handlePoints = {
        start: Math.PI*1.5,
        end: math.clip( math.scale(y,0,0.5,Math.PI*1.5,Math.PI*0.5) , Math.PI*0.5, Math.PI*1.5 )
      };
      handle2Points = {
        start: Math.PI*2.5,
        end: math.clip( math.scale(y,0.5,1,Math.PI*2.5,Math.PI*1.5) , Math.PI*1.5, Math.PI*2.5 )
      };

      handlePath = svg.arc(this.circleY.cx.baseVal.value, this.circleY.cy.baseVal.value, this.circleY.r.baseVal.value, handlePoints.start, handlePoints.end);
      handle2Path = svg.arc(this.circleY.cx.baseVal.value, this.circleY.cy.baseVal.value, this.circleY.r.baseVal.value, handle2Points.start, handle2Points.end);

      this.barY.setAttribute('d', handlePath);
      this.barY2.setAttribute('d', handle2Path);






      handlePoints = {
        start: Math.PI*1.5,
        end: math.clip( math.scale(z,0,0.5,Math.PI*1.5,Math.PI*0.5) , Math.PI*0.5, Math.PI*1.5 )
      };
      handle2Points = {
        start: Math.PI*2.5,
        end: math.clip( math.scale(z,0.5,1,Math.PI*2.5,Math.PI*1.5) , Math.PI*1.5, Math.PI*2.5 )
      };

      handlePath = svg.arc(this.circleZ.cx.baseVal.value, this.circleZ.cy.baseVal.value, this.circleZ.r.baseVal.value, handlePoints.start, handlePoints.end);
      handle2Path = svg.arc(this.circleZ.cx.baseVal.value, this.circleZ.cy.baseVal.value, this.circleZ.r.baseVal.value, handle2Points.start, handle2Points.end);

      this.barZ.setAttribute('d', handlePath);
      this.barZ2.setAttribute('d', handle2Path);


      /*

      let pointsX = {
        start: 0,
        end: math.scale( x, 0, 1, 0, Math.PI*2 )
      };

    //  console.log(this.circleX.cx.baseVal.value);

      let pathX = svg.arc(this.circleX.cx.baseVal.value, this.circleX.cy.baseVal.value, this.circleX.r.baseVal.value*2, pointsX.start, pointsX.end);

      this.barX.setAttribute('d',pathX); */

      //this.textH.textContent = math.prune(x,2);
      //this.textV.textContent = math.prune(y,2);
      //
    //  this.circleX.setAttribute('opacity',x);
    //  this.circleY.setAttribute('opacity',y);
    //  this.circleZ.setAttribute('opacity',z);

      this.emit('change', {
        x: x,
        y: y,
        z: z
      });

    }

  }

  click() {
    if (window.DeviceOrientationEvent) {
      this.active = !this.active;
    }
  }

  /**
  Whether the interface is on (emitting values) or off (paused & not emitting values). Setting this property will update it.
  @type {boolean}
  */

  get active() {
    return this._active;
  }

  set active(on) {
    this._active = on;
    this.colorInterface();
  }

  customDestroy() {
    window.removeEventListener('deviceorientation', this.boundUpdate, false);
  }

}

Added public/nexus-js/lib/interfaces/toggle.js.







































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
'use strict';

let svg = require('../util/svg');
let ToggleModel = require('../models/toggle');
let Interface = require('../core/interface');

/**
* Toggle
*
* @description Binary switch
*
* @demo <span nexus-ui="toggle"></span>
*
* @example
* var toggle = new Nexus.Toggle('#target')
*
* @example
* var toggle = new Nexus.Toggle('#target',{
*     'size': [40,20],
*     'state': false
* })
*
* @output
* change
* Fires any time the interface's value changes. <br>
* Parameter: The boolean state of the interface.
*
* @outputexample
* toggle.on('change',function(v) {
*   console.log(v);
* })
*
*
*/
export default class Toggle extends Interface {

  constructor() {

    let options = ['value'];

    let defaults = {
      'size': [40,20],
      'target': false,
      'state': false
    };

    super(arguments,options,defaults);

    this._state = new ToggleModel(this.settings.state);

    this.init();

  }

  buildInterface() {

    this.bar = svg.create('rect');
    this.knob = svg.create('circle');
    this.element.appendChild(this.bar);
    this.element.appendChild(this.knob);

  }

  sizeInterface() {

    if (this.height < this.width/2) {
      this.knobSize = this.height/2;
    } else {
      this.knobSize = this.width/4;
    }

    this.bar.setAttribute('x',this.width/2 - this.knobSize*1.5);
    this.bar.setAttribute('y',this.height/2 - this.knobSize/2);
    this.bar.setAttribute('rx',this.knobSize/2);
    this.bar.setAttribute('ry',this.knobSize/2);
    this.bar.setAttribute('width',this.knobSize*3);
    this.bar.setAttribute('height',this.knobSize);

    this.knob.setAttribute('cx',this.width/2 - this.knobSize);
    this.knob.setAttribute('cy',this.height/2);
    this.knob.setAttribute('r',this.knobSize);

  }

  colorInterface() {
    this.knob.setAttribute('fill', this.colors.accent);
    this.render();
  }

  render() {
    if (!this.state) {
      this.knob.setAttribute('cx',this.width/2 - this.knobSize);
      this.bar.setAttribute('fill', this.colors.fill);
    } else {
      this.knob.setAttribute('cx',this.width/2 + this.knobSize);
      this.bar.setAttribute('fill', this.colors.accent);
    }
  }

  click() {
    this.flip();
    this.render();
    this.emit('change',this.state);
  }

  /**
  Whether the toggle is currently on or off. Setting this property will update the toggle interface and trigger the output event.
  @type {boolean}
  @example toggle.state = false;
  */
  get state() {
    return this._state.state;
  }
  set state(value) {
    this._state.flip(value);
    this.emit('change',this.state);
    this.render();
  }


  /**
  * Switch the toggle state to its opposite state
  * @example
  * toggle.flip();
  */
  flip() {
    this._state.flip();
    this.render();
  }

}

Added public/nexus-js/lib/main.js.













































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
'use strict';

import Interfaces from './interfaces/';
import math from './util/math';
import Rack from './core/rack';
import Tune from './tuning/tuning';
import * as Transform from './util/transform';

let Counter = require('./models/counter');
let Radio = require('./models/radio');
let Drunk = require('./models/drunk');
let Sequence = require('./models/sequence');
let Matrix = require('./models/matrix');

import WAAClock from 'waaclock';
import Interval from './time/interval';


/**
NexusUI => created as Nexus
*/

class NexusUI {

    constructor(context) {

        for (let key in Interfaces) {
            this[key] = Interfaces[key];
        }

        for (let key in math) {
            this[key] = math[key];
        }

        let Core = {
          'Rack': Rack
        };

        let Models = {
          'Counter': Counter,
          'Radio': Radio,
          'Drunk': Drunk,
          'Sequence': Sequence,
          'Matrix': Matrix
        };

        for (let key in Models) {
          this[key] = Models[key];
        }

        for (let key in Core) {
          this[key] = Core[key];
        }

        let DefaultContext = window.AudioContext || window.webkitAudioContext;
        this._context = context || new DefaultContext();

        this.tune = new Tune();
        this.note = this.tune.note.bind(this.tune);

        this.clock = new WAAClock(this._context);
        this.clock.start();
        this.Interval = Interval;

        this.colors = {
          accent: '#2bb',
          fill: '#eee',
          light: '#fff',
          dark: '#333',
          mediumLight: '#ccc',
          mediumDark: '#666'
        };

        this.transform = Transform;
        this.add = Transform.add;


        this.Add = {};
        for (let key in Interfaces) {
          this.Add[key] = Transform.add.bind(this,key);
        }

        /* create default component size as 1st style element in document */
        var defaultStyleNode = document.createElement('style');
        defaultStyleNode.type = 'text/css';
        defaultStyleNode.innerHTML = '[nexus-ui]{height:5000px;width:5000px}';
        var h = document.head;
        h.insertBefore(defaultStyleNode, h.firstElementChild);
    }

    get context() {
      return this._context;
    }

    set context(ctx) {
      this.clock.stop();
      this._context = ctx;
      this.clock = new WAAClock(this.context);
      this.clock.start();
    }



}

let Nexus = new NexusUI();

export function colors() {
    return Nexus.colors;
}
export function context() {
    return Nexus.context;
}
export function clock() {
    return Nexus.clock;
}

export default Nexus;

Added public/nexus-js/lib/models/counter.js.

































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
'use strict';

import math from '../util/math';
import Drunk from './drunk';

export default class Counter {

    constructor(min=0, max=10, mode='up', value=false) {
        this.min = min;
        this.max = max;
        this.value = value;
        this.mode = mode;
        this.drunkWalk = new Drunk(this.min, this.max);
        if (this.value!==false) {
          this.next = this[this._mode];
        } else {
          this.next = this.first;
        }
    }

    set mode(mode) {
        if (!(mode === 'up' || mode === 'down' || mode === 'random' || mode === 'drunk')) {
            console.error('The only modes currently allowed are: up, down, random, drunk');
            return;
        }
        this._mode = mode;
        if (this.value) {
          this.next = this[this._mode];
        }
    }

    get mode() {
        return this._mode;
    }

    first() {
      if (this.value!==false) {
        this.next = this[this._mode];
        return this.next();
      }
      this.startValues = {
        'up': this.min,
        'down': this.max,
        'drunk': ~~math.average(this.min,this.max),
        'random': math.ri(this.min,this.max)
      };
      this.value = this.startValues[this._mode];
      this.next = this[this._mode];
      return this.value;
    }

    up() {
        this.value++;
        if (this.value >= this.max) {
            this.value = this.min;
        }
        return this.value;
    }

    down() {
        this.value--;
        if (this.value < this.min) {
            this.value = this.max;
        }
        return this.value;
    }

    random() {
        this.value = math.ri(this.min, this.max);
        return this.value;
    }

    drunk() {
        this.drunkWalk.min = this.min;
        this.drunkWalk.max = this.max;
        this.drunkWalk.value = this.value;
        this.value = this.drunkWalk.next();
        return this.value;
    }
}

Added public/nexus-js/lib/models/drunk.js.





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
'use strict';

import math from '../util/math';

export default class Drunk {

    constructor(min=0, max=9, value=0, increment=1, loop=false) {
        this.min = min;
        this.max = max;
        this.value = value;
        this.increment = increment;
        this.loop = loop;
    }

    next() {
        this.value += math.pick(-1 * this.increment, this.increment);
        if (this.value > this.max) {
            if (this.loop) {
                this.value = this.min;
            } else {
                this.value = this.max - this.increment;
            }
        }

        if (this.value < this.min) {
            if (this.loop) {
                this.value = this.max;
            } else {
                this.value = this.min + this.increment;
            }
        }
        return this.value;
    }
}

Added public/nexus-js/lib/models/matrix.js.











































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
'use strict';

import math from '../util/math';
import Sequence from '../models/sequence';

// For the tutorial, looking at

//Pattern section:
// .create(), .rows, .columns,
// .pattern, .length, .formatAsText(), .log(),
// .locate(i), .indexOf(c,r)
// row(), column() (returns contents of row or colum)

//Control section:
// toggle x3
// set x4
// rotate x3
// populate x3
// erase x3


// should some version of this have a float value for each cell?
// could be like a mirror .pattern that has values. by default, everything is 1, but could be set...
// not a good way to do that on interface, but as a model it would be nice...
// for .formatAsText(), could multiply by 100 and floor, so each cell is an int from 0 to 9

export default class Matrix {

  constructor(rows,columns) {
    // should also have ability to create using an existing matrix (2d array)
    this.pattern = [];
    this.create(rows,columns);

    this.toggle = {
      cell: (column, row) => {
        this.pattern[row][column] = !this.pattern[row][column]; // math.invert(this.pattern[row][column]);
        if (this.ui) { this.ui.update(); }
        return this.pattern[row][column];
      },
      all: () => {
        this.iterate((r,c) => { this.toggle.cell(c,r); });
        if (this.ui) { this.ui.update(); }
      },
      row: (row) => {
        for (let i=0; i<this.columns; i++) {
          this.toggle.cell(i,row);
        }
        if (this.ui) { this.ui.update(); }
      },
      column: (column) => {
        for (let i=0; i<this.rows; i++) {
          this.toggle.cell(column,i);
        }
        if (this.ui) { this.ui.update(); }
      }
    };

    this.set = {
      cell: (column, row, value) => {
        this.pattern[row][column] = value;
        if (this.ui) { this.ui.update(); }
      },
      all: (values) => {
        // set the whole matrix using a 2d array as input
        // this should also resize the array?
        this.pattern = values;
        if (this.ui) { this.ui.update(); }
      },
      row: (row,values) => {
        // set a row using an array as input
        this.pattern[row] = values;
        if (this.ui) { this.ui.update(); }
      },
      column: (column,values) => {
        // set a column using an array as input
        this.pattern.forEach((row,i) => {
          this.pattern[i][column] = values[i];
        });
        if (this.ui) { this.ui.update(); }
      }
    };

    this.rotate = {
      //should eventually do (amountX, amountY) here
      // could just use a loop and this.rotate.row(i,amountX);
      all: (amount) => {
        if (!amount && amount!==0) {
          amount = 1;
        }
        amount %= this.pattern[0].length;
        if (amount < 0) {
          amount = this.pattern[0].length + amount;
        }
        for (let i=0; i<this.rows; i++) {
          let cut = this.pattern[i].splice( this.pattern[i].length - amount, amount );
          this.pattern[i] = cut.concat( this.pattern[i] );
        }
        if (this.ui) { this.ui.update(); }
      },
      row: (row,amount) => {
        if (!amount && amount!==0) {
          amount = 1;
        }
        amount %= this.pattern[0].length;
        if (amount < 0) {
          amount = this.pattern[0].length + amount;
        }
        let cut = this.pattern[row].splice( this.pattern[row].length - amount, amount );
        this.pattern[row] = cut.concat( this.pattern[row] );
        if (this.ui) { this.ui.update(); }
      },
      column: (column, amount) => {
        if (!amount && amount!==0) {
          amount = 1;
        }
        amount %= this.pattern.length;
        if (amount < 0) {
          amount = this.pattern.length + amount;
        }
        let proxy = [];
        this.pattern.forEach((row) => {
          proxy.push( row[column] );
        });
        let cut = proxy.splice( proxy.length - amount, amount );
        proxy = cut.concat( proxy );
        this.pattern.forEach((row,i) => {
          row[column] = proxy[i];
        });
        if (this.ui) { this.ui.update(); }
      }
    };

    // the idea behind populate is to be able to set a whole row or column to 0 or 1
    // IF the value is a float, such as 0.7, then it would become a probability
    // so populate(0.7) would give each cell a 70% chance of being 1
    this.populate = {
      all: (odds) => {
        let oddsSequence = new Sequence(odds);
        this.iterate((r,c) => {
          this.pattern[r][c] = math.coin(oddsSequence.next());
        });
        // This could be used so that each row has same odds pattern, even if row length is not divisibly by sequence length.
        //,() => {
        //  odds.pos = -1;
        // }
        if (this.ui) { this.ui.update(); }
      },
      row: (row=0,odds=1) => {
        let oddsSequence = new Sequence(odds);
        this.pattern[row].forEach((cell,i) => {
          this.pattern[row][i] = math.coin(oddsSequence.next());
        });
        if (this.ui) { this.ui.update(); }
      },
      column: (column=0,odds=1) => {
        let oddsSequence = new Sequence(odds);
        this.pattern.forEach((row,i) => {
          this.pattern[i][column] = math.coin(oddsSequence.next());
        });
        if (this.ui) { this.ui.update(); }
      }
    };

    // essentiall populate(0) so i'm not sure if this is necessary but is nice
    this.erase = {
      all: () => {
        this.set.all(0);
      },
      row: (row) => {
        this.set.row(row,0);
      },
      column: (column) => {
        this.set.column(column,0);
      }
    };

  // end constructor
  }


  create(rows,columns) {
    this.pattern = [];
    for ( let row=0; row < rows; row++ ) {
      let arr = new Array(columns);
      this.pattern.push(arr);
    }
    this.iterate((r,c) => { this.pattern[r][c] = false; });
  }

  iterate(f, f2) {
    let i = 0;
    for ( let row=0; row < this.rows; row++ ) {
      if (f2) { f2(row); }
      for ( let column=0; column < this.columns; column++ ) {
        f(row,column,i);
        i++;
      }
    }
  }

  formatAsText() {
    let patternString = '';
    this.iterate(
      (r,c) => { patternString += (this.pattern[r][c] ? 1 : 0) + ' '; },
      () => { patternString += '\n'; }
    );
    return patternString;
  }

  log() {
    console.log(this.formatAsText());
  }

  update(pattern) {
    this.pattern = pattern || this.pattern;
  }

  get length() {
    return this.rows*this.columns;
  }

  locate(index) {
    // returns row and column of cell by index
    return {
      row: ~~( index / this.columns ),
      column: index % this.columns
    };
  }

  indexOf(row,column) {
    return column + row * this.columns;
    // returns index of cell by row and column
  }

  row(row) {
    let data = [];
    for (let i=0; i<this.columns; i++) {
      data.push(this.pattern[row] ? 1 : 0);
    }
    return data;
  }

  column(column) {
    let data = [];
    for (let i=0; i<this.rows; i++) {
      data.push(this.pattern[i][column] ? 1 : 0);
    }
    return data;
  }

  get rows() {
    return this.pattern.length;
  }
  set rows(v) {
    let previous = this.pattern.slice(0);
    this.create(v,this.columns);
    this.iterate((r,c) => {
      if (previous[r] && previous[r][c]) {
        this.pattern[r][c] = previous[r][c];
      }
    });
  }

  get columns() {
    return this.pattern[0].length;
  }
  set columns(v) {
    let previous = this.pattern.slice(0);
    this.create(this.rows,v);
    this.iterate((r,c) => {
      if (previous[r] && previous[r][c]) {
        this.pattern[r][c] = previous[r][c];
      }
    });
  }

}

Added public/nexus-js/lib/models/radio.js.





































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
'use strict';

//Disable jshint warning concerning trailing regular params
/*jshint -W138 */

export default class Radio {
    //if non-existent buttons are switched, they are ignored

    constructor(length = 3, ...onVals) {
        //each optional 'onVals' argument switches on that value in the Radio if it exists
        //In the example below, a 3-button radio is created, index 0 is switched on, index 1 is switched on then then attempted again producing an warning, and the final argument produces a warning because the index value does not exist.
        //Example:
        //`  radio = new Radio(3, 0, 1, 1, 3);
        //…  [1,1,0]

        if (length < 0) { length = 1; }

        this.length = length;
        this.onVals = onVals;
        this.array = new Array(length).fill(0);

        if (onVals.length > 0) {
            this.on(...onVals);
        }
    }

    select(value) {
        this.array.fill(0);
        this.array[value] = 1;
        return this.array;
    }

    flip(...values) {
        //flips the specified values. if no value is specified, flips all buttons
        let a = this.array;
        if (values.length > 0) {
            values.forEach(function(v) {
                if (v > a.length - 1) {
                    console.warn('Warning: AnonRadio[' + v + '] does not exist');
                } else {
                    a[v] = (a[v] ? 0 : 1);
                }
            });
        } else {
            a.forEach(function(v, i, arr) {
                arr[i] = (v ? 0 : 1);
            });
        }
        return a;
    }

    on(...values) {
        //switch on the specified values. if no value specified, flips on all buttons
        let a = this.array;
        if (values.length > 0) {
            values.forEach(function(v) {
                if (v > a.length - 1) {
                    console.warn('Warning: AnonRadio[' + v + '] exceeds size of object');
                } else {
                    if (a[v] === 1) { console.warn('Warning: AnonRadio[' + v + '] was already on.'); }
                    a[v] = 1;
                }
            });
        } else {
            a.fill(1);
        }
        return a;
    }

    off(...values) {
        //switch off the specified values. if no value specified, flips off all buttons
        let a = this.array;
        if (values.length > 0) {
            values.forEach(function(v) {
                a[v] = 0;
            });
        } else {
            a.fill(0);
        }
        return a;
    }
}

Added public/nexus-js/lib/models/range.js.









































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
'use strict';

import Step from './step';

/**
  Creates an abstract model of a steppable range slider with start and end values which are constricted by a minimum, maximum, and step size.
  @param {number} [min=0] minimum
  @param {number} [max=1] maximum
  @param {number} [step=0]
  @returns {Object} Step
*/

export default class Range {

  constructor(min = 0,max = 1,step = false) {

    /**
      {number} Minimum value of the range
    */
    this.min = min;

    /**
      {number} Maximum value of the range
    */
    this.max = max;

    /**
      {Step} Start value of the range selection
    */
    this.start = new Step(min,max,step);

    /**
      {Step} End value of the range selection
    */
    this.end = new Step(min,max,step);
  }

  /**
    {number} Center of the range selection
  */
  get center() {
    return this.start.value + (this.end.value - this.start.value)/2;
  }

  set center(value) {
    let size = this.end.value-this.start.value;
    console.log('====');
    console.log(this.start.value);
    console.log(this.end.value);
    this.start.update( value - size/2 );
    this.end.update( this.start.value + size );
  }

  /**
    {number} Size of the range selection
  */
  get size() {
    return this.end.value - this.start.value;
  }

  set size(size) {
    let center = this.center;
    this.start.update(center - size/2);
    // Ensure that the range slsection _is_ the size desired, even if it changes the center.
    this.end.update(this.start.value + size);
    //this.end.update(center + size/2);
  }


  /**
    Move the range selection
    @param {number} start New start value of the range selection
    @param {number} end New end value of the range selection
  */
  move(start,end) {
    if (start) {
      this.start.update(start);
    }
    if (end) {
      this.end.update(end);
    }
  }

}

Added public/nexus-js/lib/models/sequence.js.





































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
'use strict';

import math from '../util/math';
import Drunk from './drunk';

export default class Sequence {

    constructor(sequence = [0,10,20,30], mode='up', position=false) {
        this.values = sequence;
        if (!Array.isArray(this.values)) {
          this.values = [this.values];
        }
        this._mode = mode;
        this.position = position;

        this.drunkWalk = new Drunk(0, this.values.length - 1);

        this.startValues = {
          'up': 0,
          'down': this.values.length - 1,
          'drunk': ~~(this.values.length/2),
          'random': math.ri(this.values.length)
        };

        if (this.position!==false) {
          this.next = this[this._mode];
        } else {
          this.next = this.first;
        }


    }

    get mode() {
      return this._mode;
    }

    set mode(mode) {
        if (!(mode === 'up' || mode === 'down' || mode === 'random' || mode === 'drunk')) {
            console.error('The only modes currently allowed are: up, down, random, drunk');
            return;
        }
        this._mode = mode;
        if (this.position) {
          this.next = this[this._mode];
        }
    }

    get value() {
      return this.values[this.position];
    }

    set value(v) {
      this.position = this.values.indexOf(v);
    }

    first() {
      if (this.position!==false) {
        this.next = this[this._mode];
        return this.next();
      }
      this.position = this.startValues[this._mode];
      this.next = this[this._mode];
      return this.value;
    }

    up() {
      this.position++;
      this.position %= this.values.length;
      return this.value;
    }

    down() {
      this.position--;
      if (this.position < 0) {
        this.position = (this.position + this.values.length) % this.values.length;
      }
      return this.value;
    }

    random() {
      this.position = math.ri(0, this.values.length);
      return this.value;
    }

    drunk() {
      this.drunkWalk.max = this.values.length;
      this.drunkWalk.value = this.position;
      this.position = this.drunkWalk.next();
      return this.value;
    }

    /* future methods
    .group(start,stop) -- outputs a group of n items from the list, with wrapping
    .loop(start,stop) -- confines sequencing to a subset of the values
        (could even have a distinction between .originalValues and the array of values being used)
    */
}

Added public/nexus-js/lib/models/step.js.





































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
'use strict';

let math = require('../util/math');

/**
  Creates a steppable value with minimum, maximum, and step size. This is used in many interfaces to constrict their values to certain ranges.
  @param {number} [min=0] minimum
  @param {number} [max=1] maximum
  @param {number} [step=0]
  @param {number} [value=0] initial value
  @returns {Object} Step
*/

export default class Step {

  constructor(min = 0,max = 1,step = 0,value = 0) {
    //Object.assign(this,{min,max,step});
    //Cannot use Object.assign because not supported in Safari.
    //I would expect for Babel to take care of this but it is not.
    this.min = min;
    this.max = max;
    this.step = step;
    this.value = value;
    this.changed = false;
    this.oldValue = false;
    this.update(this.value);
  }

  /**
    Update with a new value. The value will be auto-adjusted to fit the min/max/step.
    @param {number} value
  */

  update(value) {
    if (this.step) {
      // this.value = math.clip(Math.round(value / (this.step)) * this.step, this.min,this.max);
      this.value = math.clip(Math.round((value-this.min) / (this.step)) * this.step + this.min, this.min,this.max);
    } else {
      this.value = math.clip(value,this.min,this.max);
    }
    if (this.oldValue !== this.value) {
      this.oldValue = this.value;
      this.changed = true;
    } else {
      this.changed = false;
    }
    return this.value;
  }

  /**
    Update with a normalized value 0-1.
    @param {number} value
  */
  updateNormal(value) {
    this.value = math.scale(value,0,1,this.min,this.max);
    return this.update(this.value);
  }

  /**
    Get a normalized version of this.value . Not settable.
  */
  get normalized() {
    return math.normalize(this.value,this.min,this.max);
  }

}

Added public/nexus-js/lib/models/toggle.js.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
'use strict';

export default class Toggle {

  constructor(state) {
    this.state = state || false;
  }

  flip(state) {
    if (state || state === false) {
      this.state = state;
    } else {
      this.state = !this.state;
    }
  }

  on() {
    this.state = true;
  }

  off() {
    this.state = false;
  }

}

Added public/nexus-js/lib/time/interval.js.







































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
'use strict';

import { clock } from '../main';

export default class Interval {

  constructor(rate,func,on) {

    this.rate = rate;
    this.on = on;
    this.clock = clock(); // jshint ignore:line

    this.pattern = [1];
    this.index = 0;

    this.event = func ? func : function() { };

    if (this.on) {
      this.start();
    }

  }

  _event(e) {
  //  if (this.pattern[this.index%this.pattern.length]) {
      this.event(e);
  //  }
    this.index++;
  }

  stop() {
    this.on = false;
    this.interval.clear();
  }

  start() {
    this.on = true;
    this.interval = this.clock.callbackAtTime(this._event.bind(this), this.clock.context.currentTime).repeat(this.rate/1000).tolerance({early: 0.1, late:1});
  }

  ms(newrate) {
    if (this.on) {
      var ratio = newrate/this.rate;
      this.rate = newrate;
      this.clock.timeStretch(this.clock.context.currentTime, [this.interval], ratio);
    } else {
      this.rate = newrate;
    }
  }

}

Added public/nexus-js/lib/tuning/tuning.js.



























































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
'use strict';

import math from '../util/math';

export default class Tune {
  constructor() {
    // the scale as ratios
    this.scale = [];

    // i/o modes
    this.mode = {
      output: 'frequency',
      input: 'step'
    };

    // ET major
    this.etmajor = [
      261.62558,
      293.664764,
      329.627563,
      349.228241,
      391.995422,
      440,
      493.883301,
      523.25116
    ];

    // Root frequency.
    this.root = math.mtof(60); // * Math.pow(2,(60-69)/12);

    // default is a major scale
    this.createScale(0, 2, 4, 5, 7, 9, 11);
  }

  /* Return data in the mode you are in (freq, ratio, or midi) */
  note(input, octave) {
    let newvalue;

    if (this.mode.output === 'frequency') {
      newvalue = this.frequency(input, octave);
    } else if (this.mode.output === 'ratio') {
      newvalue = this.ratio(input, octave);
    } else if (this.mode.output === 'MIDI') {
      newvalue = this.MIDI(input, octave);
    } else {
      newvalue = this.frequency(input, octave);
    }

    return newvalue;
  }

  /* Return freq data */
  frequency(stepIn, octaveIn) {
    if (this.mode.input === 'midi' || this.mode.input === 'MIDI') {
      this.stepIn += 60;
    }

    // what octave is our input
    let octave = Math.floor(stepIn / this.scale.length);

    if (octaveIn) {
      octave += octaveIn;
    }

    // which scale degree (0 - scale length) is our input
    let scaleDegree = stepIn % this.scale.length;

    while (scaleDegree < 0) {
      scaleDegree += this.scale.length;
    }

    let ratio = this.scale[scaleDegree];

    let freq = this.root * ratio;

    freq = freq * Math.pow(2, octave);

    // truncate irrational numbers
    freq = Math.floor(freq * 100000000000) / 100000000000;

    return freq;
  }

  /* Force return ratio data */

  ratio(stepIn, octaveIn) {
    if (this.mode.input === 'midi' || this.mode.input === 'MIDI') {
      this.stepIn += 60;
    }

    // what octave is our input
    let octave = Math.floor(stepIn / this.scale.length);

    if (octaveIn) {
      octave += octaveIn;
    }

    // which scale degree (0 - scale length) is our input
    let scaleDegree = stepIn % this.scale.length;

    // what ratio is our input to our key
    let ratio = Math.pow(2, octave) * this.scale[scaleDegree];

    ratio = Math.floor(ratio * 100000000000) / 100000000000;

    return ratio;
  }

  /* Force return adjusted MIDI data */

  MIDI(stepIn, octaveIn) {
    let newvalue = this.frequency(stepIn, octaveIn);

    let n = 69 + (12 * Math.log(newvalue / 440)) / Math.log(2);

    n = Math.floor(n * 1000000000) / 1000000000;

    return n;
  }

  createScale() {
    let newScale = [];
    for (let i = 0; i < arguments.length; i++) {
      newScale.push(math.mtof(60 + arguments[i]));
    }
    this.loadScaleFromFrequencies(newScale);
  }

  createJIScale() {
    this.scale = [];
    for (let i = 0; i < arguments.length; i++) {
      this.scale.push(arguments[i]);
    }
  }

  loadScaleFromFrequencies(freqs) {
    this.scale = [];
    for (let i = 0; i < freqs.length; i++) {
      this.scale.push(freqs[i] / freqs[0]);
    }
  }

  /* Load a new scale */

  loadScale(name) {
    /* load the scale */
    let freqs = this.scales[name].frequencies;
    this.loadScaleFromFrequencies(freqs);
  }

  /* Search the names of tunings
  	 Returns an array of names of tunings */

  search(letters) {
    let possible = [];
    for (let key in this.scales) {
      if (key.toLowerCase().indexOf(letters.toLowerCase()) !== -1) {
        possible.push(key);
      }
    }
    return possible;
  }

  /* Return a collection of notes as an array */

  chord(midis) {
    let output = [];
    for (let i = 0; i < midis.length; i++) {
      output.push(this.note(midis[i]));
    }
    return output;
  }
}

Added public/nexus-js/lib/util/cssparse.js.

































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
'use strict';


// polyfill window.getMatchedCSSRules() in FireFox 6+
//if (typeof window.getMatchedCSSRules !== 'function') {
  var ELEMENT_RE = /[\w-]+/g,
          ID_RE = /#[\w-]+/g,
          CLASS_RE = /\.[\w-]+/g,
          ATTR_RE = /\[[^\]]+\]/g,
          // :not() pseudo-class does not add to specificity, but its content does as if it was outside it
          PSEUDO_CLASSES_RE = /\:(?!not)[\w-]+(\(.*\))?/g,
          PSEUDO_ELEMENTS_RE = /\:\:?(after|before|first-letter|first-line|selection)/g;
      // convert an array-like object to array
    function toArray(list) {
        return [].slice.call(list);
    }

    // handles extraction of `cssRules` as an `Array` from a stylesheet or something that behaves the same
    function getSheetRules(stylesheet) {
        var sheet_media = stylesheet.media && stylesheet.media.mediaText;
        // if this sheet is disabled skip it
        if ( stylesheet.disabled ) return [];
        // if this sheet's media is specified and doesn't match the viewport then skip it
        if ( sheet_media && sheet_media.length && ! window.matchMedia(sheet_media).matches ) return [];
        // get the style rules of this sheet
        return toArray(stylesheet.cssRules);
    }

    function _find(string, re) {
        var matches = string.match(re);
        return matches ? matches.length : 0;
    }

    // Find correct matchesSelector impl
    function matchesSelector(el, selector) {
      var matcher = el.matchesSelector || el.mozMatchesSelector ||
          el.webkitMatchesSelector || el.oMatchesSelector || el.msMatchesSelector;

      selector = '*';
      console.log(selector);
      console.log(matcher);
      var result = el.webkitMatchesSelector('*');
      //return matcher(selector);
      return result;
    }

    // calculates the specificity of a given `selector`
    function calculateScore(selector) {
        var score = [0,0,0],
            parts = selector.split(' '),
            part, match;
        //TODO: clean the ':not' part since the last ELEMENT_RE will pick it up
        while (part = parts.shift(), typeof part == 'string') {
            // find all pseudo-elements
            match = _find(part, PSEUDO_ELEMENTS_RE);
            score[2] += match;
            // and remove them
            part = part.replace(PSEUDO_ELEMENTS_RE, '');
            // find all pseudo-classes
            match = _find(part, PSEUDO_CLASSES_RE);
            score[1] += match;
            // and remove them
            part = part.replace(PSEUDO_CLASSES_RE, '');
            // find all attributes
            match = _find(part, ATTR_RE);
            score[1] += match;
            // and remove them
            part = part.replace(ATTR_RE, '');
            // find all IDs
            match = _find(part, ID_RE);
            score[0] += match;
            // and remove them
            part = part.replace(ID_RE, '');
            // find all classes
            match = _find(part, CLASS_RE);
            score[1] += match;
            // and remove them
            part = part.replace(CLASS_RE, '');
            // find all elements
            score[2] += _find(part, ELEMENT_RE);
        }
        return parseInt(score.join(''), 10);
    }

    // returns the heights possible specificity score an element can get from a give rule's selectorText
    function getSpecificityScore(element, selector_text) {
        var selectors = selector_text.split(','),
            selector, score, result = 0;
        selector = selectors.shift();
        while (selector) {
          if (matchesSelector(element, selector)) {
              score = calculateScore(selector);
              result = score > result ? score : result;
          }
          selector = selectors.shift();
        }
        return result;
    }

    function sortBySpecificity(element, rules) {
        // comparing function that sorts CSSStyleRules according to specificity of their `selectorText`
        function compareSpecificity (a, b) {
            return getSpecificityScore(element, b.selectorText) - getSpecificityScore(element, a.selectorText);
        }

        return rules.sort(compareSpecificity);
    }

    //TODO: not supporting 2nd argument for selecting pseudo elements
    //TODO: not supporting 3rd argument for checking author style sheets only
    var getCSSRules = function(element) {
         var style_sheets, sheet, /* sheet_media, */
            rules, rule,
            result = [];
        // get stylesheets and convert to a regular Array
        style_sheets = toArray(window.document.styleSheets);

        // assuming the browser hands us stylesheets in order of appearance
        // we iterate them from the beginning to follow proper cascade order
        sheet = style_sheets.shift();
        while (sheet) {
            // get the style rules of this sheet
            rules = getSheetRules(sheet);
            // loop the rules in order of appearance
            rule = rules.shift();
            while (rule) {
                // if this is an @import rule
                if (rule.styleSheet) {
                    // insert the imported stylesheet's rules at the beginning of this stylesheet's rules
                    rules = getSheetRules(rule.styleSheet).concat(rules);
                    // and skip this rule
                    continue;
                }
                // if there's no stylesheet attribute BUT there IS a media attribute it's a media rule
                else if (rule.media) {
                    // insert the contained rules of this media rule to the beginning of this stylesheet's rules
                    rules = getSheetRules(rule).concat(rules);
                    // and skip it
                    continue;
                }

                // check if this element matches this rule's selector
                if (matchesSelector(element, rule.selectorText)) {
                    // push the rule to the results set
                    result.push(rule);
                }
                rule = rules.shift();
            }
            sheet = style_sheets.shift();
        }
        // sort according to specificity
        return sortBySpecificity(element, result);
    };
//  }


exports.parseSize = function(element) {
  let rules = getCSSRules(element);
  console.log(rules);
};

Added public/nexus-js/lib/util/dom.js.



































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
'use strict';

exports.findPosition = (el) => {
  let viewportOffset = el.getBoundingClientRect();
  let top = viewportOffset.top + window.scrollY;
  let left = viewportOffset.left + window.scrollX;
  return {top,left};
};

exports.parseElement = (parent) => {
  if (typeof parent === 'string') {
    parent = document.getElementById(parent.replace('#',''));
  }

  if (parent instanceof HTMLElement || parent instanceof SVGElement){
    return parent;
  } else {
    return 'No valid parent argument';
  }
};

exports.locateMouse = (e,offset) => {
  return {
    x: e.pageX - offset.left,
    y: e.pageY - offset.top
  };
};

exports.locateTouch = (e,offset) => {
  return {
    x: e.targetTouches.length ? e.targetTouches[0].pageX - offset.left : false,
    y: e.targetTouches.length ? e.targetTouches[0].pageY - offset.top : false
  };
};

exports.SmartCanvas = function(parent) {

  this.element = document.createElement('canvas');
  this.context = this.element.getContext('2d');
  parent.appendChild(this.element);

  this.resize = (w,h) => {
    this.element.width = w*2;
    this.element.height = h*2;
    this.element.style.width = w+'px';
    this.element.style.height = h+'px';
  };

};

Added public/nexus-js/lib/util/interaction.js.













































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
'use strict';

import math from '../util/math';
import ToggleModel from '../models/toggle';


/*
how to use :

dial.interaction = new Handle('radial','relative',this.width,this.height);
// dial.interaction.mode = 'relative'
// dial.interaction.direction = 'radial'

on click:
dial.interaction.anchor = this.mouse;

on move:
dial.interaction.update(this.mouse);

console.log( dial.interaction.value ); should be a normalized value.

*/

/*
  absolute/relative are property: mode
  radial/vertical/horizontal/2d are property: direction

  plan :

  if relative --
  NO on click, get value offset between current value and click value.
  NO on move, use click value - offset
  INSTEAD
  use delta -- bc vertical motion on dial is impossible otherwise
  also allow to set sensitivity

*/

export class Handle {

  constructor(mode='absolute',direction='vertical',xbound=[0,100],ybound=[0,100]) {
    this.mode = mode;
    this.direction = direction;
    this.previous = 0;
    this.value = 0;
    this.sensitivity = 1;
    this.resize(xbound,ybound);
  }

  resize(xbound,ybound) {
    this.boundary = {
      min: {
        x: xbound[0],
        y: ybound[0]
      },
      max: {
        x: xbound[1],
        y: ybound[1]
      },
      center: {
        x: (xbound[1] - xbound[0])/2 + xbound[0],
        y: (ybound[1] - ybound[0])/2 + ybound[0]
      }
    };
  }

  set anchor(mouse) {
    this._anchor = this.convertPositionToValue(mouse);
  }

  get anchor() {
    return this._anchor;
  }


  update(mouse) {
    if (this.mode==='relative') {
      let increment = this.convertPositionToValue(mouse) - this.anchor;
      if (Math.abs(increment) > 0.5) { increment = 0; }
      this.anchor = mouse;
      this.value = this.value + increment * this.sensitivity;
    } else {
      this.value = this.convertPositionToValue(mouse);
    }
    this.value = math.clip(this.value,0,1);
  }

  convertPositionToValue(current) {
    switch(this.direction) {
      case 'radial':
        let position = math.toPolar(current.x - this.boundary.center.x, current.y - this.boundary.center.y);
        position = position.angle / (Math.PI*2);
        position = ((position - 0.25) + 1) % 1;
        return position;
      case 'vertical':
        return math.scale(current.y,this.boundary.min.y,this.boundary.max.y,0,1);
      case 'horizontal':
        return math.scale(current.x,this.boundary.min.x,this.boundary.max.x,0,1);
    }
  }

}


export class Button {

  constructor(mode='button') {
    this.mode = mode;
    this.state = new ToggleModel();
    this.paintbrush = false;
  }

  click() {
    switch (this.mode) {
      case 'impulse':
        this.state.on();
        if (this.timeout) {
          clearTimeout(this.timeout);
        }
        this.timeout = setTimeout(this.state.off.bind(this),30);
        this.emit('change',this.state);
        break;
      case 'button':
        this.turnOn();
        this.emit('change',this.state);
        break;
      case 'aftertouch':
        this.position = {
          x: math.clip(this.mouse.x / this.width,0,1),
          y: math.clip(1 - this.mouse.y / this.height,0,1)
        };
        this.turnOn();
        this.emit('change',{
          state: this.state,
          x: this.position.x,
          y: this.position.y,
        });
        break;
      case 'toggle':
        this.flip();
        this.emit('change',this.state);
        break;
    }

  }

  move() {
    if (this.mode==='aftertouch') {
      this.position = {
        x: math.clip(this.mouse.x / this.width,0,1),
        y: math.clip(1 - this.mouse.y / this.height,0,1)
      };
      this.emit('change',{
        state: this.state,
        x: this.position.x,
        y: this.position.y,
      });
      this.render();
    }
  }

  release() {
    switch (this.mode) {
      case 'button':
        this.turnOff();
        this.emit('change',this.state);
        break;
      case 'aftertouch':
        this.turnOff();
        this.position = {
          x: this.mouse.x / this.width,
          y: 1 - this.mouse.y / this.height
        };
        this.emit('change',{
          state: this.state,
          x: this.position.x,
          y: this.position.y,
        });
        break;
    }
  }
}

Added public/nexus-js/lib/util/math.js.





























































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
'use strict';

/**
 * Limit a number to within a minimum and maximum
 * @param  {number} value Input value
 * @param  {number} min   Lower limit
 * @param  {number} max   Upper limit
 * @return {number}       The input value constrained within the lower and upper limits
 * @example
 * Nexus.clip(11,0,10)   // returns 10
 * Nexus.clip(-1,0,10)   // returns 0
 * Nexus.clip(5,0,10)    // returns 5
 */

exports.clip = (value,min,max) => {
  return Math.min(Math.max(value,min),max);
};

exports.normalize = (value,min,max) => {
  return ( (value-min) / (max-min) );
};

/**
 * Scale a value from one range to another range.
 * @param  {number} inNum  Input value
 * @param  {number} inMin  Input range minimum
 * @param  {number} inMax  Input range maximum
 * @param  {number} outMin Output range minimum
 * @param  {number} outMax Output range maximum
 * @return {number}        The input value scaled to its new range
 * @example
 * Nexus.scale(0.5,0,1,0,10)   // returns 5
 * Nexus.scale(0.9,0,1,1,0)    // returns 0.1
 */
exports.scale = (inNum, inMin, inMax, outMin, outMax) => {
  if (inMin === inMax) {
    return outMin;
  }
  return (((inNum - inMin) * (outMax - outMin)) / (inMax - inMin)) + outMin;
};

exports.toPolar = (x,y) => {
  var r = Math.sqrt(x*x + y*y);

  var theta = Math.atan2(y,x);
  if (theta < 0) {
    theta = theta + (2 * Math.PI);
  }
  return {radius: r, angle: theta};
};

exports.toCartesian = function(radius, angle){
  var cos = Math.cos(angle);
  var sin = Math.sin(angle);
  return {x: radius*cos, y: radius*sin*-1};
};
/*
exports.polarToCartesian(centerX, centerY, radius, angleInDegrees) {
  var angleInRadians = (angleInDegrees-90) * Math.PI / 180.0;

  return {
    x: centerX + (radius * Math.cos(angleInRadians)),
    y: centerY + (radius * Math.sin(angleInRadians))
  };
}  */



exports.prune = function(data, scale) {
  return parseFloat(data.toFixed(scale));
};

exports.invert = function (inNum) {
  return exports.scale(inNum, 1, 0, 0, 1);
};

/**
 * Convert a MIDi note number to a frequency value in equal temperament.
 * @param  {number} midi MIDI note value
 * @return {number}      Frequence value
 * @example
 * Nexus.mtof(60)  // returns the frequency number of Middle C
 */
exports.mtof = function(midi) {
  return Math.pow(2, ((midi-69)/12)) * 440;
};

/**
 * Interpolate between two numbers
 * @param  {number} loc Interpolation index (0-1)
 * @param  {number} min Lower value
 * @param  {number} max Upper value
 * @return {number}     Interpolated value
 * @example
 * Nexus.interp(0.5,2,4)   // returns 3
 * Nexus.interp(0.1,0,10)     // returns 1
 */
exports.interp = function(loc,min,max) {
  return loc * (max - min) + min;
};

/**
 * Return a random choice from a list of arguments
 * @return {various} One random argument
 * @example
 * Nexus.pick(1,2,3,4)   // returns 1, 2, 3, or 4
 * Nexus.pick(function1,function2)   // returns either function1 or function2
 */
exports.pick = function() {
  return arguments[~~(Math.random()*arguments.length)];
};

/**
 * Returns an octave multiplier for frequency values
 * @param  {number} num Relative octave number (e.g. -1 for one octave down, 1 for one octave up)
 * @return {number}     Octave multiplier
 * @example
 * Nexus.octave(-1)  // returns 0.5
 * Nexus.octave(0)   // returns 1
 * Nexus.octave(1)   // returns 2
 * Nexus.octave(2)   // returns 4
 */
exports.octave = function(num) {
  return Math.pow(2,num);
};

/**
 * Random integer generator. If no second argument is given, will return random integer from 0 to bound1.
 * @param  {number} bound1 Minimum random value
 * @param  {number} bound2 Maximum random value
 * @return {number}        Random integer between lower and upper boundary
 * @example
 * Nexus.ri(10)    // returns random int from 0 to 10
 * Nexus.ri(20,2000) // returns random int from 20 to 2000
 */
exports.ri = function(bound1,bound2) {
  if (!bound2) {
    bound2 = bound1;
    bound1 = 0;
  }
  var low = Math.min(bound1,bound2);
  var high = Math.max(bound1,bound2);
  return Math.floor(Math.random()*(high-low)+low);
};

/**
 * Random float number generator. If no second argument is given, will return random float from 0 to bound1.
 * @param  {number} bound1 Minimum random value
 * @param  {number} bound2 Maximum random value
 * @return {number}        Random float between lower and upper boundary
 * @example
 * Nexus.rf(1)    // returns random float from 0 to 1
 * Nexus.rf(1,2) // returns random float from 1 to 2
 */
exports.rf = function(bound1,bound2) {
  if (!bound2) {
    bound2 = bound1;
    bound1 = 0;
  }
  var low = Math.min(bound1,bound2);
  var high = Math.max(bound1,bound2);
  return Math.random()*(high-low)+low;
};


exports.cycle = function(input,min,max) {
  input++;
  if (input >= max) {
    input = min;
  }
  return input;
};

/**
 * Average an array of numbers
 * @param  {Array} data Array of numbers to average
 * @return {number}      Average of the input data
 * @example
 * Nexus.average([0,2,4,6,8,10])   // returns 5
 */
exports.average = function(data) {
  let total = 0;
  for (var i=0;i<data.length;i++) {
    total += data[i];
  }
  return total / data.length;
};

/**
 * Get the distance from one (x,y) point to another (x,y) point
 * @param  {number} x1 x of first point
 * @param  {number} y1 y of first point
 * @param  {number} x2 x of second point
 * @param  {number} y2 y of second poiny
 * @return {number}    Distance
 * @example
 * Nexus.distance(0,0,3,4)   // returns 5
 */
exports.distance = function(x1,y1,x2,y2) {
  let a = x1 - x2;
  let b = y1 - y2;
  return Math.sqrt( a*a + b*b );
};

exports.gainToDB = function(gain) {
  return 20 * Math.log10(gain);
};

/**
 * Flip a coin, returning either 0 or 1 according to a probability
 * @param  {number} [odds=0.5] Likelihood of returning 1
 * @return {number}            1 or 0
 * @example
 * Nexus.coin(0.1)   // returns 1 (10% of the time) or 0 (90% of the time)
 */
exports.coin = function(odds=0.5) {
  if (exports.rf(0,1) < odds) {
    return 1;
  } else {
    return 0;
  }
};

Added public/nexus-js/lib/util/svg.js.

















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
'use strict';

let math = require('../util/math');

export default {

  create: (type) => {
    return document.createElementNS('http://www.w3.org/2000/svg', type);
  },

  arc: (x, y, radius, startAngle, endAngle) => {

    var start = math.toCartesian(radius, endAngle);
    var end = math.toCartesian(radius, startAngle);

    var largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1';

    var d = [
        'M', start.x+x, start.y+y,
        'A', radius, radius, 0, largeArcFlag, 0, end.x+x, end.y+y
    ].join(' ');

    return d;
  },

  radialGradient: (defs,numberOfStops) => {

    let id = 'gradient' + math.ri(100000000000);
    let stops = [];

    let gradient = document.createElementNS('http://www.w3.org/2000/svg', 'radialGradient');
    gradient.setAttribute('id', id);
    gradient.setAttribute('cx', '50%');
    gradient.setAttribute('cy', '50%');
    gradient.setAttribute('r', '50%');

    defs.appendChild(gradient);

    for (let i=0;i<numberOfStops;i++) {
      let stop = document.createElementNS('http://www.w3.org/2000/svg', 'stop');
      stop.setAttribute('id', 'stop'+i);
      //stop.setAttribute('offset', '70%');
      //stop.setAttribute('stop-color', 'White');
      gradient.appendChild(stop);
      stops.push(stop);
    }

    return {
      id: id,
      stops: stops,
      element: gradient
    };

  }

};

Added public/nexus-js/lib/util/touch.js.







>
>
>
1
2
3
'use strict';

exports.exists = ('ontouchstart' in document.documentElement);

Added public/nexus-js/lib/util/transform.js.























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
'use strict';

import dom from '../util/dom';
import Interfaces from '../interfaces/';

let createInterfaceID = (widget,interfaceIDs) => {
  let type = widget.type;
  if (interfaceIDs[type]) {
    interfaceIDs[type]++;
  } else {
    interfaceIDs[type] = 1;
  }
  return ( type + interfaceIDs[type] );
};

let element = (element,type,options) => {
  options = options || {};
  for (let i = 0; i < element.attributes.length; i++){
    let att = element.attributes[i];
  //  try {
  //    options[att.nodeName] = eval(att.nodeValue);
  //  } catch(e) {
      options[att.nodeName] = att.nodeValue;
  //  }
  }
  type = type[0].toUpperCase() + type.slice(1);
  let widget = new Interfaces[type](element,options);
  widget.id = element.id;
  return widget;
};


let section = (parent,keyword) => {

  keyword = keyword || 'nexus-ui';

  let interfaceIDs = {};

  let container = dom.parseElement(parent);

  let ui = {};

  let htmlElements = container.getElementsByTagName('*');
  let elements = [];
  for (let i=0; i<htmlElements.length; i++) {
    elements.push(htmlElements[i]);
  }
  for (let i=0;i<elements.length;i++) {
    let type = elements[i].getAttribute(keyword);
    if (type) {
      let formattedType = false;
      for (let key in Interfaces) {
        if (type.toLowerCase()===key.toLowerCase()) {
          formattedType = key;
        }
      }
      console.log(formattedType);
      let widget = element(elements[i],formattedType);
      if (widget.id) {
        ui[widget.id] = widget;
      } else {
        let id = createInterfaceID(widget,interfaceIDs);
        ui[id] = widget;
      }
    }
  }

  return ui;

};

let add = (type,parent,options) => {
  let target = document.createElement('div');
  options = options || {};
  if (parent) {
    parent = dom.parseElement(parent);
  } else {
    parent = document.body;
  }
  parent.appendChild(target);
  options.target = target;
  if (options.size) {
    target.style.width = options.size[0] + 'px';
    target.style.height = options.size[1] + 'px';
  }
  return element(target,type,options);
};

export { element };
export { section };
export { add };

Added public/nexus-js/lib/util/util.js.



























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
'use strict';

exports.isObject = (obj) => {
  if (typeof obj === 'object' && !Array.isArray(obj) && obj !== null && obj instanceof SVGElement === false && obj instanceof HTMLElement === false ) {
    return true;
  } else {
    return false;
  }
};

// Restricts input for the given textbox to the given inputFilter function
// cf https://stackoverflow.com/a/469362
exports.setInputFilter = (textbox, inputFilter) => {
  ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
    textbox.addEventListener(event, function() {
      if (inputFilter(this.value)) {
        this.oldValue = this.value;
        this.oldSelectionStart = this.selectionStart;
        this.oldSelectionEnd = this.selectionEnd;
      } else if (this.hasOwnProperty("oldValue")) {
        this.value = this.oldValue;
        this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
      } else {
        this.value = "";
      }
    });
  });
};

Added public/nexus-js/package-lock.json.



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
8383
8384
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
8436
8437
8438
8439
8440
8441
8442
8443
8444
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516
8517
8518
8519
8520
8521
8522
8523
8524
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
8778
8779
8780
8781
8782
8783
8784
8785
8786
8787
8788
8789
8790
8791
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805
8806
8807
8808
8809
8810
8811
8812
8813
8814
8815
8816
8817
8818
8819
8820
8821
8822
8823
8824
8825
8826
8827
8828
8829
8830
8831
8832
8833
8834
8835
8836
8837
8838
8839
8840
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
{
  "name": "nexusui",
  "version": "2.1.6",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "@babel/code-frame": {
      "version": "7.10.4",
      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
      "dev": true,
      "requires": {
        "@babel/highlight": "^7.10.4"
      }
    },
    "@babel/helper-validator-identifier": {
      "version": "7.10.4",
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
      "dev": true
    },
    "@babel/highlight": {
      "version": "7.10.4",
      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
      "dev": true,
      "requires": {
        "@babel/helper-validator-identifier": "^7.10.4",
        "chalk": "^2.0.0",
        "js-tokens": "^4.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "3.2.1",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
          "dev": true,
          "requires": {
            "color-convert": "^1.9.0"
          }
        },
        "chalk": {
          "version": "2.4.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
          "dev": true,
          "requires": {
            "ansi-styles": "^3.2.1",
            "escape-string-regexp": "^1.0.5",
            "supports-color": "^5.3.0"
          }
        },
        "has-flag": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
          "dev": true
        },
        "js-tokens": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
          "dev": true
        },
        "supports-color": {
          "version": "5.5.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
          "dev": true,
          "requires": {
            "has-flag": "^3.0.0"
          }
        }
      }
    },
    "@types/color-name": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
      "dev": true
    },
    "@types/minimist": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
      "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
      "dev": true
    },
    "@types/normalize-package-data": {
      "version": "2.4.0",
      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
      "dev": true
    },
    "JSONStream": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz",
      "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=",
      "dev": true,
      "requires": {
        "jsonparse": "^1.2.0",
        "through": ">=2.2.7 <3"
      }
    },
    "acorn": {
      "version": "5.2.1",
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz",
      "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==",
      "dev": true
    },
    "acorn-babel": {
      "version": "0.11.1-38",
      "resolved": "https://registry.npmjs.org/acorn-babel/-/acorn-babel-0.11.1-38.tgz",
      "integrity": "sha1-bPewwHkaEaBe9gIL8G7zSzAIZ2g=",
      "dev": true
    },
    "add-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
      "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=",
      "dev": true
    },
    "align-text": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2",
        "longest": "^1.0.1",
        "repeat-string": "^1.5.2"
      }
    },
    "amdefine": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
      "dev": true
    },
    "ansi-html": {
      "version": "0.0.7",
      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
      "dev": true
    },
    "ansi-regex": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
      "dev": true
    },
    "ansi-styles": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
      "dev": true
    },
    "anymatch": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
      "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
      "dev": true,
      "requires": {
        "micromatch": "^2.1.5",
        "normalize-path": "^2.0.0"
      },
      "dependencies": {
        "micromatch": {
          "version": "2.3.11",
          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
          "dev": true,
          "requires": {
            "arr-diff": "^2.0.0",
            "array-unique": "^0.2.1",
            "braces": "^1.8.2",
            "expand-brackets": "^0.1.4",
            "extglob": "^0.3.1",
            "filename-regex": "^2.0.0",
            "is-extglob": "^1.0.0",
            "is-glob": "^2.0.1",
            "kind-of": "^3.0.2",
            "normalize-path": "^2.0.1",
            "object.omit": "^2.0.0",
            "parse-glob": "^3.0.4",
            "regex-cache": "^0.4.2"
          }
        }
      }
    },
    "append-buffer": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
      "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
      "dev": true,
      "requires": {
        "buffer-equal": "^1.0.0"
      }
    },
    "argparse": {
      "version": "1.0.9",
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
      "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
      "dev": true,
      "requires": {
        "sprintf-js": "~1.0.2"
      }
    },
    "arr-diff": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
      "dev": true,
      "requires": {
        "arr-flatten": "^1.0.1"
      }
    },
    "arr-flatten": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
      "dev": true
    },
    "arr-union": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
      "dev": true
    },
    "array-find-index": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
      "dev": true
    },
    "array-ify": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
      "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
      "dev": true
    },
    "array-iterate": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.1.tgz",
      "integrity": "sha1-hlv3+K851rCYLGCQKRSsdrwBCPY=",
      "dev": true
    },
    "array-unique": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
      "dev": true
    },
    "arrify": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
      "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
      "dev": true
    },
    "assert": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
      "dev": true,
      "requires": {
        "util": "0.10.3"
      }
    },
    "ast-types": {
      "version": "0.7.8",
      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz",
      "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=",
      "dev": true
    },
    "async": {
      "version": "1.5.2",
      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
      "dev": true
    },
    "async-each": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
      "dev": true
    },
    "atob": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
      "dev": true
    },
    "babel-code-frame": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
      "dev": true,
      "requires": {
        "chalk": "^1.1.3",
        "esutils": "^2.0.2",
        "js-tokens": "^3.0.2"
      },
      "dependencies": {
        "esutils": {
          "version": "2.0.2",
          "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
          "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
          "dev": true
        },
        "js-tokens": {
          "version": "3.0.2",
          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
          "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
          "dev": true
        }
      }
    },
    "babel-core": {
      "version": "4.7.16",
      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-4.7.16.tgz",
      "integrity": "sha1-vQBvEBGwdn9N81+Dwo5+p2Hw740=",
      "dev": true,
      "requires": {
        "acorn-babel": "0.11.1-38",
        "ast-types": "~0.7.0",
        "chalk": "^1.0.0",
        "commander": "^2.6.0",
        "convert-source-map": "^0.5.0",
        "core-js": "^0.6.1",
        "debug": "^2.1.1",
        "detect-indent": "^3.0.0",
        "estraverse": "^1.9.1",
        "esutils": "^1.1.6",
        "fs-readdir-recursive": "^0.1.0",
        "globals": "^6.2.0",
        "is-integer": "^1.0.4",
        "js-tokens": "1.0.0",
        "leven": "^1.0.1",
        "line-numbers": "0.2.0",
        "lodash": "^3.2.0",
        "output-file-sync": "^1.1.0",
        "path-is-absolute": "^1.0.0",
        "private": "^0.1.6",
        "regenerator-babel": "0.8.13-2",
        "regexpu": "^1.1.2",
        "repeating": "^1.1.2",
        "shebang-regex": "^1.0.0",
        "slash": "^1.0.0",
        "source-map": "^0.4.0",
        "source-map-support": "^0.2.9",
        "to-fast-properties": "^1.0.0",
        "trim-right": "^1.0.0"
      }
    },
    "babel-generator": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
      "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
      "dev": true,
      "requires": {
        "babel-messages": "^6.23.0",
        "babel-runtime": "^6.26.0",
        "babel-types": "^6.26.0",
        "detect-indent": "^4.0.0",
        "jsesc": "^1.3.0",
        "lodash": "^4.17.4",
        "source-map": "^0.5.6",
        "trim-right": "^1.0.1"
      },
      "dependencies": {
        "detect-indent": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
          "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
          "dev": true,
          "requires": {
            "repeating": "^2.0.0"
          }
        },
        "jsesc": {
          "version": "1.3.0",
          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
          "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
          "dev": true
        },
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        },
        "repeating": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
          "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
          "dev": true,
          "requires": {
            "is-finite": "^1.0.0"
          }
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        }
      }
    },
    "babel-helper-bindify-decorators": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
      "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-builder-binary-assignment-operator-visitor": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
      "dev": true,
      "requires": {
        "babel-helper-explode-assignable-expression": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-builder-react-jsx": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
      "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.26.0",
        "babel-types": "^6.26.0",
        "esutils": "^2.0.2"
      },
      "dependencies": {
        "esutils": {
          "version": "2.0.2",
          "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
          "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
          "dev": true
        }
      }
    },
    "babel-helper-call-delegate": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
      "dev": true,
      "requires": {
        "babel-helper-hoist-variables": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-define-map": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
      "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
      "dev": true,
      "requires": {
        "babel-helper-function-name": "^6.24.1",
        "babel-runtime": "^6.26.0",
        "babel-types": "^6.26.0",
        "lodash": "^4.17.4"
      },
      "dependencies": {
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        }
      }
    },
    "babel-helper-explode-assignable-expression": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-explode-class": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
      "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
      "dev": true,
      "requires": {
        "babel-helper-bindify-decorators": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-function-name": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
      "dev": true,
      "requires": {
        "babel-helper-get-function-arity": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-get-function-arity": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-hoist-variables": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-optimise-call-expression": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-regex": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
      "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.26.0",
        "babel-types": "^6.26.0",
        "lodash": "^4.17.4"
      },
      "dependencies": {
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        }
      }
    },
    "babel-helper-remap-async-to-generator": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
      "dev": true,
      "requires": {
        "babel-helper-function-name": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helper-replace-supers": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
      "dev": true,
      "requires": {
        "babel-helper-optimise-call-expression": "^6.24.1",
        "babel-messages": "^6.23.0",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-helpers": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1"
      }
    },
    "babel-jest": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-4.0.0.tgz",
      "integrity": "sha1-0ERtuFNdDzOFNaGKL0I4TedFoQ0=",
      "dev": true,
      "requires": {
        "babel-core": "^4.0.0"
      }
    },
    "babel-loader": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-4.3.0.tgz",
      "integrity": "sha1-44orp+iyZgmQ6/C883vC+hfXhl8=",
      "dev": true,
      "requires": {
        "babel-core": "^4.7.16",
        "loader-utils": "^0.2.5"
      }
    },
    "babel-messages": {
      "version": "6.23.0",
      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-check-es2015-constants": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-syntax-async-functions": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
      "dev": true
    },
    "babel-plugin-syntax-async-generators": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
      "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
      "dev": true
    },
    "babel-plugin-syntax-class-constructor-call": {
      "version": "6.18.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
      "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=",
      "dev": true
    },
    "babel-plugin-syntax-class-properties": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
      "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
      "dev": true
    },
    "babel-plugin-syntax-decorators": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
      "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
      "dev": true
    },
    "babel-plugin-syntax-do-expressions": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz",
      "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=",
      "dev": true
    },
    "babel-plugin-syntax-dynamic-import": {
      "version": "6.18.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
      "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
      "dev": true
    },
    "babel-plugin-syntax-exponentiation-operator": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
      "dev": true
    },
    "babel-plugin-syntax-export-extensions": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
      "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
      "dev": true
    },
    "babel-plugin-syntax-flow": {
      "version": "6.18.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
      "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=",
      "dev": true
    },
    "babel-plugin-syntax-function-bind": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz",
      "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=",
      "dev": true
    },
    "babel-plugin-syntax-jsx": {
      "version": "6.18.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
      "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=",
      "dev": true
    },
    "babel-plugin-syntax-object-rest-spread": {
      "version": "6.13.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
      "dev": true
    },
    "babel-plugin-syntax-trailing-function-commas": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
      "dev": true
    },
    "babel-plugin-system-import-transformer": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-system-import-transformer/-/babel-plugin-system-import-transformer-3.1.0.tgz",
      "integrity": "sha1-038Mro5h7zkGAggzHZMbXmMNfF8=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-dynamic-import": "^6.18.0"
      }
    },
    "babel-plugin-transform-async-generator-functions": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
      "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
      "dev": true,
      "requires": {
        "babel-helper-remap-async-to-generator": "^6.24.1",
        "babel-plugin-syntax-async-generators": "^6.5.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-async-to-generator": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
      "dev": true,
      "requires": {
        "babel-helper-remap-async-to-generator": "^6.24.1",
        "babel-plugin-syntax-async-functions": "^6.8.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-class-constructor-call": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
      "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-class-constructor-call": "^6.18.0",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1"
      }
    },
    "babel-plugin-transform-class-properties": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
      "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
      "dev": true,
      "requires": {
        "babel-helper-function-name": "^6.24.1",
        "babel-plugin-syntax-class-properties": "^6.8.0",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1"
      }
    },
    "babel-plugin-transform-decorators": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
      "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
      "dev": true,
      "requires": {
        "babel-helper-explode-class": "^6.24.1",
        "babel-plugin-syntax-decorators": "^6.13.0",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-plugin-transform-decorators-legacy": {
      "version": "1.3.4",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz",
      "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-decorators": "^6.1.18",
        "babel-runtime": "^6.2.0",
        "babel-template": "^6.3.0"
      }
    },
    "babel-plugin-transform-do-expressions": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz",
      "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-do-expressions": "^6.8.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-arrow-functions": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-block-scoped-functions": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-block-scoping": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
      "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.26.0",
        "babel-template": "^6.26.0",
        "babel-traverse": "^6.26.0",
        "babel-types": "^6.26.0",
        "lodash": "^4.17.4"
      },
      "dependencies": {
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        }
      }
    },
    "babel-plugin-transform-es2015-classes": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
      "dev": true,
      "requires": {
        "babel-helper-define-map": "^6.24.1",
        "babel-helper-function-name": "^6.24.1",
        "babel-helper-optimise-call-expression": "^6.24.1",
        "babel-helper-replace-supers": "^6.24.1",
        "babel-messages": "^6.23.0",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-computed-properties": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-destructuring": {
      "version": "6.23.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-duplicate-keys": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-for-of": {
      "version": "6.23.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-function-name": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
      "dev": true,
      "requires": {
        "babel-helper-function-name": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-literals": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-modules-amd": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
      "dev": true,
      "requires": {
        "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-modules-commonjs": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
      "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
      "dev": true,
      "requires": {
        "babel-plugin-transform-strict-mode": "^6.24.1",
        "babel-runtime": "^6.26.0",
        "babel-template": "^6.26.0",
        "babel-types": "^6.26.0"
      }
    },
    "babel-plugin-transform-es2015-modules-systemjs": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
      "dev": true,
      "requires": {
        "babel-helper-hoist-variables": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-modules-umd": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
      "dev": true,
      "requires": {
        "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-object-super": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
      "dev": true,
      "requires": {
        "babel-helper-replace-supers": "^6.24.1",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-parameters": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
      "dev": true,
      "requires": {
        "babel-helper-call-delegate": "^6.24.1",
        "babel-helper-get-function-arity": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-template": "^6.24.1",
        "babel-traverse": "^6.24.1",
        "babel-types": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-shorthand-properties": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-spread": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-sticky-regex": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
      "dev": true,
      "requires": {
        "babel-helper-regex": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-plugin-transform-es2015-template-literals": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-typeof-symbol": {
      "version": "6.23.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-es2015-unicode-regex": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
      "dev": true,
      "requires": {
        "babel-helper-regex": "^6.24.1",
        "babel-runtime": "^6.22.0",
        "regexpu-core": "^2.0.0"
      }
    },
    "babel-plugin-transform-exponentiation-operator": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
      "dev": true,
      "requires": {
        "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
        "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-export-extensions": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz",
      "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-export-extensions": "^6.8.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-flow-strip-types": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
      "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-flow": "^6.18.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-function-bind": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz",
      "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-function-bind": "^6.8.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-object-rest-spread": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
      "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-object-rest-spread": "^6.8.0",
        "babel-runtime": "^6.26.0"
      }
    },
    "babel-plugin-transform-react-display-name": {
      "version": "6.25.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz",
      "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-react-jsx": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
      "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
      "dev": true,
      "requires": {
        "babel-helper-builder-react-jsx": "^6.24.1",
        "babel-plugin-syntax-jsx": "^6.8.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-react-jsx-self": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz",
      "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-jsx": "^6.8.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-react-jsx-source": {
      "version": "6.22.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz",
      "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-jsx": "^6.8.0",
        "babel-runtime": "^6.22.0"
      }
    },
    "babel-plugin-transform-regenerator": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
      "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
      "dev": true,
      "requires": {
        "regenerator-transform": "^0.10.0"
      }
    },
    "babel-plugin-transform-strict-mode": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.22.0",
        "babel-types": "^6.24.1"
      }
    },
    "babel-preset-env": {
      "version": "1.6.1",
      "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz",
      "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==",
      "dev": true,
      "requires": {
        "babel-plugin-check-es2015-constants": "^6.22.0",
        "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
        "babel-plugin-transform-async-to-generator": "^6.22.0",
        "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
        "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
        "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
        "babel-plugin-transform-es2015-classes": "^6.23.0",
        "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
        "babel-plugin-transform-es2015-destructuring": "^6.23.0",
        "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
        "babel-plugin-transform-es2015-for-of": "^6.23.0",
        "babel-plugin-transform-es2015-function-name": "^6.22.0",
        "babel-plugin-transform-es2015-literals": "^6.22.0",
        "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
        "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
        "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
        "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
        "babel-plugin-transform-es2015-object-super": "^6.22.0",
        "babel-plugin-transform-es2015-parameters": "^6.23.0",
        "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
        "babel-plugin-transform-es2015-spread": "^6.22.0",
        "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
        "babel-plugin-transform-es2015-template-literals": "^6.22.0",
        "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
        "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
        "babel-plugin-transform-exponentiation-operator": "^6.22.0",
        "babel-plugin-transform-regenerator": "^6.22.0",
        "browserslist": "^2.1.2",
        "invariant": "^2.2.2",
        "semver": "^5.3.0"
      }
    },
    "babel-preset-flow": {
      "version": "6.23.0",
      "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
      "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
      "dev": true,
      "requires": {
        "babel-plugin-transform-flow-strip-types": "^6.22.0"
      }
    },
    "babel-preset-react": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
      "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-jsx": "^6.3.13",
        "babel-plugin-transform-react-display-name": "^6.23.0",
        "babel-plugin-transform-react-jsx": "^6.24.1",
        "babel-plugin-transform-react-jsx-self": "^6.22.0",
        "babel-plugin-transform-react-jsx-source": "^6.22.0",
        "babel-preset-flow": "^6.23.0"
      }
    },
    "babel-preset-stage-0": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz",
      "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=",
      "dev": true,
      "requires": {
        "babel-plugin-transform-do-expressions": "^6.22.0",
        "babel-plugin-transform-function-bind": "^6.22.0",
        "babel-preset-stage-1": "^6.24.1"
      }
    },
    "babel-preset-stage-1": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz",
      "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=",
      "dev": true,
      "requires": {
        "babel-plugin-transform-class-constructor-call": "^6.24.1",
        "babel-plugin-transform-export-extensions": "^6.22.0",
        "babel-preset-stage-2": "^6.24.1"
      }
    },
    "babel-preset-stage-2": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
      "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-dynamic-import": "^6.18.0",
        "babel-plugin-transform-class-properties": "^6.24.1",
        "babel-plugin-transform-decorators": "^6.24.1",
        "babel-preset-stage-3": "^6.24.1"
      }
    },
    "babel-preset-stage-3": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
      "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
      "dev": true,
      "requires": {
        "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
        "babel-plugin-transform-async-generator-functions": "^6.24.1",
        "babel-plugin-transform-async-to-generator": "^6.24.1",
        "babel-plugin-transform-exponentiation-operator": "^6.24.1",
        "babel-plugin-transform-object-rest-spread": "^6.22.0"
      }
    },
    "babel-register": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
      "dev": true,
      "requires": {
        "babel-core": "^6.26.0",
        "babel-runtime": "^6.26.0",
        "core-js": "^2.5.0",
        "home-or-tmp": "^2.0.0",
        "lodash": "^4.17.4",
        "mkdirp": "^0.5.1",
        "source-map-support": "^0.4.15"
      },
      "dependencies": {
        "babel-core": {
          "version": "6.26.0",
          "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
          "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
          "dev": true,
          "requires": {
            "babel-code-frame": "^6.26.0",
            "babel-generator": "^6.26.0",
            "babel-helpers": "^6.24.1",
            "babel-messages": "^6.23.0",
            "babel-register": "^6.26.0",
            "babel-runtime": "^6.26.0",
            "babel-template": "^6.26.0",
            "babel-traverse": "^6.26.0",
            "babel-types": "^6.26.0",
            "babylon": "^6.18.0",
            "convert-source-map": "^1.5.0",
            "debug": "^2.6.8",
            "json5": "^0.5.1",
            "lodash": "^4.17.4",
            "minimatch": "^3.0.4",
            "path-is-absolute": "^1.0.1",
            "private": "^0.1.7",
            "slash": "^1.0.0",
            "source-map": "^0.5.6"
          }
        },
        "convert-source-map": {
          "version": "1.5.1",
          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
          "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
          "dev": true
        },
        "core-js": {
          "version": "2.5.3",
          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
          "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
          "dev": true
        },
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        },
        "source-map-support": {
          "version": "0.4.18",
          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
          "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
          "dev": true,
          "requires": {
            "source-map": "^0.5.6"
          }
        }
      }
    },
    "babel-runtime": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
      "dev": true,
      "requires": {
        "core-js": "^2.4.0",
        "regenerator-runtime": "^0.11.0"
      },
      "dependencies": {
        "core-js": {
          "version": "2.5.3",
          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
          "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
          "dev": true
        }
      }
    },
    "babel-template": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.26.0",
        "babel-traverse": "^6.26.0",
        "babel-types": "^6.26.0",
        "babylon": "^6.18.0",
        "lodash": "^4.17.4"
      },
      "dependencies": {
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        }
      }
    },
    "babel-traverse": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
      "dev": true,
      "requires": {
        "babel-code-frame": "^6.26.0",
        "babel-messages": "^6.23.0",
        "babel-runtime": "^6.26.0",
        "babel-types": "^6.26.0",
        "babylon": "^6.18.0",
        "debug": "^2.6.8",
        "globals": "^9.18.0",
        "invariant": "^2.2.2",
        "lodash": "^4.17.4"
      },
      "dependencies": {
        "globals": {
          "version": "9.18.0",
          "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
          "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
          "dev": true
        },
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        }
      }
    },
    "babel-types": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.26.0",
        "esutils": "^2.0.2",
        "lodash": "^4.17.4",
        "to-fast-properties": "^1.0.3"
      },
      "dependencies": {
        "esutils": {
          "version": "2.0.2",
          "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
          "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
          "dev": true
        },
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        }
      }
    },
    "babelify": {
      "version": "5.0.5",
      "resolved": "https://registry.npmjs.org/babelify/-/babelify-5.0.5.tgz",
      "integrity": "sha1-MyLk4NVTVm/ac3gZVU/VIbXw6Yg=",
      "dev": true,
      "requires": {
        "babel-core": "^4.0.0",
        "lodash": "^3.0.0",
        "through": "2.3.4"
      },
      "dependencies": {
        "through": {
          "version": "2.3.4",
          "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz",
          "integrity": "sha1-SV5A6Nio6uvHwnXqiMK4/BTFZFU=",
          "dev": true
        }
      }
    },
    "babylon": {
      "version": "6.18.0",
      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
      "dev": true
    },
    "bail": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.2.tgz",
      "integrity": "sha1-99bBcxYwqfnw1NNe0fli4gdKF2Q=",
      "dev": true
    },
    "balanced-match": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
      "dev": true
    },
    "base": {
      "version": "0.11.2",
      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
      "dev": true,
      "requires": {
        "cache-base": "^1.0.1",
        "class-utils": "^0.3.5",
        "component-emitter": "^1.2.1",
        "define-property": "^1.0.0",
        "isobject": "^3.0.1",
        "mixin-deep": "^1.2.0",
        "pascalcase": "^0.1.1"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "base64-js": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
      "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==",
      "dev": true
    },
    "big.js": {
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
      "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
      "dev": true
    },
    "binary-extensions": {
      "version": "1.11.0",
      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
      "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
      "dev": true
    },
    "body": {
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
      "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
      "dev": true,
      "requires": {
        "continuable-cache": "^0.3.1",
        "error": "^7.0.0",
        "raw-body": "~1.1.0",
        "safe-json-parse": "~1.0.1"
      }
    },
    "brace-expansion": {
      "version": "1.1.8",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
      "dev": true,
      "requires": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
      }
    },
    "braces": {
      "version": "1.8.5",
      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
      "dev": true,
      "requires": {
        "expand-range": "^1.8.1",
        "preserve": "^0.2.0",
        "repeat-element": "^1.1.2"
      }
    },
    "browser-resolve": {
      "version": "1.11.2",
      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
      "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
      "dev": true,
      "requires": {
        "resolve": "1.1.7"
      },
      "dependencies": {
        "resolve": {
          "version": "1.1.7",
          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
          "dev": true
        }
      }
    },
    "browserify-aes": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz",
      "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=",
      "dev": true,
      "requires": {
        "inherits": "^2.0.1"
      }
    },
    "browserify-zlib": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
      "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
      "dev": true,
      "requires": {
        "pako": "~0.2.0"
      }
    },
    "browserslist": {
      "version": "2.10.0",
      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.10.0.tgz",
      "integrity": "sha512-WyvzSLsuAVPOjbljXnyeWl14Ae+ukAT8MUuagKVzIDvwBxl4UAwD1xqtyQs2eWYPGUKMeC3Ol62goqYuKqTTcw==",
      "dev": true,
      "requires": {
        "caniuse-lite": "^1.0.30000780",
        "electron-to-chromium": "^1.3.28"
      }
    },
    "buffer": {
      "version": "4.9.1",
      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
      "dev": true,
      "requires": {
        "base64-js": "^1.0.2",
        "ieee754": "^1.1.4",
        "isarray": "^1.0.0"
      }
    },
    "buffer-equal": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
      "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
      "dev": true
    },
    "buffer-from": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
      "dev": true
    },
    "buffer-shims": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
      "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
      "dev": true
    },
    "builtin-modules": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
      "dev": true
    },
    "builtin-status-codes": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
      "dev": true
    },
    "bytes": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
      "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
      "dev": true
    },
    "cache-base": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
      "dev": true,
      "requires": {
        "collection-visit": "^1.0.0",
        "component-emitter": "^1.2.1",
        "get-value": "^2.0.6",
        "has-value": "^1.0.0",
        "isobject": "^3.0.1",
        "set-value": "^2.0.0",
        "to-object-path": "^0.3.0",
        "union-value": "^1.0.0",
        "unset-value": "^1.0.0"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "camelcase": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
      "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
      "dev": true
    },
    "camelcase-keys": {
      "version": "6.2.2",
      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
      "dev": true,
      "requires": {
        "camelcase": "^5.3.1",
        "map-obj": "^4.0.0",
        "quick-lru": "^4.0.1"
      },
      "dependencies": {
        "camelcase": {
          "version": "5.3.1",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
          "dev": true
        }
      }
    },
    "caniuse-lite": {
      "version": "1.0.30000783",
      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000783.tgz",
      "integrity": "sha1-m1SZ+xtQPSNF0SqmuGEoUvQnb/0=",
      "dev": true
    },
    "ccount": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.2.tgz",
      "integrity": "sha1-U7ai+BW7d7nChx97mnLDol8djok=",
      "dev": true
    },
    "center-align": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
      "dev": true,
      "requires": {
        "align-text": "^0.1.3",
        "lazy-cache": "^1.0.3"
      },
      "dependencies": {
        "lazy-cache": {
          "version": "1.0.4",
          "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
          "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
          "dev": true
        }
      }
    },
    "chalk": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
      "dev": true,
      "requires": {
        "ansi-styles": "^2.2.1",
        "escape-string-regexp": "^1.0.2",
        "has-ansi": "^2.0.0",
        "strip-ansi": "^3.0.0",
        "supports-color": "^2.0.0"
      }
    },
    "character-entities": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.1.tgz",
      "integrity": "sha1-92hxvl72bdt/j440eOzDdMJ9bco=",
      "dev": true
    },
    "character-entities-html4": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.1.tgz",
      "integrity": "sha1-NZoqSg9+KdPcKsmb2+Ie45Q46lA=",
      "dev": true
    },
    "character-entities-legacy": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz",
      "integrity": "sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8=",
      "dev": true
    },
    "character-reference-invalid": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz",
      "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=",
      "dev": true
    },
    "chokidar": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
      "dev": true,
      "requires": {
        "anymatch": "^1.3.0",
        "async-each": "^1.0.0",
        "fsevents": "^1.0.0",
        "glob-parent": "^2.0.0",
        "inherits": "^2.0.1",
        "is-binary-path": "^1.0.0",
        "is-glob": "^2.0.0",
        "path-is-absolute": "^1.0.0",
        "readdirp": "^2.0.0"
      }
    },
    "class-utils": {
      "version": "0.3.5",
      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.5.tgz",
      "integrity": "sha1-F+eTEDdQ+WJ7IXbqNM/RtWWQPIA=",
      "dev": true,
      "requires": {
        "arr-union": "^3.1.0",
        "define-property": "^0.2.5",
        "isobject": "^3.0.0",
        "lazy-cache": "^2.0.2",
        "static-extend": "^0.1.1"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        },
        "is-descriptor": {
          "version": "0.1.6",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^0.1.6",
            "is-data-descriptor": "^0.1.4",
            "kind-of": "^5.0.0"
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
          "dev": true
        }
      }
    },
    "cli": {
      "version": "0.4.3",
      "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.3.tgz",
      "integrity": "sha1-5oGcjV+qlX9k+Y9mqFBiaMHR8X0=",
      "dev": true,
      "requires": {
        "glob": ">= 3.1.4"
      }
    },
    "cliui": {
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
      "dev": true,
      "requires": {
        "string-width": "^1.0.1",
        "strip-ansi": "^3.0.1",
        "wrap-ansi": "^2.0.0"
      }
    },
    "clone": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
      "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
      "dev": true
    },
    "clone-buffer": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
      "dev": true
    },
    "clone-stats": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
      "dev": true
    },
    "cloneable-readable": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
      "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
      "dev": true,
      "requires": {
        "inherits": "^2.0.1",
        "process-nextick-args": "^1.0.6",
        "through2": "^2.0.1"
      }
    },
    "code-point-at": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
      "dev": true
    },
    "collapse-white-space": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.3.tgz",
      "integrity": "sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw=",
      "dev": true
    },
    "collection-visit": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
      "dev": true,
      "requires": {
        "map-visit": "^1.0.0",
        "object-visit": "^1.0.0"
      }
    },
    "color-convert": {
      "version": "1.9.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
      "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
      "dev": true,
      "requires": {
        "color-name": "^1.1.1"
      }
    },
    "color-name": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
      "dev": true
    },
    "color-ops": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/color-ops/-/color-ops-2.0.0.tgz",
      "integrity": "sha1-OkiiMjTpq1l9OqxK+j/3xTpW3cQ=",
      "dev": true
    },
    "colors": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
      "dev": true
    },
    "comma-separated-tokens": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.4.tgz",
      "integrity": "sha1-cgg+WNSkYvAYZvZhf02Yo807ikY=",
      "dev": true,
      "requires": {
        "trim": "0.0.1"
      }
    },
    "commander": {
      "version": "2.12.2",
      "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
      "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
      "dev": true
    },
    "commoner": {
      "version": "0.10.8",
      "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz",
      "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=",
      "dev": true,
      "requires": {
        "commander": "^2.5.0",
        "detective": "^4.3.1",
        "glob": "^5.0.15",
        "graceful-fs": "^4.1.2",
        "iconv-lite": "^0.4.5",
        "mkdirp": "^0.5.0",
        "private": "^0.1.6",
        "q": "^1.1.2",
        "recast": "^0.11.17"
      }
    },
    "compare-func": {
      "version": "1.3.4",
      "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz",
      "integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==",
      "dev": true,
      "requires": {
        "array-ify": "^1.0.0",
        "dot-prop": "^3.0.0"
      }
    },
    "component-emitter": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
      "dev": true
    },
    "concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
      "dev": true
    },
    "concat-stream": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
      "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
      "dev": true,
      "requires": {
        "inherits": "^2.0.3",
        "readable-stream": "^2.2.2",
        "typedarray": "^0.0.6"
      }
    },
    "console-browserify": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
      "dev": true,
      "requires": {
        "date-now": "^0.1.4"
      }
    },
    "constants-browserify": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
      "dev": true
    },
    "continuable-cache": {
      "version": "0.3.1",
      "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
      "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
      "dev": true
    },
    "conventional-changelog": {
      "version": "3.1.21",
      "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.21.tgz",
      "integrity": "sha512-ZGecVZPEo3aC75VVE4nu85589dDhpMyqfqgUM5Myq6wfKWiNqhDJLSDMsc8qKXshZoY7dqs1hR0H/15kI/G2jQ==",
      "dev": true,
      "requires": {
        "conventional-changelog-angular": "^5.0.10",
        "conventional-changelog-atom": "^2.0.7",
        "conventional-changelog-codemirror": "^2.0.7",
        "conventional-changelog-conventionalcommits": "^4.3.0",
        "conventional-changelog-core": "^4.1.7",
        "conventional-changelog-ember": "^2.0.8",
        "conventional-changelog-eslint": "^3.0.8",
        "conventional-changelog-express": "^2.0.5",
        "conventional-changelog-jquery": "^3.0.10",
        "conventional-changelog-jshint": "^2.0.7",
        "conventional-changelog-preset-loader": "^2.3.4"
      }
    },
    "conventional-changelog-angular": {
      "version": "5.0.10",
      "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz",
      "integrity": "sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA==",
      "dev": true,
      "requires": {
        "compare-func": "^1.3.1",
        "q": "^1.5.1"
      }
    },
    "conventional-changelog-atom": {
      "version": "2.0.7",
      "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.7.tgz",
      "integrity": "sha512-7dOREZwzB+tCEMjRTDfen0OHwd7vPUdmU0llTy1eloZgtOP4iSLVzYIQqfmdRZEty+3w5Jz+AbhfTJKoKw1JeQ==",
      "dev": true,
      "requires": {
        "q": "^1.5.1"
      }
    },
    "conventional-changelog-codemirror": {
      "version": "2.0.7",
      "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.7.tgz",
      "integrity": "sha512-Oralk1kiagn3Gb5cR5BffenWjVu59t/viE6UMD/mQa1hISMPkMYhJIqX+CMeA1zXgVBO+YHQhhokEj99GP5xcg==",
      "dev": true,
      "requires": {
        "q": "^1.5.1"
      }
    },
    "conventional-changelog-config-spec": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz",
      "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==",
      "dev": true
    },
    "conventional-changelog-conventionalcommits": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.3.0.tgz",
      "integrity": "sha512-oYHydvZKU+bS8LnGqTMlNrrd7769EsuEHKy4fh1oMdvvDi7fem8U+nvfresJ1IDB8K00Mn4LpiA/lR+7Gs6rgg==",
      "dev": true,
      "requires": {
        "compare-func": "^1.3.1",
        "lodash": "^4.17.15",
        "q": "^1.5.1"
      },
      "dependencies": {
        "lodash": {
          "version": "4.17.19",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
          "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
          "dev": true
        }
      }
    },
    "conventional-changelog-core": {
      "version": "4.1.7",
      "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.7.tgz",
      "integrity": "sha512-UBvSrQR2RdKbSQKh7RhueiiY4ZAIOW3+CSWdtKOwRv+KxIMNFKm1rOcGBFx0eA8AKhGkkmmacoTWJTqyz7Q0VA==",
      "dev": true,
      "requires": {
        "add-stream": "^1.0.0",
        "conventional-changelog-writer": "^4.0.16",
        "conventional-commits-parser": "^3.1.0",
        "dateformat": "^3.0.0",
        "get-pkg-repo": "^1.0.0",
        "git-raw-commits": "2.0.0",
        "git-remote-origin-url": "^2.0.0",
        "git-semver-tags": "^4.0.0",
        "lodash": "^4.17.15",
        "normalize-package-data": "^2.3.5",
        "q": "^1.5.1",
        "read-pkg": "^3.0.0",
        "read-pkg-up": "^3.0.0",
        "shelljs": "^0.8.3",
        "through2": "^3.0.0"
      },
      "dependencies": {
        "glob": {
          "version": "7.1.6",
          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
          "dev": true,
          "requires": {
            "fs.realpath": "^1.0.0",
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "^3.0.4",
            "once": "^1.3.0",
            "path-is-absolute": "^1.0.0"
          }
        },
        "lodash": {
          "version": "4.17.19",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
          "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
          "dev": true
        },
        "shelljs": {
          "version": "0.8.4",
          "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
          "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
          "dev": true,
          "requires": {
            "glob": "^7.0.0",
            "interpret": "^1.0.0",
            "rechoir": "^0.6.2"
          }
        },
        "through2": {
          "version": "3.0.2",
          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
          "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
          "dev": true,
          "requires": {
            "inherits": "^2.0.4",
            "readable-stream": "2 || 3"
          },
          "dependencies": {
            "inherits": {
              "version": "2.0.4",
              "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
              "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
              "dev": true
            }
          }
        }
      }
    },
    "conventional-changelog-ember": {
      "version": "2.0.8",
      "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.8.tgz",
      "integrity": "sha512-JEMEcUAMg4Q9yxD341OgWlESQ4gLqMWMXIWWUqoQU8yvTJlKnrvcui3wk9JvnZQyONwM2g1MKRZuAjKxr8hAXA==",
      "dev": true,
      "requires": {
        "q": "^1.5.1"
      }
    },
    "conventional-changelog-eslint": {
      "version": "3.0.8",
      "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.8.tgz",
      "integrity": "sha512-5rTRltgWG7TpU1PqgKHMA/2ivjhrB+E+S7OCTvj0zM/QGg4vmnVH67Vq/EzvSNYtejhWC+OwzvDrLk3tqPry8A==",
      "dev": true,
      "requires": {
        "q": "^1.5.1"
      }
    },
    "conventional-changelog-express": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.5.tgz",
      "integrity": "sha512-pW2hsjKG+xNx/Qjof8wYlAX/P61hT5gQ/2rZ2NsTpG+PgV7Rc8RCfITvC/zN9K8fj0QmV6dWmUefCteD9baEAw==",
      "dev": true,
      "requires": {
        "q": "^1.5.1"
      }
    },
    "conventional-changelog-jquery": {
      "version": "3.0.10",
      "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.10.tgz",
      "integrity": "sha512-QCW6wF8QgPkq2ruPaxc83jZxoWQxLkt/pNxIDn/oYjMiVgrtqNdd7lWe3vsl0hw5ENHNf/ejXuzDHk6suKsRpg==",
      "dev": true,
      "requires": {
        "q": "^1.5.1"
      }
    },
    "conventional-changelog-jshint": {
      "version": "2.0.7",
      "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.7.tgz",
      "integrity": "sha512-qHA8rmwUnLiIxANJbz650+NVzqDIwNtc0TcpIa0+uekbmKHttidvQ1dGximU3vEDdoJVKFgR3TXFqYuZmYy9ZQ==",
      "dev": true,
      "requires": {
        "compare-func": "^1.3.1",
        "q": "^1.5.1"
      }
    },
    "conventional-changelog-preset-loader": {
      "version": "2.3.4",
      "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz",
      "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==",
      "dev": true
    },
    "conventional-changelog-writer": {
      "version": "4.0.16",
      "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz",
      "integrity": "sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ==",
      "dev": true,
      "requires": {
        "compare-func": "^1.3.1",
        "conventional-commits-filter": "^2.0.6",
        "dateformat": "^3.0.0",
        "handlebars": "^4.7.6",
        "json-stringify-safe": "^5.0.1",
        "lodash": "^4.17.15",
        "meow": "^7.0.0",
        "semver": "^6.0.0",
        "split": "^1.0.0",
        "through2": "^3.0.0"
      },
      "dependencies": {
        "inherits": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
          "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
          "dev": true
        },
        "lodash": {
          "version": "4.17.19",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
          "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
          "dev": true
        },
        "semver": {
          "version": "6.3.0",
          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
          "dev": true
        },
        "through2": {
          "version": "3.0.2",
          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
          "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
          "dev": true,
          "requires": {
            "inherits": "^2.0.4",
            "readable-stream": "2 || 3"
          }
        }
      }
    },
    "conventional-commits-filter": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz",
      "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==",
      "dev": true,
      "requires": {
        "lodash.ismatch": "^4.4.0",
        "modify-values": "^1.0.0"
      }
    },
    "conventional-commits-parser": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz",
      "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==",
      "dev": true,
      "requires": {
        "JSONStream": "^1.0.4",
        "is-text-path": "^1.0.1",
        "lodash": "^4.17.15",
        "meow": "^7.0.0",
        "split2": "^2.0.0",
        "through2": "^3.0.0",
        "trim-off-newlines": "^1.0.0"
      },
      "dependencies": {
        "inherits": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
          "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
          "dev": true
        },
        "lodash": {
          "version": "4.17.19",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
          "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
          "dev": true
        },
        "through2": {
          "version": "3.0.2",
          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
          "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
          "dev": true,
          "requires": {
            "inherits": "^2.0.4",
            "readable-stream": "2 || 3"
          }
        }
      }
    },
    "conventional-recommended-bump": {
      "version": "6.0.9",
      "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.9.tgz",
      "integrity": "sha512-DpRmW1k8CpRrcsXHOPGgHgOd4BMGiq2gtXAveGM8B9pSd9b4r4WKnqp1Fd0vkDtk8l973mIk8KKKUYnKRr9SFw==",
      "dev": true,
      "requires": {
        "concat-stream": "^2.0.0",
        "conventional-changelog-preset-loader": "^2.3.4",
        "conventional-commits-filter": "^2.0.6",
        "conventional-commits-parser": "^3.1.0",
        "git-raw-commits": "2.0.0",
        "git-semver-tags": "^4.0.0",
        "meow": "^7.0.0",
        "q": "^1.5.1"
      },
      "dependencies": {
        "concat-stream": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
          "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
          "dev": true,
          "requires": {
            "buffer-from": "^1.0.0",
            "inherits": "^2.0.3",
            "readable-stream": "^3.0.2",
            "typedarray": "^0.0.6"
          }
        },
        "readable-stream": {
          "version": "3.6.0",
          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
          "dev": true,
          "requires": {
            "inherits": "^2.0.3",
            "string_decoder": "^1.1.1",
            "util-deprecate": "^1.0.1"
          }
        },
        "safe-buffer": {
          "version": "5.2.1",
          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
          "dev": true
        },
        "string_decoder": {
          "version": "1.3.0",
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
          "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
          "dev": true,
          "requires": {
            "safe-buffer": "~5.2.0"
          }
        }
      }
    },
    "convert-source-map": {
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.5.1.tgz",
      "integrity": "sha1-vrgPOyLeBf1FkUEPSUvOvmNKBX4=",
      "dev": true
    },
    "copy-descriptor": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
      "dev": true
    },
    "core-js": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/core-js/-/core-js-0.6.1.tgz",
      "integrity": "sha1-G0lwhz6BAb+MQ1rwlfqpAk9Lm1g=",
      "dev": true
    },
    "core-util-is": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
      "dev": true
    },
    "cross-spawn": {
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
      "dev": true,
      "requires": {
        "lru-cache": "^4.0.1",
        "shebang-command": "^1.2.0",
        "which": "^1.2.9"
      }
    },
    "crypto-browserify": {
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz",
      "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=",
      "dev": true,
      "requires": {
        "browserify-aes": "0.4.0",
        "pbkdf2-compat": "2.0.1",
        "ripemd160": "0.2.0",
        "sha.js": "2.2.6"
      }
    },
    "currently-unhandled": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
      "dev": true,
      "requires": {
        "array-find-index": "^1.0.1"
      }
    },
    "dargs": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz",
      "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=",
      "dev": true,
      "requires": {
        "number-is-nan": "^1.0.0"
      }
    },
    "date-now": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
      "dev": true
    },
    "dateformat": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
      "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
      "dev": true
    },
    "debug": {
      "version": "2.6.9",
      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
      "dev": true,
      "requires": {
        "ms": "2.0.0"
      }
    },
    "decamelize": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
      "dev": true
    },
    "decamelize-keys": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
      "dev": true,
      "requires": {
        "decamelize": "^1.1.0",
        "map-obj": "^1.0.0"
      },
      "dependencies": {
        "map-obj": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
          "dev": true
        }
      }
    },
    "decode-uri-component": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
      "dev": true
    },
    "define-properties": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
      "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
      "dev": true,
      "requires": {
        "foreach": "^2.0.5",
        "object-keys": "^1.0.8"
      }
    },
    "define-property": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
      "dev": true,
      "requires": {
        "is-descriptor": "^1.0.0"
      }
    },
    "defined": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
      "dev": true
    },
    "detab": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.1.tgz",
      "integrity": "sha512-/hhdqdQc5thGrqzjyO/pz76lDZ5GSuAs6goxOaKTsvPk7HNnzAyFN5lyHgqpX4/s1i66K8qMGj+VhA9504x7DQ==",
      "dev": true,
      "requires": {
        "repeat-string": "^1.5.4"
      }
    },
    "detect-indent": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz",
      "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=",
      "dev": true,
      "requires": {
        "get-stdin": "^4.0.1",
        "minimist": "^1.1.0",
        "repeating": "^1.1.0"
      }
    },
    "detect-newline": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
      "dev": true
    },
    "detective": {
      "version": "4.7.0",
      "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.0.tgz",
      "integrity": "sha512-4mBqSEdMfBpRAo/DQZnTcAXenpiSIJmVKbCMSotS+SFWWcrP/CKM6iBRPdTiEO+wZhlfEsoZlGqpG6ycl5vTqw==",
      "dev": true,
      "requires": {
        "acorn": "^5.2.1",
        "defined": "^1.0.0"
      }
    },
    "diff": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
      "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=",
      "dev": true
    },
    "disparity": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/disparity/-/disparity-2.0.0.tgz",
      "integrity": "sha1-V92stHMkrl9Y0swNqIbbTOnutxg=",
      "dev": true,
      "requires": {
        "ansi-styles": "^2.0.1",
        "diff": "^1.3.2"
      }
    },
    "doctrine-temporary-fork": {
      "version": "2.0.0-alpha-allowarrayindex",
      "resolved": "https://registry.npmjs.org/doctrine-temporary-fork/-/doctrine-temporary-fork-2.0.0-alpha-allowarrayindex.tgz",
      "integrity": "sha1-QAFahn6yfnWybIKLcVJPE3+J+fA=",
      "dev": true,
      "requires": {
        "esutils": "^2.0.2",
        "isarray": "^1.0.0"
      },
      "dependencies": {
        "esutils": {
          "version": "2.0.2",
          "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
          "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
          "dev": true
        }
      }
    },
    "documentation": {
      "version": "5.3.5",
      "resolved": "https://registry.npmjs.org/documentation/-/documentation-5.3.5.tgz",
      "integrity": "sha512-VApv5dCFxjD5WZxEYGqZypK7L3l00clw9qbSTYCwdnvsaAhu7/U+FCHvkdtnCtkmLupIF/SxXPfXc4kB3UfXEg==",
      "dev": true,
      "requires": {
        "ansi-html": "^0.0.7",
        "babel-core": "^6.17.0",
        "babel-generator": "^6.25.0",
        "babel-plugin-system-import-transformer": "3.1.0",
        "babel-plugin-transform-decorators-legacy": "^1.3.4",
        "babel-preset-env": "^1.6.0",
        "babel-preset-react": "^6.16.0",
        "babel-preset-stage-0": "^6.16.0",
        "babel-traverse": "^6.16.0",
        "babel-types": "^6.16.0",
        "babelify": "^8.0.0",
        "babylon": "^6.17.2",
        "chalk": "^2.0.0",
        "chokidar": "^1.2.0",
        "concat-stream": "^1.5.0",
        "disparity": "^2.0.0",
        "doctrine-temporary-fork": "2.0.0-alpha-allowarrayindex",
        "get-port": "^3.1.0",
        "git-url-parse": "^6.0.1",
        "github-slugger": "1.2.0",
        "glob": "^7.0.0",
        "globals-docs": "^2.4.0",
        "highlight.js": "^9.1.0",
        "js-yaml": "^3.8.4",
        "lodash": "^4.11.1",
        "mdast-util-inject": "^1.1.0",
        "micromatch": "^3.0.0",
        "mime": "^1.4.1",
        "module-deps-sortable": "4.0.6",
        "parse-filepath": "^1.0.1",
        "pify": "^3.0.0",
        "read-pkg-up": "^3.0.0",
        "remark": "^8.0.0",
        "remark-html": "7.0.0",
        "remark-toc": "^4.0.0",
        "remote-origin-url": "0.4.0",
        "shelljs": "^0.7.5",
        "stream-array": "^1.1.0",
        "strip-json-comments": "^2.0.0",
        "tiny-lr": "^1.0.3",
        "unist-builder": "^1.0.0",
        "unist-util-visit": "^1.0.1",
        "vfile": "^2.0.0",
        "vfile-reporter": "^4.0.0",
        "vfile-sort": "^2.0.0",
        "vinyl": "^2.0.0",
        "vinyl-fs": "^3.0.0",
        "yargs": "^9.0.1"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "3.2.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
          "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
          "dev": true,
          "requires": {
            "color-convert": "^1.9.0"
          }
        },
        "babel-core": {
          "version": "6.26.0",
          "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
          "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
          "dev": true,
          "requires": {
            "babel-code-frame": "^6.26.0",
            "babel-generator": "^6.26.0",
            "babel-helpers": "^6.24.1",
            "babel-messages": "^6.23.0",
            "babel-register": "^6.26.0",
            "babel-runtime": "^6.26.0",
            "babel-template": "^6.26.0",
            "babel-traverse": "^6.26.0",
            "babel-types": "^6.26.0",
            "babylon": "^6.18.0",
            "convert-source-map": "^1.5.0",
            "debug": "^2.6.8",
            "json5": "^0.5.1",
            "lodash": "^4.17.4",
            "minimatch": "^3.0.4",
            "path-is-absolute": "^1.0.1",
            "private": "^0.1.7",
            "slash": "^1.0.0",
            "source-map": "^0.5.6"
          }
        },
        "babelify": {
          "version": "8.0.0",
          "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz",
          "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw==",
          "dev": true
        },
        "chalk": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
          "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
          "dev": true,
          "requires": {
            "ansi-styles": "^3.1.0",
            "escape-string-regexp": "^1.0.5",
            "supports-color": "^4.0.0"
          }
        },
        "convert-source-map": {
          "version": "1.5.1",
          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
          "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
          "dev": true
        },
        "glob": {
          "version": "7.1.2",
          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
          "dev": true,
          "requires": {
            "fs.realpath": "^1.0.0",
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "^3.0.4",
            "once": "^1.3.0",
            "path-is-absolute": "^1.0.0"
          }
        },
        "lodash": {
          "version": "4.17.4",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
          "dev": true
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        },
        "supports-color": {
          "version": "4.5.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
          "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
          "dev": true,
          "requires": {
            "has-flag": "^2.0.0"
          }
        }
      }
    },
    "dom-serializer": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
      "dev": true,
      "requires": {
        "domelementtype": "~1.1.1",
        "entities": "~1.1.1"
      },
      "dependencies": {
        "domelementtype": {
          "version": "1.1.3",
          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
          "dev": true
        },
        "entities": {
          "version": "1.1.1",
          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
          "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
          "dev": true
        }
      }
    },
    "domain-browser": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
      "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=",
      "dev": true
    },
    "domelementtype": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
      "dev": true
    },
    "domhandler": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
      "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
      "dev": true,
      "requires": {
        "domelementtype": "1"
      }
    },
    "domutils": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
      "dev": true,
      "requires": {
        "dom-serializer": "0",
        "domelementtype": "1"
      }
    },
    "dot-prop": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
      "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
      "dev": true,
      "requires": {
        "is-obj": "^1.0.0"
      }
    },
    "dotgitignore": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz",
      "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==",
      "dev": true,
      "requires": {
        "find-up": "^3.0.0",
        "minimatch": "^3.0.4"
      },
      "dependencies": {
        "find-up": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
          "dev": true,
          "requires": {
            "locate-path": "^3.0.0"
          }
        },
        "locate-path": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
          "dev": true,
          "requires": {
            "p-locate": "^3.0.0",
            "path-exists": "^3.0.0"
          }
        },
        "p-limit": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
          "dev": true,
          "requires": {
            "p-try": "^2.0.0"
          }
        },
        "p-locate": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
          "dev": true,
          "requires": {
            "p-limit": "^2.0.0"
          }
        }
      }
    },
    "duplexer2": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
      "dev": true,
      "requires": {
        "readable-stream": "^2.0.2"
      }
    },
    "duplexify": {
      "version": "3.5.1",
      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz",
      "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==",
      "dev": true,
      "requires": {
        "end-of-stream": "^1.0.0",
        "inherits": "^2.0.1",
        "readable-stream": "^2.0.0",
        "stream-shift": "^1.0.0"
      }
    },
    "electron-to-chromium": {
      "version": "1.3.28",
      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.28.tgz",
      "integrity": "sha1-jdTmRYCGZE6fnwoc8y4qH53/2e4=",
      "dev": true
    },
    "emoji-regex": {
      "version": "6.1.1",
      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz",
      "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=",
      "dev": true
    },
    "emojis-list": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
      "dev": true
    },
    "end-of-stream": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz",
      "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=",
      "dev": true,
      "requires": {
        "once": "^1.4.0"
      }
    },
    "enhanced-resolve": {
      "version": "0.9.1",
      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz",
      "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=",
      "dev": true,
      "requires": {
        "graceful-fs": "^4.1.2",
        "memory-fs": "^0.2.0",
        "tapable": "^0.1.8"
      },
      "dependencies": {
        "memory-fs": {
          "version": "0.2.0",
          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz",
          "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=",
          "dev": true
        }
      }
    },
    "entities": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
      "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
      "dev": true
    },
    "errno": {
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz",
      "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==",
      "dev": true,
      "requires": {
        "prr": "~1.0.1"
      }
    },
    "error": {
      "version": "7.0.2",
      "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
      "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
      "dev": true,
      "requires": {
        "string-template": "~0.2.1",
        "xtend": "~4.0.0"
      }
    },
    "error-ex": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
      "dev": true,
      "requires": {
        "is-arrayish": "^0.2.1"
      }
    },
    "es6ify": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/es6ify/-/es6ify-1.6.0.tgz",
      "integrity": "sha1-4pJbcZIrLX+FT2GXnNDWXMImclU=",
      "dev": true,
      "requires": {
        "through": "~2.2.7",
        "traceur": "0.0.79",
        "xtend": "~2.2.0"
      },
      "dependencies": {
        "through": {
          "version": "2.2.7",
          "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz",
          "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=",
          "dev": true
        },
        "xtend": {
          "version": "2.2.0",
          "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
          "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=",
          "dev": true
        }
      }
    },
    "escape-string-regexp": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
      "dev": true
    },
    "esprima": {
      "version": "3.1.3",
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
      "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
      "dev": true
    },
    "estraverse": {
      "version": "1.9.3",
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
      "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
      "dev": true
    },
    "esutils": {
      "version": "1.1.6",
      "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz",
      "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=",
      "dev": true
    },
    "events": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
      "dev": true
    },
    "execa": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
      "dev": true,
      "requires": {
        "cross-spawn": "^5.0.1",
        "get-stream": "^3.0.0",
        "is-stream": "^1.1.0",
        "npm-run-path": "^2.0.0",
        "p-finally": "^1.0.0",
        "signal-exit": "^3.0.0",
        "strip-eof": "^1.0.0"
      }
    },
    "exit": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
      "dev": true
    },
    "expand-brackets": {
      "version": "0.1.5",
      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
      "dev": true,
      "requires": {
        "is-posix-bracket": "^0.1.0"
      }
    },
    "expand-range": {
      "version": "1.8.2",
      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
      "dev": true,
      "requires": {
        "fill-range": "^2.1.0"
      }
    },
    "extend": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
      "dev": true
    },
    "extend-shallow": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
      "dev": true,
      "requires": {
        "is-extendable": "^0.1.0"
      }
    },
    "extglob": {
      "version": "0.3.2",
      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
      "dev": true,
      "requires": {
        "is-extglob": "^1.0.0"
      }
    },
    "faye-websocket": {
      "version": "0.10.0",
      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
      "dev": true,
      "requires": {
        "websocket-driver": ">=0.5.1"
      }
    },
    "figures": {
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
      "dev": true,
      "requires": {
        "escape-string-regexp": "^1.0.5"
      }
    },
    "filename-regex": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
      "dev": true
    },
    "fill-range": {
      "version": "2.2.3",
      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
      "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
      "dev": true,
      "requires": {
        "is-number": "^2.1.0",
        "isobject": "^2.0.0",
        "randomatic": "^1.1.3",
        "repeat-element": "^1.1.2",
        "repeat-string": "^1.5.2"
      }
    },
    "find-up": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
      "dev": true,
      "requires": {
        "locate-path": "^2.0.0"
      }
    },
    "flush-write-stream": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz",
      "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=",
      "dev": true,
      "requires": {
        "inherits": "^2.0.1",
        "readable-stream": "^2.0.4"
      }
    },
    "for-in": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
      "dev": true
    },
    "for-own": {
      "version": "0.1.5",
      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
      "dev": true,
      "requires": {
        "for-in": "^1.0.1"
      }
    },
    "foreach": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
      "dev": true
    },
    "fragment-cache": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
      "dev": true,
      "requires": {
        "map-cache": "^0.2.2"
      }
    },
    "fs-access": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
      "dev": true,
      "requires": {
        "null-check": "^1.0.0"
      }
    },
    "fs-mkdirp-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
      "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
      "dev": true,
      "requires": {
        "graceful-fs": "^4.1.11",
        "through2": "^2.0.3"
      }
    },
    "fs-readdir-recursive": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz",
      "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=",
      "dev": true
    },
    "fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
      "dev": true
    },
    "fsevents": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
      "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
      "dev": true,
      "optional": true,
      "requires": {
        "nan": "^2.3.0",
        "node-pre-gyp": "^0.6.39"
      },
      "dependencies": {
        "abbrev": {
          "version": "1.1.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "ajv": {
          "version": "4.11.8",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "co": "^4.6.0",
            "json-stable-stringify": "^1.0.1"
          }
        },
        "ansi-regex": {
          "version": "2.1.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "aproba": {
          "version": "1.1.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "are-we-there-yet": {
          "version": "1.1.4",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "delegates": "^1.0.0",
            "readable-stream": "^2.0.6"
          }
        },
        "asn1": {
          "version": "0.2.3",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "assert-plus": {
          "version": "0.2.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "asynckit": {
          "version": "0.4.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "aws-sign2": {
          "version": "0.6.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "aws4": {
          "version": "1.6.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "balanced-match": {
          "version": "0.4.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "bcrypt-pbkdf": {
          "version": "1.0.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "tweetnacl": "^0.14.3"
          }
        },
        "block-stream": {
          "version": "0.0.9",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "inherits": "~2.0.0"
          }
        },
        "boom": {
          "version": "2.10.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "hoek": "2.x.x"
          }
        },
        "brace-expansion": {
          "version": "1.1.7",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "balanced-match": "^0.4.1",
            "concat-map": "0.0.1"
          }
        },
        "buffer-shims": {
          "version": "1.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "caseless": {
          "version": "0.12.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "co": {
          "version": "4.6.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "code-point-at": {
          "version": "1.1.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "combined-stream": {
          "version": "1.0.5",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "delayed-stream": "~1.0.0"
          }
        },
        "concat-map": {
          "version": "0.0.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "console-control-strings": {
          "version": "1.1.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "core-util-is": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "cryptiles": {
          "version": "2.0.5",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "boom": "2.x.x"
          }
        },
        "dashdash": {
          "version": "1.14.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "assert-plus": "^1.0.0"
          },
          "dependencies": {
            "assert-plus": {
              "version": "1.0.0",
              "bundled": true,
              "dev": true,
              "optional": true
            }
          }
        },
        "debug": {
          "version": "2.6.8",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "ms": "2.0.0"
          }
        },
        "deep-extend": {
          "version": "0.4.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "delayed-stream": {
          "version": "1.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "delegates": {
          "version": "1.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "detect-libc": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "ecc-jsbn": {
          "version": "0.1.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "jsbn": "~0.1.0"
          }
        },
        "extsprintf": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "forever-agent": {
          "version": "0.6.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "form-data": {
          "version": "2.1.4",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "asynckit": "^0.4.0",
            "combined-stream": "^1.0.5",
            "mime-types": "^2.1.12"
          }
        },
        "fs.realpath": {
          "version": "1.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "fstream": {
          "version": "1.0.11",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "graceful-fs": "^4.1.2",
            "inherits": "~2.0.0",
            "mkdirp": ">=0.5 0",
            "rimraf": "2"
          }
        },
        "fstream-ignore": {
          "version": "1.0.5",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "fstream": "^1.0.0",
            "inherits": "2",
            "minimatch": "^3.0.0"
          }
        },
        "gauge": {
          "version": "2.7.4",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "aproba": "^1.0.3",
            "console-control-strings": "^1.0.0",
            "has-unicode": "^2.0.0",
            "object-assign": "^4.1.0",
            "signal-exit": "^3.0.0",
            "string-width": "^1.0.1",
            "strip-ansi": "^3.0.1",
            "wide-align": "^1.1.0"
          }
        },
        "getpass": {
          "version": "0.1.7",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "assert-plus": "^1.0.0"
          },
          "dependencies": {
            "assert-plus": {
              "version": "1.0.0",
              "bundled": true,
              "dev": true,
              "optional": true
            }
          }
        },
        "glob": {
          "version": "7.1.2",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "fs.realpath": "^1.0.0",
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "^3.0.4",
            "once": "^1.3.0",
            "path-is-absolute": "^1.0.0"
          }
        },
        "graceful-fs": {
          "version": "4.1.11",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "har-schema": {
          "version": "1.0.5",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "har-validator": {
          "version": "4.2.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "ajv": "^4.9.1",
            "har-schema": "^1.0.5"
          }
        },
        "has-unicode": {
          "version": "2.0.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "hawk": {
          "version": "3.1.3",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "boom": "2.x.x",
            "cryptiles": "2.x.x",
            "hoek": "2.x.x",
            "sntp": "1.x.x"
          }
        },
        "hoek": {
          "version": "2.16.3",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "http-signature": {
          "version": "1.1.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "assert-plus": "^0.2.0",
            "jsprim": "^1.2.2",
            "sshpk": "^1.7.0"
          }
        },
        "inflight": {
          "version": "1.0.6",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "once": "^1.3.0",
            "wrappy": "1"
          }
        },
        "inherits": {
          "version": "2.0.3",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "ini": {
          "version": "1.3.4",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "is-fullwidth-code-point": {
          "version": "1.0.0",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "number-is-nan": "^1.0.0"
          }
        },
        "is-typedarray": {
          "version": "1.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "isarray": {
          "version": "1.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "isstream": {
          "version": "0.1.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "jodid25519": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "jsbn": "~0.1.0"
          }
        },
        "jsbn": {
          "version": "0.1.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "json-schema": {
          "version": "0.2.3",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "json-stable-stringify": {
          "version": "1.0.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "jsonify": "~0.0.0"
          }
        },
        "json-stringify-safe": {
          "version": "5.0.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "jsonify": {
          "version": "0.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "jsprim": {
          "version": "1.4.0",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "assert-plus": "1.0.0",
            "extsprintf": "1.0.2",
            "json-schema": "0.2.3",
            "verror": "1.3.6"
          },
          "dependencies": {
            "assert-plus": {
              "version": "1.0.0",
              "bundled": true,
              "dev": true,
              "optional": true
            }
          }
        },
        "mime-db": {
          "version": "1.27.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "mime-types": {
          "version": "2.1.15",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "mime-db": "~1.27.0"
          }
        },
        "minimatch": {
          "version": "3.0.4",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "brace-expansion": "^1.1.7"
          }
        },
        "minimist": {
          "version": "0.0.8",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "mkdirp": {
          "version": "0.5.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "minimist": "0.0.8"
          }
        },
        "ms": {
          "version": "2.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "node-pre-gyp": {
          "version": "0.6.39",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "detect-libc": "^1.0.2",
            "hawk": "3.1.3",
            "mkdirp": "^0.5.1",
            "nopt": "^4.0.1",
            "npmlog": "^4.0.2",
            "rc": "^1.1.7",
            "request": "2.81.0",
            "rimraf": "^2.6.1",
            "semver": "^5.3.0",
            "tar": "^2.2.1",
            "tar-pack": "^3.4.0"
          }
        },
        "nopt": {
          "version": "4.0.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "abbrev": "1",
            "osenv": "^0.1.4"
          }
        },
        "npmlog": {
          "version": "4.1.0",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "are-we-there-yet": "~1.1.2",
            "console-control-strings": "~1.1.0",
            "gauge": "~2.7.3",
            "set-blocking": "~2.0.0"
          }
        },
        "number-is-nan": {
          "version": "1.0.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "oauth-sign": {
          "version": "0.8.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "object-assign": {
          "version": "4.1.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "once": {
          "version": "1.4.0",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "wrappy": "1"
          }
        },
        "os-homedir": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "os-tmpdir": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "osenv": {
          "version": "0.1.4",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "os-homedir": "^1.0.0",
            "os-tmpdir": "^1.0.0"
          }
        },
        "path-is-absolute": {
          "version": "1.0.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "performance-now": {
          "version": "0.2.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "process-nextick-args": {
          "version": "1.0.7",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "punycode": {
          "version": "1.4.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "qs": {
          "version": "6.4.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "rc": {
          "version": "1.2.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "deep-extend": "~0.4.0",
            "ini": "~1.3.0",
            "minimist": "^1.2.0",
            "strip-json-comments": "~2.0.1"
          },
          "dependencies": {
            "minimist": {
              "version": "1.2.0",
              "bundled": true,
              "dev": true,
              "optional": true
            }
          }
        },
        "readable-stream": {
          "version": "2.2.9",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "buffer-shims": "~1.0.0",
            "core-util-is": "~1.0.0",
            "inherits": "~2.0.1",
            "isarray": "~1.0.0",
            "process-nextick-args": "~1.0.6",
            "string_decoder": "~1.0.0",
            "util-deprecate": "~1.0.1"
          }
        },
        "request": {
          "version": "2.81.0",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "aws-sign2": "~0.6.0",
            "aws4": "^1.2.1",
            "caseless": "~0.12.0",
            "combined-stream": "~1.0.5",
            "extend": "~3.0.0",
            "forever-agent": "~0.6.1",
            "form-data": "~2.1.1",
            "har-validator": "~4.2.1",
            "hawk": "~3.1.3",
            "http-signature": "~1.1.0",
            "is-typedarray": "~1.0.0",
            "isstream": "~0.1.2",
            "json-stringify-safe": "~5.0.1",
            "mime-types": "~2.1.7",
            "oauth-sign": "~0.8.1",
            "performance-now": "^0.2.0",
            "qs": "~6.4.0",
            "safe-buffer": "^5.0.1",
            "stringstream": "~0.0.4",
            "tough-cookie": "~2.3.0",
            "tunnel-agent": "^0.6.0",
            "uuid": "^3.0.0"
          }
        },
        "rimraf": {
          "version": "2.6.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "glob": "^7.0.5"
          }
        },
        "safe-buffer": {
          "version": "5.0.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "semver": {
          "version": "5.3.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "set-blocking": {
          "version": "2.0.0",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "signal-exit": {
          "version": "3.0.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "sntp": {
          "version": "1.0.9",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "hoek": "2.x.x"
          }
        },
        "sshpk": {
          "version": "1.13.0",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "asn1": "~0.2.3",
            "assert-plus": "^1.0.0",
            "bcrypt-pbkdf": "^1.0.0",
            "dashdash": "^1.12.0",
            "ecc-jsbn": "~0.1.1",
            "getpass": "^0.1.1",
            "jodid25519": "^1.0.0",
            "jsbn": "~0.1.0",
            "tweetnacl": "~0.14.0"
          },
          "dependencies": {
            "assert-plus": {
              "version": "1.0.0",
              "bundled": true,
              "dev": true,
              "optional": true
            }
          }
        },
        "string-width": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "code-point-at": "^1.0.0",
            "is-fullwidth-code-point": "^1.0.0",
            "strip-ansi": "^3.0.0"
          }
        },
        "string_decoder": {
          "version": "1.0.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "safe-buffer": "^5.0.1"
          }
        },
        "stringstream": {
          "version": "0.0.5",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "strip-ansi": {
          "version": "3.0.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-regex": "^2.0.0"
          }
        },
        "strip-json-comments": {
          "version": "2.0.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "tar": {
          "version": "2.2.1",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "block-stream": "*",
            "fstream": "^1.0.2",
            "inherits": "2"
          }
        },
        "tar-pack": {
          "version": "3.4.0",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "debug": "^2.2.0",
            "fstream": "^1.0.10",
            "fstream-ignore": "^1.0.5",
            "once": "^1.3.3",
            "readable-stream": "^2.1.4",
            "rimraf": "^2.5.1",
            "tar": "^2.2.1",
            "uid-number": "^0.0.6"
          }
        },
        "tough-cookie": {
          "version": "2.3.2",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "punycode": "^1.4.1"
          }
        },
        "tunnel-agent": {
          "version": "0.6.0",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "safe-buffer": "^5.0.1"
          }
        },
        "tweetnacl": {
          "version": "0.14.5",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "uid-number": {
          "version": "0.0.6",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "util-deprecate": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "uuid": {
          "version": "3.0.1",
          "bundled": true,
          "dev": true,
          "optional": true
        },
        "verror": {
          "version": "1.3.6",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "extsprintf": "1.0.2"
          }
        },
        "wide-align": {
          "version": "1.1.2",
          "bundled": true,
          "dev": true,
          "optional": true,
          "requires": {
            "string-width": "^1.0.2"
          }
        },
        "wrappy": {
          "version": "1.0.2",
          "bundled": true,
          "dev": true,
          "optional": true
        }
      }
    },
    "function-bind": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
      "dev": true
    },
    "fuse": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/fuse/-/fuse-0.4.0.tgz",
      "integrity": "sha1-LDjq+IirsKm6eWDP4zOdHz9T9uY=",
      "dev": true,
      "requires": {
        "colors": ">=0.6.x",
        "jshint": "0.9.x",
        "optimist": ">=0.3.5",
        "uglify-js": ">=2.2.x",
        "underscore": ">=1.4.x"
      },
      "dependencies": {
        "jshint": {
          "version": "0.9.1",
          "resolved": "https://registry.npmjs.org/jshint/-/jshint-0.9.1.tgz",
          "integrity": "sha1-/zLsfwn4QAH3SY7q/WPJ5Puy3A4=",
          "dev": true,
          "requires": {
            "cli": "0.4.3",
            "minimatch": "0.0.x"
          }
        },
        "lru-cache": {
          "version": "1.0.6",
          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-1.0.6.tgz",
          "integrity": "sha1-qlD5cEdCKsclQ72hd6nJ0BjZhFI=",
          "dev": true
        },
        "minimatch": {
          "version": "0.0.5",
          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.0.5.tgz",
          "integrity": "sha1-lrtJC707poNrv6wRGt91MBsVhN4=",
          "dev": true,
          "requires": {
            "lru-cache": "~1.0.2"
          }
        }
      }
    },
    "get-caller-file": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
      "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
      "dev": true
    },
    "get-pkg-repo": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
      "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=",
      "dev": true,
      "requires": {
        "hosted-git-info": "^2.1.4",
        "meow": "^3.3.0",
        "normalize-package-data": "^2.3.0",
        "parse-github-repo-url": "^1.3.0",
        "through2": "^2.0.0"
      },
      "dependencies": {
        "camelcase": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
          "dev": true
        },
        "camelcase-keys": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
          "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
          "dev": true,
          "requires": {
            "camelcase": "^2.0.0",
            "map-obj": "^1.0.0"
          }
        },
        "find-up": {
          "version": "1.1.2",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
          "dev": true,
          "requires": {
            "path-exists": "^2.0.0",
            "pinkie-promise": "^2.0.0"
          }
        },
        "indent-string": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
          "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
          "dev": true,
          "requires": {
            "repeating": "^2.0.0"
          }
        },
        "load-json-file": {
          "version": "1.1.0",
          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
          "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
          "dev": true,
          "requires": {
            "graceful-fs": "^4.1.2",
            "parse-json": "^2.2.0",
            "pify": "^2.0.0",
            "pinkie-promise": "^2.0.0",
            "strip-bom": "^2.0.0"
          }
        },
        "map-obj": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
          "dev": true
        },
        "meow": {
          "version": "3.7.0",
          "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
          "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
          "dev": true,
          "requires": {
            "camelcase-keys": "^2.0.0",
            "decamelize": "^1.1.2",
            "loud-rejection": "^1.0.0",
            "map-obj": "^1.0.1",
            "minimist": "^1.1.3",
            "normalize-package-data": "^2.3.4",
            "object-assign": "^4.0.1",
            "read-pkg-up": "^1.0.1",
            "redent": "^1.0.0",
            "trim-newlines": "^1.0.0"
          }
        },
        "parse-json": {
          "version": "2.2.0",
          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
          "dev": true,
          "requires": {
            "error-ex": "^1.2.0"
          }
        },
        "path-exists": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
          "dev": true,
          "requires": {
            "pinkie-promise": "^2.0.0"
          }
        },
        "path-type": {
          "version": "1.1.0",
          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
          "dev": true,
          "requires": {
            "graceful-fs": "^4.1.2",
            "pify": "^2.0.0",
            "pinkie-promise": "^2.0.0"
          }
        },
        "pify": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
          "dev": true
        },
        "read-pkg": {
          "version": "1.1.0",
          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
          "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
          "dev": true,
          "requires": {
            "load-json-file": "^1.0.0",
            "normalize-package-data": "^2.3.2",
            "path-type": "^1.0.0"
          }
        },
        "read-pkg-up": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
          "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
          "dev": true,
          "requires": {
            "find-up": "^1.0.0",
            "read-pkg": "^1.0.0"
          }
        },
        "redent": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
          "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
          "dev": true,
          "requires": {
            "indent-string": "^2.1.0",
            "strip-indent": "^1.0.1"
          }
        },
        "repeating": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
          "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
          "dev": true,
          "requires": {
            "is-finite": "^1.0.0"
          }
        },
        "strip-bom": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
          "dev": true,
          "requires": {
            "is-utf8": "^0.2.0"
          }
        },
        "strip-indent": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
          "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
          "dev": true,
          "requires": {
            "get-stdin": "^4.0.1"
          }
        },
        "trim-newlines": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
          "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
          "dev": true
        }
      }
    },
    "get-port": {
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
      "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=",
      "dev": true
    },
    "get-stdin": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
      "dev": true
    },
    "get-stream": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
      "dev": true
    },
    "get-value": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
      "dev": true
    },
    "git-raw-commits": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz",
      "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==",
      "dev": true,
      "requires": {
        "dargs": "^4.0.1",
        "lodash.template": "^4.0.2",
        "meow": "^4.0.0",
        "split2": "^2.0.0",
        "through2": "^2.0.0"
      },
      "dependencies": {
        "arrify": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
          "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
          "dev": true
        },
        "camelcase-keys": {
          "version": "4.2.0",
          "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
          "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
          "dev": true,
          "requires": {
            "camelcase": "^4.1.0",
            "map-obj": "^2.0.0",
            "quick-lru": "^1.0.0"
          }
        },
        "indent-string": {
          "version": "3.2.0",
          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
          "dev": true
        },
        "map-obj": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
          "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
          "dev": true
        },
        "meow": {
          "version": "4.0.1",
          "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
          "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
          "dev": true,
          "requires": {
            "camelcase-keys": "^4.0.0",
            "decamelize-keys": "^1.0.0",
            "loud-rejection": "^1.0.0",
            "minimist": "^1.1.3",
            "minimist-options": "^3.0.1",
            "normalize-package-data": "^2.3.4",
            "read-pkg-up": "^3.0.0",
            "redent": "^2.0.0",
            "trim-newlines": "^2.0.0"
          }
        },
        "minimist-options": {
          "version": "3.0.2",
          "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
          "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
          "dev": true,
          "requires": {
            "arrify": "^1.0.1",
            "is-plain-obj": "^1.1.0"
          }
        },
        "quick-lru": {
          "version": "1.1.0",
          "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
          "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
          "dev": true
        },
        "redent": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
          "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
          "dev": true,
          "requires": {
            "indent-string": "^3.0.0",
            "strip-indent": "^2.0.0"
          }
        },
        "strip-indent": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
          "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
          "dev": true
        },
        "trim-newlines": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
          "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
          "dev": true
        }
      }
    },
    "git-remote-origin-url": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
      "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
      "dev": true,
      "requires": {
        "gitconfiglocal": "^1.0.0",
        "pify": "^2.3.0"
      },
      "dependencies": {
        "pify": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
          "dev": true
        }
      }
    },
    "git-semver-tags": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.0.0.tgz",
      "integrity": "sha512-LajaAWLYVBff+1NVircURJFL8TQ3EMIcLAfHisWYX/nPoMwnTYfWAznQDmMujlLqoD12VtLmoSrF1sQ5MhimEQ==",
      "dev": true,
      "requires": {
        "meow": "^7.0.0",
        "semver": "^6.0.0"
      },
      "dependencies": {
        "semver": {
          "version": "6.3.0",
          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
          "dev": true
        }
      }
    },
    "git-up": {
      "version": "2.0.9",
      "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.0.9.tgz",
      "integrity": "sha1-IZv9J8gtrurYSVvrOG3Bjq5jY20=",
      "dev": true,
      "requires": {
        "is-ssh": "^1.3.0",
        "parse-url": "^1.3.0"
      }
    },
    "git-url-parse": {
      "version": "6.2.2",
      "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-6.2.2.tgz",
      "integrity": "sha1-vkkCThS4SHVTQ2tFcri0OVMvqHE=",
      "dev": true,
      "requires": {
        "git-up": "^2.0.0"
      }
    },
    "gitconfiglocal": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
      "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
      "dev": true,
      "requires": {
        "ini": "^1.3.2"
      }
    },
    "github-slugger": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.0.tgz",
      "integrity": "sha512-wIaa75k1vZhyPm9yWrD08A5Xnx/V+RmzGrpjQuLemGKSb77Qukiaei58Bogrl/LZSADDfPzKJX8jhLs4CRTl7Q==",
      "dev": true,
      "requires": {
        "emoji-regex": ">=6.0.0 <=6.1.1"
      }
    },
    "glob": {
      "version": "5.0.15",
      "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
      "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
      "dev": true,
      "requires": {
        "inflight": "^1.0.4",
        "inherits": "2",
        "minimatch": "2 || 3",
        "once": "^1.3.0",
        "path-is-absolute": "^1.0.0"
      }
    },
    "glob-base": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
      "dev": true,
      "requires": {
        "glob-parent": "^2.0.0",
        "is-glob": "^2.0.0"
      }
    },
    "glob-parent": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
      "dev": true,
      "requires": {
        "is-glob": "^2.0.0"
      }
    },
    "glob-stream": {
      "version": "6.1.0",
      "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
      "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
      "dev": true,
      "requires": {
        "extend": "^3.0.0",
        "glob": "^7.1.1",
        "glob-parent": "^3.1.0",
        "is-negated-glob": "^1.0.0",
        "ordered-read-streams": "^1.0.0",
        "pumpify": "^1.3.5",
        "readable-stream": "^2.1.5",
        "remove-trailing-separator": "^1.0.1",
        "to-absolute-glob": "^2.0.0",
        "unique-stream": "^2.0.2"
      },
      "dependencies": {
        "glob": {
          "version": "7.1.2",
          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
          "dev": true,
          "requires": {
            "fs.realpath": "^1.0.0",
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "^3.0.4",
            "once": "^1.3.0",
            "path-is-absolute": "^1.0.0"
          }
        },
        "glob-parent": {
          "version": "3.1.0",
          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
          "dev": true,
          "requires": {
            "is-glob": "^3.1.0",
            "path-dirname": "^1.0.0"
          }
        },
        "is-extglob": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
          "dev": true
        },
        "is-glob": {
          "version": "3.1.0",
          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
          "dev": true,
          "requires": {
            "is-extglob": "^2.1.0"
          }
        }
      }
    },
    "globals": {
      "version": "6.4.1",
      "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz",
      "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=",
      "dev": true
    },
    "globals-docs": {
      "version": "2.4.0",
      "resolved": "https://registry.npmjs.org/globals-docs/-/globals-docs-2.4.0.tgz",
      "integrity": "sha512-B69mWcqCmT3jNYmSxRxxOXWfzu3Go8NQXPfl2o0qPd1EEFhwW0dFUg9ztTu915zPQzqwIhWAlw6hmfIcCK4kkQ==",
      "dev": true
    },
    "graceful-fs": {
      "version": "4.1.11",
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
      "dev": true
    },
    "handlebars": {
      "version": "4.7.6",
      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
      "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
      "dev": true,
      "requires": {
        "minimist": "^1.2.5",
        "neo-async": "^2.6.0",
        "source-map": "^0.6.1",
        "uglify-js": "^3.1.4",
        "wordwrap": "^1.0.0"
      },
      "dependencies": {
        "minimist": {
          "version": "1.2.5",
          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
          "dev": true
        },
        "source-map": {
          "version": "0.6.1",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
          "dev": true
        },
        "uglify-js": {
          "version": "3.10.0",
          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz",
          "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==",
          "dev": true,
          "optional": true
        },
        "wordwrap": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
          "dev": true
        }
      }
    },
    "hard-rejection": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
      "dev": true
    },
    "has-ansi": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
      "dev": true,
      "requires": {
        "ansi-regex": "^2.0.0"
      }
    },
    "has-flag": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
      "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
      "dev": true
    },
    "has-value": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
      "dev": true,
      "requires": {
        "get-value": "^2.0.6",
        "has-values": "^1.0.0",
        "isobject": "^3.0.0"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "has-values": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
      "dev": true,
      "requires": {
        "is-number": "^3.0.0",
        "kind-of": "^4.0.0"
      },
      "dependencies": {
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          },
          "dependencies": {
            "kind-of": {
              "version": "3.2.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
              "dev": true,
              "requires": {
                "is-buffer": "^1.1.5"
              }
            }
          }
        },
        "kind-of": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
          "dev": true,
          "requires": {
            "is-buffer": "^1.1.5"
          }
        }
      }
    },
    "hast-util-is-element": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.0.tgz",
      "integrity": "sha1-P3IWl4sq4U2YdJh4eCZ18zvjzgA=",
      "dev": true
    },
    "hast-util-sanitize": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-1.1.2.tgz",
      "integrity": "sha1-0QvWdXoh5ZwTq8iuNTDdO219Z54=",
      "dev": true,
      "requires": {
        "xtend": "^4.0.1"
      }
    },
    "hast-util-to-html": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-3.1.0.tgz",
      "integrity": "sha1-iCyZhJ5AEw6ZHAQuRW1FPZXDbP8=",
      "dev": true,
      "requires": {
        "ccount": "^1.0.0",
        "comma-separated-tokens": "^1.0.1",
        "hast-util-is-element": "^1.0.0",
        "hast-util-whitespace": "^1.0.0",
        "html-void-elements": "^1.0.0",
        "kebab-case": "^1.0.0",
        "property-information": "^3.1.0",
        "space-separated-tokens": "^1.0.0",
        "stringify-entities": "^1.0.1",
        "unist-util-is": "^2.0.0",
        "xtend": "^4.0.1"
      }
    },
    "hast-util-whitespace": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.0.tgz",
      "integrity": "sha1-vQlpGWJdKTbh/xe8Tff9cn8X7Ok=",
      "dev": true
    },
    "highlight.js": {
      "version": "9.12.0",
      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz",
      "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=",
      "dev": true
    },
    "home-or-tmp": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
      "dev": true,
      "requires": {
        "os-homedir": "^1.0.0",
        "os-tmpdir": "^1.0.1"
      }
    },
    "hosted-git-info": {
      "version": "2.5.0",
      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
      "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
      "dev": true
    },
    "html-void-elements": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.2.tgz",
      "integrity": "sha1-nSLgyjKsyVs/RbjVtPb73AWv/VU=",
      "dev": true
    },
    "htmlparser2": {
      "version": "3.8.3",
      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
      "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
      "dev": true,
      "requires": {
        "domelementtype": "1",
        "domhandler": "2.3",
        "domutils": "1.5",
        "entities": "1.0",
        "readable-stream": "1.1"
      },
      "dependencies": {
        "isarray": {
          "version": "0.0.1",
          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
          "dev": true
        },
        "readable-stream": {
          "version": "1.1.14",
          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
          "dev": true,
          "requires": {
            "core-util-is": "~1.0.0",
            "inherits": "~2.0.1",
            "isarray": "0.0.1",
            "string_decoder": "~0.10.x"
          }
        },
        "string_decoder": {
          "version": "0.10.31",
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
          "dev": true
        }
      }
    },
    "http-parser-js": {
      "version": "0.4.9",
      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz",
      "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=",
      "dev": true
    },
    "https-browserify": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz",
      "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=",
      "dev": true
    },
    "iconv-lite": {
      "version": "0.4.19",
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
      "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
      "dev": true
    },
    "ieee754": {
      "version": "1.1.8",
      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
      "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=",
      "dev": true
    },
    "indent-string": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
      "dev": true
    },
    "indexof": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
      "dev": true
    },
    "inflight": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
      "dev": true,
      "requires": {
        "once": "^1.3.0",
        "wrappy": "1"
      }
    },
    "inherits": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
      "dev": true
    },
    "ini": {
      "version": "1.3.5",
      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
      "dev": true
    },
    "interpret": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
      "dev": true
    },
    "invariant": {
      "version": "2.2.2",
      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
      "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
      "dev": true,
      "requires": {
        "loose-envify": "^1.0.0"
      }
    },
    "invert-kv": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
      "dev": true
    },
    "is-absolute": {
      "version": "0.2.6",
      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz",
      "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=",
      "dev": true,
      "requires": {
        "is-relative": "^0.2.1",
        "is-windows": "^0.2.0"
      }
    },
    "is-accessor-descriptor": {
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2"
      }
    },
    "is-alphabetical": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.1.tgz",
      "integrity": "sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg=",
      "dev": true
    },
    "is-alphanumeric": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
      "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
      "dev": true
    },
    "is-alphanumerical": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz",
      "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=",
      "dev": true,
      "requires": {
        "is-alphabetical": "^1.0.0",
        "is-decimal": "^1.0.0"
      }
    },
    "is-arrayish": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
      "dev": true
    },
    "is-binary-path": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
      "dev": true,
      "requires": {
        "binary-extensions": "^1.0.0"
      }
    },
    "is-buffer": {
      "version": "1.1.6",
      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
      "dev": true
    },
    "is-builtin-module": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
      "dev": true,
      "requires": {
        "builtin-modules": "^1.0.0"
      }
    },
    "is-data-descriptor": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2"
      }
    },
    "is-decimal": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz",
      "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=",
      "dev": true
    },
    "is-descriptor": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.1.tgz",
      "integrity": "sha512-G3fFVFTqfaqu7r4YuSBHKBAuOaLz8Sy7ekklUpFEliaLMP1Y2ZjoN9jS62YWCAPQrQpMUQSitRlrzibbuCZjdA==",
      "dev": true,
      "requires": {
        "is-accessor-descriptor": "^0.1.6",
        "is-data-descriptor": "^0.1.4",
        "kind-of": "^5.0.0"
      },
      "dependencies": {
        "kind-of": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
          "dev": true
        }
      }
    },
    "is-dotfile": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
      "dev": true
    },
    "is-equal-shallow": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
      "dev": true,
      "requires": {
        "is-primitive": "^2.0.0"
      }
    },
    "is-extendable": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
      "dev": true
    },
    "is-extglob": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
      "dev": true
    },
    "is-finite": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
      "dev": true,
      "requires": {
        "number-is-nan": "^1.0.0"
      }
    },
    "is-fullwidth-code-point": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
      "dev": true,
      "requires": {
        "number-is-nan": "^1.0.0"
      }
    },
    "is-glob": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
      "dev": true,
      "requires": {
        "is-extglob": "^1.0.0"
      }
    },
    "is-hexadecimal": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz",
      "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=",
      "dev": true
    },
    "is-integer": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz",
      "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=",
      "dev": true,
      "requires": {
        "is-finite": "^1.0.0"
      }
    },
    "is-negated-glob": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
      "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
      "dev": true
    },
    "is-number": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2"
      }
    },
    "is-obj": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
      "dev": true
    },
    "is-odd": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz",
      "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=",
      "dev": true,
      "requires": {
        "is-number": "^3.0.0"
      },
      "dependencies": {
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          }
        }
      }
    },
    "is-plain-obj": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
      "dev": true
    },
    "is-plain-object": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
      "dev": true,
      "requires": {
        "isobject": "^3.0.1"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "is-posix-bracket": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
      "dev": true
    },
    "is-primitive": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
      "dev": true
    },
    "is-relative": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz",
      "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=",
      "dev": true,
      "requires": {
        "is-unc-path": "^0.1.1"
      }
    },
    "is-ssh": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.0.tgz",
      "integrity": "sha1-6+oRaaJhTaOSpjdANmw84EnY3/Y=",
      "dev": true,
      "requires": {
        "protocols": "^1.1.0"
      }
    },
    "is-stream": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
      "dev": true
    },
    "is-text-path": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
      "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
      "dev": true,
      "requires": {
        "text-extensions": "^1.0.0"
      }
    },
    "is-unc-path": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz",
      "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=",
      "dev": true,
      "requires": {
        "unc-path-regex": "^0.1.0"
      }
    },
    "is-utf8": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
      "dev": true
    },
    "is-valid-glob": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
      "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
      "dev": true
    },
    "is-whitespace-character": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz",
      "integrity": "sha1-muAXbzKCtlRXoZks2whPil+DPjs=",
      "dev": true
    },
    "is-windows": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
      "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
      "dev": true
    },
    "is-word-character": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.1.tgz",
      "integrity": "sha1-WgP6HqkazopusMfNdw64bWXIvvs=",
      "dev": true
    },
    "isarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
      "dev": true
    },
    "isexe": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
      "dev": true
    },
    "isobject": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
      "dev": true,
      "requires": {
        "isarray": "1.0.0"
      }
    },
    "jest": {
      "version": "0.1.40",
      "resolved": "https://registry.npmjs.org/jest/-/jest-0.1.40.tgz",
      "integrity": "sha1-yUeefqGac7gUGjCFPIRsM25k1Y8=",
      "dev": true,
      "requires": {
        "sji": "^0.0.1",
        "underscore": "^1.8.3"
      },
      "dependencies": {
        "underscore": {
          "version": "1.8.3",
          "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
          "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
          "dev": true
        }
      }
    },
    "js-tokens": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.0.tgz",
      "integrity": "sha1-J4sua2jfpMhBavETcKVepAG/TN4=",
      "dev": true
    },
    "js-yaml": {
      "version": "3.13.1",
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
      "dev": true,
      "requires": {
        "argparse": "^1.0.7",
        "esprima": "^4.0.0"
      },
      "dependencies": {
        "esprima": {
          "version": "4.0.1",
          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
          "dev": true
        }
      }
    },
    "jsesc": {
      "version": "0.5.0",
      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
      "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
      "dev": true
    },
    "jshint": {
      "version": "2.9.5",
      "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz",
      "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=",
      "dev": true,
      "requires": {
        "cli": "~1.0.0",
        "console-browserify": "1.1.x",
        "exit": "0.1.x",
        "htmlparser2": "3.8.x",
        "lodash": "3.7.x",
        "minimatch": "~3.0.2",
        "shelljs": "0.3.x",
        "strip-json-comments": "1.0.x"
      },
      "dependencies": {
        "cli": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
          "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
          "dev": true,
          "requires": {
            "exit": "0.1.2",
            "glob": "^7.1.1"
          }
        },
        "glob": {
          "version": "7.1.2",
          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
          "dev": true,
          "requires": {
            "fs.realpath": "^1.0.0",
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "^3.0.4",
            "once": "^1.3.0",
            "path-is-absolute": "^1.0.0"
          }
        },
        "lodash": {
          "version": "3.7.0",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz",
          "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=",
          "dev": true
        },
        "shelljs": {
          "version": "0.3.0",
          "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
          "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
          "dev": true
        },
        "strip-json-comments": {
          "version": "1.0.4",
          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
          "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
          "dev": true
        }
      }
    },
    "jshint-loader": {
      "version": "0.8.4",
      "resolved": "https://registry.npmjs.org/jshint-loader/-/jshint-loader-0.8.4.tgz",
      "integrity": "sha1-tD7kXRN3adVliUChH479mg7c1Hs=",
      "dev": true,
      "requires": {
        "loader-utils": "^1.0.2",
        "rcloader": "=0.1.2",
        "strip-json-comments": "0.1.x"
      },
      "dependencies": {
        "loader-utils": {
          "version": "1.1.0",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
          "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
          "dev": true,
          "requires": {
            "big.js": "^3.1.3",
            "emojis-list": "^2.0.0",
            "json5": "^0.5.0"
          }
        },
        "strip-json-comments": {
          "version": "0.1.3",
          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz",
          "integrity": "sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ=",
          "dev": true
        }
      }
    },
    "json-parse-better-errors": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz",
      "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==",
      "dev": true
    },
    "json-stable-stringify": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
      "dev": true,
      "requires": {
        "jsonify": "~0.0.0"
      }
    },
    "json-stringify-safe": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
      "dev": true
    },
    "json5": {
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
      "dev": true
    },
    "jsonify": {
      "version": "0.0.0",
      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
      "dev": true
    },
    "jsonparse": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
      "dev": true
    },
    "kebab-case": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/kebab-case/-/kebab-case-1.0.0.tgz",
      "integrity": "sha1-P55JkK3K0MaGwOcB92RYaPdfkes=",
      "dev": true
    },
    "kind-of": {
      "version": "3.2.2",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
      "dev": true,
      "requires": {
        "is-buffer": "^1.1.5"
      }
    },
    "lazy-cache": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
      "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
      "dev": true,
      "requires": {
        "set-getter": "^0.1.0"
      }
    },
    "lazystream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
      "dev": true,
      "requires": {
        "readable-stream": "^2.0.5"
      }
    },
    "lcid": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
      "dev": true,
      "requires": {
        "invert-kv": "^1.0.0"
      }
    },
    "lead": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
      "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
      "dev": true,
      "requires": {
        "flush-write-stream": "^1.0.2"
      }
    },
    "left-pad": {
      "version": "0.0.3",
      "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-0.0.3.tgz",
      "integrity": "sha1-BNmbSh6vnl95wF5ddF1T7dGqiqE=",
      "dev": true
    },
    "leven": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz",
      "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=",
      "dev": true
    },
    "line-numbers": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/line-numbers/-/line-numbers-0.2.0.tgz",
      "integrity": "sha1-a8AoFJRA5XDUlatQlpKqCL13nG4=",
      "dev": true,
      "requires": {
        "left-pad": "0.0.3"
      }
    },
    "lines-and-columns": {
      "version": "1.1.6",
      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
      "dev": true
    },
    "livereload-js": {
      "version": "2.2.2",
      "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz",
      "integrity": "sha1-bIclfmSKtHW8JOoldFftzB+NC8I=",
      "dev": true
    },
    "load-json-file": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
      "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
      "dev": true,
      "requires": {
        "graceful-fs": "^4.1.2",
        "parse-json": "^4.0.0",
        "pify": "^3.0.0",
        "strip-bom": "^3.0.0"
      }
    },
    "loader-utils": {
      "version": "0.2.17",
      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
      "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
      "dev": true,
      "requires": {
        "big.js": "^3.1.3",
        "emojis-list": "^2.0.0",
        "json5": "^0.5.0",
        "object-assign": "^4.0.1"
      }
    },
    "locate-path": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
      "dev": true,
      "requires": {
        "p-locate": "^2.0.0",
        "path-exists": "^3.0.0"
      }
    },
    "lodash": {
      "version": "3.10.1",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
      "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
      "dev": true
    },
    "lodash._reinterpolate": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
      "dev": true
    },
    "lodash.clonedeep": {
      "version": "4.5.0",
      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
      "dev": true
    },
    "lodash.ismatch": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
      "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=",
      "dev": true
    },
    "lodash.template": {
      "version": "4.5.0",
      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
      "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
      "dev": true,
      "requires": {
        "lodash._reinterpolate": "^3.0.0",
        "lodash.templatesettings": "^4.0.0"
      }
    },
    "lodash.templatesettings": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
      "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
      "dev": true,
      "requires": {
        "lodash._reinterpolate": "^3.0.0"
      }
    },
    "longest": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
      "dev": true
    },
    "longest-streak": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz",
      "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==",
      "dev": true
    },
    "loose-envify": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
      "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
      "dev": true,
      "requires": {
        "js-tokens": "^3.0.0"
      },
      "dependencies": {
        "js-tokens": {
          "version": "3.0.2",
          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
          "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
          "dev": true
        }
      }
    },
    "loud-rejection": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
      "dev": true,
      "requires": {
        "currently-unhandled": "^0.4.1",
        "signal-exit": "^3.0.0"
      }
    },
    "lru-cache": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
      "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
      "dev": true,
      "requires": {
        "pseudomap": "^1.0.2",
        "yallist": "^2.1.2"
      }
    },
    "map-cache": {
      "version": "0.2.2",
      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
      "dev": true
    },
    "map-obj": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
      "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
      "dev": true
    },
    "map-visit": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
      "dev": true,
      "requires": {
        "object-visit": "^1.0.0"
      }
    },
    "markdown-escapes": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.1.tgz",
      "integrity": "sha1-GZTfLTr0gR3lmmcUk0wrIpJzRRg=",
      "dev": true
    },
    "markdown-table": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.1.tgz",
      "integrity": "sha1-Sz3ToTPRUYuO8NvHCb8qG0gkvIw=",
      "dev": true
    },
    "mdast-util-compact": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz",
      "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=",
      "dev": true,
      "requires": {
        "unist-util-modify-children": "^1.0.0",
        "unist-util-visit": "^1.1.0"
      }
    },
    "mdast-util-definitions": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.2.tgz",
      "integrity": "sha512-9NloPSwaB9f1PKcGqaScfqRf6zKOEjTIXVIbPOmgWI/JKxznlgVXC5C+8qgl3AjYg2vJBRgLYfLICaNiac89iA==",
      "dev": true,
      "requires": {
        "unist-util-visit": "^1.0.0"
      }
    },
    "mdast-util-inject": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz",
      "integrity": "sha1-2wa4tYW+lZotzS+H9HK6m3VvNnU=",
      "dev": true,
      "requires": {
        "mdast-util-to-string": "^1.0.0"
      }
    },
    "mdast-util-to-hast": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-3.0.0.tgz",
      "integrity": "sha512-zvEXH2AUevWfKuBqtEPNcDUPI8UC6yIVvgEgNi1v1dLnzb5Pfm+PZjnZn0FhW1WmHcrGMX059MAoqicEauzjcw==",
      "dev": true,
      "requires": {
        "collapse-white-space": "^1.0.0",
        "detab": "^2.0.0",
        "mdast-util-definitions": "^1.2.0",
        "mdurl": "^1.0.1",
        "trim": "0.0.1",
        "trim-lines": "^1.0.0",
        "unist-builder": "^1.0.1",
        "unist-util-generated": "^1.1.0",
        "unist-util-position": "^3.0.0",
        "unist-util-visit": "^1.1.0",
        "xtend": "^4.0.1"
      }
    },
    "mdast-util-to-string": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.0.4.tgz",
      "integrity": "sha1-XEVch4yTVfDB5/PotxnPWDaRrPs=",
      "dev": true
    },
    "mdast-util-toc": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-2.0.1.tgz",
      "integrity": "sha1-sdLLI7+wH4Evp7Vb/+iwqL7fbyE=",
      "dev": true,
      "requires": {
        "github-slugger": "^1.1.1",
        "mdast-util-to-string": "^1.0.2",
        "unist-util-visit": "^1.1.0"
      }
    },
    "mdurl": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
      "dev": true
    },
    "mem": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
      "dev": true,
      "requires": {
        "mimic-fn": "^1.0.0"
      }
    },
    "memory-fs": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz",
      "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=",
      "dev": true,
      "requires": {
        "errno": "^0.1.3",
        "readable-stream": "^2.0.1"
      }
    },
    "meow": {
      "version": "7.0.1",
      "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz",
      "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==",
      "dev": true,
      "requires": {
        "@types/minimist": "^1.2.0",
        "arrify": "^2.0.1",
        "camelcase": "^6.0.0",
        "camelcase-keys": "^6.2.2",
        "decamelize-keys": "^1.1.0",
        "hard-rejection": "^2.1.0",
        "minimist-options": "^4.0.2",
        "normalize-package-data": "^2.5.0",
        "read-pkg-up": "^7.0.1",
        "redent": "^3.0.0",
        "trim-newlines": "^3.0.0",
        "type-fest": "^0.13.1",
        "yargs-parser": "^18.1.3"
      },
      "dependencies": {
        "camelcase": {
          "version": "6.0.0",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz",
          "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==",
          "dev": true
        },
        "find-up": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
          "dev": true,
          "requires": {
            "locate-path": "^5.0.0",
            "path-exists": "^4.0.0"
          }
        },
        "locate-path": {
          "version": "5.0.0",
          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
          "dev": true,
          "requires": {
            "p-locate": "^4.1.0"
          }
        },
        "normalize-package-data": {
          "version": "2.5.0",
          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
          "dev": true,
          "requires": {
            "hosted-git-info": "^2.1.4",
            "resolve": "^1.10.0",
            "semver": "2 || 3 || 4 || 5",
            "validate-npm-package-license": "^3.0.1"
          }
        },
        "p-limit": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
          "dev": true,
          "requires": {
            "p-try": "^2.0.0"
          }
        },
        "p-locate": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
          "dev": true,
          "requires": {
            "p-limit": "^2.2.0"
          }
        },
        "parse-json": {
          "version": "5.0.0",
          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
          "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
          "dev": true,
          "requires": {
            "@babel/code-frame": "^7.0.0",
            "error-ex": "^1.3.1",
            "json-parse-better-errors": "^1.0.1",
            "lines-and-columns": "^1.1.6"
          }
        },
        "path-exists": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
          "dev": true
        },
        "path-parse": {
          "version": "1.0.6",
          "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
          "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
          "dev": true
        },
        "read-pkg": {
          "version": "5.2.0",
          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
          "dev": true,
          "requires": {
            "@types/normalize-package-data": "^2.4.0",
            "normalize-package-data": "^2.5.0",
            "parse-json": "^5.0.0",
            "type-fest": "^0.6.0"
          },
          "dependencies": {
            "type-fest": {
              "version": "0.6.0",
              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
              "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
              "dev": true
            }
          }
        },
        "read-pkg-up": {
          "version": "7.0.1",
          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
          "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
          "dev": true,
          "requires": {
            "find-up": "^4.1.0",
            "read-pkg": "^5.2.0",
            "type-fest": "^0.8.1"
          },
          "dependencies": {
            "type-fest": {
              "version": "0.8.1",
              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
              "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
              "dev": true
            }
          }
        },
        "resolve": {
          "version": "1.17.0",
          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
          "dev": true,
          "requires": {
            "path-parse": "^1.0.6"
          }
        },
        "yargs-parser": {
          "version": "18.1.3",
          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
          "dev": true,
          "requires": {
            "camelcase": "^5.0.0",
            "decamelize": "^1.2.0"
          },
          "dependencies": {
            "camelcase": {
              "version": "5.3.1",
              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
              "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
              "dev": true
            }
          }
        }
      }
    },
    "micromatch": {
      "version": "3.1.4",
      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.4.tgz",
      "integrity": "sha512-kFRtviKYoAJT+t7HggMl0tBFGNAKLw/S7N+CO9qfEQyisob1Oy4pao+geRbkyeEd+V9aOkvZ4mhuyPvI/q9Sfg==",
      "dev": true,
      "requires": {
        "arr-diff": "^4.0.0",
        "array-unique": "^0.3.2",
        "braces": "^2.3.0",
        "define-property": "^1.0.0",
        "extend-shallow": "^2.0.1",
        "extglob": "^2.0.2",
        "fragment-cache": "^0.2.1",
        "kind-of": "^6.0.0",
        "nanomatch": "^1.2.5",
        "object.pick": "^1.3.0",
        "regex-not": "^1.0.0",
        "snapdragon": "^0.8.1",
        "to-regex": "^3.0.1"
      },
      "dependencies": {
        "arr-diff": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
          "dev": true
        },
        "array-unique": {
          "version": "0.3.2",
          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
          "dev": true
        },
        "braces": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz",
          "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==",
          "dev": true,
          "requires": {
            "arr-flatten": "^1.1.0",
            "array-unique": "^0.3.2",
            "define-property": "^1.0.0",
            "extend-shallow": "^2.0.1",
            "fill-range": "^4.0.0",
            "isobject": "^3.0.1",
            "repeat-element": "^1.1.2",
            "snapdragon": "^0.8.1",
            "snapdragon-node": "^2.0.1",
            "split-string": "^3.0.2",
            "to-regex": "^3.0.1"
          }
        },
        "expand-brackets": {
          "version": "2.1.4",
          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
          "dev": true,
          "requires": {
            "debug": "^2.3.3",
            "define-property": "^0.2.5",
            "extend-shallow": "^2.0.1",
            "posix-character-classes": "^0.1.0",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "define-property": {
              "version": "0.2.5",
              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
              "dev": true,
              "requires": {
                "is-descriptor": "^0.1.0"
              }
            }
          }
        },
        "extglob": {
          "version": "2.0.2",
          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.2.tgz",
          "integrity": "sha512-I0+eZBH+jFGL8F5BnIz2ON2nKCjTS3AS3H/5PeSmCp7UVC70Ym8IhdRiQly2juKYQ//f7z1aj1BRpQniFJoU1w==",
          "dev": true,
          "requires": {
            "array-unique": "^0.3.2",
            "define-property": "^1.0.0",
            "expand-brackets": "^2.1.4",
            "extend-shallow": "^2.0.1",
            "fragment-cache": "^0.2.1",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.1"
          }
        },
        "fill-range": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
          "dev": true,
          "requires": {
            "extend-shallow": "^2.0.1",
            "is-number": "^3.0.0",
            "repeat-string": "^1.6.1",
            "to-regex-range": "^2.1.0"
          }
        },
        "is-descriptor": {
          "version": "0.1.6",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^0.1.6",
            "is-data-descriptor": "^0.1.4",
            "kind-of": "^5.0.0"
          },
          "dependencies": {
            "kind-of": {
              "version": "5.1.0",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
              "dev": true
            }
          }
        },
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          },
          "dependencies": {
            "kind-of": {
              "version": "3.2.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
              "dev": true,
              "requires": {
                "is-buffer": "^1.1.5"
              }
            }
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        }
      }
    },
    "mime": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
      "dev": true
    },
    "mimic-fn": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
      "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
      "dev": true
    },
    "min-indent": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
      "dev": true
    },
    "minimatch": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
      "dev": true,
      "requires": {
        "brace-expansion": "^1.1.7"
      }
    },
    "minimist": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
      "dev": true
    },
    "minimist-options": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
      "dev": true,
      "requires": {
        "arrify": "^1.0.1",
        "is-plain-obj": "^1.1.0",
        "kind-of": "^6.0.3"
      },
      "dependencies": {
        "arrify": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
          "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.3",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
          "dev": true
        }
      }
    },
    "mixin-deep": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
      "dev": true,
      "requires": {
        "for-in": "^1.0.2",
        "is-extendable": "^1.0.1"
      },
      "dependencies": {
        "is-extendable": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
          "dev": true,
          "requires": {
            "is-plain-object": "^2.0.4"
          }
        }
      }
    },
    "mkdirp": {
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
      "dev": true,
      "requires": {
        "minimist": "0.0.8"
      },
      "dependencies": {
        "minimist": {
          "version": "0.0.8",
          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
          "dev": true
        }
      }
    },
    "modify-values": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
      "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
      "dev": true
    },
    "module-deps-sortable": {
      "version": "4.0.6",
      "resolved": "https://registry.npmjs.org/module-deps-sortable/-/module-deps-sortable-4.0.6.tgz",
      "integrity": "sha1-ElGkuixEqS32mJvQKdoSGk8hCbA=",
      "dev": true,
      "requires": {
        "JSONStream": "^1.0.3",
        "browser-resolve": "^1.7.0",
        "concat-stream": "~1.5.0",
        "defined": "^1.0.0",
        "detective": "^4.0.0",
        "duplexer2": "^0.1.2",
        "inherits": "^2.0.1",
        "parents": "^1.0.0",
        "readable-stream": "^2.0.2",
        "resolve": "^1.1.3",
        "stream-combiner2": "^1.1.1",
        "subarg": "^1.0.0",
        "through2": "^2.0.0",
        "xtend": "^4.0.0"
      },
      "dependencies": {
        "concat-stream": {
          "version": "1.5.2",
          "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
          "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
          "dev": true,
          "requires": {
            "inherits": "~2.0.1",
            "readable-stream": "~2.0.0",
            "typedarray": "~0.0.5"
          },
          "dependencies": {
            "readable-stream": {
              "version": "2.0.6",
              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
              "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
              "dev": true,
              "requires": {
                "core-util-is": "~1.0.0",
                "inherits": "~2.0.1",
                "isarray": "~1.0.0",
                "process-nextick-args": "~1.0.6",
                "string_decoder": "~0.10.x",
                "util-deprecate": "~1.0.1"
              }
            }
          }
        },
        "string_decoder": {
          "version": "0.10.31",
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
          "dev": true
        }
      }
    },
    "ms": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
      "dev": true
    },
    "nan": {
      "version": "2.8.0",
      "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
      "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
      "dev": true,
      "optional": true
    },
    "nanomatch": {
      "version": "1.2.6",
      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.6.tgz",
      "integrity": "sha512-WJ6XTCbvWXUFPbi/bDwKcYkCeOGUHzaJj72KbuPqGn78Ba/F5Vu26Zlo6SuMQbCIst1RGKL1zfWBCOGAlbRLAg==",
      "dev": true,
      "requires": {
        "arr-diff": "^4.0.0",
        "array-unique": "^0.3.2",
        "define-property": "^1.0.0",
        "extend-shallow": "^2.0.1",
        "fragment-cache": "^0.2.1",
        "is-odd": "^1.0.0",
        "kind-of": "^5.0.2",
        "object.pick": "^1.3.0",
        "regex-not": "^1.0.0",
        "snapdragon": "^0.8.1",
        "to-regex": "^3.0.1"
      },
      "dependencies": {
        "arr-diff": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
          "dev": true
        },
        "array-unique": {
          "version": "0.3.2",
          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
          "dev": true
        },
        "kind-of": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
          "dev": true
        }
      }
    },
    "neo-async": {
      "version": "2.6.2",
      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
      "dev": true
    },
    "node-libs-browser": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz",
      "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=",
      "dev": true,
      "requires": {
        "assert": "^1.1.1",
        "browserify-zlib": "^0.1.4",
        "buffer": "^4.9.0",
        "console-browserify": "^1.1.0",
        "constants-browserify": "^1.0.0",
        "crypto-browserify": "3.3.0",
        "domain-browser": "^1.1.1",
        "events": "^1.0.0",
        "https-browserify": "0.0.1",
        "os-browserify": "^0.2.0",
        "path-browserify": "0.0.0",
        "process": "^0.11.0",
        "punycode": "^1.2.4",
        "querystring-es3": "^0.2.0",
        "readable-stream": "^2.0.5",
        "stream-browserify": "^2.0.1",
        "stream-http": "^2.3.1",
        "string_decoder": "^0.10.25",
        "timers-browserify": "^2.0.2",
        "tty-browserify": "0.0.0",
        "url": "^0.11.0",
        "util": "^0.10.3",
        "vm-browserify": "0.0.4"
      },
      "dependencies": {
        "string_decoder": {
          "version": "0.10.31",
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
          "dev": true
        }
      }
    },
    "normalize-package-data": {
      "version": "2.4.0",
      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
      "dev": true,
      "requires": {
        "hosted-git-info": "^2.1.4",
        "is-builtin-module": "^1.0.0",
        "semver": "2 || 3 || 4 || 5",
        "validate-npm-package-license": "^3.0.1"
      }
    },
    "normalize-path": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
      "dev": true,
      "requires": {
        "remove-trailing-separator": "^1.0.1"
      }
    },
    "now-and-later": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz",
      "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=",
      "dev": true,
      "requires": {
        "once": "^1.3.2"
      }
    },
    "npm-run-path": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
      "dev": true,
      "requires": {
        "path-key": "^2.0.0"
      }
    },
    "null-check": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
      "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
      "dev": true
    },
    "number-is-nan": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
      "dev": true
    },
    "object-assign": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
      "dev": true
    },
    "object-copy": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
      "dev": true,
      "requires": {
        "copy-descriptor": "^0.1.0",
        "define-property": "^0.2.5",
        "kind-of": "^3.0.3"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        },
        "is-descriptor": {
          "version": "0.1.6",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^0.1.6",
            "is-data-descriptor": "^0.1.4",
            "kind-of": "^5.0.0"
          },
          "dependencies": {
            "kind-of": {
              "version": "5.1.0",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
              "dev": true
            }
          }
        }
      }
    },
    "object-keys": {
      "version": "1.0.11",
      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
      "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
      "dev": true
    },
    "object-visit": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
      "dev": true,
      "requires": {
        "isobject": "^3.0.0"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "object.assign": {
      "version": "4.0.4",
      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz",
      "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=",
      "dev": true,
      "requires": {
        "define-properties": "^1.1.2",
        "function-bind": "^1.1.0",
        "object-keys": "^1.0.10"
      }
    },
    "object.omit": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
      "dev": true,
      "requires": {
        "for-own": "^0.1.4",
        "is-extendable": "^0.1.1"
      }
    },
    "object.pick": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
      "dev": true,
      "requires": {
        "isobject": "^3.0.1"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
      "dev": true,
      "requires": {
        "wrappy": "1"
      }
    },
    "optimist": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
      "dev": true,
      "requires": {
        "minimist": "~0.0.1",
        "wordwrap": "~0.0.2"
      },
      "dependencies": {
        "minimist": {
          "version": "0.0.10",
          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
          "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
          "dev": true
        }
      }
    },
    "ordered-read-streams": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
      "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
      "dev": true,
      "requires": {
        "readable-stream": "^2.0.1"
      }
    },
    "os-browserify": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz",
      "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=",
      "dev": true
    },
    "os-homedir": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
      "dev": true
    },
    "os-locale": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
      "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
      "dev": true,
      "requires": {
        "execa": "^0.7.0",
        "lcid": "^1.0.0",
        "mem": "^1.1.0"
      }
    },
    "os-tmpdir": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
      "dev": true
    },
    "output-file-sync": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
      "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
      "dev": true,
      "requires": {
        "graceful-fs": "^4.1.4",
        "mkdirp": "^0.5.1",
        "object-assign": "^4.1.0"
      }
    },
    "p-finally": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
      "dev": true
    },
    "p-limit": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
      "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=",
      "dev": true
    },
    "p-locate": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
      "dev": true,
      "requires": {
        "p-limit": "^1.1.0"
      }
    },
    "p-try": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
      "dev": true
    },
    "pako": {
      "version": "0.2.9",
      "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
      "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
      "dev": true
    },
    "parents": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
      "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
      "dev": true,
      "requires": {
        "path-platform": "~0.11.15"
      }
    },
    "parse-entities": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.1.tgz",
      "integrity": "sha1-gRLYhHExnyerrk1klksSL+ThuJA=",
      "dev": true,
      "requires": {
        "character-entities": "^1.0.0",
        "character-entities-legacy": "^1.0.0",
        "character-reference-invalid": "^1.0.0",
        "is-alphanumerical": "^1.0.0",
        "is-decimal": "^1.0.0",
        "is-hexadecimal": "^1.0.0"
      }
    },
    "parse-filepath": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz",
      "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=",
      "dev": true,
      "requires": {
        "is-absolute": "^0.2.3",
        "map-cache": "^0.2.0",
        "path-root": "^0.1.1"
      }
    },
    "parse-git-config": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-0.2.0.tgz",
      "integrity": "sha1-Jygz/dFf6hRvt10zbSNrljtv9wY=",
      "dev": true,
      "requires": {
        "ini": "^1.3.3"
      }
    },
    "parse-github-repo-url": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
      "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=",
      "dev": true
    },
    "parse-glob": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
      "dev": true,
      "requires": {
        "glob-base": "^0.3.0",
        "is-dotfile": "^1.0.0",
        "is-extglob": "^1.0.0",
        "is-glob": "^2.0.0"
      }
    },
    "parse-json": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
      "dev": true,
      "requires": {
        "error-ex": "^1.3.1",
        "json-parse-better-errors": "^1.0.1"
      }
    },
    "parse-url": {
      "version": "1.3.11",
      "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz",
      "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=",
      "dev": true,
      "requires": {
        "is-ssh": "^1.3.0",
        "protocols": "^1.4.0"
      }
    },
    "pascalcase": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
      "dev": true
    },
    "path-browserify": {
      "version": "0.0.0",
      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
      "dev": true
    },
    "path-dirname": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
      "dev": true
    },
    "path-exists": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
      "dev": true
    },
    "path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
      "dev": true
    },
    "path-key": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
      "dev": true
    },
    "path-parse": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
      "dev": true
    },
    "path-platform": {
      "version": "0.11.15",
      "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
      "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
      "dev": true
    },
    "path-root": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
      "dev": true,
      "requires": {
        "path-root-regex": "^0.1.0"
      }
    },
    "path-root-regex": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
      "dev": true
    },
    "path-type": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
      "dev": true,
      "requires": {
        "pify": "^3.0.0"
      }
    },
    "pbkdf2-compat": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz",
      "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=",
      "dev": true
    },
    "pify": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
      "dev": true
    },
    "pinkie": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
      "dev": true
    },
    "pinkie-promise": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
      "dev": true,
      "requires": {
        "pinkie": "^2.0.0"
      }
    },
    "posix-character-classes": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
      "dev": true
    },
    "preserve": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
      "dev": true
    },
    "private": {
      "version": "0.1.8",
      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
      "dev": true
    },
    "process": {
      "version": "0.11.10",
      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
      "dev": true
    },
    "process-nextick-args": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
      "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
      "dev": true
    },
    "property-information": {
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/property-information/-/property-information-3.2.0.tgz",
      "integrity": "sha1-/RSDyPusYYCPX+NZ52k6H0ilgzE=",
      "dev": true
    },
    "protocols": {
      "version": "1.4.6",
      "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.6.tgz",
      "integrity": "sha1-+LsmPqG1/Xp2BNJri+Ob13Z4v4o=",
      "dev": true
    },
    "prr": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
      "dev": true
    },
    "pseudomap": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
      "dev": true
    },
    "pump": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
      "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
      "dev": true,
      "requires": {
        "end-of-stream": "^1.1.0",
        "once": "^1.3.1"
      }
    },
    "pumpify": {
      "version": "1.3.5",
      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz",
      "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=",
      "dev": true,
      "requires": {
        "duplexify": "^3.1.2",
        "inherits": "^2.0.1",
        "pump": "^1.0.0"
      }
    },
    "punycode": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
      "dev": true
    },
    "q": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
      "dev": true
    },
    "qs": {
      "version": "6.5.1",
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
      "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
      "dev": true
    },
    "querystring": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
      "dev": true
    },
    "querystring-es3": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
      "dev": true
    },
    "quick-lru": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
      "dev": true
    },
    "randomatic": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
      "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
      "dev": true,
      "requires": {
        "is-number": "^3.0.0",
        "kind-of": "^4.0.0"
      },
      "dependencies": {
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          },
          "dependencies": {
            "kind-of": {
              "version": "3.2.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
              "dev": true,
              "requires": {
                "is-buffer": "^1.1.5"
              }
            }
          }
        },
        "kind-of": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
          "dev": true,
          "requires": {
            "is-buffer": "^1.1.5"
          }
        }
      }
    },
    "raw-body": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
      "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
      "dev": true,
      "requires": {
        "bytes": "1",
        "string_decoder": "0.10"
      },
      "dependencies": {
        "string_decoder": {
          "version": "0.10.31",
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
          "dev": true
        }
      }
    },
    "rcfinder": {
      "version": "0.1.9",
      "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz",
      "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=",
      "dev": true,
      "requires": {
        "lodash.clonedeep": "^4.3.2"
      }
    },
    "rcloader": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.1.2.tgz",
      "integrity": "sha1-oJY6ZDfQnvjLktky0trUl7DRc2w=",
      "dev": true,
      "requires": {
        "lodash": "~2.4.1",
        "rcfinder": "~0.1.6"
      },
      "dependencies": {
        "lodash": {
          "version": "2.4.2",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
          "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
          "dev": true
        }
      }
    },
    "read-pkg": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
      "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
      "dev": true,
      "requires": {
        "load-json-file": "^4.0.0",
        "normalize-package-data": "^2.3.2",
        "path-type": "^3.0.0"
      }
    },
    "read-pkg-up": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
      "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
      "dev": true,
      "requires": {
        "find-up": "^2.0.0",
        "read-pkg": "^3.0.0"
      }
    },
    "readable-stream": {
      "version": "2.3.3",
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
      "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
      "dev": true,
      "requires": {
        "core-util-is": "~1.0.0",
        "inherits": "~2.0.3",
        "isarray": "~1.0.0",
        "process-nextick-args": "~1.0.6",
        "safe-buffer": "~5.1.1",
        "string_decoder": "~1.0.3",
        "util-deprecate": "~1.0.1"
      }
    },
    "readdirp": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
      "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
      "dev": true,
      "requires": {
        "graceful-fs": "^4.1.2",
        "minimatch": "^3.0.2",
        "readable-stream": "^2.0.2",
        "set-immediate-shim": "^1.0.1"
      }
    },
    "recast": {
      "version": "0.11.23",
      "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz",
      "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=",
      "dev": true,
      "requires": {
        "ast-types": "0.9.6",
        "esprima": "~3.1.0",
        "private": "~0.1.5",
        "source-map": "~0.5.0"
      },
      "dependencies": {
        "ast-types": {
          "version": "0.9.6",
          "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
          "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=",
          "dev": true
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        }
      }
    },
    "rechoir": {
      "version": "0.6.2",
      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
      "dev": true,
      "requires": {
        "resolve": "^1.1.6"
      }
    },
    "redent": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
      "dev": true,
      "requires": {
        "indent-string": "^4.0.0",
        "strip-indent": "^3.0.0"
      }
    },
    "regenerate": {
      "version": "1.3.3",
      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
      "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
      "dev": true
    },
    "regenerator-babel": {
      "version": "0.8.13-2",
      "resolved": "https://registry.npmjs.org/regenerator-babel/-/regenerator-babel-0.8.13-2.tgz",
      "integrity": "sha1-HAdf9SQgjpNZFBkYCNB5j9j7xOU=",
      "dev": true,
      "requires": {
        "ast-types": "~0.7.0",
        "commoner": "~0.10.0",
        "private": "~0.1.5",
        "through": "~2.3.6"
      }
    },
    "regenerator-runtime": {
      "version": "0.11.1",
      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
      "dev": true
    },
    "regenerator-transform": {
      "version": "0.10.1",
      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
      "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
      "dev": true,
      "requires": {
        "babel-runtime": "^6.18.0",
        "babel-types": "^6.19.0",
        "private": "^0.1.6"
      }
    },
    "regex-cache": {
      "version": "0.4.4",
      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
      "dev": true,
      "requires": {
        "is-equal-shallow": "^0.1.3"
      }
    },
    "regex-not": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz",
      "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=",
      "dev": true,
      "requires": {
        "extend-shallow": "^2.0.1"
      }
    },
    "regexpu": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz",
      "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=",
      "dev": true,
      "requires": {
        "esprima": "^2.6.0",
        "recast": "^0.10.10",
        "regenerate": "^1.2.1",
        "regjsgen": "^0.2.0",
        "regjsparser": "^0.1.4"
      },
      "dependencies": {
        "ast-types": {
          "version": "0.8.15",
          "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.15.tgz",
          "integrity": "sha1-ju8IJ/BN/w7IhXupJavj/qYZTlI=",
          "dev": true
        },
        "esprima": {
          "version": "2.7.3",
          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
          "dev": true
        },
        "recast": {
          "version": "0.10.43",
          "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.43.tgz",
          "integrity": "sha1-uV1Q9tYHYaX2JS4V2AZ4FoSRzn8=",
          "dev": true,
          "requires": {
            "ast-types": "0.8.15",
            "esprima-fb": "~15001.1001.0-dev-harmony-fb",
            "private": "~0.1.5",
            "source-map": "~0.5.0"
          },
          "dependencies": {
            "esprima-fb": {
              "version": "15001.1001.0-dev-harmony-fb",
              "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz",
              "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=",
              "dev": true
            }
          }
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        }
      }
    },
    "regexpu-core": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
      "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
      "dev": true,
      "requires": {
        "regenerate": "^1.2.1",
        "regjsgen": "^0.2.0",
        "regjsparser": "^0.1.4"
      }
    },
    "regjsgen": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
      "dev": true
    },
    "regjsparser": {
      "version": "0.1.5",
      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
      "dev": true,
      "requires": {
        "jsesc": "~0.5.0"
      }
    },
    "remark": {
      "version": "8.0.0",
      "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz",
      "integrity": "sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw==",
      "dev": true,
      "requires": {
        "remark-parse": "^4.0.0",
        "remark-stringify": "^4.0.0",
        "unified": "^6.0.0"
      }
    },
    "remark-html": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-7.0.0.tgz",
      "integrity": "sha512-jqRzkZXCkM12gIY2ibMLTW41m7rfanliMTVQCFTezHJFsbH00YaTox/BX4gU+f/zCdzfhFJONtebFByvpMv37w==",
      "dev": true,
      "requires": {
        "hast-util-sanitize": "^1.0.0",
        "hast-util-to-html": "^3.0.0",
        "mdast-util-to-hast": "^3.0.0",
        "xtend": "^4.0.1"
      }
    },
    "remark-parse": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz",
      "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==",
      "dev": true,
      "requires": {
        "collapse-white-space": "^1.0.2",
        "is-alphabetical": "^1.0.0",
        "is-decimal": "^1.0.0",
        "is-whitespace-character": "^1.0.0",
        "is-word-character": "^1.0.0",
        "markdown-escapes": "^1.0.0",
        "parse-entities": "^1.0.2",
        "repeat-string": "^1.5.4",
        "state-toggle": "^1.0.0",
        "trim": "0.0.1",
        "trim-trailing-lines": "^1.0.0",
        "unherit": "^1.0.4",
        "unist-util-remove-position": "^1.0.0",
        "vfile-location": "^2.0.0",
        "xtend": "^4.0.1"
      }
    },
    "remark-slug": {
      "version": "4.2.3",
      "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-4.2.3.tgz",
      "integrity": "sha1-jZh9Dl5j1KSeo3uQ/pmaPc/IG3I=",
      "dev": true,
      "requires": {
        "github-slugger": "^1.0.0",
        "mdast-util-to-string": "^1.0.0",
        "unist-util-visit": "^1.0.0"
      }
    },
    "remark-stringify": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-4.0.0.tgz",
      "integrity": "sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w==",
      "dev": true,
      "requires": {
        "ccount": "^1.0.0",
        "is-alphanumeric": "^1.0.0",
        "is-decimal": "^1.0.0",
        "is-whitespace-character": "^1.0.0",
        "longest-streak": "^2.0.1",
        "markdown-escapes": "^1.0.0",
        "markdown-table": "^1.1.0",
        "mdast-util-compact": "^1.0.0",
        "parse-entities": "^1.0.2",
        "repeat-string": "^1.5.4",
        "state-toggle": "^1.0.0",
        "stringify-entities": "^1.0.1",
        "unherit": "^1.0.4",
        "xtend": "^4.0.1"
      }
    },
    "remark-toc": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-4.0.1.tgz",
      "integrity": "sha1-/zb/beVOoH3Vnj9TNKSjqsHpMYU=",
      "dev": true,
      "requires": {
        "mdast-util-toc": "^2.0.0",
        "remark-slug": "^4.0.0"
      }
    },
    "remote-origin-url": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-0.4.0.tgz",
      "integrity": "sha1-TT4pAvNOLTfRwmPYdxC3frQIajA=",
      "dev": true,
      "requires": {
        "parse-git-config": "^0.2.0"
      }
    },
    "remove-bom-buffer": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
      "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
      "dev": true,
      "requires": {
        "is-buffer": "^1.1.5",
        "is-utf8": "^0.2.1"
      }
    },
    "remove-bom-stream": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
      "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
      "dev": true,
      "requires": {
        "remove-bom-buffer": "^3.0.0",
        "safe-buffer": "^5.1.0",
        "through2": "^2.0.3"
      }
    },
    "remove-trailing-separator": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
      "dev": true
    },
    "repeat-element": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
      "dev": true
    },
    "repeat-string": {
      "version": "1.6.1",
      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
      "dev": true
    },
    "repeating": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz",
      "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=",
      "dev": true,
      "requires": {
        "is-finite": "^1.0.0"
      }
    },
    "replace-ext": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
      "dev": true
    },
    "require-directory": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
      "dev": true
    },
    "require-main-filename": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
      "dev": true
    },
    "resolve": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
      "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
      "dev": true,
      "requires": {
        "path-parse": "^1.0.5"
      }
    },
    "resolve-options": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
      "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
      "dev": true,
      "requires": {
        "value-or-function": "^3.0.0"
      }
    },
    "resolve-url": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
      "dev": true
    },
    "right-align": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
      "dev": true,
      "requires": {
        "align-text": "^0.1.1"
      }
    },
    "ripemd160": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz",
      "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=",
      "dev": true
    },
    "rsvp": {
      "version": "3.6.2",
      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz",
      "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==",
      "dev": true
    },
    "safe-buffer": {
      "version": "5.1.1",
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
      "dev": true
    },
    "safe-json-parse": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
      "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=",
      "dev": true
    },
    "semver": {
      "version": "5.4.1",
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
      "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
      "dev": true
    },
    "set-blocking": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
      "dev": true
    },
    "set-getter": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
      "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
      "dev": true,
      "requires": {
        "to-object-path": "^0.3.0"
      }
    },
    "set-immediate-shim": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
      "dev": true
    },
    "set-value": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
      "dev": true,
      "requires": {
        "extend-shallow": "^2.0.1",
        "is-extendable": "^0.1.1",
        "is-plain-object": "^2.0.3",
        "split-string": "^3.0.1"
      }
    },
    "setimmediate": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
      "dev": true
    },
    "sha.js": {
      "version": "2.2.6",
      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz",
      "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=",
      "dev": true
    },
    "shebang-command": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
      "dev": true,
      "requires": {
        "shebang-regex": "^1.0.0"
      }
    },
    "shebang-regex": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
      "dev": true
    },
    "shelljs": {
      "version": "0.7.8",
      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
      "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
      "dev": true,
      "requires": {
        "glob": "^7.0.0",
        "interpret": "^1.0.0",
        "rechoir": "^0.6.2"
      },
      "dependencies": {
        "glob": {
          "version": "7.1.2",
          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
          "dev": true,
          "requires": {
            "fs.realpath": "^1.0.0",
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "^3.0.4",
            "once": "^1.3.0",
            "path-is-absolute": "^1.0.0"
          }
        }
      }
    },
    "signal-exit": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
      "dev": true
    },
    "sji": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/sji/-/sji-0.0.1.tgz",
      "integrity": "sha1-RtVhIvhmU5LCwZb45Cwm8lT5w0Y=",
      "dev": true
    },
    "slash": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
      "dev": true
    },
    "snapdragon": {
      "version": "0.8.1",
      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz",
      "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
      "dev": true,
      "requires": {
        "base": "^0.11.1",
        "debug": "^2.2.0",
        "define-property": "^0.2.5",
        "extend-shallow": "^2.0.1",
        "map-cache": "^0.2.2",
        "source-map": "^0.5.6",
        "source-map-resolve": "^0.5.0",
        "use": "^2.0.0"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        },
        "is-descriptor": {
          "version": "0.1.6",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^0.1.6",
            "is-data-descriptor": "^0.1.4",
            "kind-of": "^5.0.0"
          }
        },
        "kind-of": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
          "dev": true
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        }
      }
    },
    "snapdragon-node": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
      "dev": true,
      "requires": {
        "define-property": "^1.0.0",
        "isobject": "^3.0.0",
        "snapdragon-util": "^3.0.1"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "snapdragon-util": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
      "dev": true,
      "requires": {
        "kind-of": "^3.2.0"
      }
    },
    "source-list-map": {
      "version": "0.1.8",
      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
      "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=",
      "dev": true
    },
    "source-map": {
      "version": "0.4.4",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
      "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
      "dev": true,
      "requires": {
        "amdefine": ">=0.0.4"
      }
    },
    "source-map-resolve": {
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
      "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
      "dev": true,
      "requires": {
        "atob": "^2.0.0",
        "decode-uri-component": "^0.2.0",
        "resolve-url": "^0.2.1",
        "source-map-url": "^0.4.0",
        "urix": "^0.1.0"
      }
    },
    "source-map-support": {
      "version": "0.2.10",
      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz",
      "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=",
      "dev": true,
      "requires": {
        "source-map": "0.1.32"
      },
      "dependencies": {
        "source-map": {
          "version": "0.1.32",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz",
          "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=",
          "dev": true,
          "requires": {
            "amdefine": ">=0.0.4"
          }
        }
      }
    },
    "source-map-url": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
      "dev": true
    },
    "space-separated-tokens": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.1.tgz",
      "integrity": "sha1-lpW5355lrsGBHUw/nOUlILwvfk0=",
      "dev": true,
      "requires": {
        "trim": "0.0.1"
      }
    },
    "spdx-correct": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
      "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
      "dev": true,
      "requires": {
        "spdx-license-ids": "^1.0.2"
      }
    },
    "spdx-expression-parse": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
      "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
      "dev": true
    },
    "spdx-license-ids": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
      "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
      "dev": true
    },
    "split": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
      "dev": true,
      "requires": {
        "through": "2"
      }
    },
    "split-string": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
      "dev": true,
      "requires": {
        "extend-shallow": "^3.0.0"
      },
      "dependencies": {
        "extend-shallow": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.1.tgz",
          "integrity": "sha512-Fg1xXAv+qXKdwHiJFMcZSqsMcbPlkzsZtf8KkLJ2fqnP+lqg2RjEKgDcSfO9CO1+p4LZKgApDBUUUqKaaRhwZQ==",
          "dev": true,
          "requires": {
            "is-extendable": "^1.0.1"
          }
        },
        "is-extendable": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
          "dev": true,
          "requires": {
            "is-plain-object": "^2.0.4"
          }
        }
      }
    },
    "split2": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
      "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
      "dev": true,
      "requires": {
        "through2": "^2.0.2"
      }
    },
    "sprintf-js": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
      "dev": true
    },
    "standard-version": {
      "version": "8.0.1",
      "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-8.0.1.tgz",
      "integrity": "sha512-FLZdjvL2tBdwlctfQeyBf4+dX+SFljwdWfUA0F3wPiU9Rn0+FSuD3I0WXuzC1RmcaWwU5WL3EyV4Aanejc8Pqg==",
      "dev": true,
      "requires": {
        "chalk": "^2.4.2",
        "conventional-changelog": "3.1.21",
        "conventional-changelog-config-spec": "2.1.0",
        "conventional-changelog-conventionalcommits": "4.3.0",
        "conventional-recommended-bump": "6.0.9",
        "detect-indent": "^6.0.0",
        "detect-newline": "^3.1.0",
        "dotgitignore": "^2.1.0",
        "figures": "^3.1.0",
        "find-up": "^4.1.0",
        "fs-access": "^1.0.1",
        "git-semver-tags": "^4.0.0",
        "semver": "^7.1.1",
        "stringify-package": "^1.0.1",
        "yargs": "^15.3.1"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "5.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
          "dev": true
        },
        "ansi-styles": {
          "version": "3.2.1",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
          "dev": true,
          "requires": {
            "color-convert": "^1.9.0"
          }
        },
        "camelcase": {
          "version": "5.3.1",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
          "dev": true
        },
        "chalk": {
          "version": "2.4.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
          "dev": true,
          "requires": {
            "ansi-styles": "^3.2.1",
            "escape-string-regexp": "^1.0.5",
            "supports-color": "^5.3.0"
          }
        },
        "cliui": {
          "version": "6.0.0",
          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
          "dev": true,
          "requires": {
            "string-width": "^4.2.0",
            "strip-ansi": "^6.0.0",
            "wrap-ansi": "^6.2.0"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true
        },
        "detect-indent": {
          "version": "6.0.0",
          "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
          "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==",
          "dev": true
        },
        "emoji-regex": {
          "version": "8.0.0",
          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
          "dev": true
        },
        "find-up": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
          "dev": true,
          "requires": {
            "locate-path": "^5.0.0",
            "path-exists": "^4.0.0"
          }
        },
        "get-caller-file": {
          "version": "2.0.5",
          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
          "dev": true
        },
        "has-flag": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
          "dev": true
        },
        "is-fullwidth-code-point": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
          "dev": true
        },
        "locate-path": {
          "version": "5.0.0",
          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
          "dev": true,
          "requires": {
            "p-locate": "^4.1.0"
          }
        },
        "p-limit": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
          "dev": true,
          "requires": {
            "p-try": "^2.0.0"
          }
        },
        "p-locate": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
          "dev": true,
          "requires": {
            "p-limit": "^2.2.0"
          }
        },
        "path-exists": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
          "dev": true
        },
        "require-main-filename": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
          "dev": true
        },
        "semver": {
          "version": "7.3.2",
          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
          "dev": true
        },
        "string-width": {
          "version": "4.2.0",
          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
          "dev": true,
          "requires": {
            "emoji-regex": "^8.0.0",
            "is-fullwidth-code-point": "^3.0.0",
            "strip-ansi": "^6.0.0"
          }
        },
        "strip-ansi": {
          "version": "6.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
          "dev": true,
          "requires": {
            "ansi-regex": "^5.0.0"
          }
        },
        "supports-color": {
          "version": "5.5.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
          "dev": true,
          "requires": {
            "has-flag": "^3.0.0"
          }
        },
        "wrap-ansi": {
          "version": "6.2.0",
          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
          "dev": true,
          "requires": {
            "ansi-styles": "^4.0.0",
            "string-width": "^4.1.0",
            "strip-ansi": "^6.0.0"
          },
          "dependencies": {
            "ansi-styles": {
              "version": "4.2.1",
              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
              "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
              "dev": true,
              "requires": {
                "@types/color-name": "^1.1.1",
                "color-convert": "^2.0.1"
              }
            },
            "color-convert": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
              "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
              "dev": true,
              "requires": {
                "color-name": "~1.1.4"
              }
            }
          }
        },
        "y18n": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
          "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
          "dev": true
        },
        "yargs": {
          "version": "15.4.1",
          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
          "dev": true,
          "requires": {
            "cliui": "^6.0.0",
            "decamelize": "^1.2.0",
            "find-up": "^4.1.0",
            "get-caller-file": "^2.0.1",
            "require-directory": "^2.1.1",
            "require-main-filename": "^2.0.0",
            "set-blocking": "^2.0.0",
            "string-width": "^4.2.0",
            "which-module": "^2.0.0",
            "y18n": "^4.0.0",
            "yargs-parser": "^18.1.2"
          }
        },
        "yargs-parser": {
          "version": "18.1.3",
          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
          "dev": true,
          "requires": {
            "camelcase": "^5.0.0",
            "decamelize": "^1.2.0"
          }
        }
      }
    },
    "state-toggle": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.0.tgz",
      "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=",
      "dev": true
    },
    "static-extend": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
      "dev": true,
      "requires": {
        "define-property": "^0.2.5",
        "object-copy": "^0.1.0"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        },
        "is-descriptor": {
          "version": "0.1.6",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^0.1.6",
            "is-data-descriptor": "^0.1.4",
            "kind-of": "^5.0.0"
          }
        },
        "kind-of": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
          "dev": true
        }
      }
    },
    "stream-array": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/stream-array/-/stream-array-1.1.2.tgz",
      "integrity": "sha1-nl9zRfITfDDuO0mLkRToC1K7frU=",
      "dev": true,
      "requires": {
        "readable-stream": "~2.1.0"
      },
      "dependencies": {
        "readable-stream": {
          "version": "2.1.5",
          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz",
          "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=",
          "dev": true,
          "requires": {
            "buffer-shims": "^1.0.0",
            "core-util-is": "~1.0.0",
            "inherits": "~2.0.1",
            "isarray": "~1.0.0",
            "process-nextick-args": "~1.0.6",
            "string_decoder": "~0.10.x",
            "util-deprecate": "~1.0.1"
          }
        },
        "string_decoder": {
          "version": "0.10.31",
          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
          "dev": true
        }
      }
    },
    "stream-browserify": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
      "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
      "dev": true,
      "requires": {
        "inherits": "~2.0.1",
        "readable-stream": "^2.0.2"
      }
    },
    "stream-combiner2": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
      "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
      "dev": true,
      "requires": {
        "duplexer2": "~0.1.0",
        "readable-stream": "^2.0.2"
      }
    },
    "stream-http": {
      "version": "2.7.2",
      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz",
      "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==",
      "dev": true,
      "requires": {
        "builtin-status-codes": "^3.0.0",
        "inherits": "^2.0.1",
        "readable-stream": "^2.2.6",
        "to-arraybuffer": "^1.0.0",
        "xtend": "^4.0.0"
      }
    },
    "stream-shift": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
      "dev": true
    },
    "string-template": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
      "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
      "dev": true
    },
    "string-width": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
      "dev": true,
      "requires": {
        "code-point-at": "^1.0.0",
        "is-fullwidth-code-point": "^1.0.0",
        "strip-ansi": "^3.0.0"
      }
    },
    "string_decoder": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
      "dev": true,
      "requires": {
        "safe-buffer": "~5.1.0"
      }
    },
    "stringify-entities": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.1.tgz",
      "integrity": "sha1-sVDsLXKsTBtfMktR+2soyc3/BYw=",
      "dev": true,
      "requires": {
        "character-entities-html4": "^1.0.0",
        "character-entities-legacy": "^1.0.0",
        "is-alphanumerical": "^1.0.0",
        "is-hexadecimal": "^1.0.0"
      }
    },
    "stringify-package": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz",
      "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==",
      "dev": true
    },
    "strip-ansi": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
      "dev": true,
      "requires": {
        "ansi-regex": "^2.0.0"
      }
    },
    "strip-bom": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
      "dev": true
    },
    "strip-eof": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
      "dev": true
    },
    "strip-indent": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
      "dev": true,
      "requires": {
        "min-indent": "^1.0.0"
      }
    },
    "strip-json-comments": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
      "dev": true
    },
    "subarg": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
      "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
      "dev": true,
      "requires": {
        "minimist": "^1.1.0"
      }
    },
    "supports-color": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
      "dev": true
    },
    "tapable": {
      "version": "0.1.10",
      "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz",
      "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=",
      "dev": true
    },
    "text-extensions": {
      "version": "1.9.0",
      "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
      "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
      "dev": true
    },
    "through": {
      "version": "2.3.8",
      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
      "dev": true
    },
    "through2": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
      "dev": true,
      "requires": {
        "readable-stream": "^2.1.5",
        "xtend": "~4.0.1"
      }
    },
    "through2-filter": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
      "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
      "dev": true,
      "requires": {
        "through2": "~2.0.0",
        "xtend": "~4.0.0"
      }
    },
    "timers-browserify": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz",
      "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==",
      "dev": true,
      "requires": {
        "setimmediate": "^1.0.4"
      }
    },
    "tiny-lr": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.0.5.tgz",
      "integrity": "sha512-YrxUSiMgOVh3PnAqtdAUQuUVEVRnqcRCxJ3BHrl/aaWV2fplKKB60oClM0GH2Gio2hcXvkxMUxsC/vXZrQePlg==",
      "dev": true,
      "requires": {
        "body": "^5.1.0",
        "debug": "~2.6.7",
        "faye-websocket": "~0.10.0",
        "livereload-js": "^2.2.2",
        "object-assign": "^4.1.0",
        "qs": "^6.4.0"
      }
    },
    "to-absolute-glob": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.1.tgz",
      "integrity": "sha1-cMN1gFueMQXome6NvdapqhCPQHs=",
      "dev": true,
      "requires": {
        "extend-shallow": "^2.0.1",
        "is-absolute": "^0.2.5",
        "is-negated-glob": "^1.0.0"
      }
    },
    "to-arraybuffer": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
      "dev": true
    },
    "to-fast-properties": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
      "dev": true
    },
    "to-object-path": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2"
      }
    },
    "to-regex": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz",
      "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=",
      "dev": true,
      "requires": {
        "define-property": "^0.2.5",
        "extend-shallow": "^2.0.1",
        "regex-not": "^1.0.0"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        },
        "is-descriptor": {
          "version": "0.1.6",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^0.1.6",
            "is-data-descriptor": "^0.1.4",
            "kind-of": "^5.0.0"
          }
        },
        "kind-of": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
          "dev": true
        }
      }
    },
    "to-regex-range": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
      "dev": true,
      "requires": {
        "is-number": "^3.0.0",
        "repeat-string": "^1.6.1"
      },
      "dependencies": {
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          }
        }
      }
    },
    "to-through": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
      "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
      "dev": true,
      "requires": {
        "through2": "^2.0.3"
      }
    },
    "traceur": {
      "version": "0.0.79",
      "resolved": "https://registry.npmjs.org/traceur/-/traceur-0.0.79.tgz",
      "integrity": "sha1-r73EXjq5cl73iz+7P0IZwiUj8pY=",
      "dev": true,
      "requires": {
        "commander": "2.x",
        "glob": "4.3",
        "rsvp": "^3.0.13",
        "semver": "2.x",
        "source-map-support": "~0.2.8"
      },
      "dependencies": {
        "glob": {
          "version": "4.3.5",
          "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz",
          "integrity": "sha1-gPuwjKVA8jiszl0R0em8QedRc9M=",
          "dev": true,
          "requires": {
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "^2.0.1",
            "once": "^1.3.0"
          }
        },
        "minimatch": {
          "version": "2.0.10",
          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
          "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
          "dev": true,
          "requires": {
            "brace-expansion": "^1.0.0"
          }
        },
        "semver": {
          "version": "2.3.2",
          "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz",
          "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=",
          "dev": true
        }
      }
    },
    "trim": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
      "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
      "dev": true
    },
    "trim-lines": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.0.tgz",
      "integrity": "sha1-mSbQPt4Tuhj31CIiYx+wTHn/Jv4=",
      "dev": true
    },
    "trim-newlines": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
      "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
      "dev": true
    },
    "trim-off-newlines": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
      "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
      "dev": true
    },
    "trim-right": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
      "dev": true
    },
    "trim-trailing-lines": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz",
      "integrity": "sha1-eu+7eAjfnWafbaLkOMrIxGradoQ=",
      "dev": true
    },
    "trough": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.1.tgz",
      "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=",
      "dev": true
    },
    "tty-browserify": {
      "version": "0.0.0",
      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
      "dev": true
    },
    "type-fest": {
      "version": "0.13.1",
      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
      "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
      "dev": true
    },
    "typedarray": {
      "version": "0.0.6",
      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
      "dev": true
    },
    "uglify-js": {
      "version": "2.8.29",
      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
      "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
      "dev": true,
      "requires": {
        "source-map": "~0.5.1",
        "uglify-to-browserify": "~1.0.0",
        "yargs": "~3.10.0"
      },
      "dependencies": {
        "camelcase": {
          "version": "1.2.1",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
          "dev": true
        },
        "cliui": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
          "dev": true,
          "requires": {
            "center-align": "^0.1.1",
            "right-align": "^0.1.1",
            "wordwrap": "0.0.2"
          }
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        },
        "wordwrap": {
          "version": "0.0.2",
          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
          "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
          "dev": true
        },
        "yargs": {
          "version": "3.10.0",
          "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
          "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
          "dev": true,
          "requires": {
            "camelcase": "^1.0.2",
            "cliui": "^2.1.0",
            "decamelize": "^1.0.0",
            "window-size": "0.1.0"
          }
        }
      }
    },
    "uglify-to-browserify": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
      "dev": true
    },
    "unc-path-regex": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
      "dev": true
    },
    "underscore": {
      "version": "1.8.3",
      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
      "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
      "dev": true
    },
    "unherit": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz",
      "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=",
      "dev": true,
      "requires": {
        "inherits": "^2.0.1",
        "xtend": "^4.0.1"
      }
    },
    "unified": {
      "version": "6.1.6",
      "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz",
      "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==",
      "dev": true,
      "requires": {
        "bail": "^1.0.0",
        "extend": "^3.0.0",
        "is-plain-obj": "^1.1.0",
        "trough": "^1.0.0",
        "vfile": "^2.0.0",
        "x-is-function": "^1.0.4",
        "x-is-string": "^0.1.0"
      }
    },
    "union-value": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
      "dev": true,
      "requires": {
        "arr-union": "^3.1.0",
        "get-value": "^2.0.6",
        "is-extendable": "^0.1.1",
        "set-value": "^0.4.3"
      },
      "dependencies": {
        "set-value": {
          "version": "0.4.3",
          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
          "dev": true,
          "requires": {
            "extend-shallow": "^2.0.1",
            "is-extendable": "^0.1.1",
            "is-plain-object": "^2.0.1",
            "to-object-path": "^0.3.0"
          }
        }
      }
    },
    "unique-stream": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
      "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
      "dev": true,
      "requires": {
        "json-stable-stringify": "^1.0.0",
        "through2-filter": "^2.0.0"
      }
    },
    "unist-builder": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.2.tgz",
      "integrity": "sha1-jDuZA+9kvPsRfdfPal2Y/Bs7J7Y=",
      "dev": true,
      "requires": {
        "object-assign": "^4.1.0"
      }
    },
    "unist-util-generated": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.1.tgz",
      "integrity": "sha1-mfFseJWayFTe58YVwpGSTIv03n8=",
      "dev": true
    },
    "unist-util-is": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.1.tgz",
      "integrity": "sha1-DDEmKeP5YMZukx6BLT2A53AQlHs=",
      "dev": true
    },
    "unist-util-modify-children": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz",
      "integrity": "sha1-ZtfmpEnm9nIguXarPLi166w55R0=",
      "dev": true,
      "requires": {
        "array-iterate": "^1.0.0"
      }
    },
    "unist-util-position": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.0.0.tgz",
      "integrity": "sha1-5uHgPu64HF4a/lU+jUrfvXwNj4I=",
      "dev": true
    },
    "unist-util-remove-position": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz",
      "integrity": "sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs=",
      "dev": true,
      "requires": {
        "unist-util-visit": "^1.1.0"
      }
    },
    "unist-util-stringify-position": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz",
      "integrity": "sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw=",
      "dev": true
    },
    "unist-util-visit": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.0.tgz",
      "integrity": "sha512-9ntYcxPFtl44gnwXrQKZ5bMqXMY0ZHzUpqMFiU4zcc8mmf/jzYm8GhYgezuUlX4cJIM1zIDYaO6fG/fI+L6iiQ==",
      "dev": true,
      "requires": {
        "unist-util-is": "^2.1.1"
      }
    },
    "unset-value": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
      "dev": true,
      "requires": {
        "has-value": "^0.3.1",
        "isobject": "^3.0.0"
      },
      "dependencies": {
        "has-value": {
          "version": "0.3.1",
          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
          "dev": true,
          "requires": {
            "get-value": "^2.0.3",
            "has-values": "^0.1.4",
            "isobject": "^2.0.0"
          },
          "dependencies": {
            "isobject": {
              "version": "2.1.0",
              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
              "dev": true,
              "requires": {
                "isarray": "1.0.0"
              }
            }
          }
        },
        "has-values": {
          "version": "0.1.4",
          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
          "dev": true
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "urix": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
      "dev": true
    },
    "url": {
      "version": "0.11.0",
      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
      "dev": true,
      "requires": {
        "punycode": "1.3.2",
        "querystring": "0.2.0"
      },
      "dependencies": {
        "punycode": {
          "version": "1.3.2",
          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
          "dev": true
        }
      }
    },
    "use": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz",
      "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
      "dev": true,
      "requires": {
        "define-property": "^0.2.5",
        "isobject": "^3.0.0",
        "lazy-cache": "^2.0.2"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        },
        "is-descriptor": {
          "version": "0.1.6",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^0.1.6",
            "is-data-descriptor": "^0.1.4",
            "kind-of": "^5.0.0"
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
          "dev": true
        }
      }
    },
    "util": {
      "version": "0.10.3",
      "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
      "dev": true,
      "requires": {
        "inherits": "2.0.1"
      },
      "dependencies": {
        "inherits": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
          "dev": true
        }
      }
    },
    "util-deprecate": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
      "dev": true
    },
    "validate-npm-package-license": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
      "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
      "dev": true,
      "requires": {
        "spdx-correct": "~1.0.0",
        "spdx-expression-parse": "~1.0.0"
      }
    },
    "value-or-function": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
      "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
      "dev": true
    },
    "vfile": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
      "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
      "dev": true,
      "requires": {
        "is-buffer": "^1.1.4",
        "replace-ext": "1.0.0",
        "unist-util-stringify-position": "^1.0.0",
        "vfile-message": "^1.0.0"
      }
    },
    "vfile-location": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.2.tgz",
      "integrity": "sha1-02dcWch3SY5JK0dW/2Xkrxp1IlU=",
      "dev": true
    },
    "vfile-message": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.0.tgz",
      "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==",
      "dev": true,
      "requires": {
        "unist-util-stringify-position": "^1.1.1"
      }
    },
    "vfile-reporter": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-4.0.0.tgz",
      "integrity": "sha1-6m8K4TQvSEFXOYXgX5QXNvJ96do=",
      "dev": true,
      "requires": {
        "repeat-string": "^1.5.0",
        "string-width": "^1.0.0",
        "supports-color": "^4.1.0",
        "unist-util-stringify-position": "^1.0.0",
        "vfile-statistics": "^1.1.0"
      },
      "dependencies": {
        "supports-color": {
          "version": "4.5.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
          "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
          "dev": true,
          "requires": {
            "has-flag": "^2.0.0"
          }
        }
      }
    },
    "vfile-sort": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.1.0.tgz",
      "integrity": "sha1-SVAcnou+Wt/y6bOnZx7hseIMUhA=",
      "dev": true
    },
    "vfile-statistics": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.0.tgz",
      "integrity": "sha1-AhBMYP3u0dEbH3OtZTMLdjSz2JU=",
      "dev": true
    },
    "vinyl": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
      "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
      "dev": true,
      "requires": {
        "clone": "^2.1.1",
        "clone-buffer": "^1.0.0",
        "clone-stats": "^1.0.0",
        "cloneable-readable": "^1.0.0",
        "remove-trailing-separator": "^1.0.1",
        "replace-ext": "^1.0.0"
      }
    },
    "vinyl-fs": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.0.tgz",
      "integrity": "sha1-zjRZK5DAM4vaLVwSFWaXNlH5DCM=",
      "dev": true,
      "requires": {
        "flush-write-stream": "^1.0.0",
        "fs-mkdirp-stream": "^1.0.0",
        "glob-stream": "^6.1.0",
        "graceful-fs": "^4.0.0",
        "is-valid-glob": "^1.0.0",
        "lazystream": "^1.0.0",
        "lead": "^1.0.0",
        "object.assign": "^4.0.4",
        "pumpify": "^1.3.5",
        "remove-bom-buffer": "^3.0.0",
        "remove-bom-stream": "^1.2.0",
        "resolve-options": "^1.1.0",
        "through2": "^2.0.0",
        "to-through": "^2.0.0",
        "value-or-function": "^3.0.0",
        "vinyl": "^2.0.0",
        "vinyl-sourcemap": "^1.1.0"
      }
    },
    "vinyl-sourcemap": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
      "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
      "dev": true,
      "requires": {
        "append-buffer": "^1.0.2",
        "convert-source-map": "^1.5.0",
        "graceful-fs": "^4.1.6",
        "normalize-path": "^2.1.1",
        "now-and-later": "^2.0.0",
        "remove-bom-buffer": "^3.0.0",
        "vinyl": "^2.0.0"
      },
      "dependencies": {
        "convert-source-map": {
          "version": "1.5.1",
          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
          "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
          "dev": true
        }
      }
    },
    "vm-browserify": {
      "version": "0.0.4",
      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
      "dev": true,
      "requires": {
        "indexof": "0.0.1"
      }
    },
    "waaclock": {
      "version": "0.5.3",
      "resolved": "https://registry.npmjs.org/waaclock/-/waaclock-0.5.3.tgz",
      "integrity": "sha1-TT3/G4PrQ5+3I134JxuJHi/Fots=",
      "dev": true
    },
    "watchpack": {
      "version": "0.2.9",
      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz",
      "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=",
      "dev": true,
      "requires": {
        "async": "^0.9.0",
        "chokidar": "^1.0.0",
        "graceful-fs": "^4.1.2"
      },
      "dependencies": {
        "async": {
          "version": "0.9.2",
          "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
          "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
          "dev": true
        }
      }
    },
    "webpack": {
      "version": "1.15.0",
      "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz",
      "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=",
      "dev": true,
      "requires": {
        "acorn": "^3.0.0",
        "async": "^1.3.0",
        "clone": "^1.0.2",
        "enhanced-resolve": "~0.9.0",
        "interpret": "^0.6.4",
        "loader-utils": "^0.2.11",
        "memory-fs": "~0.3.0",
        "mkdirp": "~0.5.0",
        "node-libs-browser": "^0.7.0",
        "optimist": "~0.6.0",
        "supports-color": "^3.1.0",
        "tapable": "~0.1.8",
        "uglify-js": "~2.7.3",
        "watchpack": "^0.2.1",
        "webpack-core": "~0.6.9"
      },
      "dependencies": {
        "acorn": {
          "version": "3.3.0",
          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
          "dev": true
        },
        "camelcase": {
          "version": "1.2.1",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
          "dev": true
        },
        "cliui": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
          "dev": true,
          "requires": {
            "center-align": "^0.1.1",
            "right-align": "^0.1.1",
            "wordwrap": "0.0.2"
          }
        },
        "clone": {
          "version": "1.0.3",
          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
          "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
          "dev": true
        },
        "has-flag": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
          "dev": true
        },
        "interpret": {
          "version": "0.6.6",
          "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz",
          "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=",
          "dev": true
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        },
        "supports-color": {
          "version": "3.2.3",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
          "dev": true,
          "requires": {
            "has-flag": "^1.0.0"
          }
        },
        "uglify-js": {
          "version": "2.7.5",
          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz",
          "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=",
          "dev": true,
          "requires": {
            "async": "~0.2.6",
            "source-map": "~0.5.1",
            "uglify-to-browserify": "~1.0.0",
            "yargs": "~3.10.0"
          },
          "dependencies": {
            "async": {
              "version": "0.2.10",
              "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
              "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
              "dev": true
            }
          }
        },
        "wordwrap": {
          "version": "0.0.2",
          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
          "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
          "dev": true
        },
        "yargs": {
          "version": "3.10.0",
          "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
          "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
          "dev": true,
          "requires": {
            "camelcase": "^1.0.2",
            "cliui": "^2.1.0",
            "decamelize": "^1.0.0",
            "window-size": "0.1.0"
          }
        }
      }
    },
    "webpack-core": {
      "version": "0.6.9",
      "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz",
      "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
      "dev": true,
      "requires": {
        "source-list-map": "~0.1.7",
        "source-map": "~0.4.1"
      }
    },
    "websocket-driver": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
      "dev": true,
      "requires": {
        "http-parser-js": ">=0.4.0",
        "websocket-extensions": ">=0.1.1"
      }
    },
    "websocket-extensions": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
      "dev": true
    },
    "which": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
      "dev": true,
      "requires": {
        "isexe": "^2.0.0"
      }
    },
    "which-module": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
      "dev": true
    },
    "window-size": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
      "dev": true
    },
    "wordwrap": {
      "version": "0.0.3",
      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
      "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
      "dev": true
    },
    "wrap-ansi": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
      "dev": true,
      "requires": {
        "string-width": "^1.0.1",
        "strip-ansi": "^3.0.1"
      }
    },
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
      "dev": true
    },
    "x-is-function": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/x-is-function/-/x-is-function-1.0.4.tgz",
      "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=",
      "dev": true
    },
    "x-is-string": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
      "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
      "dev": true
    },
    "xtend": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
      "dev": true
    },
    "y18n": {
      "version": "3.2.1",
      "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
      "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
      "dev": true
    },
    "yallist": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
      "dev": true
    },
    "yargs": {
      "version": "9.0.1",
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz",
      "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=",
      "dev": true,
      "requires": {
        "camelcase": "^4.1.0",
        "cliui": "^3.2.0",
        "decamelize": "^1.1.1",
        "get-caller-file": "^1.0.1",
        "os-locale": "^2.0.0",
        "read-pkg-up": "^2.0.0",
        "require-directory": "^2.1.1",
        "require-main-filename": "^1.0.1",
        "set-blocking": "^2.0.0",
        "string-width": "^2.0.0",
        "which-module": "^2.0.0",
        "y18n": "^3.2.1",
        "yargs-parser": "^7.0.0"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
          "dev": true
        },
        "is-fullwidth-code-point": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
          "dev": true
        },
        "load-json-file": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
          "dev": true,
          "requires": {
            "graceful-fs": "^4.1.2",
            "parse-json": "^2.2.0",
            "pify": "^2.0.0",
            "strip-bom": "^3.0.0"
          }
        },
        "parse-json": {
          "version": "2.2.0",
          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
          "dev": true,
          "requires": {
            "error-ex": "^1.2.0"
          }
        },
        "path-type": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
          "dev": true,
          "requires": {
            "pify": "^2.0.0"
          }
        },
        "pify": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
          "dev": true
        },
        "read-pkg": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
          "dev": true,
          "requires": {
            "load-json-file": "^2.0.0",
            "normalize-package-data": "^2.3.2",
            "path-type": "^2.0.0"
          }
        },
        "read-pkg-up": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
          "dev": true,
          "requires": {
            "find-up": "^2.0.0",
            "read-pkg": "^2.0.0"
          }
        },
        "string-width": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
          "dev": true,
          "requires": {
            "is-fullwidth-code-point": "^2.0.0",
            "strip-ansi": "^4.0.0"
          }
        },
        "strip-ansi": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
          "dev": true,
          "requires": {
            "ansi-regex": "^3.0.0"
          }
        }
      }
    },
    "yargs-parser": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
      "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
      "dev": true,
      "requires": {
        "camelcase": "^4.1.0"
      }
    }
  }
}

Added public/nexus-js/package.json.















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
{
  "name": "nexusui",
  "version": "2.1.6",
  "description": "NexusUI: Web Audio Interfaces",
  "main": "dist/NexusUI.js",
  "scripts": {
    "serve": "npm run docserve",
    "build": "bash script/build",
    "start": "script/watch",
    "docgen": "node_modules/.bin/documentation build lib/** -f json -o api/api.json",
    "docserve": "script/docserve-nix",
    "test": "jest",
    "release": "standard-version"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/nexus-js/ui"
  },
  "keywords": [],
  "author": "Benjamin Taylor",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/nexus-js/ui/issues"
  },
  "homepage": "https://nexus-js.github.io/ui",
  "devDependencies": {
    "babel-core": "^4.7.16",
    "babel-jest": "^4.0.0",
    "babel-loader": "^4.0.0",
    "babelify": "^5.0.3",
    "color-ops": "^2.0.0",
    "documentation": "^5.3.5",
    "es6ify": "^1.6.0",
    "fuse": "^0.4.0",
    "jest": "^0.1.37",
    "jshint": "^2.6.3",
    "jshint-loader": "^0.8.3",
    "standard-version": "^8.0.1",
    "uglify-js": "^2.4.16",
    "waaclock": "^0.5.3",
    "webpack": "^1.5.3"
  },
  "jest": {
    "scriptPreprocessor": "./node_modules/babel-jest",
    "testFileExtensions": [
      "es6",
      "js"
    ],
    "moduleFileExtensions": [
      "js",
      "json",
      "es6"
    ]
  }
}

Added public/nexus-js/script/build.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
#!/bin/sh
webpack --devtool source-map --colors

node_modules/.bin/uglifyjs dist/NexusUI.js \
  --output dist/NexusUI.min.js \
  --source-map dist/NexusUI.min.map \
  --source-map-url NexusUI.min.map \
  --compress warnings=false

Added public/nexus-js/script/docserve-nix.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'

echo "${BLUE}Running in parallel:${NC} \n**Webpack build, \n**documentation.js build > api/api.json, \n**Python SimpleHTTPServer"
echo "${YELLOW}Warning:${NC} documentation.js does not display current build status. ${YELLOW}TODO:${NC} integrate into webpack configuration"
webpack --watch --devtool inline-source-map & \
node_modules/.bin/documentation build lib/** -f json -o api/api.json -w & \
python -m SimpleHTTPServer 8000 || true

Added public/nexus-js/script/watch.





>
>
1
2
#!/bin/sh
webpack --watch --devtool inline-source-map

Added public/nexus-js/webpack.config.js.































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
module.exports = {
    entry: './index.js',
    output: {
        filename: './dist/NexusUI.js',
        sourceMapFilename: './dist/NexusUI.map',
        library: 'Nexus',
        libraryTarget: 'umd'
    },
    module: {
        preLoaders: [{
            test: /\.js$/, // include .js files
            exclude: /node_modules/, // exclude any and all files in the node_modules folder
            loader: 'jshint-loader'
        }],
        loaders: [{
            test: /\.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader'
        }]
    },
    resolve: {
        extensions: ['', '.js']
    },
    jshint: {
        'node': true,
        'browser': true,
        'esnext': true,
        'bitwise': false,
        'camelcase': false,
        'curly': false,
        'eqeqeq': false,
        'immed': true,
        'latedef': true,
        'newcap': true,
        'noarg': true,
        'regexp': true,
        'undef': true,
        'unused': true,
        'strict': true,
        'trailing': true,
        'smarttabs': false,
        'globals': {},
        'predef': [
            'define',
            'require',
            'exports',
            'module',
            'describe',
            'before',
            'beforeEach',
            'after',
            'afterEach',
            'it',
            'inject',
            'expect',
            'spyOn'
        ],
        'indent': 4,
        'devel': true,
        'noempty': true,
        'maxlen': 0
    }
};

Added public/riot-3.13.2/LICENSE.txt.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
The MIT License (MIT)

Copyright (c) 2015-present
Originally created by Muut Inc.
Actively maintained by:
 - Gianluca Guarini https://github.com/GianlucaGuarini

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

Added public/riot-3.13.2/Makefile.



































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

# if no "v" var given, default to package version
v ?= $(shell node -pe "require('./package.json').version")

# expand variable (so we can use it on branches w/o package.json)
VERSION := $(v)

# get x.x.* part of the version number
MINOR_VERSION = `echo $(VERSION) | sed 's/\.[^.]*$$//'`

# Command line paths
KARMA = ./node_modules/karma/bin/karma
ESLINT = ./node_modules/eslint/bin/eslint.js
MOCHA = ./node_modules/mocha/bin/_mocha
SMASH = ./node_modules/.bin/smash
ROLLUP = ./node_modules/.bin/rollup
UGLIFY = ./node_modules/uglify-js/bin/uglifyjs
COVERALLS = ./node_modules/coveralls/bin/coveralls.js
RIOT_CLI = ./node_modules/.bin/riot
CHOKIDAR = ./node_modules/.bin/chokidar

# folders
DIST = dist/riot/
LIB = lib/
CONFIG = config/

GENERATED_FILES = riot.js riot+compiler.js


test: eslint test-mocha test-karma

eslint:
	# check code style
	@ $(ESLINT) -c ./.eslintrc.json lib test

test-mocha:
	RIOT=../../dist/riot/riot.js $(MOCHA) -- test/specs/server

tags:
	@ $(RIOT_CLI) --silent test/tag dist/tags.js

test-karma:
  # Test riot+compiler.js
	@ TEST_FOLDER=browser/compiler $(KARMA) start test/karma.conf.js
	# Test only riot.js and generate the coverage
	@ TEST_FOLDER=browser/riot $(KARMA) start test/karma.conf.js

test-coveralls:
	@ RIOT_COV=1 cat ./coverage/report-lcov/lcov.info | $(COVERALLS)

test-sauce:
	# run the riot tests on saucelabs
	@ SAUCELABS=1 make test-karma

test-chrome:
	@ DEBUG=1 TEST_FOLDER=browser/riot ${KARMA} start test/karma.conf.js --browsers=Chrome --no-single-run --watch

compare:
	# compare the current release with the previous one
	du -h riot.min.js riot+compiler.min.js
	du -h dist/riot/riot.min.js dist/riot/riot+compiler.min.js

raw:
	# build riot
	@ mkdir -p $(DIST)
	# Default builds UMD
	@ $(ROLLUP) lib/riot.js --config $(CONFIG)rollup.config.js > $(DIST)riot.js
	@ $(ROLLUP) lib/riot+compiler.js --config $(CONFIG)rollup.config.js > $(DIST)riot+compiler.js
	# Chrome Security Policy build
	@ $(ROLLUP) lib/riot.js --config $(CONFIG)rollup.config.csp.js > $(DIST)riot.csp.js

clean:
	# clean $(DIST)
	@ rm -rf $(DIST)

riot: clean raw test

min:
	# minify riot
	@ for f in $(GENERATED_FILES); do \
		$(UGLIFY) $(DIST)$$f \
			--comments \
			--toplevel \
			--mangle \
			--compress  \
			-o $(DIST)$${f%.*}.min.js; \
		done

perf: riot
	# run the performance tests
	@ node test/performance/benchmarks ../riot.2.6.1 --expose-gc
	@ node test/performance/benchmarks ../../../riot --expose-gc
	@ node test/performance/benchmarks ../../../dist/riot/riot --expose-gc

perf-leaks: riot
	# detect memory leaks
	@ node --expose-gc test/performance/memory

watch:
	# watch and rebuild riot and its testswatch:
	@ $(CHOKIDAR) lib -c 'make raw & make tags'

build:
	# generate riot.js & riot.min.js
	@ make min
	@ cp dist/riot/* .
	# write version in riot.js
	@ sed -i '' 's/WIP/v$(VERSION)/g' riot*.js


bump:
	# grab all latest changes to master
	# (if there's any uncommited changes, it will stop here)
	# bump version in *.json files
	@ mv package-lock.json package-lock.tmp
	@ sed -i '' 's/\("version": "\)[^"]*/\1'$(VERSION)'/' *.json
	@ mv package-lock.tmp package-lock.json
	@ make build
	@ git status --short

bump-undo:
	# remove all uncommited changes
	@ git reset --hard


version:
	# @ git checkout master
	# create version commit
	@ git status --short
	@ git add --all
	@ git commit -am "$(VERSION)"
	@ git log --oneline -2
	# create version tag
	@ git tag -a 'v'$(VERSION) -m $(VERSION)
	@ git describe

version-undo:
	# remove the version tag
	@ git tag -d 'v'$(VERSION)
	@ git describe
	# remove the version commit
	@ git reset `git rev-parse :/$(VERSION)`
	@ git reset HEAD^
	@ git log --oneline -2


release: bump version

release-undo:
	make version-undo
	make bump-undo


publish:
	# push new version to npm and github
	# (github tag will also trigger an update in bower, component, cdnjs, etc)
	@ npm publish
	@ git push origin master
	@ git push origin master --tags

.PHONY: test min eslint test-mocha test-compiler test-coveralls test-sauce compare raw riot perf watch tags perf-leaks build bump bump-undo version version-undo release-undo publish

Added public/riot-3.13.2/README.md.





































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386

[![Riot logo](https://riot.js.org/img/logo/riot480x.png)](https://riot.js.org)


## Simple and elegant component-based UI library

[![Build Status][travis-image]][travis-url]
[![MIT License][license-image]][license-url]
[![Riot Forum][riot-forum-image]][riot-forum-url]
[![Join the chat at https://gitter.im/riot/riot][gitter-image]][gitter-url]
[![Join the chat (ja) at https://riot-jp-slackin.herokuapp.com/][slack-ja-image]][slack-ja-url]
[![OpenCollective Backers][backer-badge]][backer-url] [![OpenCollective Sponsors][sponsor-badge]][sponsor-url]

[![NPM version][npm-version-image]][npm-url]
[![NPM downloads][npm-downloads-image]][npm-url]
[![jsDelivr Hits][jsdelivr-image]][jsdelivr-url]
[![Coverage Status][coverage-image]][coverage-url]
![Riot Size][lib-size]
[![Code Quality][codeclimate-image]][codeclimate-url]

[![Sauce Test Status][saucelabs-image]][saucelabs-url]

### Framework Size Comparison

| Framework                                      | Version         | Minified Size (gzip) |
|------------------------------------------------|-----------------|----------------------|
| @angular/core + Polyfills                      | 7.0.0           | 314.18kb             |
| Ember                                          | 2.18.2          | 121.84kb             |
| Polymer + Web Components Polyfill Lite         | 1.8.0           | 66.3kb               |
| Polymer + webcomponents-loader.js + webcomponents-bundle.js |3.0.0           | 45.70kb                |
| React + Map and Set Polyfills                  | 16.5.2          | 44.75kb              |
| Web Components Polyfill                        | 0.7.24          | 33.68kb              |
| Vue                                            | 2.5.17          | 31.65kb              |
| __Riot__                                       | 3.13.2          | 10.85kb              |
| Inferno                                        | 6.0.0           | 7.65kb               |
| Preact                                         | 8.3.1           | 3.48kb               |

The above comparison includes polyfills to support old browsers like IE9 that in Riot.js are supported by default.

### Browsers support

Riot is supported by all modern browsers and it does not require any additional polyfill

- IE 9+
- Edge
- Chrome
- Safari 7+
- Firefox
- Safari iOS
- Android

### Custom tags β€’ Concise syntax β€’ Simple API β€’ Tiny Size

Riot brings custom tags to all modern browsers. Think React + Polymer but with enjoyable syntax and a small learning curve.

#### Tag definition

``` javascript
<timer>

  <p>Seconds Elapsed: { time }</p>

  this.time = opts.start || 0

  tick() {
    this.update({ time: ++this.time })
  }

  var timer = setInterval(this.tick, 1000)

  this.on('unmount', function() {
    clearInterval(timer)
  })

</timer>
```

[Open this example on Plunker](http://riot.js.org/examples/plunker/?app=timer)

#### Mounting

``` javascript
riot.mount('timer', { start: 0 })
```

#### Nesting

Custom tags lets you build complex views with HTML.

``` html
<timetable>
  <timer start="0"></timer>
  <timer start="10"></timer>
  <timer start="20"></timer>
</timetable>
```

HTML syntax is the de facto language on the web and it's designed for building user interfaces. The syntax is explicit, nesting is inherent to the language and attributes offer a clean way to provide options for custom tags.


### Expressions Bindings
- Absolutely the smallest possible amount of DOM updates and reflows.
- One way data flow: updates and unmounts are propagated downwards from parent to children.
- Expressions are pre-compiled and cached for high performance.
- Lifecycle events for more control.


### Close to standards
- No proprietary event system.
- Event normalization.
- The rendered DOM can be freely manipulated with other tools.
- No extra HTML root elements or `data-` attributes.
- Plays well with any frontend framework.


### Use your dearest language and tools
- Create tags with CoffeeScript, Jade, LiveScript, Typescript, ES6 or [any pre-processor](http://riot.js.org/guide/compiler/#pre-processors) you want.
- Integrate with NPM, CommonJS, AMD, Bower or Component
- Develop with [Gulp](https://github.com/e-jigsaw/gulp-riot), [Grunt](https://github.com/ariesjia/grunt-riot), [Wintersmith](https://github.com/collingreen/wintersmith-riot), [webpack*](https://github.com/riot/tag-loader), [Rollup*](https://github.com/riot/rollup-plugin-riot), [Browserify*](https://github.com/riot/riotify), [Babel*](https://github.com/riot/babel-preset-es2015-riot) or BublΓ©
- Test with [Karma*](https://github.com/riot/karma-riot), Mocha or whatever you like

*Note*: `*` officially maintained

### CDN hosting
- [jsDelivr](http://www.jsdelivr.com/projects/riot)
- [cdnjs](https://cdnjs.com/libraries/riot)


### Concise syntax
- Power shortcuts: `class={ enabled: is_enabled, hidden: hasErrors() }`.
- No extra brain load such as `render`, `state`, or `constructor`.
- Interpolation: `Add #{ items.length + 1 }` or `class="item { selected: flag }"`
- Compact ES6 method syntax.

### Demos
- [**Riot Examples** - Community's Official](https://github.com/riot/examples)
- [**Riot Animore** - Official Tags Animations Library](https://github.com/riot/animore)
- [Riot Todo MVC](http://todomvc.com/examples/riotjs/)
- [Hackernews reader](http://git.io/riot-hn)
- [Vuejs examples by Riotjs](https://github.com/txchen/feplay/tree/gh-pages/riot_vue)
- [Flux-like ES6 Todo](https://github.com/srackham/riot-todo)
- [Timer](http://jsfiddle.net/gnumanth/h9kuozp5/)
- [Another flux demo comparable to React ones](http://txchen.github.io/feplay/riot_flux)
- [Various experiments](http://richardbondi.net/programming/riot)
- [Isomorphic application](https://github.com/Avnerus/riot-isomorphic)
- [Isomorphic proof of concept](https://github.com/PabloSichert/isomorphic-proof-of-concept)
- [flux-riot todo](http://mingliangfeng.me/flux-riot)
- [Another Riot Todo MVC](http://nippur72.github.io/riotjs-todomvc/#/)
- [Cheft isomorphic by express](https://github.com/cheft/cheft)
- [electron-riot - Riot in an electron application](https://github.com/mike-ward/electron-riot)
- [An express, riot, jade, webpack simple boilerplate](https://github.com/revington/frontend-boilerplate)
- [Riot.js vs React.js comparison of a simple comment box](https://github.com/vitogit/riot.js-vs-react.js-comment-box)
- [Riot Seed project - webpack, routing, ava tests, dispatcher](https://github.com/continuata/riot-seed)
- [Riot-Redux League Table example](https://github.com/drewmiley/PoolLeague)
- [Riot vs React vs Ractive Counters using Redux store](https://github.com/drewmiley/ractive-react-riot-redux-counters-example)
- [Riot Chrome Extension Boilerplate](https://github.com/acesmndr/chrome-extension-boilerplate-riot)

### Books
- [Building Apps with Riot](https://bleedingedgepress.com/building-apps-with-riot/)

### Tutorials
- [Building Apps with Riot, ES6 and Webpack](http://blog.srackham.com/posts/riot-es6-webpack-apps/)
- [Building Apps with Riot, Babel, RiotControl and Webpack](https://github.com/txchen/feplay/tree/gh-pages/riot_webpack)
- [Building tabs with Riot](http://robertwpearce.com/blog/riotjs-example.html)
- [The "React tutorial" for Riot](https://juriansluiman.nl/article/154/the-react-tutorial-for-riot)
- [How to package "tag libraries" in Riot](https://github.com/ivan-saorin/riot-tutorial-tags-pack-app)
- [Another React tutorial with Riot](https://github.com/viliamjr/commentsTuto)
- [Riot Custom Tag by Example](http://www.triplet.fi/blog/riot-custom-tag-by-example/)
- [Riot Compiler Explained](http://www.triplet.fi/blog/riot-compiler-explained/)
- [Adding compiled Riot tags to your Gulp + Browserify build](http://www.triplet.fi/blog/adding_compiled_riot_tags_to_your_gulp_browserify_build/)
- [The anatomy of a tag - a primer tutorial](http://www.marcusoft.net/2015/12/riotjs-anatomy-of-a-tag.html)
- [Using TDD with Riot+mocha+chai](http://vitomd.com/blog/coding/tutorial_tdd_riot_mocha/)
- [The Basics - from ground up to connected tag-networks](http://happy-css.com/lessons/riotjs/)
- [Hello Riot.js : a quick tutorial about this awesome lib](http://vitomd.com/blog/coding/hello-riot-js-quick-tutorial-about-this-awesome-lib/)

### Video Tutorials
- [Introduction](https://www.youtube.com/watch?v=al87U6NgRTc)
- [Loops, Events and Callbacks](https://www.youtube.com/watch?v=T-ZV9dv93sw)
- [Server Rendering with Node & Express](http://youtu.be/6ww1UXGJzcs)
- [Riot And Webpack Setup](https://youtu.be/UgdZbT-KPpY)
- [Riot and Redux - Part 1](https://youtu.be/Y6vpKAGT2-8)
- [Riot and Redux - Part 2](https://youtu.be/DgM03bvgCYc)
- [Riot and Redux - Part 3](https://youtu.be/QuwnbuneAzM)
- [Riot and Redux - Part 4](https://youtu.be/qc6bjtu7KG0)
- [Riot and Redux - Part 5](https://youtu.be/M4BNsRMatVY)
- [Riot and Redux - Part 6](https://youtu.be/jr8KDpwtRsk)


### Libraries / Frameworks
- [Flux- like event controller for Riot](https://github.com/jimsparkman/RiotControl)
- [flux-riot framework](https://github.com/mingliangfeng/flux-riot)
- [Cheftjs - chinese framework for Riot](https://github.com/cheft/cheftjs)
- [Veronica - flux adaption for Riot](https://www.npmjs.com/package/veronica-x)
- [Minimal Flux dispatcher pattern](https://gist.github.com/continuata/c605846751c09a5e94d12ae8c91cbf05)
- [riot-format: a format library for riotjs, like angular $filter](https://github.com/joylei/riot-format)
- [riot-view-router: a simple state based router mixin](https://github.com/neetjn/riot-view-router)
- [riotx - Centralized State Management for riot.js](https://github.com/cam-inc/riotx)
- [storybook for riot.js components <sup>alpha</sup>](https://github.com/storybooks/storybook/tree/master/app/riot)

### Components
- [Material UI](http://kysonic.github.io/riot-mui/)
- [RiotGear Components](https://riotgear.js.org)
- [RiotGear Router](http://riotgear.js.org/components/router/)
- [Riot Bootstrap](http://cognitom.github.io/riot-bootstrap/)
- [iToolkit](https://github.com/BE-FE/iToolkit)
- [Riot Routehandler](https://github.com/crisward/riot-routehandler)-[(Demo)](http://codepen.io/crisward/pen/xwGJpM?editors=101)
- [Riot Flipcard](https://github.com/crisward/riot-flipcard) - [(Demo)](https://crisward.github.io/riot-flipcard/)
- [Riot Grid](https://github.com/crisward/riot-grid) - [(Demo)](http://codepen.io/crisward/pen/rxepMX?editors=101)
- [Riot Grid2](https://github.com/crisward/riot-grid2) - [(Demo)](http://crisward.github.io/riot-grid2/)
- [Riot Subtag](https://github.com/crisward/riot-subtag) - faster than lots of if's
- [ESLint Riot Plugin](https://github.com/txchen/eslint-plugin-riot)
- [riot-animate](https://github.com/sartaj/riot-animate)
- [Nest UI](https://github.com/fengzilong/Nest) - [(Demo)](https://fengzilong.github.io/Nest/)
- [rGrid](https://github.com/limodou/rgrid) - [(Demo)](https://limodou.github.io/rgrid/examples.html)
- [typewriter](https://github.com/amitguptagwl/web-snippets/tree/master/riotjs-components/typewriter) - [(Demo)](http://amitkumargupta.work)

### Resources
- [create-riot-app](https://github.com/alexstep/create-riot-app-ejected) dev environment
- [Riot + AngularJS](https://github.com/lucasbrigida/angular-riot)
- [Module loader for WebPack](https://www.npmjs.com/package/riotjs-loader)
- [Riot + Meteor]( https://atmospherejs.com/baysao/riotjs)
- [Riot Snake Game](http://cdn.rawgit.com/atian25/blog/master/assets/riot-snake.html)
- [Riot Tag Syntax Checker](http://cognitom.github.io/riot-checker/)
- [Riot ζ–‡ζ‘£δΈ­θ―‘η‰ˆ](https://github.com/Centaur/riotjs_doc_cn) :cn:
- [Riot + Wintersmith](https://github.com/collingreen/wintersmith-riot)
- [Riot precompiler plugin for lineman](https://github.com/Power-Inside/lineman-riot)
- [Riot Startkit - Flux inspired skeleton app + WebPack + PostCSS](https://github.com/wbkd/riotjs-startkit)
- [Yeoman generator - Generator riot mobile](https://www.npmjs.com/package/generator-riot-mobile)
- [Yeoman generator - Generator riot element](https://www.npmjs.com/package/generator-riot-element)
- [Riot for TypeScript](https://github.com/nippur72/RiotTS)
- [Riot loader plugin for RequireJS](https://github.com/amenadiel/requirejs-riot)
- [Riot loader plugin for JSPM/SystemJS](https://github.com/amenadiel/systemjs-riot)
- [RiotJS Style Guide](https://github.com/voorhoede/riotjs-style-guide)
- [Riot Cheatsheet](http://martinmuzatko.github.io/riot-cheatsheet/)

### Performance
- **Riot vs React performance:** [(Riot version)](https://github.com/kazzkiq/samples/tree/gh-pages/perf/dom-riot-vs-vanilla) vs [(React version)](https://github.com/kazzkiq/samples/tree/gh-pages/perf/dom-react-vs-vanilla)

### Miscellaneous
- [Q&A with RiotJS author Tero Piirainen](http://www.triplet.fi/blog/q-and-a-with-riotjs-author-tero-piirainen/)
- [riot-detector (Chrome Extension)](https://chrome.google.com/webstore/detail/riot-detector/cnnmjeggdmicjojlnjghdgkdlijiobke)

### Editors / Editor Plugins (Syntax highlighting, autcompletion, etc...)
- [riot (Atom Package)](https://atom.io/packages/riot)
- [language-riot-tag (Atom Package)](https://github.com/dekimasoon/language-riot-tag)
  - Based on Vue's official Sublime Text highlighter
  - Note: Designed for html, not jade.
- [sublime-tag (Sublime Text)](https://github.com/crisward/sublime-tag)
- [riot-tag (Visual Studio)](https://github.com/crisward/riot-tag)
- [web-mode (Emacs)](http://web-mode.org)
  - See how to configure [#1967](https://github.com/riot/riot/issues/1967)

### How to contribute

If you are reading this it's already a good sign and we are thankful for it! We try our best working as much as we could on riot but your help is always appreciated.

If you want to contribute to riot helping us maintaining the project please check first the list of [our open issues](https://github.com/riot/riot/issues) to understand whether there is a task where you could help.

Riot is mainly developed on UNIX systems so you will be able to run all the commands necessary to build and test the library using our [Makefile](Makefile). If you are on a Microsoft machine it could be harder to set up you development environment properly.

Following the steps below you should be able to properly submit your patch to the project

#### 1) Clone the repo and browse to the riot folder

```shell
$ git clone git@github.com:riot/riot.git && cd riot
```
#### 2) Set up your git branch

```shell
$ git checkout -b feature/my-awesome-patch
```

#### 3) Install the npm dependencies

```shell
$ npm i
```

#### 4) Build and test riot using the Makefile

```shell
# To build and test riot
$ make riot

# To build without testing
$ make raw

# To build anytime you change a src file
$ make watch

# To bench riot
$ make perf
```

#### 5) Pull request only against the `dev` branch making sure you have read [our pull request template](.github/PULL_REQUEST_TEMPLATE.md)

#### 6) Be patient


### Credits

Riot is made with :heart: by many smart people from all over the world. Thanks to all the contributors<br>
It's actively maintained by:
<table>
  <tbody>
    <tr>
      <td valign="top">
        <img width="125" height="125" src="https://github.com/GianlucaGuarini.png?s=125?s=125">
        <br>
        <a href="https://github.com/GianlucaGuarini">Gianluca Guarini</a>
      </td>
     </tr>
  </tbody>
</table>

## Official Website

http://riot.js.org

## Backers

Support us with a monthly donation and help us continue our activities. [Become a backer][support-url]

[![Backers][backers-image]][support-url]

## Sponsors

Become a sponsor to get your logo on our README. [Become a sponsor][support-url]

[![Sponsors][sponsors-image]][support-url]

## Thanks

Special thanks to Browserstack for their support

<a href='https://www.browserstack.com/'>
  <img width='70px' src="https://cdn.worldvectorlogo.com/logos/browserstack.svg" alt="browser stack">
</a>

[travis-image]:https://img.shields.io/travis/riot/riot.svg?style=flat-square
[travis-url]:https://travis-ci.org/riot/riot

[license-image]:http://img.shields.io/badge/license-MIT-000000.svg?style=flat-square
[license-url]:LICENSE.txt

[npm-version-image]:http://img.shields.io/npm/v/riot.svg?style=flat-square
[npm-downloads-image]:http://img.shields.io/npm/dm/riot.svg?style=flat-square
[npm-url]:https://npmjs.org/package/riot

[riot-forum-image]:https://img.shields.io/badge/muut-JOIN_FORUM%E2%86%92-ff0044.svg?style=flat-square
[riot-forum-url]:http://riot.js.org/forum/

[coverage-image]:https://img.shields.io/coveralls/riot/riot/dev.svg?style=flat-square
[coverage-url]:https://coveralls.io/r/riot/riot?branch=dev

[saucelabs-image]:https://saucelabs.com/browser-matrix/testsriotjs.svg?1
[saucelabs-url]:https://saucelabs.com/u/testsriotjs

[gitter-image]:https://img.shields.io/badge/GITTER-JOIN_CHAT_%E2%86%92-1dce73.svg?style=flat-square
[gitter-url]:https://gitter.im/riot/riot?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge

[slack-ja-image]:https://img.shields.io/badge/SLACK_(ja)-JOIN_CHAT_%E2%86%92-551a8b.svg?style=flat-square
[slack-ja-url]:https://riot-jp-slackin.herokuapp.com/

[codeclimate-image]:https://api.codeclimate.com/v1/badges/b81ddf3c77e8189876da/maintainability
[codeclimate-url]:https://codeclimate.com/github/riot/riot

[donations-campaign-url]:https://pledgie.com/campaigns/31139
[donations-campaign-image]:https://pledgie.com/campaigns/31139.png?skin_name=chrome

[jsdelivr-image]: https://data.jsdelivr.com/v1/package/npm/riot/badge
[jsdelivr-url]: https://www.jsdelivr.com/package/npm/riot


[backer-url]: #backers
[backer-badge]: https://opencollective.com/riot/backers/badge.svg?color=blue
[sponsor-url]: #sponsors
[sponsor-badge]: https://opencollective.com/riot/sponsors/badge.svg?color=blue

[support-url]: https://opencollective.com/riot#support

[lib-size]: http://img.badgesize.io/https://unpkg.com/riot/riot.min.js?compression=gzip

[backers-image]: https://opencollective.com/riot/backers.svg
[sponsors-image]: https://opencollective.com/riot/sponsors.svg

Added public/riot-3.13.2/bin/index.js.







>
>
>
1
2
3
#!/usr/bin/env node

require('riot-cli')._cli()

Added public/riot-3.13.2/bower.json.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{
  "name": "riot",
  "version": "3.13.2",
  "description": "Simple and elegant component-based UI library",
  "homepage": "http://riot.js.org/",
  "repository": { "type": "git", "url": "git://github.com/riot/riot.git" },
  "authors": [
    "Gianluca Guarini https://github.com/GianlucaGuarini"
  ],
  "license": "MIT",
  "keywords": [
    "custom tags",
    "custom elements",
    "web components",
    "virtual dom",
    "shadow dom",
    "polymer",
    "react",
    "jsx",
    "minimal",
    "minimalist",
    "client-side",
    "framework",
    "declarative",
    "templating",
    "template",
    "data binding",
    "mvc",
    "router",
    "model",
    "view",
    "controller",
    "riotjs",
    "riot.js"
  ],
  "ignore": [
    "**/*",
    "!/riot.js",
    "!/riot.min.js",
    "!/riot.csp.js",
    "!/riot.csp.min.js",
    "!/riot+compiler.js",
    "!/riot+compiler.min.js"
  ],
  "main": "riot.js"
}

Added public/riot-3.13.2/component.json.













































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
  "name": "riot",
  "version": "3.13.2",
  "description": "Simple and elegant component-based UI library",
  "repository": "riot/riot",
  "license": "MIT",
  "keywords": [
    "custom tags",
    "custom elements",
    "web components",
    "virtual dom",
    "shadow dom",
    "polymer",
    "react",
    "jsx",
    "minimal",
    "minimalist",
    "client-side",
    "framework",
    "declarative",
    "templating",
    "template",
    "data binding",
    "mvc",
    "router",
    "model",
    "view",
    "controller",
    "riotjs",
    "riot.js"
  ],
  "scripts": [
    "riot.js",
    "compiler.js",
    "riot+compiler.js"
  ],
  "main": "riot.js"
}

Added public/riot-3.13.2/config/defaults.js.

































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const commonjs = require('rollup-plugin-commonjs'),
  nodeResolve = require('rollup-plugin-node-resolve'),
  buble = require('rollup-plugin-buble')

module.exports = {
  output: {
    name: 'riot',
    format: 'umd',
    banner: '/* Riot WIP, @license MIT */',
  },
  onwarn(warning) {
    if (warning.code === 'CIRCULAR_DEPENDENCY') return
  },
  plugins: [
    nodeResolve({ jsnext: true, main: true }),
    commonjs({
      include: 'node_modules/**',
      ignoreGlobal: true
    }),
    // ignore the coverage of riot external modules like riot-tmpl
    {
      transform (code) {
        return {
          code: code.replace(/(export\nvar (brackets|tmpl)|var (observable)|var (skipRegex)) =/g, function(m) {
            return ['/* istanbul ignore next */', m].join('\n')
          })
        }
      }
    },
    buble()
  ]
}

Added public/riot-3.13.2/config/rollup.config.csp.js.

















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import nodeResolve from 'rollup-plugin-node-resolve'
import commonjs from 'rollup-plugin-commonjs'
import alias from 'rollup-plugin-alias'
import buble from 'rollup-plugin-buble'
import path from 'path'
var defaults = require('./defaults')

const tmplPath = path.resolve(process.cwd(), 'node_modules', 'riot-tmpl', 'dist', 'csp.tmpl.js')

export default Object.assign(defaults, {
  plugins: [
    alias({
      'riot-tmpl': tmplPath
    }),
    nodeResolve({ jsnext: true, main: true }),
    commonjs({
      include: 'node_modules/**',
      namedExports: {
        [tmplPath]: ['tmpl', 'brackets']
      }
    }),
    buble()
  ]
})

Added public/riot-3.13.2/config/rollup.config.js.





>
>
1
2
var defaults = require('./defaults')
export default defaults

Added public/riot-3.13.2/lib/browser/common/global-variables.js.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
export
const
  // be aware, internal usage
  // ATTENTION: prefix the global dynamic variables with `__`
  // tags instances cache
  __TAGS_CACHE = [],
  // tags implementation cache
  __TAG_IMPL = {},
  YIELD_TAG = 'yield',

  /**
   * Const
   */
  GLOBAL_MIXIN = '__global_mixin',

  // riot specific prefixes or attributes
  ATTRS_PREFIX = 'riot-',

  // Riot Directives
  REF_DIRECTIVES = ['ref', 'data-ref'],
  IS_DIRECTIVE = 'data-is',
  CONDITIONAL_DIRECTIVE = 'if',
  LOOP_DIRECTIVE = 'each',
  LOOP_NO_REORDER_DIRECTIVE = 'no-reorder',
  SHOW_DIRECTIVE = 'show',
  HIDE_DIRECTIVE = 'hide',
  KEY_DIRECTIVE = 'key',
  RIOT_EVENTS_KEY = '__riot-events__',

  // for typeof == '' comparisons
  T_STRING = 'string',
  T_OBJECT = 'object',
  T_UNDEF  = 'undefined',
  T_FUNCTION = 'function',

  XLINK_NS = 'http://www.w3.org/1999/xlink',
  SVG_NS = 'http://www.w3.org/2000/svg',
  XLINK_REGEX = /^xlink:(\w+)/,

  WIN = typeof window === T_UNDEF ? /* istanbul ignore next */ undefined : window,

  // special native tags that cannot be treated like the others
  RE_SPECIAL_TAGS = /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/,
  RE_SPECIAL_TAGS_NO_OPTION = /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/,
  RE_EVENTS_PREFIX = /^on/,
  RE_HTML_ATTRS = /([-\w]+) ?= ?(?:"([^"]*)|'([^']*)|({[^}]*}))/g,
  // some DOM attributes must be normalized
  CASE_SENSITIVE_ATTRIBUTES = {
    'viewbox': 'viewBox',
    'preserveaspectratio': 'preserveAspectRatio'
  },
  /**
   * Matches boolean HTML attributes in the riot tag definition.
   * With a long list like this, a regex is faster than `[].indexOf` in most browsers.
   * @const {RegExp}
   * @see [attributes.md](https://github.com/riot/compiler/blob/dev/doc/attributes.md)
   */
  RE_BOOL_ATTRS = /^(?:disabled|checked|readonly|required|allowfullscreen|auto(?:focus|play)|compact|controls|default|formnovalidate|hidden|ismap|itemscope|loop|multiple|muted|no(?:resize|shade|validate|wrap)?|open|reversed|seamless|selected|sortable|truespeed|typemustmatch)$/,
  // version# for IE 8-11, 0 for others
  IE_VERSION = (WIN && WIN.document || /* istanbul ignore next */ {}).documentMode | 0

Added public/riot-3.13.2/lib/browser/common/util/checks/index.js.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
export { default as isBlank } from './is-blank'
export { default as isFunction } from './is-function'
export { default as isObject } from './is-object'
export { default as isSvg } from './is-svg'
export { default as isWritable } from './is-writable'
export { default as isArray } from './is-array'
export { default as isBoolAttr } from './is-boolean-attribute'
export { default as isNil } from './is-nil'
export { default as isString } from './is-string'
export { default as isUndefined } from './is-undefined'

Added public/riot-3.13.2/lib/browser/common/util/checks/is-array.js.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
/**
 * Check if passed argument is a kind of array
 * @param   { * } value -
 * @returns { Boolean } -
 */
export default function isArray(value) {
  return Array.isArray(value) || value instanceof Array
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-blank.js.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
import isNil from './is-nil'

/**
 * Check if passed argument is empty. Different from falsy, because we dont consider 0 or false to be blank
 * @param { * } value -
 * @returns { Boolean } -
 */
export default function isBlank(value) {
  return isNil(value) || value === ''
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-boolean-attribute.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
import { RE_BOOL_ATTRS } from './../../global-variables'
/**
 * Check if the passed argument is a boolean attribute
 * @param   { String } value -
 * @returns { Boolean } -
 */
export default function isBoolAttr(value) {
  return RE_BOOL_ATTRS.test(value)
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-function.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
import { T_FUNCTION } from './../../global-variables'
/**
 * Check if passed argument is a function
 * @param   { * } value -
 * @returns { Boolean } -
 */
export default function isFunction(value) {
  return typeof value === T_FUNCTION
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-nil.js.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
import isUndefined from './is-undefined'

/**
 * Check against the null and undefined values
 * @param   { * }  value -
 * @returns {Boolean} -
 */
export default function isNil(value) {
  return isUndefined(value) || value === null
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-object.js.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
import { T_OBJECT } from './../../global-variables'

/**
 * Check if passed argument is an object, exclude null
 * NOTE: use isObject(x) && !isArray(x) to excludes arrays.
 * @param   { * } value -
 * @returns { Boolean } -
 */
export default function isObject(value) {
  return value && typeof value === T_OBJECT // typeof null is 'object'
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-string.js.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
import { T_STRING } from './../../global-variables'

/**
 * Check if passed argument is a string
 * @param   { * } value -
 * @returns { Boolean } -
 */
export default function isString(value) {
  return typeof value === T_STRING
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-svg.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
/**
 * Check if a DOM node is an svg tag or part of an svg
 * @param   { HTMLElement }  el - node we want to test
 * @returns {Boolean} true if it's an svg node
 */
export default function isSvg(el) {
  const owner = el.ownerSVGElement
  return !!owner || owner === null
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-undefined.js.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
import { T_UNDEF } from './../../global-variables'

/**
 * Check if passed argument is undefined
 * @param   { * } value -
 * @returns { Boolean } -
 */
export default function isUndefined(value) {
  return typeof value === T_UNDEF
}

Added public/riot-3.13.2/lib/browser/common/util/checks/is-writable.js.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
import getPropDescriptor from '../misc/get-prop-descriptor'
import isUndefined from './is-undefined'
/**
 * Check whether object's property could be overridden
 * @param   { Object }  obj - source object
 * @param   { String }  key - object property
 * @returns { Boolean } true if writable
 */
export default function isWritable(obj, key) {
  const descriptor = getPropDescriptor(obj, key)
  return isUndefined(obj[key]) || descriptor && descriptor.writable
}

Added public/riot-3.13.2/lib/browser/common/util/dom/$$.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
/**
 * Shorter and fast way to select multiple nodes in the DOM
 * @param   { String } selector - DOM selector
 * @param   { Object } ctx - DOM node where the targets of our search will is located
 * @returns { Object } dom nodes found
 */
export default function $$(selector, ctx) {
  return [].slice.call((ctx || document).querySelectorAll(selector))
}

Added public/riot-3.13.2/lib/browser/common/util/dom/$.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
/**
 * Shorter and fast way to select a single node in the DOM
 * @param   { String } selector - unique dom selector
 * @param   { Object } ctx - DOM node where the target of our search will is located
 * @returns { Object } dom node found
 */
export default function $(selector, ctx) {
  return (ctx || document).querySelector(selector)
}

Added public/riot-3.13.2/lib/browser/common/util/dom/create-fragment.js.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
/**
 * Create a document fragment
 * @returns { Object } document fragment
 */
export default function createFragment() {
  return document.createDocumentFragment()
}

Added public/riot-3.13.2/lib/browser/common/util/dom/create-placeholder.js.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
/**
 * Create a document text node
 * @returns { Object } create a text node to use as placeholder
 */
export default function createDOMPlaceholder() {
  return document.createTextNode('')
}

Added public/riot-3.13.2/lib/browser/common/util/dom/get-attribute.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
/**
 * Get the value of any DOM attribute on a node
 * @param   { Object } dom - DOM node we want to parse
 * @param   { String } name - name of the attribute we want to get
 * @returns { String | undefined } name of the node attribute whether it exists
 */
export default function getAttribute(dom, name) {
  return dom.getAttribute(name)
}

Added public/riot-3.13.2/lib/browser/common/util/dom/index.js.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
export { default as $$ } from './$$'
export { default as $ } from './$'
export { default as createDOMPlaceholder } from './create-placeholder'
export { default as mkEl } from './make-element'
export { default as setAttr } from './set-attribute'
export { default as toggleVisibility } from './toggle-visibility'
export { default as getAttr } from './get-attribute'
export { default as remAttr } from './remove-attribute'
export { default as setInnerHTML } from './set-inner-HTML'
export { default as walkAttrs } from './walk-attributes'
export { default as createFrag } from './create-fragment'
export { default as safeInsert } from './safe-insert'
export { default as styleObjectToString } from './style-object-to-string'
export { default as walkNodes } from './walk-nodes'

Added public/riot-3.13.2/lib/browser/common/util/dom/make-element.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
import { SVG_NS } from './../../global-variables'
/**
 * Create a generic DOM node
 * @param   { String } name - name of the DOM node we want to create
 * @returns { Object } DOM node just created
 */
export default function makeElement(name) {
  return name === 'svg' ? document.createElementNS(SVG_NS, name) : document.createElement(name)
}

Added public/riot-3.13.2/lib/browser/common/util/dom/remove-attribute.js.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
/**
 * Remove any DOM attribute from a node
 * @param   { Object } dom - DOM node we want to update
 * @param   { String } name - name of the property we want to remove
 */
export default function removeAttribute(dom, name) {
  dom.removeAttribute(name)
}

Added public/riot-3.13.2/lib/browser/common/util/dom/safe-insert.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
/**
 * Insert safely a tag to fix #1962 #1649
 * @param   { HTMLElement } root - children container
 * @param   { HTMLElement } curr - node to insert
 * @param   { HTMLElement } next - node that should preceed the current node inserted
 */
export default function safeInsert(root, curr, next) {
  root.insertBefore(curr, next.parentNode && next)
}

Added public/riot-3.13.2/lib/browser/common/util/dom/set-attribute.js.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { XLINK_NS, XLINK_REGEX } from './../../global-variables'
/**
 * Set any DOM attribute
 * @param { Object } dom - DOM node we want to update
 * @param { String } name - name of the property we want to set
 * @param { String } val - value of the property we want to set
 */
export default function setAttribute(dom, name, val) {
  const xlink = XLINK_REGEX.exec(name)
  if (xlink && xlink[1])
    dom.setAttributeNS(XLINK_NS, xlink[1], val)
  else
    dom.setAttribute(name, val)
}

Added public/riot-3.13.2/lib/browser/common/util/dom/set-inner-HTML.js.

















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { SVG_NS } from './../../global-variables'

/**
 * Set the inner html of any DOM node SVGs included
 * @param { Object } container - DOM node where we'll inject new html
 * @param { String } html - html to inject
 * @param { Boolean } isSvg - svg tags should be treated a bit differently
 */
/* istanbul ignore next */
export default function setInnerHTML(container, html, isSvg) {
  // innerHTML is not supported on svg tags so we neet to treat them differently
  if (isSvg) {
    const node = container.ownerDocument.importNode(
      new DOMParser()
        .parseFromString(`<svg xmlns="${ SVG_NS }">${ html }</svg>`, 'application/xml')
        .documentElement,
      true
    )

    container.appendChild(node)
  } else {
    container.innerHTML = html
  }
}

Added public/riot-3.13.2/lib/browser/common/util/dom/style-object-to-string.js.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
/**
 * Convert a style object to a string
 * @param   { Object } style - style object we need to parse
 * @returns { String } resulting css string
 * @example
 * styleObjectToString({ color: 'red', height: '10px'}) // => 'color: red; height: 10px'
 */
export default function styleObjectToString(style) {
  return Object.keys(style).reduce((acc, prop) => {
    return `${acc} ${prop}: ${style[prop]};`
  }, '')
}

Added public/riot-3.13.2/lib/browser/common/util/dom/toggle-visibility.js.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
/**
 * Toggle the visibility of any DOM node
 * @param   { Object }  dom - DOM node we want to hide
 * @param   { Boolean } show - do we want to show it?
 */

export default function toggleVisibility(dom, show) {
  dom.style.display = show ? '' : 'none'
  dom.hidden = show ? false : true
}

Added public/riot-3.13.2/lib/browser/common/util/dom/walk-attributes.js.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
import { RE_HTML_ATTRS } from './../../global-variables'
/**
 * Minimize risk: only zero or one _space_ between attr & value
 * @param   { String }   html - html string we want to parse
 * @param   { Function } fn - callback function to apply on any attribute found
 */
export default function walkAttributes(html, fn) {
  if (!html) return
  let m
  while (m = RE_HTML_ATTRS.exec(html))
    fn(m[1].toLowerCase(), m[2] || m[3] || m[4])
}

Added public/riot-3.13.2/lib/browser/common/util/dom/walk-nodes.js.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * Walk down recursively all the children tags starting dom node
 * @param   { Object }   dom - starting node where we will start the recursion
 * @param   { Function } fn - callback to transform the child node just found
 * @param   { Object }   context - fn can optionally return an object, which is passed to children
 */
export default function walkNodes(dom, fn, context) {
  if (dom) {
    const res = fn(dom, context)
    let next
    // stop the recursion
    if (res === false) return

    dom = dom.firstChild

    while (dom) {
      next = dom.nextSibling
      walkNodes(dom, fn, res)
      dom = next
    }
  }
}

Added public/riot-3.13.2/lib/browser/common/util/misc/contains.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
/**
 * Check whether an array contains an item
 * @param   { Array } array - target array
 * @param   { * } item - item to test
 * @returns { Boolean } -
 */
export default function contains(array, item) {
  return array.indexOf(item) !== -1
}

Added public/riot-3.13.2/lib/browser/common/util/misc/define.js.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import extend from './extend'

/**
 * Helper function to set an immutable property
 * @param   { Object } el - object where the new property will be set
 * @param   { String } key - object key where the new property will be stored
 * @param   { * } value - value of the new property
 * @param   { Object } options - set the propery overriding the default options
 * @returns { Object } - the initial object
 */
export default function define(el, key, value, options) {
  Object.defineProperty(el, key, extend({
    value,
    enumerable: false,
    writable: false,
    configurable: true
  }, options))
  return el
}

Added public/riot-3.13.2/lib/browser/common/util/misc/each.js.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
/**
 * Specialized function for looping an array-like collection with `each={}`
 * @param   { Array } list - collection of items
 * @param   {Function} fn - callback function
 * @returns { Array } the array looped
 */
export default function each(list, fn) {
  const len = list ? list.length : 0
  let i = 0
  for (; i < len; i++) fn(list[i], i)
  return list
}

Added public/riot-3.13.2/lib/browser/common/util/misc/extend.js.



























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import isWritable from '../checks/is-writable'

/**
 * Extend any object with other properties
 * @param   { Object } src - source object
 * @returns { Object } the resulting extended object
 *
 * var obj = { foo: 'baz' }
 * extend(obj, {bar: 'bar', foo: 'bar'})
 * console.log(obj) => {bar: 'bar', foo: 'bar'}
 *
 */
export default function extend(src) {
  let obj
  let i = 1
  const args = arguments
  const l = args.length

  for (; i < l; i++) {
    if (obj = args[i]) {
      for (const key in obj) {
        // check if this property of the source object could be overridden
        if (isWritable(src, key))
          src[key] = obj[key]
      }
    }
  }
  return src
}

Added public/riot-3.13.2/lib/browser/common/util/misc/get-prop-descriptor.js.













>
>
>
>
>
>
1
2
3
4
5
6
/**
 * Short alias for Object.getOwnPropertyDescriptor
 */
export default function getPropDescriptor (o, k) {
  return Object.getOwnPropertyDescriptor(o, k)
}

Added public/riot-3.13.2/lib/browser/common/util/misc/index.js.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
export { default as contains } from './contains'
export { default as each } from './each'
export { default as getPropDescriptor } from './get-prop-descriptor'
export { default as startsWith } from './starts-with'
export { default as uid } from './uid'
export { default as defineProperty } from './define'
export { default as objectCreate } from './object-create'
export { default as extend } from './extend'
export { default as toCamel } from './to-camel'
export { default as warn } from './warn'

Added public/riot-3.13.2/lib/browser/common/util/misc/is-event-attribute.js.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
const EVENT_ATTR_RE = /^on/

/**
 * True if the event attribute starts with 'on'
 * @param   { String } attribute - event attribute
 * @returns { Boolean }
 */
export default function isEventAttribute(attribute) {
  return EVENT_ATTR_RE.test(attribute)
}

Added public/riot-3.13.2/lib/browser/common/util/misc/object-create.js.













>
>
>
>
>
>
1
2
3
4
5
6
/**
 * Alias for Object.create
 */
export default function create(src) {
  return Object.create(src)
}

Added public/riot-3.13.2/lib/browser/common/util/misc/starts-with.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
/**
 * Faster String startsWith alternative
 * @param   { String } str - source string
 * @param   { String } value - test string
 * @returns { Boolean } -
 */
export default function startsWith(str, value) {
  return str.slice(0, value.length) === value
}

Added public/riot-3.13.2/lib/browser/common/util/misc/to-camel.js.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
/**
 * Convert a string containing dashes to camel case
 * @param   { String } str - input string
 * @returns { String } my-string -> myString
 */
export default function toCamel(str) {
  return str.replace(/-(\w)/g, (_, c) => c.toUpperCase())
}

Added public/riot-3.13.2/lib/browser/common/util/misc/uid.js.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
/**
 * Function returning always a unique identifier
 * @returns { Number } - number from 0...n
 */
export default (function uid() {
  let i = -1
  return () => ++i
})()

Added public/riot-3.13.2/lib/browser/common/util/misc/warn.js.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
/**
 * Warn a message via console
 * @param   {String} message - warning message
 */
export default function warn(message) {
  if (console && console.warn) console.warn(message)
}

Added public/riot-3.13.2/lib/browser/compiler/index.js.



























































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import observable from 'riot-observable'
import compiler from 'riot-compiler'
import { T_STRING } from './../common/global-variables'

import isArray from './../common/util/checks/is-array'
import isObject from './../common/util/checks/is-object'
import isFunction from './../common/util/checks/is-function'

import extend from './../common/util/misc/extend'

import $$ from './../common/util/dom/$$'
import getAttribute from './../common/util/dom/get-attribute'
import makeElement from './../common/util/dom/make-element'

var
  promise,    // emits the 'ready' event and runs the first callback
  ready       // all the scripts were compiled?

// gets the source of an external tag with an async call
function GET (url, fn, opts) {
  var req = new XMLHttpRequest()

  req.onreadystatechange = function () {
    if (req.readyState === 4) {
      if (req.status === 200 || !req.status && req.responseText.length) {
        fn(req.responseText, opts, url)
      } else {
        compile.error(`"${ url }" not found`)
      }
    }
  }

  req.onerror = e => compile.error(e)

  req.open('GET', url, true)
  req.send('')
}

// evaluates a compiled tag within the global context
function globalEval (js, url) {
  if (typeof js === T_STRING) {
    var
      node = makeElement('script'),
      root = document.documentElement

    // make the source available in the "(no domain)" tab
    // of Chrome DevTools, with a .js extension
    if (url) js += '\n//# sourceURL=' + url + '.js'

    node.text = js
    root.appendChild(node)
    root.removeChild(node)
  }
}

// compiles all the internal and external tags on the page
function compileScripts (fn, xopt) {
  var
    scripts = $$('script[type="riot/tag"]'),
    scriptsAmount = scripts.length

  function done() {
    promise.trigger('ready')
    ready = true
    if (fn) fn()
  }

  function compileTag (src, opts, url) {
    var code = compiler.compile(src, opts, url)

    globalEval(code, url)
    if (!--scriptsAmount) done()
  }

  if (!scriptsAmount) done()
  else {
    for (var i = 0; i < scripts.length; ++i) {
      var
        script = scripts[i],
        opts = extend({template: getAttribute(script, 'template')}, xopt),
        url = getAttribute(script, 'src') || getAttribute(script, 'data-src')

      url ? GET(url, compileTag, opts) : compileTag(script.innerHTML, opts)
    }
  }
}

export const parsers = compiler.parsers

/*
  Compilation for the browser
*/
export function compile (arg, fn, opts) {

  if (typeof arg === T_STRING) {

    // 2nd parameter is optional, but can be null
    if (isObject(fn)) {
      opts = fn
      fn = false
    }

    // `riot.compile(tag [, callback | true][, options])`
    if (/^\s*</m.test(arg)) {
      var js = compiler.compile(arg, opts)
      if (fn !== true) globalEval(js)
      if (isFunction(fn)) fn(js, arg, opts)
      return js
    }

    // `riot.compile(url [, callback][, options])`
    GET(arg, function (str, opts, url) {
      var js = compiler.compile(str, opts, url)
      globalEval(js, url)
      if (fn) fn(js, str, opts)
    }, opts)

  } else if (isArray(arg)) {
    var i = arg.length
    // `riot.compile([urlsList] [, callback][, options])`
    arg.forEach(function(str) {
      GET(str, function (str, opts, url) {
        var js = compiler.compile(str, opts, url)
        globalEval(js, url)
        i --
        if (!i && fn) fn(js, str, opts)
      }, opts)
    })
  } else {

    // `riot.compile([callback][, options])`
    if (isFunction(arg)) {
      opts = fn
      fn = arg
    } else {
      opts = arg
      fn = undefined
    }

    if (ready) {
      return fn && fn()
    }

    if (promise) {
      if (fn) promise.on('ready', fn)

    } else {
      promise = observable()
      compileScripts(fn, opts)
    }
  }
}

// it can be rewritten by the user to handle all the compiler errors
compile.error = (e) => {
  throw new Error(e)
}

Added public/riot-3.13.2/lib/browser/tag/component/mixin.js.



























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { mixin } from './../core'
import isString from './../../common/util/checks/is-string'
import isFunction from './../../common/util/checks/is-function'
import each from './../../common/util/misc/each'
import contains from './../../common/util/misc/contains'
import getPropDescriptor from './../../common/util/misc/get-prop-descriptor'

/**
 * Add a mixin to this tag
 * @returns { Tag } the current tag instance
 */
export default function componentMixin(tag, ...mixins) {
  each(mixins, (mix) => {
    let instance
    let obj
    let props = []

    // properties blacklisted and will not be bound to the tag instance
    const propsBlacklist = ['init', '__proto__']

    mix = isString(mix) ? mixin(mix) : mix

    // check if the mixin is a function
    if (isFunction(mix)) {
      // create the new mixin instance
      instance = new mix()
    } else instance = mix

    const proto = Object.getPrototypeOf(instance)

    // build multilevel prototype inheritance chain property list
    do props = props.concat(Object.getOwnPropertyNames(obj || instance))
    while (obj = Object.getPrototypeOf(obj || instance))

    // loop the keys in the function prototype or the all object keys
    each(props, (key) => {
      // bind methods to tag
      // allow mixins to override other properties/parent mixins
      if (!contains(propsBlacklist, key)) {
        // check for getters/setters
        const descriptor = getPropDescriptor(instance, key) || getPropDescriptor(proto, key)
        const hasGetterSetter = descriptor && (descriptor.get || descriptor.set)

        // apply method only if it does not already exist on the instance
        if (!tag.hasOwnProperty(key) && hasGetterSetter) {
          Object.defineProperty(tag, key, descriptor)
        } else {
          tag[key] = isFunction(instance[key]) ?
            instance[key].bind(tag) :
            instance[key]
        }
      }
    })

    // init method will be called automatically
    if (instance.init)
      instance.init.bind(tag)(tag.opts)
  })

  return tag
}

Added public/riot-3.13.2/lib/browser/tag/component/mount.js.







































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { parseExpressions, parseAttributes } from '../parse'
import RefExpr from '../ref'
import { mixin } from '../core'

import { GLOBAL_MIXIN } from './../../common/global-variables'

import setAttribute from './../../common/util/dom/set-attribute'
import walkAttributes from './../../common/util/dom/walk-attributes'

import each from './../../common/util/misc/each'
import define from './../../common/util/misc/define'

import getImmediateCustomParent from './../../common/util/tags/get-immediate-custom-parent'
import updateOpts from './../../common/util/tags/update-options'
import setMountState from './../../common/util/tags/set-mount-state'

/**
 * Mount the current tag instance
 * @returns { Tag } the current tag instance
 */
export default function componentMount(tag, dom, expressions, opts) {
  const __ = tag.__
  const root = __.root
  root._tag = tag // keep a reference to the tag just created

  // Read all the attrs on this instance. This give us the info we need for updateOpts
  parseAttributes.apply(__.parent, [root, root.attributes, (attr, expr) => {
    if (!__.isAnonymous && RefExpr.isPrototypeOf(expr)) expr.tag = tag
    attr.expr = expr
    __.instAttrs.push(attr)
  }])

  // update the root adding custom attributes coming from the compiler
  walkAttributes(__.impl.attrs, (k, v) => { __.implAttrs.push({name: k, value: v}) })
  parseAttributes.apply(tag, [root, __.implAttrs, (attr, expr) => {
    if (expr) expressions.push(expr)
    else setAttribute(root, attr.name, attr.value)
  }])

  // initialiation
  updateOpts.apply(tag, [__.isLoop, __.parent, __.isAnonymous, opts, __.instAttrs])

  // add global mixins
  const globalMixin = mixin(GLOBAL_MIXIN)

  if (globalMixin && !__.skipAnonymous) {
    for (const i in globalMixin) {
      if (globalMixin.hasOwnProperty(i)) {
        tag.mixin(globalMixin[i])
      }
    }
  }

  if (__.impl.fn) __.impl.fn.call(tag, opts)

  if (!__.skipAnonymous) tag.trigger('before-mount')

  // parse layout after init. fn may calculate args for nested custom tags
  each(parseExpressions.apply(tag, [dom, __.isAnonymous]), e => expressions.push(e))

  tag.update(__.item)

  if (!__.isAnonymous && !__.isInline) {
    while (dom.firstChild) root.appendChild(dom.firstChild)
  }

  define(tag, 'root', root)

  // if we need to wait that the parent "mount" or "updated" event gets triggered
  if (!__.skipAnonymous && tag.parent) {
    const p = getImmediateCustomParent(tag.parent)
    p.one(!p.isMounted ? 'mount' : 'updated', () => {
      setMountState.call(tag, true)
    })
  } else {
    // otherwise it's not a child tag we can trigger its mount event
    setMountState.call(tag, true)
  }

  tag.__.wasCreated = true

  return tag
}

Added public/riot-3.13.2/lib/browser/tag/component/unmount.js.



























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import {
  __TAGS_CACHE,
  ATTRS_PREFIX,
  RIOT_EVENTS_KEY
} from './../../common/global-variables'

import removeAttribute from './../../common/util/dom/remove-attribute'
import walkAttributes from './../../common/util/dom/walk-attributes'
import setInnerHTML from './../../common/util/dom/set-inner-HTML'
import each from './../../common/util/misc/each'
import startsWith from './../../common/util/misc/starts-with'

import unmountAll from './../../common/util/tags/unmount-all'

import arrayishRemove from './../../common/util/tags/arrayish-remove'
import getImmediateCustomParent from './../../common/util/tags/get-immediate-custom-parent'
import setMountState from './../../common/util/tags/set-mount-state'


/**
 * Unmount the tag instance
 * @param { Boolean } mustKeepRoot - if it's true the root node will not be removed
 * @returns { Tag } the current tag instance
 */
export default function tagUnmount(tag, mustKeepRoot, expressions) {
  const __ = tag.__
  const root = __.root
  const tagIndex = __TAGS_CACHE.indexOf(tag)
  const p = root.parentNode

  if (!__.skipAnonymous) tag.trigger('before-unmount')

  // clear all attributes coming from the mounted tag
  walkAttributes(__.impl.attrs, (name) => {
    if (startsWith(name, ATTRS_PREFIX))
      name = name.slice(ATTRS_PREFIX.length)

    removeAttribute(root, name)
  })

  // remove all the event listeners
  tag.__.listeners.forEach((dom) => {
    Object.keys(dom[RIOT_EVENTS_KEY]).forEach((eventName) => {
      dom.removeEventListener(eventName, dom[RIOT_EVENTS_KEY][eventName])
    })
  })

  // remove tag instance from the global tags cache collection
  if (tagIndex !== -1) __TAGS_CACHE.splice(tagIndex, 1)

  // clean up the parent tags object
  if (__.parent && !__.isAnonymous) {
    const ptag = getImmediateCustomParent(__.parent)

    if (__.isVirtual) {
      Object
        .keys(tag.tags)
        .forEach(tagName => arrayishRemove(ptag.tags, tagName, tag.tags[tagName]))
    } else {
      arrayishRemove(ptag.tags, __.tagName, tag)
    }
  }

  // unmount all the virtual directives
  if (tag.__.virts) {
    each(tag.__.virts, (v) => {
      if (v.parentNode) v.parentNode.removeChild(v)
    })
  }

  // allow expressions to unmount themselves
  unmountAll(expressions)
  each(__.instAttrs, a => a.expr && a.expr.unmount && a.expr.unmount())

  // clear the tag html if it's necessary
  if (mustKeepRoot) setInnerHTML(root, '')
  // otherwise detach the root tag from the DOM
  else if (p) p.removeChild(root)

  // custom internal unmount function to avoid relying on the observable
  if (__.onUnmount) __.onUnmount()

  // weird fix for a weird edge case #2409 and #2436
  // some users might use your software not as you've expected
  // so I need to add these dirty hacks to mitigate unexpected issues
  if (!tag.isMounted) setMountState.call(tag, true)

  setMountState.call(tag, false)

  delete root._tag

  return tag
}

Added public/riot-3.13.2/lib/browser/tag/component/update.js.















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import update from '../update'
import extend from './../../common/util/misc/extend'
import isFunction from './../../common/util/checks/is-function'
import updateOpts from './../../common/util/tags/update-options'

/**
 * Update the tag expressions and options
 * @param { Tag } tag - tag object
 * @param { * } data - data we want to use to extend the tag properties
 * @param { Array } expressions - component expressions array
 * @returns { Tag } the current tag instance
 */
export default function componentUpdate(tag, data, expressions) {
  const __ = tag.__
  const nextOpts = {}
  const canTrigger = tag.isMounted && !__.skipAnonymous

  // inherit properties from the parent tag
  if (__.isAnonymous && __.parent) extend(tag, __.parent)
  extend(tag, data)

  updateOpts.apply(tag, [__.isLoop, __.parent, __.isAnonymous, nextOpts, __.instAttrs])

  if (
    canTrigger &&
    tag.isMounted &&
    isFunction(tag.shouldUpdate) && !tag.shouldUpdate(data, nextOpts)
  ) {
    return tag
  }

  extend(tag.opts, nextOpts)

  if (canTrigger) tag.trigger('update', data)
  update.call(tag, expressions)
  if (canTrigger) tag.trigger('updated')

  return tag
}

Added public/riot-3.13.2/lib/browser/tag/core.js.



































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
import styleManager from './styleManager'
import isString from './../common/util/checks/is-string'
import isUndefined from './../common/util/checks/is-undefined'
import isObject from './../common/util/checks/is-object'
import isFunction from './../common/util/checks/is-function'
import setAttribute from './../common/util/dom/set-attribute'
import getAttribute from './../common/util/dom/get-attribute'
import $$ from './../common/util/dom/$$'
import each from './../common/util/misc/each'
import extend from './../common/util/misc/extend'
import mountTo from './../common/util/tags/mount'
import query from './../common/util/tags/query'

import {
  __TAG_IMPL,
  __TAGS_CACHE,
  GLOBAL_MIXIN,
  IS_DIRECTIVE
} from './../common/global-variables'

/**
 * Another way to create a riot tag a bit more es6 friendly
 * @param { HTMLElement } el - tag DOM selector or DOM node/s
 * @param { Object } opts - tag logic
 * @returns { Tag } new riot tag instance
 */
export function Tag(el, opts) {
  // get the tag properties from the class constructor
  const {name, tmpl, css, attrs, onCreate} = this
  // register a new tag and cache the class prototype
  if (!__TAG_IMPL[name]) {
    tag(name, tmpl, css, attrs, onCreate)
    // cache the class constructor
    __TAG_IMPL[name].class = this.constructor
  }

  // mount the tag using the class instance
  mountTo(el, name, opts, this)
  // inject the component css
  if (css) styleManager.inject()

  return this
}

/**
 * Create a new riot tag implementation
 * @param   { String }   name - name/id of the new riot tag
 * @param   { String }   tmpl - tag template
 * @param   { String }   css - custom tag css
 * @param   { String }   attrs - root tag attributes
 * @param   { Function } fn - user function
 * @returns { String } name/id of the tag just created
 */
export function tag(name, tmpl, css, attrs, fn) {
  if (isFunction(attrs)) {
    fn = attrs

    if (/^[\w-]+\s?=/.test(css)) {
      attrs = css
      css = ''
    } else
      attrs = ''
  }

  if (css) {
    if (isFunction(css))
      fn = css
    else
      styleManager.add(css, name)
  }

  name = name.toLowerCase()
  __TAG_IMPL[name] = { name, tmpl, attrs, fn }

  return name
}

/**
 * Create a new riot tag implementation (for use by the compiler)
 * @param   { String }   name - name/id of the new riot tag
 * @param   { String }   tmpl - tag template
 * @param   { String }   css - custom tag css
 * @param   { String }   attrs - root tag attributes
 * @param   { Function } fn - user function
 * @returns { String } name/id of the tag just created
 */
export function tag2(name, tmpl, css, attrs, fn) {
  if (css) styleManager.add(css, name)

  __TAG_IMPL[name] = { name, tmpl, attrs, fn }

  return name
}

/**
 * Mount a tag using a specific tag implementation
 * @param   { * } selector - tag DOM selector or DOM node/s
 * @param   { String } tagName - tag implementation name
 * @param   { Object } opts - tag logic
 * @returns { Array } new tags instances
 */
export function mount(selector, tagName, opts) {
  const tags = []
  let elem, allTags

  function pushTagsTo(root) {
    if (root.tagName) {
      let riotTag = getAttribute(root, IS_DIRECTIVE), tag

      // have tagName? force riot-tag to be the same
      if (tagName && riotTag !== tagName) {
        riotTag = tagName
        setAttribute(root, IS_DIRECTIVE, tagName)
      }

      tag = mountTo(
        root,
        riotTag || root.tagName.toLowerCase(),
        isFunction(opts) ? opts() : opts
      )

      if (tag)
        tags.push(tag)
    } else if (root.length)
      each(root, pushTagsTo) // assume nodeList
  }

  // inject styles into DOM
  styleManager.inject()

  if (isObject(tagName) || isFunction(tagName)) {
    opts = tagName
    tagName = 0
  }

  // crawl the DOM to find the tag
  if (isString(selector)) {
    selector = selector === '*' ?
      // select all registered tags
      // & tags found with the riot-tag attribute set
      allTags = query() :
      // or just the ones named like the selector
      selector + query(selector.split(/, */))

    // make sure to pass always a selector
    // to the querySelectorAll function
    elem = selector ? $$(selector) : []
  }
  else
    // probably you have passed already a tag or a NodeList
    elem = selector

  // select all the registered and mount them inside their root elements
  if (tagName === '*') {
    // get all custom tags
    tagName = allTags || query()
    // if the root els it's just a single tag
    if (elem.tagName)
      elem = $$(tagName, elem)
    else {
      // select all the children for all the different root elements
      var nodeList = []

      each(elem, _el => nodeList.push($$(tagName, _el)))

      elem = nodeList
    }
    // get rid of the tagName
    tagName = 0
  }

  pushTagsTo(elem)

  return tags
}

// Create a mixin that could be globally shared across all the tags
const mixins = {}
const globals = mixins[GLOBAL_MIXIN] = {}
let mixins_id = 0

/**
 * Create/Return a mixin by its name
 * @param   { String }  name - mixin name (global mixin if object)
 * @param   { Object }  mix - mixin logic
 * @param   { Boolean } g - is global?
 * @returns { Object }  the mixin logic
 */
export function mixin(name, mix, g) {
  // Unnamed global
  if (isObject(name)) {
    mixin(`__${mixins_id++}__`, name, true)
    return
  }

  const store = g ? globals : mixins

  // Getter
  if (!mix) {
    if (isUndefined(store[name]))
      throw new Error(`Unregistered mixin: ${ name }`)

    return store[name]
  }

  // Setter
  store[name] = isFunction(mix) ?
    extend(mix.prototype, store[name] || {}) && mix :
    extend(store[name] || {}, mix)
}

/**
 * Update all the tags instances created
 * @returns { Array } all the tags instances
 */
export function update() {
  return each(__TAGS_CACHE, tag => tag.update())
}

export function unregister(name) {
  styleManager.remove(name)
  return delete __TAG_IMPL[name]
}

export const version = 'WIP'

Added public/riot-3.13.2/lib/browser/tag/each.js.































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
import {
  T_STRING,
  T_OBJECT,
  __TAG_IMPL,
  CONDITIONAL_DIRECTIVE,
  LOOP_DIRECTIVE,
  LOOP_NO_REORDER_DIRECTIVE,
  KEY_DIRECTIVE
} from './../common/global-variables'

import isString from './../common/util/checks/is-string'
import isArray from './../common/util/checks/is-array'
import removeAttribute from './../common/util/dom/remove-attribute'
import getAttribute from './../common/util/dom/get-attribute'
import createPlaceholder from './../common/util/dom/create-placeholder'
import safeInsert from './../common/util/dom/safe-insert'
import createFragment from './../common/util/dom/create-fragment'

import each from './../common/util/misc/each'
import contains from './../common/util/misc/contains'
import create from './../common/util/misc/object-create'
import extend from './../common/util/misc/extend'

import moveChild from './../common/util/tags/move-child'
import getTag from './../common/util/tags/get'
import getTagName from './../common/util/tags/get-name'
import arrayishAdd from './../common/util/tags/arrayish-add'
import arrayishRemove from './../common/util/tags/arrayish-remove'
import makeVirtual from './../common/util/tags/make-virtual'
import moveVirtual from './../common/util/tags/move-virtual'

import createTag from './tag'
import { tmpl } from 'riot-tmpl'


/**
 * Convert the item looped into an object used to extend the child tag properties
 * @param   { Object } expr - object containing the keys used to extend the children tags
 * @param   { * } key - value to assign to the new object returned
 * @param   { * } val - value containing the position of the item in the array
 * @returns { Object } - new object containing the values of the original item
 *
 * The variables 'key' and 'val' are arbitrary.
 * They depend on the collection type looped (Array, Object)
 * and on the expression used on the each tag
 *
 */
function mkitem(expr, key, val) {
  const item = {}
  item[expr.key] = key
  if (expr.pos) item[expr.pos] = val
  return item
}

/**
 * Unmount the redundant tags
 * @param   { Array } items - array containing the current items to loop
 * @param   { Array } tags - array containing all the children tags
 */
function unmountRedundant(items, tags, filteredItemsCount) {
  let i = tags.length
  const j = items.length - filteredItemsCount

  while (i > j) {
    i--
    remove.apply(tags[i], [tags, i])
  }
}


/**
 * Remove a child tag
 * @this Tag
 * @param   { Array } tags - tags collection
 * @param   { Number } i - index of the tag to remove
 */
function remove(tags, i) {
  tags.splice(i, 1)
  this.unmount()
  arrayishRemove(this.parent, this, this.__.tagName, true)
}

/**
 * Move the nested custom tags in non custom loop tags
 * @this Tag
 * @param   { Number } i - current position of the loop tag
 */
function moveNestedTags(i) {
  each(Object.keys(this.tags), (tagName) => {
    moveChild.apply(this.tags[tagName], [tagName, i])
  })
}

/**
 * Move a child tag
 * @this Tag
 * @param   { HTMLElement } root - dom node containing all the loop children
 * @param   { Tag } nextTag - instance of the next tag preceding the one we want to move
 * @param   { Boolean } isVirtual - is it a virtual tag?
 */
function move(root, nextTag, isVirtual) {
  if (isVirtual)
    moveVirtual.apply(this, [root, nextTag])
  else
    safeInsert(root, this.root, nextTag.root)
}

/**
 * Insert and mount a child tag
 * @this Tag
 * @param   { HTMLElement } root - dom node containing all the loop children
 * @param   { Tag } nextTag - instance of the next tag preceding the one we want to insert
 * @param   { Boolean } isVirtual - is it a virtual tag?
 */
function insert(root, nextTag, isVirtual) {
  if (isVirtual)
    makeVirtual.apply(this, [root, nextTag])
  else
    safeInsert(root, this.root, nextTag.root)
}

/**
 * Append a new tag into the DOM
 * @this Tag
 * @param   { HTMLElement } root - dom node containing all the loop children
 * @param   { Boolean } isVirtual - is it a virtual tag?
 */
function append(root, isVirtual) {
  if (isVirtual)
    makeVirtual.call(this, root)
  else
    root.appendChild(this.root)
}

/**
 * Return the value we want to use to lookup the postion of our items in the collection
 * @param   { String }  keyAttr         - lookup string or expression
 * @param   { * }       originalItem    - original item from the collection
 * @param   { Object }  keyedItem       - object created by riot via { item, i in collection }
 * @param   { Boolean } hasKeyAttrExpr  - flag to check whether the key is an expression
 * @returns { * } value that we will use to figure out the item position via collection.indexOf
 */
function getItemId(keyAttr, originalItem, keyedItem, hasKeyAttrExpr) {
  if (keyAttr) {
    return hasKeyAttrExpr ?  tmpl(keyAttr, keyedItem) :  originalItem[keyAttr]
  }

  return originalItem
}

/**
 * Manage tags having the 'each'
 * @param   { HTMLElement } dom - DOM node we need to loop
 * @param   { Tag } parent - parent tag instance where the dom node is contained
 * @param   { String } expr - string contained in the 'each' attribute
 * @returns { Object } expression object for this each loop
 */
export default function _each(dom, parent, expr) {
  const mustReorder = typeof getAttribute(dom, LOOP_NO_REORDER_DIRECTIVE) !== T_STRING || removeAttribute(dom, LOOP_NO_REORDER_DIRECTIVE)
  const keyAttr = getAttribute(dom, KEY_DIRECTIVE)
  const hasKeyAttrExpr = keyAttr ? tmpl.hasExpr(keyAttr) : false
  const tagName = getTagName(dom)
  const impl = __TAG_IMPL[tagName]
  const parentNode = dom.parentNode
  const placeholder = createPlaceholder()
  const child = getTag(dom)
  const ifExpr = getAttribute(dom, CONDITIONAL_DIRECTIVE)
  const tags = []
  const isLoop = true
  const innerHTML = dom.innerHTML
  const isAnonymous = !__TAG_IMPL[tagName]
  const isVirtual = dom.tagName === 'VIRTUAL'
  let oldItems = []

  // remove the each property from the original tag
  removeAttribute(dom, LOOP_DIRECTIVE)
  removeAttribute(dom, KEY_DIRECTIVE)

  // parse the each expression
  expr = tmpl.loopKeys(expr)
  expr.isLoop = true

  if (ifExpr) removeAttribute(dom, CONDITIONAL_DIRECTIVE)

  // insert a marked where the loop tags will be injected
  parentNode.insertBefore(placeholder, dom)
  parentNode.removeChild(dom)

  expr.update = function updateEach() {
    // get the new items collection
    expr.value = tmpl(expr.val, parent)

    let items = expr.value
    const frag = createFragment()
    const isObject = !isArray(items) && !isString(items)
    const root = placeholder.parentNode
    const tmpItems = []
    const hasKeys = isObject && !!items

    // if this DOM was removed the update here is useless
    // this condition fixes also a weird async issue on IE in our unit test
    if (!root) return

    // object loop. any changes cause full redraw
    if (isObject) {
      items = items ? Object.keys(items).map(key => mkitem(expr, items[key], key)) : []
    }

    // store the amount of filtered items
    let filteredItemsCount = 0

    // loop all the new items
    each(items, (_item, index) => {
      const i = index - filteredItemsCount
      const item = !hasKeys && expr.key ? mkitem(expr, _item, index) : _item

      // skip this item because it must be filtered
      if (ifExpr && !tmpl(ifExpr, extend(create(parent), item))) {
        filteredItemsCount ++
        return
      }

      const itemId = getItemId(keyAttr, _item, item, hasKeyAttrExpr)
      // reorder only if the items are not objects
      // or a key attribute has been provided
      const doReorder = !isObject && mustReorder && typeof _item === T_OBJECT || keyAttr
      const oldPos = oldItems.indexOf(itemId)
      const isNew = oldPos === -1
      const pos = !isNew && doReorder ? oldPos : i
      // does a tag exist in this position?
      let tag = tags[pos]
      const mustAppend = i >= oldItems.length
      const mustCreate = doReorder && isNew || !doReorder && !tag || !tags[i]

      // new tag
      if (mustCreate) {
        tag = createTag(impl, {
          parent,
          isLoop,
          isAnonymous,
          tagName,
          root: dom.cloneNode(isAnonymous),
          item,
          index: i,
        }, innerHTML)

        // mount the tag
        tag.mount()

        if (mustAppend)
          append.apply(tag, [frag || root, isVirtual])
        else
          insert.apply(tag, [root, tags[i], isVirtual])

        if (!mustAppend) oldItems.splice(i, 0, item)
        tags.splice(i, 0, tag)
        if (child) arrayishAdd(parent.tags, tagName, tag, true)
      } else if (pos !== i && doReorder) {
        // move
        if (keyAttr || contains(items, oldItems[pos])) {
          move.apply(tag, [root, tags[i], isVirtual])
          // move the old tag instance
          tags.splice(i, 0, tags.splice(pos, 1)[0])
          // move the old item
          oldItems.splice(i, 0, oldItems.splice(pos, 1)[0])
        }

        // update the position attribute if it exists
        if (expr.pos) tag[expr.pos] = i

        // if the loop tags are not custom
        // we need to move all their custom tags into the right position
        if (!child && tag.tags) moveNestedTags.call(tag, i)
      }

      // cache the original item to use it in the events bound to this node
      // and its children
      extend(tag.__, {
        item,
        index: i,
        parent
      })

      tmpItems[i] = itemId

      if (!mustCreate) tag.update(item)
    })

    // remove the redundant tags
    unmountRedundant(items, tags, filteredItemsCount)

    // clone the items array
    oldItems = tmpItems.slice()

    root.insertBefore(frag, placeholder)
  }

  expr.unmount = () => {
    each(tags, t => { t.unmount() })
  }

  return expr
}

Added public/riot-3.13.2/lib/browser/tag/if.js.

































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import removeAttribute from './../common/util/dom/remove-attribute'
import createPlacholder from './../common/util/dom/create-placeholder'
import unmountAll from './../common/util/tags/unmount-all'
import extend from './../common/util/misc/extend'
import { tmpl } from 'riot-tmpl'
import { CONDITIONAL_DIRECTIVE } from './../common/global-variables'
import { parseExpressions } from './parse'
import updateAllExpressions from './update'

export default {
  init(dom, tag, expr) {
    removeAttribute(dom, CONDITIONAL_DIRECTIVE)
    extend(this, { tag, expr, stub: createPlacholder(), pristine: dom })
    const p = dom.parentNode
    p.insertBefore(this.stub, dom)
    p.removeChild(dom)

    return this
  },
  update() {
    this.value = tmpl(this.expr, this.tag)

    if (!this.stub.parentNode) return

    if (this.value && !this.current) { // insert
      this.current = this.pristine.cloneNode(true)
      this.stub.parentNode.insertBefore(this.current, this.stub)
      this.expressions = parseExpressions.apply(this.tag, [this.current, true])
    } else if (!this.value && this.current) { // remove
      this.unmount()
      this.current = null
      this.expressions = []
    }

    if (this.value) updateAllExpressions.call(this.tag, this.expressions)
  },
  unmount() {
    if (this.current) {
      if (this.current._tag) {
        this.current._tag.unmount()
      } else if (this.current.parentNode) {
        this.current.parentNode.removeChild(this.current)
      }
    }

    unmountAll(this.expressions || [])
  }
}

Added public/riot-3.13.2/lib/browser/tag/mkdom.js.





















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import makeElement from './../common/util/dom/make-element'
import setInnerHTML from './../common/util/dom/set-inner-HTML'
import $ from './../common/util/dom/$'

import {
  IE_VERSION,
  RE_SPECIAL_TAGS,
  RE_SPECIAL_TAGS_NO_OPTION
} from './../common/global-variables'

/*
  Includes hacks needed for the Internet Explorer version 9 and below
  See: http://kangax.github.io/compat-table/es5/#ie8
       http://codeplanet.io/dropping-ie8/
*/

const
  reHasYield  = /<yield\b/i,
  reYieldAll  = /<yield\s*(?:\/>|>([\S\s]*?)<\/yield\s*>|>)/ig,
  reYieldSrc  = /<yield\s+to=['"]([^'">]*)['"]\s*>([\S\s]*?)<\/yield\s*>/ig,
  reYieldDest = /<yield\s+from=['"]?([-\w]+)['"]?\s*(?:\/>|>([\S\s]*?)<\/yield\s*>)/ig,
  rootEls = { tr: 'tbody', th: 'tr', td: 'tr', col: 'colgroup' },
  tblTags = IE_VERSION && IE_VERSION < 10 ? RE_SPECIAL_TAGS : RE_SPECIAL_TAGS_NO_OPTION,
  GENERIC = 'div',
  SVG = 'svg'


/*
  Creates the root element for table or select child elements:
  tr/th/td/thead/tfoot/tbody/caption/col/colgroup/option/optgroup
*/
function specialTags(el, tmpl, tagName) {

  let
    select = tagName[0] === 'o',
    parent = select ? 'select>' : 'table>'

  // trim() is important here, this ensures we don't have artifacts,
  // so we can check if we have only one element inside the parent
  el.innerHTML = '<' + parent + tmpl.trim() + '</' + parent
  parent = el.firstChild

  // returns the immediate parent if tr/th/td/col is the only element, if not
  // returns the whole tree, as this can include additional elements
  /* istanbul ignore next */
  if (select) {
    parent.selectedIndex = -1  // for IE9, compatible w/current riot behavior
  } else {
    // avoids insertion of cointainer inside container (ex: tbody inside tbody)
    const tname = rootEls[tagName]
    if (tname && parent.childElementCount === 1) parent = $(tname, parent)
  }
  return parent
}

/*
  Replace the yield tag from any tag template with the innerHTML of the
  original tag in the page
*/
function replaceYield(tmpl, html) {
  // do nothing if no yield
  if (!reHasYield.test(tmpl)) return tmpl

  // be careful with #1343 - string on the source having `$1`
  const src = {}

  html = html && html.replace(reYieldSrc, function (_, ref, text) {
    src[ref] = src[ref] || text   // preserve first definition
    return ''
  }).trim()

  return tmpl
    .replace(reYieldDest, function (_, ref, def) {  // yield with from - to attrs
      return src[ref] || def || ''
    })
    .replace(reYieldAll, function (_, def) {        // yield without any "from"
      return html || def || ''
    })
}

/**
 * Creates a DOM element to wrap the given content. Normally an `DIV`, but can be
 * also a `TABLE`, `SELECT`, `TBODY`, `TR`, or `COLGROUP` element.
 *
 * @param   { String } tmpl  - The template coming from the custom tag definition
 * @param   { String } html - HTML content that comes from the DOM element where you
 *           will mount the tag, mostly the original tag in the page
 * @param   { Boolean } isSvg - true if the root node is an svg
 * @returns { HTMLElement } DOM element with _tmpl_ merged through `YIELD` with the _html_.
 */
export default function mkdom(tmpl, html, isSvg) {
  const match   = tmpl && tmpl.match(/^\s*<([-\w]+)/)
  const  tagName = match && match[1].toLowerCase()
  let el = makeElement(isSvg ? SVG : GENERIC)

  // replace all the yield tags with the tag inner html
  tmpl = replaceYield(tmpl, html)

  /* istanbul ignore next */
  if (tblTags.test(tagName))
    el = specialTags(el, tmpl, tagName)
  else
    setInnerHTML(el, tmpl, isSvg)

  return el
}

Added public/riot-3.13.2/lib/browser/tag/parse.js.

















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import _each from './each'
import { tmpl } from 'riot-tmpl'
import {
  CONDITIONAL_DIRECTIVE,
  LOOP_DIRECTIVE,
  IS_DIRECTIVE,
  REF_DIRECTIVES,
  YIELD_TAG
} from './../common/global-variables'

import createRefDirective from './../common/util/tags/create-ref-directive'
import createIfDirective from './../common/util/tags/create-if-directive'
import isBoolAttr from './../common/util/checks/is-boolean-attribute'
import walkNodes from './../common/util/dom/walk-nodes'
import getAttribute from './../common/util/dom/get-attribute'
import setAttribute from './../common/util/dom/set-attribute'
import each from './../common/util/misc/each'
import contains from './../common/util/misc/contains'
import warn from './../common/util/misc/warn'
import getTag from './../common/util/tags/get'
import initChild from './../common/util/tags/init-child'
import createTag from './tag'

/**
 * Walk the tag DOM to detect the expressions to evaluate
 * @this Tag
 * @param   { HTMLElement } root - root tag where we will start digging the expressions
 * @param   { Boolean } mustIncludeRoot - flag to decide whether the root must be parsed as well
 * @returns { Array } all the expressions found
 */
export function parseExpressions(root, mustIncludeRoot) {
  const expressions = []

  walkNodes(root, (dom) => {
    const type = dom.nodeType
    let attr
    let tagImpl

    if (!mustIncludeRoot && dom === root) return

    // text node
    if (type === 3 && dom.parentNode.tagName !== 'STYLE' && tmpl.hasExpr(dom.nodeValue))
      expressions.push({dom, expr: dom.nodeValue})

    if (type !== 1) return

    const isVirtual = dom.tagName === 'VIRTUAL'

    // loop. each does it's own thing (for now)
    if (attr = getAttribute(dom, LOOP_DIRECTIVE)) {
      if(isVirtual) setAttribute(dom, 'loopVirtual', true) // ignore here, handled in _each
      expressions.push(_each(dom, this, attr))
      return false
    }

    // if-attrs become the new parent. Any following expressions (either on the current
    // element, or below it) become children of this expression.
    if (attr = getAttribute(dom, CONDITIONAL_DIRECTIVE)) {
      expressions.push(createIfDirective(dom, this, attr))
      return false
    }

    if (attr = getAttribute(dom, IS_DIRECTIVE)) {
      if (tmpl.hasExpr(attr)) {
        expressions.push({
          isRtag: true,
          expr: attr,
          dom,
          attrs: [].slice.call(dom.attributes)
        })

        return false
      }
    }

    // if this is a tag, stop traversing here.
    // we ignore the root, since parseExpressions is called while we're mounting that root
    tagImpl = getTag(dom)

    if(isVirtual) {
      if(getAttribute(dom, 'virtualized')) {dom.parentElement.removeChild(dom) } // tag created, remove from dom
      if(!tagImpl && !getAttribute(dom, 'virtualized') && !getAttribute(dom, 'loopVirtual'))  // ok to create virtual tag
        tagImpl = { tmpl: dom.outerHTML }
    }

    if (tagImpl && (dom !== root || mustIncludeRoot)) {
      const hasIsDirective = getAttribute(dom, IS_DIRECTIVE)
      if(isVirtual && !hasIsDirective) { // handled in update
        // can not remove attribute like directives
        // so flag for removal after creation to prevent maximum stack error
        setAttribute(dom, 'virtualized', true)
        const tag = createTag(
          {tmpl: dom.outerHTML},
          {root: dom, parent: this},
          dom.innerHTML
        )

        expressions.push(tag) // no return, anonymous tag, keep parsing
      } else {
        if (hasIsDirective && isVirtual)
          warn(`Virtual tags shouldn't be used together with the "${IS_DIRECTIVE}" attribute - https://github.com/riot/riot/issues/2511`)

        expressions.push(
          initChild(
            tagImpl,
            {
              root: dom,
              parent: this
            },
            dom.innerHTML,
            this
          )
        )
        return false
      }
    }

    // attribute expressions
    parseAttributes.apply(this, [dom, dom.attributes, (attr, expr) => {
      if (!expr) return
      expressions.push(expr)
    }])
  })

  return expressions
}

/**
 * Calls `fn` for every attribute on an element. If that attr has an expression,
 * it is also passed to fn.
 * @this Tag
 * @param   { HTMLElement } dom - dom node to parse
 * @param   { Array } attrs - array of attributes
 * @param   { Function } fn - callback to exec on any iteration
 */
export function parseAttributes(dom, attrs, fn) {
  each(attrs, (attr) => {
    if (!attr) return false

    const name = attr.name
    const bool = isBoolAttr(name)
    let expr

    if (contains(REF_DIRECTIVES, name) && dom.tagName.toLowerCase() !== YIELD_TAG) {
      expr =  createRefDirective(dom, this, name, attr.value)
    } else if (tmpl.hasExpr(attr.value)) {
      expr = {dom, expr: attr.value, attr: name, bool}
    }

    fn(attr, expr)
  })
}

Added public/riot-3.13.2/lib/browser/tag/ref.js.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { tmpl } from 'riot-tmpl'
import isBlank from './../common/util/checks/is-blank'
import isString from './../common/util/checks/is-string'
import removeAttribute from './../common/util/dom/remove-attribute'
import setAttribute from './../common/util/dom/set-attribute'

import {
  getImmediateCustomParentTag,
  arrayishAdd,
  arrayishRemove
} from './../common/util/tags'

export default {
  init(dom, parent, attrName, attrValue) {
    this.dom = dom
    this.attr = attrName
    this.rawValue = attrValue
    this.parent = parent
    this.hasExp = tmpl.hasExpr(attrValue)
    return this
  },
  update() {
    const old = this.value
    const customParent = this.parent && getImmediateCustomParentTag(this.parent)
    // if the referenced element is a custom tag, then we set the tag itself, rather than DOM
    const tagOrDom = this.dom.__ref || this.tag || this.dom

    this.value = this.hasExp ? tmpl(this.rawValue, this.parent) : this.rawValue

    // the name changed, so we need to remove it from the old key (if present)
    if (!isBlank(old) && customParent) arrayishRemove(customParent.refs, old, tagOrDom)
    if (!isBlank(this.value) && isString(this.value)) {
      // add it to the refs of parent tag (this behavior was changed >=3.0)
      if (customParent) arrayishAdd(
        customParent.refs,
        this.value,
        tagOrDom,
        // use an array if it's a looped node and the ref is not an expression
        null,
        this.parent.__.index
      )

      if (this.value !== old) {
        setAttribute(this.dom, this.attr, this.value)
      }
    } else {
      removeAttribute(this.dom, this.attr)
    }

    // cache the ref bound to this dom node
    // to reuse it in future (see also #2329)
    if (!this.dom.__ref) this.dom.__ref = tagOrDom
  },
  unmount() {
    const tagOrDom = this.tag || this.dom
    const customParent = this.parent && getImmediateCustomParentTag(this.parent)
    if (!isBlank(this.value) && customParent)
      arrayishRemove(customParent.refs, this.value, tagOrDom)
  }
}

Added public/riot-3.13.2/lib/browser/tag/setEventHandler.js.













































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import isWritable from './../common/util/checks/is-writable'
import contains from './../common/util/misc/contains'
import { RE_EVENTS_PREFIX, RIOT_EVENTS_KEY } from '../common/global-variables'
import getImmediateCustomParent from './../common/util/tags/get-immediate-custom-parent'
import settings from '../../settings'

/**
 * Trigger DOM events
 * @param   { HTMLElement } dom - dom element target of the event
 * @param   { Function } handler - user function
 * @param   { Object } e - event object
 */
function handleEvent(dom, handler, e) {
  let ptag = this.__.parent
  let item = this.__.item

  if (!item)
    while (ptag && !item) {
      item = ptag.__.item
      ptag = ptag.__.parent
    }

  // override the event properties
  /* istanbul ignore next */
  if (isWritable(e, 'currentTarget')) e.currentTarget = dom
  /* istanbul ignore next */
  if (isWritable(e, 'target')) e.target = e.srcElement
  /* istanbul ignore next */
  if (isWritable(e, 'which')) e.which = e.charCode || e.keyCode

  e.item = item

  handler.call(this, e)

  // avoid auto updates
  if (!settings.autoUpdate) return

  if (!e.preventUpdate) {
    const p = getImmediateCustomParent(this)
    // fixes #2083
    if (p.isMounted) p.update()
  }
}

/**
 * Attach an event to a DOM node
 * @param { String } name - event name
 * @param { Function } handler - event callback
 * @param { Object } dom - dom node
 * @param { Tag } tag - tag instance
 */
export default function setEventHandler(name, handler, dom, tag) {
  let eventName
  const cb = handleEvent.bind(tag, dom, handler)

  // avoid to bind twice the same event
  // possible fix for #2332
  dom[name] = null

  // normalize event name
  eventName = name.replace(RE_EVENTS_PREFIX, '')

  // cache the listener into the listeners array
  if (!contains(tag.__.listeners, dom)) tag.__.listeners.push(dom)
  if (!dom[RIOT_EVENTS_KEY]) dom[RIOT_EVENTS_KEY] = {}
  if (dom[RIOT_EVENTS_KEY][name]) dom.removeEventListener(eventName, dom[RIOT_EVENTS_KEY][name])

  dom[RIOT_EVENTS_KEY][name] = cb
  dom.addEventListener(eventName, cb, false)
}

Added public/riot-3.13.2/lib/browser/tag/styleManager.js.











































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import $ from './../common/util/dom/$'
import makeElement from './../common/util/dom/make-element'
import setAttribute from './../common/util/dom/set-attribute'
import { WIN } from './../common/global-variables'

let styleNode
// Create cache and shortcut to the correct property
let cssTextProp
let byName = {}
let needsInject = false

// skip the following code on the server
if (WIN) {
  styleNode = ((() => {
    // create a new style element with the correct type
    const newNode = makeElement('style')
    // replace any user node or insert the new one into the head
    const userNode = $('style[type=riot]')

    setAttribute(newNode, 'type', 'text/css')
    /* istanbul ignore next */
    if (userNode) {
      if (userNode.id) newNode.id = userNode.id
      userNode.parentNode.replaceChild(newNode, userNode)
    } else document.head.appendChild(newNode)

    return newNode
  }))()
  cssTextProp = styleNode.styleSheet
}

/**
 * Object that will be used to inject and manage the css of every tag instance
 */
export default {
  styleNode,
  /**
   * Save a tag style to be later injected into DOM
   * @param { String } css - css string
   * @param { String } name - if it's passed we will map the css to a tagname
   */
  add(css, name) {
    byName[name] = css
    needsInject = true
  },
  /**
   * Inject all previously saved tag styles into DOM
   * innerHTML seems slow: http://jsperf.com/riot-insert-style
   */
  inject() {
    if (!WIN || !needsInject) return
    needsInject = false
    const style = Object.keys(byName)
      .map(k => byName[k])
      .join('\n')
    /* istanbul ignore next */
    if (cssTextProp) cssTextProp.cssText = style
    else styleNode.innerHTML = style
  },

  /**
   * Remove a tag style of injected DOM later.
   * @param {String} name a registered tagname
   */
  remove(name) {
    delete byName[name]
    needsInject = true
  }
}

Added public/riot-3.13.2/lib/browser/tag/tag.js.









































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import observable from 'riot-observable'
import mkdom from './mkdom'
import settings from '../../settings'
import isSvg from './../common/util/checks/is-svg'
import extend from './../common/util/misc/extend'
import uid from './../common/util/misc/uid'
import define from './../common/util/misc/define'
import getTagName from './../common/util/tags/get-name'
import componentUpdate from './component/update'
import componentMixin from './component/mixin'
import componentMount from './component/mount'
import componentUnmount from './component/unmount'

/**
 * Tag creation factory function
 * @constructor
 * @param { Object } impl - it contains the tag template, and logic
 * @param { Object } conf - tag options
 * @param { String } innerHTML - html that eventually we need to inject in the tag
 */
export default function createTag(impl = {}, conf = {}, innerHTML) {
  const tag = conf.context || {}
  const opts = conf.opts || {}
  const parent = conf.parent
  const isLoop = conf.isLoop
  const isAnonymous = !!conf.isAnonymous
  const skipAnonymous = settings.skipAnonymousTags && isAnonymous
  const item = conf.item
  // available only for the looped nodes
  const index = conf.index
  // All attributes on the Tag when it's first parsed
  const instAttrs = []
  // expressions on this type of Tag
  const implAttrs = []
  const tmpl = impl.tmpl
  const expressions = []
  const root = conf.root
  const tagName = conf.tagName || getTagName(root)
  const isVirtual = tagName === 'virtual'
  const isInline = !isVirtual && !tmpl
  let dom

  if (isInline || isLoop && isAnonymous) {
    dom = root
  } else {
    if (!isVirtual) root.innerHTML = ''
    dom = mkdom(tmpl, innerHTML, isSvg(root))
  }

  // make this tag observable
  if (!skipAnonymous) observable(tag)

  // only call unmount if we have a valid __TAG_IMPL (has name property)
  if (impl.name && root._tag) root._tag.unmount(true)

  define(tag, '__', {
    impl,
    root,
    skipAnonymous,
    implAttrs,
    isAnonymous,
    instAttrs,
    innerHTML,
    tagName,
    index,
    isLoop,
    isInline,
    item,
    parent,
    // tags having event listeners
    // it would be better to use weak maps here but we can not introduce breaking changes now
    listeners: [],
    // these vars will be needed only for the virtual tags
    virts: [],
    wasCreated: false,
    tail: null,
    head: null
  })

  // tag protected properties
  return [
    ['isMounted', false],
    // create a unique id to this tag
    // it could be handy to use it also to improve the virtual dom rendering speed
    ['_riot_id', uid()],
    ['root', root],
    ['opts', opts, { writable: true, enumerable: true }],
    ['parent', parent || null],
    // protect the "tags" and "refs" property from being overridden
    ['tags', {}],
    ['refs', {}],
    ['update', data => componentUpdate(tag, data, expressions)],
    ['mixin', (...mixins) => componentMixin(tag, ...mixins)],
    ['mount', () => componentMount(tag, dom, expressions, opts)],
    ['unmount', mustKeepRoot => componentUnmount(tag, mustKeepRoot, expressions)]
  ].reduce((acc, [key, value, opts]) => {
    define(tag, key, value, opts)
    return acc
  }, extend(tag, item))
}

Added public/riot-3.13.2/lib/browser/tag/update.js.































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
import { tmpl } from 'riot-tmpl'
import each from './../common/util/misc/each'
import contains from './../common/util/misc/contains'
import riotSettings from '../../settings'

import isBlank from './../common/util/checks/is-blank'
import isObject from './../common/util/checks/is-object'
import isString from './../common/util/checks/is-string'
import isFunction from './../common/util/checks/is-function'

import removeAttribute from './../common/util/dom/remove-attribute'
import getAttribute from './../common/util/dom/get-attribute'
import setAttribute from './../common/util/dom/set-attribute'
import createPlaceholder from './../common/util/dom/create-placeholder'
import toggleVisibility from './../common/util/dom/toggle-visibility'
import styleObjectToString from './../common/util/dom/style-object-to-string'
import isEventAttribute from './../common/util/misc/is-event-attribute'

import setEventHandler from './setEventHandler'

import initChild from './../common/util/tags/init-child'
import arrayishRemove from './../common/util/tags/arrayish-remove'
import inheritParentProps from './../common/util/tags/inherit-parent-properties'
import replaceVirtual from './../common/util/tags/replace-virtual'

import {
  __TAG_IMPL,
  ATTRS_PREFIX,
  SHOW_DIRECTIVE,
  HIDE_DIRECTIVE,
  IE_VERSION,
  CASE_SENSITIVE_ATTRIBUTES
} from './../common/global-variables'

/**
 * Update dynamically created data-is tags with changing expressions
 * @param { Object } expr - expression tag and expression info
 * @param { Tag }    parent - parent for tag creation
 * @param { String } tagName - tag implementation we want to use
 */
export function updateDataIs(expr, parent, tagName) {
  let tag = expr.tag || expr.dom._tag
  let ref

  const { head } = tag ? tag.__ : {}
  const isVirtual = expr.dom.tagName === 'VIRTUAL'

  if (tag && expr.tagName === tagName) {
    tag.update()
    return
  }

  // sync _parent to accommodate changing tagnames
  if (tag) {
    // need placeholder before unmount
    if(isVirtual) {
      ref = createPlaceholder()
      head.parentNode.insertBefore(ref, head)
    }

    tag.unmount(true)
  }

  // unable to get the tag name
  if (!isString(tagName)) return

  expr.impl = __TAG_IMPL[tagName]

  // unknown implementation
  if (!expr.impl) return

  expr.tag = tag = initChild(
    expr.impl, {
      root: expr.dom,
      parent,
      tagName
    },
    expr.dom.innerHTML,
    parent
  )

  each(expr.attrs, a => setAttribute(tag.root, a.name, a.value))
  expr.tagName = tagName
  tag.mount()

  // root exist first time, after use placeholder
  if (isVirtual) replaceVirtual(tag, ref || tag.root)

  // parent is the placeholder tag, not the dynamic tag so clean up
  parent.__.onUnmount = () => {
    const delName = tag.opts.dataIs
    arrayishRemove(tag.parent.tags, delName, tag)
    arrayishRemove(tag.__.parent.tags, delName, tag)
    tag.unmount()
  }
}

/**
 * Nomalize any attribute removing the "riot-" prefix
 * @param   { String } attrName - original attribute name
 * @returns { String } valid html attribute name
 */
export function normalizeAttrName(attrName) {
  if (!attrName) return null
  attrName = attrName.replace(ATTRS_PREFIX, '')
  if (CASE_SENSITIVE_ATTRIBUTES[attrName]) attrName = CASE_SENSITIVE_ATTRIBUTES[attrName]
  return attrName
}

/**
 * Update on single tag expression
 * @this Tag
 * @param { Object } expr - expression logic
 * @returns { undefined }
 */
export function updateExpression(expr) {
  if (this.root && getAttribute(this.root,'virtualized')) return

  const dom = expr.dom
  // remove the riot- prefix
  const attrName = normalizeAttrName(expr.attr)
  const isToggle = contains([SHOW_DIRECTIVE, HIDE_DIRECTIVE], attrName)
  const isVirtual = expr.root && expr.root.tagName === 'VIRTUAL'
  const { isAnonymous } = this.__
  const parent = dom && (expr.parent || dom.parentNode)
  const { keepValueAttributes } = riotSettings
  // detect the style attributes
  const isStyleAttr = attrName === 'style'
  const isClassAttr = attrName === 'class'
  const isValueAttr = attrName === 'value'

  let value

  // if it's a tag we could totally skip the rest
  if (expr._riot_id) {
    if (expr.__.wasCreated) {
      expr.update()
    // if it hasn't been mounted yet, do that now.
    } else {
      expr.mount()
      if (isVirtual) {
        replaceVirtual(expr, expr.root)
      }
    }
    return
  }

  // if this expression has the update method it means it can handle the DOM changes by itself
  if (expr.update) return expr.update()

  const context = isToggle && !isAnonymous ? inheritParentProps.call(this) : this

  // ...it seems to be a simple expression so we try to calculate its value
  value = tmpl(expr.expr, context)

  const hasValue = !isBlank(value)
  const isObj = isObject(value)

  // convert the style/class objects to strings
  if (isObj) {
    if (isClassAttr) {
      value = tmpl(JSON.stringify(value), this)
    } else if (isStyleAttr) {
      value = styleObjectToString(value)
    }
  }

  // remove original attribute
  if (expr.attr &&
      (
        // the original attribute can be removed only if we are parsing the original expression
        !expr.wasParsedOnce ||
        // or its value is false
        value === false ||
        // or if its value is currently falsy...
        // We will keep the "value" attributes if the "keepValueAttributes"
        // is enabled though
        (!hasValue && (!isValueAttr || isValueAttr && !keepValueAttributes))
      )
  ) {
    // remove either riot-* attributes or just the attribute name
    removeAttribute(dom, getAttribute(dom, expr.attr) ? expr.attr : attrName)
  }

  // for the boolean attributes we don't need the value
  // we can convert it to checked=true to checked=checked
  if (expr.bool) value = value ? attrName : false
  if (expr.isRtag) return updateDataIs(expr, this, value)
  if (expr.wasParsedOnce && expr.value === value) return

  // update the expression value
  expr.value = value
  expr.wasParsedOnce = true

  // if the value is an object (and it's not a style or class attribute) we can not do much more with it
  if (isObj && !isClassAttr && !isStyleAttr && !isToggle) return
  // avoid to render undefined/null values
  if (!hasValue) value = ''

  // textarea and text nodes have no attribute name
  if (!attrName) {
    // about #815 w/o replace: the browser converts the value to a string,
    // the comparison by "==" does too, but not in the server
    value += ''
    // test for parent avoids error with invalid assignment to nodeValue
    if (parent) {
      // cache the parent node because somehow it will become null on IE
      // on the next iteration
      expr.parent = parent
      if (parent.tagName === 'TEXTAREA') {
        parent.value = value                    // #1113
        if (!IE_VERSION) dom.nodeValue = value  // #1625 IE throws here, nodeValue
      }                                         // will be available on 'updated'
      else dom.nodeValue = value
    }
    return
  }

  switch (true) {
  // handle events binding
  case isFunction(value):
    if (isEventAttribute(attrName)) {
      setEventHandler(attrName, value, dom, this)
    }
    break
  // show / hide
  case isToggle:
    toggleVisibility(dom, attrName === HIDE_DIRECTIVE ? !value : value)
    break
  // handle attributes
  default:
    if (expr.bool) {
      dom[attrName] = value
    }

    if (isValueAttr && dom.value !== value) {
      dom.value = value
    } else if (hasValue && value !== false) {
      setAttribute(dom, attrName, value)
    }

    // make sure that in case of style changes
    // the element stays hidden
    if (isStyleAttr && dom.hidden) toggleVisibility(dom, false)
  }
}

/**
 * Update all the expressions in a Tag instance
 * @this Tag
 * @param { Array } expressions - expression that must be re evaluated
 */
export default function update(expressions) {
  each(expressions, updateExpression.bind(this))
}

Added public/riot-3.13.2/lib/riot+compiler.js.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import * as riot from './riot'
import { compile, parsers } from './browser/compiler/index'
import extend from './browser/common/util/misc/extend'

function mount(...args) {
  var ret
  compile(function () { ret = riot.mount.apply(riot, args) })
  return ret
}

export default extend({}, riot, {
  mount,
  compile,
  parsers
})

Added public/riot-3.13.2/lib/riot.js.

























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import styleManager from './browser/tag/styleManager'
import { tmpl, brackets } from 'riot-tmpl'
import o from 'riot-observable'
import s from './settings'
import { __TAGS_CACHE as vdom } from './browser/common/global-variables'
import * as dom from './browser/common/util/dom'
import * as check from './browser/common/util/checks' // avoid to add breaking changes
import * as misc from './browser/common/util/misc'
import * as tags from './browser/common/util/tags'
import * as core from './browser/tag/core'

/**
 * Riot public api
 */
export const settings = s
export const util = {
  tmpl,
  brackets,
  styleManager,
  vdom,
  styleNode: styleManager.styleNode,
  // export the riot internal utils as well
  dom,
  check,
  misc,
  tags
}

// export the core props/methods
export const Tag = core.Tag
export const tag = core.tag
export const tag2 = core.tag2
export const mount = core.mount
export const mixin = core.mixin
export const update = core.update
export const unregister = core.unregister
export const version = core.version
export const observable = o

export default misc.extend({}, core, {
  observable: o,
  settings,
  util,
})

Added public/riot-3.13.2/lib/server/index.js.



























































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125

// allow to require('riot')
const
  path = require('path'),
  fs = require('fs'),
  hasRiotPath = !!process.env.RIOT,
  riotPath = path.normalize(process.env.RIOT || path.join('..', '..', 'riot')),
  riot = require(riotPath),
  // simple-dom helper
  sdom = require('./sdom'),
  Module = require('module'),
  compiler = require('riot-compiler')

// fix #2225
// rollup considers the riot.default key as default export value instead of what we export here
delete riot.default

// time riot should wait before throwing during an async rendering
riot.settings.asyncRenderTimeout = 1000

/**
 * Function that will be used by riot.require and by require('some.tag')
 * @param   { String } filename - path to the file to load and compile
 * @param   { Object } opts     - compiler options
 * @param   { Object } context  - context where the tag will be mounted (Module)
 */
function loadAndCompile(filename, opts, context) {
  const src = compiler.compile(fs.readFileSync(filename, 'utf8'), opts)
  const preTag = src.substring(0, src.indexOf('riot.tag'))
  const tagDefinition = src.substring(src.indexOf('riot.tag'))

  // here we will use template strings in riot@3.0.0
  context._compile(`
    var riot = require('${ hasRiotPath ? riotPath : 'riot' }')
    ${ preTag }
    module.exports = ${ tagDefinition }
  `, filename)
}

/**
 * Enable the loading of riot tags with options riot.require('some.tag', { template: 'pug' })
 * @param   { String } filename - path to the file to load and compile
 * @param   { Object } opts     - compiler options
 * @returns { String } tag name
 */
function riotRequire(filename, opts) {
  var module = new Module()
  module.id = module.filename = filename
  loadAndCompile(filename, opts, module)
  return module.exports
}

// allow to require('some.tag')
if (require.extensions) {
  require.extensions['.tag'] = function(module, filename) {
    loadAndCompile(filename, {}, module)
  }
}

/**
 * Get the html as string form any riot tag instance
 * @param   { Tag } tag - riot tag instance
 * @returns { String }  tag template
 */
function getTagHtml(tag) {
  return sdom.serialize(tag.root)
}

/**
 * Render riot tags returning a strings
 * @param   { String } tagName - tag identifier
 * @param   { Object } opts    - options to pass to the tag
 * @returns { String } tag resulting template
 */
function render(tagName, opts) {
  var tag = render.tag(tagName, opts),
    html = getTagHtml(tag)
  // unmount the tag avoiding memory leaks
  tag.unmount()
  return html
}

/**
 * Render riot tags asynchronously
 * @param   { String } tagName - tag identifier
 * @param   { Object } opts    - options to pass to the tag
 * @returns { Promise } a promise resolved with the tag template string
 */
function renderAsync(tagName, opts) {
  return Promise.race([
    new Promise((resolve, reject) => {
      setTimeout(function() {
        reject(new Error(`Timeout error:: the tag "${ tagName }" didn't trigger the "ready" event during the rendering process`))
      }, riot.settings.asyncRenderTimeout)
    }),
    new Promise(resolve => {
      var tag = render.tag(tagName, opts)
      tag.on('ready', function() {
        var html = getTagHtml(tag)
        tag.unmount()
        resolve(html)
      })
    })
  ])
}

// extend the render function with some static methods
render.dom = function(tagName, opts) {
  return riot.render.tag(tagName, opts).root
}
render.tag = function(tagName, opts) {
  var root = document.createElement(tagName),
    tag = riot.mount(root, opts)[0]
  return tag
}

// extend the riot api adding some useful serverside methods
module.exports = exports.default = Object.assign(riot, {
  // allow to require('riot').compile
  compile: compiler.compile,
  parsers: compiler.parsers,
  require: riotRequire,
  render,
  renderAsync
})

Added public/riot-3.13.2/lib/server/sdom.js.































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// simple-dom helper

var simpleDom = require('simple-dom')
var simpleTokenizer = require('simple-html-tokenizer')

// create `document` to make riot work
if (typeof window === 'undefined') {
  /*eslint-disable*/
  document = new simpleDom.Document()
  /*eslint-enable*/
}

// easy like a pie! closes #1780
document.createElementNS = document.createElement

// add `innerHTML` property to simple-dom element
Object.defineProperty(simpleDom.Element.prototype, 'innerHTML', {
  set: function(html) {
    var frag = sdom.parse(html)
    while (this.firstChild) this.removeChild(this.firstChild)
    this.appendChild(frag)
  },
  get: function() {
    var html = '',
      next = this.firstChild

    while (next) {
      html += sdom.serialize(next)
      next = next.nextSibling
    }

    return html
  }
})


// add `addEventListener` property to simple-dom element
Object.defineProperty(simpleDom.Element.prototype, 'addEventListener', {
  value: function(type, fn) {
    this[`on${ type }`] = fn
  }
})

Object.defineProperty(simpleDom.Element.prototype, 'removeEventListener', {
  value: function(type) {
    this[`on${ type }`] = null
  }
})

// set the value attribute correctly on the input tags
Object.defineProperty(simpleDom.Element.prototype, 'value', {
  set: function(val) {
    val = String(val) // make sure it's always a string
    if (this.getAttribute('value') !== val) {
      this.setAttribute('value', val)
      this.value = val
    }
  }
})

// add `outerHTML` property to simple-dom element
Object.defineProperty(simpleDom.Element.prototype, 'outerHTML', {
  get: function() {
    var html = sdom.serialize(this)
    var rxstr = '^(<' + this.tagName + '>.*?</' + this.tagName + '>)'
    var match = html.match(new RegExp(rxstr, 'i'))
    return match ? match[0] : html
  }
})

// add `style` property to simple-dom element
Object.defineProperty(simpleDom.Element.prototype, 'style', {
  get: function() {
    var el = this
    return Object.defineProperty({}, 'display', {
      set: function(value) {
        el.setAttribute('style', 'display: ' + value + ';')
      }
    })
  }
})

var sdom = module.exports = {
  parse: function(html) {
    // parse html string to simple-dom document
    var blank = new simpleDom.Document()
    var parser = new simpleDom.HTMLParser(simpleTokenizer.tokenize, blank, simpleDom.voidMap)
    return parser.parse(html)
  },
  serialize: function(doc) {
    // serialize simple-dom document to html string
    var serializer = new simpleDom.HTMLSerializer(simpleDom.voidMap)
    return serializer.serialize(doc)
  }
}

Added public/riot-3.13.2/lib/settings.js.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
import extend from './browser/common/util/misc/extend'
import create from './browser/common/util/misc/object-create'
import { brackets } from 'riot-tmpl'

export default extend(create(brackets.settings), {
  skipAnonymousTags: true,
  // the "value" attributes will be preserved
  keepValueAttributes: false,
  // handle the auto updates on any DOM event
  autoUpdate: true
})

Added public/riot-3.13.2/package-lock.json.





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
{
  "name": "riot",
  "version": "3.13.1",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "@sinonjs/formatio": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz",
      "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==",
      "dev": true,
      "requires": {
        "samsam": "1.3.0"
      }
    },
    "@types/estree": {
      "version": "0.0.39",
      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
      "dev": true
    },
    "@types/node": {
      "version": "9.6.5",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.5.tgz",
      "integrity": "sha512-NOLEgsT6UiDTjnWG5Hd2Mg25LRyz/oe8ql3wbjzgSFeRzRROhPmtlsvIrei4B46UjERF0td9SZ1ZXPLOdcrBHg==",
      "dev": true
    },
    "abab": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
      "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
      "dev": true
    },
    "abbrev": {
      "version": "1.0.9",
      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
      "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
      "dev": true
    },
    "accepts": {
      "version": "1.3.5",
      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
      "dev": true,
      "requires": {
        "mime-types": "~2.1.18",
        "negotiator": "0.6.1"
      }
    },
    "acorn": {
      "version": "5.5.3",
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
      "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
      "dev": true
    },
    "acorn-dynamic-import": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
      "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
      "dev": true,
      "requires": {
        "acorn": "^5.0.0"
      }
    },
    "acorn-globals": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz",
      "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==",
      "dev": true,
      "requires": {
        "acorn": "^5.0.0"
      }
    },
    "acorn-jsx": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
      "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
      "dev": true,
      "requires": {
        "acorn": "^3.0.4"
      },
      "dependencies": {
        "acorn": {
          "version": "3.3.0",
          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
          "dev": true
        }
      }
    },
    "adm-zip": {
      "version": "0.4.11",
      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz",
      "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==",
      "dev": true
    },
    "after": {
      "version": "0.8.2",
      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
      "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
      "dev": true
    },
    "ajv": {
      "version": "5.5.2",
      "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
      "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
      "dev": true,
      "requires": {
        "co": "^4.6.0",
        "fast-deep-equal": "^1.0.0",
        "fast-json-stable-stringify": "^2.0.0",
        "json-schema-traverse": "^0.3.0"
      }
    },
    "ajv-keywords": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
      "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
      "dev": true
    },
    "align-text": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2",
        "longest": "^1.0.1",
        "repeat-string": "^1.5.2"
      }
    },
    "amdefine": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
      "dev": true
    },
    "ansi-escapes": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
      "dev": true
    },
    "ansi-regex": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
      "dev": true
    },
    "ansi-styles": {
      "version": "3.2.1",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
      "requires": {
        "color-convert": "^1.9.0"
      }
    },
    "anymatch": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
      "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
      "requires": {
        "micromatch": "^2.1.5",
        "normalize-path": "^2.0.0"
      }
    },
    "archiver": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz",
      "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=",
      "dev": true,
      "requires": {
        "archiver-utils": "^1.3.0",
        "async": "^2.0.0",
        "buffer-crc32": "^0.2.1",
        "glob": "^7.0.0",
        "lodash": "^4.8.0",
        "readable-stream": "^2.0.0",
        "tar-stream": "^1.5.0",
        "zip-stream": "^1.2.0"
      },
      "dependencies": {
        "async": {
          "version": "2.6.1",
          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
          "dev": true,
          "requires": {
            "lodash": "^4.17.10"
          },
          "dependencies": {
            "lodash": {
              "version": "4.17.11",
              "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
              "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
              "dev": true
            }
          }
        }
      }
    },
    "archiver-utils": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
      "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
      "dev": true,
      "requires": {
        "glob": "^7.0.0",
        "graceful-fs": "^4.1.0",
        "lazystream": "^1.0.0",
        "lodash": "^4.8.0",
        "normalize-path": "^2.0.0",
        "readable-stream": "^2.0.0"
      }
    },
    "argparse": {
      "version": "1.0.10",
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
      "dev": true,
      "requires": {
        "sprintf-js": "~1.0.2"
      }
    },
    "arr-diff": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
      "requires": {
        "arr-flatten": "^1.0.1"
      }
    },
    "arr-flatten": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
    },
    "arr-union": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
      "dev": true
    },
    "array-equal": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
      "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
      "dev": true
    },
    "array-find-index": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
      "dev": true
    },
    "array-slice": {
      "version": "0.2.3",
      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
      "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
      "dev": true
    },
    "array-union": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
      "dev": true,
      "requires": {
        "array-uniq": "^1.0.1"
      }
    },
    "array-uniq": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
      "dev": true
    },
    "array-unique": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
    },
    "arraybuffer.slice": {
      "version": "0.0.7",
      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
      "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
      "dev": true
    },
    "arrify": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
      "dev": true
    },
    "asn1": {
      "version": "0.2.4",
      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
      "dev": true,
      "requires": {
        "safer-buffer": "~2.1.0"
      }
    },
    "assert-plus": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
      "dev": true
    },
    "assertion-error": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
      "dev": true
    },
    "assign-symbols": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
      "dev": true
    },
    "async": {
      "version": "1.5.2",
      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
      "dev": true
    },
    "async-each": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
    },
    "async-limiter": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
      "dev": true
    },
    "asynckit": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
      "dev": true
    },
    "atob": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
      "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
      "dev": true
    },
    "aws-sign2": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
      "dev": true
    },
    "aws4": {
      "version": "1.8.0",
      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
      "dev": true
    },
    "babel-code-frame": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
      "dev": true,
      "requires": {
        "chalk": "^1.1.3",
        "esutils": "^2.0.2",
        "js-tokens": "^3.0.2"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "2.2.1",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
          "dev": true
        },
        "chalk": {
          "version": "1.1.3",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
          "dev": true,
          "requires": {
            "ansi-styles": "^2.2.1",
            "escape-string-regexp": "^1.0.2",
            "has-ansi": "^2.0.0",
            "strip-ansi": "^3.0.0",
            "supports-color": "^2.0.0"
          }
        },
        "supports-color": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
          "dev": true
        }
      }
    },
    "backo2": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
      "dev": true
    },
    "balanced-match": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
    },
    "base": {
      "version": "0.11.2",
      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
      "dev": true,
      "requires": {
        "cache-base": "^1.0.1",
        "class-utils": "^0.3.5",
        "component-emitter": "^1.2.1",
        "define-property": "^1.0.0",
        "isobject": "^3.0.1",
        "mixin-deep": "^1.2.0",
        "pascalcase": "^0.1.1"
      },
      "dependencies": {
        "define-property": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^1.0.0"
          }
        },
        "is-accessor-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-data-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-descriptor": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^1.0.0",
            "is-data-descriptor": "^1.0.0",
            "kind-of": "^6.0.2"
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        }
      }
    },
    "base64-arraybuffer": {
      "version": "0.1.5",
      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
      "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
      "dev": true
    },
    "base64-js": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
      "dev": true
    },
    "base64id": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
      "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
      "dev": true
    },
    "bcrypt-pbkdf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
      "dev": true,
      "requires": {
        "tweetnacl": "^0.14.3"
      }
    },
    "benchmark": {
      "version": "2.1.4",
      "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
      "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
      "dev": true,
      "requires": {
        "lodash": "^4.17.4",
        "platform": "^1.3.3"
      }
    },
    "better-assert": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
      "dev": true,
      "requires": {
        "callsite": "1.0.0"
      }
    },
    "binary-extensions": {
      "version": "1.11.0",
      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
      "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
    },
    "bl": {
      "version": "1.2.2",
      "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
      "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
      "dev": true,
      "requires": {
        "readable-stream": "^2.3.5",
        "safe-buffer": "^5.1.1"
      }
    },
    "blob": {
      "version": "0.0.4",
      "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
      "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
      "dev": true
    },
    "bluebird": {
      "version": "3.5.1",
      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
      "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
      "dev": true
    },
    "body-parser": {
      "version": "1.18.3",
      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
      "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
      "dev": true,
      "requires": {
        "bytes": "3.0.0",
        "content-type": "~1.0.4",
        "debug": "2.6.9",
        "depd": "~1.1.2",
        "http-errors": "~1.6.3",
        "iconv-lite": "0.4.23",
        "on-finished": "~2.3.0",
        "qs": "6.5.2",
        "raw-body": "2.3.3",
        "type-is": "~1.6.16"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "dev": true,
          "requires": {
            "ms": "2.0.0"
          }
        },
        "iconv-lite": {
          "version": "0.4.23",
          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
          "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
          "dev": true,
          "requires": {
            "safer-buffer": ">= 2.1.2 < 3"
          }
        },
        "qs": {
          "version": "6.5.2",
          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
          "dev": true
        }
      }
    },
    "boolbase": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
      "dev": true
    },
    "boom": {
      "version": "4.3.1",
      "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
      "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
      "dev": true,
      "requires": {
        "hoek": "4.x.x"
      }
    },
    "brace-expansion": {
      "version": "1.1.11",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
      "requires": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
      }
    },
    "braces": {
      "version": "1.8.5",
      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
      "requires": {
        "expand-range": "^1.8.1",
        "preserve": "^0.2.0",
        "repeat-element": "^1.1.2"
      }
    },
    "browser-process-hrtime": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz",
      "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=",
      "dev": true
    },
    "browser-stdout": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
      "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
      "dev": true
    },
    "buble": {
      "version": "0.19.3",
      "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.3.tgz",
      "integrity": "sha512-3B0Lcy2u6x6km0BqTz/FS3UnrOJlnIlBWsyjvtqzdtmWkqiS0+Sg4hc6L9Mmm63hZKTACpYS9vUeIoKSi1vcrQ==",
      "dev": true,
      "requires": {
        "acorn": "^5.4.1",
        "acorn-dynamic-import": "^3.0.0",
        "acorn-jsx": "^4.1.1",
        "chalk": "^2.3.1",
        "magic-string": "^0.22.4",
        "minimist": "^1.2.0",
        "os-homedir": "^1.0.1",
        "vlq": "^1.0.0"
      },
      "dependencies": {
        "acorn-jsx": {
          "version": "4.1.1",
          "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz",
          "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==",
          "dev": true,
          "requires": {
            "acorn": "^5.0.3"
          }
        }
      }
    },
    "buffer": {
      "version": "5.2.1",
      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
      "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
      "dev": true,
      "requires": {
        "base64-js": "^1.0.2",
        "ieee754": "^1.1.4"
      }
    },
    "buffer-alloc": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
      "dev": true,
      "requires": {
        "buffer-alloc-unsafe": "^1.1.0",
        "buffer-fill": "^1.0.0"
      }
    },
    "buffer-alloc-unsafe": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
      "dev": true
    },
    "buffer-crc32": {
      "version": "0.2.13",
      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
      "dev": true
    },
    "buffer-fill": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
      "dev": true
    },
    "buffer-from": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
      "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
      "dev": true
    },
    "builtin-modules": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
      "dev": true
    },
    "bytes": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
      "dev": true
    },
    "cache-base": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
      "dev": true,
      "requires": {
        "collection-visit": "^1.0.0",
        "component-emitter": "^1.2.1",
        "get-value": "^2.0.6",
        "has-value": "^1.0.0",
        "isobject": "^3.0.1",
        "set-value": "^2.0.0",
        "to-object-path": "^0.3.0",
        "union-value": "^1.0.0",
        "unset-value": "^1.0.0"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "caller-path": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
      "dev": true,
      "requires": {
        "callsites": "^0.2.0"
      }
    },
    "callsite": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
      "dev": true
    },
    "callsites": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
      "dev": true
    },
    "camelcase": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
      "dev": true
    },
    "camelcase-keys": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
      "dev": true,
      "requires": {
        "camelcase": "^2.0.0",
        "map-obj": "^1.0.0"
      }
    },
    "caseless": {
      "version": "0.12.0",
      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
      "dev": true
    },
    "center-align": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
      "dev": true,
      "optional": true,
      "requires": {
        "align-text": "^0.1.3",
        "lazy-cache": "^1.0.3"
      }
    },
    "chai": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
      "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
      "dev": true,
      "requires": {
        "assertion-error": "^1.0.1",
        "check-error": "^1.0.1",
        "deep-eql": "^3.0.0",
        "get-func-name": "^2.0.0",
        "pathval": "^1.0.0",
        "type-detect": "^4.0.0"
      }
    },
    "chalk": {
      "version": "2.3.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
      "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
      "requires": {
        "ansi-styles": "^3.2.1",
        "escape-string-regexp": "^1.0.5",
        "supports-color": "^5.3.0"
      }
    },
    "chardet": {
      "version": "0.4.2",
      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
      "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
      "dev": true
    },
    "check-error": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
      "dev": true
    },
    "cheerio": {
      "version": "1.0.0-rc.2",
      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
      "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
      "dev": true,
      "requires": {
        "css-select": "~1.2.0",
        "dom-serializer": "~0.1.0",
        "entities": "~1.1.1",
        "htmlparser2": "^3.9.1",
        "lodash": "^4.15.0",
        "parse5": "^3.0.1"
      }
    },
    "chokidar": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
      "requires": {
        "anymatch": "^1.3.0",
        "async-each": "^1.0.0",
        "fsevents": "^1.0.0",
        "glob-parent": "^2.0.0",
        "inherits": "^2.0.1",
        "is-binary-path": "^1.0.0",
        "is-glob": "^2.0.0",
        "path-is-absolute": "^1.0.0",
        "readdirp": "^2.0.0"
      }
    },
    "chokidar-cli": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-1.2.1.tgz",
      "integrity": "sha512-JIrV9Z/pT7KjBWp9u+Uba0utdl2rmNaTj6t4ucaFseYDQASHZnWXy6vJIufDX+4FVh081gQZ2odrqorMfQhn7w==",
      "dev": true,
      "requires": {
        "bluebird": "3.5.1",
        "chokidar": "2.0.4",
        "lodash": "4.17.10",
        "yargs": "12.0.1"
      },
      "dependencies": {
        "anymatch": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
          "dev": true,
          "requires": {
            "micromatch": "^3.1.4",
            "normalize-path": "^2.1.1"
          }
        },
        "arr-diff": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
          "dev": true
        },
        "array-unique": {
          "version": "0.3.2",
          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
          "dev": true
        },
        "braces": {
          "version": "2.3.2",
          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
          "dev": true,
          "requires": {
            "arr-flatten": "^1.1.0",
            "array-unique": "^0.3.2",
            "extend-shallow": "^2.0.1",
            "fill-range": "^4.0.0",
            "isobject": "^3.0.1",
            "repeat-element": "^1.1.2",
            "snapdragon": "^0.8.1",
            "snapdragon-node": "^2.0.1",
            "split-string": "^3.0.2",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "chokidar": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
          "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
          "dev": true,
          "requires": {
            "anymatch": "^2.0.0",
            "async-each": "^1.0.0",
            "braces": "^2.3.0",
            "fsevents": "^1.2.2",
            "glob-parent": "^3.1.0",
            "inherits": "^2.0.1",
            "is-binary-path": "^1.0.0",
            "is-glob": "^4.0.0",
            "lodash.debounce": "^4.0.8",
            "normalize-path": "^2.1.1",
            "path-is-absolute": "^1.0.0",
            "readdirp": "^2.0.0",
            "upath": "^1.0.5"
          }
        },
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "dev": true,
          "requires": {
            "ms": "2.0.0"
          }
        },
        "expand-brackets": {
          "version": "2.1.4",
          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
          "dev": true,
          "requires": {
            "debug": "^2.3.3",
            "define-property": "^0.2.5",
            "extend-shallow": "^2.0.1",
            "posix-character-classes": "^0.1.0",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "define-property": {
              "version": "0.2.5",
              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
              "dev": true,
              "requires": {
                "is-descriptor": "^0.1.0"
              }
            },
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            },
            "is-accessor-descriptor": {
              "version": "0.1.6",
              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
              "dev": true,
              "requires": {
                "kind-of": "^3.0.2"
              },
              "dependencies": {
                "kind-of": {
                  "version": "3.2.2",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
                  "dev": true,
                  "requires": {
                    "is-buffer": "^1.1.5"
                  }
                }
              }
            },
            "is-data-descriptor": {
              "version": "0.1.4",
              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
              "dev": true,
              "requires": {
                "kind-of": "^3.0.2"
              },
              "dependencies": {
                "kind-of": {
                  "version": "3.2.2",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
                  "dev": true,
                  "requires": {
                    "is-buffer": "^1.1.5"
                  }
                }
              }
            },
            "is-descriptor": {
              "version": "0.1.6",
              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
              "dev": true,
              "requires": {
                "is-accessor-descriptor": "^0.1.6",
                "is-data-descriptor": "^0.1.4",
                "kind-of": "^5.0.0"
              }
            },
            "kind-of": {
              "version": "5.1.0",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
              "dev": true
            }
          }
        },
        "extglob": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
          "dev": true,
          "requires": {
            "array-unique": "^0.3.2",
            "define-property": "^1.0.0",
            "expand-brackets": "^2.1.4",
            "extend-shallow": "^2.0.1",
            "fragment-cache": "^0.2.1",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "define-property": {
              "version": "1.0.0",
              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
              "dev": true,
              "requires": {
                "is-descriptor": "^1.0.0"
              }
            },
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "fill-range": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
          "dev": true,
          "requires": {
            "extend-shallow": "^2.0.1",
            "is-number": "^3.0.0",
            "repeat-string": "^1.6.1",
            "to-regex-range": "^2.1.0"
          },
          "dependencies": {
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "glob-parent": {
          "version": "3.1.0",
          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
          "dev": true,
          "requires": {
            "is-glob": "^3.1.0",
            "path-dirname": "^1.0.0"
          },
          "dependencies": {
            "is-glob": {
              "version": "3.1.0",
              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
              "dev": true,
              "requires": {
                "is-extglob": "^2.1.0"
              }
            }
          }
        },
        "is-accessor-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-data-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-descriptor": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^1.0.0",
            "is-data-descriptor": "^1.0.0",
            "kind-of": "^6.0.2"
          }
        },
        "is-extglob": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
          "dev": true
        },
        "is-glob": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
          "dev": true,
          "requires": {
            "is-extglob": "^2.1.1"
          }
        },
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          },
          "dependencies": {
            "kind-of": {
              "version": "3.2.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
              "dev": true,
              "requires": {
                "is-buffer": "^1.1.5"
              }
            }
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        },
        "lodash": {
          "version": "4.17.10",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
          "dev": true
        },
        "micromatch": {
          "version": "3.1.10",
          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
          "dev": true,
          "requires": {
            "arr-diff": "^4.0.0",
            "array-unique": "^0.3.2",
            "braces": "^2.3.1",
            "define-property": "^2.0.2",
            "extend-shallow": "^3.0.2",
            "extglob": "^2.0.4",
            "fragment-cache": "^0.2.1",
            "kind-of": "^6.0.2",
            "nanomatch": "^1.2.9",
            "object.pick": "^1.3.0",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.2"
          }
        },
        "upath": {
          "version": "1.1.0",
          "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
          "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
          "dev": true
        }
      }
    },
    "circular-json": {
      "version": "0.3.3",
      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
      "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
      "dev": true
    },
    "class-utils": {
      "version": "0.3.6",
      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
      "dev": true,
      "requires": {
        "arr-union": "^3.1.0",
        "define-property": "^0.2.5",
        "isobject": "^3.0.0",
        "static-extend": "^0.1.1"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "cli-cursor": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
      "dev": true,
      "requires": {
        "restore-cursor": "^2.0.0"
      }
    },
    "cli-width": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
      "dev": true
    },
    "cliui": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
      "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
      "dev": true,
      "requires": {
        "string-width": "^2.1.1",
        "strip-ansi": "^4.0.0",
        "wrap-ansi": "^2.0.0"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
          "dev": true
        },
        "strip-ansi": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
          "dev": true,
          "requires": {
            "ansi-regex": "^3.0.0"
          }
        }
      }
    },
    "co": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
    },
    "code-point-at": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
      "dev": true
    },
    "collection-visit": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
      "dev": true,
      "requires": {
        "map-visit": "^1.0.0",
        "object-visit": "^1.0.0"
      }
    },
    "color-convert": {
      "version": "1.9.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
      "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
      "requires": {
        "color-name": "^1.1.1"
      }
    },
    "color-name": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
    },
    "colors": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz",
      "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==",
      "dev": true
    },
    "combine-lists": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
      "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
      "dev": true,
      "requires": {
        "lodash": "^4.5.0"
      }
    },
    "combined-stream": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
      "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
      "dev": true,
      "requires": {
        "delayed-stream": "~1.0.0"
      }
    },
    "commander": {
      "version": "2.17.1",
      "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
      "dev": true
    },
    "component-bind": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
      "dev": true
    },
    "component-emitter": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
      "dev": true
    },
    "component-inherit": {
      "version": "0.0.3",
      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
      "dev": true
    },
    "compress-commons": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
      "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
      "dev": true,
      "requires": {
        "buffer-crc32": "^0.2.1",
        "crc32-stream": "^2.0.0",
        "normalize-path": "^2.0.0",
        "readable-stream": "^2.0.0"
      }
    },
    "concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    },
    "concat-stream": {
      "version": "1.6.2",
      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
      "dev": true,
      "requires": {
        "buffer-from": "^1.0.0",
        "inherits": "^2.0.3",
        "readable-stream": "^2.2.2",
        "typedarray": "^0.0.6"
      }
    },
    "connect": {
      "version": "3.6.6",
      "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
      "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
      "dev": true,
      "requires": {
        "debug": "2.6.9",
        "finalhandler": "1.1.0",
        "parseurl": "~1.3.2",
        "utils-merge": "1.0.1"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "dev": true,
          "requires": {
            "ms": "2.0.0"
          }
        }
      }
    },
    "content-type": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
      "dev": true
    },
    "cookie": {
      "version": "0.3.1",
      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
      "dev": true
    },
    "copy-descriptor": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
      "dev": true
    },
    "core-js": {
      "version": "2.5.7",
      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
      "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
      "dev": true
    },
    "core-util-is": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
    },
    "coveralls": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz",
      "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==",
      "dev": true,
      "requires": {
        "growl": "~> 1.10.0",
        "js-yaml": "^3.11.0",
        "lcov-parse": "^0.0.10",
        "log-driver": "^1.2.7",
        "minimist": "^1.2.0",
        "request": "^2.85.0"
      }
    },
    "crc": {
      "version": "3.8.0",
      "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
      "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
      "dev": true,
      "requires": {
        "buffer": "^5.1.0"
      }
    },
    "crc32-stream": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
      "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
      "dev": true,
      "requires": {
        "crc": "^3.4.4",
        "readable-stream": "^2.0.0"
      }
    },
    "cross-spawn": {
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
      "dev": true,
      "requires": {
        "lru-cache": "^4.0.1",
        "shebang-command": "^1.2.0",
        "which": "^1.2.9"
      }
    },
    "cryptiles": {
      "version": "3.1.4",
      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.4.tgz",
      "integrity": "sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw==",
      "dev": true,
      "requires": {
        "boom": "5.x.x"
      },
      "dependencies": {
        "boom": {
          "version": "5.2.0",
          "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
          "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
          "dev": true,
          "requires": {
            "hoek": "4.x.x"
          }
        }
      }
    },
    "css-select": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
      "dev": true,
      "requires": {
        "boolbase": "~1.0.0",
        "css-what": "2.1",
        "domutils": "1.5.1",
        "nth-check": "~1.0.1"
      }
    },
    "css-what": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
      "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
      "dev": true
    },
    "cssom": {
      "version": "0.3.2",
      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
      "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=",
      "dev": true
    },
    "cssstyle": {
      "version": "0.2.37",
      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
      "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
      "dev": true,
      "requires": {
        "cssom": "0.3.x"
      }
    },
    "currently-unhandled": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
      "dev": true,
      "requires": {
        "array-find-index": "^1.0.1"
      }
    },
    "custom-event": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
      "dev": true
    },
    "dashdash": {
      "version": "1.14.1",
      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
      "dev": true,
      "requires": {
        "assert-plus": "^1.0.0"
      }
    },
    "data-urls": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz",
      "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==",
      "dev": true,
      "requires": {
        "abab": "^1.0.4",
        "whatwg-mimetype": "^2.0.0",
        "whatwg-url": "^6.4.0"
      }
    },
    "date-format": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz",
      "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=",
      "dev": true
    },
    "dateformat": {
      "version": "1.0.12",
      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
      "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
      "dev": true,
      "requires": {
        "get-stdin": "^4.0.1",
        "meow": "^3.3.0"
      }
    },
    "debug": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
      "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
      "dev": true,
      "requires": {
        "ms": "2.0.0"
      }
    },
    "decamelize": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
      "dev": true
    },
    "decode-uri-component": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
      "dev": true
    },
    "deep-eql": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
      "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
      "dev": true,
      "requires": {
        "type-detect": "^4.0.0"
      }
    },
    "deep-is": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
    },
    "define-property": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
      "dev": true,
      "requires": {
        "is-descriptor": "^1.0.2",
        "isobject": "^3.0.1"
      },
      "dependencies": {
        "is-accessor-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-data-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-descriptor": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^1.0.0",
            "is-data-descriptor": "^1.0.0",
            "kind-of": "^6.0.2"
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        }
      }
    },
    "del": {
      "version": "2.2.2",
      "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
      "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
      "dev": true,
      "requires": {
        "globby": "^5.0.0",
        "is-path-cwd": "^1.0.0",
        "is-path-in-cwd": "^1.0.0",
        "object-assign": "^4.0.1",
        "pify": "^2.0.0",
        "pinkie-promise": "^2.0.0",
        "rimraf": "^2.2.8"
      }
    },
    "delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
      "dev": true
    },
    "depd": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
      "dev": true
    },
    "di": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
      "dev": true
    },
    "diff": {
      "version": "3.3.1",
      "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
      "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
      "dev": true
    },
    "doctrine": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
      "dev": true,
      "requires": {
        "esutils": "^2.0.2"
      }
    },
    "dom-serialize": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
      "dev": true,
      "requires": {
        "custom-event": "~1.0.0",
        "ent": "~2.2.0",
        "extend": "^3.0.0",
        "void-elements": "^2.0.0"
      }
    },
    "dom-serializer": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
      "dev": true,
      "requires": {
        "domelementtype": "~1.1.1",
        "entities": "~1.1.1"
      },
      "dependencies": {
        "domelementtype": {
          "version": "1.1.3",
          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
          "dev": true
        }
      }
    },
    "domelementtype": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
      "dev": true
    },
    "domexception": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
      "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
      "dev": true,
      "requires": {
        "webidl-conversions": "^4.0.2"
      }
    },
    "domhandler": {
      "version": "2.4.1",
      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
      "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
      "dev": true,
      "requires": {
        "domelementtype": "1"
      }
    },
    "domutils": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
      "dev": true,
      "requires": {
        "dom-serializer": "0",
        "domelementtype": "1"
      }
    },
    "ecc-jsbn": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
      "dev": true,
      "requires": {
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.1.0"
      }
    },
    "ee-first": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
      "dev": true
    },
    "encodeurl": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
      "dev": true
    },
    "end-of-stream": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
      "dev": true,
      "requires": {
        "once": "^1.4.0"
      }
    },
    "engine.io": {
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz",
      "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==",
      "dev": true,
      "requires": {
        "accepts": "~1.3.4",
        "base64id": "1.0.0",
        "cookie": "0.3.1",
        "debug": "~3.1.0",
        "engine.io-parser": "~2.1.0",
        "ws": "~3.3.1"
      },
      "dependencies": {
        "ws": {
          "version": "3.3.3",
          "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
          "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
          "dev": true,
          "requires": {
            "async-limiter": "~1.0.0",
            "safe-buffer": "~5.1.0",
            "ultron": "~1.1.0"
          }
        }
      }
    },
    "engine.io-client": {
      "version": "3.2.1",
      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
      "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
      "dev": true,
      "requires": {
        "component-emitter": "1.2.1",
        "component-inherit": "0.0.3",
        "debug": "~3.1.0",
        "engine.io-parser": "~2.1.1",
        "has-cors": "1.1.0",
        "indexof": "0.0.1",
        "parseqs": "0.0.5",
        "parseuri": "0.0.5",
        "ws": "~3.3.1",
        "xmlhttprequest-ssl": "~1.5.4",
        "yeast": "0.1.2"
      },
      "dependencies": {
        "ws": {
          "version": "3.3.3",
          "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
          "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
          "dev": true,
          "requires": {
            "async-limiter": "~1.0.0",
            "safe-buffer": "~5.1.0",
            "ultron": "~1.1.0"
          }
        }
      }
    },
    "engine.io-parser": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
      "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
      "dev": true,
      "requires": {
        "after": "0.8.2",
        "arraybuffer.slice": "~0.0.7",
        "base64-arraybuffer": "0.1.5",
        "blob": "0.0.4",
        "has-binary2": "~1.0.2"
      }
    },
    "ent": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
      "dev": true
    },
    "entities": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
      "dev": true
    },
    "error-ex": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
      "dev": true,
      "requires": {
        "is-arrayish": "^0.2.1"
      }
    },
    "es6-promise": {
      "version": "4.2.4",
      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
      "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
      "dev": true
    },
    "es6-promisify": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
      "dev": true,
      "requires": {
        "es6-promise": "^4.0.3"
      }
    },
    "escape-html": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
      "dev": true
    },
    "escape-string-regexp": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
    },
    "escodegen": {
      "version": "1.8.1",
      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
      "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
      "dev": true,
      "requires": {
        "esprima": "^2.7.1",
        "estraverse": "^1.9.1",
        "esutils": "^2.0.2",
        "optionator": "^0.8.1",
        "source-map": "~0.2.0"
      },
      "dependencies": {
        "esprima": {
          "version": "2.7.3",
          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
          "dev": true
        },
        "estraverse": {
          "version": "1.9.3",
          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
          "dev": true
        },
        "source-map": {
          "version": "0.2.0",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
          "dev": true,
          "optional": true,
          "requires": {
            "amdefine": ">=0.0.4"
          }
        }
      }
    },
    "eslint": {
      "version": "4.19.1",
      "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
      "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
      "dev": true,
      "requires": {
        "ajv": "^5.3.0",
        "babel-code-frame": "^6.22.0",
        "chalk": "^2.1.0",
        "concat-stream": "^1.6.0",
        "cross-spawn": "^5.1.0",
        "debug": "^3.1.0",
        "doctrine": "^2.1.0",
        "eslint-scope": "^3.7.1",
        "eslint-visitor-keys": "^1.0.0",
        "espree": "^3.5.4",
        "esquery": "^1.0.0",
        "esutils": "^2.0.2",
        "file-entry-cache": "^2.0.0",
        "functional-red-black-tree": "^1.0.1",
        "glob": "^7.1.2",
        "globals": "^11.0.1",
        "ignore": "^3.3.3",
        "imurmurhash": "^0.1.4",
        "inquirer": "^3.0.6",
        "is-resolvable": "^1.0.0",
        "js-yaml": "^3.9.1",
        "json-stable-stringify-without-jsonify": "^1.0.1",
        "levn": "^0.3.0",
        "lodash": "^4.17.4",
        "minimatch": "^3.0.2",
        "mkdirp": "^0.5.1",
        "natural-compare": "^1.4.0",
        "optionator": "^0.8.2",
        "path-is-inside": "^1.0.2",
        "pluralize": "^7.0.0",
        "progress": "^2.0.0",
        "regexpp": "^1.0.1",
        "require-uncached": "^1.0.3",
        "semver": "^5.3.0",
        "strip-ansi": "^4.0.0",
        "strip-json-comments": "~2.0.1",
        "table": "4.0.2",
        "text-table": "~0.2.0"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
          "dev": true
        },
        "strip-ansi": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
          "dev": true,
          "requires": {
            "ansi-regex": "^3.0.0"
          }
        }
      }
    },
    "eslint-config-riot": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/eslint-config-riot/-/eslint-config-riot-1.0.0.tgz",
      "integrity": "sha1-+9ZThpgLMPvNDhMF1MP7hhTvIRk="
    },
    "eslint-scope": {
      "version": "3.7.1",
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
      "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
      "dev": true,
      "requires": {
        "esrecurse": "^4.1.0",
        "estraverse": "^4.1.1"
      }
    },
    "eslint-visitor-keys": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
      "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
      "dev": true
    },
    "espree": {
      "version": "3.5.4",
      "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
      "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
      "dev": true,
      "requires": {
        "acorn": "^5.5.0",
        "acorn-jsx": "^3.0.0"
      }
    },
    "esprima": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
      "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
      "dev": true
    },
    "esquery": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
      "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
      "dev": true,
      "requires": {
        "estraverse": "^4.0.0"
      }
    },
    "esrecurse": {
      "version": "4.2.1",
      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
      "dev": true,
      "requires": {
        "estraverse": "^4.1.0"
      }
    },
    "estraverse": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
      "dev": true
    },
    "estree-walker": {
      "version": "0.3.1",
      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz",
      "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=",
      "dev": true
    },
    "esutils": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
      "dev": true
    },
    "eventemitter3": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
      "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
      "dev": true
    },
    "execa": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
      "dev": true,
      "requires": {
        "cross-spawn": "^5.0.1",
        "get-stream": "^3.0.0",
        "is-stream": "^1.1.0",
        "npm-run-path": "^2.0.0",
        "p-finally": "^1.0.0",
        "signal-exit": "^3.0.0",
        "strip-eof": "^1.0.0"
      }
    },
    "expand-braces": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
      "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
      "dev": true,
      "requires": {
        "array-slice": "^0.2.3",
        "array-unique": "^0.2.1",
        "braces": "^0.1.2"
      },
      "dependencies": {
        "braces": {
          "version": "0.1.5",
          "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
          "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
          "dev": true,
          "requires": {
            "expand-range": "^0.1.0"
          }
        },
        "expand-range": {
          "version": "0.1.1",
          "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
          "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
          "dev": true,
          "requires": {
            "is-number": "^0.1.1",
            "repeat-string": "^0.2.2"
          }
        },
        "is-number": {
          "version": "0.1.1",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
          "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
          "dev": true
        },
        "repeat-string": {
          "version": "0.2.2",
          "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
          "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
          "dev": true
        }
      }
    },
    "expand-brackets": {
      "version": "0.1.5",
      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
      "requires": {
        "is-posix-bracket": "^0.1.0"
      }
    },
    "expand-range": {
      "version": "1.8.2",
      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
      "requires": {
        "fill-range": "^2.1.0"
      }
    },
    "extend": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
      "dev": true
    },
    "extend-shallow": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
      "dev": true,
      "requires": {
        "assign-symbols": "^1.0.0",
        "is-extendable": "^1.0.1"
      },
      "dependencies": {
        "is-extendable": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
          "dev": true,
          "requires": {
            "is-plain-object": "^2.0.4"
          }
        }
      }
    },
    "external-editor": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
      "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
      "dev": true,
      "requires": {
        "chardet": "^0.4.0",
        "iconv-lite": "^0.4.17",
        "tmp": "^0.0.33"
      }
    },
    "extglob": {
      "version": "0.3.2",
      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
      "requires": {
        "is-extglob": "^1.0.0"
      }
    },
    "extsprintf": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
      "dev": true
    },
    "fast-deep-equal": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
      "dev": true
    },
    "fast-json-stable-stringify": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
      "dev": true
    },
    "fast-levenshtein": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
    },
    "figures": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
      "dev": true,
      "requires": {
        "escape-string-regexp": "^1.0.5"
      }
    },
    "file-entry-cache": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
      "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
      "dev": true,
      "requires": {
        "flat-cache": "^1.2.1",
        "object-assign": "^4.0.1"
      }
    },
    "filename-regex": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
    },
    "fill-range": {
      "version": "2.2.4",
      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
      "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
      "requires": {
        "is-number": "^2.1.0",
        "isobject": "^2.0.0",
        "randomatic": "^3.0.0",
        "repeat-element": "^1.1.2",
        "repeat-string": "^1.5.2"
      },
      "dependencies": {
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
        },
        "randomatic": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
          "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
          "requires": {
            "is-number": "^4.0.0",
            "kind-of": "^6.0.0",
            "math-random": "^1.0.1"
          },
          "dependencies": {
            "is-number": {
              "version": "4.0.0",
              "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
              "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
            }
          }
        }
      }
    },
    "finalhandler": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
      "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
      "dev": true,
      "requires": {
        "debug": "2.6.9",
        "encodeurl": "~1.0.1",
        "escape-html": "~1.0.3",
        "on-finished": "~2.3.0",
        "parseurl": "~1.3.2",
        "statuses": "~1.3.1",
        "unpipe": "~1.0.0"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "dev": true,
          "requires": {
            "ms": "2.0.0"
          }
        },
        "statuses": {
          "version": "1.3.1",
          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
          "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
          "dev": true
        }
      }
    },
    "find-up": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
      "dev": true,
      "requires": {
        "path-exists": "^2.0.0",
        "pinkie-promise": "^2.0.0"
      }
    },
    "flat-cache": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
      "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
      "dev": true,
      "requires": {
        "circular-json": "^0.3.1",
        "del": "^2.0.2",
        "graceful-fs": "^4.1.2",
        "write": "^0.2.1"
      }
    },
    "follow-redirects": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz",
      "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==",
      "dev": true,
      "requires": {
        "debug": "^3.1.0"
      }
    },
    "for-in": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
    },
    "for-own": {
      "version": "0.1.5",
      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
      "requires": {
        "for-in": "^1.0.1"
      }
    },
    "forever-agent": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
      "dev": true
    },
    "form-data": {
      "version": "2.3.3",
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
      "dev": true,
      "requires": {
        "asynckit": "^0.4.0",
        "combined-stream": "^1.0.6",
        "mime-types": "^2.1.12"
      }
    },
    "fragment-cache": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
      "dev": true,
      "requires": {
        "map-cache": "^0.2.2"
      }
    },
    "fs-access": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
      "dev": true,
      "requires": {
        "null-check": "^1.0.0"
      }
    },
    "fs-constants": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
      "dev": true
    },
    "fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
      "dev": true
    },
    "fsevents": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
      "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
      "optional": true,
      "requires": {
        "nan": "^2.9.2",
        "node-pre-gyp": "^0.10.0"
      },
      "dependencies": {
        "abbrev": {
          "version": "1.1.1",
          "bundled": true,
          "optional": true
        },
        "ansi-regex": {
          "version": "2.1.1",
          "bundled": true
        },
        "aproba": {
          "version": "1.2.0",
          "bundled": true,
          "optional": true
        },
        "are-we-there-yet": {
          "version": "1.1.4",
          "bundled": true,
          "optional": true,
          "requires": {
            "delegates": "^1.0.0",
            "readable-stream": "^2.0.6"
          }
        },
        "balanced-match": {
          "version": "1.0.0",
          "bundled": true
        },
        "brace-expansion": {
          "version": "1.1.11",
          "bundled": true,
          "requires": {
            "balanced-match": "^1.0.0",
            "concat-map": "0.0.1"
          }
        },
        "chownr": {
          "version": "1.0.1",
          "bundled": true,
          "optional": true
        },
        "code-point-at": {
          "version": "1.1.0",
          "bundled": true
        },
        "concat-map": {
          "version": "0.0.1",
          "bundled": true
        },
        "console-control-strings": {
          "version": "1.1.0",
          "bundled": true
        },
        "core-util-is": {
          "version": "1.0.2",
          "bundled": true,
          "optional": true
        },
        "debug": {
          "version": "2.6.9",
          "bundled": true,
          "optional": true,
          "requires": {
            "ms": "2.0.0"
          }
        },
        "deep-extend": {
          "version": "0.5.1",
          "bundled": true,
          "optional": true
        },
        "delegates": {
          "version": "1.0.0",
          "bundled": true,
          "optional": true
        },
        "detect-libc": {
          "version": "1.0.3",
          "bundled": true,
          "optional": true
        },
        "fs-minipass": {
          "version": "1.2.5",
          "bundled": true,
          "optional": true,
          "requires": {
            "minipass": "^2.2.1"
          }
        },
        "fs.realpath": {
          "version": "1.0.0",
          "bundled": true,
          "optional": true
        },
        "gauge": {
          "version": "2.7.4",
          "bundled": true,
          "optional": true,
          "requires": {
            "aproba": "^1.0.3",
            "console-control-strings": "^1.0.0",
            "has-unicode": "^2.0.0",
            "object-assign": "^4.1.0",
            "signal-exit": "^3.0.0",
            "string-width": "^1.0.1",
            "strip-ansi": "^3.0.1",
            "wide-align": "^1.1.0"
          }
        },
        "glob": {
          "version": "7.1.2",
          "bundled": true,
          "optional": true,
          "requires": {
            "fs.realpath": "^1.0.0",
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "^3.0.4",
            "once": "^1.3.0",
            "path-is-absolute": "^1.0.0"
          }
        },
        "has-unicode": {
          "version": "2.0.1",
          "bundled": true,
          "optional": true
        },
        "iconv-lite": {
          "version": "0.4.21",
          "bundled": true,
          "optional": true,
          "requires": {
            "safer-buffer": "^2.1.0"
          }
        },
        "ignore-walk": {
          "version": "3.0.1",
          "bundled": true,
          "optional": true,
          "requires": {
            "minimatch": "^3.0.4"
          }
        },
        "inflight": {
          "version": "1.0.6",
          "bundled": true,
          "optional": true,
          "requires": {
            "once": "^1.3.0",
            "wrappy": "1"
          }
        },
        "inherits": {
          "version": "2.0.3",
          "bundled": true
        },
        "ini": {
          "version": "1.3.5",
          "bundled": true,
          "optional": true
        },
        "is-fullwidth-code-point": {
          "version": "1.0.0",
          "bundled": true,
          "requires": {
            "number-is-nan": "^1.0.0"
          }
        },
        "isarray": {
          "version": "1.0.0",
          "bundled": true,
          "optional": true
        },
        "minimatch": {
          "version": "3.0.4",
          "bundled": true,
          "requires": {
            "brace-expansion": "^1.1.7"
          }
        },
        "minimist": {
          "version": "0.0.8",
          "bundled": true
        },
        "minipass": {
          "version": "2.2.4",
          "bundled": true,
          "requires": {
            "safe-buffer": "^5.1.1",
            "yallist": "^3.0.0"
          }
        },
        "minizlib": {
          "version": "1.1.0",
          "bundled": true,
          "optional": true,
          "requires": {
            "minipass": "^2.2.1"
          }
        },
        "mkdirp": {
          "version": "0.5.1",
          "bundled": true,
          "requires": {
            "minimist": "0.0.8"
          }
        },
        "ms": {
          "version": "2.0.0",
          "bundled": true,
          "optional": true
        },
        "needle": {
          "version": "2.2.0",
          "bundled": true,
          "optional": true,
          "requires": {
            "debug": "^2.1.2",
            "iconv-lite": "^0.4.4",
            "sax": "^1.2.4"
          }
        },
        "node-pre-gyp": {
          "version": "0.10.0",
          "bundled": true,
          "optional": true,
          "requires": {
            "detect-libc": "^1.0.2",
            "mkdirp": "^0.5.1",
            "needle": "^2.2.0",
            "nopt": "^4.0.1",
            "npm-packlist": "^1.1.6",
            "npmlog": "^4.0.2",
            "rc": "^1.1.7",
            "rimraf": "^2.6.1",
            "semver": "^5.3.0",
            "tar": "^4"
          }
        },
        "nopt": {
          "version": "4.0.1",
          "bundled": true,
          "optional": true,
          "requires": {
            "abbrev": "1",
            "osenv": "^0.1.4"
          }
        },
        "npm-bundled": {
          "version": "1.0.3",
          "bundled": true,
          "optional": true
        },
        "npm-packlist": {
          "version": "1.1.10",
          "bundled": true,
          "optional": true,
          "requires": {
            "ignore-walk": "^3.0.1",
            "npm-bundled": "^1.0.1"
          }
        },
        "npmlog": {
          "version": "4.1.2",
          "bundled": true,
          "optional": true,
          "requires": {
            "are-we-there-yet": "~1.1.2",
            "console-control-strings": "~1.1.0",
            "gauge": "~2.7.3",
            "set-blocking": "~2.0.0"
          }
        },
        "number-is-nan": {
          "version": "1.0.1",
          "bundled": true
        },
        "object-assign": {
          "version": "4.1.1",
          "bundled": true,
          "optional": true
        },
        "once": {
          "version": "1.4.0",
          "bundled": true,
          "requires": {
            "wrappy": "1"
          }
        },
        "os-homedir": {
          "version": "1.0.2",
          "bundled": true,
          "optional": true
        },
        "os-tmpdir": {
          "version": "1.0.2",
          "bundled": true,
          "optional": true
        },
        "osenv": {
          "version": "0.1.5",
          "bundled": true,
          "optional": true,
          "requires": {
            "os-homedir": "^1.0.0",
            "os-tmpdir": "^1.0.0"
          }
        },
        "path-is-absolute": {
          "version": "1.0.1",
          "bundled": true,
          "optional": true
        },
        "process-nextick-args": {
          "version": "2.0.0",
          "bundled": true,
          "optional": true
        },
        "rc": {
          "version": "1.2.7",
          "bundled": true,
          "optional": true,
          "requires": {
            "deep-extend": "^0.5.1",
            "ini": "~1.3.0",
            "minimist": "^1.2.0",
            "strip-json-comments": "~2.0.1"
          },
          "dependencies": {
            "minimist": {
              "version": "1.2.0",
              "bundled": true,
              "optional": true
            }
          }
        },
        "readable-stream": {
          "version": "2.3.6",
          "bundled": true,
          "optional": true,
          "requires": {
            "core-util-is": "~1.0.0",
            "inherits": "~2.0.3",
            "isarray": "~1.0.0",
            "process-nextick-args": "~2.0.0",
            "safe-buffer": "~5.1.1",
            "string_decoder": "~1.1.1",
            "util-deprecate": "~1.0.1"
          }
        },
        "rimraf": {
          "version": "2.6.2",
          "bundled": true,
          "optional": true,
          "requires": {
            "glob": "^7.0.5"
          }
        },
        "safe-buffer": {
          "version": "5.1.1",
          "bundled": true
        },
        "safer-buffer": {
          "version": "2.1.2",
          "bundled": true,
          "optional": true
        },
        "sax": {
          "version": "1.2.4",
          "bundled": true,
          "optional": true
        },
        "semver": {
          "version": "5.5.0",
          "bundled": true,
          "optional": true
        },
        "set-blocking": {
          "version": "2.0.0",
          "bundled": true,
          "optional": true
        },
        "signal-exit": {
          "version": "3.0.2",
          "bundled": true,
          "optional": true
        },
        "string-width": {
          "version": "1.0.2",
          "bundled": true,
          "requires": {
            "code-point-at": "^1.0.0",
            "is-fullwidth-code-point": "^1.0.0",
            "strip-ansi": "^3.0.0"
          }
        },
        "string_decoder": {
          "version": "1.1.1",
          "bundled": true,
          "optional": true,
          "requires": {
            "safe-buffer": "~5.1.0"
          }
        },
        "strip-ansi": {
          "version": "3.0.1",
          "bundled": true,
          "requires": {
            "ansi-regex": "^2.0.0"
          }
        },
        "strip-json-comments": {
          "version": "2.0.1",
          "bundled": true,
          "optional": true
        },
        "tar": {
          "version": "4.4.1",
          "bundled": true,
          "optional": true,
          "requires": {
            "chownr": "^1.0.1",
            "fs-minipass": "^1.2.5",
            "minipass": "^2.2.4",
            "minizlib": "^1.1.0",
            "mkdirp": "^0.5.0",
            "safe-buffer": "^5.1.1",
            "yallist": "^3.0.2"
          }
        },
        "util-deprecate": {
          "version": "1.0.2",
          "bundled": true,
          "optional": true
        },
        "wide-align": {
          "version": "1.1.2",
          "bundled": true,
          "optional": true,
          "requires": {
            "string-width": "^1.0.2"
          }
        },
        "wrappy": {
          "version": "1.0.2",
          "bundled": true
        },
        "yallist": {
          "version": "3.0.2",
          "bundled": true
        }
      }
    },
    "functional-red-black-tree": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
      "dev": true
    },
    "get-caller-file": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
      "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
      "dev": true
    },
    "get-func-name": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
      "dev": true
    },
    "get-stdin": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
      "dev": true
    },
    "get-stream": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
      "dev": true
    },
    "get-value": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
      "dev": true
    },
    "getpass": {
      "version": "0.1.7",
      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
      "dev": true,
      "requires": {
        "assert-plus": "^1.0.0"
      }
    },
    "glob": {
      "version": "7.1.2",
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
      "dev": true,
      "requires": {
        "fs.realpath": "^1.0.0",
        "inflight": "^1.0.4",
        "inherits": "2",
        "minimatch": "^3.0.4",
        "once": "^1.3.0",
        "path-is-absolute": "^1.0.0"
      }
    },
    "glob-base": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
      "requires": {
        "glob-parent": "^2.0.0",
        "is-glob": "^2.0.0"
      }
    },
    "glob-parent": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
      "requires": {
        "is-glob": "^2.0.0"
      }
    },
    "globals": {
      "version": "11.4.0",
      "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz",
      "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==",
      "dev": true
    },
    "globby": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
      "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
      "dev": true,
      "requires": {
        "array-union": "^1.0.1",
        "arrify": "^1.0.0",
        "glob": "^7.0.3",
        "object-assign": "^4.0.1",
        "pify": "^2.0.0",
        "pinkie-promise": "^2.0.0"
      }
    },
    "graceful-fs": {
      "version": "4.1.11",
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
    },
    "growl": {
      "version": "1.10.3",
      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
      "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
      "dev": true
    },
    "handlebars": {
      "version": "4.0.11",
      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
      "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
      "dev": true,
      "requires": {
        "async": "^1.4.0",
        "optimist": "^0.6.1",
        "source-map": "^0.4.4",
        "uglify-js": "^2.6"
      },
      "dependencies": {
        "camelcase": {
          "version": "1.2.1",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
          "dev": true,
          "optional": true
        },
        "cliui": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
          "dev": true,
          "optional": true,
          "requires": {
            "center-align": "^0.1.1",
            "right-align": "^0.1.1",
            "wordwrap": "0.0.2"
          }
        },
        "source-map": {
          "version": "0.4.4",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
          "dev": true,
          "requires": {
            "amdefine": ">=0.0.4"
          }
        },
        "uglify-js": {
          "version": "2.8.29",
          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
          "dev": true,
          "optional": true,
          "requires": {
            "source-map": "~0.5.1",
            "uglify-to-browserify": "~1.0.0",
            "yargs": "~3.10.0"
          },
          "dependencies": {
            "source-map": {
              "version": "0.5.7",
              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
              "dev": true,
              "optional": true
            }
          }
        },
        "window-size": {
          "version": "0.1.0",
          "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
          "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
          "dev": true,
          "optional": true
        },
        "wordwrap": {
          "version": "0.0.2",
          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
          "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
          "dev": true,
          "optional": true
        },
        "yargs": {
          "version": "3.10.0",
          "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
          "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
          "dev": true,
          "optional": true,
          "requires": {
            "camelcase": "^1.0.2",
            "cliui": "^2.1.0",
            "decamelize": "^1.0.0",
            "window-size": "0.1.0"
          }
        }
      }
    },
    "har-schema": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
      "dev": true
    },
    "har-validator": {
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
      "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
      "dev": true,
      "requires": {
        "ajv": "^5.3.0",
        "har-schema": "^2.0.0"
      }
    },
    "has-ansi": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
      "dev": true,
      "requires": {
        "ansi-regex": "^2.0.0"
      }
    },
    "has-binary2": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
      "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
      "dev": true,
      "requires": {
        "isarray": "2.0.1"
      },
      "dependencies": {
        "isarray": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
          "dev": true
        }
      }
    },
    "has-cors": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
      "dev": true
    },
    "has-flag": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
    },
    "has-value": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
      "dev": true,
      "requires": {
        "get-value": "^2.0.6",
        "has-values": "^1.0.0",
        "isobject": "^3.0.0"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "has-values": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
      "dev": true,
      "requires": {
        "is-number": "^3.0.0",
        "kind-of": "^4.0.0"
      },
      "dependencies": {
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          },
          "dependencies": {
            "kind-of": {
              "version": "3.2.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
              "dev": true,
              "requires": {
                "is-buffer": "^1.1.5"
              }
            }
          }
        },
        "kind-of": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
          "dev": true,
          "requires": {
            "is-buffer": "^1.1.5"
          }
        }
      }
    },
    "hawk": {
      "version": "6.0.2",
      "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
      "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
      "dev": true,
      "requires": {
        "boom": "4.x.x",
        "cryptiles": "3.x.x",
        "hoek": "4.x.x",
        "sntp": "2.x.x"
      }
    },
    "he": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
      "dev": true
    },
    "hoek": {
      "version": "4.2.1",
      "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
      "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
      "dev": true
    },
    "hosted-git-info": {
      "version": "2.6.0",
      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
      "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
      "dev": true
    },
    "html-encoding-sniffer": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
      "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
      "dev": true,
      "requires": {
        "whatwg-encoding": "^1.0.1"
      }
    },
    "htmlparser2": {
      "version": "3.9.2",
      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
      "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
      "dev": true,
      "requires": {
        "domelementtype": "^1.3.0",
        "domhandler": "^2.3.0",
        "domutils": "^1.5.1",
        "entities": "^1.1.1",
        "inherits": "^2.0.1",
        "readable-stream": "^2.0.2"
      }
    },
    "http-errors": {
      "version": "1.6.3",
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
      "dev": true,
      "requires": {
        "depd": "~1.1.2",
        "inherits": "2.0.3",
        "setprototypeof": "1.1.0",
        "statuses": ">= 1.4.0 < 2"
      }
    },
    "http-proxy": {
      "version": "1.17.0",
      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
      "dev": true,
      "requires": {
        "eventemitter3": "^3.0.0",
        "follow-redirects": "^1.0.0",
        "requires-port": "^1.0.0"
      }
    },
    "http-signature": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
      "dev": true,
      "requires": {
        "assert-plus": "^1.0.0",
        "jsprim": "^1.2.2",
        "sshpk": "^1.7.0"
      }
    },
    "iconv-lite": {
      "version": "0.4.21",
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
      "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
      "dev": true,
      "requires": {
        "safer-buffer": "^2.1.0"
      }
    },
    "ieee754": {
      "version": "1.1.12",
      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
      "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
      "dev": true
    },
    "ignore": {
      "version": "3.3.7",
      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
      "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
      "dev": true
    },
    "imurmurhash": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
      "dev": true
    },
    "indent-string": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
      "dev": true,
      "requires": {
        "repeating": "^2.0.0"
      }
    },
    "indexof": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
      "dev": true
    },
    "inflight": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
      "dev": true,
      "requires": {
        "once": "^1.3.0",
        "wrappy": "1"
      }
    },
    "inherits": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
    },
    "inquirer": {
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
      "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
      "dev": true,
      "requires": {
        "ansi-escapes": "^3.0.0",
        "chalk": "^2.0.0",
        "cli-cursor": "^2.1.0",
        "cli-width": "^2.0.0",
        "external-editor": "^2.0.4",
        "figures": "^2.0.0",
        "lodash": "^4.3.0",
        "mute-stream": "0.0.7",
        "run-async": "^2.2.0",
        "rx-lite": "^4.0.8",
        "rx-lite-aggregates": "^4.0.8",
        "string-width": "^2.1.0",
        "strip-ansi": "^4.0.0",
        "through": "^2.3.6"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
          "dev": true
        },
        "is-fullwidth-code-point": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
          "dev": true
        },
        "string-width": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
          "dev": true,
          "requires": {
            "is-fullwidth-code-point": "^2.0.0",
            "strip-ansi": "^4.0.0"
          }
        },
        "strip-ansi": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
          "dev": true,
          "requires": {
            "ansi-regex": "^3.0.0"
          }
        }
      }
    },
    "invert-kv": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
      "dev": true
    },
    "is-accessor-descriptor": {
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2"
      }
    },
    "is-arrayish": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
      "dev": true
    },
    "is-binary-path": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
      "requires": {
        "binary-extensions": "^1.0.0"
      }
    },
    "is-buffer": {
      "version": "1.1.6",
      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
    },
    "is-builtin-module": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
      "dev": true,
      "requires": {
        "builtin-modules": "^1.0.0"
      }
    },
    "is-data-descriptor": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2"
      }
    },
    "is-descriptor": {
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
      "dev": true,
      "requires": {
        "is-accessor-descriptor": "^0.1.6",
        "is-data-descriptor": "^0.1.4",
        "kind-of": "^5.0.0"
      },
      "dependencies": {
        "kind-of": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
          "dev": true
        }
      }
    },
    "is-dotfile": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
    },
    "is-equal-shallow": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
      "requires": {
        "is-primitive": "^2.0.0"
      }
    },
    "is-extendable": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
    },
    "is-extglob": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
    },
    "is-finite": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
      "dev": true,
      "requires": {
        "number-is-nan": "^1.0.0"
      }
    },
    "is-fullwidth-code-point": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
      "dev": true
    },
    "is-glob": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
      "requires": {
        "is-extglob": "^1.0.0"
      }
    },
    "is-module": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
      "dev": true
    },
    "is-number": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
      "requires": {
        "kind-of": "^3.0.2"
      }
    },
    "is-odd": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
      "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
      "dev": true,
      "requires": {
        "is-number": "^4.0.0"
      },
      "dependencies": {
        "is-number": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
          "dev": true
        }
      }
    },
    "is-path-cwd": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
      "dev": true
    },
    "is-path-in-cwd": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
      "dev": true,
      "requires": {
        "is-path-inside": "^1.0.0"
      }
    },
    "is-path-inside": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
      "dev": true,
      "requires": {
        "path-is-inside": "^1.0.1"
      }
    },
    "is-plain-object": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
      "dev": true,
      "requires": {
        "isobject": "^3.0.1"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "is-posix-bracket": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
    },
    "is-primitive": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
    },
    "is-promise": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
      "dev": true
    },
    "is-resolvable": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
      "dev": true
    },
    "is-stream": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
      "dev": true
    },
    "is-typedarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
      "dev": true
    },
    "is-utf8": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
      "dev": true
    },
    "is-windows": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
      "dev": true
    },
    "isarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
    },
    "isbinaryfile": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz",
      "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=",
      "dev": true
    },
    "isexe": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
      "dev": true
    },
    "isobject": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
      "requires": {
        "isarray": "1.0.0"
      }
    },
    "isstream": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
      "dev": true
    },
    "istanbul": {
      "version": "0.4.5",
      "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
      "dev": true,
      "requires": {
        "abbrev": "1.0.x",
        "async": "1.x",
        "escodegen": "1.8.x",
        "esprima": "2.7.x",
        "glob": "^5.0.15",
        "handlebars": "^4.0.1",
        "js-yaml": "3.x",
        "mkdirp": "0.5.x",
        "nopt": "3.x",
        "once": "1.x",
        "resolve": "1.1.x",
        "supports-color": "^3.1.0",
        "which": "^1.1.1",
        "wordwrap": "^1.0.0"
      },
      "dependencies": {
        "esprima": {
          "version": "2.7.3",
          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
          "dev": true
        },
        "glob": {
          "version": "5.0.15",
          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
          "dev": true,
          "requires": {
            "inflight": "^1.0.4",
            "inherits": "2",
            "minimatch": "2 || 3",
            "once": "^1.3.0",
            "path-is-absolute": "^1.0.0"
          }
        },
        "has-flag": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
          "dev": true
        },
        "supports-color": {
          "version": "3.2.3",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
          "dev": true,
          "requires": {
            "has-flag": "^1.0.0"
          }
        }
      }
    },
    "js-tokens": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
      "dev": true
    },
    "js-yaml": {
      "version": "3.11.0",
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
      "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
      "dev": true,
      "requires": {
        "argparse": "^1.0.7",
        "esprima": "^4.0.0"
      }
    },
    "jsbn": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
      "dev": true
    },
    "jsdom": {
      "version": "11.10.0",
      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz",
      "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==",
      "dev": true,
      "requires": {
        "abab": "^1.0.4",
        "acorn": "^5.3.0",
        "acorn-globals": "^4.1.0",
        "array-equal": "^1.0.0",
        "cssom": ">= 0.3.2 < 0.4.0",
        "cssstyle": ">= 0.2.37 < 0.3.0",
        "data-urls": "^1.0.0",
        "domexception": "^1.0.0",
        "escodegen": "^1.9.0",
        "html-encoding-sniffer": "^1.0.2",
        "left-pad": "^1.2.0",
        "nwmatcher": "^1.4.3",
        "parse5": "4.0.0",
        "pn": "^1.1.0",
        "request": "^2.83.0",
        "request-promise-native": "^1.0.5",
        "sax": "^1.2.4",
        "symbol-tree": "^3.2.2",
        "tough-cookie": "^2.3.3",
        "w3c-hr-time": "^1.0.1",
        "webidl-conversions": "^4.0.2",
        "whatwg-encoding": "^1.0.3",
        "whatwg-mimetype": "^2.1.0",
        "whatwg-url": "^6.4.0",
        "ws": "^4.0.0",
        "xml-name-validator": "^3.0.0"
      },
      "dependencies": {
        "escodegen": {
          "version": "1.9.1",
          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
          "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
          "dev": true,
          "requires": {
            "esprima": "^3.1.3",
            "estraverse": "^4.2.0",
            "esutils": "^2.0.2",
            "optionator": "^0.8.1",
            "source-map": "~0.6.1"
          }
        },
        "esprima": {
          "version": "3.1.3",
          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
          "dev": true
        },
        "parse5": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
          "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
          "dev": true
        }
      }
    },
    "json-schema": {
      "version": "0.2.3",
      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
      "dev": true
    },
    "json-schema-traverse": {
      "version": "0.3.1",
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
      "dev": true
    },
    "json-stable-stringify-without-jsonify": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
      "dev": true
    },
    "json-stringify-safe": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
      "dev": true
    },
    "jsprim": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
      "dev": true,
      "requires": {
        "assert-plus": "1.0.0",
        "extsprintf": "1.3.0",
        "json-schema": "0.2.3",
        "verror": "1.10.0"
      }
    },
    "just-extend": {
      "version": "1.1.27",
      "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz",
      "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==",
      "dev": true
    },
    "karma": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/karma/-/karma-3.0.0.tgz",
      "integrity": "sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ==",
      "dev": true,
      "requires": {
        "bluebird": "^3.3.0",
        "body-parser": "^1.16.1",
        "chokidar": "^2.0.3",
        "colors": "^1.1.0",
        "combine-lists": "^1.0.0",
        "connect": "^3.6.0",
        "core-js": "^2.2.0",
        "di": "^0.0.1",
        "dom-serialize": "^2.2.0",
        "expand-braces": "^0.1.1",
        "glob": "^7.1.1",
        "graceful-fs": "^4.1.2",
        "http-proxy": "^1.13.0",
        "isbinaryfile": "^3.0.0",
        "lodash": "^4.17.4",
        "log4js": "^3.0.0",
        "mime": "^2.3.1",
        "minimatch": "^3.0.2",
        "optimist": "^0.6.1",
        "qjobs": "^1.1.4",
        "range-parser": "^1.2.0",
        "rimraf": "^2.6.0",
        "safe-buffer": "^5.0.1",
        "socket.io": "2.1.1",
        "source-map": "^0.6.1",
        "tmp": "0.0.33",
        "useragent": "2.2.1"
      },
      "dependencies": {
        "anymatch": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
          "dev": true,
          "requires": {
            "micromatch": "^3.1.4",
            "normalize-path": "^2.1.1"
          }
        },
        "arr-diff": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
          "dev": true
        },
        "array-unique": {
          "version": "0.3.2",
          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
          "dev": true
        },
        "bluebird": {
          "version": "3.5.1",
          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
          "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
          "dev": true
        },
        "braces": {
          "version": "2.3.2",
          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
          "dev": true,
          "requires": {
            "arr-flatten": "^1.1.0",
            "array-unique": "^0.3.2",
            "extend-shallow": "^2.0.1",
            "fill-range": "^4.0.0",
            "isobject": "^3.0.1",
            "repeat-element": "^1.1.2",
            "snapdragon": "^0.8.1",
            "snapdragon-node": "^2.0.1",
            "split-string": "^3.0.2",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "chokidar": {
          "version": "2.0.3",
          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz",
          "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==",
          "dev": true,
          "requires": {
            "anymatch": "^2.0.0",
            "async-each": "^1.0.0",
            "braces": "^2.3.0",
            "fsevents": "^1.1.2",
            "glob-parent": "^3.1.0",
            "inherits": "^2.0.1",
            "is-binary-path": "^1.0.0",
            "is-glob": "^4.0.0",
            "normalize-path": "^2.1.1",
            "path-is-absolute": "^1.0.0",
            "readdirp": "^2.0.0",
            "upath": "^1.0.0"
          }
        },
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "dev": true,
          "requires": {
            "ms": "2.0.0"
          }
        },
        "expand-brackets": {
          "version": "2.1.4",
          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
          "dev": true,
          "requires": {
            "debug": "^2.3.3",
            "define-property": "^0.2.5",
            "extend-shallow": "^2.0.1",
            "posix-character-classes": "^0.1.0",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "define-property": {
              "version": "0.2.5",
              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
              "dev": true,
              "requires": {
                "is-descriptor": "^0.1.0"
              }
            },
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            },
            "is-accessor-descriptor": {
              "version": "0.1.6",
              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
              "dev": true,
              "requires": {
                "kind-of": "^3.0.2"
              },
              "dependencies": {
                "kind-of": {
                  "version": "3.2.2",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
                  "dev": true,
                  "requires": {
                    "is-buffer": "^1.1.5"
                  }
                }
              }
            },
            "is-data-descriptor": {
              "version": "0.1.4",
              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
              "dev": true,
              "requires": {
                "kind-of": "^3.0.2"
              },
              "dependencies": {
                "kind-of": {
                  "version": "3.2.2",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
                  "dev": true,
                  "requires": {
                    "is-buffer": "^1.1.5"
                  }
                }
              }
            },
            "is-descriptor": {
              "version": "0.1.6",
              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
              "dev": true,
              "requires": {
                "is-accessor-descriptor": "^0.1.6",
                "is-data-descriptor": "^0.1.4",
                "kind-of": "^5.0.0"
              }
            },
            "kind-of": {
              "version": "5.1.0",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
              "dev": true
            }
          }
        },
        "extglob": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
          "dev": true,
          "requires": {
            "array-unique": "^0.3.2",
            "define-property": "^1.0.0",
            "expand-brackets": "^2.1.4",
            "extend-shallow": "^2.0.1",
            "fragment-cache": "^0.2.1",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "define-property": {
              "version": "1.0.0",
              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
              "dev": true,
              "requires": {
                "is-descriptor": "^1.0.0"
              }
            },
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "fill-range": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
          "dev": true,
          "requires": {
            "extend-shallow": "^2.0.1",
            "is-number": "^3.0.0",
            "repeat-string": "^1.6.1",
            "to-regex-range": "^2.1.0"
          },
          "dependencies": {
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "glob-parent": {
          "version": "3.1.0",
          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
          "dev": true,
          "requires": {
            "is-glob": "^3.1.0",
            "path-dirname": "^1.0.0"
          },
          "dependencies": {
            "is-glob": {
              "version": "3.1.0",
              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
              "dev": true,
              "requires": {
                "is-extglob": "^2.1.0"
              }
            }
          }
        },
        "is-accessor-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-data-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-descriptor": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^1.0.0",
            "is-data-descriptor": "^1.0.0",
            "kind-of": "^6.0.2"
          }
        },
        "is-extglob": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
          "dev": true
        },
        "is-glob": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
          "dev": true,
          "requires": {
            "is-extglob": "^2.1.1"
          }
        },
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          },
          "dependencies": {
            "kind-of": {
              "version": "3.2.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
              "dev": true,
              "requires": {
                "is-buffer": "^1.1.5"
              }
            }
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        },
        "micromatch": {
          "version": "3.1.10",
          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
          "dev": true,
          "requires": {
            "arr-diff": "^4.0.0",
            "array-unique": "^0.3.2",
            "braces": "^2.3.1",
            "define-property": "^2.0.2",
            "extend-shallow": "^3.0.2",
            "extglob": "^2.0.4",
            "fragment-cache": "^0.2.1",
            "kind-of": "^6.0.2",
            "nanomatch": "^1.2.9",
            "object.pick": "^1.3.0",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.2"
          }
        }
      }
    },
    "karma-chrome-launcher": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
      "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
      "dev": true,
      "requires": {
        "fs-access": "^1.0.0",
        "which": "^1.2.1"
      }
    },
    "karma-coverage": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.2.tgz",
      "integrity": "sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw==",
      "dev": true,
      "requires": {
        "dateformat": "^1.0.6",
        "istanbul": "^0.4.0",
        "lodash": "^4.17.0",
        "minimatch": "^3.0.0",
        "source-map": "^0.5.1"
      },
      "dependencies": {
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        }
      }
    },
    "karma-mocha": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz",
      "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=",
      "dev": true,
      "requires": {
        "minimist": "1.2.0"
      }
    },
    "karma-rollup-preprocessor": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-6.0.0.tgz",
      "integrity": "sha512-oXs18fMcWFm62J86VNZ3hmFo0rizb07j7bc7lTPmm8P35uyi8B2JRR1n+82qDk7f/Pl1HoGHJeJ2WXl2DcVzfA==",
      "dev": true,
      "requires": {
        "chokidar": "^2.0.0"
      },
      "dependencies": {
        "anymatch": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
          "dev": true,
          "requires": {
            "micromatch": "^3.1.4",
            "normalize-path": "^2.1.1"
          }
        },
        "arr-diff": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
          "dev": true
        },
        "array-unique": {
          "version": "0.3.2",
          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
          "dev": true
        },
        "braces": {
          "version": "2.3.2",
          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
          "dev": true,
          "requires": {
            "arr-flatten": "^1.1.0",
            "array-unique": "^0.3.2",
            "extend-shallow": "^2.0.1",
            "fill-range": "^4.0.0",
            "isobject": "^3.0.1",
            "repeat-element": "^1.1.2",
            "snapdragon": "^0.8.1",
            "snapdragon-node": "^2.0.1",
            "split-string": "^3.0.2",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "chokidar": {
          "version": "2.0.3",
          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz",
          "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==",
          "dev": true,
          "requires": {
            "anymatch": "^2.0.0",
            "async-each": "^1.0.0",
            "braces": "^2.3.0",
            "fsevents": "^1.1.2",
            "glob-parent": "^3.1.0",
            "inherits": "^2.0.1",
            "is-binary-path": "^1.0.0",
            "is-glob": "^4.0.0",
            "normalize-path": "^2.1.1",
            "path-is-absolute": "^1.0.0",
            "readdirp": "^2.0.0",
            "upath": "^1.0.0"
          }
        },
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "dev": true,
          "requires": {
            "ms": "2.0.0"
          }
        },
        "expand-brackets": {
          "version": "2.1.4",
          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
          "dev": true,
          "requires": {
            "debug": "^2.3.3",
            "define-property": "^0.2.5",
            "extend-shallow": "^2.0.1",
            "posix-character-classes": "^0.1.0",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "define-property": {
              "version": "0.2.5",
              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
              "dev": true,
              "requires": {
                "is-descriptor": "^0.1.0"
              }
            },
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            },
            "is-accessor-descriptor": {
              "version": "0.1.6",
              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
              "dev": true,
              "requires": {
                "kind-of": "^3.0.2"
              },
              "dependencies": {
                "kind-of": {
                  "version": "3.2.2",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
                  "dev": true,
                  "requires": {
                    "is-buffer": "^1.1.5"
                  }
                }
              }
            },
            "is-data-descriptor": {
              "version": "0.1.4",
              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
              "dev": true,
              "requires": {
                "kind-of": "^3.0.2"
              },
              "dependencies": {
                "kind-of": {
                  "version": "3.2.2",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
                  "dev": true,
                  "requires": {
                    "is-buffer": "^1.1.5"
                  }
                }
              }
            },
            "is-descriptor": {
              "version": "0.1.6",
              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
              "dev": true,
              "requires": {
                "is-accessor-descriptor": "^0.1.6",
                "is-data-descriptor": "^0.1.4",
                "kind-of": "^5.0.0"
              }
            },
            "kind-of": {
              "version": "5.1.0",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
              "dev": true
            }
          }
        },
        "extglob": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
          "dev": true,
          "requires": {
            "array-unique": "^0.3.2",
            "define-property": "^1.0.0",
            "expand-brackets": "^2.1.4",
            "extend-shallow": "^2.0.1",
            "fragment-cache": "^0.2.1",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.1"
          },
          "dependencies": {
            "define-property": {
              "version": "1.0.0",
              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
              "dev": true,
              "requires": {
                "is-descriptor": "^1.0.0"
              }
            },
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "fill-range": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
          "dev": true,
          "requires": {
            "extend-shallow": "^2.0.1",
            "is-number": "^3.0.0",
            "repeat-string": "^1.6.1",
            "to-regex-range": "^2.1.0"
          },
          "dependencies": {
            "extend-shallow": {
              "version": "2.0.1",
              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
              "dev": true,
              "requires": {
                "is-extendable": "^0.1.0"
              }
            }
          }
        },
        "glob-parent": {
          "version": "3.1.0",
          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
          "dev": true,
          "requires": {
            "is-glob": "^3.1.0",
            "path-dirname": "^1.0.0"
          },
          "dependencies": {
            "is-glob": {
              "version": "3.1.0",
              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
              "dev": true,
              "requires": {
                "is-extglob": "^2.1.0"
              }
            }
          }
        },
        "is-accessor-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-data-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-descriptor": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^1.0.0",
            "is-data-descriptor": "^1.0.0",
            "kind-of": "^6.0.2"
          }
        },
        "is-extglob": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
          "dev": true
        },
        "is-glob": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
          "dev": true,
          "requires": {
            "is-extglob": "^2.1.1"
          }
        },
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          },
          "dependencies": {
            "kind-of": {
              "version": "3.2.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
              "dev": true,
              "requires": {
                "is-buffer": "^1.1.5"
              }
            }
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        },
        "micromatch": {
          "version": "3.1.10",
          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
          "dev": true,
          "requires": {
            "arr-diff": "^4.0.0",
            "array-unique": "^0.3.2",
            "braces": "^2.3.1",
            "define-property": "^2.0.2",
            "extend-shallow": "^3.0.2",
            "extglob": "^2.0.4",
            "fragment-cache": "^0.2.1",
            "kind-of": "^6.0.2",
            "nanomatch": "^1.2.9",
            "object.pick": "^1.3.0",
            "regex-not": "^1.0.0",
            "snapdragon": "^0.8.1",
            "to-regex": "^3.0.2"
          }
        }
      }
    },
    "karma-sauce-launcher": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-1.2.0.tgz",
      "integrity": "sha512-lEhtGRGS+3Yw6JSx/vJY9iQyHNtTjcojrSwNzqNUOaDceKDu9dPZqA/kr69bUO9G2T6GKbu8AZgXqy94qo31Jg==",
      "dev": true,
      "requires": {
        "q": "^1.5.0",
        "sauce-connect-launcher": "^1.2.2",
        "saucelabs": "^1.4.0",
        "wd": "^1.4.0"
      },
      "dependencies": {
        "q": {
          "version": "1.5.1",
          "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
          "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
          "dev": true
        }
      }
    },
    "kind-of": {
      "version": "3.2.2",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
      "requires": {
        "is-buffer": "^1.1.5"
      }
    },
    "lazy-cache": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
      "dev": true,
      "optional": true
    },
    "lazystream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
      "dev": true,
      "requires": {
        "readable-stream": "^2.0.5"
      }
    },
    "lcid": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
      "dev": true,
      "requires": {
        "invert-kv": "^1.0.0"
      }
    },
    "lcov-parse": {
      "version": "0.0.10",
      "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz",
      "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=",
      "dev": true
    },
    "left-pad": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
      "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
      "dev": true
    },
    "levn": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
      "requires": {
        "prelude-ls": "~1.1.2",
        "type-check": "~0.3.2"
      }
    },
    "load-json-file": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
      "dev": true,
      "requires": {
        "graceful-fs": "^4.1.2",
        "parse-json": "^2.2.0",
        "pify": "^2.0.0",
        "pinkie-promise": "^2.0.0",
        "strip-bom": "^2.0.0"
      }
    },
    "locate-path": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
      "dev": true,
      "requires": {
        "p-locate": "^3.0.0",
        "path-exists": "^3.0.0"
      },
      "dependencies": {
        "path-exists": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
          "dev": true
        }
      }
    },
    "lodash": {
      "version": "4.17.5",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
      "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
      "dev": true
    },
    "lodash.debounce": {
      "version": "4.0.8",
      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
      "dev": true
    },
    "lodash.every": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz",
      "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc="
    },
    "lodash.flattendeep": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI="
    },
    "lodash.foreach": {
      "version": "4.5.0",
      "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
      "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM="
    },
    "lodash.get": {
      "version": "4.4.2",
      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
      "dev": true
    },
    "lodash.map": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
      "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM="
    },
    "lodash.maxby": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz",
      "integrity": "sha1-CCJABo88eiJ6oAqDgOTzjPB4bj0="
    },
    "lodash.sortby": {
      "version": "4.7.0",
      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
      "dev": true
    },
    "log-driver": {
      "version": "1.2.7",
      "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz",
      "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==",
      "dev": true
    },
    "log4js": {
      "version": "3.0.5",
      "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.5.tgz",
      "integrity": "sha512-IX5c3G/7fuTtdr0JjOT2OIR12aTESVhsH6cEsijloYwKgcPRlO6DgOU72v0UFhWcoV1HN6+M3dwT89qVPLXm0w==",
      "dev": true,
      "requires": {
        "circular-json": "^0.5.5",
        "date-format": "^1.2.0",
        "debug": "^3.1.0",
        "rfdc": "^1.1.2",
        "streamroller": "0.7.0"
      },
      "dependencies": {
        "circular-json": {
          "version": "0.5.5",
          "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.5.tgz",
          "integrity": "sha512-13YaR6kiz0kBNmIVM87Io8Hp7bWOo4r61vkEANy8iH9R9bc6avud/1FT0SBpqR1RpIQADOh/Q+yHZDA1iL6ysA==",
          "dev": true
        }
      }
    },
    "lolex": {
      "version": "2.3.2",
      "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz",
      "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==",
      "dev": true
    },
    "longest": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
      "dev": true
    },
    "loud-rejection": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
      "dev": true,
      "requires": {
        "currently-unhandled": "^0.4.1",
        "signal-exit": "^3.0.0"
      }
    },
    "lru-cache": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
      "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
      "dev": true,
      "requires": {
        "pseudomap": "^1.0.2",
        "yallist": "^2.1.2"
      }
    },
    "magic-string": {
      "version": "0.22.5",
      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
      "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
      "dev": true,
      "requires": {
        "vlq": "^0.2.2"
      },
      "dependencies": {
        "vlq": {
          "version": "0.2.3",
          "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
          "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
          "dev": true
        }
      }
    },
    "map-cache": {
      "version": "0.2.2",
      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
      "dev": true
    },
    "map-obj": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
      "dev": true
    },
    "map-visit": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
      "dev": true,
      "requires": {
        "object-visit": "^1.0.0"
      }
    },
    "math-random": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
      "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w="
    },
    "media-typer": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
      "dev": true
    },
    "mem": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
      "dev": true,
      "requires": {
        "mimic-fn": "^1.0.0"
      }
    },
    "meow": {
      "version": "3.7.0",
      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
      "dev": true,
      "requires": {
        "camelcase-keys": "^2.0.0",
        "decamelize": "^1.1.2",
        "loud-rejection": "^1.0.0",
        "map-obj": "^1.0.1",
        "minimist": "^1.1.3",
        "normalize-package-data": "^2.3.4",
        "object-assign": "^4.0.1",
        "read-pkg-up": "^1.0.1",
        "redent": "^1.0.0",
        "trim-newlines": "^1.0.0"
      }
    },
    "micromatch": {
      "version": "2.3.11",
      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
      "requires": {
        "arr-diff": "^2.0.0",
        "array-unique": "^0.2.1",
        "braces": "^1.8.2",
        "expand-brackets": "^0.1.4",
        "extglob": "^0.3.1",
        "filename-regex": "^2.0.0",
        "is-extglob": "^1.0.0",
        "is-glob": "^2.0.1",
        "kind-of": "^3.0.2",
        "normalize-path": "^2.0.1",
        "object.omit": "^2.0.0",
        "parse-glob": "^3.0.4",
        "regex-cache": "^0.4.2"
      }
    },
    "mime": {
      "version": "2.3.1",
      "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
      "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
      "dev": true
    },
    "mime-db": {
      "version": "1.33.0",
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
      "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
      "dev": true
    },
    "mime-types": {
      "version": "2.1.18",
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
      "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
      "dev": true,
      "requires": {
        "mime-db": "~1.33.0"
      }
    },
    "mimic-fn": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
      "dev": true
    },
    "minimatch": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
      "requires": {
        "brace-expansion": "^1.1.7"
      }
    },
    "minimist": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
      "dev": true
    },
    "mixin-deep": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
      "dev": true,
      "requires": {
        "for-in": "^1.0.2",
        "is-extendable": "^1.0.1"
      },
      "dependencies": {
        "is-extendable": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
          "dev": true,
          "requires": {
            "is-plain-object": "^2.0.4"
          }
        }
      }
    },
    "mkdirp": {
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
      "dev": true,
      "requires": {
        "minimist": "0.0.8"
      },
      "dependencies": {
        "minimist": {
          "version": "0.0.8",
          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
          "dev": true
        }
      }
    },
    "mocha": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
      "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
      "dev": true,
      "requires": {
        "browser-stdout": "1.3.0",
        "commander": "2.11.0",
        "debug": "3.1.0",
        "diff": "3.3.1",
        "escape-string-regexp": "1.0.5",
        "glob": "7.1.2",
        "growl": "1.10.3",
        "he": "1.1.1",
        "mkdirp": "0.5.1",
        "supports-color": "4.4.0"
      },
      "dependencies": {
        "commander": {
          "version": "2.11.0",
          "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
          "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
          "dev": true
        },
        "has-flag": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
          "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
          "dev": true
        },
        "supports-color": {
          "version": "4.4.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
          "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
          "dev": true,
          "requires": {
            "has-flag": "^2.0.0"
          }
        }
      }
    },
    "ms": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
      "dev": true
    },
    "mute-stream": {
      "version": "0.0.7",
      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
      "dev": true
    },
    "nan": {
      "version": "2.10.0",
      "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
      "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
      "optional": true
    },
    "nanomatch": {
      "version": "1.2.9",
      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
      "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
      "dev": true,
      "requires": {
        "arr-diff": "^4.0.0",
        "array-unique": "^0.3.2",
        "define-property": "^2.0.2",
        "extend-shallow": "^3.0.2",
        "fragment-cache": "^0.2.1",
        "is-odd": "^2.0.0",
        "is-windows": "^1.0.2",
        "kind-of": "^6.0.2",
        "object.pick": "^1.3.0",
        "regex-not": "^1.0.0",
        "snapdragon": "^0.8.1",
        "to-regex": "^3.0.1"
      },
      "dependencies": {
        "arr-diff": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
          "dev": true
        },
        "array-unique": {
          "version": "0.3.2",
          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        }
      }
    },
    "natural-compare": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
      "dev": true
    },
    "negotiator": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
      "dev": true
    },
    "nise": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.2.tgz",
      "integrity": "sha512-KPKb+wvETBiwb4eTwtR/OsA2+iijXP+VnlSFYJo3EHjm2yjek1NWxHOUQat3i7xNLm1Bm18UA5j5Wor0yO2GtA==",
      "dev": true,
      "requires": {
        "@sinonjs/formatio": "^2.0.0",
        "just-extend": "^1.1.27",
        "lolex": "^2.3.2",
        "path-to-regexp": "^1.7.0",
        "text-encoding": "^0.6.4"
      }
    },
    "nopt": {
      "version": "3.0.6",
      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
      "dev": true,
      "requires": {
        "abbrev": "1"
      }
    },
    "normalize-package-data": {
      "version": "2.4.0",
      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
      "dev": true,
      "requires": {
        "hosted-git-info": "^2.1.4",
        "is-builtin-module": "^1.0.0",
        "semver": "2 || 3 || 4 || 5",
        "validate-npm-package-license": "^3.0.1"
      }
    },
    "normalize-path": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
      "requires": {
        "remove-trailing-separator": "^1.0.1"
      }
    },
    "npm-run-path": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
      "dev": true,
      "requires": {
        "path-key": "^2.0.0"
      }
    },
    "nth-check": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
      "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
      "dev": true,
      "requires": {
        "boolbase": "~1.0.0"
      }
    },
    "null-check": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
      "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
      "dev": true
    },
    "number-is-nan": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
      "dev": true
    },
    "nwmatcher": {
      "version": "1.4.4",
      "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
      "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
      "dev": true
    },
    "oauth-sign": {
      "version": "0.9.0",
      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
      "dev": true
    },
    "object-assign": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
      "dev": true
    },
    "object-component": {
      "version": "0.0.3",
      "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
      "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
      "dev": true
    },
    "object-copy": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
      "dev": true,
      "requires": {
        "copy-descriptor": "^0.1.0",
        "define-property": "^0.2.5",
        "kind-of": "^3.0.3"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        }
      }
    },
    "object-visit": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
      "dev": true,
      "requires": {
        "isobject": "^3.0.0"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "object.omit": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
      "requires": {
        "for-own": "^0.1.4",
        "is-extendable": "^0.1.1"
      }
    },
    "object.pick": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
      "dev": true,
      "requires": {
        "isobject": "^3.0.1"
      },
      "dependencies": {
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "on-finished": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
      "dev": true,
      "requires": {
        "ee-first": "1.1.1"
      }
    },
    "once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
      "dev": true,
      "requires": {
        "wrappy": "1"
      }
    },
    "onetime": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
      "dev": true,
      "requires": {
        "mimic-fn": "^1.0.0"
      }
    },
    "optimist": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
      "dev": true,
      "requires": {
        "minimist": "~0.0.1",
        "wordwrap": "~0.0.2"
      },
      "dependencies": {
        "minimist": {
          "version": "0.0.10",
          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
          "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
          "dev": true
        },
        "wordwrap": {
          "version": "0.0.3",
          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
          "dev": true
        }
      }
    },
    "optionator": {
      "version": "0.8.2",
      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
      "requires": {
        "deep-is": "~0.1.3",
        "fast-levenshtein": "~2.0.4",
        "levn": "~0.3.0",
        "prelude-ls": "~1.1.2",
        "type-check": "~0.3.2",
        "wordwrap": "~1.0.0"
      }
    },
    "os-homedir": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
      "dev": true
    },
    "os-locale": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
      "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
      "dev": true,
      "requires": {
        "execa": "^0.7.0",
        "lcid": "^1.0.0",
        "mem": "^1.1.0"
      }
    },
    "os-tmpdir": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
      "dev": true
    },
    "p-finally": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
      "dev": true
    },
    "p-limit": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
      "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
      "dev": true,
      "requires": {
        "p-try": "^2.0.0"
      }
    },
    "p-locate": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
      "dev": true,
      "requires": {
        "p-limit": "^2.0.0"
      }
    },
    "p-try": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
      "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
      "dev": true
    },
    "parse-glob": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
      "requires": {
        "glob-base": "^0.3.0",
        "is-dotfile": "^1.0.0",
        "is-extglob": "^1.0.0",
        "is-glob": "^2.0.0"
      }
    },
    "parse-json": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
      "dev": true,
      "requires": {
        "error-ex": "^1.2.0"
      }
    },
    "parse5": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
      "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
      "dev": true,
      "requires": {
        "@types/node": "*"
      }
    },
    "parseqs": {
      "version": "0.0.5",
      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
      "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
      "dev": true,
      "requires": {
        "better-assert": "~1.0.0"
      }
    },
    "parseuri": {
      "version": "0.0.5",
      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
      "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
      "dev": true,
      "requires": {
        "better-assert": "~1.0.0"
      }
    },
    "parseurl": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
      "dev": true
    },
    "pascalcase": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
      "dev": true
    },
    "path-dirname": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
      "dev": true
    },
    "path-exists": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
      "dev": true,
      "requires": {
        "pinkie-promise": "^2.0.0"
      }
    },
    "path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
    },
    "path-is-inside": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
      "dev": true
    },
    "path-key": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
      "dev": true
    },
    "path-parse": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
      "dev": true
    },
    "path-to-regexp": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
      "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
      "dev": true,
      "requires": {
        "isarray": "0.0.1"
      },
      "dependencies": {
        "isarray": {
          "version": "0.0.1",
          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
          "dev": true
        }
      }
    },
    "path-type": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
      "dev": true,
      "requires": {
        "graceful-fs": "^4.1.2",
        "pify": "^2.0.0",
        "pinkie-promise": "^2.0.0"
      }
    },
    "pathval": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
      "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
      "dev": true
    },
    "performance-now": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
      "dev": true
    },
    "pify": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
      "dev": true
    },
    "pinkie": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
      "dev": true
    },
    "pinkie-promise": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
      "dev": true,
      "requires": {
        "pinkie": "^2.0.0"
      }
    },
    "platform": {
      "version": "1.3.5",
      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz",
      "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==",
      "dev": true
    },
    "pluralize": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
      "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
      "dev": true
    },
    "pn": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
      "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
      "dev": true
    },
    "posix-character-classes": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
      "dev": true
    },
    "prelude-ls": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
    },
    "preserve": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
    },
    "process-nextick-args": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
    },
    "progress": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
      "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
      "dev": true
    },
    "pseudomap": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
      "dev": true
    },
    "psl": {
      "version": "1.1.29",
      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
      "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
      "dev": true
    },
    "punycode": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
      "dev": true
    },
    "q": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
      "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
      "dev": true
    },
    "qjobs": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
      "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
      "dev": true
    },
    "qs": {
      "version": "6.5.2",
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
      "dev": true
    },
    "range-parser": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
      "dev": true
    },
    "raw-body": {
      "version": "2.3.3",
      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
      "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
      "dev": true,
      "requires": {
        "bytes": "3.0.0",
        "http-errors": "1.6.3",
        "iconv-lite": "0.4.23",
        "unpipe": "1.0.0"
      },
      "dependencies": {
        "iconv-lite": {
          "version": "0.4.23",
          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
          "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
          "dev": true,
          "requires": {
            "safer-buffer": ">= 2.1.2 < 3"
          }
        }
      }
    },
    "read-pkg": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
      "dev": true,
      "requires": {
        "load-json-file": "^1.0.0",
        "normalize-package-data": "^2.3.2",
        "path-type": "^1.0.0"
      }
    },
    "read-pkg-up": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
      "dev": true,
      "requires": {
        "find-up": "^1.0.0",
        "read-pkg": "^1.0.0"
      }
    },
    "readable-stream": {
      "version": "2.3.6",
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
      "requires": {
        "core-util-is": "~1.0.0",
        "inherits": "~2.0.3",
        "isarray": "~1.0.0",
        "process-nextick-args": "~2.0.0",
        "safe-buffer": "~5.1.1",
        "string_decoder": "~1.1.1",
        "util-deprecate": "~1.0.1"
      }
    },
    "readdirp": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
      "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
      "requires": {
        "graceful-fs": "^4.1.2",
        "minimatch": "^3.0.2",
        "readable-stream": "^2.0.2",
        "set-immediate-shim": "^1.0.1"
      }
    },
    "redent": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
      "dev": true,
      "requires": {
        "indent-string": "^2.1.0",
        "strip-indent": "^1.0.1"
      }
    },
    "regex-cache": {
      "version": "0.4.4",
      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
      "requires": {
        "is-equal-shallow": "^0.1.3"
      }
    },
    "regex-not": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
      "dev": true,
      "requires": {
        "extend-shallow": "^3.0.2",
        "safe-regex": "^1.1.0"
      }
    },
    "regexpp": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
      "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
      "dev": true
    },
    "remove-trailing-separator": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
    },
    "repeat-element": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
    },
    "repeat-string": {
      "version": "1.6.1",
      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
    },
    "repeating": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
      "dev": true,
      "requires": {
        "is-finite": "^1.0.0"
      }
    },
    "request": {
      "version": "2.88.0",
      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
      "dev": true,
      "requires": {
        "aws-sign2": "~0.7.0",
        "aws4": "^1.8.0",
        "caseless": "~0.12.0",
        "combined-stream": "~1.0.6",
        "extend": "~3.0.2",
        "forever-agent": "~0.6.1",
        "form-data": "~2.3.2",
        "har-validator": "~5.1.0",
        "http-signature": "~1.2.0",
        "is-typedarray": "~1.0.0",
        "isstream": "~0.1.2",
        "json-stringify-safe": "~5.0.1",
        "mime-types": "~2.1.19",
        "oauth-sign": "~0.9.0",
        "performance-now": "^2.1.0",
        "qs": "~6.5.2",
        "safe-buffer": "^5.1.2",
        "tough-cookie": "~2.4.3",
        "tunnel-agent": "^0.6.0",
        "uuid": "^3.3.2"
      },
      "dependencies": {
        "extend": {
          "version": "3.0.2",
          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
          "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
          "dev": true
        },
        "mime-db": {
          "version": "1.37.0",
          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
          "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
          "dev": true
        },
        "mime-types": {
          "version": "2.1.21",
          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
          "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
          "dev": true,
          "requires": {
            "mime-db": "~1.37.0"
          }
        },
        "safe-buffer": {
          "version": "5.1.2",
          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
          "dev": true
        },
        "tough-cookie": {
          "version": "2.4.3",
          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
          "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
          "dev": true,
          "requires": {
            "psl": "^1.1.24",
            "punycode": "^1.4.1"
          }
        }
      }
    },
    "request-promise-core": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
      "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
      "dev": true,
      "requires": {
        "lodash": "^4.13.1"
      }
    },
    "request-promise-native": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
      "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
      "dev": true,
      "requires": {
        "request-promise-core": "1.1.1",
        "stealthy-require": "^1.1.0",
        "tough-cookie": ">=2.3.3"
      }
    },
    "require-directory": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
      "dev": true
    },
    "require-main-filename": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
      "dev": true
    },
    "require-uncached": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
      "dev": true,
      "requires": {
        "caller-path": "^0.1.0",
        "resolve-from": "^1.0.0"
      }
    },
    "requires-port": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
      "dev": true
    },
    "resolve": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
      "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
      "dev": true
    },
    "resolve-from": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
      "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
      "dev": true
    },
    "resolve-url": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
      "dev": true
    },
    "restore-cursor": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
      "dev": true,
      "requires": {
        "onetime": "^2.0.0",
        "signal-exit": "^3.0.2"
      }
    },
    "ret": {
      "version": "0.1.15",
      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
      "dev": true
    },
    "rfdc": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz",
      "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==",
      "dev": true
    },
    "right-align": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
      "dev": true,
      "optional": true,
      "requires": {
        "align-text": "^0.1.1"
      }
    },
    "rimraf": {
      "version": "2.6.2",
      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
      "dev": true,
      "requires": {
        "glob": "^7.0.5"
      }
    },
    "riot-cli": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/riot-cli/-/riot-cli-4.0.2.tgz",
      "integrity": "sha512-lOiFgmdjS9GSdQ1ctw+n2yK8kgxMH3I2BL30u2dTfRcvRUmZJoKKOkA36Ri+BCXX4MbPbBuBtbqK7ntBfmNhFw==",
      "requires": {
        "chalk": "^2.3.0",
        "chokidar": "^1.7.0",
        "co": "^4.6.0",
        "optionator": "^0.8.2",
        "riot-compiler": "^3.4.0",
        "rollup": "^0.52.1"
      },
      "dependencies": {
        "rollup": {
          "version": "0.52.3",
          "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.52.3.tgz",
          "integrity": "sha512-cw+vb9NqaTXlwJyb8G+Ve+uhhlVTcl1NKBkfANdeQqVcpZFilQgeNnAnNiu7MwfeXrqiKEGz+3R03a3zeFkmEQ=="
        }
      }
    },
    "riot-compiler": {
      "version": "3.5.2",
      "resolved": "https://registry.npmjs.org/riot-compiler/-/riot-compiler-3.5.2.tgz",
      "integrity": "sha512-GGYWxuDy67Votz6UlM1MCZO8b/7FHOqt80OhTi4hjjjJIBh8qD7hDAUT87u2ru+4T3TZBJ2ZEqJF35dXFRUdIw==",
      "requires": {
        "skip-regex": "^0.3.1",
        "source-map": "^0.7.2",
        "string-similarity": "^1.2.0"
      },
      "dependencies": {
        "source-map": {
          "version": "0.7.3",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
        }
      }
    },
    "riot-observable": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/riot-observable/-/riot-observable-3.0.0.tgz",
      "integrity": "sha1-i70tr3KiFBuwQwgt9AI9xQS60us="
    },
    "riot-tmpl": {
      "version": "3.0.8",
      "resolved": "https://registry.npmjs.org/riot-tmpl/-/riot-tmpl-3.0.8.tgz",
      "integrity": "sha1-3WVOcqOhUgywCcvvcMc4Vt7VhKY=",
      "requires": {
        "eslint-config-riot": "^1.0.0"
      }
    },
    "rollup": {
      "version": "0.66.6",
      "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.66.6.tgz",
      "integrity": "sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw==",
      "dev": true,
      "requires": {
        "@types/estree": "0.0.39",
        "@types/node": "*"
      }
    },
    "rollup-plugin-alias": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/rollup-plugin-alias/-/rollup-plugin-alias-1.4.0.tgz",
      "integrity": "sha512-lB094zdi19FS+1bVarVp9kBN0Zk41PdTGoCk0z8xesKO7RGjOo18cp1hUzEqrOQ4bM9+KLD9nbnu/XUxQm9pbg==",
      "dev": true,
      "requires": {
        "slash": "^1.0.0"
      }
    },
    "rollup-plugin-buble": {
      "version": "0.19.2",
      "resolved": "https://registry.npmjs.org/rollup-plugin-buble/-/rollup-plugin-buble-0.19.2.tgz",
      "integrity": "sha512-dxK0prR8j/7qhI2EZDz/evKCRuhuZMpRlUGPrRWmpg5/2V8tP1XFW+Uk0WfxyNgFfJHvy0GmxnJSTb5dIaNljQ==",
      "dev": true,
      "requires": {
        "buble": "^0.19.2",
        "rollup-pluginutils": "^2.0.1"
      }
    },
    "rollup-plugin-commonjs": {
      "version": "9.1.3",
      "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.3.tgz",
      "integrity": "sha512-g91ZZKZwTW7F7vL6jMee38I8coj/Q9GBdTmXXeFL7ldgC1Ky5WJvHgbKlAiXXTh762qvohhExwUgeQGFh9suGg==",
      "dev": true,
      "requires": {
        "estree-walker": "^0.5.1",
        "magic-string": "^0.22.4",
        "resolve": "^1.5.0",
        "rollup-pluginutils": "^2.0.1"
      },
      "dependencies": {
        "estree-walker": {
          "version": "0.5.1",
          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.1.tgz",
          "integrity": "sha512-7HgCgz1axW7w5aOvgOQkoR1RMBkllygJrssU3BvymKQ95lxXYv6Pon17fBRDm9qhkvXZGijOULoSF9ShOk/ZLg==",
          "dev": true
        },
        "resolve": {
          "version": "1.7.0",
          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
          "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
          "dev": true,
          "requires": {
            "path-parse": "^1.0.5"
          }
        }
      }
    },
    "rollup-plugin-node-resolve": {
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz",
      "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==",
      "dev": true,
      "requires": {
        "builtin-modules": "^2.0.0",
        "is-module": "^1.0.0",
        "resolve": "^1.1.6"
      },
      "dependencies": {
        "builtin-modules": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz",
          "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==",
          "dev": true
        }
      }
    },
    "rollup-plugin-riot": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/rollup-plugin-riot/-/rollup-plugin-riot-2.0.0.tgz",
      "integrity": "sha512-PRx2BHnfM/xjmWvC///y2HTsWxAR1QD4jA50lmEKm4vAeWXIrFl8z1GZJ117DZEGPRDK/VlvgiwgohkPz9YFlw==",
      "dev": true,
      "requires": {
        "magic-string": "^0.22.4",
        "object-assign": "^4.1.1",
        "rollup-pluginutils": "^2.0.1"
      }
    },
    "rollup-pluginutils": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz",
      "integrity": "sha1-fslbNXP2VDpGpkYb2afFRFJdD8A=",
      "dev": true,
      "requires": {
        "estree-walker": "^0.3.0",
        "micromatch": "^2.3.11"
      }
    },
    "run-async": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
      "dev": true,
      "requires": {
        "is-promise": "^2.1.0"
      }
    },
    "rx-lite": {
      "version": "4.0.8",
      "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
      "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
      "dev": true
    },
    "rx-lite-aggregates": {
      "version": "4.0.8",
      "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
      "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
      "dev": true,
      "requires": {
        "rx-lite": "*"
      }
    },
    "safe-buffer": {
      "version": "5.1.1",
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
    },
    "safe-regex": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
      "dev": true,
      "requires": {
        "ret": "~0.1.10"
      }
    },
    "safer-buffer": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
      "dev": true
    },
    "samsam": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
      "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
      "dev": true
    },
    "sauce-connect-launcher": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz",
      "integrity": "sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA==",
      "dev": true,
      "requires": {
        "adm-zip": "~0.4.3",
        "async": "^2.1.2",
        "https-proxy-agent": "^2.2.1",
        "lodash": "^4.16.6",
        "rimraf": "^2.5.4"
      },
      "dependencies": {
        "agent-base": {
          "version": "4.2.0",
          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
          "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
          "dev": true,
          "requires": {
            "es6-promisify": "^5.0.0"
          }
        },
        "async": {
          "version": "2.6.0",
          "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
          "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
          "dev": true,
          "requires": {
            "lodash": "^4.14.0"
          }
        },
        "https-proxy-agent": {
          "version": "2.2.1",
          "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
          "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
          "dev": true,
          "requires": {
            "agent-base": "^4.1.0",
            "debug": "^3.1.0"
          }
        }
      }
    },
    "saucelabs": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz",
      "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==",
      "dev": true,
      "requires": {
        "https-proxy-agent": "^2.2.1"
      },
      "dependencies": {
        "agent-base": {
          "version": "4.2.0",
          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
          "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
          "dev": true,
          "requires": {
            "es6-promisify": "^5.0.0"
          }
        },
        "https-proxy-agent": {
          "version": "2.2.1",
          "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
          "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
          "dev": true,
          "requires": {
            "agent-base": "^4.1.0",
            "debug": "^3.1.0"
          }
        }
      }
    },
    "sax": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
      "dev": true
    },
    "semver": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
      "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
      "dev": true
    },
    "set-blocking": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
      "dev": true
    },
    "set-immediate-shim": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
    },
    "set-value": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
      "dev": true,
      "requires": {
        "extend-shallow": "^2.0.1",
        "is-extendable": "^0.1.1",
        "is-plain-object": "^2.0.3",
        "split-string": "^3.0.1"
      },
      "dependencies": {
        "extend-shallow": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
          "dev": true,
          "requires": {
            "is-extendable": "^0.1.0"
          }
        }
      }
    },
    "setprototypeof": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
      "dev": true
    },
    "shebang-command": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
      "dev": true,
      "requires": {
        "shebang-regex": "^1.0.0"
      }
    },
    "shebang-regex": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
      "dev": true
    },
    "signal-exit": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
      "dev": true
    },
    "simple-dom": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/simple-dom/-/simple-dom-1.3.0.tgz",
      "integrity": "sha512-RVjr6e80FFGDqDJZeQd4EMwoDLatn4Jy2SfuXecrP1IgG4ZAqkGSokE8LNV5i0kzWR2IM0e257xGN9JS8lxm0Q=="
    },
    "simple-html-tokenizer": {
      "version": "0.5.7",
      "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz",
      "integrity": "sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg=="
    },
    "sinon": {
      "version": "4.5.0",
      "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz",
      "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==",
      "dev": true,
      "requires": {
        "@sinonjs/formatio": "^2.0.0",
        "diff": "^3.1.0",
        "lodash.get": "^4.4.2",
        "lolex": "^2.2.0",
        "nise": "^1.2.0",
        "supports-color": "^5.1.0",
        "type-detect": "^4.0.5"
      }
    },
    "sinon-chai": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.0.0.tgz",
      "integrity": "sha512-+cqeKiuMZjZs800fRf4kjJR/Pp4p7bYY3ciZHClFNS8tSzJoAcWni/ZUZD8TrfZ+oFRyLiKWX3fTClDATGy5vQ==",
      "dev": true
    },
    "skip-regex": {
      "version": "0.3.1",
      "resolved": "https://registry.npmjs.org/skip-regex/-/skip-regex-0.3.1.tgz",
      "integrity": "sha1-F5GarirEzj1h1ed+7diCBsZKohU="
    },
    "slash": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
      "dev": true
    },
    "slice-ansi": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
      "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
      "dev": true,
      "requires": {
        "is-fullwidth-code-point": "^2.0.0"
      },
      "dependencies": {
        "is-fullwidth-code-point": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
          "dev": true
        }
      }
    },
    "snapdragon": {
      "version": "0.8.2",
      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
      "dev": true,
      "requires": {
        "base": "^0.11.1",
        "debug": "^2.2.0",
        "define-property": "^0.2.5",
        "extend-shallow": "^2.0.1",
        "map-cache": "^0.2.2",
        "source-map": "^0.5.6",
        "source-map-resolve": "^0.5.0",
        "use": "^3.1.0"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "dev": true,
          "requires": {
            "ms": "2.0.0"
          }
        },
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        },
        "extend-shallow": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
          "dev": true,
          "requires": {
            "is-extendable": "^0.1.0"
          }
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        }
      }
    },
    "snapdragon-node": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
      "dev": true,
      "requires": {
        "define-property": "^1.0.0",
        "isobject": "^3.0.0",
        "snapdragon-util": "^3.0.1"
      },
      "dependencies": {
        "define-property": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^1.0.0"
          }
        },
        "is-accessor-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-data-descriptor": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
          "dev": true,
          "requires": {
            "kind-of": "^6.0.0"
          }
        },
        "is-descriptor": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
          "dev": true,
          "requires": {
            "is-accessor-descriptor": "^1.0.0",
            "is-data-descriptor": "^1.0.0",
            "kind-of": "^6.0.2"
          }
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        }
      }
    },
    "snapdragon-util": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
      "dev": true,
      "requires": {
        "kind-of": "^3.2.0"
      }
    },
    "sntp": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
      "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
      "dev": true,
      "requires": {
        "hoek": "4.x.x"
      }
    },
    "socket.io": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz",
      "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==",
      "dev": true,
      "requires": {
        "debug": "~3.1.0",
        "engine.io": "~3.2.0",
        "has-binary2": "~1.0.2",
        "socket.io-adapter": "~1.1.0",
        "socket.io-client": "2.1.1",
        "socket.io-parser": "~3.2.0"
      }
    },
    "socket.io-adapter": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
      "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
      "dev": true
    },
    "socket.io-client": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
      "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==",
      "dev": true,
      "requires": {
        "backo2": "1.0.2",
        "base64-arraybuffer": "0.1.5",
        "component-bind": "1.0.0",
        "component-emitter": "1.2.1",
        "debug": "~3.1.0",
        "engine.io-client": "~3.2.0",
        "has-binary2": "~1.0.2",
        "has-cors": "1.1.0",
        "indexof": "0.0.1",
        "object-component": "0.0.3",
        "parseqs": "0.0.5",
        "parseuri": "0.0.5",
        "socket.io-parser": "~3.2.0",
        "to-array": "0.1.4"
      }
    },
    "socket.io-parser": {
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
      "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
      "dev": true,
      "requires": {
        "component-emitter": "1.2.1",
        "debug": "~3.1.0",
        "isarray": "2.0.1"
      },
      "dependencies": {
        "isarray": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
          "dev": true
        }
      }
    },
    "source-map": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
      "dev": true
    },
    "source-map-resolve": {
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
      "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
      "dev": true,
      "requires": {
        "atob": "^2.0.0",
        "decode-uri-component": "^0.2.0",
        "resolve-url": "^0.2.1",
        "source-map-url": "^0.4.0",
        "urix": "^0.1.0"
      }
    },
    "source-map-url": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
      "dev": true
    },
    "spdx-correct": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
      "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
      "dev": true,
      "requires": {
        "spdx-expression-parse": "^3.0.0",
        "spdx-license-ids": "^3.0.0"
      }
    },
    "spdx-exceptions": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
      "dev": true
    },
    "spdx-expression-parse": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
      "dev": true,
      "requires": {
        "spdx-exceptions": "^2.1.0",
        "spdx-license-ids": "^3.0.0"
      }
    },
    "spdx-license-ids": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
      "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
      "dev": true
    },
    "split-string": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
      "dev": true,
      "requires": {
        "extend-shallow": "^3.0.0"
      }
    },
    "sprintf-js": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
      "dev": true
    },
    "sshpk": {
      "version": "1.15.2",
      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
      "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
      "dev": true,
      "requires": {
        "asn1": "~0.2.3",
        "assert-plus": "^1.0.0",
        "bcrypt-pbkdf": "^1.0.0",
        "dashdash": "^1.12.0",
        "ecc-jsbn": "~0.1.1",
        "getpass": "^0.1.1",
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.0.2",
        "tweetnacl": "~0.14.0"
      }
    },
    "static-extend": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
      "dev": true,
      "requires": {
        "define-property": "^0.2.5",
        "object-copy": "^0.1.0"
      },
      "dependencies": {
        "define-property": {
          "version": "0.2.5",
          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
          "dev": true,
          "requires": {
            "is-descriptor": "^0.1.0"
          }
        }
      }
    },
    "statuses": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
      "dev": true
    },
    "stealthy-require": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
      "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
      "dev": true
    },
    "streamroller": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz",
      "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==",
      "dev": true,
      "requires": {
        "date-format": "^1.2.0",
        "debug": "^3.1.0",
        "mkdirp": "^0.5.1",
        "readable-stream": "^2.3.0"
      }
    },
    "string-similarity": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz",
      "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==",
      "requires": {
        "lodash.every": "^4.6.0",
        "lodash.flattendeep": "^4.4.0",
        "lodash.foreach": "^4.5.0",
        "lodash.map": "^4.6.0",
        "lodash.maxby": "^4.6.0"
      }
    },
    "string-width": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
      "dev": true,
      "requires": {
        "is-fullwidth-code-point": "^2.0.0",
        "strip-ansi": "^4.0.0"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
          "dev": true
        },
        "strip-ansi": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
          "dev": true,
          "requires": {
            "ansi-regex": "^3.0.0"
          }
        }
      }
    },
    "string_decoder": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
      "requires": {
        "safe-buffer": "~5.1.0"
      }
    },
    "stringstream": {
      "version": "0.0.6",
      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
      "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==",
      "dev": true
    },
    "strip-ansi": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
      "dev": true,
      "requires": {
        "ansi-regex": "^2.0.0"
      }
    },
    "strip-bom": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
      "dev": true,
      "requires": {
        "is-utf8": "^0.2.0"
      }
    },
    "strip-eof": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
      "dev": true
    },
    "strip-indent": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
      "dev": true,
      "requires": {
        "get-stdin": "^4.0.1"
      }
    },
    "strip-json-comments": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
      "dev": true
    },
    "supports-color": {
      "version": "5.3.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
      "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
      "requires": {
        "has-flag": "^3.0.0"
      }
    },
    "symbol-tree": {
      "version": "3.2.2",
      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
      "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
      "dev": true
    },
    "table": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
      "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
      "dev": true,
      "requires": {
        "ajv": "^5.2.3",
        "ajv-keywords": "^2.1.0",
        "chalk": "^2.1.0",
        "lodash": "^4.17.4",
        "slice-ansi": "1.0.0",
        "string-width": "^2.1.1"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
          "dev": true
        },
        "is-fullwidth-code-point": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
          "dev": true
        },
        "string-width": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
          "dev": true,
          "requires": {
            "is-fullwidth-code-point": "^2.0.0",
            "strip-ansi": "^4.0.0"
          }
        },
        "strip-ansi": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
          "dev": true,
          "requires": {
            "ansi-regex": "^3.0.0"
          }
        }
      }
    },
    "tar-stream": {
      "version": "1.6.2",
      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
      "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
      "dev": true,
      "requires": {
        "bl": "^1.0.0",
        "buffer-alloc": "^1.2.0",
        "end-of-stream": "^1.0.0",
        "fs-constants": "^1.0.0",
        "readable-stream": "^2.3.0",
        "to-buffer": "^1.1.1",
        "xtend": "^4.0.0"
      }
    },
    "text-encoding": {
      "version": "0.6.4",
      "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
      "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
      "dev": true
    },
    "text-table": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
      "dev": true
    },
    "through": {
      "version": "2.3.8",
      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
      "dev": true
    },
    "tmp": {
      "version": "0.0.33",
      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
      "dev": true,
      "requires": {
        "os-tmpdir": "~1.0.2"
      }
    },
    "to-array": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
      "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
      "dev": true
    },
    "to-buffer": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
      "dev": true
    },
    "to-object-path": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
      "dev": true,
      "requires": {
        "kind-of": "^3.0.2"
      }
    },
    "to-regex": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
      "dev": true,
      "requires": {
        "define-property": "^2.0.2",
        "extend-shallow": "^3.0.2",
        "regex-not": "^1.0.2",
        "safe-regex": "^1.1.0"
      }
    },
    "to-regex-range": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
      "dev": true,
      "requires": {
        "is-number": "^3.0.0",
        "repeat-string": "^1.6.1"
      },
      "dependencies": {
        "is-number": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
          "dev": true,
          "requires": {
            "kind-of": "^3.0.2"
          }
        }
      }
    },
    "tough-cookie": {
      "version": "2.3.4",
      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
      "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
      "dev": true,
      "requires": {
        "punycode": "^1.4.1"
      }
    },
    "tr46": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
      "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
      "dev": true,
      "requires": {
        "punycode": "^2.1.0"
      },
      "dependencies": {
        "punycode": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
          "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
          "dev": true
        }
      }
    },
    "trim-newlines": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
      "dev": true
    },
    "tunnel-agent": {
      "version": "0.6.0",
      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
      "dev": true,
      "requires": {
        "safe-buffer": "^5.0.1"
      }
    },
    "tweetnacl": {
      "version": "0.14.5",
      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
      "dev": true
    },
    "type-check": {
      "version": "0.3.2",
      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
      "requires": {
        "prelude-ls": "~1.1.2"
      }
    },
    "type-detect": {
      "version": "4.0.8",
      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
      "dev": true
    },
    "type-is": {
      "version": "1.6.16",
      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
      "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
      "dev": true,
      "requires": {
        "media-typer": "0.3.0",
        "mime-types": "~2.1.18"
      }
    },
    "typedarray": {
      "version": "0.0.6",
      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
      "dev": true
    },
    "uglify-js": {
      "version": "3.4.9",
      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
      "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
      "dev": true,
      "requires": {
        "commander": "~2.17.1",
        "source-map": "~0.6.1"
      }
    },
    "uglify-to-browserify": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
      "dev": true,
      "optional": true
    },
    "ultron": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
      "dev": true
    },
    "union-value": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
      "dev": true,
      "requires": {
        "arr-union": "^3.1.0",
        "get-value": "^2.0.6",
        "is-extendable": "^0.1.1",
        "set-value": "^0.4.3"
      },
      "dependencies": {
        "extend-shallow": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
          "dev": true,
          "requires": {
            "is-extendable": "^0.1.0"
          }
        },
        "set-value": {
          "version": "0.4.3",
          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
          "dev": true,
          "requires": {
            "extend-shallow": "^2.0.1",
            "is-extendable": "^0.1.1",
            "is-plain-object": "^2.0.1",
            "to-object-path": "^0.3.0"
          }
        }
      }
    },
    "unpipe": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
      "dev": true
    },
    "unset-value": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
      "dev": true,
      "requires": {
        "has-value": "^0.3.1",
        "isobject": "^3.0.0"
      },
      "dependencies": {
        "has-value": {
          "version": "0.3.1",
          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
          "dev": true,
          "requires": {
            "get-value": "^2.0.3",
            "has-values": "^0.1.4",
            "isobject": "^2.0.0"
          },
          "dependencies": {
            "isobject": {
              "version": "2.1.0",
              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
              "dev": true,
              "requires": {
                "isarray": "1.0.0"
              }
            }
          }
        },
        "has-values": {
          "version": "0.1.4",
          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
          "dev": true
        },
        "isobject": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
          "dev": true
        }
      }
    },
    "upath": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz",
      "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==",
      "dev": true
    },
    "urix": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
      "dev": true
    },
    "use": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
      "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
      "dev": true,
      "requires": {
        "kind-of": "^6.0.2"
      },
      "dependencies": {
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
          "dev": true
        }
      }
    },
    "useragent": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz",
      "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=",
      "dev": true,
      "requires": {
        "lru-cache": "2.2.x",
        "tmp": "0.0.x"
      },
      "dependencies": {
        "lru-cache": {
          "version": "2.2.4",
          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz",
          "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=",
          "dev": true
        }
      }
    },
    "util-deprecate": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
    },
    "utils-merge": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
      "dev": true
    },
    "uuid": {
      "version": "3.3.2",
      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
      "dev": true
    },
    "validate-npm-package-license": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
      "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
      "dev": true,
      "requires": {
        "spdx-correct": "^3.0.0",
        "spdx-expression-parse": "^3.0.0"
      }
    },
    "vargs": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
      "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
      "dev": true
    },
    "verror": {
      "version": "1.10.0",
      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
      "dev": true,
      "requires": {
        "assert-plus": "^1.0.0",
        "core-util-is": "1.0.2",
        "extsprintf": "^1.2.0"
      }
    },
    "vlq": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.0.tgz",
      "integrity": "sha512-o3WmXySo+oI5thgqr7Qy8uBkT/v9Zr+sRyrh1lr8aWPUkgDWdWt4Nae2WKBrLsocgE8BuWWD0jLc+VW8LeU+2g==",
      "dev": true
    },
    "void-elements": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
      "dev": true
    },
    "w3c-hr-time": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
      "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
      "dev": true,
      "requires": {
        "browser-process-hrtime": "^0.1.2"
      }
    },
    "wd": {
      "version": "1.11.0",
      "resolved": "https://registry.npmjs.org/wd/-/wd-1.11.0.tgz",
      "integrity": "sha512-h2EBfJvmsWocIjOOg5BsHh9IJKrqZDG4Az4jEZhFugEH7sOPcX6feZQ30aFuktqDI0jquarZJmNpA6V0A0Q7Mg==",
      "dev": true,
      "requires": {
        "archiver": "2.1.1",
        "async": "2.0.1",
        "lodash": "4.17.10",
        "mkdirp": "^0.5.1",
        "q": "1.4.1",
        "request": "2.85.0",
        "vargs": "0.1.0"
      },
      "dependencies": {
        "async": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
          "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
          "dev": true,
          "requires": {
            "lodash": "^4.8.0"
          }
        },
        "har-validator": {
          "version": "5.0.3",
          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
          "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
          "dev": true,
          "requires": {
            "ajv": "^5.1.0",
            "har-schema": "^2.0.0"
          }
        },
        "lodash": {
          "version": "4.17.10",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
          "dev": true
        },
        "oauth-sign": {
          "version": "0.8.2",
          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
          "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
          "dev": true
        },
        "request": {
          "version": "2.85.0",
          "resolved": "http://registry.npmjs.org/request/-/request-2.85.0.tgz",
          "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
          "dev": true,
          "requires": {
            "aws-sign2": "~0.7.0",
            "aws4": "^1.6.0",
            "caseless": "~0.12.0",
            "combined-stream": "~1.0.5",
            "extend": "~3.0.1",
            "forever-agent": "~0.6.1",
            "form-data": "~2.3.1",
            "har-validator": "~5.0.3",
            "hawk": "~6.0.2",
            "http-signature": "~1.2.0",
            "is-typedarray": "~1.0.0",
            "isstream": "~0.1.2",
            "json-stringify-safe": "~5.0.1",
            "mime-types": "~2.1.17",
            "oauth-sign": "~0.8.2",
            "performance-now": "^2.1.0",
            "qs": "~6.5.1",
            "safe-buffer": "^5.1.1",
            "stringstream": "~0.0.5",
            "tough-cookie": "~2.3.3",
            "tunnel-agent": "^0.6.0",
            "uuid": "^3.1.0"
          }
        }
      }
    },
    "webidl-conversions": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
      "dev": true
    },
    "whatwg-encoding": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz",
      "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==",
      "dev": true,
      "requires": {
        "iconv-lite": "0.4.19"
      },
      "dependencies": {
        "iconv-lite": {
          "version": "0.4.19",
          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
          "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
          "dev": true
        }
      }
    },
    "whatwg-mimetype": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz",
      "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==",
      "dev": true
    },
    "whatwg-url": {
      "version": "6.4.1",
      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz",
      "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==",
      "dev": true,
      "requires": {
        "lodash.sortby": "^4.7.0",
        "tr46": "^1.0.1",
        "webidl-conversions": "^4.0.2"
      }
    },
    "which": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
      "dev": true,
      "requires": {
        "isexe": "^2.0.0"
      }
    },
    "which-module": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
      "dev": true
    },
    "wordwrap": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
    },
    "wrap-ansi": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
      "dev": true,
      "requires": {
        "string-width": "^1.0.1",
        "strip-ansi": "^3.0.1"
      },
      "dependencies": {
        "is-fullwidth-code-point": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
          "dev": true,
          "requires": {
            "number-is-nan": "^1.0.0"
          }
        },
        "string-width": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
          "dev": true,
          "requires": {
            "code-point-at": "^1.0.0",
            "is-fullwidth-code-point": "^1.0.0",
            "strip-ansi": "^3.0.0"
          }
        }
      }
    },
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
      "dev": true
    },
    "write": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
      "dev": true,
      "requires": {
        "mkdirp": "^0.5.1"
      }
    },
    "ws": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz",
      "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==",
      "dev": true,
      "requires": {
        "async-limiter": "~1.0.0",
        "safe-buffer": "~5.1.0"
      }
    },
    "xml-name-validator": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
      "dev": true
    },
    "xmlhttprequest-ssl": {
      "version": "1.5.5",
      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
      "dev": true
    },
    "xregexp": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
      "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
      "dev": true
    },
    "xtend": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
      "dev": true
    },
    "y18n": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
      "dev": true
    },
    "yallist": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
      "dev": true
    },
    "yargs": {
      "version": "12.0.1",
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz",
      "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==",
      "dev": true,
      "requires": {
        "cliui": "^4.0.0",
        "decamelize": "^2.0.0",
        "find-up": "^3.0.0",
        "get-caller-file": "^1.0.1",
        "os-locale": "^2.0.0",
        "require-directory": "^2.1.1",
        "require-main-filename": "^1.0.1",
        "set-blocking": "^2.0.0",
        "string-width": "^2.0.0",
        "which-module": "^2.0.0",
        "y18n": "^3.2.1 || ^4.0.0",
        "yargs-parser": "^10.1.0"
      },
      "dependencies": {
        "decamelize": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
          "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
          "dev": true,
          "requires": {
            "xregexp": "4.0.0"
          }
        },
        "find-up": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
          "dev": true,
          "requires": {
            "locate-path": "^3.0.0"
          }
        }
      }
    },
    "yargs-parser": {
      "version": "10.1.0",
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
      "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
      "dev": true,
      "requires": {
        "camelcase": "^4.1.0"
      },
      "dependencies": {
        "camelcase": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
          "dev": true
        }
      }
    },
    "yeast": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
      "dev": true
    },
    "zip-stream": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
      "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
      "dev": true,
      "requires": {
        "archiver-utils": "^1.3.0",
        "compress-commons": "^1.2.0",
        "lodash": "^4.8.0",
        "readable-stream": "^2.0.0"
      }
    }
  }
}

Added public/riot-3.13.2/package.json.







































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
{
  "name": "riot",
  "version": "3.13.2",
  "description": "Simple and elegant component-based UI library",
  "homepage": "http://riot.js.org/",
  "repository": "riot/riot",
  "author": "Riot maintainers team + smart people from all over the world",
  "contributors": [
    "Gianluca Guarini https://github.com/GianlucaGuarini"
  ],
  "license": "MIT",
  "engines": {
    "node": ">=4.0.0"
  },
  "scripts": {
    "test": "make riot"
  },
  "keywords": [
    "custom tags",
    "custom elements",
    "web components",
    "virtual dom",
    "shadow dom",
    "minimal",
    "simple",
    "easy",
    "dom",
    "minimalist",
    "client-side",
    "framework",
    "declarative",
    "templating",
    "template",
    "data binding",
    "mvc",
    "model",
    "view",
    "controller",
    "riotjs",
    "riot.js"
  ],
  "dependencies": {
    "riot-cli": "^4.0.2",
    "riot-compiler": "^3.5.2",
    "riot-observable": "^3.0.0",
    "riot-tmpl": "^3.0.8",
    "simple-dom": "1.3.0",
    "simple-html-tokenizer": "^0.5.7"
  },
  "devDependencies": {
    "benchmark": "^2.1.4",
    "chai": "^4.1.2",
    "cheerio": "^1.0.0-rc.2",
    "chokidar-cli": "^1.2.1",
    "coveralls": "^3.0.2",
    "eslint": "^4.19.1",
    "eslint-config-riot": "^1.0.0",
    "glob": "^7.1.2",
    "istanbul": "^0.4.5",
    "jsdom": "^11.10.0",
    "karma": "^3.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-coverage": "^1.1.2",
    "karma-mocha": "^1.3.0",
    "karma-rollup-preprocessor": "^6.0.0",
    "karma-sauce-launcher": "^1.2.0",
    "mocha": "^4.1.0",
    "rollup": "^0.66.6",
    "rollup-plugin-alias": "1.4.0",
    "rollup-plugin-buble": "^0.19.2",
    "rollup-plugin-commonjs": "^9.1.3",
    "rollup-plugin-node-resolve": "^3.3.0",
    "rollup-plugin-riot": "^2.0.0",
    "sinon": "^4.5.0",
    "sinon-chai": "^3.0.0",
    "uglify-js": "^3.4.9"
  },
  "preferGlobal": true,
  "directories": {
    "bin": "bin",
    "lib": "lib"
  },
  "files": [
    "lib",
    "bin",
    "riot.js",
    "riot.min.js",
    "riot.csp.js",
    "riot+compiler.js",
    "riot+compiler.min.js"
  ],
  "bin": {
    "riot": "bin/index.js"
  },
  "main": "lib/server/index.js",
  "module": "lib/riot.js",
  "jsnext:main": "lib/riot.js",
  "browser": "riot.js"
}

Added public/riot-3.13.2/riot+compiler.js.





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
/* Riot v3.13.2, @license MIT */
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global.riot = factory());
}(this, (function () { 'use strict';

  /**
   * Shorter and fast way to select a single node in the DOM
   * @param   { String } selector - unique dom selector
   * @param   { Object } ctx - DOM node where the target of our search will is located
   * @returns { Object } dom node found
   */
  function $(selector, ctx) {
    return (ctx || document).querySelector(selector)
  }

  var
    // be aware, internal usage
    // ATTENTION: prefix the global dynamic variables with `__`
    // tags instances cache
    __TAGS_CACHE = [],
    // tags implementation cache
    __TAG_IMPL = {},
    YIELD_TAG = 'yield',

    /**
     * Const
     */
    GLOBAL_MIXIN = '__global_mixin',

    // riot specific prefixes or attributes
    ATTRS_PREFIX = 'riot-',

    // Riot Directives
    REF_DIRECTIVES = ['ref', 'data-ref'],
    IS_DIRECTIVE = 'data-is',
    CONDITIONAL_DIRECTIVE = 'if',
    LOOP_DIRECTIVE = 'each',
    LOOP_NO_REORDER_DIRECTIVE = 'no-reorder',
    SHOW_DIRECTIVE = 'show',
    HIDE_DIRECTIVE = 'hide',
    KEY_DIRECTIVE = 'key',
    RIOT_EVENTS_KEY = '__riot-events__',

    // for typeof == '' comparisons
    T_STRING = 'string',
    T_OBJECT = 'object',
    T_UNDEF  = 'undefined',
    T_FUNCTION = 'function',

    XLINK_NS = 'http://www.w3.org/1999/xlink',
    SVG_NS = 'http://www.w3.org/2000/svg',
    XLINK_REGEX = /^xlink:(\w+)/,

    WIN = typeof window === T_UNDEF ? /* istanbul ignore next */ undefined : window,

    // special native tags that cannot be treated like the others
    RE_SPECIAL_TAGS = /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/,
    RE_SPECIAL_TAGS_NO_OPTION = /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/,
    RE_EVENTS_PREFIX = /^on/,
    RE_HTML_ATTRS = /([-\w]+) ?= ?(?:"([^"]*)|'([^']*)|({[^}]*}))/g,
    // some DOM attributes must be normalized
    CASE_SENSITIVE_ATTRIBUTES = {
      'viewbox': 'viewBox',
      'preserveaspectratio': 'preserveAspectRatio'
    },
    /**
     * Matches boolean HTML attributes in the riot tag definition.
     * With a long list like this, a regex is faster than `[].indexOf` in most browsers.
     * @const {RegExp}
     * @see [attributes.md](https://github.com/riot/compiler/blob/dev/doc/attributes.md)
     */
    RE_BOOL_ATTRS = /^(?:disabled|checked|readonly|required|allowfullscreen|auto(?:focus|play)|compact|controls|default|formnovalidate|hidden|ismap|itemscope|loop|multiple|muted|no(?:resize|shade|validate|wrap)?|open|reversed|seamless|selected|sortable|truespeed|typemustmatch)$/,
    // version# for IE 8-11, 0 for others
    IE_VERSION = (WIN && WIN.document || /* istanbul ignore next */ {}).documentMode | 0;

  /**
   * Create a generic DOM node
   * @param   { String } name - name of the DOM node we want to create
   * @returns { Object } DOM node just created
   */
  function makeElement(name) {
    return name === 'svg' ? document.createElementNS(SVG_NS, name) : document.createElement(name)
  }

  /**
   * Set any DOM attribute
   * @param { Object } dom - DOM node we want to update
   * @param { String } name - name of the property we want to set
   * @param { String } val - value of the property we want to set
   */
  function setAttribute(dom, name, val) {
    var xlink = XLINK_REGEX.exec(name);
    if (xlink && xlink[1])
      { dom.setAttributeNS(XLINK_NS, xlink[1], val); }
    else
      { dom.setAttribute(name, val); }
  }

  var styleNode;
  // Create cache and shortcut to the correct property
  var cssTextProp;
  var byName = {};
  var needsInject = false;

  // skip the following code on the server
  if (WIN) {
    styleNode = ((function () {
      // create a new style element with the correct type
      var newNode = makeElement('style');
      // replace any user node or insert the new one into the head
      var userNode = $('style[type=riot]');

      setAttribute(newNode, 'type', 'text/css');
      /* istanbul ignore next */
      if (userNode) {
        if (userNode.id) { newNode.id = userNode.id; }
        userNode.parentNode.replaceChild(newNode, userNode);
      } else { document.head.appendChild(newNode); }

      return newNode
    }))();
    cssTextProp = styleNode.styleSheet;
  }

  /**
   * Object that will be used to inject and manage the css of every tag instance
   */
  var styleManager = {
    styleNode: styleNode,
    /**
     * Save a tag style to be later injected into DOM
     * @param { String } css - css string
     * @param { String } name - if it's passed we will map the css to a tagname
     */
    add: function add(css, name) {
      byName[name] = css;
      needsInject = true;
    },
    /**
     * Inject all previously saved tag styles into DOM
     * innerHTML seems slow: http://jsperf.com/riot-insert-style
     */
    inject: function inject() {
      if (!WIN || !needsInject) { return }
      needsInject = false;
      var style = Object.keys(byName)
        .map(function (k) { return byName[k]; })
        .join('\n');
      /* istanbul ignore next */
      if (cssTextProp) { cssTextProp.cssText = style; }
      else { styleNode.innerHTML = style; }
    },

    /**
     * Remove a tag style of injected DOM later.
     * @param {String} name a registered tagname
     */
    remove: function remove(name) {
      delete byName[name];
      needsInject = true;
    }
  };

  /**
   * The riot template engine
   * @version v3.0.8
   */

  /* istanbul ignore next */
  var skipRegex = (function () { //eslint-disable-line no-unused-vars

    var beforeReChars = '[{(,;:?=|&!^~>%*/';

    var beforeReWords = [
      'case',
      'default',
      'do',
      'else',
      'in',
      'instanceof',
      'prefix',
      'return',
      'typeof',
      'void',
      'yield'
    ];

    var wordsLastChar = beforeReWords.reduce(function (s, w) {
      return s + w.slice(-1)
    }, '');

    var RE_REGEX = /^\/(?=[^*>/])[^[/\\]*(?:(?:\\.|\[(?:\\.|[^\]\\]*)*\])[^[\\/]*)*?\/[gimuy]*/;
    var RE_VN_CHAR = /[$\w]/;

    function prev (code, pos) {
      while (--pos >= 0 && /\s/.test(code[pos])){ }
      return pos
    }

    function _skipRegex (code, start) {

      var re = /.*/g;
      var pos = re.lastIndex = start++;
      var match = re.exec(code)[0].match(RE_REGEX);

      if (match) {
        var next = pos + match[0].length;

        pos = prev(code, pos);
        var c = code[pos];

        if (pos < 0 || ~beforeReChars.indexOf(c)) {
          return next
        }

        if (c === '.') {

          if (code[pos - 1] === '.') {
            start = next;
          }

        } else if (c === '+' || c === '-') {

          if (code[--pos] !== c ||
              (pos = prev(code, pos)) < 0 ||
              !RE_VN_CHAR.test(code[pos])) {
            start = next;
          }

        } else if (~wordsLastChar.indexOf(c)) {

          var end = pos + 1;

          while (--pos >= 0 && RE_VN_CHAR.test(code[pos])){ }
          if (~beforeReWords.indexOf(code.slice(pos + 1, end))) {
            start = next;
          }
        }
      }

      return start
    }

    return _skipRegex

  })();

  /**
   * riot.util.brackets
   *
   * - `brackets    ` - Returns a string or regex based on its parameter
   * - `brackets.set` - Change the current riot brackets
   *
   * @module
   */

  /* global riot */

  /* istanbul ignore next */
  var brackets = (function (UNDEF) {

    var
      REGLOB = 'g',

      R_MLCOMMS = /\/\*[^*]*\*+(?:[^*\/][^*]*\*+)*\//g,

      R_STRINGS = /"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|`[^`\\]*(?:\\[\S\s][^`\\]*)*`/g,

      S_QBLOCKS = R_STRINGS.source + '|' +
        /(?:\breturn\s+|(?:[$\w\)\]]|\+\+|--)\s*(\/)(?![*\/]))/.source + '|' +
        /\/(?=[^*\/])[^[\/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[\/\\]*)*?([^<]\/)[gim]*/.source,

      UNSUPPORTED = RegExp('[\\' + 'x00-\\x1F<>a-zA-Z0-9\'",;\\\\]'),

      NEED_ESCAPE = /(?=[[\]()*+?.^$|])/g,

      S_QBLOCK2 = R_STRINGS.source + '|' + /(\/)(?![*\/])/.source,

      FINDBRACES = {
        '(': RegExp('([()])|'   + S_QBLOCK2, REGLOB),
        '[': RegExp('([[\\]])|' + S_QBLOCK2, REGLOB),
        '{': RegExp('([{}])|'   + S_QBLOCK2, REGLOB)
      },

      DEFAULT = '{ }';

    var _pairs = [
      '{', '}',
      '{', '}',
      /{[^}]*}/,
      /\\([{}])/g,
      /\\({)|{/g,
      RegExp('\\\\(})|([[({])|(})|' + S_QBLOCK2, REGLOB),
      DEFAULT,
      /^\s*{\^?\s*([$\w]+)(?:\s*,\s*(\S+))?\s+in\s+(\S.*)\s*}/,
      /(^|[^\\]){=[\S\s]*?}/
    ];

    var
      cachedBrackets = UNDEF,
      _regex,
      _cache = [],
      _settings;

    function _loopback (re) { return re }

    function _rewrite (re, bp) {
      if (!bp) { bp = _cache; }
      return new RegExp(
        re.source.replace(/{/g, bp[2]).replace(/}/g, bp[3]), re.global ? REGLOB : ''
      )
    }

    function _create (pair) {
      if (pair === DEFAULT) { return _pairs }

      var arr = pair.split(' ');

      if (arr.length !== 2 || UNSUPPORTED.test(pair)) {
        throw new Error('Unsupported brackets "' + pair + '"')
      }
      arr = arr.concat(pair.replace(NEED_ESCAPE, '\\').split(' '));

      arr[4] = _rewrite(arr[1].length > 1 ? /{[\S\s]*?}/ : _pairs[4], arr);
      arr[5] = _rewrite(pair.length > 3 ? /\\({|})/g : _pairs[5], arr);
      arr[6] = _rewrite(_pairs[6], arr);
      arr[7] = RegExp('\\\\(' + arr[3] + ')|([[({])|(' + arr[3] + ')|' + S_QBLOCK2, REGLOB);
      arr[8] = pair;
      return arr
    }

    function _brackets (reOrIdx) {
      return reOrIdx instanceof RegExp ? _regex(reOrIdx) : _cache[reOrIdx]
    }

    _brackets.split = function split (str, tmpl, _bp) {
      // istanbul ignore next: _bp is for the compiler
      if (!_bp) { _bp = _cache; }

      var
        parts = [],
        match,
        isexpr,
        start,
        pos,
        re = _bp[6];

      var qblocks = [];
      var prevStr = '';
      var mark, lastIndex;

      isexpr = start = re.lastIndex = 0;

      while ((match = re.exec(str))) {

        lastIndex = re.lastIndex;
        pos = match.index;

        if (isexpr) {

          if (match[2]) {

            var ch = match[2];
            var rech = FINDBRACES[ch];
            var ix = 1;

            rech.lastIndex = lastIndex;
            while ((match = rech.exec(str))) {
              if (match[1]) {
                if (match[1] === ch) { ++ix; }
                else if (!--ix) { break }
              } else {
                rech.lastIndex = pushQBlock(match.index, rech.lastIndex, match[2]);
              }
            }
            re.lastIndex = ix ? str.length : rech.lastIndex;
            continue
          }

          if (!match[3]) {
            re.lastIndex = pushQBlock(pos, lastIndex, match[4]);
            continue
          }
        }

        if (!match[1]) {
          unescapeStr(str.slice(start, pos));
          start = re.lastIndex;
          re = _bp[6 + (isexpr ^= 1)];
          re.lastIndex = start;
        }
      }

      if (str && start < str.length) {
        unescapeStr(str.slice(start));
      }

      parts.qblocks = qblocks;

      return parts

      function unescapeStr (s) {
        if (prevStr) {
          s = prevStr + s;
          prevStr = '';
        }
        if (tmpl || isexpr) {
          parts.push(s && s.replace(_bp[5], '$1'));
        } else {
          parts.push(s);
        }
      }

      function pushQBlock(_pos, _lastIndex, slash) { //eslint-disable-line
        if (slash) {
          _lastIndex = skipRegex(str, _pos);
        }

        if (tmpl && _lastIndex > _pos + 2) {
          mark = '\u2057' + qblocks.length + '~';
          qblocks.push(str.slice(_pos, _lastIndex));
          prevStr += str.slice(start, _pos) + mark;
          start = _lastIndex;
        }
        return _lastIndex
      }
    };

    _brackets.hasExpr = function hasExpr (str) {
      return _cache[4].test(str)
    };

    _brackets.loopKeys = function loopKeys (expr) {
      var m = expr.match(_cache[9]);

      return m
        ? { key: m[1], pos: m[2], val: _cache[0] + m[3].trim() + _cache[1] }
        : { val: expr.trim() }
    };

    _brackets.array = function array (pair) {
      return pair ? _create(pair) : _cache
    };

    function _reset (pair) {
      if ((pair || (pair = DEFAULT)) !== _cache[8]) {
        _cache = _create(pair);
        _regex = pair === DEFAULT ? _loopback : _rewrite;
        _cache[9] = _regex(_pairs[9]);
      }
      cachedBrackets = pair;
    }

    function _setSettings (o) {
      var b;

      o = o || {};
      b = o.brackets;
      Object.defineProperty(o, 'brackets', {
        set: _reset,
        get: function () { return cachedBrackets },
        enumerable: true
      });
      _settings = o;
      _reset(b);
    }

    Object.defineProperty(_brackets, 'settings', {
      set: _setSettings,
      get: function () { return _settings }
    });

    /* istanbul ignore next: in the browser riot is always in the scope */
    _brackets.settings = typeof riot !== 'undefined' && riot.settings || {};
    _brackets.set = _reset;
    _brackets.skipRegex = skipRegex;

    _brackets.R_STRINGS = R_STRINGS;
    _brackets.R_MLCOMMS = R_MLCOMMS;
    _brackets.S_QBLOCKS = S_QBLOCKS;
    _brackets.S_QBLOCK2 = S_QBLOCK2;

    return _brackets

  })();

  /**
   * @module tmpl
   *
   * tmpl          - Root function, returns the template value, render with data
   * tmpl.hasExpr  - Test the existence of a expression inside a string
   * tmpl.loopKeys - Get the keys for an 'each' loop (used by `_each`)
   */

  /* istanbul ignore next */
  var tmpl = (function () {

    var _cache = {};

    function _tmpl (str, data) {
      if (!str) { return str }

      return (_cache[str] || (_cache[str] = _create(str))).call(
        data, _logErr.bind({
          data: data,
          tmpl: str
        })
      )
    }

    _tmpl.hasExpr = brackets.hasExpr;

    _tmpl.loopKeys = brackets.loopKeys;

    // istanbul ignore next
    _tmpl.clearCache = function () { _cache = {}; };

    _tmpl.errorHandler = null;

    function _logErr (err, ctx) {

      err.riotData = {
        tagName: ctx && ctx.__ && ctx.__.tagName,
        _riot_id: ctx && ctx._riot_id  //eslint-disable-line camelcase
      };

      if (_tmpl.errorHandler) { _tmpl.errorHandler(err); }
      else if (
        typeof console !== 'undefined' &&
        typeof console.error === 'function'
      ) {
        console.error(err.message);
        console.log('<%s> %s', err.riotData.tagName || 'Unknown tag', this.tmpl); // eslint-disable-line
        console.log(this.data); // eslint-disable-line
      }
    }

    function _create (str) {
      var expr = _getTmpl(str);

      if (expr.slice(0, 11) !== 'try{return ') { expr = 'return ' + expr; }

      return new Function('E', expr + ';')    // eslint-disable-line no-new-func
    }

    var RE_DQUOTE = /\u2057/g;
    var RE_QBMARK = /\u2057(\d+)~/g;

    function _getTmpl (str) {
      var parts = brackets.split(str.replace(RE_DQUOTE, '"'), 1);
      var qstr = parts.qblocks;
      var expr;

      if (parts.length > 2 || parts[0]) {
        var i, j, list = [];

        for (i = j = 0; i < parts.length; ++i) {

          expr = parts[i];

          if (expr && (expr = i & 1

              ? _parseExpr(expr, 1, qstr)

              : '"' + expr
                  .replace(/\\/g, '\\\\')
                  .replace(/\r\n?|\n/g, '\\n')
                  .replace(/"/g, '\\"') +
                '"'

            )) { list[j++] = expr; }

        }

        expr = j < 2 ? list[0]
             : '[' + list.join(',') + '].join("")';

      } else {

        expr = _parseExpr(parts[1], 0, qstr);
      }

      if (qstr.length) {
        expr = expr.replace(RE_QBMARK, function (_, pos) {
          return qstr[pos]
            .replace(/\r/g, '\\r')
            .replace(/\n/g, '\\n')
        });
      }
      return expr
    }

    var RE_CSNAME = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/;
    var
      RE_BREND = {
        '(': /[()]/g,
        '[': /[[\]]/g,
        '{': /[{}]/g
      };

    function _parseExpr (expr, asText, qstr) {

      expr = expr
        .replace(/\s+/g, ' ').trim()
        .replace(/\ ?([[\({},?\.:])\ ?/g, '$1');

      if (expr) {
        var
          list = [],
          cnt = 0,
          match;

        while (expr &&
              (match = expr.match(RE_CSNAME)) &&
              !match.index
          ) {
          var
            key,
            jsb,
            re = /,|([[{(])|$/g;

          expr = RegExp.rightContext;
          key  = match[2] ? qstr[match[2]].slice(1, -1).trim().replace(/\s+/g, ' ') : match[1];

          while (jsb = (match = re.exec(expr))[1]) { skipBraces(jsb, re); }

          jsb  = expr.slice(0, match.index);
          expr = RegExp.rightContext;

          list[cnt++] = _wrapExpr(jsb, 1, key);
        }

        expr = !cnt ? _wrapExpr(expr, asText)
             : cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0];
      }
      return expr

      function skipBraces (ch, re) {
        var
          mm,
          lv = 1,
          ir = RE_BREND[ch];

        ir.lastIndex = re.lastIndex;
        while (mm = ir.exec(expr)) {
          if (mm[0] === ch) { ++lv; }
          else if (!--lv) { break }
        }
        re.lastIndex = lv ? expr.length : ir.lastIndex;
      }
    }

    // istanbul ignore next: not both
    var // eslint-disable-next-line max-len
      JS_CONTEXT = '"in this?this:' + (typeof window !== 'object' ? 'global' : 'window') + ').',
      JS_VARNAME = /[,{][\$\w]+(?=:)|(^ *|[^$\w\.{])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\w]))([$_A-Za-z][$\w]*)/g,
      JS_NOPROPS = /^(?=(\.[$\w]+))\1(?:[^.[(]|$)/;

    function _wrapExpr (expr, asText, key) {
      var tb;

      expr = expr.replace(JS_VARNAME, function (match, p, mvar, pos, s) {
        if (mvar) {
          pos = tb ? 0 : pos + match.length;

          if (mvar !== 'this' && mvar !== 'global' && mvar !== 'window') {
            match = p + '("' + mvar + JS_CONTEXT + mvar;
            if (pos) { tb = (s = s[pos]) === '.' || s === '(' || s === '['; }
          } else if (pos) {
            tb = !JS_NOPROPS.test(s.slice(pos));
          }
        }
        return match
      });

      if (tb) {
        expr = 'try{return ' + expr + '}catch(e){E(e,this)}';
      }

      if (key) {

        expr = (tb
            ? 'function(){' + expr + '}.call(this)' : '(' + expr + ')'
          ) + '?"' + key + '":""';

      } else if (asText) {

        expr = 'function(v){' + (tb
            ? expr.replace('return ', 'v=') : 'v=(' + expr + ')'
          ) + ';return v||v===0?v:""}.call(this)';
      }

      return expr
    }

    _tmpl.version = brackets.version = 'v3.0.8';

    return _tmpl

  })();

  /* istanbul ignore next */
  var observable = function(el) {

    /**
     * Extend the original object or create a new empty one
     * @type { Object }
     */

    el = el || {};

    /**
     * Private variables
     */
    var callbacks = {},
      slice = Array.prototype.slice;

    /**
     * Public Api
     */

    // extend the el object adding the observable methods
    Object.defineProperties(el, {
      /**
       * Listen to the given `event` ands
       * execute the `callback` each time an event is triggered.
       * @param  { String } event - event id
       * @param  { Function } fn - callback function
       * @returns { Object } el
       */
      on: {
        value: function(event, fn) {
          if (typeof fn == 'function')
            { (callbacks[event] = callbacks[event] || []).push(fn); }
          return el
        },
        enumerable: false,
        writable: false,
        configurable: false
      },

      /**
       * Removes the given `event` listeners
       * @param   { String } event - event id
       * @param   { Function } fn - callback function
       * @returns { Object } el
       */
      off: {
        value: function(event, fn) {
          if (event == '*' && !fn) { callbacks = {}; }
          else {
            if (fn) {
              var arr = callbacks[event];
              for (var i = 0, cb; cb = arr && arr[i]; ++i) {
                if (cb == fn) { arr.splice(i--, 1); }
              }
            } else { delete callbacks[event]; }
          }
          return el
        },
        enumerable: false,
        writable: false,
        configurable: false
      },

      /**
       * Listen to the given `event` and
       * execute the `callback` at most once
       * @param   { String } event - event id
       * @param   { Function } fn - callback function
       * @returns { Object } el
       */
      one: {
        value: function(event, fn) {
          function on() {
            el.off(event, on);
            fn.apply(el, arguments);
          }
          return el.on(event, on)
        },
        enumerable: false,
        writable: false,
        configurable: false
      },

      /**
       * Execute all callback functions that listen to
       * the given `event`
       * @param   { String } event - event id
       * @returns { Object } el
       */
      trigger: {
        value: function(event) {
          var arguments$1 = arguments;


          // getting the arguments
          var arglen = arguments.length - 1,
            args = new Array(arglen),
            fns,
            fn,
            i;

          for (i = 0; i < arglen; i++) {
            args[i] = arguments$1[i + 1]; // skip first argument
          }

          fns = slice.call(callbacks[event] || [], 0);

          for (i = 0; fn = fns[i]; ++i) {
            fn.apply(el, args);
          }

          if (callbacks['*'] && event != '*')
            { el.trigger.apply(el, ['*', event].concat(args)); }

          return el
        },
        enumerable: false,
        writable: false,
        configurable: false
      }
    });

    return el

  };

  /**
   * Short alias for Object.getOwnPropertyDescriptor
   */
  function getPropDescriptor (o, k) {
    return Object.getOwnPropertyDescriptor(o, k)
  }

  /**
   * Check if passed argument is undefined
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isUndefined(value) {
    return typeof value === T_UNDEF
  }

  /**
   * Check whether object's property could be overridden
   * @param   { Object }  obj - source object
   * @param   { String }  key - object property
   * @returns { Boolean } true if writable
   */
  function isWritable(obj, key) {
    var descriptor = getPropDescriptor(obj, key);
    return isUndefined(obj[key]) || descriptor && descriptor.writable
  }

  /**
   * Extend any object with other properties
   * @param   { Object } src - source object
   * @returns { Object } the resulting extended object
   *
   * var obj = { foo: 'baz' }
   * extend(obj, {bar: 'bar', foo: 'bar'})
   * console.log(obj) => {bar: 'bar', foo: 'bar'}
   *
   */
  function extend(src) {
    var obj;
    var i = 1;
    var args = arguments;
    var l = args.length;

    for (; i < l; i++) {
      if (obj = args[i]) {
        for (var key in obj) {
          // check if this property of the source object could be overridden
          if (isWritable(src, key))
            { src[key] = obj[key]; }
        }
      }
    }
    return src
  }

  /**
   * Alias for Object.create
   */
  function create(src) {
    return Object.create(src)
  }

  var settings = extend(create(brackets.settings), {
    skipAnonymousTags: true,
    // the "value" attributes will be preserved
    keepValueAttributes: false,
    // handle the auto updates on any DOM event
    autoUpdate: true
  });

  /**
   * Shorter and fast way to select multiple nodes in the DOM
   * @param   { String } selector - DOM selector
   * @param   { Object } ctx - DOM node where the targets of our search will is located
   * @returns { Object } dom nodes found
   */
  function $$(selector, ctx) {
    return [].slice.call((ctx || document).querySelectorAll(selector))
  }

  /**
   * Create a document text node
   * @returns { Object } create a text node to use as placeholder
   */
  function createDOMPlaceholder() {
    return document.createTextNode('')
  }

  /**
   * Toggle the visibility of any DOM node
   * @param   { Object }  dom - DOM node we want to hide
   * @param   { Boolean } show - do we want to show it?
   */

  function toggleVisibility(dom, show) {
    dom.style.display = show ? '' : 'none';
    dom.hidden = show ? false : true;
  }

  /**
   * Get the value of any DOM attribute on a node
   * @param   { Object } dom - DOM node we want to parse
   * @param   { String } name - name of the attribute we want to get
   * @returns { String | undefined } name of the node attribute whether it exists
   */
  function getAttribute(dom, name) {
    return dom.getAttribute(name)
  }

  /**
   * Remove any DOM attribute from a node
   * @param   { Object } dom - DOM node we want to update
   * @param   { String } name - name of the property we want to remove
   */
  function removeAttribute(dom, name) {
    dom.removeAttribute(name);
  }

  /**
   * Set the inner html of any DOM node SVGs included
   * @param { Object } container - DOM node where we'll inject new html
   * @param { String } html - html to inject
   * @param { Boolean } isSvg - svg tags should be treated a bit differently
   */
  /* istanbul ignore next */
  function setInnerHTML(container, html, isSvg) {
    // innerHTML is not supported on svg tags so we neet to treat them differently
    if (isSvg) {
      var node = container.ownerDocument.importNode(
        new DOMParser()
          .parseFromString(("<svg xmlns=\"" + SVG_NS + "\">" + html + "</svg>"), 'application/xml')
          .documentElement,
        true
      );

      container.appendChild(node);
    } else {
      container.innerHTML = html;
    }
  }

  /**
   * Minimize risk: only zero or one _space_ between attr & value
   * @param   { String }   html - html string we want to parse
   * @param   { Function } fn - callback function to apply on any attribute found
   */
  function walkAttributes(html, fn) {
    if (!html) { return }
    var m;
    while (m = RE_HTML_ATTRS.exec(html))
      { fn(m[1].toLowerCase(), m[2] || m[3] || m[4]); }
  }

  /**
   * Create a document fragment
   * @returns { Object } document fragment
   */
  function createFragment() {
    return document.createDocumentFragment()
  }

  /**
   * Insert safely a tag to fix #1962 #1649
   * @param   { HTMLElement } root - children container
   * @param   { HTMLElement } curr - node to insert
   * @param   { HTMLElement } next - node that should preceed the current node inserted
   */
  function safeInsert(root, curr, next) {
    root.insertBefore(curr, next.parentNode && next);
  }

  /**
   * Convert a style object to a string
   * @param   { Object } style - style object we need to parse
   * @returns { String } resulting css string
   * @example
   * styleObjectToString({ color: 'red', height: '10px'}) // => 'color: red; height: 10px'
   */
  function styleObjectToString(style) {
    return Object.keys(style).reduce(function (acc, prop) {
      return (acc + " " + prop + ": " + (style[prop]) + ";")
    }, '')
  }

  /**
   * Walk down recursively all the children tags starting dom node
   * @param   { Object }   dom - starting node where we will start the recursion
   * @param   { Function } fn - callback to transform the child node just found
   * @param   { Object }   context - fn can optionally return an object, which is passed to children
   */
  function walkNodes(dom, fn, context) {
    if (dom) {
      var res = fn(dom, context);
      var next;
      // stop the recursion
      if (res === false) { return }

      dom = dom.firstChild;

      while (dom) {
        next = dom.nextSibling;
        walkNodes(dom, fn, res);
        dom = next;
      }
    }
  }



  var dom = /*#__PURE__*/Object.freeze({
    $$: $$,
    $: $,
    createDOMPlaceholder: createDOMPlaceholder,
    mkEl: makeElement,
    setAttr: setAttribute,
    toggleVisibility: toggleVisibility,
    getAttr: getAttribute,
    remAttr: removeAttribute,
    setInnerHTML: setInnerHTML,
    walkAttrs: walkAttributes,
    createFrag: createFragment,
    safeInsert: safeInsert,
    styleObjectToString: styleObjectToString,
    walkNodes: walkNodes
  });

  /**
   * Check against the null and undefined values
   * @param   { * }  value -
   * @returns {Boolean} -
   */
  function isNil(value) {
    return isUndefined(value) || value === null
  }

  /**
   * Check if passed argument is empty. Different from falsy, because we dont consider 0 or false to be blank
   * @param { * } value -
   * @returns { Boolean } -
   */
  function isBlank(value) {
    return isNil(value) || value === ''
  }

  /**
   * Check if passed argument is a function
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isFunction(value) {
    return typeof value === T_FUNCTION
  }

  /**
   * Check if passed argument is an object, exclude null
   * NOTE: use isObject(x) && !isArray(x) to excludes arrays.
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isObject(value) {
    return value && typeof value === T_OBJECT // typeof null is 'object'
  }

  /**
   * Check if a DOM node is an svg tag or part of an svg
   * @param   { HTMLElement }  el - node we want to test
   * @returns {Boolean} true if it's an svg node
   */
  function isSvg(el) {
    var owner = el.ownerSVGElement;
    return !!owner || owner === null
  }

  /**
   * Check if passed argument is a kind of array
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isArray(value) {
    return Array.isArray(value) || value instanceof Array
  }

  /**
   * Check if the passed argument is a boolean attribute
   * @param   { String } value -
   * @returns { Boolean } -
   */
  function isBoolAttr(value) {
    return RE_BOOL_ATTRS.test(value)
  }

  /**
   * Check if passed argument is a string
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isString(value) {
    return typeof value === T_STRING
  }



  var check = /*#__PURE__*/Object.freeze({
    isBlank: isBlank,
    isFunction: isFunction,
    isObject: isObject,
    isSvg: isSvg,
    isWritable: isWritable,
    isArray: isArray,
    isBoolAttr: isBoolAttr,
    isNil: isNil,
    isString: isString,
    isUndefined: isUndefined
  });

  /**
   * Check whether an array contains an item
   * @param   { Array } array - target array
   * @param   { * } item - item to test
   * @returns { Boolean } -
   */
  function contains(array, item) {
    return array.indexOf(item) !== -1
  }

  /**
   * Specialized function for looping an array-like collection with `each={}`
   * @param   { Array } list - collection of items
   * @param   {Function} fn - callback function
   * @returns { Array } the array looped
   */
  function each(list, fn) {
    var len = list ? list.length : 0;
    var i = 0;
    for (; i < len; i++) { fn(list[i], i); }
    return list
  }

  /**
   * Faster String startsWith alternative
   * @param   { String } str - source string
   * @param   { String } value - test string
   * @returns { Boolean } -
   */
  function startsWith(str, value) {
    return str.slice(0, value.length) === value
  }

  /**
   * Function returning always a unique identifier
   * @returns { Number } - number from 0...n
   */
  var uid = (function uid() {
    var i = -1;
    return function () { return ++i; }
  })();

  /**
   * Helper function to set an immutable property
   * @param   { Object } el - object where the new property will be set
   * @param   { String } key - object key where the new property will be stored
   * @param   { * } value - value of the new property
   * @param   { Object } options - set the propery overriding the default options
   * @returns { Object } - the initial object
   */
  function define(el, key, value, options) {
    Object.defineProperty(el, key, extend({
      value: value,
      enumerable: false,
      writable: false,
      configurable: true
    }, options));
    return el
  }

  /**
   * Convert a string containing dashes to camel case
   * @param   { String } str - input string
   * @returns { String } my-string -> myString
   */
  function toCamel(str) {
    return str.replace(/-(\w)/g, function (_, c) { return c.toUpperCase(); })
  }

  /**
   * Warn a message via console
   * @param   {String} message - warning message
   */
  function warn(message) {
    if (console && console.warn) { console.warn(message); }
  }



  var misc = /*#__PURE__*/Object.freeze({
    contains: contains,
    each: each,
    getPropDescriptor: getPropDescriptor,
    startsWith: startsWith,
    uid: uid,
    defineProperty: define,
    objectCreate: create,
    extend: extend,
    toCamel: toCamel,
    warn: warn
  });

  /**
   * Set the property of an object for a given key. If something already
   * exists there, then it becomes an array containing both the old and new value.
   * @param { Object } obj - object on which to set the property
   * @param { String } key - property name
   * @param { Object } value - the value of the property to be set
   * @param { Boolean } ensureArray - ensure that the property remains an array
   * @param { Number } index - add the new item in a certain array position
   */
  function arrayishAdd(obj, key, value, ensureArray, index) {
    var dest = obj[key];
    var isArr = isArray(dest);
    var hasIndex = !isUndefined(index);

    if (dest && dest === value) { return }

    // if the key was never set, set it once
    if (!dest && ensureArray) { obj[key] = [value]; }
    else if (!dest) { obj[key] = value; }
    // if it was an array and not yet set
    else {
      if (isArr) {
        var oldIndex = dest.indexOf(value);
        // this item never changed its position
        if (oldIndex === index) { return }
        // remove the item from its old position
        if (oldIndex !== -1) { dest.splice(oldIndex, 1); }
        // move or add the item
        if (hasIndex) {
          dest.splice(index, 0, value);
        } else {
          dest.push(value);
        }
      } else { obj[key] = [dest, value]; }
    }
  }

  /**
   * Detect the tag implementation by a DOM node
   * @param   { Object } dom - DOM node we need to parse to get its tag implementation
   * @returns { Object } it returns an object containing the implementation of a custom tag (template and boot function)
   */
  function get(dom) {
    return dom.tagName && __TAG_IMPL[getAttribute(dom, IS_DIRECTIVE) ||
      getAttribute(dom, IS_DIRECTIVE) || dom.tagName.toLowerCase()]
  }

  /**
   * Get the tag name of any DOM node
   * @param   { Object } dom - DOM node we want to parse
   * @param   { Boolean } skipDataIs - hack to ignore the data-is attribute when attaching to parent
   * @returns { String } name to identify this dom node in riot
   */
  function getName(dom, skipDataIs) {
    var child = get(dom);
    var namedTag = !skipDataIs && getAttribute(dom, IS_DIRECTIVE);
    return namedTag && !tmpl.hasExpr(namedTag) ?
      namedTag : child ? child.name : dom.tagName.toLowerCase()
  }

  /**
   * Return a temporary context containing also the parent properties
   * @this Tag
   * @param { Tag } - temporary tag context containing all the parent properties
   */
  function inheritParentProps() {
    if (this.parent) { return extend(create(this), this.parent) }
    return this
  }

  /*
    Includes hacks needed for the Internet Explorer version 9 and below
    See: http://kangax.github.io/compat-table/es5/#ie8
         http://codeplanet.io/dropping-ie8/
  */

  var
    reHasYield  = /<yield\b/i,
    reYieldAll  = /<yield\s*(?:\/>|>([\S\s]*?)<\/yield\s*>|>)/ig,
    reYieldSrc  = /<yield\s+to=['"]([^'">]*)['"]\s*>([\S\s]*?)<\/yield\s*>/ig,
    reYieldDest = /<yield\s+from=['"]?([-\w]+)['"]?\s*(?:\/>|>([\S\s]*?)<\/yield\s*>)/ig,
    rootEls = { tr: 'tbody', th: 'tr', td: 'tr', col: 'colgroup' },
    tblTags = IE_VERSION && IE_VERSION < 10 ? RE_SPECIAL_TAGS : RE_SPECIAL_TAGS_NO_OPTION,
    GENERIC = 'div',
    SVG = 'svg';


  /*
    Creates the root element for table or select child elements:
    tr/th/td/thead/tfoot/tbody/caption/col/colgroup/option/optgroup
  */
  function specialTags(el, tmpl, tagName) {

    var
      select = tagName[0] === 'o',
      parent = select ? 'select>' : 'table>';

    // trim() is important here, this ensures we don't have artifacts,
    // so we can check if we have only one element inside the parent
    el.innerHTML = '<' + parent + tmpl.trim() + '</' + parent;
    parent = el.firstChild;

    // returns the immediate parent if tr/th/td/col is the only element, if not
    // returns the whole tree, as this can include additional elements
    /* istanbul ignore next */
    if (select) {
      parent.selectedIndex = -1;  // for IE9, compatible w/current riot behavior
    } else {
      // avoids insertion of cointainer inside container (ex: tbody inside tbody)
      var tname = rootEls[tagName];
      if (tname && parent.childElementCount === 1) { parent = $(tname, parent); }
    }
    return parent
  }

  /*
    Replace the yield tag from any tag template with the innerHTML of the
    original tag in the page
  */
  function replaceYield(tmpl, html) {
    // do nothing if no yield
    if (!reHasYield.test(tmpl)) { return tmpl }

    // be careful with #1343 - string on the source having `$1`
    var src = {};

    html = html && html.replace(reYieldSrc, function (_, ref, text) {
      src[ref] = src[ref] || text;   // preserve first definition
      return ''
    }).trim();

    return tmpl
      .replace(reYieldDest, function (_, ref, def) {  // yield with from - to attrs
        return src[ref] || def || ''
      })
      .replace(reYieldAll, function (_, def) {        // yield without any "from"
        return html || def || ''
      })
  }

  /**
   * Creates a DOM element to wrap the given content. Normally an `DIV`, but can be
   * also a `TABLE`, `SELECT`, `TBODY`, `TR`, or `COLGROUP` element.
   *
   * @param   { String } tmpl  - The template coming from the custom tag definition
   * @param   { String } html - HTML content that comes from the DOM element where you
   *           will mount the tag, mostly the original tag in the page
   * @param   { Boolean } isSvg - true if the root node is an svg
   * @returns { HTMLElement } DOM element with _tmpl_ merged through `YIELD` with the _html_.
   */
  function mkdom(tmpl, html, isSvg) {
    var match   = tmpl && tmpl.match(/^\s*<([-\w]+)/);
    var  tagName = match && match[1].toLowerCase();
    var el = makeElement(isSvg ? SVG : GENERIC);

    // replace all the yield tags with the tag inner html
    tmpl = replaceYield(tmpl, html);

    /* istanbul ignore next */
    if (tblTags.test(tagName))
      { el = specialTags(el, tmpl, tagName); }
    else
      { setInnerHTML(el, tmpl, isSvg); }

    return el
  }

  var EVENT_ATTR_RE = /^on/;

  /**
   * True if the event attribute starts with 'on'
   * @param   { String } attribute - event attribute
   * @returns { Boolean }
   */
  function isEventAttribute(attribute) {
    return EVENT_ATTR_RE.test(attribute)
  }

  /**
   * Loop backward all the parents tree to detect the first custom parent tag
   * @param   { Object } tag - a Tag instance
   * @returns { Object } the instance of the first custom parent tag found
   */
  function getImmediateCustomParent(tag) {
    var ptag = tag;
    while (ptag.__.isAnonymous) {
      if (!ptag.parent) { break }
      ptag = ptag.parent;
    }
    return ptag
  }

  /**
   * Trigger DOM events
   * @param   { HTMLElement } dom - dom element target of the event
   * @param   { Function } handler - user function
   * @param   { Object } e - event object
   */
  function handleEvent(dom, handler, e) {
    var ptag = this.__.parent;
    var item = this.__.item;

    if (!item)
      { while (ptag && !item) {
        item = ptag.__.item;
        ptag = ptag.__.parent;
      } }

    // override the event properties
    /* istanbul ignore next */
    if (isWritable(e, 'currentTarget')) { e.currentTarget = dom; }
    /* istanbul ignore next */
    if (isWritable(e, 'target')) { e.target = e.srcElement; }
    /* istanbul ignore next */
    if (isWritable(e, 'which')) { e.which = e.charCode || e.keyCode; }

    e.item = item;

    handler.call(this, e);

    // avoid auto updates
    if (!settings.autoUpdate) { return }

    if (!e.preventUpdate) {
      var p = getImmediateCustomParent(this);
      // fixes #2083
      if (p.isMounted) { p.update(); }
    }
  }

  /**
   * Attach an event to a DOM node
   * @param { String } name - event name
   * @param { Function } handler - event callback
   * @param { Object } dom - dom node
   * @param { Tag } tag - tag instance
   */
  function setEventHandler(name, handler, dom, tag) {
    var eventName;
    var cb = handleEvent.bind(tag, dom, handler);

    // avoid to bind twice the same event
    // possible fix for #2332
    dom[name] = null;

    // normalize event name
    eventName = name.replace(RE_EVENTS_PREFIX, '');

    // cache the listener into the listeners array
    if (!contains(tag.__.listeners, dom)) { tag.__.listeners.push(dom); }
    if (!dom[RIOT_EVENTS_KEY]) { dom[RIOT_EVENTS_KEY] = {}; }
    if (dom[RIOT_EVENTS_KEY][name]) { dom.removeEventListener(eventName, dom[RIOT_EVENTS_KEY][name]); }

    dom[RIOT_EVENTS_KEY][name] = cb;
    dom.addEventListener(eventName, cb, false);
  }

  /**
   * Create a new child tag including it correctly into its parent
   * @param   { Object } child - child tag implementation
   * @param   { Object } opts - tag options containing the DOM node where the tag will be mounted
   * @param   { String } innerHTML - inner html of the child node
   * @param   { Object } parent - instance of the parent tag including the child custom tag
   * @returns { Object } instance of the new child tag just created
   */
  function initChild(child, opts, innerHTML, parent) {
    var tag = createTag(child, opts, innerHTML);
    var tagName = opts.tagName || getName(opts.root, true);
    var ptag = getImmediateCustomParent(parent);
    // fix for the parent attribute in the looped elements
    define(tag, 'parent', ptag);
    // store the real parent tag
    // in some cases this could be different from the custom parent tag
    // for example in nested loops
    tag.__.parent = parent;

    // add this tag to the custom parent tag
    arrayishAdd(ptag.tags, tagName, tag);

    // and also to the real parent tag
    if (ptag !== parent)
      { arrayishAdd(parent.tags, tagName, tag); }

    return tag
  }

  /**
   * Removes an item from an object at a given key. If the key points to an array,
   * then the item is just removed from the array.
   * @param { Object } obj - object on which to remove the property
   * @param { String } key - property name
   * @param { Object } value - the value of the property to be removed
   * @param { Boolean } ensureArray - ensure that the property remains an array
  */
  function arrayishRemove(obj, key, value, ensureArray) {
    if (isArray(obj[key])) {
      var index = obj[key].indexOf(value);
      if (index !== -1) { obj[key].splice(index, 1); }
      if (!obj[key].length) { delete obj[key]; }
      else if (obj[key].length === 1 && !ensureArray) { obj[key] = obj[key][0]; }
    } else if (obj[key] === value)
      { delete obj[key]; } // otherwise just delete the key
  }

  /**
   * Adds the elements for a virtual tag
   * @this Tag
   * @param { Node } src - the node that will do the inserting or appending
   * @param { Tag } target - only if inserting, insert before this tag's first child
   */
  function makeVirtual(src, target) {
    var this$1 = this;

    var head = createDOMPlaceholder();
    var tail = createDOMPlaceholder();
    var frag = createFragment();
    var sib;
    var el;

    this.root.insertBefore(head, this.root.firstChild);
    this.root.appendChild(tail);

    this.__.head = el = head;
    this.__.tail = tail;

    while (el) {
      sib = el.nextSibling;
      frag.appendChild(el);
      this$1.__.virts.push(el); // hold for unmounting
      el = sib;
    }

    if (target)
      { src.insertBefore(frag, target.__.head); }
    else
      { src.appendChild(frag); }
  }

  /**
   * makes a tag virtual and replaces a reference in the dom
   * @this Tag
   * @param { tag } the tag to make virtual
   * @param { ref } the dom reference location
   */
  function makeReplaceVirtual(tag, ref) {
    if (!ref.parentNode) { return }
    var frag = createFragment();
    makeVirtual.call(tag, frag);
    ref.parentNode.replaceChild(frag, ref);
  }

  /**
   * Update dynamically created data-is tags with changing expressions
   * @param { Object } expr - expression tag and expression info
   * @param { Tag }    parent - parent for tag creation
   * @param { String } tagName - tag implementation we want to use
   */
  function updateDataIs(expr, parent, tagName) {
    var tag = expr.tag || expr.dom._tag;
    var ref;

    var ref$1 = tag ? tag.__ : {};
    var head = ref$1.head;
    var isVirtual = expr.dom.tagName === 'VIRTUAL';

    if (tag && expr.tagName === tagName) {
      tag.update();
      return
    }

    // sync _parent to accommodate changing tagnames
    if (tag) {
      // need placeholder before unmount
      if(isVirtual) {
        ref = createDOMPlaceholder();
        head.parentNode.insertBefore(ref, head);
      }

      tag.unmount(true);
    }

    // unable to get the tag name
    if (!isString(tagName)) { return }

    expr.impl = __TAG_IMPL[tagName];

    // unknown implementation
    if (!expr.impl) { return }

    expr.tag = tag = initChild(
      expr.impl, {
        root: expr.dom,
        parent: parent,
        tagName: tagName
      },
      expr.dom.innerHTML,
      parent
    );

    each(expr.attrs, function (a) { return setAttribute(tag.root, a.name, a.value); });
    expr.tagName = tagName;
    tag.mount();

    // root exist first time, after use placeholder
    if (isVirtual) { makeReplaceVirtual(tag, ref || tag.root); }

    // parent is the placeholder tag, not the dynamic tag so clean up
    parent.__.onUnmount = function () {
      var delName = tag.opts.dataIs;
      arrayishRemove(tag.parent.tags, delName, tag);
      arrayishRemove(tag.__.parent.tags, delName, tag);
      tag.unmount();
    };
  }

  /**
   * Nomalize any attribute removing the "riot-" prefix
   * @param   { String } attrName - original attribute name
   * @returns { String } valid html attribute name
   */
  function normalizeAttrName(attrName) {
    if (!attrName) { return null }
    attrName = attrName.replace(ATTRS_PREFIX, '');
    if (CASE_SENSITIVE_ATTRIBUTES[attrName]) { attrName = CASE_SENSITIVE_ATTRIBUTES[attrName]; }
    return attrName
  }

  /**
   * Update on single tag expression
   * @this Tag
   * @param { Object } expr - expression logic
   * @returns { undefined }
   */
  function updateExpression(expr) {
    if (this.root && getAttribute(this.root,'virtualized')) { return }

    var dom = expr.dom;
    // remove the riot- prefix
    var attrName = normalizeAttrName(expr.attr);
    var isToggle = contains([SHOW_DIRECTIVE, HIDE_DIRECTIVE], attrName);
    var isVirtual = expr.root && expr.root.tagName === 'VIRTUAL';
    var ref = this.__;
    var isAnonymous = ref.isAnonymous;
    var parent = dom && (expr.parent || dom.parentNode);
    var keepValueAttributes = settings.keepValueAttributes;
    // detect the style attributes
    var isStyleAttr = attrName === 'style';
    var isClassAttr = attrName === 'class';
    var isValueAttr = attrName === 'value';

    var value;

    // if it's a tag we could totally skip the rest
    if (expr._riot_id) {
      if (expr.__.wasCreated) {
        expr.update();
      // if it hasn't been mounted yet, do that now.
      } else {
        expr.mount();
        if (isVirtual) {
          makeReplaceVirtual(expr, expr.root);
        }
      }
      return
    }

    // if this expression has the update method it means it can handle the DOM changes by itself
    if (expr.update) { return expr.update() }

    var context = isToggle && !isAnonymous ? inheritParentProps.call(this) : this;

    // ...it seems to be a simple expression so we try to calculate its value
    value = tmpl(expr.expr, context);

    var hasValue = !isBlank(value);
    var isObj = isObject(value);

    // convert the style/class objects to strings
    if (isObj) {
      if (isClassAttr) {
        value = tmpl(JSON.stringify(value), this);
      } else if (isStyleAttr) {
        value = styleObjectToString(value);
      }
    }

    // remove original attribute
    if (expr.attr &&
        (
          // the original attribute can be removed only if we are parsing the original expression
          !expr.wasParsedOnce ||
          // or its value is false
          value === false ||
          // or if its value is currently falsy...
          // We will keep the "value" attributes if the "keepValueAttributes"
          // is enabled though
          (!hasValue && (!isValueAttr || isValueAttr && !keepValueAttributes))
        )
    ) {
      // remove either riot-* attributes or just the attribute name
      removeAttribute(dom, getAttribute(dom, expr.attr) ? expr.attr : attrName);
    }

    // for the boolean attributes we don't need the value
    // we can convert it to checked=true to checked=checked
    if (expr.bool) { value = value ? attrName : false; }
    if (expr.isRtag) { return updateDataIs(expr, this, value) }
    if (expr.wasParsedOnce && expr.value === value) { return }

    // update the expression value
    expr.value = value;
    expr.wasParsedOnce = true;

    // if the value is an object (and it's not a style or class attribute) we can not do much more with it
    if (isObj && !isClassAttr && !isStyleAttr && !isToggle) { return }
    // avoid to render undefined/null values
    if (!hasValue) { value = ''; }

    // textarea and text nodes have no attribute name
    if (!attrName) {
      // about #815 w/o replace: the browser converts the value to a string,
      // the comparison by "==" does too, but not in the server
      value += '';
      // test for parent avoids error with invalid assignment to nodeValue
      if (parent) {
        // cache the parent node because somehow it will become null on IE
        // on the next iteration
        expr.parent = parent;
        if (parent.tagName === 'TEXTAREA') {
          parent.value = value;                    // #1113
          if (!IE_VERSION) { dom.nodeValue = value; }  // #1625 IE throws here, nodeValue
        }                                         // will be available on 'updated'
        else { dom.nodeValue = value; }
      }
      return
    }

    switch (true) {
    // handle events binding
    case isFunction(value):
      if (isEventAttribute(attrName)) {
        setEventHandler(attrName, value, dom, this);
      }
      break
    // show / hide
    case isToggle:
      toggleVisibility(dom, attrName === HIDE_DIRECTIVE ? !value : value);
      break
    // handle attributes
    default:
      if (expr.bool) {
        dom[attrName] = value;
      }

      if (isValueAttr && dom.value !== value) {
        dom.value = value;
      } else if (hasValue && value !== false) {
        setAttribute(dom, attrName, value);
      }

      // make sure that in case of style changes
      // the element stays hidden
      if (isStyleAttr && dom.hidden) { toggleVisibility(dom, false); }
    }
  }

  /**
   * Update all the expressions in a Tag instance
   * @this Tag
   * @param { Array } expressions - expression that must be re evaluated
   */
  function update(expressions) {
    each(expressions, updateExpression.bind(this));
  }

  /**
   * We need to update opts for this tag. That requires updating the expressions
   * in any attributes on the tag, and then copying the result onto opts.
   * @this Tag
   * @param   {Boolean} isLoop - is it a loop tag?
   * @param   { Tag }  parent - parent tag node
   * @param   { Boolean }  isAnonymous - is it a tag without any impl? (a tag not registered)
   * @param   { Object }  opts - tag options
   * @param   { Array }  instAttrs - tag attributes array
   */
  function updateOpts(isLoop, parent, isAnonymous, opts, instAttrs) {
    // isAnonymous `each` tags treat `dom` and `root` differently. In this case
    // (and only this case) we don't need to do updateOpts, because the regular parse
    // will update those attrs. Plus, isAnonymous tags don't need opts anyway
    if (isLoop && isAnonymous) { return }
    var ctx = isLoop ? inheritParentProps.call(this) : parent || this;

    each(instAttrs, function (attr) {
      if (attr.expr) { updateExpression.call(ctx, attr.expr); }
      // normalize the attribute names
      opts[toCamel(attr.name).replace(ATTRS_PREFIX, '')] = attr.expr ? attr.expr.value : attr.value;
    });
  }

  /**
   * Update the tag expressions and options
   * @param { Tag } tag - tag object
   * @param { * } data - data we want to use to extend the tag properties
   * @param { Array } expressions - component expressions array
   * @returns { Tag } the current tag instance
   */
  function componentUpdate(tag, data, expressions) {
    var __ = tag.__;
    var nextOpts = {};
    var canTrigger = tag.isMounted && !__.skipAnonymous;

    // inherit properties from the parent tag
    if (__.isAnonymous && __.parent) { extend(tag, __.parent); }
    extend(tag, data);

    updateOpts.apply(tag, [__.isLoop, __.parent, __.isAnonymous, nextOpts, __.instAttrs]);

    if (
      canTrigger &&
      tag.isMounted &&
      isFunction(tag.shouldUpdate) && !tag.shouldUpdate(data, nextOpts)
    ) {
      return tag
    }

    extend(tag.opts, nextOpts);

    if (canTrigger) { tag.trigger('update', data); }
    update.call(tag, expressions);
    if (canTrigger) { tag.trigger('updated'); }

    return tag
  }

  /**
   * Get selectors for tags
   * @param   { Array } tags - tag names to select
   * @returns { String } selector
   */
  function query(tags) {
    // select all tags
    if (!tags) {
      var keys = Object.keys(__TAG_IMPL);
      return keys + query(keys)
    }

    return tags
      .filter(function (t) { return !/[^-\w]/.test(t); })
      .reduce(function (list, t) {
        var name = t.trim().toLowerCase();
        return list + ",[" + IS_DIRECTIVE + "=\"" + name + "\"]"
      }, '')
  }

  /**
   * Another way to create a riot tag a bit more es6 friendly
   * @param { HTMLElement } el - tag DOM selector or DOM node/s
   * @param { Object } opts - tag logic
   * @returns { Tag } new riot tag instance
   */
  function Tag(el, opts) {
    // get the tag properties from the class constructor
    var ref = this;
    var name = ref.name;
    var tmpl = ref.tmpl;
    var css = ref.css;
    var attrs = ref.attrs;
    var onCreate = ref.onCreate;
    // register a new tag and cache the class prototype
    if (!__TAG_IMPL[name]) {
      tag(name, tmpl, css, attrs, onCreate);
      // cache the class constructor
      __TAG_IMPL[name].class = this.constructor;
    }

    // mount the tag using the class instance
    mount$1(el, name, opts, this);
    // inject the component css
    if (css) { styleManager.inject(); }

    return this
  }

  /**
   * Create a new riot tag implementation
   * @param   { String }   name - name/id of the new riot tag
   * @param   { String }   tmpl - tag template
   * @param   { String }   css - custom tag css
   * @param   { String }   attrs - root tag attributes
   * @param   { Function } fn - user function
   * @returns { String } name/id of the tag just created
   */
  function tag(name, tmpl, css, attrs, fn) {
    if (isFunction(attrs)) {
      fn = attrs;

      if (/^[\w-]+\s?=/.test(css)) {
        attrs = css;
        css = '';
      } else
        { attrs = ''; }
    }

    if (css) {
      if (isFunction(css))
        { fn = css; }
      else
        { styleManager.add(css, name); }
    }

    name = name.toLowerCase();
    __TAG_IMPL[name] = { name: name, tmpl: tmpl, attrs: attrs, fn: fn };

    return name
  }

  /**
   * Create a new riot tag implementation (for use by the compiler)
   * @param   { String }   name - name/id of the new riot tag
   * @param   { String }   tmpl - tag template
   * @param   { String }   css - custom tag css
   * @param   { String }   attrs - root tag attributes
   * @param   { Function } fn - user function
   * @returns { String } name/id of the tag just created
   */
  function tag2(name, tmpl, css, attrs, fn) {
    if (css) { styleManager.add(css, name); }

    __TAG_IMPL[name] = { name: name, tmpl: tmpl, attrs: attrs, fn: fn };

    return name
  }

  /**
   * Mount a tag using a specific tag implementation
   * @param   { * } selector - tag DOM selector or DOM node/s
   * @param   { String } tagName - tag implementation name
   * @param   { Object } opts - tag logic
   * @returns { Array } new tags instances
   */
  function mount(selector, tagName, opts) {
    var tags = [];
    var elem, allTags;

    function pushTagsTo(root) {
      if (root.tagName) {
        var riotTag = getAttribute(root, IS_DIRECTIVE), tag;

        // have tagName? force riot-tag to be the same
        if (tagName && riotTag !== tagName) {
          riotTag = tagName;
          setAttribute(root, IS_DIRECTIVE, tagName);
        }

        tag = mount$1(
          root,
          riotTag || root.tagName.toLowerCase(),
          isFunction(opts) ? opts() : opts
        );

        if (tag)
          { tags.push(tag); }
      } else if (root.length)
        { each(root, pushTagsTo); } // assume nodeList
    }

    // inject styles into DOM
    styleManager.inject();

    if (isObject(tagName) || isFunction(tagName)) {
      opts = tagName;
      tagName = 0;
    }

    // crawl the DOM to find the tag
    if (isString(selector)) {
      selector = selector === '*' ?
        // select all registered tags
        // & tags found with the riot-tag attribute set
        allTags = query() :
        // or just the ones named like the selector
        selector + query(selector.split(/, */));

      // make sure to pass always a selector
      // to the querySelectorAll function
      elem = selector ? $$(selector) : [];
    }
    else
      // probably you have passed already a tag or a NodeList
      { elem = selector; }

    // select all the registered and mount them inside their root elements
    if (tagName === '*') {
      // get all custom tags
      tagName = allTags || query();
      // if the root els it's just a single tag
      if (elem.tagName)
        { elem = $$(tagName, elem); }
      else {
        // select all the children for all the different root elements
        var nodeList = [];

        each(elem, function (_el) { return nodeList.push($$(tagName, _el)); });

        elem = nodeList;
      }
      // get rid of the tagName
      tagName = 0;
    }

    pushTagsTo(elem);

    return tags
  }

  // Create a mixin that could be globally shared across all the tags
  var mixins = {};
  var globals = mixins[GLOBAL_MIXIN] = {};
  var mixins_id = 0;

  /**
   * Create/Return a mixin by its name
   * @param   { String }  name - mixin name (global mixin if object)
   * @param   { Object }  mix - mixin logic
   * @param   { Boolean } g - is global?
   * @returns { Object }  the mixin logic
   */
  function mixin(name, mix, g) {
    // Unnamed global
    if (isObject(name)) {
      mixin(("__" + (mixins_id++) + "__"), name, true);
      return
    }

    var store = g ? globals : mixins;

    // Getter
    if (!mix) {
      if (isUndefined(store[name]))
        { throw new Error(("Unregistered mixin: " + name)) }

      return store[name]
    }

    // Setter
    store[name] = isFunction(mix) ?
      extend(mix.prototype, store[name] || {}) && mix :
      extend(store[name] || {}, mix);
  }

  /**
   * Update all the tags instances created
   * @returns { Array } all the tags instances
   */
  function update$1() {
    return each(__TAGS_CACHE, function (tag) { return tag.update(); })
  }

  function unregister(name) {
    styleManager.remove(name);
    return delete __TAG_IMPL[name]
  }

  var version = 'v3.13.2';

  var core = /*#__PURE__*/Object.freeze({
    Tag: Tag,
    tag: tag,
    tag2: tag2,
    mount: mount,
    mixin: mixin,
    update: update$1,
    unregister: unregister,
    version: version
  });

  /**
   * Add a mixin to this tag
   * @returns { Tag } the current tag instance
   */
  function componentMixin(tag$$1) {
    var mixins = [], len = arguments.length - 1;
    while ( len-- > 0 ) mixins[ len ] = arguments[ len + 1 ];

    each(mixins, function (mix) {
      var instance;
      var obj;
      var props = [];

      // properties blacklisted and will not be bound to the tag instance
      var propsBlacklist = ['init', '__proto__'];

      mix = isString(mix) ? mixin(mix) : mix;

      // check if the mixin is a function
      if (isFunction(mix)) {
        // create the new mixin instance
        instance = new mix();
      } else { instance = mix; }

      var proto = Object.getPrototypeOf(instance);

      // build multilevel prototype inheritance chain property list
      do { props = props.concat(Object.getOwnPropertyNames(obj || instance)); }
      while (obj = Object.getPrototypeOf(obj || instance))

      // loop the keys in the function prototype or the all object keys
      each(props, function (key) {
        // bind methods to tag
        // allow mixins to override other properties/parent mixins
        if (!contains(propsBlacklist, key)) {
          // check for getters/setters
          var descriptor = getPropDescriptor(instance, key) || getPropDescriptor(proto, key);
          var hasGetterSetter = descriptor && (descriptor.get || descriptor.set);

          // apply method only if it does not already exist on the instance
          if (!tag$$1.hasOwnProperty(key) && hasGetterSetter) {
            Object.defineProperty(tag$$1, key, descriptor);
          } else {
            tag$$1[key] = isFunction(instance[key]) ?
              instance[key].bind(tag$$1) :
              instance[key];
          }
        }
      });

      // init method will be called automatically
      if (instance.init)
        { instance.init.bind(tag$$1)(tag$$1.opts); }
    });

    return tag$$1
  }

  /**
   * Move the position of a custom tag in its parent tag
   * @this Tag
   * @param   { String } tagName - key where the tag was stored
   * @param   { Number } newPos - index where the new tag will be stored
   */
  function moveChild(tagName, newPos) {
    var parent = this.parent;
    var tags;
    // no parent no move
    if (!parent) { return }

    tags = parent.tags[tagName];

    if (isArray(tags))
      { tags.splice(newPos, 0, tags.splice(tags.indexOf(this), 1)[0]); }
    else { arrayishAdd(parent.tags, tagName, this); }
  }

  /**
   * Move virtual tag and all child nodes
   * @this Tag
   * @param { Node } src  - the node that will do the inserting
   * @param { Tag } target - insert before this tag's first child
   */
  function moveVirtual(src, target) {
    var this$1 = this;

    var el = this.__.head;
    var sib;
    var frag = createFragment();

    while (el) {
      sib = el.nextSibling;
      frag.appendChild(el);
      el = sib;
      if (el === this$1.__.tail) {
        frag.appendChild(el);
        src.insertBefore(frag, target.__.head);
        break
      }
    }
  }

  /**
   * Convert the item looped into an object used to extend the child tag properties
   * @param   { Object } expr - object containing the keys used to extend the children tags
   * @param   { * } key - value to assign to the new object returned
   * @param   { * } val - value containing the position of the item in the array
   * @returns { Object } - new object containing the values of the original item
   *
   * The variables 'key' and 'val' are arbitrary.
   * They depend on the collection type looped (Array, Object)
   * and on the expression used on the each tag
   *
   */
  function mkitem(expr, key, val) {
    var item = {};
    item[expr.key] = key;
    if (expr.pos) { item[expr.pos] = val; }
    return item
  }

  /**
   * Unmount the redundant tags
   * @param   { Array } items - array containing the current items to loop
   * @param   { Array } tags - array containing all the children tags
   */
  function unmountRedundant(items, tags, filteredItemsCount) {
    var i = tags.length;
    var j = items.length - filteredItemsCount;

    while (i > j) {
      i--;
      remove.apply(tags[i], [tags, i]);
    }
  }


  /**
   * Remove a child tag
   * @this Tag
   * @param   { Array } tags - tags collection
   * @param   { Number } i - index of the tag to remove
   */
  function remove(tags, i) {
    tags.splice(i, 1);
    this.unmount();
    arrayishRemove(this.parent, this, this.__.tagName, true);
  }

  /**
   * Move the nested custom tags in non custom loop tags
   * @this Tag
   * @param   { Number } i - current position of the loop tag
   */
  function moveNestedTags(i) {
    var this$1 = this;

    each(Object.keys(this.tags), function (tagName) {
      moveChild.apply(this$1.tags[tagName], [tagName, i]);
    });
  }

  /**
   * Move a child tag
   * @this Tag
   * @param   { HTMLElement } root - dom node containing all the loop children
   * @param   { Tag } nextTag - instance of the next tag preceding the one we want to move
   * @param   { Boolean } isVirtual - is it a virtual tag?
   */
  function move(root, nextTag, isVirtual) {
    if (isVirtual)
      { moveVirtual.apply(this, [root, nextTag]); }
    else
      { safeInsert(root, this.root, nextTag.root); }
  }

  /**
   * Insert and mount a child tag
   * @this Tag
   * @param   { HTMLElement } root - dom node containing all the loop children
   * @param   { Tag } nextTag - instance of the next tag preceding the one we want to insert
   * @param   { Boolean } isVirtual - is it a virtual tag?
   */
  function insert(root, nextTag, isVirtual) {
    if (isVirtual)
      { makeVirtual.apply(this, [root, nextTag]); }
    else
      { safeInsert(root, this.root, nextTag.root); }
  }

  /**
   * Append a new tag into the DOM
   * @this Tag
   * @param   { HTMLElement } root - dom node containing all the loop children
   * @param   { Boolean } isVirtual - is it a virtual tag?
   */
  function append(root, isVirtual) {
    if (isVirtual)
      { makeVirtual.call(this, root); }
    else
      { root.appendChild(this.root); }
  }

  /**
   * Return the value we want to use to lookup the postion of our items in the collection
   * @param   { String }  keyAttr         - lookup string or expression
   * @param   { * }       originalItem    - original item from the collection
   * @param   { Object }  keyedItem       - object created by riot via { item, i in collection }
   * @param   { Boolean } hasKeyAttrExpr  - flag to check whether the key is an expression
   * @returns { * } value that we will use to figure out the item position via collection.indexOf
   */
  function getItemId(keyAttr, originalItem, keyedItem, hasKeyAttrExpr) {
    if (keyAttr) {
      return hasKeyAttrExpr ?  tmpl(keyAttr, keyedItem) :  originalItem[keyAttr]
    }

    return originalItem
  }

  /**
   * Manage tags having the 'each'
   * @param   { HTMLElement } dom - DOM node we need to loop
   * @param   { Tag } parent - parent tag instance where the dom node is contained
   * @param   { String } expr - string contained in the 'each' attribute
   * @returns { Object } expression object for this each loop
   */
  function _each(dom, parent, expr) {
    var mustReorder = typeof getAttribute(dom, LOOP_NO_REORDER_DIRECTIVE) !== T_STRING || removeAttribute(dom, LOOP_NO_REORDER_DIRECTIVE);
    var keyAttr = getAttribute(dom, KEY_DIRECTIVE);
    var hasKeyAttrExpr = keyAttr ? tmpl.hasExpr(keyAttr) : false;
    var tagName = getName(dom);
    var impl = __TAG_IMPL[tagName];
    var parentNode = dom.parentNode;
    var placeholder = createDOMPlaceholder();
    var child = get(dom);
    var ifExpr = getAttribute(dom, CONDITIONAL_DIRECTIVE);
    var tags = [];
    var isLoop = true;
    var innerHTML = dom.innerHTML;
    var isAnonymous = !__TAG_IMPL[tagName];
    var isVirtual = dom.tagName === 'VIRTUAL';
    var oldItems = [];

    // remove the each property from the original tag
    removeAttribute(dom, LOOP_DIRECTIVE);
    removeAttribute(dom, KEY_DIRECTIVE);

    // parse the each expression
    expr = tmpl.loopKeys(expr);
    expr.isLoop = true;

    if (ifExpr) { removeAttribute(dom, CONDITIONAL_DIRECTIVE); }

    // insert a marked where the loop tags will be injected
    parentNode.insertBefore(placeholder, dom);
    parentNode.removeChild(dom);

    expr.update = function updateEach() {
      // get the new items collection
      expr.value = tmpl(expr.val, parent);

      var items = expr.value;
      var frag = createFragment();
      var isObject = !isArray(items) && !isString(items);
      var root = placeholder.parentNode;
      var tmpItems = [];
      var hasKeys = isObject && !!items;

      // if this DOM was removed the update here is useless
      // this condition fixes also a weird async issue on IE in our unit test
      if (!root) { return }

      // object loop. any changes cause full redraw
      if (isObject) {
        items = items ? Object.keys(items).map(function (key) { return mkitem(expr, items[key], key); }) : [];
      }

      // store the amount of filtered items
      var filteredItemsCount = 0;

      // loop all the new items
      each(items, function (_item, index) {
        var i = index - filteredItemsCount;
        var item = !hasKeys && expr.key ? mkitem(expr, _item, index) : _item;

        // skip this item because it must be filtered
        if (ifExpr && !tmpl(ifExpr, extend(create(parent), item))) {
          filteredItemsCount ++;
          return
        }

        var itemId = getItemId(keyAttr, _item, item, hasKeyAttrExpr);
        // reorder only if the items are not objects
        // or a key attribute has been provided
        var doReorder = !isObject && mustReorder && typeof _item === T_OBJECT || keyAttr;
        var oldPos = oldItems.indexOf(itemId);
        var isNew = oldPos === -1;
        var pos = !isNew && doReorder ? oldPos : i;
        // does a tag exist in this position?
        var tag = tags[pos];
        var mustAppend = i >= oldItems.length;
        var mustCreate = doReorder && isNew || !doReorder && !tag || !tags[i];

        // new tag
        if (mustCreate) {
          tag = createTag(impl, {
            parent: parent,
            isLoop: isLoop,
            isAnonymous: isAnonymous,
            tagName: tagName,
            root: dom.cloneNode(isAnonymous),
            item: item,
            index: i,
          }, innerHTML);

          // mount the tag
          tag.mount();

          if (mustAppend)
            { append.apply(tag, [frag || root, isVirtual]); }
          else
            { insert.apply(tag, [root, tags[i], isVirtual]); }

          if (!mustAppend) { oldItems.splice(i, 0, item); }
          tags.splice(i, 0, tag);
          if (child) { arrayishAdd(parent.tags, tagName, tag, true); }
        } else if (pos !== i && doReorder) {
          // move
          if (keyAttr || contains(items, oldItems[pos])) {
            move.apply(tag, [root, tags[i], isVirtual]);
            // move the old tag instance
            tags.splice(i, 0, tags.splice(pos, 1)[0]);
            // move the old item
            oldItems.splice(i, 0, oldItems.splice(pos, 1)[0]);
          }

          // update the position attribute if it exists
          if (expr.pos) { tag[expr.pos] = i; }

          // if the loop tags are not custom
          // we need to move all their custom tags into the right position
          if (!child && tag.tags) { moveNestedTags.call(tag, i); }
        }

        // cache the original item to use it in the events bound to this node
        // and its children
        extend(tag.__, {
          item: item,
          index: i,
          parent: parent
        });

        tmpItems[i] = itemId;

        if (!mustCreate) { tag.update(item); }
      });

      // remove the redundant tags
      unmountRedundant(items, tags, filteredItemsCount);

      // clone the items array
      oldItems = tmpItems.slice();

      root.insertBefore(frag, placeholder);
    };

    expr.unmount = function () {
      each(tags, function (t) { t.unmount(); });
    };

    return expr
  }

  var RefExpr = {
    init: function init(dom, parent, attrName, attrValue) {
      this.dom = dom;
      this.attr = attrName;
      this.rawValue = attrValue;
      this.parent = parent;
      this.hasExp = tmpl.hasExpr(attrValue);
      return this
    },
    update: function update() {
      var old = this.value;
      var customParent = this.parent && getImmediateCustomParent(this.parent);
      // if the referenced element is a custom tag, then we set the tag itself, rather than DOM
      var tagOrDom = this.dom.__ref || this.tag || this.dom;

      this.value = this.hasExp ? tmpl(this.rawValue, this.parent) : this.rawValue;

      // the name changed, so we need to remove it from the old key (if present)
      if (!isBlank(old) && customParent) { arrayishRemove(customParent.refs, old, tagOrDom); }
      if (!isBlank(this.value) && isString(this.value)) {
        // add it to the refs of parent tag (this behavior was changed >=3.0)
        if (customParent) { arrayishAdd(
          customParent.refs,
          this.value,
          tagOrDom,
          // use an array if it's a looped node and the ref is not an expression
          null,
          this.parent.__.index
        ); }

        if (this.value !== old) {
          setAttribute(this.dom, this.attr, this.value);
        }
      } else {
        removeAttribute(this.dom, this.attr);
      }

      // cache the ref bound to this dom node
      // to reuse it in future (see also #2329)
      if (!this.dom.__ref) { this.dom.__ref = tagOrDom; }
    },
    unmount: function unmount() {
      var tagOrDom = this.tag || this.dom;
      var customParent = this.parent && getImmediateCustomParent(this.parent);
      if (!isBlank(this.value) && customParent)
        { arrayishRemove(customParent.refs, this.value, tagOrDom); }
    }
  };

  /**
   * Create a new ref directive
   * @param   { HTMLElement } dom - dom node having the ref attribute
   * @param   { Tag } context - tag instance where the DOM node is located
   * @param   { String } attrName - either 'ref' or 'data-ref'
   * @param   { String } attrValue - value of the ref attribute
   * @returns { RefExpr } a new RefExpr object
   */
  function createRefDirective(dom, tag, attrName, attrValue) {
    return create(RefExpr).init(dom, tag, attrName, attrValue)
  }

  /**
   * Trigger the unmount method on all the expressions
   * @param   { Array } expressions - DOM expressions
   */
  function unmountAll(expressions) {
    each(expressions, function (expr) {
      if (expr.unmount) { expr.unmount(true); }
      else if (expr.tagName) { expr.tag.unmount(true); }
      else if (expr.unmount) { expr.unmount(); }
    });
  }

  var IfExpr = {
    init: function init(dom, tag, expr) {
      removeAttribute(dom, CONDITIONAL_DIRECTIVE);
      extend(this, { tag: tag, expr: expr, stub: createDOMPlaceholder(), pristine: dom });
      var p = dom.parentNode;
      p.insertBefore(this.stub, dom);
      p.removeChild(dom);

      return this
    },
    update: function update$$1() {
      this.value = tmpl(this.expr, this.tag);

      if (!this.stub.parentNode) { return }

      if (this.value && !this.current) { // insert
        this.current = this.pristine.cloneNode(true);
        this.stub.parentNode.insertBefore(this.current, this.stub);
        this.expressions = parseExpressions.apply(this.tag, [this.current, true]);
      } else if (!this.value && this.current) { // remove
        this.unmount();
        this.current = null;
        this.expressions = [];
      }

      if (this.value) { update.call(this.tag, this.expressions); }
    },
    unmount: function unmount() {
      if (this.current) {
        if (this.current._tag) {
          this.current._tag.unmount();
        } else if (this.current.parentNode) {
          this.current.parentNode.removeChild(this.current);
        }
      }

      unmountAll(this.expressions || []);
    }
  };

  /**
   * Create a new if directive
   * @param   { HTMLElement } dom - if root dom node
   * @param   { Tag } context - tag instance where the DOM node is located
   * @param   { String } attr - if expression
   * @returns { IFExpr } a new IfExpr object
   */
  function createIfDirective(dom, tag, attr) {
    return create(IfExpr).init(dom, tag, attr)
  }

  /**
   * Walk the tag DOM to detect the expressions to evaluate
   * @this Tag
   * @param   { HTMLElement } root - root tag where we will start digging the expressions
   * @param   { Boolean } mustIncludeRoot - flag to decide whether the root must be parsed as well
   * @returns { Array } all the expressions found
   */
  function parseExpressions(root, mustIncludeRoot) {
    var this$1 = this;

    var expressions = [];

    walkNodes(root, function (dom) {
      var type = dom.nodeType;
      var attr;
      var tagImpl;

      if (!mustIncludeRoot && dom === root) { return }

      // text node
      if (type === 3 && dom.parentNode.tagName !== 'STYLE' && tmpl.hasExpr(dom.nodeValue))
        { expressions.push({dom: dom, expr: dom.nodeValue}); }

      if (type !== 1) { return }

      var isVirtual = dom.tagName === 'VIRTUAL';

      // loop. each does it's own thing (for now)
      if (attr = getAttribute(dom, LOOP_DIRECTIVE)) {
        if(isVirtual) { setAttribute(dom, 'loopVirtual', true); } // ignore here, handled in _each
        expressions.push(_each(dom, this$1, attr));
        return false
      }

      // if-attrs become the new parent. Any following expressions (either on the current
      // element, or below it) become children of this expression.
      if (attr = getAttribute(dom, CONDITIONAL_DIRECTIVE)) {
        expressions.push(createIfDirective(dom, this$1, attr));
        return false
      }

      if (attr = getAttribute(dom, IS_DIRECTIVE)) {
        if (tmpl.hasExpr(attr)) {
          expressions.push({
            isRtag: true,
            expr: attr,
            dom: dom,
            attrs: [].slice.call(dom.attributes)
          });

          return false
        }
      }

      // if this is a tag, stop traversing here.
      // we ignore the root, since parseExpressions is called while we're mounting that root
      tagImpl = get(dom);

      if(isVirtual) {
        if(getAttribute(dom, 'virtualized')) {dom.parentElement.removeChild(dom); } // tag created, remove from dom
        if(!tagImpl && !getAttribute(dom, 'virtualized') && !getAttribute(dom, 'loopVirtual'))  // ok to create virtual tag
          { tagImpl = { tmpl: dom.outerHTML }; }
      }

      if (tagImpl && (dom !== root || mustIncludeRoot)) {
        var hasIsDirective = getAttribute(dom, IS_DIRECTIVE);
        if(isVirtual && !hasIsDirective) { // handled in update
          // can not remove attribute like directives
          // so flag for removal after creation to prevent maximum stack error
          setAttribute(dom, 'virtualized', true);
          var tag = createTag(
            {tmpl: dom.outerHTML},
            {root: dom, parent: this$1},
            dom.innerHTML
          );

          expressions.push(tag); // no return, anonymous tag, keep parsing
        } else {
          if (hasIsDirective && isVirtual)
            { warn(("Virtual tags shouldn't be used together with the \"" + IS_DIRECTIVE + "\" attribute - https://github.com/riot/riot/issues/2511")); }

          expressions.push(
            initChild(
              tagImpl,
              {
                root: dom,
                parent: this$1
              },
              dom.innerHTML,
              this$1
            )
          );
          return false
        }
      }

      // attribute expressions
      parseAttributes.apply(this$1, [dom, dom.attributes, function (attr, expr) {
        if (!expr) { return }
        expressions.push(expr);
      }]);
    });

    return expressions
  }

  /**
   * Calls `fn` for every attribute on an element. If that attr has an expression,
   * it is also passed to fn.
   * @this Tag
   * @param   { HTMLElement } dom - dom node to parse
   * @param   { Array } attrs - array of attributes
   * @param   { Function } fn - callback to exec on any iteration
   */
  function parseAttributes(dom, attrs, fn) {
    var this$1 = this;

    each(attrs, function (attr) {
      if (!attr) { return false }

      var name = attr.name;
      var bool = isBoolAttr(name);
      var expr;

      if (contains(REF_DIRECTIVES, name) && dom.tagName.toLowerCase() !== YIELD_TAG) {
        expr =  createRefDirective(dom, this$1, name, attr.value);
      } else if (tmpl.hasExpr(attr.value)) {
        expr = {dom: dom, expr: attr.value, attr: name, bool: bool};
      }

      fn(attr, expr);
    });
  }

  /**
   * Manage the mount state of a tag triggering also the observable events
   * @this Tag
   * @param { Boolean } value - ..of the isMounted flag
   */
  function setMountState(value) {
    var ref = this.__;
    var isAnonymous = ref.isAnonymous;
    var skipAnonymous = ref.skipAnonymous;

    define(this, 'isMounted', value);

    if (!isAnonymous || !skipAnonymous) {
      if (value) { this.trigger('mount'); }
      else {
        this.trigger('unmount');
        this.off('*');
        this.__.wasCreated = false;
      }
    }
  }

  /**
   * Mount the current tag instance
   * @returns { Tag } the current tag instance
   */
  function componentMount(tag$$1, dom, expressions, opts) {
    var __ = tag$$1.__;
    var root = __.root;
    root._tag = tag$$1; // keep a reference to the tag just created

    // Read all the attrs on this instance. This give us the info we need for updateOpts
    parseAttributes.apply(__.parent, [root, root.attributes, function (attr, expr) {
      if (!__.isAnonymous && RefExpr.isPrototypeOf(expr)) { expr.tag = tag$$1; }
      attr.expr = expr;
      __.instAttrs.push(attr);
    }]);

    // update the root adding custom attributes coming from the compiler
    walkAttributes(__.impl.attrs, function (k, v) { __.implAttrs.push({name: k, value: v}); });
    parseAttributes.apply(tag$$1, [root, __.implAttrs, function (attr, expr) {
      if (expr) { expressions.push(expr); }
      else { setAttribute(root, attr.name, attr.value); }
    }]);

    // initialiation
    updateOpts.apply(tag$$1, [__.isLoop, __.parent, __.isAnonymous, opts, __.instAttrs]);

    // add global mixins
    var globalMixin = mixin(GLOBAL_MIXIN);

    if (globalMixin && !__.skipAnonymous) {
      for (var i in globalMixin) {
        if (globalMixin.hasOwnProperty(i)) {
          tag$$1.mixin(globalMixin[i]);
        }
      }
    }

    if (__.impl.fn) { __.impl.fn.call(tag$$1, opts); }

    if (!__.skipAnonymous) { tag$$1.trigger('before-mount'); }

    // parse layout after init. fn may calculate args for nested custom tags
    each(parseExpressions.apply(tag$$1, [dom, __.isAnonymous]), function (e) { return expressions.push(e); });

    tag$$1.update(__.item);

    if (!__.isAnonymous && !__.isInline) {
      while (dom.firstChild) { root.appendChild(dom.firstChild); }
    }

    define(tag$$1, 'root', root);

    // if we need to wait that the parent "mount" or "updated" event gets triggered
    if (!__.skipAnonymous && tag$$1.parent) {
      var p = getImmediateCustomParent(tag$$1.parent);
      p.one(!p.isMounted ? 'mount' : 'updated', function () {
        setMountState.call(tag$$1, true);
      });
    } else {
      // otherwise it's not a child tag we can trigger its mount event
      setMountState.call(tag$$1, true);
    }

    tag$$1.__.wasCreated = true;

    return tag$$1
  }

  /**
   * Unmount the tag instance
   * @param { Boolean } mustKeepRoot - if it's true the root node will not be removed
   * @returns { Tag } the current tag instance
   */
  function tagUnmount(tag, mustKeepRoot, expressions) {
    var __ = tag.__;
    var root = __.root;
    var tagIndex = __TAGS_CACHE.indexOf(tag);
    var p = root.parentNode;

    if (!__.skipAnonymous) { tag.trigger('before-unmount'); }

    // clear all attributes coming from the mounted tag
    walkAttributes(__.impl.attrs, function (name) {
      if (startsWith(name, ATTRS_PREFIX))
        { name = name.slice(ATTRS_PREFIX.length); }

      removeAttribute(root, name);
    });

    // remove all the event listeners
    tag.__.listeners.forEach(function (dom) {
      Object.keys(dom[RIOT_EVENTS_KEY]).forEach(function (eventName) {
        dom.removeEventListener(eventName, dom[RIOT_EVENTS_KEY][eventName]);
      });
    });

    // remove tag instance from the global tags cache collection
    if (tagIndex !== -1) { __TAGS_CACHE.splice(tagIndex, 1); }

    // clean up the parent tags object
    if (__.parent && !__.isAnonymous) {
      var ptag = getImmediateCustomParent(__.parent);

      if (__.isVirtual) {
        Object
          .keys(tag.tags)
          .forEach(function (tagName) { return arrayishRemove(ptag.tags, tagName, tag.tags[tagName]); });
      } else {
        arrayishRemove(ptag.tags, __.tagName, tag);
      }
    }

    // unmount all the virtual directives
    if (tag.__.virts) {
      each(tag.__.virts, function (v) {
        if (v.parentNode) { v.parentNode.removeChild(v); }
      });
    }

    // allow expressions to unmount themselves
    unmountAll(expressions);
    each(__.instAttrs, function (a) { return a.expr && a.expr.unmount && a.expr.unmount(); });

    // clear the tag html if it's necessary
    if (mustKeepRoot) { setInnerHTML(root, ''); }
    // otherwise detach the root tag from the DOM
    else if (p) { p.removeChild(root); }

    // custom internal unmount function to avoid relying on the observable
    if (__.onUnmount) { __.onUnmount(); }

    // weird fix for a weird edge case #2409 and #2436
    // some users might use your software not as you've expected
    // so I need to add these dirty hacks to mitigate unexpected issues
    if (!tag.isMounted) { setMountState.call(tag, true); }

    setMountState.call(tag, false);

    delete root._tag;

    return tag
  }

  /**
   * Tag creation factory function
   * @constructor
   * @param { Object } impl - it contains the tag template, and logic
   * @param { Object } conf - tag options
   * @param { String } innerHTML - html that eventually we need to inject in the tag
   */
  function createTag(impl, conf, innerHTML) {
    if ( impl === void 0 ) impl = {};
    if ( conf === void 0 ) conf = {};

    var tag = conf.context || {};
    var opts = conf.opts || {};
    var parent = conf.parent;
    var isLoop = conf.isLoop;
    var isAnonymous = !!conf.isAnonymous;
    var skipAnonymous = settings.skipAnonymousTags && isAnonymous;
    var item = conf.item;
    // available only for the looped nodes
    var index = conf.index;
    // All attributes on the Tag when it's first parsed
    var instAttrs = [];
    // expressions on this type of Tag
    var implAttrs = [];
    var tmpl = impl.tmpl;
    var expressions = [];
    var root = conf.root;
    var tagName = conf.tagName || getName(root);
    var isVirtual = tagName === 'virtual';
    var isInline = !isVirtual && !tmpl;
    var dom;

    if (isInline || isLoop && isAnonymous) {
      dom = root;
    } else {
      if (!isVirtual) { root.innerHTML = ''; }
      dom = mkdom(tmpl, innerHTML, isSvg(root));
    }

    // make this tag observable
    if (!skipAnonymous) { observable(tag); }

    // only call unmount if we have a valid __TAG_IMPL (has name property)
    if (impl.name && root._tag) { root._tag.unmount(true); }

    define(tag, '__', {
      impl: impl,
      root: root,
      skipAnonymous: skipAnonymous,
      implAttrs: implAttrs,
      isAnonymous: isAnonymous,
      instAttrs: instAttrs,
      innerHTML: innerHTML,
      tagName: tagName,
      index: index,
      isLoop: isLoop,
      isInline: isInline,
      item: item,
      parent: parent,
      // tags having event listeners
      // it would be better to use weak maps here but we can not introduce breaking changes now
      listeners: [],
      // these vars will be needed only for the virtual tags
      virts: [],
      wasCreated: false,
      tail: null,
      head: null
    });

    // tag protected properties
    return [
      ['isMounted', false],
      // create a unique id to this tag
      // it could be handy to use it also to improve the virtual dom rendering speed
      ['_riot_id', uid()],
      ['root', root],
      ['opts', opts, { writable: true, enumerable: true }],
      ['parent', parent || null],
      // protect the "tags" and "refs" property from being overridden
      ['tags', {}],
      ['refs', {}],
      ['update', function (data) { return componentUpdate(tag, data, expressions); }],
      ['mixin', function () {
        var mixins = [], len = arguments.length;
        while ( len-- ) mixins[ len ] = arguments[ len ];

        return componentMixin.apply(void 0, [ tag ].concat( mixins ));
    }],
      ['mount', function () { return componentMount(tag, dom, expressions, opts); }],
      ['unmount', function (mustKeepRoot) { return tagUnmount(tag, mustKeepRoot, expressions); }]
    ].reduce(function (acc, ref) {
      var key = ref[0];
      var value = ref[1];
      var opts = ref[2];

      define(tag, key, value, opts);
      return acc
    }, extend(tag, item))
  }

  /**
   * Mount a tag creating new Tag instance
   * @param   { Object } root - dom node where the tag will be mounted
   * @param   { String } tagName - name of the riot tag we want to mount
   * @param   { Object } opts - options to pass to the Tag instance
   * @param   { Object } ctx - optional context that will be used to extend an existing class ( used in riot.Tag )
   * @returns { Tag } a new Tag instance
   */
  function mount$1(root, tagName, opts, ctx) {
    var impl = __TAG_IMPL[tagName];
    var implClass = __TAG_IMPL[tagName].class;
    var context = ctx || (implClass ? create(implClass.prototype) : {});
    // cache the inner HTML to fix #855
    var innerHTML = root._innerHTML = root._innerHTML || root.innerHTML;
    var conf = extend({ root: root, opts: opts, context: context }, { parent: opts ? opts.parent : null });
    var tag;

    if (impl && root) { tag = createTag(impl, conf, innerHTML); }

    if (tag && tag.mount) {
      tag.mount(true);
      // add this tag to the virtualDom variable
      if (!contains(__TAGS_CACHE, tag)) { __TAGS_CACHE.push(tag); }
    }

    return tag
  }



  var tags = /*#__PURE__*/Object.freeze({
    arrayishAdd: arrayishAdd,
    getTagName: getName,
    inheritParentProps: inheritParentProps,
    mountTo: mount$1,
    selectTags: query,
    arrayishRemove: arrayishRemove,
    getTag: get,
    initChildTag: initChild,
    moveChildTag: moveChild,
    makeReplaceVirtual: makeReplaceVirtual,
    getImmediateCustomParentTag: getImmediateCustomParent,
    makeVirtual: makeVirtual,
    moveVirtual: moveVirtual,
    unmountAll: unmountAll,
    createIfDirective: createIfDirective,
    createRefDirective: createRefDirective
  });

  /**
   * Riot public api
   */
  var settings$1 = settings;
  var util = {
    tmpl: tmpl,
    brackets: brackets,
    styleManager: styleManager,
    vdom: __TAGS_CACHE,
    styleNode: styleManager.styleNode,
    // export the riot internal utils as well
    dom: dom,
    check: check,
    misc: misc,
    tags: tags
  };

  // export the core props/methods
  var Tag$1 = Tag;
  var tag$1 = tag;
  var tag2$1 = tag2;
  var mount$2 = mount;
  var mixin$1 = mixin;
  var update$2 = update$1;
  var unregister$1 = unregister;
  var version$1 = version;
  var observable$1 = observable;

  var riot$1 = extend({}, core, {
    observable: observable,
    settings: settings$1,
    util: util,
  });

  var riot$2 = /*#__PURE__*/Object.freeze({
    settings: settings$1,
    util: util,
    Tag: Tag$1,
    tag: tag$1,
    tag2: tag2$1,
    mount: mount$2,
    mixin: mixin$1,
    update: update$2,
    unregister: unregister$1,
    version: version$1,
    observable: observable$1,
    default: riot$1
  });

  /**
   * Compiler for riot custom tags
   * @version v3.5.2
   */

  // istanbul ignore next
  function safeRegex (re) {
    var arguments$1 = arguments;

    var src = re.source;
    var opt = re.global ? 'g' : '';

    if (re.ignoreCase) { opt += 'i'; }
    if (re.multiline)  { opt += 'm'; }

    for (var i = 1; i < arguments.length; i++) {
      src = src.replace('@', '\\' + arguments$1[i]);
    }

    return new RegExp(src, opt)
  }

  /**
   * @module parsers
   */
  var parsers = (function (win) {

    var _p = {};

    function _r (name) {
      var parser = win[name];

      if (parser) { return parser }

      throw new Error('Parser "' + name + '" not loaded.')
    }

    function _req (name) {
      var parts = name.split('.');

      if (parts.length !== 2) { throw new Error('Bad format for parsers._req') }

      var parser = _p[parts[0]][parts[1]];
      if (parser) { return parser }

      throw new Error('Parser "' + name + '" not found.')
    }

    function extend (obj, props) {
      if (props) {
        for (var prop in props) {
          /* istanbul ignore next */
          if (props.hasOwnProperty(prop)) {
            obj[prop] = props[prop];
          }
        }
      }
      return obj
    }

    function renderPug (compilerName, html, opts, url) {
      opts = extend({
        pretty: true,
        filename: url,
        doctype: 'html'
      }, opts);
      return _r(compilerName).render(html, opts)
    }

    _p.html = {
      jade: function (html, opts, url) {
        /* eslint-disable */
        console.log('DEPRECATION WARNING: jade was renamed "pug" - The jade parser will be removed in riot@3.0.0!');
        /* eslint-enable */
        return renderPug('jade', html, opts, url)
      },
      pug: function (html, opts, url) {
        return renderPug('pug', html, opts, url)
      }
    };
    _p.css = {
      less: function (tag, css, opts, url) {
        var ret;

        opts = extend({
          sync: true,
          syncImport: true,
          filename: url
        }, opts);
        _r('less').render(css, opts, function (err, result) {
          // istanbul ignore next
          if (err) { throw err }
          ret = result.css;
        });
        return ret
      }
    };
    _p.js = {

      es6: function (js, opts, url) {   // eslint-disable-line no-unused-vars
        return _r('Babel').transform( // eslint-disable-line
          js,
          extend({
            plugins: [
              ['transform-es2015-template-literals', { loose: true }],
              'transform-es2015-literals',
              'transform-es2015-function-name',
              'transform-es2015-arrow-functions',
              'transform-es2015-block-scoped-functions',
              ['transform-es2015-classes', { loose: true }],
              'transform-es2015-object-super',
              'transform-es2015-shorthand-properties',
              'transform-es2015-duplicate-keys',
              ['transform-es2015-computed-properties', { loose: true }],
              ['transform-es2015-for-of', { loose: true }],
              'transform-es2015-sticky-regex',
              'transform-es2015-unicode-regex',
              'check-es2015-constants',
              ['transform-es2015-spread', { loose: true }],
              'transform-es2015-parameters',
              ['transform-es2015-destructuring', { loose: true }],
              'transform-es2015-block-scoping',
              'transform-es2015-typeof-symbol',
              ['transform-es2015-modules-commonjs', { allowTopLevelThis: true }],
              ['transform-regenerator', { async: false, asyncGenerators: false }]
            ]
          },
          opts
          )).code
      },
      buble: function (js, opts, url) {
        opts = extend({
          source: url,
          modules: false
        }, opts);
        return _r('buble').transform(js, opts).code
      },
      coffee: function (js, opts) {
        return _r('CoffeeScript').compile(js, extend({ bare: true }, opts))
      },
      livescript: function (js, opts) {
        return _r('livescript').compile(js, extend({ bare: true, header: false }, opts))
      },
      typescript: function (js, opts) {
        return _r('typescript')(js, opts)
      },
      none: function (js) {
        return js
      }
    };
    _p.js.javascript   = _p.js.none;
    _p.js.coffeescript = _p.js.coffee;
    _p._req  = _req;
    _p.utils = {
      extend: extend
    };

    return _p

  })(window || global);

  var S_SQ_STR = /'[^'\n\r\\]*(?:\\(?:\r\n?|[\S\s])[^'\n\r\\]*)*'/.source;

  var S_R_SRC1 = [
    /\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//.source,
    '//.*',
    S_SQ_STR,
    S_SQ_STR.replace(/'/g, '"'),
    '([/`])'
  ].join('|');

  var S_R_SRC2 = (S_R_SRC1.slice(0, -2)) + "{}])";

  function skipES6str (code, start, stack) {

    var re = /[`$\\]/g;

    re.lastIndex = start;
    while (re.exec(code)) {
      var end = re.lastIndex;
      var c = code[end - 1];

      if (c === '`') {
        return end
      }
      if (c === '$' && code[end] === '{') {
        stack.push('`', '}');
        return end + 1
      }
      re.lastIndex++;
    }

    throw new Error('Unclosed ES6 template')
  }

  function jsSplitter (code, start) {

    var re1 = new RegExp(S_R_SRC1, 'g');
    var re2;

    /* istanbul ignore next */
  var skipRegex = brackets.skipRegex;
    var offset = start | 0;
    var result = [[]];
    var stack = [];
    var re = re1;

    var lastPos = re.lastIndex = offset;
    var str, ch, idx, end, match;

    while ((match = re.exec(code))) {
      idx = match.index;
      end = re.lastIndex;
      str = '';
      ch = match[1];

      if (ch) {

        if (ch === '{') {
          stack.push('}');

        } else if (ch === '}') {
          if (stack.pop() !== ch) {
            throw new Error("Unexpected '}'")

          } else if (stack[stack.length - 1] === '`') {
            ch = stack.pop();
          }

        } else if (ch === '/') {
          end = skipRegex(code, idx);

          if (end > idx + 1) {
            str = code.slice(idx, end);
          }
        }

        if (ch === '`') {
          end = skipES6str(code, end, stack);
          str = code.slice(idx, end);

          if (stack.length) {
            re = re2 || (re2 = new RegExp(S_R_SRC2, 'g'));
          } else {
            re = re1;
          }
        }

      } else {

        str = match[0];

        if (str[0] === '/') {
          str = str[1] === '*' ? ' ' : '';
          code = code.slice(offset, idx) + str + code.slice(end);
          end = idx + str.length;
          str = '';

        } else if (str.length === 2) {
          str = '';
        }
      }

      if (str) {
        result[0].push(code.slice(lastPos, idx));
        result.push(str);
        lastPos = end;
      }

      re.lastIndex = end;
    }

    result[0].push(code.slice(lastPos));

    return result
  }

  /**
   * @module compiler
   */

  var extend$1 = parsers.utils.extend;
  /* eslint-enable */

  var S_LINESTR = /"[^"\n\\]*(?:\\[\S\s][^"\n\\]*)*"|'[^'\n\\]*(?:\\[\S\s][^'\n\\]*)*'/.source;

  var S_STRINGS = brackets.R_STRINGS.source;

  var HTML_ATTRS = / *([-\w:\xA0-\xFF]+) ?(?:= ?('[^']*'|"[^"]*"|\S+))?/g;

  var HTML_COMMS = RegExp(/<!--(?!>)[\S\s]*?-->/.source + '|' + S_LINESTR, 'g');

  var HTML_TAGS = /<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^"'/>]*(?:(?:"[^"]*"|'[^']*'|\/[^>])[^'"/>]*)*)|\s*)(\/?)>/g;

  var HTML_PACK = />[ \t]+<(-?[A-Za-z]|\/[-A-Za-z])/g;

  var RIOT_ATTRS = ['style', 'src', 'd', 'value'];

  var VOID_TAGS = /^(?:input|img|br|wbr|hr|area|base|col|embed|keygen|link|meta|param|source|track)$/;

  var PRE_TAGS = /<pre(?:\s+(?:[^">]*|"[^"]*")*)?>([\S\s]+?)<\/pre\s*>/gi;

  var SPEC_TYPES = /^"(?:number|date(?:time)?|time|month|email|color)\b/i;

  var IMPORT_STATEMENT = /^\s*import(?!\w|(\s)?\()(?:(?:\s|[^\s'"])*)['|"].*\n?/gm;

  var TRIM_TRAIL = /[ \t]+$/gm;

  var
    RE_HASEXPR = safeRegex(/@#\d/, 'x01'),
    RE_REPEXPR = safeRegex(/@#(\d+)/g, 'x01'),
    CH_IDEXPR  = '\x01#',
    CH_DQCODE  = '\u2057',
    DQ = '"',
    SQ = "'";

  function cleanSource (src) {
    var
      mm,
      re = HTML_COMMS;

    if (src.indexOf('\r') !== 1) {
      src = src.replace(/\r\n?/g, '\n');
    }

    re.lastIndex = 0;
    while ((mm = re.exec(src))) {
      if (mm[0][0] === '<') {
        src = RegExp.leftContext + RegExp.rightContext;
        re.lastIndex = mm[3] + 1;
      }
    }
    return src
  }

  function parseAttribs (str, pcex) {
    var
      list = [],
      match,
      type, vexp;

    HTML_ATTRS.lastIndex = 0;

    str = str.replace(/\s+/g, ' ');

    while ((match = HTML_ATTRS.exec(str))) {
      var
        k = match[1].toLowerCase(),
        v = match[2];

      if (!v) {
        list.push(k);
      } else {

        if (v[0] !== DQ) {
          v = DQ + (v[0] === SQ ? v.slice(1, -1) : v) + DQ;
        }

        if (k === 'type' && SPEC_TYPES.test(v)) {
          type = v;
        } else {
          if (RE_HASEXPR.test(v)) {

            if (k === 'value') { vexp = 1; }
            if (RIOT_ATTRS.indexOf(k) !== -1) { k = 'riot-' + k; }
          }

          list.push(k + '=' + v);
        }
      }
    }

    if (type) {
      if (vexp) { type = DQ + pcex._bp[0] + SQ + type.slice(1, -1) + SQ + pcex._bp[1] + DQ; }
      list.push('type=' + type);
    }
    return list.join(' ')
  }

  function splitHtml (html, opts, pcex) {
    var _bp = pcex._bp;

    if (html && _bp[4].test(html)) {
      var
        jsfn = opts.expr && (opts.parser || opts.type) ? _compileJS : 0,
        list = brackets.split(html, 0, _bp),
        expr;

      for (var i = 1; i < list.length; i += 2) {
        expr = list[i];
        if (expr[0] === '^') {
          expr = expr.slice(1);
        } else if (jsfn) {
          expr = jsfn(expr, opts).trim();
          if (expr.slice(-1) === ';') { expr = expr.slice(0, -1); }
        }
        list[i] = CH_IDEXPR + (pcex.push(expr) - 1) + _bp[1];
      }
      html = list.join('');
    }
    return html
  }

  function restoreExpr (html, pcex) {
    if (pcex.length) {
      html = html.replace(RE_REPEXPR, function (_, d) {

        return pcex._bp[0] + pcex[d].trim().replace(/[\r\n]+/g, ' ').replace(/"/g, CH_DQCODE)
      });
    }
    return html
  }

  function _compileHTML (html, opts, pcex) {
    if (!/\S/.test(html)) { return '' }

    html = splitHtml(html, opts, pcex)
      .replace(HTML_TAGS, function (_, name, attr, ends) {

        name = name.toLowerCase();

        ends = ends && !VOID_TAGS.test(name) ? '></' + name : '';

        if (attr) { name += ' ' + parseAttribs(attr, pcex); }

        return '<' + name + ends + '>'
      });

    if (!opts.whitespace) {
      var p = [];

      if (/<pre[\s>]/.test(html)) {
        html = html.replace(PRE_TAGS, function (q) {
          p.push(q);
          return '\u0002'
        });
      }

      html = html.trim().replace(/\s+/g, ' ');

      if (p.length) { html = html.replace(/\u0002/g, function () { return p.shift() }); } // eslint-disable-line
    }

    if (opts.compact) { html = html.replace(HTML_PACK, '><$1'); }

    return restoreExpr(html, pcex).replace(TRIM_TRAIL, '')
  }

  function compileHTML (html, opts, pcex) {

    if (Array.isArray(opts)) {
      pcex = opts;
      opts = {};
    } else {
      if (!pcex) { pcex = []; }
      if (!opts) { opts = {}; }
    }

    pcex._bp = brackets.array(opts.brackets);

    return _compileHTML(cleanSource(html), opts, pcex)
  }

  var JS_ES6SIGN = /^[ \t]*(((?:async|\*)\s*)?([$_A-Za-z][$\w]*))\s*\([^()]*\)\s*{/m;

  function riotjs (js) {
    var
      parts = [],
      match,
      toes5,
      pos,
      method,
      prefix,
      name,
      RE = RegExp;

    var src = jsSplitter(js);
    js = src.shift().join('<%>');

    while ((match = js.match(JS_ES6SIGN))) {

      parts.push(RE.leftContext);
      js  = RE.rightContext;
      pos = skipBody(js);

      method = match[1];
      prefix = match[2] || '';
      name  = match[3];

      toes5 = !/^(?:if|while|for|switch|catch|function)$/.test(name);

      if (toes5) {
        name = match[0].replace(method, 'this.' + name + ' =' + prefix + ' function');
      } else {
        name = match[0];
      }

      parts.push(name, js.slice(0, pos));
      js = js.slice(pos);

      if (toes5 && !/^\s*.\s*bind\b/.test(js)) { parts.push('.bind(this)'); }
    }

    if (parts.length) {
      js = parts.join('') + js;
    }

    if (src.length) {
      js = js.replace(/<%>/g, function () {
        return src.shift()
      });
    }

    return js

    function skipBody (s) {
      var r = /[{}]/g;
      var i = 1;

      while (i && r.exec(s)) {
        if (s[r.lastIndex - 1] === '{') { ++i; }
        else { --i; }
      }
      return i ? s.length : r.lastIndex
    }
  }

  function _compileJS (js, opts, type, parserOpts, url) {
    if (!/\S/.test(js)) { return '' }
    if (!type) { type = opts.type; }

    var parser = opts.parser || type && parsers._req('js.' + type, true) || riotjs;

    return parser(js, parserOpts, url).replace(/\r\n?/g, '\n').replace(TRIM_TRAIL, '')
  }

  function compileJS (js, opts, type, userOpts) {
    if (typeof opts === 'string') {
      userOpts = type;
      type = opts;
      opts = {};
    }
    if (type && typeof type === 'object') {
      userOpts = type;
      type = '';
    }
    if (!userOpts) { userOpts = {}; }

    return _compileJS(js, opts || {}, type, userOpts.parserOptions, userOpts.url)
  }

  var CSS_SELECTOR = RegExp('([{}]|^)[; ]*((?:[^@ ;{}][^{}]*)?[^@ ;{}:] ?)(?={)|' + S_LINESTR, 'g');

  function scopedCSS (tag, css) {
    var scope = ':scope';

    return css.replace(CSS_SELECTOR, function (m, p1, p2) {

      if (!p2) { return m }

      p2 = p2.replace(/[^,]+/g, function (sel) {
        var s = sel.trim();

        if (s.indexOf(tag) === 0) {
          return sel
        }

        if (!s || s === 'from' || s === 'to' || s.slice(-1) === '%') {
          return sel
        }

        if (s.indexOf(scope) < 0) {
          s = tag + ' ' + s + ',[data-is="' + tag + '"] ' + s;
        } else {
          s = s.replace(scope, tag) + ',' +
              s.replace(scope, '[data-is="' + tag + '"]');
        }
        return s
      });

      return p1 ? p1 + ' ' + p2 : p2
    })
  }

  function _compileCSS (css, tag, type, opts) {
    opts = opts || {};

    if (type) {
      if (type !== 'css') {

        var parser = parsers._req('css.' + type, true);
        css = parser(tag, css, opts.parserOpts || {}, opts.url);
      }
    }

    css = css.replace(brackets.R_MLCOMMS, '').replace(/\s+/g, ' ').trim();
    if (tag) { css = scopedCSS(tag, css); }

    return css
  }

  function compileCSS (css, type, opts) {
    if (type && typeof type === 'object') {
      opts = type;
      type = '';
    } else if (!opts) { opts = {}; }

    return _compileCSS(css, opts.tagName, type, opts)
  }

  var TYPE_ATTR = /\stype\s*=\s*(?:(['"])(.+?)\1|(\S+))/i;

  var MISC_ATTR = '\\s*=\\s*(' + S_STRINGS + '|{[^}]+}|\\S+)';

  var END_TAGS = /\/>\n|^<(?:\/?-?[A-Za-z][-\w\xA0-\xFF]*\s*|-?[A-Za-z][-\w\xA0-\xFF]*\s+[-\w:\xA0-\xFF][\S\s]*?)>\n/;

  function _q (s, r) {
    if (!s) { return "''" }
    s = SQ + s.replace(/\\/g, '\\\\').replace(/'/g, "\\'") + SQ;
    return r && s.indexOf('\n') !== -1 ? s.replace(/\n/g, '\\n') : s
  }

  function mktag (name, html, css, attr, js, imports, opts) {
    var
      c = opts.debug ? ',\n  ' : ', ',
      s = '});';

    if (js && js.slice(-1) !== '\n') { s = '\n' + s; }

    return imports + 'riot.tag2(\'' + name + SQ +
      c + _q(html, 1) +
      c + _q(css) +
      c + _q(attr) + ', function(opts) {\n' + js + s
  }

  function splitBlocks (str) {
    if (/<[-\w]/.test(str)) {
      var
        m,
        k = str.lastIndexOf('<'),
        n = str.length;

      while (k !== -1) {
        m = str.slice(k, n).match(END_TAGS);
        if (m) {
          k += m.index + m[0].length;
          m = str.slice(0, k);
          if (m.slice(-5) === '<-/>\n') { m = m.slice(0, -5); }
          return [m, str.slice(k)]
        }
        n = k;
        k = str.lastIndexOf('<', k - 1);
      }
    }
    return ['', str]
  }

  function getType (attribs) {
    if (attribs) {
      var match = attribs.match(TYPE_ATTR);

      match = match && (match[2] || match[3]);
      if (match) {
        return match.replace('text/', '')
      }
    }
    return ''
  }

  function getAttrib (attribs, name) {
    if (attribs) {
      var match = attribs.match(RegExp('\\s' + name + MISC_ATTR, 'i'));

      match = match && match[1];
      if (match) {
        return (/^['"]/).test(match) ? match.slice(1, -1) : match
      }
    }
    return ''
  }

  function unescapeHTML (str) {
    return str
      .replace(/&amp;/g, '&')
      .replace(/&lt;/g, '<')
      .replace(/&gt;/g, '>')
      .replace(/&quot;/g, '"')
      .replace(/&#039;/g, '\'')
  }

  function getParserOptions (attribs) {
    var opts = unescapeHTML(getAttrib(attribs, 'options'));

    return opts ? JSON.parse(opts) : null
  }

  function getCode (code, opts, attribs, base) {
    var
      type = getType(attribs),
      src  = getAttrib(attribs, 'src'),
      jsParserOptions = extend$1({}, opts.parserOptions.js);

    if (src) { return false }

    return _compileJS(
      code,
      opts,
      type,
      extend$1(jsParserOptions, getParserOptions(attribs)),
      base
    )
  }

  function cssCode (code, opts, attribs, url, tag) {
    var
      parserStyleOptions = extend$1({}, opts.parserOptions.style),
      extraOpts = {
        parserOpts: extend$1(parserStyleOptions, getParserOptions(attribs)),
        url: url
      };

    return _compileCSS(code, tag, getType(attribs) || opts.style, extraOpts)
  }

  function compileTemplate (html, url, lang, opts) {

    var parser = parsers._req('html.' + lang, true);
    return parser(html, opts, url)
  }

  var

    CUST_TAG = RegExp(/^([ \t]*)<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^'"/>]+(?:(?:@|\/[^>])[^'"/>]*)*)|\s*)?(?:\/>|>[ \t]*\n?([\S\s]*)^\1<\/\2\s*>|>(.*)<\/\2\s*>)/
      .source.replace('@', S_STRINGS), 'gim'),

    SCRIPTS = /<script(\s+[^>]*)?>\n?([\S\s]*?)<\/script\s*>/gi,

    STYLES = /<style(\s+[^>]*)?>\n?([\S\s]*?)<\/style\s*>/gi;

  function compile (src, opts, url) {
    var
      parts = [],
      included,
      output = src,
      defaultParserptions = {

        template: {},
        js: {},
        style: {}
      };

    if (!opts) { opts = {}; }

    opts.parserOptions = extend$1(defaultParserptions, opts.parserOptions || {});

    included = opts.exclude
      ? function (s) { return opts.exclude.indexOf(s) < 0 } : function () { return 1 };

    if (!url) { url = ''; }

    var _bp = brackets.array(opts.brackets);

    if (opts.template) {
      output = compileTemplate(output, url, opts.template, opts.parserOptions.template);
    }

    output = cleanSource(output)
      .replace(CUST_TAG, function (_, indent, tagName, attribs, body, body2) {
        var
          jscode = '',
          styles = '',
          html = '',
          imports = '',
          pcex = [];

        pcex._bp = _bp;

        tagName = tagName.toLowerCase();

        attribs = attribs && included('attribs')
          ? restoreExpr(
            parseAttribs(
              splitHtml(attribs, opts, pcex),
              pcex),
            pcex) : '';

        if ((body || (body = body2)) && /\S/.test(body)) {

          if (body2) {

            if (included('html')) { html = _compileHTML(body2, opts, pcex); }
          } else {

            body = body.replace(RegExp('^' + indent, 'gm'), '');

            body = body.replace(SCRIPTS, function (_m, _attrs, _script) {
              if (included('js')) {
                var code = getCode(_script, opts, _attrs, url);

                if (code) { jscode += (jscode ? '\n' : '') + code; }
              }
              return ''
            });

            body = body.replace(STYLES, function (_m, _attrs, _style) {
              if (included('css')) {
                styles += (styles ? ' ' : '') + cssCode(_style, opts, _attrs, url, tagName);
              }
              return ''
            });

            var blocks = splitBlocks(body.replace(TRIM_TRAIL, ''));

            if (included('html')) {
              html = _compileHTML(blocks[0], opts, pcex);
            }

            if (included('js')) {
              body = _compileJS(blocks[1], opts, null, null, url);
              if (body) { jscode += (jscode ? '\n' : '') + body; }
              jscode = jscode.replace(IMPORT_STATEMENT, function (s) {
                imports += s.trim() + '\n';
                return ''
              });
            }
          }
        }

        jscode = /\S/.test(jscode) ? jscode.replace(/\n{3,}/g, '\n\n') : '';

        if (opts.entities) {
          parts.push({
            tagName: tagName,
            html: html,
            css: styles,
            attribs: attribs,
            js: jscode,
            imports: imports
          });
          return ''
        }

        return mktag(tagName, html, styles, attribs, jscode, imports, opts)
      });

    if (opts.entities) { return parts }

    return output
  }

  var version$2 = 'v3.5.2';

  var compiler = {
    compile: compile,
    compileHTML: compileHTML,
    compileCSS: compileCSS,
    compileJS: compileJS,
    parsers: parsers,
    version: version$2
  };

  var
    promise,    // emits the 'ready' event and runs the first callback
    ready;       // all the scripts were compiled?

  // gets the source of an external tag with an async call
  function GET (url, fn, opts) {
    var req = new XMLHttpRequest();

    req.onreadystatechange = function () {
      if (req.readyState === 4) {
        if (req.status === 200 || !req.status && req.responseText.length) {
          fn(req.responseText, opts, url);
        } else {
          compile$1.error(("\"" + url + "\" not found"));
        }
      }
    };

    req.onerror = function (e) { return compile$1.error(e); };

    req.open('GET', url, true);
    req.send('');
  }

  // evaluates a compiled tag within the global context
  function globalEval (js, url) {
    if (typeof js === T_STRING) {
      var
        node = makeElement('script'),
        root = document.documentElement;

      // make the source available in the "(no domain)" tab
      // of Chrome DevTools, with a .js extension
      if (url) { js += '\n//# sourceURL=' + url + '.js'; }

      node.text = js;
      root.appendChild(node);
      root.removeChild(node);
    }
  }

  // compiles all the internal and external tags on the page
  function compileScripts (fn, xopt) {
    var
      scripts = $$('script[type="riot/tag"]'),
      scriptsAmount = scripts.length;

    function done() {
      promise.trigger('ready');
      ready = true;
      if (fn) { fn(); }
    }

    function compileTag (src, opts, url) {
      var code = compiler.compile(src, opts, url);

      globalEval(code, url);
      if (!--scriptsAmount) { done(); }
    }

    if (!scriptsAmount) { done(); }
    else {
      for (var i = 0; i < scripts.length; ++i) {
        var
          script = scripts[i],
          opts = extend({template: getAttribute(script, 'template')}, xopt),
          url = getAttribute(script, 'src') || getAttribute(script, 'data-src');

        url ? GET(url, compileTag, opts) : compileTag(script.innerHTML, opts);
      }
    }
  }

  var parsers$1 = compiler.parsers;

  /*
    Compilation for the browser
  */
  function compile$1 (arg, fn, opts) {

    if (typeof arg === T_STRING) {

      // 2nd parameter is optional, but can be null
      if (isObject(fn)) {
        opts = fn;
        fn = false;
      }

      // `riot.compile(tag [, callback | true][, options])`
      if (/^\s*</m.test(arg)) {
        var js = compiler.compile(arg, opts);
        if (fn !== true) { globalEval(js); }
        if (isFunction(fn)) { fn(js, arg, opts); }
        return js
      }

      // `riot.compile(url [, callback][, options])`
      GET(arg, function (str, opts, url) {
        var js = compiler.compile(str, opts, url);
        globalEval(js, url);
        if (fn) { fn(js, str, opts); }
      }, opts);

    } else if (isArray(arg)) {
      var i = arg.length;
      // `riot.compile([urlsList] [, callback][, options])`
      arg.forEach(function(str) {
        GET(str, function (str, opts, url) {
          var js = compiler.compile(str, opts, url);
          globalEval(js, url);
          i --;
          if (!i && fn) { fn(js, str, opts); }
        }, opts);
      });
    } else {

      // `riot.compile([callback][, options])`
      if (isFunction(arg)) {
        opts = fn;
        fn = arg;
      } else {
        opts = arg;
        fn = undefined;
      }

      if (ready) {
        return fn && fn()
      }

      if (promise) {
        if (fn) { promise.on('ready', fn); }

      } else {
        promise = observable();
        compileScripts(fn, opts);
      }
    }
  }

  // it can be rewritten by the user to handle all the compiler errors
  compile$1.error = function (e) {
    throw new Error(e)
  };

  function mount$3() {
    var args = [], len = arguments.length;
    while ( len-- ) args[ len ] = arguments[ len ];

    var ret;
    compile$1(function () { ret = mount$2.apply(riot$2, args); });
    return ret
  }

  var riot_compiler = extend({}, riot$2, {
    mount: mount$3,
    compile: compile$1,
    parsers: parsers$1
  });

  return riot_compiler;

})));

Added public/riot-3.13.2/riot+compiler.min.js.

cannot compute difference between binary files

Added public/riot-3.13.2/riot.csp.js.

more than 10,000 changes

Added public/riot-3.13.2/riot.js.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
/* Riot v3.13.2, @license MIT */
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
  (factory((global.riot = {})));
}(this, (function (exports) { 'use strict';

  /**
   * Shorter and fast way to select a single node in the DOM
   * @param   { String } selector - unique dom selector
   * @param   { Object } ctx - DOM node where the target of our search will is located
   * @returns { Object } dom node found
   */
  function $(selector, ctx) {
    return (ctx || document).querySelector(selector)
  }

  var
    // be aware, internal usage
    // ATTENTION: prefix the global dynamic variables with `__`
    // tags instances cache
    __TAGS_CACHE = [],
    // tags implementation cache
    __TAG_IMPL = {},
    YIELD_TAG = 'yield',

    /**
     * Const
     */
    GLOBAL_MIXIN = '__global_mixin',

    // riot specific prefixes or attributes
    ATTRS_PREFIX = 'riot-',

    // Riot Directives
    REF_DIRECTIVES = ['ref', 'data-ref'],
    IS_DIRECTIVE = 'data-is',
    CONDITIONAL_DIRECTIVE = 'if',
    LOOP_DIRECTIVE = 'each',
    LOOP_NO_REORDER_DIRECTIVE = 'no-reorder',
    SHOW_DIRECTIVE = 'show',
    HIDE_DIRECTIVE = 'hide',
    KEY_DIRECTIVE = 'key',
    RIOT_EVENTS_KEY = '__riot-events__',

    // for typeof == '' comparisons
    T_STRING = 'string',
    T_OBJECT = 'object',
    T_UNDEF  = 'undefined',
    T_FUNCTION = 'function',

    XLINK_NS = 'http://www.w3.org/1999/xlink',
    SVG_NS = 'http://www.w3.org/2000/svg',
    XLINK_REGEX = /^xlink:(\w+)/,

    WIN = typeof window === T_UNDEF ? /* istanbul ignore next */ undefined : window,

    // special native tags that cannot be treated like the others
    RE_SPECIAL_TAGS = /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/,
    RE_SPECIAL_TAGS_NO_OPTION = /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/,
    RE_EVENTS_PREFIX = /^on/,
    RE_HTML_ATTRS = /([-\w]+) ?= ?(?:"([^"]*)|'([^']*)|({[^}]*}))/g,
    // some DOM attributes must be normalized
    CASE_SENSITIVE_ATTRIBUTES = {
      'viewbox': 'viewBox',
      'preserveaspectratio': 'preserveAspectRatio'
    },
    /**
     * Matches boolean HTML attributes in the riot tag definition.
     * With a long list like this, a regex is faster than `[].indexOf` in most browsers.
     * @const {RegExp}
     * @see [attributes.md](https://github.com/riot/compiler/blob/dev/doc/attributes.md)
     */
    RE_BOOL_ATTRS = /^(?:disabled|checked|readonly|required|allowfullscreen|auto(?:focus|play)|compact|controls|default|formnovalidate|hidden|ismap|itemscope|loop|multiple|muted|no(?:resize|shade|validate|wrap)?|open|reversed|seamless|selected|sortable|truespeed|typemustmatch)$/,
    // version# for IE 8-11, 0 for others
    IE_VERSION = (WIN && WIN.document || /* istanbul ignore next */ {}).documentMode | 0;

  /**
   * Create a generic DOM node
   * @param   { String } name - name of the DOM node we want to create
   * @returns { Object } DOM node just created
   */
  function makeElement(name) {
    return name === 'svg' ? document.createElementNS(SVG_NS, name) : document.createElement(name)
  }

  /**
   * Set any DOM attribute
   * @param { Object } dom - DOM node we want to update
   * @param { String } name - name of the property we want to set
   * @param { String } val - value of the property we want to set
   */
  function setAttribute(dom, name, val) {
    var xlink = XLINK_REGEX.exec(name);
    if (xlink && xlink[1])
      { dom.setAttributeNS(XLINK_NS, xlink[1], val); }
    else
      { dom.setAttribute(name, val); }
  }

  var styleNode;
  // Create cache and shortcut to the correct property
  var cssTextProp;
  var byName = {};
  var needsInject = false;

  // skip the following code on the server
  if (WIN) {
    styleNode = ((function () {
      // create a new style element with the correct type
      var newNode = makeElement('style');
      // replace any user node or insert the new one into the head
      var userNode = $('style[type=riot]');

      setAttribute(newNode, 'type', 'text/css');
      /* istanbul ignore next */
      if (userNode) {
        if (userNode.id) { newNode.id = userNode.id; }
        userNode.parentNode.replaceChild(newNode, userNode);
      } else { document.head.appendChild(newNode); }

      return newNode
    }))();
    cssTextProp = styleNode.styleSheet;
  }

  /**
   * Object that will be used to inject and manage the css of every tag instance
   */
  var styleManager = {
    styleNode: styleNode,
    /**
     * Save a tag style to be later injected into DOM
     * @param { String } css - css string
     * @param { String } name - if it's passed we will map the css to a tagname
     */
    add: function add(css, name) {
      byName[name] = css;
      needsInject = true;
    },
    /**
     * Inject all previously saved tag styles into DOM
     * innerHTML seems slow: http://jsperf.com/riot-insert-style
     */
    inject: function inject() {
      if (!WIN || !needsInject) { return }
      needsInject = false;
      var style = Object.keys(byName)
        .map(function (k) { return byName[k]; })
        .join('\n');
      /* istanbul ignore next */
      if (cssTextProp) { cssTextProp.cssText = style; }
      else { styleNode.innerHTML = style; }
    },

    /**
     * Remove a tag style of injected DOM later.
     * @param {String} name a registered tagname
     */
    remove: function remove(name) {
      delete byName[name];
      needsInject = true;
    }
  };

  /**
   * The riot template engine
   * @version v3.0.8
   */

  /* istanbul ignore next */
  var skipRegex = (function () { //eslint-disable-line no-unused-vars

    var beforeReChars = '[{(,;:?=|&!^~>%*/';

    var beforeReWords = [
      'case',
      'default',
      'do',
      'else',
      'in',
      'instanceof',
      'prefix',
      'return',
      'typeof',
      'void',
      'yield'
    ];

    var wordsLastChar = beforeReWords.reduce(function (s, w) {
      return s + w.slice(-1)
    }, '');

    var RE_REGEX = /^\/(?=[^*>/])[^[/\\]*(?:(?:\\.|\[(?:\\.|[^\]\\]*)*\])[^[\\/]*)*?\/[gimuy]*/;
    var RE_VN_CHAR = /[$\w]/;

    function prev (code, pos) {
      while (--pos >= 0 && /\s/.test(code[pos])){ }
      return pos
    }

    function _skipRegex (code, start) {

      var re = /.*/g;
      var pos = re.lastIndex = start++;
      var match = re.exec(code)[0].match(RE_REGEX);

      if (match) {
        var next = pos + match[0].length;

        pos = prev(code, pos);
        var c = code[pos];

        if (pos < 0 || ~beforeReChars.indexOf(c)) {
          return next
        }

        if (c === '.') {

          if (code[pos - 1] === '.') {
            start = next;
          }

        } else if (c === '+' || c === '-') {

          if (code[--pos] !== c ||
              (pos = prev(code, pos)) < 0 ||
              !RE_VN_CHAR.test(code[pos])) {
            start = next;
          }

        } else if (~wordsLastChar.indexOf(c)) {

          var end = pos + 1;

          while (--pos >= 0 && RE_VN_CHAR.test(code[pos])){ }
          if (~beforeReWords.indexOf(code.slice(pos + 1, end))) {
            start = next;
          }
        }
      }

      return start
    }

    return _skipRegex

  })();

  /**
   * riot.util.brackets
   *
   * - `brackets    ` - Returns a string or regex based on its parameter
   * - `brackets.set` - Change the current riot brackets
   *
   * @module
   */

  /* global riot */

  /* istanbul ignore next */
  var brackets = (function (UNDEF) {

    var
      REGLOB = 'g',

      R_MLCOMMS = /\/\*[^*]*\*+(?:[^*\/][^*]*\*+)*\//g,

      R_STRINGS = /"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|`[^`\\]*(?:\\[\S\s][^`\\]*)*`/g,

      S_QBLOCKS = R_STRINGS.source + '|' +
        /(?:\breturn\s+|(?:[$\w\)\]]|\+\+|--)\s*(\/)(?![*\/]))/.source + '|' +
        /\/(?=[^*\/])[^[\/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[\/\\]*)*?([^<]\/)[gim]*/.source,

      UNSUPPORTED = RegExp('[\\' + 'x00-\\x1F<>a-zA-Z0-9\'",;\\\\]'),

      NEED_ESCAPE = /(?=[[\]()*+?.^$|])/g,

      S_QBLOCK2 = R_STRINGS.source + '|' + /(\/)(?![*\/])/.source,

      FINDBRACES = {
        '(': RegExp('([()])|'   + S_QBLOCK2, REGLOB),
        '[': RegExp('([[\\]])|' + S_QBLOCK2, REGLOB),
        '{': RegExp('([{}])|'   + S_QBLOCK2, REGLOB)
      },

      DEFAULT = '{ }';

    var _pairs = [
      '{', '}',
      '{', '}',
      /{[^}]*}/,
      /\\([{}])/g,
      /\\({)|{/g,
      RegExp('\\\\(})|([[({])|(})|' + S_QBLOCK2, REGLOB),
      DEFAULT,
      /^\s*{\^?\s*([$\w]+)(?:\s*,\s*(\S+))?\s+in\s+(\S.*)\s*}/,
      /(^|[^\\]){=[\S\s]*?}/
    ];

    var
      cachedBrackets = UNDEF,
      _regex,
      _cache = [],
      _settings;

    function _loopback (re) { return re }

    function _rewrite (re, bp) {
      if (!bp) { bp = _cache; }
      return new RegExp(
        re.source.replace(/{/g, bp[2]).replace(/}/g, bp[3]), re.global ? REGLOB : ''
      )
    }

    function _create (pair) {
      if (pair === DEFAULT) { return _pairs }

      var arr = pair.split(' ');

      if (arr.length !== 2 || UNSUPPORTED.test(pair)) {
        throw new Error('Unsupported brackets "' + pair + '"')
      }
      arr = arr.concat(pair.replace(NEED_ESCAPE, '\\').split(' '));

      arr[4] = _rewrite(arr[1].length > 1 ? /{[\S\s]*?}/ : _pairs[4], arr);
      arr[5] = _rewrite(pair.length > 3 ? /\\({|})/g : _pairs[5], arr);
      arr[6] = _rewrite(_pairs[6], arr);
      arr[7] = RegExp('\\\\(' + arr[3] + ')|([[({])|(' + arr[3] + ')|' + S_QBLOCK2, REGLOB);
      arr[8] = pair;
      return arr
    }

    function _brackets (reOrIdx) {
      return reOrIdx instanceof RegExp ? _regex(reOrIdx) : _cache[reOrIdx]
    }

    _brackets.split = function split (str, tmpl, _bp) {
      // istanbul ignore next: _bp is for the compiler
      if (!_bp) { _bp = _cache; }

      var
        parts = [],
        match,
        isexpr,
        start,
        pos,
        re = _bp[6];

      var qblocks = [];
      var prevStr = '';
      var mark, lastIndex;

      isexpr = start = re.lastIndex = 0;

      while ((match = re.exec(str))) {

        lastIndex = re.lastIndex;
        pos = match.index;

        if (isexpr) {

          if (match[2]) {

            var ch = match[2];
            var rech = FINDBRACES[ch];
            var ix = 1;

            rech.lastIndex = lastIndex;
            while ((match = rech.exec(str))) {
              if (match[1]) {
                if (match[1] === ch) { ++ix; }
                else if (!--ix) { break }
              } else {
                rech.lastIndex = pushQBlock(match.index, rech.lastIndex, match[2]);
              }
            }
            re.lastIndex = ix ? str.length : rech.lastIndex;
            continue
          }

          if (!match[3]) {
            re.lastIndex = pushQBlock(pos, lastIndex, match[4]);
            continue
          }
        }

        if (!match[1]) {
          unescapeStr(str.slice(start, pos));
          start = re.lastIndex;
          re = _bp[6 + (isexpr ^= 1)];
          re.lastIndex = start;
        }
      }

      if (str && start < str.length) {
        unescapeStr(str.slice(start));
      }

      parts.qblocks = qblocks;

      return parts

      function unescapeStr (s) {
        if (prevStr) {
          s = prevStr + s;
          prevStr = '';
        }
        if (tmpl || isexpr) {
          parts.push(s && s.replace(_bp[5], '$1'));
        } else {
          parts.push(s);
        }
      }

      function pushQBlock(_pos, _lastIndex, slash) { //eslint-disable-line
        if (slash) {
          _lastIndex = skipRegex(str, _pos);
        }

        if (tmpl && _lastIndex > _pos + 2) {
          mark = '\u2057' + qblocks.length + '~';
          qblocks.push(str.slice(_pos, _lastIndex));
          prevStr += str.slice(start, _pos) + mark;
          start = _lastIndex;
        }
        return _lastIndex
      }
    };

    _brackets.hasExpr = function hasExpr (str) {
      return _cache[4].test(str)
    };

    _brackets.loopKeys = function loopKeys (expr) {
      var m = expr.match(_cache[9]);

      return m
        ? { key: m[1], pos: m[2], val: _cache[0] + m[3].trim() + _cache[1] }
        : { val: expr.trim() }
    };

    _brackets.array = function array (pair) {
      return pair ? _create(pair) : _cache
    };

    function _reset (pair) {
      if ((pair || (pair = DEFAULT)) !== _cache[8]) {
        _cache = _create(pair);
        _regex = pair === DEFAULT ? _loopback : _rewrite;
        _cache[9] = _regex(_pairs[9]);
      }
      cachedBrackets = pair;
    }

    function _setSettings (o) {
      var b;

      o = o || {};
      b = o.brackets;
      Object.defineProperty(o, 'brackets', {
        set: _reset,
        get: function () { return cachedBrackets },
        enumerable: true
      });
      _settings = o;
      _reset(b);
    }

    Object.defineProperty(_brackets, 'settings', {
      set: _setSettings,
      get: function () { return _settings }
    });

    /* istanbul ignore next: in the browser riot is always in the scope */
    _brackets.settings = typeof riot !== 'undefined' && riot.settings || {};
    _brackets.set = _reset;
    _brackets.skipRegex = skipRegex;

    _brackets.R_STRINGS = R_STRINGS;
    _brackets.R_MLCOMMS = R_MLCOMMS;
    _brackets.S_QBLOCKS = S_QBLOCKS;
    _brackets.S_QBLOCK2 = S_QBLOCK2;

    return _brackets

  })();

  /**
   * @module tmpl
   *
   * tmpl          - Root function, returns the template value, render with data
   * tmpl.hasExpr  - Test the existence of a expression inside a string
   * tmpl.loopKeys - Get the keys for an 'each' loop (used by `_each`)
   */

  /* istanbul ignore next */
  var tmpl = (function () {

    var _cache = {};

    function _tmpl (str, data) {
      if (!str) { return str }

      return (_cache[str] || (_cache[str] = _create(str))).call(
        data, _logErr.bind({
          data: data,
          tmpl: str
        })
      )
    }

    _tmpl.hasExpr = brackets.hasExpr;

    _tmpl.loopKeys = brackets.loopKeys;

    // istanbul ignore next
    _tmpl.clearCache = function () { _cache = {}; };

    _tmpl.errorHandler = null;

    function _logErr (err, ctx) {

      err.riotData = {
        tagName: ctx && ctx.__ && ctx.__.tagName,
        _riot_id: ctx && ctx._riot_id  //eslint-disable-line camelcase
      };

      if (_tmpl.errorHandler) { _tmpl.errorHandler(err); }
      else if (
        typeof console !== 'undefined' &&
        typeof console.error === 'function'
      ) {
        console.error(err.message);
        console.log('<%s> %s', err.riotData.tagName || 'Unknown tag', this.tmpl); // eslint-disable-line
        console.log(this.data); // eslint-disable-line
      }
    }

    function _create (str) {
      var expr = _getTmpl(str);

      if (expr.slice(0, 11) !== 'try{return ') { expr = 'return ' + expr; }

      return new Function('E', expr + ';')    // eslint-disable-line no-new-func
    }

    var RE_DQUOTE = /\u2057/g;
    var RE_QBMARK = /\u2057(\d+)~/g;

    function _getTmpl (str) {
      var parts = brackets.split(str.replace(RE_DQUOTE, '"'), 1);
      var qstr = parts.qblocks;
      var expr;

      if (parts.length > 2 || parts[0]) {
        var i, j, list = [];

        for (i = j = 0; i < parts.length; ++i) {

          expr = parts[i];

          if (expr && (expr = i & 1

              ? _parseExpr(expr, 1, qstr)

              : '"' + expr
                  .replace(/\\/g, '\\\\')
                  .replace(/\r\n?|\n/g, '\\n')
                  .replace(/"/g, '\\"') +
                '"'

            )) { list[j++] = expr; }

        }

        expr = j < 2 ? list[0]
             : '[' + list.join(',') + '].join("")';

      } else {

        expr = _parseExpr(parts[1], 0, qstr);
      }

      if (qstr.length) {
        expr = expr.replace(RE_QBMARK, function (_, pos) {
          return qstr[pos]
            .replace(/\r/g, '\\r')
            .replace(/\n/g, '\\n')
        });
      }
      return expr
    }

    var RE_CSNAME = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/;
    var
      RE_BREND = {
        '(': /[()]/g,
        '[': /[[\]]/g,
        '{': /[{}]/g
      };

    function _parseExpr (expr, asText, qstr) {

      expr = expr
        .replace(/\s+/g, ' ').trim()
        .replace(/\ ?([[\({},?\.:])\ ?/g, '$1');

      if (expr) {
        var
          list = [],
          cnt = 0,
          match;

        while (expr &&
              (match = expr.match(RE_CSNAME)) &&
              !match.index
          ) {
          var
            key,
            jsb,
            re = /,|([[{(])|$/g;

          expr = RegExp.rightContext;
          key  = match[2] ? qstr[match[2]].slice(1, -1).trim().replace(/\s+/g, ' ') : match[1];

          while (jsb = (match = re.exec(expr))[1]) { skipBraces(jsb, re); }

          jsb  = expr.slice(0, match.index);
          expr = RegExp.rightContext;

          list[cnt++] = _wrapExpr(jsb, 1, key);
        }

        expr = !cnt ? _wrapExpr(expr, asText)
             : cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0];
      }
      return expr

      function skipBraces (ch, re) {
        var
          mm,
          lv = 1,
          ir = RE_BREND[ch];

        ir.lastIndex = re.lastIndex;
        while (mm = ir.exec(expr)) {
          if (mm[0] === ch) { ++lv; }
          else if (!--lv) { break }
        }
        re.lastIndex = lv ? expr.length : ir.lastIndex;
      }
    }

    // istanbul ignore next: not both
    var // eslint-disable-next-line max-len
      JS_CONTEXT = '"in this?this:' + (typeof window !== 'object' ? 'global' : 'window') + ').',
      JS_VARNAME = /[,{][\$\w]+(?=:)|(^ *|[^$\w\.{])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\w]))([$_A-Za-z][$\w]*)/g,
      JS_NOPROPS = /^(?=(\.[$\w]+))\1(?:[^.[(]|$)/;

    function _wrapExpr (expr, asText, key) {
      var tb;

      expr = expr.replace(JS_VARNAME, function (match, p, mvar, pos, s) {
        if (mvar) {
          pos = tb ? 0 : pos + match.length;

          if (mvar !== 'this' && mvar !== 'global' && mvar !== 'window') {
            match = p + '("' + mvar + JS_CONTEXT + mvar;
            if (pos) { tb = (s = s[pos]) === '.' || s === '(' || s === '['; }
          } else if (pos) {
            tb = !JS_NOPROPS.test(s.slice(pos));
          }
        }
        return match
      });

      if (tb) {
        expr = 'try{return ' + expr + '}catch(e){E(e,this)}';
      }

      if (key) {

        expr = (tb
            ? 'function(){' + expr + '}.call(this)' : '(' + expr + ')'
          ) + '?"' + key + '":""';

      } else if (asText) {

        expr = 'function(v){' + (tb
            ? expr.replace('return ', 'v=') : 'v=(' + expr + ')'
          ) + ';return v||v===0?v:""}.call(this)';
      }

      return expr
    }

    _tmpl.version = brackets.version = 'v3.0.8';

    return _tmpl

  })();

  /* istanbul ignore next */
  var observable = function(el) {

    /**
     * Extend the original object or create a new empty one
     * @type { Object }
     */

    el = el || {};

    /**
     * Private variables
     */
    var callbacks = {},
      slice = Array.prototype.slice;

    /**
     * Public Api
     */

    // extend the el object adding the observable methods
    Object.defineProperties(el, {
      /**
       * Listen to the given `event` ands
       * execute the `callback` each time an event is triggered.
       * @param  { String } event - event id
       * @param  { Function } fn - callback function
       * @returns { Object } el
       */
      on: {
        value: function(event, fn) {
          if (typeof fn == 'function')
            { (callbacks[event] = callbacks[event] || []).push(fn); }
          return el
        },
        enumerable: false,
        writable: false,
        configurable: false
      },

      /**
       * Removes the given `event` listeners
       * @param   { String } event - event id
       * @param   { Function } fn - callback function
       * @returns { Object } el
       */
      off: {
        value: function(event, fn) {
          if (event == '*' && !fn) { callbacks = {}; }
          else {
            if (fn) {
              var arr = callbacks[event];
              for (var i = 0, cb; cb = arr && arr[i]; ++i) {
                if (cb == fn) { arr.splice(i--, 1); }
              }
            } else { delete callbacks[event]; }
          }
          return el
        },
        enumerable: false,
        writable: false,
        configurable: false
      },

      /**
       * Listen to the given `event` and
       * execute the `callback` at most once
       * @param   { String } event - event id
       * @param   { Function } fn - callback function
       * @returns { Object } el
       */
      one: {
        value: function(event, fn) {
          function on() {
            el.off(event, on);
            fn.apply(el, arguments);
          }
          return el.on(event, on)
        },
        enumerable: false,
        writable: false,
        configurable: false
      },

      /**
       * Execute all callback functions that listen to
       * the given `event`
       * @param   { String } event - event id
       * @returns { Object } el
       */
      trigger: {
        value: function(event) {
          var arguments$1 = arguments;


          // getting the arguments
          var arglen = arguments.length - 1,
            args = new Array(arglen),
            fns,
            fn,
            i;

          for (i = 0; i < arglen; i++) {
            args[i] = arguments$1[i + 1]; // skip first argument
          }

          fns = slice.call(callbacks[event] || [], 0);

          for (i = 0; fn = fns[i]; ++i) {
            fn.apply(el, args);
          }

          if (callbacks['*'] && event != '*')
            { el.trigger.apply(el, ['*', event].concat(args)); }

          return el
        },
        enumerable: false,
        writable: false,
        configurable: false
      }
    });

    return el

  };

  /**
   * Short alias for Object.getOwnPropertyDescriptor
   */
  function getPropDescriptor (o, k) {
    return Object.getOwnPropertyDescriptor(o, k)
  }

  /**
   * Check if passed argument is undefined
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isUndefined(value) {
    return typeof value === T_UNDEF
  }

  /**
   * Check whether object's property could be overridden
   * @param   { Object }  obj - source object
   * @param   { String }  key - object property
   * @returns { Boolean } true if writable
   */
  function isWritable(obj, key) {
    var descriptor = getPropDescriptor(obj, key);
    return isUndefined(obj[key]) || descriptor && descriptor.writable
  }

  /**
   * Extend any object with other properties
   * @param   { Object } src - source object
   * @returns { Object } the resulting extended object
   *
   * var obj = { foo: 'baz' }
   * extend(obj, {bar: 'bar', foo: 'bar'})
   * console.log(obj) => {bar: 'bar', foo: 'bar'}
   *
   */
  function extend(src) {
    var obj;
    var i = 1;
    var args = arguments;
    var l = args.length;

    for (; i < l; i++) {
      if (obj = args[i]) {
        for (var key in obj) {
          // check if this property of the source object could be overridden
          if (isWritable(src, key))
            { src[key] = obj[key]; }
        }
      }
    }
    return src
  }

  /**
   * Alias for Object.create
   */
  function create(src) {
    return Object.create(src)
  }

  var settings = extend(create(brackets.settings), {
    skipAnonymousTags: true,
    // the "value" attributes will be preserved
    keepValueAttributes: false,
    // handle the auto updates on any DOM event
    autoUpdate: true
  });

  /**
   * Shorter and fast way to select multiple nodes in the DOM
   * @param   { String } selector - DOM selector
   * @param   { Object } ctx - DOM node where the targets of our search will is located
   * @returns { Object } dom nodes found
   */
  function $$(selector, ctx) {
    return [].slice.call((ctx || document).querySelectorAll(selector))
  }

  /**
   * Create a document text node
   * @returns { Object } create a text node to use as placeholder
   */
  function createDOMPlaceholder() {
    return document.createTextNode('')
  }

  /**
   * Toggle the visibility of any DOM node
   * @param   { Object }  dom - DOM node we want to hide
   * @param   { Boolean } show - do we want to show it?
   */

  function toggleVisibility(dom, show) {
    dom.style.display = show ? '' : 'none';
    dom.hidden = show ? false : true;
  }

  /**
   * Get the value of any DOM attribute on a node
   * @param   { Object } dom - DOM node we want to parse
   * @param   { String } name - name of the attribute we want to get
   * @returns { String | undefined } name of the node attribute whether it exists
   */
  function getAttribute(dom, name) {
    return dom.getAttribute(name)
  }

  /**
   * Remove any DOM attribute from a node
   * @param   { Object } dom - DOM node we want to update
   * @param   { String } name - name of the property we want to remove
   */
  function removeAttribute(dom, name) {
    dom.removeAttribute(name);
  }

  /**
   * Set the inner html of any DOM node SVGs included
   * @param { Object } container - DOM node where we'll inject new html
   * @param { String } html - html to inject
   * @param { Boolean } isSvg - svg tags should be treated a bit differently
   */
  /* istanbul ignore next */
  function setInnerHTML(container, html, isSvg) {
    // innerHTML is not supported on svg tags so we neet to treat them differently
    if (isSvg) {
      var node = container.ownerDocument.importNode(
        new DOMParser()
          .parseFromString(("<svg xmlns=\"" + SVG_NS + "\">" + html + "</svg>"), 'application/xml')
          .documentElement,
        true
      );

      container.appendChild(node);
    } else {
      container.innerHTML = html;
    }
  }

  /**
   * Minimize risk: only zero or one _space_ between attr & value
   * @param   { String }   html - html string we want to parse
   * @param   { Function } fn - callback function to apply on any attribute found
   */
  function walkAttributes(html, fn) {
    if (!html) { return }
    var m;
    while (m = RE_HTML_ATTRS.exec(html))
      { fn(m[1].toLowerCase(), m[2] || m[3] || m[4]); }
  }

  /**
   * Create a document fragment
   * @returns { Object } document fragment
   */
  function createFragment() {
    return document.createDocumentFragment()
  }

  /**
   * Insert safely a tag to fix #1962 #1649
   * @param   { HTMLElement } root - children container
   * @param   { HTMLElement } curr - node to insert
   * @param   { HTMLElement } next - node that should preceed the current node inserted
   */
  function safeInsert(root, curr, next) {
    root.insertBefore(curr, next.parentNode && next);
  }

  /**
   * Convert a style object to a string
   * @param   { Object } style - style object we need to parse
   * @returns { String } resulting css string
   * @example
   * styleObjectToString({ color: 'red', height: '10px'}) // => 'color: red; height: 10px'
   */
  function styleObjectToString(style) {
    return Object.keys(style).reduce(function (acc, prop) {
      return (acc + " " + prop + ": " + (style[prop]) + ";")
    }, '')
  }

  /**
   * Walk down recursively all the children tags starting dom node
   * @param   { Object }   dom - starting node where we will start the recursion
   * @param   { Function } fn - callback to transform the child node just found
   * @param   { Object }   context - fn can optionally return an object, which is passed to children
   */
  function walkNodes(dom, fn, context) {
    if (dom) {
      var res = fn(dom, context);
      var next;
      // stop the recursion
      if (res === false) { return }

      dom = dom.firstChild;

      while (dom) {
        next = dom.nextSibling;
        walkNodes(dom, fn, res);
        dom = next;
      }
    }
  }



  var dom = /*#__PURE__*/Object.freeze({
    $$: $$,
    $: $,
    createDOMPlaceholder: createDOMPlaceholder,
    mkEl: makeElement,
    setAttr: setAttribute,
    toggleVisibility: toggleVisibility,
    getAttr: getAttribute,
    remAttr: removeAttribute,
    setInnerHTML: setInnerHTML,
    walkAttrs: walkAttributes,
    createFrag: createFragment,
    safeInsert: safeInsert,
    styleObjectToString: styleObjectToString,
    walkNodes: walkNodes
  });

  /**
   * Check against the null and undefined values
   * @param   { * }  value -
   * @returns {Boolean} -
   */
  function isNil(value) {
    return isUndefined(value) || value === null
  }

  /**
   * Check if passed argument is empty. Different from falsy, because we dont consider 0 or false to be blank
   * @param { * } value -
   * @returns { Boolean } -
   */
  function isBlank(value) {
    return isNil(value) || value === ''
  }

  /**
   * Check if passed argument is a function
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isFunction(value) {
    return typeof value === T_FUNCTION
  }

  /**
   * Check if passed argument is an object, exclude null
   * NOTE: use isObject(x) && !isArray(x) to excludes arrays.
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isObject(value) {
    return value && typeof value === T_OBJECT // typeof null is 'object'
  }

  /**
   * Check if a DOM node is an svg tag or part of an svg
   * @param   { HTMLElement }  el - node we want to test
   * @returns {Boolean} true if it's an svg node
   */
  function isSvg(el) {
    var owner = el.ownerSVGElement;
    return !!owner || owner === null
  }

  /**
   * Check if passed argument is a kind of array
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isArray(value) {
    return Array.isArray(value) || value instanceof Array
  }

  /**
   * Check if the passed argument is a boolean attribute
   * @param   { String } value -
   * @returns { Boolean } -
   */
  function isBoolAttr(value) {
    return RE_BOOL_ATTRS.test(value)
  }

  /**
   * Check if passed argument is a string
   * @param   { * } value -
   * @returns { Boolean } -
   */
  function isString(value) {
    return typeof value === T_STRING
  }



  var check = /*#__PURE__*/Object.freeze({
    isBlank: isBlank,
    isFunction: isFunction,
    isObject: isObject,
    isSvg: isSvg,
    isWritable: isWritable,
    isArray: isArray,
    isBoolAttr: isBoolAttr,
    isNil: isNil,
    isString: isString,
    isUndefined: isUndefined
  });

  /**
   * Check whether an array contains an item
   * @param   { Array } array - target array
   * @param   { * } item - item to test
   * @returns { Boolean } -
   */
  function contains(array, item) {
    return array.indexOf(item) !== -1
  }

  /**
   * Specialized function for looping an array-like collection with `each={}`
   * @param   { Array } list - collection of items
   * @param   {Function} fn - callback function
   * @returns { Array } the array looped
   */
  function each(list, fn) {
    var len = list ? list.length : 0;
    var i = 0;
    for (; i < len; i++) { fn(list[i], i); }
    return list
  }

  /**
   * Faster String startsWith alternative
   * @param   { String } str - source string
   * @param   { String } value - test string
   * @returns { Boolean } -
   */
  function startsWith(str, value) {
    return str.slice(0, value.length) === value
  }

  /**
   * Function returning always a unique identifier
   * @returns { Number } - number from 0...n
   */
  var uid = (function uid() {
    var i = -1;
    return function () { return ++i; }
  })();

  /**
   * Helper function to set an immutable property
   * @param   { Object } el - object where the new property will be set
   * @param   { String } key - object key where the new property will be stored
   * @param   { * } value - value of the new property
   * @param   { Object } options - set the propery overriding the default options
   * @returns { Object } - the initial object
   */
  function define(el, key, value, options) {
    Object.defineProperty(el, key, extend({
      value: value,
      enumerable: false,
      writable: false,
      configurable: true
    }, options));
    return el
  }

  /**
   * Convert a string containing dashes to camel case
   * @param   { String } str - input string
   * @returns { String } my-string -> myString
   */
  function toCamel(str) {
    return str.replace(/-(\w)/g, function (_, c) { return c.toUpperCase(); })
  }

  /**
   * Warn a message via console
   * @param   {String} message - warning message
   */
  function warn(message) {
    if (console && console.warn) { console.warn(message); }
  }



  var misc = /*#__PURE__*/Object.freeze({
    contains: contains,
    each: each,
    getPropDescriptor: getPropDescriptor,
    startsWith: startsWith,
    uid: uid,
    defineProperty: define,
    objectCreate: create,
    extend: extend,
    toCamel: toCamel,
    warn: warn
  });

  /**
   * Set the property of an object for a given key. If something already
   * exists there, then it becomes an array containing both the old and new value.
   * @param { Object } obj - object on which to set the property
   * @param { String } key - property name
   * @param { Object } value - the value of the property to be set
   * @param { Boolean } ensureArray - ensure that the property remains an array
   * @param { Number } index - add the new item in a certain array position
   */
  function arrayishAdd(obj, key, value, ensureArray, index) {
    var dest = obj[key];
    var isArr = isArray(dest);
    var hasIndex = !isUndefined(index);

    if (dest && dest === value) { return }

    // if the key was never set, set it once
    if (!dest && ensureArray) { obj[key] = [value]; }
    else if (!dest) { obj[key] = value; }
    // if it was an array and not yet set
    else {
      if (isArr) {
        var oldIndex = dest.indexOf(value);
        // this item never changed its position
        if (oldIndex === index) { return }
        // remove the item from its old position
        if (oldIndex !== -1) { dest.splice(oldIndex, 1); }
        // move or add the item
        if (hasIndex) {
          dest.splice(index, 0, value);
        } else {
          dest.push(value);
        }
      } else { obj[key] = [dest, value]; }
    }
  }

  /**
   * Detect the tag implementation by a DOM node
   * @param   { Object } dom - DOM node we need to parse to get its tag implementation
   * @returns { Object } it returns an object containing the implementation of a custom tag (template and boot function)
   */
  function get(dom) {
    return dom.tagName && __TAG_IMPL[getAttribute(dom, IS_DIRECTIVE) ||
      getAttribute(dom, IS_DIRECTIVE) || dom.tagName.toLowerCase()]
  }

  /**
   * Get the tag name of any DOM node
   * @param   { Object } dom - DOM node we want to parse
   * @param   { Boolean } skipDataIs - hack to ignore the data-is attribute when attaching to parent
   * @returns { String } name to identify this dom node in riot
   */
  function getName(dom, skipDataIs) {
    var child = get(dom);
    var namedTag = !skipDataIs && getAttribute(dom, IS_DIRECTIVE);
    return namedTag && !tmpl.hasExpr(namedTag) ?
      namedTag : child ? child.name : dom.tagName.toLowerCase()
  }

  /**
   * Return a temporary context containing also the parent properties
   * @this Tag
   * @param { Tag } - temporary tag context containing all the parent properties
   */
  function inheritParentProps() {
    if (this.parent) { return extend(create(this), this.parent) }
    return this
  }

  /*
    Includes hacks needed for the Internet Explorer version 9 and below
    See: http://kangax.github.io/compat-table/es5/#ie8
         http://codeplanet.io/dropping-ie8/
  */

  var
    reHasYield  = /<yield\b/i,
    reYieldAll  = /<yield\s*(?:\/>|>([\S\s]*?)<\/yield\s*>|>)/ig,
    reYieldSrc  = /<yield\s+to=['"]([^'">]*)['"]\s*>([\S\s]*?)<\/yield\s*>/ig,
    reYieldDest = /<yield\s+from=['"]?([-\w]+)['"]?\s*(?:\/>|>([\S\s]*?)<\/yield\s*>)/ig,
    rootEls = { tr: 'tbody', th: 'tr', td: 'tr', col: 'colgroup' },
    tblTags = IE_VERSION && IE_VERSION < 10 ? RE_SPECIAL_TAGS : RE_SPECIAL_TAGS_NO_OPTION,
    GENERIC = 'div',
    SVG = 'svg';


  /*
    Creates the root element for table or select child elements:
    tr/th/td/thead/tfoot/tbody/caption/col/colgroup/option/optgroup
  */
  function specialTags(el, tmpl, tagName) {

    var
      select = tagName[0] === 'o',
      parent = select ? 'select>' : 'table>';

    // trim() is important here, this ensures we don't have artifacts,
    // so we can check if we have only one element inside the parent
    el.innerHTML = '<' + parent + tmpl.trim() + '</' + parent;
    parent = el.firstChild;

    // returns the immediate parent if tr/th/td/col is the only element, if not
    // returns the whole tree, as this can include additional elements
    /* istanbul ignore next */
    if (select) {
      parent.selectedIndex = -1;  // for IE9, compatible w/current riot behavior
    } else {
      // avoids insertion of cointainer inside container (ex: tbody inside tbody)
      var tname = rootEls[tagName];
      if (tname && parent.childElementCount === 1) { parent = $(tname, parent); }
    }
    return parent
  }

  /*
    Replace the yield tag from any tag template with the innerHTML of the
    original tag in the page
  */
  function replaceYield(tmpl, html) {
    // do nothing if no yield
    if (!reHasYield.test(tmpl)) { return tmpl }

    // be careful with #1343 - string on the source having `$1`
    var src = {};

    html = html && html.replace(reYieldSrc, function (_, ref, text) {
      src[ref] = src[ref] || text;   // preserve first definition
      return ''
    }).trim();

    return tmpl
      .replace(reYieldDest, function (_, ref, def) {  // yield with from - to attrs
        return src[ref] || def || ''
      })
      .replace(reYieldAll, function (_, def) {        // yield without any "from"
        return html || def || ''
      })
  }

  /**
   * Creates a DOM element to wrap the given content. Normally an `DIV`, but can be
   * also a `TABLE`, `SELECT`, `TBODY`, `TR`, or `COLGROUP` element.
   *
   * @param   { String } tmpl  - The template coming from the custom tag definition
   * @param   { String } html - HTML content that comes from the DOM element where you
   *           will mount the tag, mostly the original tag in the page
   * @param   { Boolean } isSvg - true if the root node is an svg
   * @returns { HTMLElement } DOM element with _tmpl_ merged through `YIELD` with the _html_.
   */
  function mkdom(tmpl, html, isSvg) {
    var match   = tmpl && tmpl.match(/^\s*<([-\w]+)/);
    var  tagName = match && match[1].toLowerCase();
    var el = makeElement(isSvg ? SVG : GENERIC);

    // replace all the yield tags with the tag inner html
    tmpl = replaceYield(tmpl, html);

    /* istanbul ignore next */
    if (tblTags.test(tagName))
      { el = specialTags(el, tmpl, tagName); }
    else
      { setInnerHTML(el, tmpl, isSvg); }

    return el
  }

  var EVENT_ATTR_RE = /^on/;

  /**
   * True if the event attribute starts with 'on'
   * @param   { String } attribute - event attribute
   * @returns { Boolean }
   */
  function isEventAttribute(attribute) {
    return EVENT_ATTR_RE.test(attribute)
  }

  /**
   * Loop backward all the parents tree to detect the first custom parent tag
   * @param   { Object } tag - a Tag instance
   * @returns { Object } the instance of the first custom parent tag found
   */
  function getImmediateCustomParent(tag) {
    var ptag = tag;
    while (ptag.__.isAnonymous) {
      if (!ptag.parent) { break }
      ptag = ptag.parent;
    }
    return ptag
  }

  /**
   * Trigger DOM events
   * @param   { HTMLElement } dom - dom element target of the event
   * @param   { Function } handler - user function
   * @param   { Object } e - event object
   */
  function handleEvent(dom, handler, e) {
    var ptag = this.__.parent;
    var item = this.__.item;

    if (!item)
      { while (ptag && !item) {
        item = ptag.__.item;
        ptag = ptag.__.parent;
      } }

    // override the event properties
    /* istanbul ignore next */
    if (isWritable(e, 'currentTarget')) { e.currentTarget = dom; }
    /* istanbul ignore next */
    if (isWritable(e, 'target')) { e.target = e.srcElement; }
    /* istanbul ignore next */
    if (isWritable(e, 'which')) { e.which = e.charCode || e.keyCode; }

    e.item = item;

    handler.call(this, e);

    // avoid auto updates
    if (!settings.autoUpdate) { return }

    if (!e.preventUpdate) {
      var p = getImmediateCustomParent(this);
      // fixes #2083
      if (p.isMounted) { p.update(); }
    }
  }

  /**
   * Attach an event to a DOM node
   * @param { String } name - event name
   * @param { Function } handler - event callback
   * @param { Object } dom - dom node
   * @param { Tag } tag - tag instance
   */
  function setEventHandler(name, handler, dom, tag) {
    var eventName;
    var cb = handleEvent.bind(tag, dom, handler);

    // avoid to bind twice the same event
    // possible fix for #2332
    dom[name] = null;

    // normalize event name
    eventName = name.replace(RE_EVENTS_PREFIX, '');

    // cache the listener into the listeners array
    if (!contains(tag.__.listeners, dom)) { tag.__.listeners.push(dom); }
    if (!dom[RIOT_EVENTS_KEY]) { dom[RIOT_EVENTS_KEY] = {}; }
    if (dom[RIOT_EVENTS_KEY][name]) { dom.removeEventListener(eventName, dom[RIOT_EVENTS_KEY][name]); }

    dom[RIOT_EVENTS_KEY][name] = cb;
    dom.addEventListener(eventName, cb, false);
  }

  /**
   * Create a new child tag including it correctly into its parent
   * @param   { Object } child - child tag implementation
   * @param   { Object } opts - tag options containing the DOM node where the tag will be mounted
   * @param   { String } innerHTML - inner html of the child node
   * @param   { Object } parent - instance of the parent tag including the child custom tag
   * @returns { Object } instance of the new child tag just created
   */
  function initChild(child, opts, innerHTML, parent) {
    var tag = createTag(child, opts, innerHTML);
    var tagName = opts.tagName || getName(opts.root, true);
    var ptag = getImmediateCustomParent(parent);
    // fix for the parent attribute in the looped elements
    define(tag, 'parent', ptag);
    // store the real parent tag
    // in some cases this could be different from the custom parent tag
    // for example in nested loops
    tag.__.parent = parent;

    // add this tag to the custom parent tag
    arrayishAdd(ptag.tags, tagName, tag);

    // and also to the real parent tag
    if (ptag !== parent)
      { arrayishAdd(parent.tags, tagName, tag); }

    return tag
  }

  /**
   * Removes an item from an object at a given key. If the key points to an array,
   * then the item is just removed from the array.
   * @param { Object } obj - object on which to remove the property
   * @param { String } key - property name
   * @param { Object } value - the value of the property to be removed
   * @param { Boolean } ensureArray - ensure that the property remains an array
  */
  function arrayishRemove(obj, key, value, ensureArray) {
    if (isArray(obj[key])) {
      var index = obj[key].indexOf(value);
      if (index !== -1) { obj[key].splice(index, 1); }
      if (!obj[key].length) { delete obj[key]; }
      else if (obj[key].length === 1 && !ensureArray) { obj[key] = obj[key][0]; }
    } else if (obj[key] === value)
      { delete obj[key]; } // otherwise just delete the key
  }

  /**
   * Adds the elements for a virtual tag
   * @this Tag
   * @param { Node } src - the node that will do the inserting or appending
   * @param { Tag } target - only if inserting, insert before this tag's first child
   */
  function makeVirtual(src, target) {
    var this$1 = this;

    var head = createDOMPlaceholder();
    var tail = createDOMPlaceholder();
    var frag = createFragment();
    var sib;
    var el;

    this.root.insertBefore(head, this.root.firstChild);
    this.root.appendChild(tail);

    this.__.head = el = head;
    this.__.tail = tail;

    while (el) {
      sib = el.nextSibling;
      frag.appendChild(el);
      this$1.__.virts.push(el); // hold for unmounting
      el = sib;
    }

    if (target)
      { src.insertBefore(frag, target.__.head); }
    else
      { src.appendChild(frag); }
  }

  /**
   * makes a tag virtual and replaces a reference in the dom
   * @this Tag
   * @param { tag } the tag to make virtual
   * @param { ref } the dom reference location
   */
  function makeReplaceVirtual(tag, ref) {
    if (!ref.parentNode) { return }
    var frag = createFragment();
    makeVirtual.call(tag, frag);
    ref.parentNode.replaceChild(frag, ref);
  }

  /**
   * Update dynamically created data-is tags with changing expressions
   * @param { Object } expr - expression tag and expression info
   * @param { Tag }    parent - parent for tag creation
   * @param { String } tagName - tag implementation we want to use
   */
  function updateDataIs(expr, parent, tagName) {
    var tag = expr.tag || expr.dom._tag;
    var ref;

    var ref$1 = tag ? tag.__ : {};
    var head = ref$1.head;
    var isVirtual = expr.dom.tagName === 'VIRTUAL';

    if (tag && expr.tagName === tagName) {
      tag.update();
      return
    }

    // sync _parent to accommodate changing tagnames
    if (tag) {
      // need placeholder before unmount
      if(isVirtual) {
        ref = createDOMPlaceholder();
        head.parentNode.insertBefore(ref, head);
      }

      tag.unmount(true);
    }

    // unable to get the tag name
    if (!isString(tagName)) { return }

    expr.impl = __TAG_IMPL[tagName];

    // unknown implementation
    if (!expr.impl) { return }

    expr.tag = tag = initChild(
      expr.impl, {
        root: expr.dom,
        parent: parent,
        tagName: tagName
      },
      expr.dom.innerHTML,
      parent
    );

    each(expr.attrs, function (a) { return setAttribute(tag.root, a.name, a.value); });
    expr.tagName = tagName;
    tag.mount();

    // root exist first time, after use placeholder
    if (isVirtual) { makeReplaceVirtual(tag, ref || tag.root); }

    // parent is the placeholder tag, not the dynamic tag so clean up
    parent.__.onUnmount = function () {
      var delName = tag.opts.dataIs;
      arrayishRemove(tag.parent.tags, delName, tag);
      arrayishRemove(tag.__.parent.tags, delName, tag);
      tag.unmount();
    };
  }

  /**
   * Nomalize any attribute removing the "riot-" prefix
   * @param   { String } attrName - original attribute name
   * @returns { String } valid html attribute name
   */
  function normalizeAttrName(attrName) {
    if (!attrName) { return null }
    attrName = attrName.replace(ATTRS_PREFIX, '');
    if (CASE_SENSITIVE_ATTRIBUTES[attrName]) { attrName = CASE_SENSITIVE_ATTRIBUTES[attrName]; }
    return attrName
  }

  /**
   * Update on single tag expression
   * @this Tag
   * @param { Object } expr - expression logic
   * @returns { undefined }
   */
  function updateExpression(expr) {
    if (this.root && getAttribute(this.root,'virtualized')) { return }

    var dom = expr.dom;
    // remove the riot- prefix
    var attrName = normalizeAttrName(expr.attr);
    var isToggle = contains([SHOW_DIRECTIVE, HIDE_DIRECTIVE], attrName);
    var isVirtual = expr.root && expr.root.tagName === 'VIRTUAL';
    var ref = this.__;
    var isAnonymous = ref.isAnonymous;
    var parent = dom && (expr.parent || dom.parentNode);
    var keepValueAttributes = settings.keepValueAttributes;
    // detect the style attributes
    var isStyleAttr = attrName === 'style';
    var isClassAttr = attrName === 'class';
    var isValueAttr = attrName === 'value';

    var value;

    // if it's a tag we could totally skip the rest
    if (expr._riot_id) {
      if (expr.__.wasCreated) {
        expr.update();
      // if it hasn't been mounted yet, do that now.
      } else {
        expr.mount();
        if (isVirtual) {
          makeReplaceVirtual(expr, expr.root);
        }
      }
      return
    }

    // if this expression has the update method it means it can handle the DOM changes by itself
    if (expr.update) { return expr.update() }

    var context = isToggle && !isAnonymous ? inheritParentProps.call(this) : this;

    // ...it seems to be a simple expression so we try to calculate its value
    value = tmpl(expr.expr, context);

    var hasValue = !isBlank(value);
    var isObj = isObject(value);

    // convert the style/class objects to strings
    if (isObj) {
      if (isClassAttr) {
        value = tmpl(JSON.stringify(value), this);
      } else if (isStyleAttr) {
        value = styleObjectToString(value);
      }
    }

    // remove original attribute
    if (expr.attr &&
        (
          // the original attribute can be removed only if we are parsing the original expression
          !expr.wasParsedOnce ||
          // or its value is false
          value === false ||
          // or if its value is currently falsy...
          // We will keep the "value" attributes if the "keepValueAttributes"
          // is enabled though
          (!hasValue && (!isValueAttr || isValueAttr && !keepValueAttributes))
        )
    ) {
      // remove either riot-* attributes or just the attribute name
      removeAttribute(dom, getAttribute(dom, expr.attr) ? expr.attr : attrName);
    }

    // for the boolean attributes we don't need the value
    // we can convert it to checked=true to checked=checked
    if (expr.bool) { value = value ? attrName : false; }
    if (expr.isRtag) { return updateDataIs(expr, this, value) }
    if (expr.wasParsedOnce && expr.value === value) { return }

    // update the expression value
    expr.value = value;
    expr.wasParsedOnce = true;

    // if the value is an object (and it's not a style or class attribute) we can not do much more with it
    if (isObj && !isClassAttr && !isStyleAttr && !isToggle) { return }
    // avoid to render undefined/null values
    if (!hasValue) { value = ''; }

    // textarea and text nodes have no attribute name
    if (!attrName) {
      // about #815 w/o replace: the browser converts the value to a string,
      // the comparison by "==" does too, but not in the server
      value += '';
      // test for parent avoids error with invalid assignment to nodeValue
      if (parent) {
        // cache the parent node because somehow it will become null on IE
        // on the next iteration
        expr.parent = parent;
        if (parent.tagName === 'TEXTAREA') {
          parent.value = value;                    // #1113
          if (!IE_VERSION) { dom.nodeValue = value; }  // #1625 IE throws here, nodeValue
        }                                         // will be available on 'updated'
        else { dom.nodeValue = value; }
      }
      return
    }

    switch (true) {
    // handle events binding
    case isFunction(value):
      if (isEventAttribute(attrName)) {
        setEventHandler(attrName, value, dom, this);
      }
      break
    // show / hide
    case isToggle:
      toggleVisibility(dom, attrName === HIDE_DIRECTIVE ? !value : value);
      break
    // handle attributes
    default:
      if (expr.bool) {
        dom[attrName] = value;
      }

      if (isValueAttr && dom.value !== value) {
        dom.value = value;
      } else if (hasValue && value !== false) {
        setAttribute(dom, attrName, value);
      }

      // make sure that in case of style changes
      // the element stays hidden
      if (isStyleAttr && dom.hidden) { toggleVisibility(dom, false); }
    }
  }

  /**
   * Update all the expressions in a Tag instance
   * @this Tag
   * @param { Array } expressions - expression that must be re evaluated
   */
  function update(expressions) {
    each(expressions, updateExpression.bind(this));
  }

  /**
   * We need to update opts for this tag. That requires updating the expressions
   * in any attributes on the tag, and then copying the result onto opts.
   * @this Tag
   * @param   {Boolean} isLoop - is it a loop tag?
   * @param   { Tag }  parent - parent tag node
   * @param   { Boolean }  isAnonymous - is it a tag without any impl? (a tag not registered)
   * @param   { Object }  opts - tag options
   * @param   { Array }  instAttrs - tag attributes array
   */
  function updateOpts(isLoop, parent, isAnonymous, opts, instAttrs) {
    // isAnonymous `each` tags treat `dom` and `root` differently. In this case
    // (and only this case) we don't need to do updateOpts, because the regular parse
    // will update those attrs. Plus, isAnonymous tags don't need opts anyway
    if (isLoop && isAnonymous) { return }
    var ctx = isLoop ? inheritParentProps.call(this) : parent || this;

    each(instAttrs, function (attr) {
      if (attr.expr) { updateExpression.call(ctx, attr.expr); }
      // normalize the attribute names
      opts[toCamel(attr.name).replace(ATTRS_PREFIX, '')] = attr.expr ? attr.expr.value : attr.value;
    });
  }

  /**
   * Update the tag expressions and options
   * @param { Tag } tag - tag object
   * @param { * } data - data we want to use to extend the tag properties
   * @param { Array } expressions - component expressions array
   * @returns { Tag } the current tag instance
   */
  function componentUpdate(tag, data, expressions) {
    var __ = tag.__;
    var nextOpts = {};
    var canTrigger = tag.isMounted && !__.skipAnonymous;

    // inherit properties from the parent tag
    if (__.isAnonymous && __.parent) { extend(tag, __.parent); }
    extend(tag, data);

    updateOpts.apply(tag, [__.isLoop, __.parent, __.isAnonymous, nextOpts, __.instAttrs]);

    if (
      canTrigger &&
      tag.isMounted &&
      isFunction(tag.shouldUpdate) && !tag.shouldUpdate(data, nextOpts)
    ) {
      return tag
    }

    extend(tag.opts, nextOpts);

    if (canTrigger) { tag.trigger('update', data); }
    update.call(tag, expressions);
    if (canTrigger) { tag.trigger('updated'); }

    return tag
  }

  /**
   * Get selectors for tags
   * @param   { Array } tags - tag names to select
   * @returns { String } selector
   */
  function query(tags) {
    // select all tags
    if (!tags) {
      var keys = Object.keys(__TAG_IMPL);
      return keys + query(keys)
    }

    return tags
      .filter(function (t) { return !/[^-\w]/.test(t); })
      .reduce(function (list, t) {
        var name = t.trim().toLowerCase();
        return list + ",[" + IS_DIRECTIVE + "=\"" + name + "\"]"
      }, '')
  }

  /**
   * Another way to create a riot tag a bit more es6 friendly
   * @param { HTMLElement } el - tag DOM selector or DOM node/s
   * @param { Object } opts - tag logic
   * @returns { Tag } new riot tag instance
   */
  function Tag(el, opts) {
    // get the tag properties from the class constructor
    var ref = this;
    var name = ref.name;
    var tmpl = ref.tmpl;
    var css = ref.css;
    var attrs = ref.attrs;
    var onCreate = ref.onCreate;
    // register a new tag and cache the class prototype
    if (!__TAG_IMPL[name]) {
      tag(name, tmpl, css, attrs, onCreate);
      // cache the class constructor
      __TAG_IMPL[name].class = this.constructor;
    }

    // mount the tag using the class instance
    mount$1(el, name, opts, this);
    // inject the component css
    if (css) { styleManager.inject(); }

    return this
  }

  /**
   * Create a new riot tag implementation
   * @param   { String }   name - name/id of the new riot tag
   * @param   { String }   tmpl - tag template
   * @param   { String }   css - custom tag css
   * @param   { String }   attrs - root tag attributes
   * @param   { Function } fn - user function
   * @returns { String } name/id of the tag just created
   */
  function tag(name, tmpl, css, attrs, fn) {
    if (isFunction(attrs)) {
      fn = attrs;

      if (/^[\w-]+\s?=/.test(css)) {
        attrs = css;
        css = '';
      } else
        { attrs = ''; }
    }

    if (css) {
      if (isFunction(css))
        { fn = css; }
      else
        { styleManager.add(css, name); }
    }

    name = name.toLowerCase();
    __TAG_IMPL[name] = { name: name, tmpl: tmpl, attrs: attrs, fn: fn };

    return name
  }

  /**
   * Create a new riot tag implementation (for use by the compiler)
   * @param   { String }   name - name/id of the new riot tag
   * @param   { String }   tmpl - tag template
   * @param   { String }   css - custom tag css
   * @param   { String }   attrs - root tag attributes
   * @param   { Function } fn - user function
   * @returns { String } name/id of the tag just created
   */
  function tag2(name, tmpl, css, attrs, fn) {
    if (css) { styleManager.add(css, name); }

    __TAG_IMPL[name] = { name: name, tmpl: tmpl, attrs: attrs, fn: fn };

    return name
  }

  /**
   * Mount a tag using a specific tag implementation
   * @param   { * } selector - tag DOM selector or DOM node/s
   * @param   { String } tagName - tag implementation name
   * @param   { Object } opts - tag logic
   * @returns { Array } new tags instances
   */
  function mount(selector, tagName, opts) {
    var tags = [];
    var elem, allTags;

    function pushTagsTo(root) {
      if (root.tagName) {
        var riotTag = getAttribute(root, IS_DIRECTIVE), tag;

        // have tagName? force riot-tag to be the same
        if (tagName && riotTag !== tagName) {
          riotTag = tagName;
          setAttribute(root, IS_DIRECTIVE, tagName);
        }

        tag = mount$1(
          root,
          riotTag || root.tagName.toLowerCase(),
          isFunction(opts) ? opts() : opts
        );

        if (tag)
          { tags.push(tag); }
      } else if (root.length)
        { each(root, pushTagsTo); } // assume nodeList
    }

    // inject styles into DOM
    styleManager.inject();

    if (isObject(tagName) || isFunction(tagName)) {
      opts = tagName;
      tagName = 0;
    }

    // crawl the DOM to find the tag
    if (isString(selector)) {
      selector = selector === '*' ?
        // select all registered tags
        // & tags found with the riot-tag attribute set
        allTags = query() :
        // or just the ones named like the selector
        selector + query(selector.split(/, */));

      // make sure to pass always a selector
      // to the querySelectorAll function
      elem = selector ? $$(selector) : [];
    }
    else
      // probably you have passed already a tag or a NodeList
      { elem = selector; }

    // select all the registered and mount them inside their root elements
    if (tagName === '*') {
      // get all custom tags
      tagName = allTags || query();
      // if the root els it's just a single tag
      if (elem.tagName)
        { elem = $$(tagName, elem); }
      else {
        // select all the children for all the different root elements
        var nodeList = [];

        each(elem, function (_el) { return nodeList.push($$(tagName, _el)); });

        elem = nodeList;
      }
      // get rid of the tagName
      tagName = 0;
    }

    pushTagsTo(elem);

    return tags
  }

  // Create a mixin that could be globally shared across all the tags
  var mixins = {};
  var globals = mixins[GLOBAL_MIXIN] = {};
  var mixins_id = 0;

  /**
   * Create/Return a mixin by its name
   * @param   { String }  name - mixin name (global mixin if object)
   * @param   { Object }  mix - mixin logic
   * @param   { Boolean } g - is global?
   * @returns { Object }  the mixin logic
   */
  function mixin(name, mix, g) {
    // Unnamed global
    if (isObject(name)) {
      mixin(("__" + (mixins_id++) + "__"), name, true);
      return
    }

    var store = g ? globals : mixins;

    // Getter
    if (!mix) {
      if (isUndefined(store[name]))
        { throw new Error(("Unregistered mixin: " + name)) }

      return store[name]
    }

    // Setter
    store[name] = isFunction(mix) ?
      extend(mix.prototype, store[name] || {}) && mix :
      extend(store[name] || {}, mix);
  }

  /**
   * Update all the tags instances created
   * @returns { Array } all the tags instances
   */
  function update$1() {
    return each(__TAGS_CACHE, function (tag) { return tag.update(); })
  }

  function unregister(name) {
    styleManager.remove(name);
    return delete __TAG_IMPL[name]
  }

  var version = 'v3.13.2';

  var core = /*#__PURE__*/Object.freeze({
    Tag: Tag,
    tag: tag,
    tag2: tag2,
    mount: mount,
    mixin: mixin,
    update: update$1,
    unregister: unregister,
    version: version
  });

  /**
   * Add a mixin to this tag
   * @returns { Tag } the current tag instance
   */
  function componentMixin(tag$$1) {
    var mixins = [], len = arguments.length - 1;
    while ( len-- > 0 ) mixins[ len ] = arguments[ len + 1 ];

    each(mixins, function (mix) {
      var instance;
      var obj;
      var props = [];

      // properties blacklisted and will not be bound to the tag instance
      var propsBlacklist = ['init', '__proto__'];

      mix = isString(mix) ? mixin(mix) : mix;

      // check if the mixin is a function
      if (isFunction(mix)) {
        // create the new mixin instance
        instance = new mix();
      } else { instance = mix; }

      var proto = Object.getPrototypeOf(instance);

      // build multilevel prototype inheritance chain property list
      do { props = props.concat(Object.getOwnPropertyNames(obj || instance)); }
      while (obj = Object.getPrototypeOf(obj || instance))

      // loop the keys in the function prototype or the all object keys
      each(props, function (key) {
        // bind methods to tag
        // allow mixins to override other properties/parent mixins
        if (!contains(propsBlacklist, key)) {
          // check for getters/setters
          var descriptor = getPropDescriptor(instance, key) || getPropDescriptor(proto, key);
          var hasGetterSetter = descriptor && (descriptor.get || descriptor.set);

          // apply method only if it does not already exist on the instance
          if (!tag$$1.hasOwnProperty(key) && hasGetterSetter) {
            Object.defineProperty(tag$$1, key, descriptor);
          } else {
            tag$$1[key] = isFunction(instance[key]) ?
              instance[key].bind(tag$$1) :
              instance[key];
          }
        }
      });

      // init method will be called automatically
      if (instance.init)
        { instance.init.bind(tag$$1)(tag$$1.opts); }
    });

    return tag$$1
  }

  /**
   * Move the position of a custom tag in its parent tag
   * @this Tag
   * @param   { String } tagName - key where the tag was stored
   * @param   { Number } newPos - index where the new tag will be stored
   */
  function moveChild(tagName, newPos) {
    var parent = this.parent;
    var tags;
    // no parent no move
    if (!parent) { return }

    tags = parent.tags[tagName];

    if (isArray(tags))
      { tags.splice(newPos, 0, tags.splice(tags.indexOf(this), 1)[0]); }
    else { arrayishAdd(parent.tags, tagName, this); }
  }

  /**
   * Move virtual tag and all child nodes
   * @this Tag
   * @param { Node } src  - the node that will do the inserting
   * @param { Tag } target - insert before this tag's first child
   */
  function moveVirtual(src, target) {
    var this$1 = this;

    var el = this.__.head;
    var sib;
    var frag = createFragment();

    while (el) {
      sib = el.nextSibling;
      frag.appendChild(el);
      el = sib;
      if (el === this$1.__.tail) {
        frag.appendChild(el);
        src.insertBefore(frag, target.__.head);
        break
      }
    }
  }

  /**
   * Convert the item looped into an object used to extend the child tag properties
   * @param   { Object } expr - object containing the keys used to extend the children tags
   * @param   { * } key - value to assign to the new object returned
   * @param   { * } val - value containing the position of the item in the array
   * @returns { Object } - new object containing the values of the original item
   *
   * The variables 'key' and 'val' are arbitrary.
   * They depend on the collection type looped (Array, Object)
   * and on the expression used on the each tag
   *
   */
  function mkitem(expr, key, val) {
    var item = {};
    item[expr.key] = key;
    if (expr.pos) { item[expr.pos] = val; }
    return item
  }

  /**
   * Unmount the redundant tags
   * @param   { Array } items - array containing the current items to loop
   * @param   { Array } tags - array containing all the children tags
   */
  function unmountRedundant(items, tags, filteredItemsCount) {
    var i = tags.length;
    var j = items.length - filteredItemsCount;

    while (i > j) {
      i--;
      remove.apply(tags[i], [tags, i]);
    }
  }


  /**
   * Remove a child tag
   * @this Tag
   * @param   { Array } tags - tags collection
   * @param   { Number } i - index of the tag to remove
   */
  function remove(tags, i) {
    tags.splice(i, 1);
    this.unmount();
    arrayishRemove(this.parent, this, this.__.tagName, true);
  }

  /**
   * Move the nested custom tags in non custom loop tags
   * @this Tag
   * @param   { Number } i - current position of the loop tag
   */
  function moveNestedTags(i) {
    var this$1 = this;

    each(Object.keys(this.tags), function (tagName) {
      moveChild.apply(this$1.tags[tagName], [tagName, i]);
    });
  }

  /**
   * Move a child tag
   * @this Tag
   * @param   { HTMLElement } root - dom node containing all the loop children
   * @param   { Tag } nextTag - instance of the next tag preceding the one we want to move
   * @param   { Boolean } isVirtual - is it a virtual tag?
   */
  function move(root, nextTag, isVirtual) {
    if (isVirtual)
      { moveVirtual.apply(this, [root, nextTag]); }
    else
      { safeInsert(root, this.root, nextTag.root); }
  }

  /**
   * Insert and mount a child tag
   * @this Tag
   * @param   { HTMLElement } root - dom node containing all the loop children
   * @param   { Tag } nextTag - instance of the next tag preceding the one we want to insert
   * @param   { Boolean } isVirtual - is it a virtual tag?
   */
  function insert(root, nextTag, isVirtual) {
    if (isVirtual)
      { makeVirtual.apply(this, [root, nextTag]); }
    else
      { safeInsert(root, this.root, nextTag.root); }
  }

  /**
   * Append a new tag into the DOM
   * @this Tag
   * @param   { HTMLElement } root - dom node containing all the loop children
   * @param   { Boolean } isVirtual - is it a virtual tag?
   */
  function append(root, isVirtual) {
    if (isVirtual)
      { makeVirtual.call(this, root); }
    else
      { root.appendChild(this.root); }
  }

  /**
   * Return the value we want to use to lookup the postion of our items in the collection
   * @param   { String }  keyAttr         - lookup string or expression
   * @param   { * }       originalItem    - original item from the collection
   * @param   { Object }  keyedItem       - object created by riot via { item, i in collection }
   * @param   { Boolean } hasKeyAttrExpr  - flag to check whether the key is an expression
   * @returns { * } value that we will use to figure out the item position via collection.indexOf
   */
  function getItemId(keyAttr, originalItem, keyedItem, hasKeyAttrExpr) {
    if (keyAttr) {
      return hasKeyAttrExpr ?  tmpl(keyAttr, keyedItem) :  originalItem[keyAttr]
    }

    return originalItem
  }

  /**
   * Manage tags having the 'each'
   * @param   { HTMLElement } dom - DOM node we need to loop
   * @param   { Tag } parent - parent tag instance where the dom node is contained
   * @param   { String } expr - string contained in the 'each' attribute
   * @returns { Object } expression object for this each loop
   */
  function _each(dom, parent, expr) {
    var mustReorder = typeof getAttribute(dom, LOOP_NO_REORDER_DIRECTIVE) !== T_STRING || removeAttribute(dom, LOOP_NO_REORDER_DIRECTIVE);
    var keyAttr = getAttribute(dom, KEY_DIRECTIVE);
    var hasKeyAttrExpr = keyAttr ? tmpl.hasExpr(keyAttr) : false;
    var tagName = getName(dom);
    var impl = __TAG_IMPL[tagName];
    var parentNode = dom.parentNode;
    var placeholder = createDOMPlaceholder();
    var child = get(dom);
    var ifExpr = getAttribute(dom, CONDITIONAL_DIRECTIVE);
    var tags = [];
    var isLoop = true;
    var innerHTML = dom.innerHTML;
    var isAnonymous = !__TAG_IMPL[tagName];
    var isVirtual = dom.tagName === 'VIRTUAL';
    var oldItems = [];

    // remove the each property from the original tag
    removeAttribute(dom, LOOP_DIRECTIVE);
    removeAttribute(dom, KEY_DIRECTIVE);

    // parse the each expression
    expr = tmpl.loopKeys(expr);
    expr.isLoop = true;

    if (ifExpr) { removeAttribute(dom, CONDITIONAL_DIRECTIVE); }

    // insert a marked where the loop tags will be injected
    parentNode.insertBefore(placeholder, dom);
    parentNode.removeChild(dom);

    expr.update = function updateEach() {
      // get the new items collection
      expr.value = tmpl(expr.val, parent);

      var items = expr.value;
      var frag = createFragment();
      var isObject = !isArray(items) && !isString(items);
      var root = placeholder.parentNode;
      var tmpItems = [];
      var hasKeys = isObject && !!items;

      // if this DOM was removed the update here is useless
      // this condition fixes also a weird async issue on IE in our unit test
      if (!root) { return }

      // object loop. any changes cause full redraw
      if (isObject) {
        items = items ? Object.keys(items).map(function (key) { return mkitem(expr, items[key], key); }) : [];
      }

      // store the amount of filtered items
      var filteredItemsCount = 0;

      // loop all the new items
      each(items, function (_item, index) {
        var i = index - filteredItemsCount;
        var item = !hasKeys && expr.key ? mkitem(expr, _item, index) : _item;

        // skip this item because it must be filtered
        if (ifExpr && !tmpl(ifExpr, extend(create(parent), item))) {
          filteredItemsCount ++;
          return
        }

        var itemId = getItemId(keyAttr, _item, item, hasKeyAttrExpr);
        // reorder only if the items are not objects
        // or a key attribute has been provided
        var doReorder = !isObject && mustReorder && typeof _item === T_OBJECT || keyAttr;
        var oldPos = oldItems.indexOf(itemId);
        var isNew = oldPos === -1;
        var pos = !isNew && doReorder ? oldPos : i;
        // does a tag exist in this position?
        var tag = tags[pos];
        var mustAppend = i >= oldItems.length;
        var mustCreate = doReorder && isNew || !doReorder && !tag || !tags[i];

        // new tag
        if (mustCreate) {
          tag = createTag(impl, {
            parent: parent,
            isLoop: isLoop,
            isAnonymous: isAnonymous,
            tagName: tagName,
            root: dom.cloneNode(isAnonymous),
            item: item,
            index: i,
          }, innerHTML);

          // mount the tag
          tag.mount();

          if (mustAppend)
            { append.apply(tag, [frag || root, isVirtual]); }
          else
            { insert.apply(tag, [root, tags[i], isVirtual]); }

          if (!mustAppend) { oldItems.splice(i, 0, item); }
          tags.splice(i, 0, tag);
          if (child) { arrayishAdd(parent.tags, tagName, tag, true); }
        } else if (pos !== i && doReorder) {
          // move
          if (keyAttr || contains(items, oldItems[pos])) {
            move.apply(tag, [root, tags[i], isVirtual]);
            // move the old tag instance
            tags.splice(i, 0, tags.splice(pos, 1)[0]);
            // move the old item
            oldItems.splice(i, 0, oldItems.splice(pos, 1)[0]);
          }

          // update the position attribute if it exists
          if (expr.pos) { tag[expr.pos] = i; }

          // if the loop tags are not custom
          // we need to move all their custom tags into the right position
          if (!child && tag.tags) { moveNestedTags.call(tag, i); }
        }

        // cache the original item to use it in the events bound to this node
        // and its children
        extend(tag.__, {
          item: item,
          index: i,
          parent: parent
        });

        tmpItems[i] = itemId;

        if (!mustCreate) { tag.update(item); }
      });

      // remove the redundant tags
      unmountRedundant(items, tags, filteredItemsCount);

      // clone the items array
      oldItems = tmpItems.slice();

      root.insertBefore(frag, placeholder);
    };

    expr.unmount = function () {
      each(tags, function (t) { t.unmount(); });
    };

    return expr
  }

  var RefExpr = {
    init: function init(dom, parent, attrName, attrValue) {
      this.dom = dom;
      this.attr = attrName;
      this.rawValue = attrValue;
      this.parent = parent;
      this.hasExp = tmpl.hasExpr(attrValue);
      return this
    },
    update: function update() {
      var old = this.value;
      var customParent = this.parent && getImmediateCustomParent(this.parent);
      // if the referenced element is a custom tag, then we set the tag itself, rather than DOM
      var tagOrDom = this.dom.__ref || this.tag || this.dom;

      this.value = this.hasExp ? tmpl(this.rawValue, this.parent) : this.rawValue;

      // the name changed, so we need to remove it from the old key (if present)
      if (!isBlank(old) && customParent) { arrayishRemove(customParent.refs, old, tagOrDom); }
      if (!isBlank(this.value) && isString(this.value)) {
        // add it to the refs of parent tag (this behavior was changed >=3.0)
        if (customParent) { arrayishAdd(
          customParent.refs,
          this.value,
          tagOrDom,
          // use an array if it's a looped node and the ref is not an expression
          null,
          this.parent.__.index
        ); }

        if (this.value !== old) {
          setAttribute(this.dom, this.attr, this.value);
        }
      } else {
        removeAttribute(this.dom, this.attr);
      }

      // cache the ref bound to this dom node
      // to reuse it in future (see also #2329)
      if (!this.dom.__ref) { this.dom.__ref = tagOrDom; }
    },
    unmount: function unmount() {
      var tagOrDom = this.tag || this.dom;
      var customParent = this.parent && getImmediateCustomParent(this.parent);
      if (!isBlank(this.value) && customParent)
        { arrayishRemove(customParent.refs, this.value, tagOrDom); }
    }
  };

  /**
   * Create a new ref directive
   * @param   { HTMLElement } dom - dom node having the ref attribute
   * @param   { Tag } context - tag instance where the DOM node is located
   * @param   { String } attrName - either 'ref' or 'data-ref'
   * @param   { String } attrValue - value of the ref attribute
   * @returns { RefExpr } a new RefExpr object
   */
  function createRefDirective(dom, tag, attrName, attrValue) {
    return create(RefExpr).init(dom, tag, attrName, attrValue)
  }

  /**
   * Trigger the unmount method on all the expressions
   * @param   { Array } expressions - DOM expressions
   */
  function unmountAll(expressions) {
    each(expressions, function (expr) {
      if (expr.unmount) { expr.unmount(true); }
      else if (expr.tagName) { expr.tag.unmount(true); }
      else if (expr.unmount) { expr.unmount(); }
    });
  }

  var IfExpr = {
    init: function init(dom, tag, expr) {
      removeAttribute(dom, CONDITIONAL_DIRECTIVE);
      extend(this, { tag: tag, expr: expr, stub: createDOMPlaceholder(), pristine: dom });
      var p = dom.parentNode;
      p.insertBefore(this.stub, dom);
      p.removeChild(dom);

      return this
    },
    update: function update$$1() {
      this.value = tmpl(this.expr, this.tag);

      if (!this.stub.parentNode) { return }

      if (this.value && !this.current) { // insert
        this.current = this.pristine.cloneNode(true);
        this.stub.parentNode.insertBefore(this.current, this.stub);
        this.expressions = parseExpressions.apply(this.tag, [this.current, true]);
      } else if (!this.value && this.current) { // remove
        this.unmount();
        this.current = null;
        this.expressions = [];
      }

      if (this.value) { update.call(this.tag, this.expressions); }
    },
    unmount: function unmount() {
      if (this.current) {
        if (this.current._tag) {
          this.current._tag.unmount();
        } else if (this.current.parentNode) {
          this.current.parentNode.removeChild(this.current);
        }
      }

      unmountAll(this.expressions || []);
    }
  };

  /**
   * Create a new if directive
   * @param   { HTMLElement } dom - if root dom node
   * @param   { Tag } context - tag instance where the DOM node is located
   * @param   { String } attr - if expression
   * @returns { IFExpr } a new IfExpr object
   */
  function createIfDirective(dom, tag, attr) {
    return create(IfExpr).init(dom, tag, attr)
  }

  /**
   * Walk the tag DOM to detect the expressions to evaluate
   * @this Tag
   * @param   { HTMLElement } root - root tag where we will start digging the expressions
   * @param   { Boolean } mustIncludeRoot - flag to decide whether the root must be parsed as well
   * @returns { Array } all the expressions found
   */
  function parseExpressions(root, mustIncludeRoot) {
    var this$1 = this;

    var expressions = [];

    walkNodes(root, function (dom) {
      var type = dom.nodeType;
      var attr;
      var tagImpl;

      if (!mustIncludeRoot && dom === root) { return }

      // text node
      if (type === 3 && dom.parentNode.tagName !== 'STYLE' && tmpl.hasExpr(dom.nodeValue))
        { expressions.push({dom: dom, expr: dom.nodeValue}); }

      if (type !== 1) { return }

      var isVirtual = dom.tagName === 'VIRTUAL';

      // loop. each does it's own thing (for now)
      if (attr = getAttribute(dom, LOOP_DIRECTIVE)) {
        if(isVirtual) { setAttribute(dom, 'loopVirtual', true); } // ignore here, handled in _each
        expressions.push(_each(dom, this$1, attr));
        return false
      }

      // if-attrs become the new parent. Any following expressions (either on the current
      // element, or below it) become children of this expression.
      if (attr = getAttribute(dom, CONDITIONAL_DIRECTIVE)) {
        expressions.push(createIfDirective(dom, this$1, attr));
        return false
      }

      if (attr = getAttribute(dom, IS_DIRECTIVE)) {
        if (tmpl.hasExpr(attr)) {
          expressions.push({
            isRtag: true,
            expr: attr,
            dom: dom,
            attrs: [].slice.call(dom.attributes)
          });

          return false
        }
      }

      // if this is a tag, stop traversing here.
      // we ignore the root, since parseExpressions is called while we're mounting that root
      tagImpl = get(dom);

      if(isVirtual) {
        if(getAttribute(dom, 'virtualized')) {dom.parentElement.removeChild(dom); } // tag created, remove from dom
        if(!tagImpl && !getAttribute(dom, 'virtualized') && !getAttribute(dom, 'loopVirtual'))  // ok to create virtual tag
          { tagImpl = { tmpl: dom.outerHTML }; }
      }

      if (tagImpl && (dom !== root || mustIncludeRoot)) {
        var hasIsDirective = getAttribute(dom, IS_DIRECTIVE);
        if(isVirtual && !hasIsDirective) { // handled in update
          // can not remove attribute like directives
          // so flag for removal after creation to prevent maximum stack error
          setAttribute(dom, 'virtualized', true);
          var tag = createTag(
            {tmpl: dom.outerHTML},
            {root: dom, parent: this$1},
            dom.innerHTML
          );

          expressions.push(tag); // no return, anonymous tag, keep parsing
        } else {
          if (hasIsDirective && isVirtual)
            { warn(("Virtual tags shouldn't be used together with the \"" + IS_DIRECTIVE + "\" attribute - https://github.com/riot/riot/issues/2511")); }

          expressions.push(
            initChild(
              tagImpl,
              {
                root: dom,
                parent: this$1
              },
              dom.innerHTML,
              this$1
            )
          );
          return false
        }
      }

      // attribute expressions
      parseAttributes.apply(this$1, [dom, dom.attributes, function (attr, expr) {
        if (!expr) { return }
        expressions.push(expr);
      }]);
    });

    return expressions
  }

  /**
   * Calls `fn` for every attribute on an element. If that attr has an expression,
   * it is also passed to fn.
   * @this Tag
   * @param   { HTMLElement } dom - dom node to parse
   * @param   { Array } attrs - array of attributes
   * @param   { Function } fn - callback to exec on any iteration
   */
  function parseAttributes(dom, attrs, fn) {
    var this$1 = this;

    each(attrs, function (attr) {
      if (!attr) { return false }

      var name = attr.name;
      var bool = isBoolAttr(name);
      var expr;

      if (contains(REF_DIRECTIVES, name) && dom.tagName.toLowerCase() !== YIELD_TAG) {
        expr =  createRefDirective(dom, this$1, name, attr.value);
      } else if (tmpl.hasExpr(attr.value)) {
        expr = {dom: dom, expr: attr.value, attr: name, bool: bool};
      }

      fn(attr, expr);
    });
  }

  /**
   * Manage the mount state of a tag triggering also the observable events
   * @this Tag
   * @param { Boolean } value - ..of the isMounted flag
   */
  function setMountState(value) {
    var ref = this.__;
    var isAnonymous = ref.isAnonymous;
    var skipAnonymous = ref.skipAnonymous;

    define(this, 'isMounted', value);

    if (!isAnonymous || !skipAnonymous) {
      if (value) { this.trigger('mount'); }
      else {
        this.trigger('unmount');
        this.off('*');
        this.__.wasCreated = false;
      }
    }
  }

  /**
   * Mount the current tag instance
   * @returns { Tag } the current tag instance
   */
  function componentMount(tag$$1, dom, expressions, opts) {
    var __ = tag$$1.__;
    var root = __.root;
    root._tag = tag$$1; // keep a reference to the tag just created

    // Read all the attrs on this instance. This give us the info we need for updateOpts
    parseAttributes.apply(__.parent, [root, root.attributes, function (attr, expr) {
      if (!__.isAnonymous && RefExpr.isPrototypeOf(expr)) { expr.tag = tag$$1; }
      attr.expr = expr;
      __.instAttrs.push(attr);
    }]);

    // update the root adding custom attributes coming from the compiler
    walkAttributes(__.impl.attrs, function (k, v) { __.implAttrs.push({name: k, value: v}); });
    parseAttributes.apply(tag$$1, [root, __.implAttrs, function (attr, expr) {
      if (expr) { expressions.push(expr); }
      else { setAttribute(root, attr.name, attr.value); }
    }]);

    // initialiation
    updateOpts.apply(tag$$1, [__.isLoop, __.parent, __.isAnonymous, opts, __.instAttrs]);

    // add global mixins
    var globalMixin = mixin(GLOBAL_MIXIN);

    if (globalMixin && !__.skipAnonymous) {
      for (var i in globalMixin) {
        if (globalMixin.hasOwnProperty(i)) {
          tag$$1.mixin(globalMixin[i]);
        }
      }
    }

    if (__.impl.fn) { __.impl.fn.call(tag$$1, opts); }

    if (!__.skipAnonymous) { tag$$1.trigger('before-mount'); }

    // parse layout after init. fn may calculate args for nested custom tags
    each(parseExpressions.apply(tag$$1, [dom, __.isAnonymous]), function (e) { return expressions.push(e); });

    tag$$1.update(__.item);

    if (!__.isAnonymous && !__.isInline) {
      while (dom.firstChild) { root.appendChild(dom.firstChild); }
    }

    define(tag$$1, 'root', root);

    // if we need to wait that the parent "mount" or "updated" event gets triggered
    if (!__.skipAnonymous && tag$$1.parent) {
      var p = getImmediateCustomParent(tag$$1.parent);
      p.one(!p.isMounted ? 'mount' : 'updated', function () {
        setMountState.call(tag$$1, true);
      });
    } else {
      // otherwise it's not a child tag we can trigger its mount event
      setMountState.call(tag$$1, true);
    }

    tag$$1.__.wasCreated = true;

    return tag$$1
  }

  /**
   * Unmount the tag instance
   * @param { Boolean } mustKeepRoot - if it's true the root node will not be removed
   * @returns { Tag } the current tag instance
   */
  function tagUnmount(tag, mustKeepRoot, expressions) {
    var __ = tag.__;
    var root = __.root;
    var tagIndex = __TAGS_CACHE.indexOf(tag);
    var p = root.parentNode;

    if (!__.skipAnonymous) { tag.trigger('before-unmount'); }

    // clear all attributes coming from the mounted tag
    walkAttributes(__.impl.attrs, function (name) {
      if (startsWith(name, ATTRS_PREFIX))
        { name = name.slice(ATTRS_PREFIX.length); }

      removeAttribute(root, name);
    });

    // remove all the event listeners
    tag.__.listeners.forEach(function (dom) {
      Object.keys(dom[RIOT_EVENTS_KEY]).forEach(function (eventName) {
        dom.removeEventListener(eventName, dom[RIOT_EVENTS_KEY][eventName]);
      });
    });

    // remove tag instance from the global tags cache collection
    if (tagIndex !== -1) { __TAGS_CACHE.splice(tagIndex, 1); }

    // clean up the parent tags object
    if (__.parent && !__.isAnonymous) {
      var ptag = getImmediateCustomParent(__.parent);

      if (__.isVirtual) {
        Object
          .keys(tag.tags)
          .forEach(function (tagName) { return arrayishRemove(ptag.tags, tagName, tag.tags[tagName]); });
      } else {
        arrayishRemove(ptag.tags, __.tagName, tag);
      }
    }

    // unmount all the virtual directives
    if (tag.__.virts) {
      each(tag.__.virts, function (v) {
        if (v.parentNode) { v.parentNode.removeChild(v); }
      });
    }

    // allow expressions to unmount themselves
    unmountAll(expressions);
    each(__.instAttrs, function (a) { return a.expr && a.expr.unmount && a.expr.unmount(); });

    // clear the tag html if it's necessary
    if (mustKeepRoot) { setInnerHTML(root, ''); }
    // otherwise detach the root tag from the DOM
    else if (p) { p.removeChild(root); }

    // custom internal unmount function to avoid relying on the observable
    if (__.onUnmount) { __.onUnmount(); }

    // weird fix for a weird edge case #2409 and #2436
    // some users might use your software not as you've expected
    // so I need to add these dirty hacks to mitigate unexpected issues
    if (!tag.isMounted) { setMountState.call(tag, true); }

    setMountState.call(tag, false);

    delete root._tag;

    return tag
  }

  /**
   * Tag creation factory function
   * @constructor
   * @param { Object } impl - it contains the tag template, and logic
   * @param { Object } conf - tag options
   * @param { String } innerHTML - html that eventually we need to inject in the tag
   */
  function createTag(impl, conf, innerHTML) {
    if ( impl === void 0 ) impl = {};
    if ( conf === void 0 ) conf = {};

    var tag = conf.context || {};
    var opts = conf.opts || {};
    var parent = conf.parent;
    var isLoop = conf.isLoop;
    var isAnonymous = !!conf.isAnonymous;
    var skipAnonymous = settings.skipAnonymousTags && isAnonymous;
    var item = conf.item;
    // available only for the looped nodes
    var index = conf.index;
    // All attributes on the Tag when it's first parsed
    var instAttrs = [];
    // expressions on this type of Tag
    var implAttrs = [];
    var tmpl = impl.tmpl;
    var expressions = [];
    var root = conf.root;
    var tagName = conf.tagName || getName(root);
    var isVirtual = tagName === 'virtual';
    var isInline = !isVirtual && !tmpl;
    var dom;

    if (isInline || isLoop && isAnonymous) {
      dom = root;
    } else {
      if (!isVirtual) { root.innerHTML = ''; }
      dom = mkdom(tmpl, innerHTML, isSvg(root));
    }

    // make this tag observable
    if (!skipAnonymous) { observable(tag); }

    // only call unmount if we have a valid __TAG_IMPL (has name property)
    if (impl.name && root._tag) { root._tag.unmount(true); }

    define(tag, '__', {
      impl: impl,
      root: root,
      skipAnonymous: skipAnonymous,
      implAttrs: implAttrs,
      isAnonymous: isAnonymous,
      instAttrs: instAttrs,
      innerHTML: innerHTML,
      tagName: tagName,
      index: index,
      isLoop: isLoop,
      isInline: isInline,
      item: item,
      parent: parent,
      // tags having event listeners
      // it would be better to use weak maps here but we can not introduce breaking changes now
      listeners: [],
      // these vars will be needed only for the virtual tags
      virts: [],
      wasCreated: false,
      tail: null,
      head: null
    });

    // tag protected properties
    return [
      ['isMounted', false],
      // create a unique id to this tag
      // it could be handy to use it also to improve the virtual dom rendering speed
      ['_riot_id', uid()],
      ['root', root],
      ['opts', opts, { writable: true, enumerable: true }],
      ['parent', parent || null],
      // protect the "tags" and "refs" property from being overridden
      ['tags', {}],
      ['refs', {}],
      ['update', function (data) { return componentUpdate(tag, data, expressions); }],
      ['mixin', function () {
        var mixins = [], len = arguments.length;
        while ( len-- ) mixins[ len ] = arguments[ len ];

        return componentMixin.apply(void 0, [ tag ].concat( mixins ));
    }],
      ['mount', function () { return componentMount(tag, dom, expressions, opts); }],
      ['unmount', function (mustKeepRoot) { return tagUnmount(tag, mustKeepRoot, expressions); }]
    ].reduce(function (acc, ref) {
      var key = ref[0];
      var value = ref[1];
      var opts = ref[2];

      define(tag, key, value, opts);
      return acc
    }, extend(tag, item))
  }

  /**
   * Mount a tag creating new Tag instance
   * @param   { Object } root - dom node where the tag will be mounted
   * @param   { String } tagName - name of the riot tag we want to mount
   * @param   { Object } opts - options to pass to the Tag instance
   * @param   { Object } ctx - optional context that will be used to extend an existing class ( used in riot.Tag )
   * @returns { Tag } a new Tag instance
   */
  function mount$1(root, tagName, opts, ctx) {
    var impl = __TAG_IMPL[tagName];
    var implClass = __TAG_IMPL[tagName].class;
    var context = ctx || (implClass ? create(implClass.prototype) : {});
    // cache the inner HTML to fix #855
    var innerHTML = root._innerHTML = root._innerHTML || root.innerHTML;
    var conf = extend({ root: root, opts: opts, context: context }, { parent: opts ? opts.parent : null });
    var tag;

    if (impl && root) { tag = createTag(impl, conf, innerHTML); }

    if (tag && tag.mount) {
      tag.mount(true);
      // add this tag to the virtualDom variable
      if (!contains(__TAGS_CACHE, tag)) { __TAGS_CACHE.push(tag); }
    }

    return tag
  }



  var tags = /*#__PURE__*/Object.freeze({
    arrayishAdd: arrayishAdd,
    getTagName: getName,
    inheritParentProps: inheritParentProps,
    mountTo: mount$1,
    selectTags: query,
    arrayishRemove: arrayishRemove,
    getTag: get,
    initChildTag: initChild,
    moveChildTag: moveChild,
    makeReplaceVirtual: makeReplaceVirtual,
    getImmediateCustomParentTag: getImmediateCustomParent,
    makeVirtual: makeVirtual,
    moveVirtual: moveVirtual,
    unmountAll: unmountAll,
    createIfDirective: createIfDirective,
    createRefDirective: createRefDirective
  });

  /**
   * Riot public api
   */
  var settings$1 = settings;
  var util = {
    tmpl: tmpl,
    brackets: brackets,
    styleManager: styleManager,
    vdom: __TAGS_CACHE,
    styleNode: styleManager.styleNode,
    // export the riot internal utils as well
    dom: dom,
    check: check,
    misc: misc,
    tags: tags
  };

  // export the core props/methods
  var Tag$1 = Tag;
  var tag$1 = tag;
  var tag2$1 = tag2;
  var mount$2 = mount;
  var mixin$1 = mixin;
  var update$2 = update$1;
  var unregister$1 = unregister;
  var version$1 = version;
  var observable$1 = observable;

  var riot$1 = extend({}, core, {
    observable: observable,
    settings: settings$1,
    util: util,
  });

  exports.settings = settings$1;
  exports.util = util;
  exports.Tag = Tag$1;
  exports.tag = tag$1;
  exports.tag2 = tag2$1;
  exports.mount = mount$2;
  exports.mixin = mixin$1;
  exports.update = update$2;
  exports.unregister = unregister$1;
  exports.version = version$1;
  exports.observable = observable$1;
  exports.default = riot$1;

  Object.defineProperty(exports, '__esModule', { value: true });

})));

Added public/riot-3.13.2/riot.min.js.

cannot compute difference between binary files

Added public/riot-3.13.2/test/helpers/index.js.











































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
const expect = chai.expect

export const IE_VERSION = (window && window.document || {}).documentMode | 0

// this export function is needed to run the tests also on ie8
// ie8 returns some weird strings when we try to get the innerHTML of a tag
export function normalizeHTML(html) {
  return html
    .trim()
    // change all the tags properties and names to lowercase because a <li> for ie8 is a <LI>
    .replace(/<([^>]*)>/g, function(tag) { return tag.toLowerCase() })
    .replace(/[\r\n\t]+/g, '')
    .replace(/>\s+</g, '><')
}

export function expectHTML(tagOrDom) {
  var dom = tagOrDom.root ? tagOrDom.root : tagOrDom
  return expect(normalizeHTML(dom.innerHTML))
}

export function getPreviousSibling(n) {
  var x = n.previousSibling
  while (x.nodeType !== 1) {
    x = x.previousSibling
  }
  return x
}

export function getNextSibling(n) {
  var x = n.previousSibling
  while (x.nodeType !== 1) {
    x = x.previousSibling
  }
  return x
}

export function getRiotStyles(riot) {
  // util.injectStyle must add <style> in head, not in body -- corrected
  var stag = riot.util.styleNode || document.querySelector('style')
  return normalizeHTML(stag.styleSheet ? stag.styleSheet.cssText : stag.innerHTML)
}

/**
 * Shorter and fast way to select multiple nodes in the DOM
 * @param   { String } selector - DOM selector
 * @param   { Object } ctx - DOM node where the targets of our search will is located
 * @returns { Object } dom nodes found
 */
export function $$() {
  return riot.util.dom.$$.apply(this, arguments)
}

/**
 * Shorter and fast way to select a single node in the DOM
 * @param   { String } selector - unique dom selector
 * @param   { Object } ctx - DOM node where the target of our search will is located
 * @returns { Object } dom node found
 */
export function $() {
  return riot.util.dom.$.apply(this, arguments)
}


export function injectHTML(html) {
  var div = document.createElement('div')
  div.innerHTML = html instanceof Array ? html.join('\n') : html
  while (div.firstChild) {
    document.body.appendChild(div.firstChild)
  }
}

export function getCarrotPos(dom) {
  if (dom.selectionStart !== null)
    return dom.selectionStart

  if (document.selection === null)
    return null

  var range = document.selection.createRange()
  range.moveStart('character', -dom.value.length)
  return range.text.length
}

export function setCarrotPos(dom, pos) {
  if (dom.setSelectionRange !== null) {
    dom.setSelectionRange(pos, pos)
    return
  }

  var range = dom.createTextRange()
  range.collapse(true)
  range.moveEnd('character', pos)
  range.moveStart('character', pos)
  range.select()
}

export function fireEvent(el, name) {
  var e = document.createEvent('HTMLEvents')
  e.initEvent(name, false, true)
  el.dispatchEvent(e)
}

Added public/riot-3.13.2/test/helpers/polyfills.js.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// small polyfill
// normalize the document.contains method
document.contains = Element.prototype.contains = function contains(node) {
  if (!(0 in arguments)) {
    throw new TypeError('1 argument is required')
  }
  do {
    if (this === node) {
      return true
    }
  } while (node = node && node.parentNode)
  return false
}

function CE( event, params ) {
  params = params || { bubbles: false, cancelable: false, detail: undefined }
  var evt = document.createEvent( 'CustomEvent' )
  evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail )
  return evt
}

if (typeof window.CustomEvent !== 'function') {
  CE.prototype = window.Event.prototype
  window.CustomEvent = CE
}

Added public/riot-3.13.2/test/karma.conf.js.





































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
const saucelabsBrowsers = require('./saucelabs-browsers').browsers,
  RIOT_WITH_COMPILER_PATH = '../dist/riot/riot+compiler.js',
  RIOT_PATH = '../dist/riot/riot.js',
  isDebug = process.env.DEBUG,
  isSaucelabs = process.env.SAUCELABS,
  isTravis = !!process.env.TRAVIS_BUILD_NUMBER,
  // split the riot+compiler tests from the normal riot core tests
  testsSetup = './specs/browser/index.js',
  testFiles = `./specs/${process.env.TEST_FOLDER}/**/*.spec.js`,
  needsCompiler = /compiler/.test(process.env.TEST_FOLDER),
  preprocessors = {},
  browsers = isSaucelabs ? Object.keys(saucelabsBrowsers) : ['ChromeHeadlessNoSandbox']

module.exports = function(conf) {
  preprocessors[testFiles] = ['rollup']
  // enable the coverage for riot.js
  if (!needsCompiler && !isDebug) preprocessors[RIOT_PATH] = ['coverage']

  conf.set({
    basePath: '',
    autoWatch: true,
    frameworks: ['mocha'],
    proxies: {
      '/tag/': '/base/tag/'
    },
    files: [
      './helpers/polyfills.js',
      '../node_modules/chai/chai.js',
      '../node_modules/sinon/pkg/sinon.js',
      '../node_modules/sinon-chai/lib/sinon-chai.js',
      {
        pattern: 'tag/*.tag',
        served: true,
        included: false
      },
      needsCompiler ? RIOT_WITH_COMPILER_PATH : RIOT_PATH,
      testsSetup,
      testFiles
    ],
    sauceLabs: {
      build: 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + ' (' + process.env.TRAVIS_BUILD_ID + ')',
      tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER,
      testName: `riotjs${ needsCompiler ? '+compiler' : ''}`,
    },
    captureTimeout: 300000,
    browserNoActivityTimeout: 300000,
    browserDisconnectTolerance: 2,
    customLaunchers: Object.assign(
      {
        ChromeHeadlessNoSandbox: {
          base: 'ChromeHeadless',
          flags: ['--no-sandbox'],
        }
      },
      saucelabsBrowsers
    ),
    browsers: browsers,

    reporters: ['saucelabs']
      .concat(isSaucelabs ? [] : ['coverage'])
      .concat(isTravis ? [] : 'progress'),

    preprocessors: preprocessors,

    rollupPreprocessor: {
      // use our default rollup plugins adding also the riot plugin
      // to import dinamically the tags
      external: ['riot', 'external-helpers'],
      plugins: [
        require('rollup-plugin-riot')()
      ].concat(require('../config/defaults').plugins),
      output: {
        format: 'iife',
        globals: {
          riot: 'riot'
        }
      },
    },

    client: {
      mocha: {
        timeout: isSaucelabs ? 30000 : 3000, // saucelab tests can be really really slow
        // change Karma's debug.html to the mocha web reporter
        reporter: 'html'
      }
    },

    coverageReporter: {
      dir: '../coverage',
      reporters: [{
        type: 'lcov',
        subdir: 'report-lcov'
      }]
    },

    singleRun: true
  })
}

Added public/riot-3.13.2/test/performance/benchmarks/if.bench.js.































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const tmpl = `
  <div>
    <div if="{ flag }">
      <p>{ msg }</p>
    </div>
  </div>
`

module.exports = function(suite, testName, riot) {
  let tag
  suite
    .on('start', function() {
      var ifTag = document.createElement('if-tag')
      body.appendChild(ifTag)
      riot.tag('if-tag', tmpl,  function() {
        this.msg = 'hi'
        this.flag = false
      })
      tag = riot.mount('if-tag')[0]
    })
    .on('complete', function() {
      tag.unmount()
    })
    .add(testName, () => {
      tag.flag = true
      tag.update()
      tag.flag = false
      tag.update()
    })
}

Added public/riot-3.13.2/test/performance/benchmarks/index.js.













































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

const jsdom = require('jsdom')
const { JSDOM } = jsdom
const dom = new JSDOM('<body></body>')
global.document = dom.window.document
global.window = dom.window
global.body = dom.window.document.body
global.history = false

const
  Benchmark = require('benchmark'),
  suite = new Benchmark.Suite(),
  riotPath = process.argv[2],
  riot = require(riotPath),
  ifBench = require('./if.bench'),
  loopBench = require('./loop.bench'),
  loopBenchReverse = require('./loop-reverse.bench'),
  loopNoReorderBench = require('./loop-no-reorder.bench'),
  mountBench = require('./mount.bench')

console.log(`Testing: ${ riotPath }`)

// brand new
mountBench(suite, 'mount', riot)
ifBench(suite, 'if', riot)
loopBench(suite, 'loop', riot)
loopBenchReverse(suite, 'loop-reverse', riot)
loopNoReorderBench(suite, 'loop-no-reorder', riot)

suite
  .on('cycle', function(event) {
    var mem = (process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)
    console.log(String(event.target), `Memory usage: ${ mem } MiB`)
  })
  .on('error', function(e) {
    console.log(e.target.error)
  })
  .run({async: false})

Added public/riot-3.13.2/test/performance/benchmarks/loop-no-reorder.bench.js.



































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const tmpl = `
  <div>
    <div ref="items" each="{ item in items }" no-reorder>
      { item.name }
      <p each="{ prop in item.props }" no-reorder>
        { prop.name }
      </p>
    </div>
  </div>
`

module.exports = function(suite, testName, riot) {
  function generateItems(amount, hasChildren) {
    var items = []
    while (amount--) {
      items.push({
        name: 'foo',
        props: hasChildren ? generateItems(5, false) : []
      })
    }
    return items
  }

  let tag
  suite
    .on('start', function() {
      var loopTag = document.createElement('loop-tag-no-reorder')
      body.appendChild(loopTag)
      riot.tag('loop-tag-no-reorder', tmpl, function() {
        this.items = []
      })
      tag = riot.mount('loop-tag-no-reorder')[0]
    })
    .on('complete', function() {
      tag.unmount()
    })
    .add(testName, () => {
      tag.items = generateItems(10, true)
      tag.update()
      tag.items.splice(2, 1)
      tag.items.splice(4, 1)
      tag.items.splice(6, 1)
      tag.items.splice(9, 1)
      tag.items = tag.items.concat(generateItems(5, true))
      tag.update()
    })

}

Added public/riot-3.13.2/test/performance/benchmarks/loop-reverse.bench.js.























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
const tmpl = `
  <div>
    <div ref="items" each="{ item in items }">
      { item.name }
      <p if="{ item.props }" each="{ prop in item.props }">
        { prop.name }
      </p>
    </div>
  </div>
`

module.exports = function(suite, testName, riot) {
  function generateItems(amount, hasChildren) {
    var items = []
    while (amount--) {
      items.push({
        name: `foo ${ Math.random() }`,
        props: hasChildren ? generateItems(10, false) : false
      })
    }
    return items
  }
  let tag
  suite
    .on('start', function() {
    // setup
      var loopTag = document.createElement('loop-tag')
      body.appendChild(loopTag)
      riot.tag('loop-tag', tmpl, function() {
        this.items = generateItems(10, true)
      })
      tag = riot.mount('loop-tag')[0]
    })
    .on('complete', function() {
      tag.unmount()
    })
    .add(testName, () => {
      tag.items.reverse()
      tag.update()
    })

}

Added public/riot-3.13.2/test/performance/benchmarks/loop.bench.js.





































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const tmpl = `
  <div>
    <div ref="items" each="{ item in items }">
      { item.name }
      <p each="{ prop in item.props }">
        { prop.name }
      </p>
    </div>
  </div>
`

module.exports = function(suite, testName, riot) {
  function generateItems(amount, hasChildren) {
    var items = []
    while (amount--) {
      items.push({
        name: `foo ${ Math.random() }`,
        props: hasChildren ? generateItems(5, false) : []
      })
    }
    return items
  }
  let tag

  suite
    .on('start', function() {
    // setup
      var loopTag = document.createElement('loop-tag')
      body.appendChild(loopTag)
      riot.tag('loop-tag', tmpl, function() {
        this.items = []
      })
      tag = riot.mount('loop-tag')[0]
    })
    .on('complete', function() {
      tag.unmount()
    })
    .add(testName, () => {
      tag.items = generateItems(10, true)
      tag.update()
      tag.items.splice(2, 1)
      tag.items.splice(4, 1)
      tag.items.splice(6, 1)
      tag.items.splice(9, 1)
      tag.items = tag.items.concat(generateItems(5, true))
      tag.update()
    })

}

Added public/riot-3.13.2/test/performance/benchmarks/mount.bench.js.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module.exports = function(suite, testName, riot) {

  // setup
  var ifTag = document.createElement('mount-tag')
  body.appendChild(ifTag)
  riot.tag('mount-tag', '<p>{ msg }</p>', function() {
    this.msg = 'hi'
  })

  suite.add(testName, () => {
    var tag = riot.mount('mount-tag')[0]
    tag.update()
  })
}

Added public/riot-3.13.2/test/performance/db-monster/ENV.js.







































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
var ENV = ENV || (function() {

  var first = true;
  var counter = 0;
  var data;
  var _base;
  (_base = String.prototype).lpad || (_base.lpad = function(padding, toLength) {
    return padding.repeat((toLength - this.length) / padding.length).concat(this);
  });

  function formatElapsed(value) {
    var str = parseFloat(value).toFixed(2);
    if (value > 60) {
      minutes = Math.floor(value / 60);
      comps = (value % 60).toFixed(2).split('.');
      seconds = comps[0].lpad('0', 2);
      ms = comps[1];
      str = minutes + ":" + seconds + "." + ms;
    }
    return str;
  }

  function getElapsedClassName(elapsed) {
    var className = 'Query elapsed';
    if (elapsed >= 10.0) {
      className += ' warn_long';
    }
    else if (elapsed >= 1.0) {
      className += ' warn';
    }
    else {
      className += ' short';
    }
    return className;
  }

  function countClassName(queries) {
    var countClassName = "label";
    if (queries >= 20) {
      countClassName += " label-important";
    }
    else if (queries >= 10) {
      countClassName += " label-warning";
    }
    else {
      countClassName += " label-success";
    }
    return countClassName;
  }

  function updateQuery(object) {
    if (!object) {
      object = {};
    }
    var elapsed = Math.random() * 15;
    object.elapsed = elapsed;
    object.formatElapsed = formatElapsed(elapsed);
    object.elapsedClassName = getElapsedClassName(elapsed);
    object.query = "SELECT blah FROM something";
    object.waiting = Math.random() < 0.5;
    if (Math.random() < 0.2) {
      object.query = "<IDLE> in transaction";
    }
    if (Math.random() < 0.1) {
      object.query = "vacuum";
    }
    return object;
  }

  function cleanQuery(value) {
    if (value) {
      value.formatElapsed = "";
      value.elapsedClassName = "";
      value.query = "";
      value.elapsed = null;
      value.waiting = null;
    } else {
      return {
        query: "***",
        formatElapsed: "",
        elapsedClassName: ""
      };
    }
  }

  function generateRow(object, keepIdentity, counter) {
    var nbQueries = Math.floor((Math.random() * 10) + 1);
    if (!object) {
      object = {};
    }
    object.lastMutationId = counter;
    object.nbQueries = nbQueries;
    if (!object.lastSample) {
      object.lastSample = {};
    }
    if (!object.lastSample.topFiveQueries) {
      object.lastSample.topFiveQueries = [];
    }
    if (keepIdentity) {
      // for Angular optimization
      if (!object.lastSample.queries) {
        object.lastSample.queries = [];
        for (var l = 0; l < 12; l++) {
          object.lastSample.queries[l] = cleanQuery();
        }
      }
      for (var j in object.lastSample.queries) {
        var value = object.lastSample.queries[j];
        if (j <= nbQueries) {
          updateQuery(value);
        } else {
          cleanQuery(value);
        }
      }
    } else {
      object.lastSample.queries = [];
      for (var j = 0; j < 12; j++) {
        if (j < nbQueries) {
          var value = updateQuery(cleanQuery());
          object.lastSample.queries.push(value);
        } else {
          object.lastSample.queries.push(cleanQuery());
        }
      }
    }
    for (var i = 0; i < 5; i++) {
      var source = object.lastSample.queries[i];
      object.lastSample.topFiveQueries[i] = source;
    }
    object.lastSample.nbQueries = nbQueries;
    object.lastSample.countClassName = countClassName(nbQueries);
    return object;
  }

  function getData(keepIdentity) {
    var oldData = data;
    if (!keepIdentity) { // reset for each tick when !keepIdentity
      data = [];
      for (var i = 1; i <= ENV.rows; i++) {
        data.push({ dbname: 'cluster' + i, query: "", formatElapsed: "", elapsedClassName: "" });
        data.push({ dbname: 'cluster' + i + ' slave', query: "", formatElapsed: "", elapsedClassName: "" });
      }
    }
    if (!data) { // first init when keepIdentity
      data = [];
      for (var i = 1; i <= ENV.rows; i++) {
        data.push({ dbname: 'cluster' + i });
        data.push({ dbname: 'cluster' + i + ' slave' });
      }
      oldData = data;
    }
    for (var i in data) {
      var row = data[i];
      if (!keepIdentity && oldData && oldData[i]) {
        row.lastSample = oldData[i].lastSample;
      }
      if (!row.lastSample || Math.random() < ENV.mutations()) {
        counter = counter + 1;
        if (!keepIdentity) {
          row.lastSample = null;
        }
        generateRow(row, keepIdentity, counter);
      } else {
        data[i] = oldData[i];
      }
    }
    first = false;
    return {
      toArray: function() {
        return data;
      }
    };
  }

  var mutationsValue = 0.5;

  function mutations(value) {
    if (value) {
      mutationsValue = value;
      return mutationsValue;
    } else {
      return mutationsValue;
    }
  }

  var body = document.querySelector('body');
  var theFirstChild = body.firstChild;

  var sliderContainer = document.createElement( 'div' );
  sliderContainer.style.cssText = "display: flex";
  var slider = document.createElement('input');
  var text = document.createElement('label');
  text.innerHTML = 'mutations : ' + (mutationsValue * 100).toFixed(0) + '%';
  text.id = "ratioval";
  slider.setAttribute("type", "range");
  slider.style.cssText = 'margin-bottom: 10px; margin-top: 5px';
  slider.addEventListener('change', function(e) {
    ENV.mutations(e.target.value / 100);
    document.querySelector('#ratioval').innerHTML = 'mutations : ' + (ENV.mutations() * 100).toFixed(0) + '%';
  });
  sliderContainer.appendChild( text );
  sliderContainer.appendChild( slider );
  body.insertBefore( sliderContainer, theFirstChild );

  return  {
    generateData: getData,
    rows: 50,
    timeout: 0,
    mutations: mutations
  };
})();

Added public/riot-3.13.2/test/performance/db-monster/app.js.



>
1
riot.mount('dbmon')

Added public/riot-3.13.2/test/performance/db-monster/bootstrap.min.css.

cannot compute difference between binary files

Added public/riot-3.13.2/test/performance/db-monster/dbmon-no-reorder.tag.

























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<dbmon>
  <div>
    <table class="table table-striped latest-data">
      <tbody>
        <!-- Database -->
        <tr each={ databasesArray } no-reorder>
          <td class="dbname">
            { dbname }
          </td>
          <!-- Sample -->
          <td class="query-count">
            <span class={ lastSample.countClassName }>
              { lastSample.nbQueries }
            </span>
          </td>
          <!-- Query -->
          <td each={ lastSample.topFiveQueries } no-reorder class={ elapsedClassName }>
            { formatElapsed }
            <div class="popover left">
              <div class="popover-content">
                { query }
              </div>
              <div class="arrow"></div>
            </div>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
  <script>

    this.databasesArray = []

    loadSamples() {
      this.databasesArray = ENV.generateData().toArray()
      this.update()
      Monitoring.renderRate.ping()
      requestAnimationFrame(this.loadSamples)
    }

    this.loadSamples()

  </script>
</dbmon>

Added public/riot-3.13.2/test/performance/db-monster/dbmon.tag.

























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<dbmon>
  <div>
    <table class="table table-striped latest-data">
      <tbody>
        <!-- Database -->
        <tr each={ databasesArray }>
          <td class="dbname">
            { dbname }
          </td>
          <!-- Sample -->
          <td class="query-count">
            <span class={ lastSample.countClassName }>
              { lastSample.nbQueries }
            </span>
          </td>
          <!-- Query -->
          <td each={ lastSample.topFiveQueries } class={ elapsedClassName }>
            { formatElapsed }
            <div class="popover left">
              <div class="popover-content">
                { query }
              </div>
              <div class="arrow"></div>
            </div>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
  <script>

    this.databasesArray = []

    loadSamples() {
      this.databasesArray = ENV.generateData().toArray()
      this.update()
      Monitoring.renderRate.ping()
      requestAnimationFrame(this.loadSamples)
    }

    this.loadSamples()

  </script>
</dbmon>

Added public/riot-3.13.2/test/performance/db-monster/index.html.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<head>
  <link href="./bootstrap.min.css" rel="stylesheet" type="text/css" />
  <link href="./styles.css" rel="stylesheet" type="text/css" />
  <meta charset="utf-8">
  <title>dbmon (riot)</title>
</head>
<body>
  <dbmon></dbmon>
  <script src="./ENV.js"></script>
  <script src="./memory-stats.js"></script>
  <script src="./monitor.js"></script>
  <script src="dbmon.tag" type="riot/tag"></script>
  <script src="../../../dist/riot/riot%2Bcompiler.js"></script>
  <script src="app.js"></script>
</body>
</html>

Added public/riot-3.13.2/test/performance/db-monster/memory-stats.js.











































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
 * @author mrdoob / http://mrdoob.com/
 * @author jetienne / http://jetienne.com/
 * @author paulirish / http://paulirish.com/
 */
var MemoryStats = function (){

	var msMin	= 100;
	var msMax	= 0;

	var container	= document.createElement( 'div' );
	container.id	= 'stats';
	container.style.cssText = 'width:80px;opacity:0.9;cursor:pointer';

	var msDiv	= document.createElement( 'div' );
	msDiv.id	= 'ms';
	msDiv.style.cssText = 'padding:0 0 3px 3px;text-align:left;background-color:#020;';
	container.appendChild( msDiv );

	var msText	= document.createElement( 'div' );
	msText.id	= 'msText';
	msText.style.cssText = 'color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px';
	msText.innerHTML= 'Memory';
	msDiv.appendChild( msText );

	var msGraph	= document.createElement( 'div' );
	msGraph.id	= 'msGraph';
	msGraph.style.cssText = 'position:relative;width:74px;height:30px;background-color:#0f0';
	msDiv.appendChild( msGraph );

	while ( msGraph.children.length < 74 ) {

		var bar = document.createElement( 'span' );
		bar.style.cssText = 'width:1px;height:30px;float:left;background-color:#131';
		msGraph.appendChild( bar );

	}

	var updateGraph = function ( dom, height, color ) {

		var child = dom.appendChild( dom.firstChild );
		child.style.height = height + 'px';
		if( color ) child.style.backgroundColor = color;

	}

	var perf = window.performance || {};
	// polyfill usedJSHeapSize
	if (!perf && !perf.memory){
		perf.memory = { usedJSHeapSize : 0 };
	}
	if (perf && !perf.memory){
		perf.memory = { usedJSHeapSize : 0 };
	}

	// support of the API?
	if( perf.memory.totalJSHeapSize === 0 ){
		console.warn('totalJSHeapSize === 0... performance.memory is only available in Chrome .')
	}
	
	// TODO, add a sanity check to see if values are bucketed.
	// If so, reminde user to adopt the --enable-precise-memory-info flag.
	// open -a "/Applications/Google Chrome.app" --args --enable-precise-memory-info

	var lastTime	= Date.now();
	var lastUsedHeap= perf.memory.usedJSHeapSize;
	return {
		domElement: container,

		update: function () {

			// refresh only 30time per second
			if( Date.now() - lastTime < 1000/30 )	return;
			lastTime	= Date.now()

			var delta	= perf.memory.usedJSHeapSize - lastUsedHeap;
			lastUsedHeap	= perf.memory.usedJSHeapSize;
			var color	= delta < 0 ? '#830' : '#131';
			
			var ms	= perf.memory.usedJSHeapSize;
			msMin	= Math.min( msMin, ms );
			msMax	= Math.max( msMax, ms );
			msText.textContent = "Mem: " + bytesToSize(ms, 2);
			
			var normValue	= ms / (30*1024*1024);
			var height	= Math.min( 30, 30 - normValue * 30 );
			updateGraph( msGraph, height, color);
			
			function bytesToSize( bytes, nFractDigit ){
				var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
				if (bytes == 0) return 'n/a';
				nFractDigit	= nFractDigit !== undefined ? nFractDigit : 0;
				var precision	= Math.pow(10, nFractDigit);
				var i 		= Math.floor(Math.log(bytes) / Math.log(1024));
				return Math.round(bytes*precision / Math.pow(1024, i))/precision + ' ' + sizes[i];
			};
		}

	}
	
};

Added public/riot-3.13.2/test/performance/db-monster/monitor.js.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
var Monitoring = Monitoring || (function() {

  var stats = new MemoryStats();
  stats.domElement.style.position = 'fixed';
  stats.domElement.style.right        = '0px';
  stats.domElement.style.bottom       = '0px';
  document.body.appendChild( stats.domElement );
  requestAnimationFrame(function rAFloop(){
      stats.update();
      requestAnimationFrame(rAFloop);
  });

  var RenderRate = function () {
    var container = document.createElement( 'div' );
    container.id  = 'stats';
    container.style.cssText = 'width:150px;opacity:0.9;cursor:pointer;position:fixed;right:80px;bottom:0px;';

    var msDiv = document.createElement( 'div' );
    msDiv.id  = 'ms';
    msDiv.style.cssText = 'padding:0 0 3px 3px;text-align:left;background-color:#020;';
    container.appendChild( msDiv );

    var msText  = document.createElement( 'div' );
    msText.id = 'msText';
    msText.style.cssText = 'color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px';
    msText.innerHTML= 'Repaint rate: 0/sec';
    msDiv.appendChild( msText );

    var bucketSize = 20;
    var bucket = [];
    var lastTime  = Date.now();
    return {
      domElement: container,
      ping: function () {
        var start = lastTime;
        var stop = Date.now();
        var rate = 1000 / (stop - start);
        bucket.push(rate);
        if (bucket.length > bucketSize) {
          bucket.shift();
        }
        var sum = 0;
        for (var i = 0; i < bucket.length; i++) {
          sum = sum + bucket[i];
        }
        msText.textContent = "Repaint rate: " + (sum / bucket.length).toFixed(2) + "/sec";
        lastTime = stop;
      }
    }
  };

  var renderRate = new RenderRate();
  document.body.appendChild( renderRate.domElement );

  return {
    memoryStats: stats,
    renderRate: renderRate
  };
  
})();

Added public/riot-3.13.2/test/performance/db-monster/no-reorder.html.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<head>
  <link href="./bootstrap.min.css" rel="stylesheet" type="text/css" />
  <link href="./styles.css" rel="stylesheet" type="text/css" />
  <meta charset="utf-8">
  <title>dbmon (riot)</title>
</head>
<body>
  <dbmon></dbmon>
  <script src="./ENV.js"></script>
  <script src="./memory-stats.js"></script>
  <script src="./monitor.js"></script>
  <script src="dbmon-no-reorder.tag" type="riot/tag"></script>
  <script src="../../../dist/riot/riot%2Bcompiler.js"></script>
  <script src="app.js"></script>
</body>
</html>

Added public/riot-3.13.2/test/performance/db-monster/styles.css.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
.Query {
  position: relative;
}

.Query:hover .popover {
  left: -100%;
  width: 100%;
  display: block;
}

Added public/riot-3.13.2/test/performance/loop.html.

















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <my-tag></my-tag>

  <script src="../../dist/riot/riot+compiler.js"></script>

  <script>

  riot.tag('my-tag', '<div> <h1>Riot <button onclick="{ clicked }">reverse list</button> <span ref="timestamp"></span></h1> <h2 each="{ item, i in opts.items }">Line #{ item.value }, { i }</h2> </div>', function(opts) {

    var self = this,
      x = new Date().getTime()

    this.items = opts.items

    this.clicked = function() {
      x = new Date().getTime()
      self.items = this.items.reverse()
    }

    this.on('updated', function() {
      this.refs.timestamp.innerHTML = ' - Reversing took ' + ( new Date().getTime() - x ) + 'ms'
    })

  })

  var items = []
  for ( var i = 0; i < 10000; i++ ) {
    items.push( { value: i } )
  }
  riot.mount('*', { items: items } )[0]

  </script>

</body>
</html>

Added public/riot-3.13.2/test/performance/memory/index.js.



















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/**
 *
 * You can check the live example on here http://jsfiddle.net/gianlucaguarini/ftoLgfg3/
 *
 */

var riot = require('../../../dist/riot/riot'),
  jsdom = require('jsdom').JSDOM,
  myComponent = 'my-component',
  myComponentHTML = `
    '<h1>{ opts.title }</h1>',
    '<p>{ opts.description }</p>',
    '<my-list-item ref='itm' each="{ opts.items }">'
  `,
  result,
  myListItem = 'my-list-item',
  myListItemHTML = `
    '<input ref='input' type="checkbox" onchange="{ onChange }">',
    '<span if="{ opts.isActive }">I am active</span>'
  `


/**
 * Helper function to generate custom array
 * @param  { int } amount amount of entries in the array
 * @param  { * } data
 * @return array
 */


function generateItems (amount) {
  var items = []
  while (--amount) {
    items.push({
      isActive: false
    })
  }
  return items
}

/**
 * Check the memory usage analizing the heap
 * @param  { function } fn
 * @return { array } memory used + duration
 */

function measure(fn) {
  var startTime = Date.now()
  fn()
  global.gc()
  return [process.memoryUsage().heapUsed, Date.now() - startTime]
}

/**
 * Adding the custom tags to the riot internal cache
 */

function setupTags() {
  riot.tag(myComponent, myComponentHTML, function(opts) {
    var self = this
    function loop () {
      opts.items = generateItems(1000, {
        isActive: false
      })
      result = measure(self.update.bind(self))
      console.log(
        (result[0] / 1024 / 1024).toFixed(2) + ' MiB',
        result[1] + ' ms'
      )
      setTimeout(loop, 50)
    }
    loop()
  })
  riot.tag(myListItem, myListItemHTML, function (opts) {
    this.onChange = function (e) {
      opts.isActive = e.target.checked
    }
  })
}

/**
 *
 * Mount the custom tags passing some fake values
 *
 */

function mount() {
  riot.mount(myComponent, {
    title: 'hello world',
    description: 'mad world',
    items: generateItems(1000, {
      isActive: false
    })
  })
}


// Initialize the test
var doc = new jsdom(`<${myComponent}/>`)
global.window = doc.defaultView
global.document = doc.window.document

setupTags()
mount()

Added public/riot-3.13.2/test/performance/riot.2.6.1.js.



























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
/* Riot v2.6.1, @license MIT */

;(function(window, undefined) {
  'use strict';
var riot = { version: 'v2.6.1', settings: {} },
  // be aware, internal usage
  // ATTENTION: prefix the global dynamic variables with `__`

  // counter to give a unique id to all the Tag instances
  __uid = 0,
  // tags instances cache
  __virtualDom = [],
  // tags implementation cache
  __tagImpl = {},

  /**
   * Const
   */
  GLOBAL_MIXIN = '__global_mixin',

  // riot specific prefixes
  RIOT_PREFIX = 'riot-',
  RIOT_TAG = RIOT_PREFIX + 'tag',
  RIOT_TAG_IS = 'data-is',

  // for typeof == '' comparisons
  T_STRING = 'string',
  T_OBJECT = 'object',
  T_UNDEF  = 'undefined',
  T_FUNCTION = 'function',
  XLINK_NS = 'http://www.w3.org/1999/xlink',
  XLINK_REGEX = /^xlink:(\w+)/,
  // special native tags that cannot be treated like the others
  SPECIAL_TAGS_REGEX = /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/,
  RESERVED_WORDS_BLACKLIST = /^(?:_(?:item|id|parent)|update|root|(?:un)?mount|mixin|is(?:Mounted|Loop)|tags|parent|opts|trigger|o(?:n|ff|ne))$/,
  // SVG tags list https://www.w3.org/TR/SVG/attindex.html#PresentationAttributes
  SVG_TAGS_LIST = ['altGlyph', 'animate', 'animateColor', 'circle', 'clipPath', 'defs', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feFlood', 'feGaussianBlur', 'feImage', 'feMerge', 'feMorphology', 'feOffset', 'feSpecularLighting', 'feTile', 'feTurbulence', 'filter', 'font', 'foreignObject', 'g', 'glyph', 'glyphRef', 'image', 'line', 'linearGradient', 'marker', 'mask', 'missing-glyph', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'switch', 'symbol', 'text', 'textPath', 'tref', 'tspan', 'use'],

  // version# for IE 8-11, 0 for others
  IE_VERSION = (window && window.document || {}).documentMode | 0,

  // detect firefox to fix #1374
  FIREFOX = window && !!window.InstallTrigger
/* istanbul ignore next */
riot.observable = function(el) {

  /**
   * Extend the original object or create a new empty one
   * @type { Object }
   */

  el = el || {}

  /**
   * Private variables
   */
  var callbacks = {},
    slice = Array.prototype.slice

  /**
   * Private Methods
   */

  /**
   * Helper function needed to get and loop all the events in a string
   * @param   { String }   e - event string
   * @param   {Function}   fn - callback
   */
  function onEachEvent(e, fn) {
    var es = e.split(' '), l = es.length, i = 0
    for (; i < l; i++) {
      var name = es[i]
      if (name) fn(name, i)
    }
  }

  /**
   * Public Api
   */

  // extend the el object adding the observable methods
  Object.defineProperties(el, {
    /**
     * Listen to the given space separated list of `events` and
     * execute the `callback` each time an event is triggered.
     * @param  { String } events - events ids
     * @param  { Function } fn - callback function
     * @returns { Object } el
     */
    on: {
      value: function(events, fn) {
        if (typeof fn != 'function')  return el

        onEachEvent(events, function(name, pos) {
          (callbacks[name] = callbacks[name] || []).push(fn)
          fn.typed = pos > 0
        })

        return el
      },
      enumerable: false,
      writable: false,
      configurable: false
    },

    /**
     * Removes the given space separated list of `events` listeners
     * @param   { String } events - events ids
     * @param   { Function } fn - callback function
     * @returns { Object } el
     */
    off: {
      value: function(events, fn) {
        if (events == '*' && !fn) callbacks = {}
        else {
          onEachEvent(events, function(name, pos) {
            if (fn) {
              var arr = callbacks[name]
              for (var i = 0, cb; cb = arr && arr[i]; ++i) {
                if (cb == fn) arr.splice(i--, 1)
              }
            } else delete callbacks[name]
          })
        }
        return el
      },
      enumerable: false,
      writable: false,
      configurable: false
    },

    /**
     * Listen to the given space separated list of `events` and
     * execute the `callback` at most once
     * @param   { String } events - events ids
     * @param   { Function } fn - callback function
     * @returns { Object } el
     */
    one: {
      value: function(events, fn) {
        function on() {
          el.off(events, on)
          fn.apply(el, arguments)
        }
        return el.on(events, on)
      },
      enumerable: false,
      writable: false,
      configurable: false
    },

    /**
     * Execute all callback functions that listen to
     * the given space separated list of `events`
     * @param   { String } events - events ids
     * @returns { Object } el
     */
    trigger: {
      value: function(events) {

        // getting the arguments
        var arglen = arguments.length - 1,
          args = new Array(arglen),
          fns

        for (var i = 0; i < arglen; i++) {
          args[i] = arguments[i + 1] // skip first argument
        }

        onEachEvent(events, function(name, pos) {

          fns = slice.call(callbacks[name] || [], 0)

          for (var i = 0, fn; fn = fns[i]; ++i) {
            if (fn.busy) continue
            fn.busy = 1
            fn.apply(el, fn.typed ? [name].concat(args) : args)
            if (fns[i] !== fn) { i-- }
            fn.busy = 0
          }

          if (callbacks['*'] && name != '*')
            el.trigger.apply(el, ['*', name].concat(args))

        })

        return el
      },
      enumerable: false,
      writable: false,
      configurable: false
    }
  })

  return el

}
/* istanbul ignore next */
;(function(riot) {

/**
 * Simple client-side router
 * @module riot-route
 */


var RE_ORIGIN = /^.+?\/\/+[^\/]+/,
  EVENT_LISTENER = 'EventListener',
  REMOVE_EVENT_LISTENER = 'remove' + EVENT_LISTENER,
  ADD_EVENT_LISTENER = 'add' + EVENT_LISTENER,
  HAS_ATTRIBUTE = 'hasAttribute',
  REPLACE = 'replace',
  POPSTATE = 'popstate',
  HASHCHANGE = 'hashchange',
  TRIGGER = 'trigger',
  MAX_EMIT_STACK_LEVEL = 3,
  win = typeof window != 'undefined' && window,
  doc = typeof document != 'undefined' && document,
  hist = win && history,
  loc = win && (hist.location || win.location), // see html5-history-api
  prot = Router.prototype, // to minify more
  clickEvent = doc && doc.ontouchstart ? 'touchstart' : 'click',
  started = false,
  central = riot.observable(),
  routeFound = false,
  debouncedEmit,
  base, current, parser, secondParser, emitStack = [], emitStackLevel = 0

/**
 * Default parser. You can replace it via router.parser method.
 * @param {string} path - current path (normalized)
 * @returns {array} array
 */
function DEFAULT_PARSER(path) {
  return path.split(/[/?#]/)
}

/**
 * Default parser (second). You can replace it via router.parser method.
 * @param {string} path - current path (normalized)
 * @param {string} filter - filter string (normalized)
 * @returns {array} array
 */
function DEFAULT_SECOND_PARSER(path, filter) {
  var re = new RegExp('^' + filter[REPLACE](/\*/g, '([^/?#]+?)')[REPLACE](/\.\./, '.*') + '$'),
    args = path.match(re)

  if (args) return args.slice(1)
}

/**
 * Simple/cheap debounce implementation
 * @param   {function} fn - callback
 * @param   {number} delay - delay in seconds
 * @returns {function} debounced function
 */
function debounce(fn, delay) {
  var t
  return function () {
    clearTimeout(t)
    t = setTimeout(fn, delay)
  }
}

/**
 * Set the window listeners to trigger the routes
 * @param {boolean} autoExec - see route.start
 */
function start(autoExec) {
  debouncedEmit = debounce(emit, 1)
  win[ADD_EVENT_LISTENER](POPSTATE, debouncedEmit)
  win[ADD_EVENT_LISTENER](HASHCHANGE, debouncedEmit)
  doc[ADD_EVENT_LISTENER](clickEvent, click)
  if (autoExec) emit(true)
}

/**
 * Router class
 */
function Router() {
  this.$ = []
  riot.observable(this) // make it observable
  central.on('stop', this.s.bind(this))
  central.on('emit', this.e.bind(this))
}

function normalize(path) {
  return path[REPLACE](/^\/|\/$/, '')
}

function isString(str) {
  return typeof str == 'string'
}

/**
 * Get the part after domain name
 * @param {string} href - fullpath
 * @returns {string} path from root
 */
function getPathFromRoot(href) {
  return (href || loc.href)[REPLACE](RE_ORIGIN, '')
}

/**
 * Get the part after base
 * @param {string} href - fullpath
 * @returns {string} path from base
 */
function getPathFromBase(href) {
  return base[0] == '#'
    ? (href || loc.href || '').split(base)[1] || ''
    : (loc ? getPathFromRoot(href) : href || '')[REPLACE](base, '')
}

function emit(force) {
  // the stack is needed for redirections
  var isRoot = emitStackLevel == 0, first
  if (MAX_EMIT_STACK_LEVEL <= emitStackLevel) return

  emitStackLevel++
  emitStack.push(function() {
    var path = getPathFromBase()
    if (force || path != current) {
      central[TRIGGER]('emit', path)
      current = path
    }
  })
  if (isRoot) {
    while (first = emitStack.shift()) first() // stack increses within this call
    emitStackLevel = 0
  }
}

function click(e) {
  if (
    e.which != 1 // not left click
    || e.metaKey || e.ctrlKey || e.shiftKey // or meta keys
    || e.defaultPrevented // or default prevented
  ) return

  var el = e.target
  while (el && el.nodeName != 'A') el = el.parentNode

  if (
    !el || el.nodeName != 'A' // not A tag
    || el[HAS_ATTRIBUTE]('download') // has download attr
    || !el[HAS_ATTRIBUTE]('href') // has no href attr
    || el.target && el.target != '_self' // another window or frame
    || el.href.indexOf(loc.href.match(RE_ORIGIN)[0]) == -1 // cross origin
  ) return

  if (el.href != loc.href
    && (
      el.href.split('#')[0] == loc.href.split('#')[0] // internal jump
      || base[0] != '#' && getPathFromRoot(el.href).indexOf(base) !== 0 // outside of base
      || base[0] == '#' && el.href.split(base)[0] != loc.href.split(base)[0] // outside of #base
      || !go(getPathFromBase(el.href), el.title || doc.title) // route not found
    )) return

  e.preventDefault()
}

/**
 * Go to the path
 * @param {string} path - destination path
 * @param {string} title - page title
 * @param {boolean} shouldReplace - use replaceState or pushState
 * @returns {boolean} - route not found flag
 */
function go(path, title, shouldReplace) {
  // Server-side usage: directly execute handlers for the path
  if (!hist) return central[TRIGGER]('emit', getPathFromBase(path))

  path = base + normalize(path)
  title = title || doc.title
  // browsers ignores the second parameter `title`
  shouldReplace
    ? hist.replaceState(null, title, path)
    : hist.pushState(null, title, path)
  // so we need to set it manually
  doc.title = title
  routeFound = false
  emit()
  return routeFound
}

/**
 * Go to path or set action
 * a single string:                go there
 * two strings:                    go there with setting a title
 * two strings and boolean:        replace history with setting a title
 * a single function:              set an action on the default route
 * a string/RegExp and a function: set an action on the route
 * @param {(string|function)} first - path / action / filter
 * @param {(string|RegExp|function)} second - title / action
 * @param {boolean} third - replace flag
 */
prot.m = function(first, second, third) {
  if (isString(first) && (!second || isString(second))) go(first, second, third || false)
  else if (second) this.r(first, second)
  else this.r('@', first)
}

/**
 * Stop routing
 */
prot.s = function() {
  this.off('*')
  this.$ = []
}

/**
 * Emit
 * @param {string} path - path
 */
prot.e = function(path) {
  this.$.concat('@').some(function(filter) {
    var args = (filter == '@' ? parser : secondParser)(normalize(path), normalize(filter))
    if (typeof args != 'undefined') {
      this[TRIGGER].apply(null, [filter].concat(args))
      return routeFound = true // exit from loop
    }
  }, this)
}

/**
 * Register route
 * @param {string} filter - filter for matching to url
 * @param {function} action - action to register
 */
prot.r = function(filter, action) {
  if (filter != '@') {
    filter = '/' + normalize(filter)
    this.$.push(filter)
  }
  this.on(filter, action)
}

var mainRouter = new Router()
var route = mainRouter.m.bind(mainRouter)

/**
 * Create a sub router
 * @returns {function} the method of a new Router object
 */
route.create = function() {
  var newSubRouter = new Router()
  // assign sub-router's main method
  var router = newSubRouter.m.bind(newSubRouter)
  // stop only this sub-router
  router.stop = newSubRouter.s.bind(newSubRouter)
  return router
}

/**
 * Set the base of url
 * @param {(str|RegExp)} arg - a new base or '#' or '#!'
 */
route.base = function(arg) {
  base = arg || '#'
  current = getPathFromBase() // recalculate current path
}

/** Exec routing right now **/
route.exec = function() {
  emit(true)
}

/**
 * Replace the default router to yours
 * @param {function} fn - your parser function
 * @param {function} fn2 - your secondParser function
 */
route.parser = function(fn, fn2) {
  if (!fn && !fn2) {
    // reset parser for testing...
    parser = DEFAULT_PARSER
    secondParser = DEFAULT_SECOND_PARSER
  }
  if (fn) parser = fn
  if (fn2) secondParser = fn2
}

/**
 * Helper function to get url query as an object
 * @returns {object} parsed query
 */
route.query = function() {
  var q = {}
  var href = loc.href || current
  href[REPLACE](/[?&](.+?)=([^&]*)/g, function(_, k, v) { q[k] = v })
  return q
}

/** Stop routing **/
route.stop = function () {
  if (started) {
    if (win) {
      win[REMOVE_EVENT_LISTENER](POPSTATE, debouncedEmit)
      win[REMOVE_EVENT_LISTENER](HASHCHANGE, debouncedEmit)
      doc[REMOVE_EVENT_LISTENER](clickEvent, click)
    }
    central[TRIGGER]('stop')
    started = false
  }
}

/**
 * Start routing
 * @param {boolean} autoExec - automatically exec after starting if true
 */
route.start = function (autoExec) {
  if (!started) {
    if (win) {
      if (document.readyState == 'complete') start(autoExec)
      // the timeout is needed to solve
      // a weird safari bug https://github.com/riot/route/issues/33
      else win[ADD_EVENT_LISTENER]('load', function() {
        setTimeout(function() { start(autoExec) }, 1)
      })
    }
    started = true
  }
}

/** Prepare the router **/
route.base()
route.parser()

riot.route = route
})(riot)
/* istanbul ignore next */

/**
 * The riot template engine
 * @version v2.4.1
 */
/**
 * riot.util.brackets
 *
 * - `brackets    ` - Returns a string or regex based on its parameter
 * - `brackets.set` - Change the current riot brackets
 *
 * @module
 */

var brackets = (function (UNDEF) {

  var
    REGLOB = 'g',

    R_MLCOMMS = /\/\*[^*]*\*+(?:[^*\/][^*]*\*+)*\//g,

    R_STRINGS = /"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'/g,

    S_QBLOCKS = R_STRINGS.source + '|' +
      /(?:\breturn\s+|(?:[$\w\)\]]|\+\+|--)\s*(\/)(?![*\/]))/.source + '|' +
      /\/(?=[^*\/])[^[\/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[\/\\]*)*?(\/)[gim]*/.source,

    UNSUPPORTED = RegExp('[\\' + 'x00-\\x1F<>a-zA-Z0-9\'",;\\\\]'),

    NEED_ESCAPE = /(?=[[\]()*+?.^$|])/g,

    FINDBRACES = {
      '(': RegExp('([()])|'   + S_QBLOCKS, REGLOB),
      '[': RegExp('([[\\]])|' + S_QBLOCKS, REGLOB),
      '{': RegExp('([{}])|'   + S_QBLOCKS, REGLOB)
    },

    DEFAULT = '{ }'

  var _pairs = [
    '{', '}',
    '{', '}',
    /{[^}]*}/,
    /\\([{}])/g,
    /\\({)|{/g,
    RegExp('\\\\(})|([[({])|(})|' + S_QBLOCKS, REGLOB),
    DEFAULT,
    /^\s*{\^?\s*([$\w]+)(?:\s*,\s*(\S+))?\s+in\s+(\S.*)\s*}/,
    /(^|[^\\]){=[\S\s]*?}/
  ]

  var
    cachedBrackets = UNDEF,
    _regex,
    _cache = [],
    _settings

  function _loopback (re) { return re }

  function _rewrite (re, bp) {
    if (!bp) bp = _cache
    return new RegExp(
      re.source.replace(/{/g, bp[2]).replace(/}/g, bp[3]), re.global ? REGLOB : ''
    )
  }

  function _create (pair) {
    if (pair === DEFAULT) return _pairs

    var arr = pair.split(' ')

    if (arr.length !== 2 || UNSUPPORTED.test(pair)) {
      throw new Error('Unsupported brackets "' + pair + '"')
    }
    arr = arr.concat(pair.replace(NEED_ESCAPE, '\\').split(' '))

    arr[4] = _rewrite(arr[1].length > 1 ? /{[\S\s]*?}/ : _pairs[4], arr)
    arr[5] = _rewrite(pair.length > 3 ? /\\({|})/g : _pairs[5], arr)
    arr[6] = _rewrite(_pairs[6], arr)
    arr[7] = RegExp('\\\\(' + arr[3] + ')|([[({])|(' + arr[3] + ')|' + S_QBLOCKS, REGLOB)
    arr[8] = pair
    return arr
  }

  function _brackets (reOrIdx) {
    return reOrIdx instanceof RegExp ? _regex(reOrIdx) : _cache[reOrIdx]
  }

  _brackets.split = function split (str, tmpl, _bp) {
    // istanbul ignore next: _bp is for the compiler
    if (!_bp) _bp = _cache

    var
      parts = [],
      match,
      isexpr,
      start,
      pos,
      re = _bp[6]

    isexpr = start = re.lastIndex = 0

    while ((match = re.exec(str))) {

      pos = match.index

      if (isexpr) {

        if (match[2]) {
          re.lastIndex = skipBraces(str, match[2], re.lastIndex)
          continue
        }
        if (!match[3]) {
          continue
        }
      }

      if (!match[1]) {
        unescapeStr(str.slice(start, pos))
        start = re.lastIndex
        re = _bp[6 + (isexpr ^= 1)]
        re.lastIndex = start
      }
    }

    if (str && start < str.length) {
      unescapeStr(str.slice(start))
    }

    return parts

    function unescapeStr (s) {
      if (tmpl || isexpr) {
        parts.push(s && s.replace(_bp[5], '$1'))
      } else {
        parts.push(s)
      }
    }

    function skipBraces (s, ch, ix) {
      var
        match,
        recch = FINDBRACES[ch]

      recch.lastIndex = ix
      ix = 1
      while ((match = recch.exec(s))) {
        if (match[1] &&
          !(match[1] === ch ? ++ix : --ix)) break
      }
      return ix ? s.length : recch.lastIndex
    }
  }

  _brackets.hasExpr = function hasExpr (str) {
    return _cache[4].test(str)
  }

  _brackets.loopKeys = function loopKeys (expr) {
    var m = expr.match(_cache[9])

    return m
      ? { key: m[1], pos: m[2], val: _cache[0] + m[3].trim() + _cache[1] }
      : { val: expr.trim() }
  }

  _brackets.array = function array (pair) {
    return pair ? _create(pair) : _cache
  }

  function _reset (pair) {
    if ((pair || (pair = DEFAULT)) !== _cache[8]) {
      _cache = _create(pair)
      _regex = pair === DEFAULT ? _loopback : _rewrite
      _cache[9] = _regex(_pairs[9])
    }
    cachedBrackets = pair
  }

  function _setSettings (o) {
    var b

    o = o || {}
    b = o.brackets
    Object.defineProperty(o, 'brackets', {
      set: _reset,
      get: function () { return cachedBrackets },
      enumerable: true
    })
    _settings = o
    _reset(b)
  }

  Object.defineProperty(_brackets, 'settings', {
    set: _setSettings,
    get: function () { return _settings }
  })

  /* istanbul ignore next: in the browser riot is always in the scope */
  _brackets.settings = typeof riot !== 'undefined' && riot.settings || {}
  _brackets.set = _reset

  _brackets.R_STRINGS = R_STRINGS
  _brackets.R_MLCOMMS = R_MLCOMMS
  _brackets.S_QBLOCKS = S_QBLOCKS

  return _brackets

})()

/**
 * @module tmpl
 *
 * tmpl          - Root function, returns the template value, render with data
 * tmpl.hasExpr  - Test the existence of a expression inside a string
 * tmpl.loopKeys - Get the keys for an 'each' loop (used by `_each`)
 */

var tmpl = (function () {

  var _cache = {}

  function _tmpl (str, data) {
    if (!str) return str

    return (_cache[str] || (_cache[str] = _create(str))).call(data, _logErr)
  }

  _tmpl.haveRaw = brackets.hasRaw

  _tmpl.hasExpr = brackets.hasExpr

  _tmpl.loopKeys = brackets.loopKeys

  // istanbul ignore next
  _tmpl.clearCache = function () { _cache = {} }

  _tmpl.errorHandler = null

  function _logErr (err, ctx) {

    if (_tmpl.errorHandler) {

      err.riotData = {
        tagName: ctx && ctx.root && ctx.root.tagName,
        _riot_id: ctx && ctx._riot_id  //eslint-disable-line camelcase
      }
      _tmpl.errorHandler(err)
    }
  }

  function _create (str) {
    var expr = _getTmpl(str)

    if (expr.slice(0, 11) !== 'try{return ') expr = 'return ' + expr

    return new Function('E', expr + ';')    // eslint-disable-line no-new-func
  }

  var
    CH_IDEXPR = '\u2057',
    RE_CSNAME = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/,
    RE_QBLOCK = RegExp(brackets.S_QBLOCKS, 'g'),
    RE_DQUOTE = /\u2057/g,
    RE_QBMARK = /\u2057(\d+)~/g

  function _getTmpl (str) {
    var
      qstr = [],
      expr,
      parts = brackets.split(str.replace(RE_DQUOTE, '"'), 1)

    if (parts.length > 2 || parts[0]) {
      var i, j, list = []

      for (i = j = 0; i < parts.length; ++i) {

        expr = parts[i]

        if (expr && (expr = i & 1

            ? _parseExpr(expr, 1, qstr)

            : '"' + expr
                .replace(/\\/g, '\\\\')
                .replace(/\r\n?|\n/g, '\\n')
                .replace(/"/g, '\\"') +
              '"'

          )) list[j++] = expr

      }

      expr = j < 2 ? list[0]
           : '[' + list.join(',') + '].join("")'

    } else {

      expr = _parseExpr(parts[1], 0, qstr)
    }

    if (qstr[0]) {
      expr = expr.replace(RE_QBMARK, function (_, pos) {
        return qstr[pos]
          .replace(/\r/g, '\\r')
          .replace(/\n/g, '\\n')
      })
    }
    return expr
  }

  var
    RE_BREND = {
      '(': /[()]/g,
      '[': /[[\]]/g,
      '{': /[{}]/g
    }

  function _parseExpr (expr, asText, qstr) {

    expr = expr
          .replace(RE_QBLOCK, function (s, div) {
            return s.length > 2 && !div ? CH_IDEXPR + (qstr.push(s) - 1) + '~' : s
          })
          .replace(/\s+/g, ' ').trim()
          .replace(/\ ?([[\({},?\.:])\ ?/g, '$1')

    if (expr) {
      var
        list = [],
        cnt = 0,
        match

      while (expr &&
            (match = expr.match(RE_CSNAME)) &&
            !match.index
        ) {
        var
          key,
          jsb,
          re = /,|([[{(])|$/g

        expr = RegExp.rightContext
        key  = match[2] ? qstr[match[2]].slice(1, -1).trim().replace(/\s+/g, ' ') : match[1]

        while (jsb = (match = re.exec(expr))[1]) skipBraces(jsb, re)

        jsb  = expr.slice(0, match.index)
        expr = RegExp.rightContext

        list[cnt++] = _wrapExpr(jsb, 1, key)
      }

      expr = !cnt ? _wrapExpr(expr, asText)
           : cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0]
    }
    return expr

    function skipBraces (ch, re) {
      var
        mm,
        lv = 1,
        ir = RE_BREND[ch]

      ir.lastIndex = re.lastIndex
      while (mm = ir.exec(expr)) {
        if (mm[0] === ch) ++lv
        else if (!--lv) break
      }
      re.lastIndex = lv ? expr.length : ir.lastIndex
    }
  }

  // istanbul ignore next: not both
  var // eslint-disable-next-line max-len
    JS_CONTEXT = '"in this?this:' + (typeof window !== 'object' ? 'global' : 'window') + ').',
    JS_VARNAME = /[,{][$\w]+(?=:)|(^ *|[^$\w\.])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\w]))([$_A-Za-z][$\w]*)/g,
    JS_NOPROPS = /^(?=(\.[$\w]+))\1(?:[^.[(]|$)/

  function _wrapExpr (expr, asText, key) {
    var tb

    expr = expr.replace(JS_VARNAME, function (match, p, mvar, pos, s) {
      if (mvar) {
        pos = tb ? 0 : pos + match.length

        if (mvar !== 'this' && mvar !== 'global' && mvar !== 'window') {
          match = p + '("' + mvar + JS_CONTEXT + mvar
          if (pos) tb = (s = s[pos]) === '.' || s === '(' || s === '['
        } else if (pos) {
          tb = !JS_NOPROPS.test(s.slice(pos))
        }
      }
      return match
    })

    if (tb) {
      expr = 'try{return ' + expr + '}catch(e){E(e,this)}'
    }

    if (key) {

      expr = (tb
          ? 'function(){' + expr + '}.call(this)' : '(' + expr + ')'
        ) + '?"' + key + '":""'

    } else if (asText) {

      expr = 'function(v){' + (tb
          ? expr.replace('return ', 'v=') : 'v=(' + expr + ')'
        ) + ';return v||v===0?v:""}.call(this)'
    }

    return expr
  }

  _tmpl.version = brackets.version = 'v2.4.1'

  return _tmpl

})()

/*
  lib/browser/tag/mkdom.js

  Includes hacks needed for the Internet Explorer version 9 and below
  See: http://kangax.github.io/compat-table/es5/#ie8
       http://codeplanet.io/dropping-ie8/
*/
var mkdom = (function _mkdom() {
  var
    reHasYield  = /<yield\b/i,
    reYieldAll  = /<yield\s*(?:\/>|>([\S\s]*?)<\/yield\s*>|>)/ig,
    reYieldSrc  = /<yield\s+to=['"]([^'">]*)['"]\s*>([\S\s]*?)<\/yield\s*>/ig,
    reYieldDest = /<yield\s+from=['"]?([-\w]+)['"]?\s*(?:\/>|>([\S\s]*?)<\/yield\s*>)/ig
  var
    rootEls = { tr: 'tbody', th: 'tr', td: 'tr', col: 'colgroup' },
    tblTags = IE_VERSION && IE_VERSION < 10
      ? SPECIAL_TAGS_REGEX : /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/

  /**
   * Creates a DOM element to wrap the given content. Normally an `DIV`, but can be
   * also a `TABLE`, `SELECT`, `TBODY`, `TR`, or `COLGROUP` element.
   *
   * @param   {string} templ  - The template coming from the custom tag definition
   * @param   {string} [html] - HTML content that comes from the DOM element where you
   *           will mount the tag, mostly the original tag in the page
   * @returns {HTMLElement} DOM element with _templ_ merged through `YIELD` with the _html_.
   */
  function _mkdom(templ, html) {
    var
      match   = templ && templ.match(/^\s*<([-\w]+)/),
      tagName = match && match[1].toLowerCase(),
      el = mkEl('div', isSVGTag(tagName))

    // replace all the yield tags with the tag inner html
    templ = replaceYield(templ, html)

    /* istanbul ignore next */
    if (tblTags.test(tagName))
      el = specialTags(el, templ, tagName)
    else
      setInnerHTML(el, templ)

    el.stub = true

    return el
  }

  /*
    Creates the root element for table or select child elements:
    tr/th/td/thead/tfoot/tbody/caption/col/colgroup/option/optgroup
  */
  function specialTags(el, templ, tagName) {
    var
      select = tagName[0] === 'o',
      parent = select ? 'select>' : 'table>'

    // trim() is important here, this ensures we don't have artifacts,
    // so we can check if we have only one element inside the parent
    el.innerHTML = '<' + parent + templ.trim() + '</' + parent
    parent = el.firstChild

    // returns the immediate parent if tr/th/td/col is the only element, if not
    // returns the whole tree, as this can include additional elements
    if (select) {
      parent.selectedIndex = -1  // for IE9, compatible w/current riot behavior
    } else {
      // avoids insertion of cointainer inside container (ex: tbody inside tbody)
      var tname = rootEls[tagName]
      if (tname && parent.childElementCount === 1) parent = $(tname, parent)
    }
    return parent
  }

  /*
    Replace the yield tag from any tag template with the innerHTML of the
    original tag in the page
  */
  function replaceYield(templ, html) {
    // do nothing if no yield
    if (!reHasYield.test(templ)) return templ

    // be careful with #1343 - string on the source having `$1`
    var src = {}

    html = html && html.replace(reYieldSrc, function (_, ref, text) {
      src[ref] = src[ref] || text   // preserve first definition
      return ''
    }).trim()

    return templ
      .replace(reYieldDest, function (_, ref, def) {  // yield with from - to attrs
        return src[ref] || def || ''
      })
      .replace(reYieldAll, function (_, def) {        // yield without any "from"
        return html || def || ''
      })
  }

  return _mkdom

})()

/**
 * Convert the item looped into an object used to extend the child tag properties
 * @param   { Object } expr - object containing the keys used to extend the children tags
 * @param   { * } key - value to assign to the new object returned
 * @param   { * } val - value containing the position of the item in the array
 * @returns { Object } - new object containing the values of the original item
 *
 * The variables 'key' and 'val' are arbitrary.
 * They depend on the collection type looped (Array, Object)
 * and on the expression used on the each tag
 *
 */
function mkitem(expr, key, val) {
  var item = {}
  item[expr.key] = key
  if (expr.pos) item[expr.pos] = val
  return item
}

/**
 * Unmount the redundant tags
 * @param   { Array } items - array containing the current items to loop
 * @param   { Array } tags - array containing all the children tags
 */
function unmountRedundant(items, tags) {

  var i = tags.length,
    j = items.length,
    t

  while (i > j) {
    t = tags[--i]
    tags.splice(i, 1)
    t.unmount()
  }
}

/**
 * Move the nested custom tags in non custom loop tags
 * @param   { Object } child - non custom loop tag
 * @param   { Number } i - current position of the loop tag
 */
function moveNestedTags(child, i) {
  Object.keys(child.tags).forEach(function(tagName) {
    var tag = child.tags[tagName]
    if (isArray(tag))
      each(tag, function (t) {
        moveChildTag(t, tagName, i)
      })
    else
      moveChildTag(tag, tagName, i)
  })
}

/**
 * Adds the elements for a virtual tag
 * @param { Tag } tag - the tag whose root's children will be inserted or appended
 * @param { Node } src - the node that will do the inserting or appending
 * @param { Tag } target - only if inserting, insert before this tag's first child
 */
function addVirtual(tag, src, target) {
  var el = tag._root, sib
  tag._virts = []
  while (el) {
    sib = el.nextSibling
    if (target)
      src.insertBefore(el, target._root)
    else
      src.appendChild(el)

    tag._virts.push(el) // hold for unmounting
    el = sib
  }
}

/**
 * Move virtual tag and all child nodes
 * @param { Tag } tag - first child reference used to start move
 * @param { Node } src  - the node that will do the inserting
 * @param { Tag } target - insert before this tag's first child
 * @param { Number } len - how many child nodes to move
 */
function moveVirtual(tag, src, target, len) {
  var el = tag._root, sib, i = 0
  for (; i < len; i++) {
    sib = el.nextSibling
    src.insertBefore(el, target._root)
    el = sib
  }
}


/**
 * Manage tags having the 'each'
 * @param   { Object } dom - DOM node we need to loop
 * @param   { Tag } parent - parent tag instance where the dom node is contained
 * @param   { String } expr - string contained in the 'each' attribute
 */
function _each(dom, parent, expr) {

  // remove the each property from the original tag
  remAttr(dom, 'each')

  var mustReorder = typeof getAttr(dom, 'no-reorder') !== T_STRING || remAttr(dom, 'no-reorder'),
    tagName = getTagName(dom),
    impl = __tagImpl[tagName] || { tmpl: getOuterHTML(dom) },
    useRoot = SPECIAL_TAGS_REGEX.test(tagName),
    root = dom.parentNode,
    ref = document.createTextNode(''),
    child = getTag(dom),
    isOption = tagName.toLowerCase() === 'option', // the option tags must be treated differently
    tags = [],
    oldItems = [],
    hasKeys,
    isVirtual = dom.tagName == 'VIRTUAL'

  // parse the each expression
  expr = tmpl.loopKeys(expr)

  // insert a marked where the loop tags will be injected
  root.insertBefore(ref, dom)

  // clean template code
  parent.one('before-mount', function () {

    // remove the original DOM node
    dom.parentNode.removeChild(dom)
    if (root.stub) root = parent.root

  }).on('update', function () {
    // get the new items collection
    var items = tmpl(expr.val, parent),
      // create a fragment to hold the new DOM nodes to inject in the parent tag
      frag = document.createDocumentFragment()

    // object loop. any changes cause full redraw
    if (!isArray(items)) {
      hasKeys = items || false
      items = hasKeys ?
        Object.keys(items).map(function (key) {
          return mkitem(expr, key, items[key])
        }) : []
    }

    // loop all the new items
    var i = 0,
      itemsLength = items.length

    for (; i < itemsLength; i++) {
      // reorder only if the items are objects
      var
        item = items[i],
        _mustReorder = mustReorder && typeof item == T_OBJECT && !hasKeys,
        oldPos = oldItems.indexOf(item),
        pos = ~oldPos && _mustReorder ? oldPos : i,
        // does a tag exist in this position?
        tag = tags[pos]

      item = !hasKeys && expr.key ? mkitem(expr, item, i) : item

      // new tag
      if (
        !_mustReorder && !tag // with no-reorder we just update the old tags
        ||
        _mustReorder && !~oldPos || !tag // by default we always try to reorder the DOM elements
      ) {

        tag = new Tag(impl, {
          parent: parent,
          isLoop: true,
          hasImpl: !!__tagImpl[tagName],
          root: useRoot ? root : dom.cloneNode(),
          item: item
        }, dom.innerHTML)

        tag.mount()

        if (isVirtual) tag._root = tag.root.firstChild // save reference for further moves or inserts
        // this tag must be appended
        if (i == tags.length || !tags[i]) { // fix 1581
          if (isVirtual)
            addVirtual(tag, frag)
          else frag.appendChild(tag.root)
        }
        // this tag must be insert
        else {
          if (isVirtual)
            addVirtual(tag, root, tags[i])
          else root.insertBefore(tag.root, tags[i].root) // #1374 some browsers reset selected here
          oldItems.splice(i, 0, item)
        }

        tags.splice(i, 0, tag)
        pos = i // handled here so no move
      } else tag.update(item, true)

      // reorder the tag if it's not located in its previous position
      if (
        pos !== i && _mustReorder &&
        tags[i] // fix 1581 unable to reproduce it in a test!
      ) {
        // update the DOM
        if (isVirtual)
          moveVirtual(tag, root, tags[i], dom.childNodes.length)
        else if (tags[i].root.parentNode) root.insertBefore(tag.root, tags[i].root)
        // update the position attribute if it exists
        if (expr.pos)
          tag[expr.pos] = i
        // move the old tag instance
        tags.splice(i, 0, tags.splice(pos, 1)[0])
        // move the old item
        oldItems.splice(i, 0, oldItems.splice(pos, 1)[0])
        // if the loop tags are not custom
        // we need to move all their custom tags into the right position
        if (!child && tag.tags) moveNestedTags(tag, i)
      }

      // cache the original item to use it in the events bound to this node
      // and its children
      tag._item = item
      // cache the real parent tag internally
      defineProperty(tag, '_parent', parent)
    }

    // remove the redundant tags
    unmountRedundant(items, tags)

    // insert the new nodes
    root.insertBefore(frag, ref)
    if (isOption) {

      // #1374 FireFox bug in <option selected={expression}>
      if (FIREFOX && !root.multiple) {
        for (var n = 0; n < root.length; n++) {
          if (root[n].__riot1374) {
            root.selectedIndex = n  // clear other options
            delete root[n].__riot1374
            break
          }
        }
      }
    }

    // set the 'tags' property of the parent tag
    // if child is 'undefined' it means that we don't need to set this property
    // for example:
    // we don't need store the `myTag.tags['div']` property if we are looping a div tag
    // but we need to track the `myTag.tags['child']` property looping a custom child node named `child`
    if (child) parent.tags[tagName] = tags

    // clone the items array
    oldItems = items.slice()

  })

}
/**
 * Object that will be used to inject and manage the css of every tag instance
 */
var styleManager = (function(_riot) {

  if (!window) return { // skip injection on the server
    add: function () {},
    inject: function () {}
  }

  var styleNode = (function () {
    // create a new style element with the correct type
    var newNode = mkEl('style')
    setAttr(newNode, 'type', 'text/css')

    // replace any user node or insert the new one into the head
    var userNode = $('style[type=riot]')
    if (userNode) {
      if (userNode.id) newNode.id = userNode.id
      userNode.parentNode.replaceChild(newNode, userNode)
    }
    else document.getElementsByTagName('head')[0].appendChild(newNode)

    return newNode
  })()

  // Create cache and shortcut to the correct property
  var cssTextProp = styleNode.styleSheet,
    stylesToInject = ''

  // Expose the style node in a non-modificable property
  Object.defineProperty(_riot, 'styleNode', {
    value: styleNode,
    writable: true
  })

  /**
   * Public api
   */
  return {
    /**
     * Save a tag style to be later injected into DOM
     * @param   { String } css [description]
     */
    add: function(css) {
      stylesToInject += css
    },
    /**
     * Inject all previously saved tag styles into DOM
     * innerHTML seems slow: http://jsperf.com/riot-insert-style
     */
    inject: function() {
      if (stylesToInject) {
        if (cssTextProp) cssTextProp.cssText += stylesToInject
        else styleNode.innerHTML += stylesToInject
        stylesToInject = ''
      }
    }
  }

})(riot)


function parseNamedElements(root, tag, childTags, forceParsingNamed) {

  walk(root, function(dom) {
    if (dom.nodeType == 1) {
      dom.isLoop = dom.isLoop ||
                  (dom.parentNode && dom.parentNode.isLoop || getAttr(dom, 'each'))
                    ? 1 : 0

      // custom child tag
      if (childTags) {
        var child = getTag(dom)

        if (child && !dom.isLoop)
          childTags.push(initChildTag(child, {root: dom, parent: tag}, dom.innerHTML, tag))
      }

      if (!dom.isLoop || forceParsingNamed)
        setNamed(dom, tag, [])
    }

  })

}

function parseExpressions(root, tag, expressions) {

  function addExpr(dom, val, extra) {
    if (tmpl.hasExpr(val)) {
      expressions.push(extend({ dom: dom, expr: val }, extra))
    }
  }

  walk(root, function(dom) {
    var type = dom.nodeType,
      attr

    // text node
    if (type == 3 && dom.parentNode.tagName != 'STYLE') addExpr(dom, dom.nodeValue)
    if (type != 1) return

    /* element */

    // loop
    attr = getAttr(dom, 'each')

    if (attr) { _each(dom, tag, attr); return false }

    // attribute expressions
    each(dom.attributes, function(attr) {
      var name = attr.name,
        bool = name.split('__')[1]

      addExpr(dom, attr.value, { attr: bool || name, bool: bool })
      if (bool) { remAttr(dom, name); return false }

    })

    // skip custom tags
    if (getTag(dom)) return false

  })

}
function Tag(impl, conf, innerHTML) {

  var self = riot.observable(this),
    opts = inherit(conf.opts) || {},
    parent = conf.parent,
    isLoop = conf.isLoop,
    hasImpl = conf.hasImpl,
    item = cleanUpData(conf.item),
    expressions = [],
    childTags = [],
    root = conf.root,
    tagName = root.tagName.toLowerCase(),
    attr = {},
    propsInSyncWithParent = [],
    dom

  // only call unmount if we have a valid __tagImpl (has name property)
  if (impl.name && root._tag) root._tag.unmount(true)

  // not yet mounted
  this.isMounted = false
  root.isLoop = isLoop

  // keep a reference to the tag just created
  // so we will be able to mount this tag multiple times
  root._tag = this

  // create a unique id to this tag
  // it could be handy to use it also to improve the virtual dom rendering speed
  defineProperty(this, '_riot_id', ++__uid) // base 1 allows test !t._riot_id

  extend(this, { parent: parent, root: root, opts: opts}, item)
  // protect the "tags" property from being overridden
  defineProperty(this, 'tags', {})

  // grab attributes
  each(root.attributes, function(el) {
    var val = el.value
    // remember attributes with expressions only
    if (tmpl.hasExpr(val)) attr[el.name] = val
  })

  dom = mkdom(impl.tmpl, innerHTML)

  // options
  function updateOpts() {
    var ctx = hasImpl && isLoop ? self : parent || self

    // update opts from current DOM attributes
    each(root.attributes, function(el) {
      var val = el.value
      opts[toCamel(el.name)] = tmpl.hasExpr(val) ? tmpl(val, ctx) : val
    })
    // recover those with expressions
    each(Object.keys(attr), function(name) {
      opts[toCamel(name)] = tmpl(attr[name], ctx)
    })
  }

  function normalizeData(data) {
    for (var key in item) {
      if (typeof self[key] !== T_UNDEF && isWritable(self, key))
        self[key] = data[key]
    }
  }

  function inheritFrom(target) {
    each(Object.keys(target), function(k) {
      // some properties must be always in sync with the parent tag
      var mustSync = !RESERVED_WORDS_BLACKLIST.test(k) && contains(propsInSyncWithParent, k)

      if (typeof self[k] === T_UNDEF || mustSync) {
        // track the property to keep in sync
        // so we can keep it updated
        if (!mustSync) propsInSyncWithParent.push(k)
        self[k] = target[k]
      }
    })
  }

  /**
   * Update the tag expressions and options
   * @param   { * }  data - data we want to use to extend the tag properties
   * @param   { Boolean } isInherited - is this update coming from a parent tag?
   * @returns { self }
   */
  defineProperty(this, 'update', function(data, isInherited) {

    // make sure the data passed will not override
    // the component core methods
    data = cleanUpData(data)
    // inherit properties from the parent in loop
    if (isLoop) {
      inheritFrom(self.parent)
    }
    // normalize the tag properties in case an item object was initially passed
    if (data && isObject(item)) {
      normalizeData(data)
      item = data
    }
    extend(self, data)
    updateOpts()
    self.trigger('update', data)
    update(expressions, self)

    // the updated event will be triggered
    // once the DOM will be ready and all the re-flows are completed
    // this is useful if you want to get the "real" root properties
    // 4 ex: root.offsetWidth ...
    if (isInherited && self.parent)
      // closes #1599
      self.parent.one('updated', function() { self.trigger('updated') })
    else rAF(function() { self.trigger('updated') })

    return this
  })

  defineProperty(this, 'mixin', function() {
    each(arguments, function(mix) {
      var instance,
        props = [],
        obj

      mix = typeof mix === T_STRING ? riot.mixin(mix) : mix

      // check if the mixin is a function
      if (isFunction(mix)) {
        // create the new mixin instance
        instance = new mix()
      } else instance = mix

      // build multilevel prototype inheritance chain property list
      do props = props.concat(Object.getOwnPropertyNames(obj || instance))
      while (obj = Object.getPrototypeOf(obj || instance))

      // loop the keys in the function prototype or the all object keys
      each(props, function(key) {
        // bind methods to self
        // allow mixins to override other properties/parent mixins
        if (key != 'init') {
          // check for getters/setters
          var descriptor = Object.getOwnPropertyDescriptor(instance, key)
          var hasGetterSetter = descriptor && (descriptor.get || descriptor.set)

          // apply method only if it does not already exist on the instance
          if (!self.hasOwnProperty(key) && hasGetterSetter) {
            Object.defineProperty(self, key, descriptor)
          } else {
            self[key] = isFunction(instance[key]) ?
              instance[key].bind(self) :
              instance[key]
          }
        }
      })

      // init method will be called automatically
      if (instance.init) instance.init.bind(self)()
    })
    return this
  })

  defineProperty(this, 'mount', function() {

    updateOpts()

    // add global mixins
    var globalMixin = riot.mixin(GLOBAL_MIXIN)

    if (globalMixin)
      for (var i in globalMixin)
        if (globalMixin.hasOwnProperty(i))
          self.mixin(globalMixin[i])

    // children in loop should inherit from true parent
    if (self._parent) {
      inheritFrom(self._parent)
    }

    // initialiation
    if (impl.fn) impl.fn.call(self, opts)

    // parse layout after init. fn may calculate args for nested custom tags
    parseExpressions(dom, self, expressions)

    // mount the child tags
    toggle(true)

    // update the root adding custom attributes coming from the compiler
    // it fixes also #1087
    if (impl.attrs)
      walkAttributes(impl.attrs, function (k, v) { setAttr(root, k, v) })
    if (impl.attrs || hasImpl)
      parseExpressions(self.root, self, expressions)

    if (!self.parent || isLoop) self.update(item)

    // internal use only, fixes #403
    self.trigger('before-mount')

    if (isLoop && !hasImpl) {
      // update the root attribute for the looped elements
      root = dom.firstChild
    } else {
      while (dom.firstChild) root.appendChild(dom.firstChild)
      if (root.stub) root = parent.root
    }

    defineProperty(self, 'root', root)

    // parse the named dom nodes in the looped child
    // adding them to the parent as well
    if (isLoop)
      parseNamedElements(self.root, self.parent, null, true)

    // if it's not a child tag we can trigger its mount event
    if (!self.parent || self.parent.isMounted) {
      self.isMounted = true
      self.trigger('mount')
    }
    // otherwise we need to wait that the parent event gets triggered
    else self.parent.one('mount', function() {
      // avoid to trigger the `mount` event for the tags
      // not visible included in an if statement
      if (!isInStub(self.root)) {
        self.parent.isMounted = self.isMounted = true
        self.trigger('mount')
      }
    })
  })


  defineProperty(this, 'unmount', function(keepRootTag) {
    var el = root,
      p = el.parentNode,
      ptag,
      tagIndex = __virtualDom.indexOf(self)

    self.trigger('before-unmount')

    // remove this tag instance from the global virtualDom variable
    if (~tagIndex)
      __virtualDom.splice(tagIndex, 1)

    if (p) {

      if (parent) {
        ptag = getImmediateCustomParentTag(parent)
        // remove this tag from the parent tags object
        // if there are multiple nested tags with same name..
        // remove this element form the array
        if (isArray(ptag.tags[tagName]))
          each(ptag.tags[tagName], function(tag, i) {
            if (tag._riot_id == self._riot_id)
              ptag.tags[tagName].splice(i, 1)
          })
        else
          // otherwise just delete the tag instance
          ptag.tags[tagName] = undefined
      }

      else
        while (el.firstChild) el.removeChild(el.firstChild)

      if (!keepRootTag)
        p.removeChild(el)
      else {
        // the riot-tag and the data-is attributes aren't needed anymore, remove them
        remAttr(p, RIOT_TAG_IS)
        remAttr(p, RIOT_TAG) // this will be removed in riot 3.0.0
      }

    }

    if (this._virts) {
      each(this._virts, function(v) {
        if (v.parentNode) v.parentNode.removeChild(v)
      })
    }

    self.trigger('unmount')
    toggle()
    self.off('*')
    self.isMounted = false
    delete root._tag

  })

  // proxy function to bind updates
  // dispatched from a parent tag
  function onChildUpdate(data) { self.update(data, true) }

  function toggle(isMount) {

    // mount/unmount children
    each(childTags, function(child) { child[isMount ? 'mount' : 'unmount']() })

    // listen/unlisten parent (events flow one way from parent to children)
    if (!parent) return
    var evt = isMount ? 'on' : 'off'

    // the loop tags will be always in sync with the parent automatically
    if (isLoop)
      parent[evt]('unmount', self.unmount)
    else {
      parent[evt]('update', onChildUpdate)[evt]('unmount', self.unmount)
    }
  }


  // named elements available for fn
  parseNamedElements(dom, this, childTags)

}
/**
 * Attach an event to a DOM node
 * @param { String } name - event name
 * @param { Function } handler - event callback
 * @param { Object } dom - dom node
 * @param { Tag } tag - tag instance
 */
function setEventHandler(name, handler, dom, tag) {

  dom[name] = function(e) {

    var ptag = tag._parent,
      item = tag._item,
      el

    if (!item)
      while (ptag && !item) {
        item = ptag._item
        ptag = ptag._parent
      }

    // cross browser event fix
    e = e || window.event

    // override the event properties
    if (isWritable(e, 'currentTarget')) e.currentTarget = dom
    if (isWritable(e, 'target')) e.target = e.srcElement
    if (isWritable(e, 'which')) e.which = e.charCode || e.keyCode

    e.item = item

    // prevent default behaviour (by default)
    if (handler.call(tag, e) !== true && !/radio|check/.test(dom.type)) {
      if (e.preventDefault) e.preventDefault()
      e.returnValue = false
    }

    if (!e.preventUpdate) {
      el = item ? getImmediateCustomParentTag(ptag) : tag
      el.update()
    }

  }

}


/**
 * Insert a DOM node replacing another one (used by if- attribute)
 * @param   { Object } root - parent node
 * @param   { Object } node - node replaced
 * @param   { Object } before - node added
 */
function insertTo(root, node, before) {
  if (!root) return
  root.insertBefore(before, node)
  root.removeChild(node)
}

/**
 * Update the expressions in a Tag instance
 * @param   { Array } expressions - expression that must be re evaluated
 * @param   { Tag } tag - tag instance
 */
function update(expressions, tag) {

  each(expressions, function(expr, i) {

    var dom = expr.dom,
      attrName = expr.attr,
      value = tmpl(expr.expr, tag),
      parent = expr.parent || expr.dom.parentNode

    if (expr.bool) {
      value = !!value
    } else if (value == null) {
      value = ''
    }

    // #1638: regression of #1612, update the dom only if the value of the
    // expression was changed
    if (expr.value === value) {
      return
    }
    expr.value = value

    // textarea and text nodes has no attribute name
    if (!attrName) {
      // about #815 w/o replace: the browser converts the value to a string,
      // the comparison by "==" does too, but not in the server
      value += ''
      // test for parent avoids error with invalid assignment to nodeValue
      if (parent) {
        // cache the parent node because somehow it will become null on IE
        // on the next iteration
        expr.parent = parent
        if (parent.tagName === 'TEXTAREA') {
          parent.value = value                    // #1113
          if (!IE_VERSION) dom.nodeValue = value  // #1625 IE throws here, nodeValue
        }                                         // will be available on 'updated'
        else dom.nodeValue = value
      }
      return
    }

    // ~~#1612: look for changes in dom.value when updating the value~~
    if (attrName === 'value') {
      if (dom.value !== value) {
        dom.value = value
        setAttr(dom, attrName, value)
      }
      return
    } else {
      // remove original attribute
      remAttr(dom, attrName)
    }

    // event handler
    if (isFunction(value)) {
      setEventHandler(attrName, value, dom, tag)

    // if- conditional
    } else if (attrName == 'if') {
      var stub = expr.stub,
        add = function() { insertTo(stub.parentNode, stub, dom) },
        remove = function() { insertTo(dom.parentNode, dom, stub) }

      // add to DOM
      if (value) {
        if (stub) {
          add()
          dom.inStub = false
          // avoid to trigger the mount event if the tags is not visible yet
          // maybe we can optimize this avoiding to mount the tag at all
          if (!isInStub(dom)) {
            walk(dom, function(el) {
              if (el._tag && !el._tag.isMounted)
                el._tag.isMounted = !!el._tag.trigger('mount')
            })
          }
        }
      // remove from DOM
      } else {
        stub = expr.stub = stub || document.createTextNode('')
        // if the parentNode is defined we can easily replace the tag
        if (dom.parentNode)
          remove()
        // otherwise we need to wait the updated event
        else (tag.parent || tag).one('updated', remove)

        dom.inStub = true
      }
    // show / hide
    } else if (attrName === 'show') {
      dom.style.display = value ? '' : 'none'

    } else if (attrName === 'hide') {
      dom.style.display = value ? 'none' : ''

    } else if (expr.bool) {
      dom[attrName] = value
      if (value) setAttr(dom, attrName, attrName)
      if (FIREFOX && attrName === 'selected' && dom.tagName === 'OPTION') {
        dom.__riot1374 = value   // #1374
      }

    } else if (value === 0 || value && typeof value !== T_OBJECT) {
      // <img src="{ expr }">
      if (startsWith(attrName, RIOT_PREFIX) && attrName != RIOT_TAG) {
        attrName = attrName.slice(RIOT_PREFIX.length)
      }
      setAttr(dom, attrName, value)
    }

  })

}
/**
 * Specialized function for looping an array-like collection with `each={}`
 * @param   { Array } els - collection of items
 * @param   {Function} fn - callback function
 * @returns { Array } the array looped
 */
function each(els, fn) {
  var len = els ? els.length : 0

  for (var i = 0, el; i < len; i++) {
    el = els[i]
    // return false -> current item was removed by fn during the loop
    if (el != null && fn(el, i) === false) i--
  }
  return els
}

/**
 * Detect if the argument passed is a function
 * @param   { * } v - whatever you want to pass to this function
 * @returns { Boolean } -
 */
function isFunction(v) {
  return typeof v === T_FUNCTION || false   // avoid IE problems
}

/**
 * Get the outer html of any DOM node SVGs included
 * @param   { Object } el - DOM node to parse
 * @returns { String } el.outerHTML
 */
function getOuterHTML(el) {
  if (el.outerHTML) return el.outerHTML
  // some browsers do not support outerHTML on the SVGs tags
  else {
    var container = mkEl('div')
    container.appendChild(el.cloneNode(true))
    return container.innerHTML
  }
}

/**
 * Set the inner html of any DOM node SVGs included
 * @param { Object } container - DOM node where we will inject the new html
 * @param { String } html - html to inject
 */
function setInnerHTML(container, html) {
  if (typeof container.innerHTML != T_UNDEF) container.innerHTML = html
  // some browsers do not support innerHTML on the SVGs tags
  else {
    var doc = new DOMParser().parseFromString(html, 'application/xml')
    container.appendChild(
      container.ownerDocument.importNode(doc.documentElement, true)
    )
  }
}

/**
 * Checks wether a DOM node must be considered part of an svg document
 * @param   { String }  name - tag name
 * @returns { Boolean } -
 */
function isSVGTag(name) {
  return ~SVG_TAGS_LIST.indexOf(name)
}

/**
 * Detect if the argument passed is an object, exclude null.
 * NOTE: Use isObject(x) && !isArray(x) to excludes arrays.
 * @param   { * } v - whatever you want to pass to this function
 * @returns { Boolean } -
 */
function isObject(v) {
  return v && typeof v === T_OBJECT         // typeof null is 'object'
}

/**
 * Remove any DOM attribute from a node
 * @param   { Object } dom - DOM node we want to update
 * @param   { String } name - name of the property we want to remove
 */
function remAttr(dom, name) {
  dom.removeAttribute(name)
}

/**
 * Convert a string containing dashes to camel case
 * @param   { String } string - input string
 * @returns { String } my-string -> myString
 */
function toCamel(string) {
  return string.replace(/-(\w)/g, function(_, c) {
    return c.toUpperCase()
  })
}

/**
 * Get the value of any DOM attribute on a node
 * @param   { Object } dom - DOM node we want to parse
 * @param   { String } name - name of the attribute we want to get
 * @returns { String | undefined } name of the node attribute whether it exists
 */
function getAttr(dom, name) {
  return dom.getAttribute(name)
}

/**
 * Set any DOM/SVG attribute
 * @param { Object } dom - DOM node we want to update
 * @param { String } name - name of the property we want to set
 * @param { String } val - value of the property we want to set
 */
function setAttr(dom, name, val) {
  var xlink = XLINK_REGEX.exec(name)
  if (xlink && xlink[1])
    dom.setAttributeNS(XLINK_NS, xlink[1], val)
  else
    dom.setAttribute(name, val)
}

/**
 * Detect the tag implementation by a DOM node
 * @param   { Object } dom - DOM node we need to parse to get its tag implementation
 * @returns { Object } it returns an object containing the implementation of a custom tag (template and boot function)
 */
function getTag(dom) {
  return dom.tagName && __tagImpl[getAttr(dom, RIOT_TAG_IS) ||
    getAttr(dom, RIOT_TAG) || dom.tagName.toLowerCase()]
}
/**
 * Add a child tag to its parent into the `tags` object
 * @param   { Object } tag - child tag instance
 * @param   { String } tagName - key where the new tag will be stored
 * @param   { Object } parent - tag instance where the new child tag will be included
 */
function addChildTag(tag, tagName, parent) {
  var cachedTag = parent.tags[tagName]

  // if there are multiple children tags having the same name
  if (cachedTag) {
    // if the parent tags property is not yet an array
    // create it adding the first cached tag
    if (!isArray(cachedTag))
      // don't add the same tag twice
      if (cachedTag !== tag)
        parent.tags[tagName] = [cachedTag]
    // add the new nested tag to the array
    if (!contains(parent.tags[tagName], tag))
      parent.tags[tagName].push(tag)
  } else {
    parent.tags[tagName] = tag
  }
}

/**
 * Move the position of a custom tag in its parent tag
 * @param   { Object } tag - child tag instance
 * @param   { String } tagName - key where the tag was stored
 * @param   { Number } newPos - index where the new tag will be stored
 */
function moveChildTag(tag, tagName, newPos) {
  var parent = tag.parent,
    tags
  // no parent no move
  if (!parent) return

  tags = parent.tags[tagName]

  if (isArray(tags))
    tags.splice(newPos, 0, tags.splice(tags.indexOf(tag), 1)[0])
  else addChildTag(tag, tagName, parent)
}

/**
 * Create a new child tag including it correctly into its parent
 * @param   { Object } child - child tag implementation
 * @param   { Object } opts - tag options containing the DOM node where the tag will be mounted
 * @param   { String } innerHTML - inner html of the child node
 * @param   { Object } parent - instance of the parent tag including the child custom tag
 * @returns { Object } instance of the new child tag just created
 */
function initChildTag(child, opts, innerHTML, parent) {
  var tag = new Tag(child, opts, innerHTML),
    tagName = getTagName(opts.root),
    ptag = getImmediateCustomParentTag(parent)
  // fix for the parent attribute in the looped elements
  tag.parent = ptag
  // store the real parent tag
  // in some cases this could be different from the custom parent tag
  // for example in nested loops
  tag._parent = parent

  // add this tag to the custom parent tag
  addChildTag(tag, tagName, ptag)
  // and also to the real parent tag
  if (ptag !== parent)
    addChildTag(tag, tagName, parent)
  // empty the child node once we got its template
  // to avoid that its children get compiled multiple times
  opts.root.innerHTML = ''

  return tag
}

/**
 * Loop backward all the parents tree to detect the first custom parent tag
 * @param   { Object } tag - a Tag instance
 * @returns { Object } the instance of the first custom parent tag found
 */
function getImmediateCustomParentTag(tag) {
  var ptag = tag
  while (!getTag(ptag.root)) {
    if (!ptag.parent) break
    ptag = ptag.parent
  }
  return ptag
}

/**
 * Helper function to set an immutable property
 * @param   { Object } el - object where the new property will be set
 * @param   { String } key - object key where the new property will be stored
 * @param   { * } value - value of the new property
* @param   { Object } options - set the propery overriding the default options
 * @returns { Object } - the initial object
 */
function defineProperty(el, key, value, options) {
  Object.defineProperty(el, key, extend({
    value: value,
    enumerable: false,
    writable: false,
    configurable: true
  }, options))
  return el
}

/**
 * Get the tag name of any DOM node
 * @param   { Object } dom - DOM node we want to parse
 * @returns { String } name to identify this dom node in riot
 */
function getTagName(dom) {
  var child = getTag(dom),
    namedTag = getAttr(dom, 'name'),
    tagName = namedTag && !tmpl.hasExpr(namedTag) ?
                namedTag :
              child ? child.name : dom.tagName.toLowerCase()

  return tagName
}

/**
 * Extend any object with other properties
 * @param   { Object } src - source object
 * @returns { Object } the resulting extended object
 *
 * var obj = { foo: 'baz' }
 * extend(obj, {bar: 'bar', foo: 'bar'})
 * console.log(obj) => {bar: 'bar', foo: 'bar'}
 *
 */
function extend(src) {
  var obj, args = arguments
  for (var i = 1; i < args.length; ++i) {
    if (obj = args[i]) {
      for (var key in obj) {
        // check if this property of the source object could be overridden
        if (isWritable(src, key))
          src[key] = obj[key]
      }
    }
  }
  return src
}

/**
 * Check whether an array contains an item
 * @param   { Array } arr - target array
 * @param   { * } item - item to test
 * @returns { Boolean } Does 'arr' contain 'item'?
 */
function contains(arr, item) {
  return ~arr.indexOf(item)
}

/**
 * Check whether an object is a kind of array
 * @param   { * } a - anything
 * @returns {Boolean} is 'a' an array?
 */
function isArray(a) { return Array.isArray(a) || a instanceof Array }

/**
 * Detect whether a property of an object could be overridden
 * @param   { Object }  obj - source object
 * @param   { String }  key - object property
 * @returns { Boolean } is this property writable?
 */
function isWritable(obj, key) {
  var props = Object.getOwnPropertyDescriptor(obj, key)
  return typeof obj[key] === T_UNDEF || props && props.writable
}


/**
 * With this function we avoid that the internal Tag methods get overridden
 * @param   { Object } data - options we want to use to extend the tag instance
 * @returns { Object } clean object without containing the riot internal reserved words
 */
function cleanUpData(data) {
  if (!(data instanceof Tag) && !(data && typeof data.trigger == T_FUNCTION))
    return data

  var o = {}
  for (var key in data) {
    if (!RESERVED_WORDS_BLACKLIST.test(key)) o[key] = data[key]
  }
  return o
}

/**
 * Walk down recursively all the children tags starting dom node
 * @param   { Object }   dom - starting node where we will start the recursion
 * @param   { Function } fn - callback to transform the child node just found
 */
function walk(dom, fn) {
  if (dom) {
    // stop the recursion
    if (fn(dom) === false) return
    else {
      dom = dom.firstChild

      while (dom) {
        walk(dom, fn)
        dom = dom.nextSibling
      }
    }
  }
}

/**
 * Minimize risk: only zero or one _space_ between attr & value
 * @param   { String }   html - html string we want to parse
 * @param   { Function } fn - callback function to apply on any attribute found
 */
function walkAttributes(html, fn) {
  var m,
    re = /([-\w]+) ?= ?(?:"([^"]*)|'([^']*)|({[^}]*}))/g

  while (m = re.exec(html)) {
    fn(m[1].toLowerCase(), m[2] || m[3] || m[4])
  }
}

/**
 * Check whether a DOM node is in stub mode, useful for the riot 'if' directive
 * @param   { Object }  dom - DOM node we want to parse
 * @returns { Boolean } -
 */
function isInStub(dom) {
  while (dom) {
    if (dom.inStub) return true
    dom = dom.parentNode
  }
  return false
}

/**
 * Create a generic DOM node
 * @param   { String } name - name of the DOM node we want to create
 * @param   { Boolean } isSvg - should we use a SVG as parent node?
 * @returns { Object } DOM node just created
 */
function mkEl(name, isSvg) {
  return isSvg ?
    document.createElementNS('http://www.w3.org/2000/svg', 'svg') :
    document.createElement(name)
}

/**
 * Shorter and fast way to select multiple nodes in the DOM
 * @param   { String } selector - DOM selector
 * @param   { Object } ctx - DOM node where the targets of our search will is located
 * @returns { Object } dom nodes found
 */
function $$(selector, ctx) {
  return (ctx || document).querySelectorAll(selector)
}

/**
 * Shorter and fast way to select a single node in the DOM
 * @param   { String } selector - unique dom selector
 * @param   { Object } ctx - DOM node where the target of our search will is located
 * @returns { Object } dom node found
 */
function $(selector, ctx) {
  return (ctx || document).querySelector(selector)
}

/**
 * Simple object prototypal inheritance
 * @param   { Object } parent - parent object
 * @returns { Object } child instance
 */
function inherit(parent) {
  function Child() {}
  Child.prototype = parent
  return new Child()
}

/**
 * Get the name property needed to identify a DOM node in riot
 * @param   { Object } dom - DOM node we need to parse
 * @returns { String | undefined } give us back a string to identify this dom node
 */
function getNamedKey(dom) {
  return getAttr(dom, 'id') || getAttr(dom, 'name')
}

/**
 * Set the named properties of a tag element
 * @param { Object } dom - DOM node we need to parse
 * @param { Object } parent - tag instance where the named dom element will be eventually added
 * @param { Array } keys - list of all the tag instance properties
 */
function setNamed(dom, parent, keys) {
  // get the key value we want to add to the tag instance
  var key = getNamedKey(dom),
    isArr,
    // add the node detected to a tag instance using the named property
    add = function(value) {
      // avoid to override the tag properties already set
      if (contains(keys, key)) return
      // check whether this value is an array
      isArr = isArray(value)
      // if the key was never set
      if (!value)
        // set it once on the tag instance
        parent[key] = dom
      // if it was an array and not yet set
      else if (!isArr || isArr && !contains(value, dom)) {
        // add the dom node into the array
        if (isArr)
          value.push(dom)
        else
          parent[key] = [value, dom]
      }
    }

  // skip the elements with no named properties
  if (!key) return

  // check whether this key has been already evaluated
  if (tmpl.hasExpr(key))
    // wait the first updated event only once
    parent.one('mount', function() {
      key = getNamedKey(dom)
      add(parent[key])
    })
  else
    add(parent[key])

}

/**
 * Faster String startsWith alternative
 * @param   { String } src - source string
 * @param   { String } str - test string
 * @returns { Boolean } -
 */
function startsWith(src, str) {
  return src.slice(0, str.length) === str
}

/**
 * requestAnimationFrame function
 * Adapted from https://gist.github.com/paulirish/1579671, license MIT
 */
var rAF = (function (w) {
  var raf = w.requestAnimationFrame    ||
            w.mozRequestAnimationFrame || w.webkitRequestAnimationFrame

  if (!raf || /iP(ad|hone|od).*OS 6/.test(w.navigator.userAgent)) {  // buggy iOS6
    var lastTime = 0

    raf = function (cb) {
      var nowtime = Date.now(), timeout = Math.max(16 - (nowtime - lastTime), 0)
      setTimeout(function () { cb(lastTime = nowtime + timeout) }, timeout)
    }
  }
  return raf

})(window || {})

/**
 * Mount a tag creating new Tag instance
 * @param   { Object } root - dom node where the tag will be mounted
 * @param   { String } tagName - name of the riot tag we want to mount
 * @param   { Object } opts - options to pass to the Tag instance
 * @returns { Tag } a new Tag instance
 */
function mountTo(root, tagName, opts) {
  var tag = __tagImpl[tagName],
    // cache the inner HTML to fix #855
    innerHTML = root._innerHTML = root._innerHTML || root.innerHTML

  // clear the inner html
  root.innerHTML = ''

  if (tag && root) tag = new Tag(tag, { root: root, opts: opts }, innerHTML)

  if (tag && tag.mount) {
    tag.mount()
    // add this tag to the virtualDom variable
    if (!contains(__virtualDom, tag)) __virtualDom.push(tag)
  }

  return tag
}
/**
 * Riot public api
 */

// share methods for other riot parts, e.g. compiler
riot.util = { brackets: brackets, tmpl: tmpl }

/**
 * Create a mixin that could be globally shared across all the tags
 */
riot.mixin = (function() {
  var mixins = {},
    globals = mixins[GLOBAL_MIXIN] = {},
    _id = 0

  /**
   * Create/Return a mixin by its name
   * @param   { String }  name - mixin name (global mixin if object)
   * @param   { Object }  mixin - mixin logic
   * @param   { Boolean } g - is global?
   * @returns { Object }  the mixin logic
   */
  return function(name, mixin, g) {
    // Unnamed global
    if (isObject(name)) {
      riot.mixin('__unnamed_'+_id++, name, true)
      return
    }

    var store = g ? globals : mixins

    // Getter
    if (!mixin) {
      if (typeof store[name] === T_UNDEF) {
        throw new Error('Unregistered mixin: ' + name)
      }
      return store[name]
    }
    // Setter
    if (isFunction(mixin)) {
      extend(mixin.prototype, store[name] || {})
      store[name] = mixin
    }
    else {
      store[name] = extend(store[name] || {}, mixin)
    }
  }

})()

/**
 * Create a new riot tag implementation
 * @param   { String }   name - name/id of the new riot tag
 * @param   { String }   html - tag template
 * @param   { String }   css - custom tag css
 * @param   { String }   attrs - root tag attributes
 * @param   { Function } fn - user function
 * @returns { String } name/id of the tag just created
 */
riot.tag = function(name, html, css, attrs, fn) {
  if (isFunction(attrs)) {
    fn = attrs
    if (/^[\w\-]+\s?=/.test(css)) {
      attrs = css
      css = ''
    } else attrs = ''
  }
  if (css) {
    if (isFunction(css)) fn = css
    else styleManager.add(css)
  }
  name = name.toLowerCase()
  __tagImpl[name] = { name: name, tmpl: html, attrs: attrs, fn: fn }
  return name
}

/**
 * Create a new riot tag implementation (for use by the compiler)
 * @param   { String }   name - name/id of the new riot tag
 * @param   { String }   html - tag template
 * @param   { String }   css - custom tag css
 * @param   { String }   attrs - root tag attributes
 * @param   { Function } fn - user function
 * @returns { String } name/id of the tag just created
 */
riot.tag2 = function(name, html, css, attrs, fn) {
  if (css) styleManager.add(css)
  //if (bpair) riot.settings.brackets = bpair
  __tagImpl[name] = { name: name, tmpl: html, attrs: attrs, fn: fn }
  return name
}

/**
 * Mount a tag using a specific tag implementation
 * @param   { String } selector - tag DOM selector
 * @param   { String } tagName - tag implementation name
 * @param   { Object } opts - tag logic
 * @returns { Array } new tags instances
 */
riot.mount = function(selector, tagName, opts) {

  var els,
    allTags,
    tags = []

  // helper functions

  function addRiotTags(arr) {
    var list = ''
    each(arr, function (e) {
      if (!/[^-\w]/.test(e)) {
        e = e.trim().toLowerCase()
        list += ',[' + RIOT_TAG_IS + '="' + e + '"],[' + RIOT_TAG + '="' + e + '"]'
      }
    })
    return list
  }

  function selectAllTags() {
    var keys = Object.keys(__tagImpl)
    return keys + addRiotTags(keys)
  }

  function pushTags(root) {
    if (root.tagName) {
      var riotTag = getAttr(root, RIOT_TAG_IS) || getAttr(root, RIOT_TAG)

      // have tagName? force riot-tag to be the same
      if (tagName && riotTag !== tagName) {
        riotTag = tagName
        setAttr(root, RIOT_TAG_IS, tagName)
        setAttr(root, RIOT_TAG, tagName) // this will be removed in riot 3.0.0
      }
      var tag = mountTo(root, riotTag || root.tagName.toLowerCase(), opts)

      if (tag) tags.push(tag)
    } else if (root.length) {
      each(root, pushTags)   // assume nodeList
    }
  }

  // ----- mount code -----

  // inject styles into DOM
  styleManager.inject()

  if (isObject(tagName)) {
    opts = tagName
    tagName = 0
  }

  // crawl the DOM to find the tag
  if (typeof selector === T_STRING) {
    if (selector === '*')
      // select all the tags registered
      // and also the tags found with the riot-tag attribute set
      selector = allTags = selectAllTags()
    else
      // or just the ones named like the selector
      selector += addRiotTags(selector.split(/, */))

    // make sure to pass always a selector
    // to the querySelectorAll function
    els = selector ? $$(selector) : []
  }
  else
    // probably you have passed already a tag or a NodeList
    els = selector

  // select all the registered and mount them inside their root elements
  if (tagName === '*') {
    // get all custom tags
    tagName = allTags || selectAllTags()
    // if the root els it's just a single tag
    if (els.tagName)
      els = $$(tagName, els)
    else {
      // select all the children for all the different root elements
      var nodeList = []
      each(els, function (_el) {
        nodeList.push($$(tagName, _el))
      })
      els = nodeList
    }
    // get rid of the tagName
    tagName = 0
  }

  pushTags(els)

  return tags
}

/**
 * Update all the tags instances created
 * @returns { Array } all the tags instances
 */
riot.update = function() {
  return each(__virtualDom, function(tag) {
    tag.update()
  })
}

/**
 * Export the Virtual DOM
 */
riot.vdom = __virtualDom

/**
 * Export the Tag constructor
 */
riot.Tag = Tag
  // support CommonJS, AMD & browser
  /* istanbul ignore next */
  if (typeof exports === T_OBJECT)
    module.exports = riot
  else if (typeof define === T_FUNCTION && typeof define.amd !== T_UNDEF)
    define(function() { return riot })
  else
    window.riot = riot

})(typeof window != 'undefined' ? window : void 0);

Added public/riot-3.13.2/test/requirejs.html.



























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!doctype html>

<head>
  <title>Riot requirejs tests</title>

</head>

<body>

  <app></app>

  <script src="vendor/require.js"></script>
  <script type="riot/tag">
    <app>
      <p>{ title }</p>
      this.title = 'hello'
    </app>
  </script>
  <script>
    require(['../dist/riot/riot%2Bcompiler.js'], function(riot) {
      // riot need to be available globally to compile in runtime
      window.riot = riot
      riot.compile(function() {
        riot.mount('app')
      })
    })
  </script>

</body>

Added public/riot-3.13.2/test/saucelabs-browsers.js.







































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// we will re-enable the broken browsers once saucelabs will fix all the timeout issues
module.exports = {
  browsers: {
    slIpad: {
      base: 'SauceLabs',
      browserName: 'ipad',
      version: '10.3'
    },
    slIphone6: {
      base: 'SauceLabs',
      browserName: 'iphone',
      version: '10.3'
    },
    slSafari8: {
      base: 'SauceLabs',
      browserName: 'safari',
      platform: 'OS X 10.10'
    },
    slSafari10: {
      base: 'SauceLabs',
      browserName: 'safari',
      platform: 'OS X 10.11'
    },
    slSafari11: {
      base: 'SauceLabs',
      browserName: 'safari',
      platform: 'OS X 10.13'
    },
    slIE9: {
      base: 'SauceLabs',
      browserName: 'internet explorer',
      platform: 'Windows 7',
      version: '9'
    },
    slIE10: {
      base: 'SauceLabs',
      browserName: 'internet explorer',
      platform: 'Windows 7',
      version: '10'
    },
    slIE11: {
      base: 'SauceLabs',
      browserName: 'internet explorer',
      platform: 'Windows 7',
      version: '11'
    },
    slEdge14: {
      base: 'SauceLabs',
      browserName: 'MicrosoftEdge',
      version: '14',
      platform: 'Windows 10'
    },
    slEdge15: {
      base: 'SauceLabs',
      browserName: 'MicrosoftEdge',
      version: '15',
      platform: 'Windows 10'
    },
    slEdge: {
      base: 'SauceLabs',
      browserName: 'MicrosoftEdge',
      platform: 'Windows 10'
    },
    slChrome: {
      base: 'SauceLabs',
      browserName: 'chrome'
    },
    slFirefox: {
      base: 'SauceLabs',
      browserName: 'firefox'
    },
    slAndroid5: {
      base: 'SauceLabs',
      browserName: 'android',
      version: '5.1'
    },
    slAndroid4: {
      base: 'SauceLabs',
      browserName: 'android',
      version: '4.4'
    }
  }
}

Added public/riot-3.13.2/test/specs/browser/compiler/compiler.spec.js.

















































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/* global defaultBrackets */

import {
  injectHTML,
  $,
  getRiotStyles
} from '../../../helpers/index'

//import '../../../tag/bug-2369.tag'


describe('Riot compiler', function() {

  beforeEach(function() {
    // adding some custom riot parsers
    // css
    riot.parsers.css.myparser = function(tag, css) {
      return css.replace(/@tag/, tag).replace(' 3px ', ' 4px ')
    }
    // js
    riot.parsers.js.myparser = function(js) {
      return js.replace(/@version/, '1.0.0')
    }
  })

  it('compiler performance', function() {
    var src =  [
      '<foo>',
      '  <p>{ opts.baz } { bar }</p>',

      '  this.bar = "romutus"',

      '</foo>',
      '<timetable>',
      '   <timer ontick={ parent.opts.ontick } start={ time } each={ time, i in times }></timer>',
      '   <foo barz="899" baz="90"></foo>',
      '   <p>{ kama }</p>',

      '   this.times = [ 1, 3, 5 ]',
      '   this.kama = "jooo"',
      '</timetable>'
    ].join('\n')

    // check compile is actually compiling the source
    expect(riot.compile(src, true)).to.contain("('timetable', '")

    // compile timer 1000 times and see how long it takes
    var begin = Date.now()

    for (var i = 0; i < 1000; i++) {
      riot.compile(src, true)
    }

    expect(Date.now() - begin).to.be.below(1500) // compiler does more now

  })

  it('compile a custom tag using custom css and js parsers', function(done) {

    injectHTML('<custom-parsers></custom-parsers>')

    riot.compile('./tag/~custom-parsers.tag', function() {

      var tag = riot.mount('custom-parsers')[0],
        styles = getRiotStyles(riot)

      expect(tag).to.be.an('object')
      expect(tag.version).to.be.equal('1.0.0')
      expect(styles).to.match(/\bcustom-parsers ?\{\s*color: red;}/)

      tag.unmount()
      done()
    })

  })

  // this test in theory goes in style.spec.js
  it('scoped css tag supports htm5 syntax, multiple style tags', function (done) {
    injectHTML('<style-tag3></style-tag3><style-tag4></style-tag4>')
    this.timeout(5000)
    riot.compile(['./tag/~style-tag3.tag'], function() {
      checkCSS(riot.mount('style-tag3')[0], '4px')
      delete riot.parsers.css.cssup
      function checkCSS(t, x) {
        t.update()
        var e = t.root.firstElementChild
        expect(e.tagName).to.be.equal('P')
        expect(window.getComputedStyle(e, null).borderTopWidth).to.be.equal(x)
        t.unmount()
      }
      done()
    })
  })

  it('Passing options to the compiler through compile (v2.3.12)', function () {
    var str = '<passing-options>\n  <p>\n  </p>\nclick(e){}\n</passing-options>',
      result = riot.compile(str, true, {compact: true, type: 'none'})
    expect(result).to.contain('<p></p>')          // compact: true
    expect(result).to.contain('\nclick(e){}\n')   // type: none
  })

  it('compile detect changes in riot.settings.brackets', function() {
    var compiled

    // change the brackets
    riot.util.brackets.set('{{ }}')
    expect(riot.settings.brackets).to.be.equal('{{ }}')
    compiled = riot.compile('<my>{{ time }} and { time }</my>', true)
    expect(compiled).to.contain("riot.tag2('my', '{{time}} and { time }',")

    // restore using riot.settings
    riot.settings.brackets = defaultBrackets
    compiled = riot.compile('<my>{ time } and { time }</my>', true)
    expect(riot.util.brackets.settings.brackets).to.be.equal(defaultBrackets)
    expect(compiled).to.contain("riot.tag2('my', '{time} and {time}',")

    // change again, now with riot.settings
    riot.settings.brackets = '{{ }}'
    compiled = riot.compile('<my>{{ time }} and { time }</my>', true)
    expect(riot.util.brackets.settings.brackets).to.be.equal('{{ }}')
    expect(compiled).to.contain("riot.tag2('my', '{{time}} and { time }',")

    riot.util.brackets.set(undefined)
    expect(riot.settings.brackets).to.be.equal(defaultBrackets)
    compiled = riot.compile('<my>{ time } and { time }</my>', true)
    expect(compiled).to.contain("riot.tag2('my', '{time} and {time}',")
  })

  it('mount search data-is attributes for tag names only #1463', function () {
    var
      names = ['x-my_tag1', 'x-my-tag2', 'x-my-3tag', 'x-m1-3tag'],
      templ = '<@>X</@>',
      name

    // test browser capability for match unquoted chars in [-_A-Z]
    for (let i = 0; i < names.length; ++i) {
      injectHTML(`<div data-is="${names[i]}"></div>`)
      riot.compile(templ.replace(/@/g, names[i]))
      let tag = riot.mount(names[i])[0]
      expect($('*[data-is=' + names[i] + ']').innerHTML).to.be.equal('X')
      tag.unmount()
    }

    // double quotes work, we can't mount html element named "22"
    name = 'x-my-tag3'
    injectHTML(`<${name} name="22"></${name}>`)
    riot.compile(templ.replace(/@/g, name))
    var tag = riot.mount('*[name="22"]')[0]
    expect($(name).innerHTML).to.be.equal('X')
    tag.unmount()
  })

  it('tags containing regex get properly compiled', function(done) {
    injectHTML('<bug-2369></bug-2369>')
    riot.compile('./tag/bug-2369.tag', function () {
      const tag = riot.mount('bug-2369')[0]
      expect(tag.root).to.be.ok
      tag.unmount()
      done()
    })
  })

  it('throw compile.error in case a file will be not found', function(done) {
    // override the compile error function
    riot.compile.error = () => done()
    riot.compile('./foo/bar.tag')
  })
})

Added public/riot-3.13.2/test/specs/browser/index.js.



























>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
// make expect globally available
window.defaultBrackets = riot.settings.brackets
window.expect = chai.expect // eslint-disable-line

before(function() {
  riot.unregister('riot-tmp')
  riot.unregister('riot-tmp-value')
  riot.unregister('riot-tmp-sub')
})

after(function() {
  riot.settings.brackets = window.defaultBrackets
})

Added public/riot-3.13.2/test/specs/browser/riot/core.spec.js.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
import {
  injectHTML,
  $,
  $$,
  IE_VERSION,
  normalizeHTML,
  fireEvent,
  getCarrotPos,
  setCarrotPos
} from '../../../helpers/index'

// include special tags to test specific features
import '../../../tag/v-dom-1.tag'
import '../../../tag/v-dom-2.tag'
import '../../../tag/timetable.tag'
import '../../../tag/nested-child.tag'
import '../../../tag/top-attributes.tag'
import '../../../tag/preserve-attr.tag'
import '../../../tag/svg-attr.tag'
import '../../../tag/named-child.tag'
import '../../../tag/deferred-mount.tag'
import '../../../tag/prevent-update.tag'
import '../../../tag/expression-eval-count.tag'
import '../../../tag/multi-named.tag'
import '../../../tag/named-data-ref.tag'
import '../../../tag/input-number.tag'
import '../../../tag/input-values.tag'
import '../../../tag/input-updated.tag'
import '../../../tag/nested-riot.tag'
import '../../../tag/treeview.tag'
import '../../../tag/events.tag'
import '../../../tag/runtime-event-listener-switch.tag'
import '../../../tag/should-update.tag'
import '../../../tag/should-update-opts.tag'
import '../../../tag/observable-attr.tag'
import '../../../tag/virtual-nested-unmount.tag'
import '../../../tag/virtual-conditional.tag'
import '../../../tag/form-controls.tag'
import '../../../tag/data-is.tag'
import '../../../tag/virtual-nested-component.tag'
import '../../../tag/dynamic-data-is.tag'
import '../../../tag/update-context.tag'
import '../../../tag/dynamic-virtual.tag'
import '../../../tag/multiple-select.tag'
import '../../../tag/dynamic-nested.tag'
import '../../../tag/bug-2629.tag'

describe('Riot core', function() {
  it('Riot exists', function () {
    expect(riot).to.be.not.undefined
  })

  before(function() {
    // general tag
    riot.tag('test', '<p>val: { opts.val }</p>')
  })

  it('it should export the current riot build version as string', function() {
    expect(riot.version).to.be.a('string')
  })

  it('populates the vdom property correctly on riot global', function() {
    injectHTML('<v-dom-1></v-dom-1>')
    injectHTML('<v-dom-2></v-dom-2>')
    var tags = riot.mount('v-dom-1, v-dom-2')

    expect(tags.length).to.be.equal(2)
    expect(riot.util.vdom).to.have.length(tags.length)
    riot.util.vdom.forEach(function(tag, i) {
      expect(tag).to.be.equal(tags[i])
    })
    tags.forEach(tag => tag.unmount())
  })

  it('riot can be extended', function() {
    riot.route = function() {}

    expect(riot.route).to.be.a('function')

    riot.util.tmpl.errorHandle = function() {}

    expect(riot.util.tmpl.errorHandle).to.be.a('function')
  })

  it('mount and unmount', function() {

    injectHTML([
      '<test id="test-tag"></test>',
      '<div id="foo"></div>',
      '<div id="bar"></div>'
    ])

    var tag = riot.mount('test', { val: 10 })[0],
      tag2 = riot.mount('#foo', 'test', { val: 30 })[0],
      tag3 = riot.mount($('#bar'), 'test', { val: 50 })[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>val: 10</p>')
    expect(normalizeHTML(tag2.root.innerHTML)).to.be.equal('<p>val: 30</p>')
    expect(normalizeHTML(tag3.root.innerHTML)).to.be.equal('<p>val: 50</p>')

    tag.unmount()
    tag2.unmount()
    tag3.unmount(true)

    expect(tag3.isMounted).to.be.equal(false)

    expect($$('test').length).to.be.equal(0)
    expect($('#foo')).to.be.equal(null)
    expect($('#bar')).to.not.be.equal(null)

    expect(tag.root._tag).to.be.equal(undefined)
    expect(tag2.root._tag).to.be.equal(undefined)
    expect(tag3.root._tag).to.be.equal(undefined)

    tag3.root.parentNode.removeChild(tag3.root)

  })

  it('node should not preserve attributes from tag mounted on it when it is unmounted', function() {
    injectHTML('<div id="node"></div>')

    var tag = riot.mount('#node', 'top-attributes', { cls: 'test' })[0]

    expect(tag.root.hasAttribute('class')).to.be.equal(true)
    expect(tag.root.hasAttribute('style')).to.be.equal(true)
    expect(tag.root.hasAttribute('data-nqlast')).to.be.equal(true)

    tag.unmount()

    expect(tag.root.hasAttribute('class')).to.be.equal(false)
    expect(tag.root.hasAttribute('style')).to.be.equal(false)
    expect(tag.root.hasAttribute('data-nqlast')).to.be.equal(false)
  })

  it('mount a tag mutiple times', function() {

    injectHTML([
      // mount the same tag multiple times
      '<div id="multi-mount-container-1"></div>'

    ])

    var tag = riot.mount('#multi-mount-container-1', 'test', { val: 300 })[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>val: 300</p>')

    riot.tag('test-h', '<p>{ x }</p>', function() { this.x = 'ok'})

    tag = riot.mount('#multi-mount-container-1', 'test-h')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>ok</p>')

    tag.unmount()

  })

  it('compiles and unmount the children tags', function(done) {

    injectHTML('<timetable></timetable>')

    this.timeout(5000)

    var ticks = 0,
      tag = riot.mount('timetable', {
        start: 0,
        ontick: function() {
          ticks++
        }
      })[0]

    expect($$('timer', tag.root).length).to.be.equal(3)

    riot.update()

    expect(tag.tags.foo).to.not.be.equal(undefined)

    tag.unmount()

    // no time neither for one tick
    // because the tag got unMounted too early
    setTimeout(function() {
      expect(ticks).to.be.equal(0)
      done()
    }, 1200)

  })

  it('mount a tag mutiple times using "*"', function() {

    injectHTML([
      // multple mount using *
      '<div id="multi-mount-container-2">',
      '    <test-i></test-i>',
      '    <test-l></test-l>',
      '    <test-m></test-m>',
      '</div>'
    ])

    riot.tag('test-i', '<p>{ x }</p>', function() { this.x = 'ok'})
    riot.tag('test-l', '<p>{ x }</p>', function() { this.x = 'ok'})
    riot.tag('test-m', '<p>{ x }</p>', function() { this.x = 'ok'})

    const container = $('#multi-mount-container-2')
    var subTags = riot.mount('#multi-mount-container-2', '*')

    expect(subTags.length).to.be.equal(3)

    subTags = riot.mount(container, '*')

    expect(subTags.length).to.be.equal(3)

    subTags.forEach(tag => tag.unmount())
    container.parentNode.removeChild(container)
  })

  it('avoid to mount unregistered tags', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<p>hello</p>')
    riot.unregister('riot-tmp')

    const tags = riot.mount('*')

    expect(tags).to.be.have.length(0)

    const node = $('riot-tmp')

    node.parentNode.removeChild(node)
  })

  it('remove style of unregistered tags out of document', function() {
    injectHTML('<riot-tmp-with-style></riot-tmp-with-style>')

    try {
      riot.tag('riot-tmp-with-style', '<p>hello</p>', 'riot-tmp-with-style { font-size: 1rem; }')

      riot.mount('*') // ensure <style> updated

      riot.unregister('riot-tmp-with-style')

      riot.mount('*') // ensure <style> updated

      $$('head style').forEach(style => {
        expect(style.textContent).not.to.contain('riot-tmp-with-style')
      })
    } finally {
      const node = $('riot-tmp-with-style')
      node.parentNode.removeChild(node)
    }
  })

  it('an <option> tag having the attribute "selected" should be the value of the parent <select> tag', function() {
    injectHTML('<tmp-select-tag></tmp-select-tag>')

    riot.tag('tmp-select-tag', `
    <select ref='select'>
      <option value="1" selected="{v == 1}">1</option>
      <option value="2" selected="{v == 2}">2</option>
      <option value="3" selected="{v == 3}">3</option>
    </select>`,
    function() {
      this.v = 2
    })

    var tag = riot.mount('tmp-select-tag')[0]

    expect(tag.refs.select.selectedIndex).to.be.equal(1)

    tag.unmount()
    riot.unregister('tmp-select-tag')
  })

  it('the mount method could be triggered also on several tags using a NodeList instance', function() {

    injectHTML([
      '<multi-mount value="1"></multi-mount>',
      '<multi-mount value="2"></multi-mount>',
      '<multi-mount value="3"></multi-mount>',
      '<multi-mount value="4"></multi-mount>'
    ])

    riot.tag('multi-mount', '{ opts.value }')

    var multipleTags = riot.mount($$('multi-mount'))

    expect(multipleTags[0].root.innerHTML).to.be.equal('1')
    expect(multipleTags[1].root.innerHTML).to.be.equal('2')
    expect(multipleTags[2].root.innerHTML).to.be.equal('3')
    expect(multipleTags[3].root.innerHTML).to.be.equal('4')

    multipleTags.forEach(tag => tag.unmount())
  })


  it('all the nested tags will are correctly pushed to the parent.tags property', function() {

    injectHTML('<nested-child></nested-child>')

    var tag = riot.mount('nested-child')[0]

    expect(tag.tags.child.length).to.be.equal(6)
    expect(tag.tags['another-nested-child']).to.be.an('object')
    tag.tags.child[0].unmount()
    expect(tag.tags.child.length).to.be.equal(5)
    tag.tags['another-nested-child'].unmount()
    expect(tag.tags['another-nested-child']).to.be.equal(undefined)

    tag.unmount()

  })

  it('brackets', function() {

    injectHTML([
      '<test-a></test-a>',
      '<test-b></test-b>',
      '<test-c></test-c>',
      '<test-d></test-d>',
      '<test-e></test-e>',
      '<test-f></test-f>',
      '<test-g></test-g>'
    ])

    var tag

    riot.settings.brackets = '[ ]'
    riot.tag('test-a', '<p>[ x ]</p>', function() { this.x = 'ok'})
    tag = riot.mount('test-a')[0]
    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>ok</p>')
    tag.unmount()

    riot.settings.brackets = '${ }'
    riot.tag('test-c', '<p>${ x }</p>', function() { this.x = 'ok' })
    tag = riot.mount('test-c')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>ok</p>')
    tag.unmount()

    riot.settings.brackets = null
    riot.tag('test-d', '<p>{ x }</p>', function() { this.x = 'ok' })
    tag = riot.mount('test-d')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>ok</p>')
    tag.unmount()

    riot.settings.brackets = '[ ]'
    riot.tag('test-e', '<p>[ x ]</p>', function() { this.x = 'ok' })
    tag = riot.mount('test-e')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>ok</p>')
    tag.unmount()

    riot.settings.brackets = '${ }'
    riot.tag('test-f', '<p>${ x }</p>', function() { this.x = 'ok' })
    tag = riot.mount('test-f')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>ok</p>')
    tag.unmount()

    riot.settings.brackets = null
    riot.tag('test-g', '<p>{ x }</p>', function() { this.x = 'ok' })
    tag = riot.mount('test-g')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>ok</p>')
    tag.unmount()

  })

  it('the case of attributes prefixed with riot should be leaved untouched', function() {
    riot.tag('crazy-svg', `
      <svg preserveAspectRatio="xMinYMax meet" riot-viewBox="{'0 0 300 300'}">
        <circle riot-cx="{ 5 }" riot-cy="{ 5 }" r="2" fill="black"></circle>
      </svg>
    `)

    injectHTML('<crazy-svg></crazy-svg>')

    var tag = riot.mount('crazy-svg')[0]

    expect($('svg', tag.root).getAttribute('viewBox')).to.be.equal('0 0 300 300')
    expect($('svg', tag.root).getAttribute('preserveAspectRatio')).to.be.equal('xMinYMax meet')

    tag.unmount()
  })

  it('data-is attribute', function() {
    injectHTML('<div id="rtag" data-is="rtag"></div>')
    riot.tag('rtag', '<p>val: { opts.val }</p>')

    var tag = riot.mount('#rtag', { val: 10 })[0]
    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>val: 10</p>')

    tag.unmount()
    expect($$('rtag').length).to.be.equal(0)

    tag.unmount()
  })

  it('the data-is attribute is preserved in case of unmount', function() {
    injectHTML('<div id="rtag" data-is="rtag"></div>')
    riot.tag('rtag', '<p>val: { opts.val }</p>')

    var tag = riot.mount('#rtag', { val: 10 })[0]
    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>val: 10</p>')

    tag.unmount(true)
    expect(tag.root.getAttribute('data-is')).to.be.ok
    tag.root.parentNode.removeChild(tag.root)
  })

  it('data-is can be dynamically created by expression', function() {
    injectHTML('<dynamic-data-is></dynamic-data-is>')
    var tag = riot.mount('dynamic-data-is')[0]
    var divs = $$('div', tag.root)
    expect($('input', divs[0]).getAttribute('type')).to.be.equal('color')
    expect($('input', divs[0]).getAttribute('name')).to.be.equal('aaa')
    expect($('input', divs[1]).getAttribute('type')).to.be.equal('color')
    expect($('input', divs[2]).getAttribute('type')).to.be.equal('date')
    expect($('input', divs[3]).getAttribute('type')).to.be.equal('date')
    expect($('input', divs[3]).getAttribute('name')).to.be.equal('calendar')
    expect(tag.tags['dynamic-data-toggle']).to.be.an('object')


    tag.single = 'color'
    tag.toggle = false
    tag.intags[0].name = 'ddd'
    tag.update()
    expect($('input', divs[3]).getAttribute('type')).to.be.equal('color')
    expect($('input', divs[3]).getAttribute('name')).to.be.equal('color')
    expect(tag.tags['dynamic-data-toggle']).to.be.equal(undefined)
    expect($('input', divs[0]).getAttribute('name')).to.be.equal('ddd')

    tag.intags.reverse()
    tag.toggle = true
    tag.update()
    divs = $$('div', tag.root)
    expect($('input', divs[0]).getAttribute('type')).to.be.equal('date')
    expect($('input', divs[1]).getAttribute('type')).to.be.equal('color')
    expect($('input', divs[2]).getAttribute('type')).to.be.equal('color')
    expect(tag.tags['dynamic-data-toggle']).to.be.an('object')

    tag.intags.splice(1, 1)
    tag.update()
    expect(tag.tags.color.length).to.be.equal(2) // single + remaining loop color
    expect(tag.tags.calendar).to.be.an('object')

    // below checks for strays
    tag.intags.reverse()
    tag.update()
    expect(tag.tags.color.length).to.be.equal(2)

    tag.intags.reverse()
    tag.update()
    expect(tag.tags.color.length).to.be.equal(2)

    // single tags as tag object and not array after delete

    tag.intags.splice(1, 1)
    tag.update()

    expect(tag.tags.color).to.be.an('object')

    tag.unmount()

  })

  it('support `data-is` for html5 compliance', function() {
    injectHTML('<div data-is="tag-data-is"></div>')
    var tag = riot.mount('tag-data-is')[0]
    var els = $$('p', tag.root)
    expect(els.length).to.be.equal(2)
    expect(els[0].innerHTML).to.contain('html5')
    expect(els[1].innerHTML).to.contain('too')
    tag.unmount()
  })

  it('`data-is` expressions will be evaluated only if they return a string', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', `
      <div data-is="{ tag }">
        <p>hello</p>
      </div>
    `)
    var tag = riot.mount('riot-tmp')[0]

    expect($('p', tag.root).innerHTML).to.be.equal('hello')

    tag.unmount()
  })

  it('tag names are case insensitive (converted to lowercase) in `riot.mount`', function() {
    var i, els = $$('tag-data-is,[data-is="tag-data-is"]')
    for (i = 0; i < els.length; i++) {
      els[i].parentNode.removeChild(els[i])
    }
    injectHTML('<div data-is="tag-data-is"></div>')
    injectHTML('<tag-DATA-Is></tag-DATA-Is>')
    var tags = riot.mount('tag-Data-Is')

    expect(tags.length).to.be.equal(2)
    expect($$('p', tags[0].root).length).to.be.equal(2)
    expect($$('p', tags[1].root).length).to.be.equal(2)
    tags.push(tags[0], tags[1])
  })

  it('the data-is attribute gets updated if a DOM node gets mounted using two or more different tags', function() {

    var div = document.createElement('div')
    var tag1 = riot.mount(div, 'timetable')[0]
    expect(div.getAttribute('data-is')).to.be.equal('timetable')
    var tag2 = riot.mount(div, 'test')[0]
    expect(div.getAttribute('data-is')).to.be.equal('test')

    tag1.unmount()
    tag2.unmount()

  })

  it('the value of the `data-is` attribute needs lowercase names', function() {
    var i, els = $$('tag-data-is,[data-is="tag-data-is"]')
    for (i = 0; i < els.length; i++) {
      els[i].parentNode.removeChild(els[i])
    }
    injectHTML('<div data-is="tag-DATA-Is"></div>')
    var tags = riot.mount('tag-Data-Is')

    expect(tags.length).to.be.equal(0)
  })

  it('data-is as expression', function() {
    injectHTML('<container-riot></container-riot>')
    var tag = riot.mount('container-riot')[0]
    var div = $('div', tag.root)
    expect(div.getAttribute('data-is')).to.be.equal('nested-riot')
    tag.unmount()
  })

  it('data-is attribute by tag name', function() {

    // data-is attribute by tag name

    riot.tag('rtag2', '<p>val: { opts.val }</p>')

    injectHTML('<div data-is="rtag2"></div>')

    var tag = riot.mount('rtag2', { val: 10 })[0]
    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>val: 10</p>')

    tag.unmount()
    expect($$('rtag2').length).to.be.equal(0)

  })


  it('data-is attribute using the "*" selector', function() {

    injectHTML([
      '<div id="rtag-nested">',
      '  <div data-is="rtag"></div>',
      '  <div data-is="rtag"></div>',
      '  <div data-is="rtag"></div>',
      '</div>'
    ])

    var subTags = riot.mount('#rtag-nested', '*', { val: 10 })

    expect(subTags.length).to.be.equal(3)

    expect(normalizeHTML(subTags[0].root.innerHTML)).to.be.equal('<p>val: 10</p>')
    expect(normalizeHTML(subTags[1].root.innerHTML)).to.be.equal('<p>val: 10</p>')
    expect(normalizeHTML(subTags[2].root.innerHTML)).to.be.equal('<p>val: 10</p>')

    subTags.forEach(tag => tag.unmount())

  })


  it('top level attr manipulation', function() {

    injectHTML('<top-level-attr value="initial"></top-level-attr>')

    riot.tag('top-level-attr', '{opts.value}')

    var tag = riot.mount('top-level-attr')[0]

    tag.root.setAttribute('value', 'changed')
    tag.update()

    expect(tag.root.innerHTML).to.be.equal('changed')

    tag.unmount()
  })

  it('SVGs xlink attributes get correctly parsed', function() {
    injectHTML('<svg-attr></svg-attr>')
    var tag = riot.mount('svg-attr')[0]

    expect(tag.refs.target.getAttributeNS('http://www.w3.org/1999/xlink', 'href')).to.be.equal(tag.href)
    tag.unmount()
  })

  it('preserve attributes from tag definition', function() {


    injectHTML('<preserve-attr></preserve-attr><div data-is="preserve-attr2"></div>')

    var tag = riot.mount('preserve-attr')[0]
    expect(tag.root.className).to.be.equal('single-quote')
    var tag2 = riot.mount('preserve-attr2')[0]
    expect(tag2.root.className).to.be.equal('double-quote')
    tag.unmount()
    tag2.unmount()
  })

  it('precompiled tag compatibility', function() {

    injectHTML('<precompiled></precompiled>')
    riot.tag('precompiled', 'HELLO!', 'precompiled, [data-is="precompiled"]  { color: red }', function(opts) {
      this.nothing = opts.nothing
    })

    var tag = riot.mount('precompiled')[0]
    expect(window.getComputedStyle(tag.root, null).color).to.be.equal('rgb(255, 0, 0)')
    tag.unmount()

  })

  it('static referenced tag for tags property', function() {
    injectHTML('<named-child-parent></named-child-parent>')
    var tag = riot.mount('named-child-parent')[0]
    expect(tag.refs['tags-child'].root.innerHTML).to.be.equal('I have a name')

    tag.unmount()
  })

  it('preserve the mount order, first the parent and then all the children', function() {

    injectHTML('<deferred-mount></deferred-mount>')

    var correctMountingOrder = [
        'deferred-mount',
        'deferred-child-1',
        'deferred-child-2',
        'deferred-loop',
        'deferred-loop',
        'deferred-loop',
        'deferred-loop',
        'deferred-loop'
      ],
      mountingOrder = [],
      cb = function(tagName, childTag) {
        // make sure the mount event gets triggered when all the children tags
        // are in the DOM
        expect(document.contains(childTag.root)).to.be.equal(true)
        mountingOrder.push(tagName)
      },
      tag = riot.mount('deferred-mount', { onmount: cb })[0]

    expect(mountingOrder.join()).to.be.equal(correctMountingOrder.join())

    tag.unmount()
  })


  it('no update should be triggered if the preventUpdate flag is set', function() {

    injectHTML('<prevent-update></prevent-update>')

    var tag = riot.mount('prevent-update')[0]

    expect(tag.refs['fancy-name'].innerHTML).to.be.equal('john')

    fireEvent($$('p')[0], 'click')

    expect(tag.refs['fancy-name'].innerHTML).to.be.equal('john')

    tag.unmount()
  })

  it('the before events get triggered', function() {
    injectHTML('<before-events></before-events>')
    var tag,
      incrementEvents = sinon.spy()

    riot.tag('before-events', '', function() {
      this.on('before-mount', incrementEvents)
      this.on('before-unmount', incrementEvents)
    })
    tag = riot.mount(document.createElement('before-events'))[0]
    tag.unmount()
    expect(incrementEvents).to.have.been.calledTwice
  })

  it('the before mount event gets triggered before the component markup creation', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', `
      <p>{ flag }<p>
    `, function() {
      this.flag = true
      this.on('before-mount', () => {
        this.flag = false
      })
    })

    var tag = riot.mount('riot-tmp')[0]

    expect($('p', tag.root).innerHTML).to.be.equal('false')

    tag.unmount()
  })

  it('all the events get fired also in the loop tags, the e.item property gets preserved', function() {
    injectHTML('<events></events>')
    var currentItem,
      currentIndex,
      callbackCalls = 0,
      tag = riot.mount('events', {
        cb: function(e) {
          expect(e.item.val).to.be.equal(currentItem)
          expect(e.item.index).to.be.equal(currentIndex)
          callbackCalls++
        }
      })[0],
      divTags = $$('div', tag.root)

    currentItem = tag.items[0]
    currentIndex = 0
    fireEvent(divTags[0], 'click')
    tag.items.reverse()
    tag.update()
    currentItem = tag.items[0]
    currentIndex = 0
    fireEvent(divTags[0], 'click')

    expect(callbackCalls).to.be.equal(2)

    tag.unmount()
  })

  it('event listeners can be switched in runtime without memory leaks', function() {
    injectHTML('<runtime-event-listener-switch></runtime-event-listener-switch>')
    var
      args = [],
      cb = function(name) {
        args.push(name)
      },
      tag = riot.mount('runtime-event-listener-switch', { cb })[0],
      pFirst = $('p.first', tag.root),
      pSecond = $('p.second', tag.root)

    fireEvent(pFirst, 'click')
    expect(args[0]).to.be.equal('ev1')
    fireEvent(pSecond, 'mouseenter')
    expect(args[1]).to.be.equal('ev2')
    fireEvent(pFirst, 'click')
    expect(args[2]).to.be.equal('ev1')
    fireEvent(pFirst, 'mouseenter')
    expect(args[3]).to.be.equal('ev2')

    expect(args.length).to.be.equal(4)

    tag.unmount()

  })

  it('don t\' skip the anonymous tags using the "riot.settings.skipAnonymousTags = false" option' , function(done) {
    riot.settings.skipAnonymousTags = false
    injectHTML('<anonymous-test></anonymous-test>')
    riot.mixin({
      init() {
        if (this.__.isAnonymous) {
          expect(this.on).to.be.ok
          done()
        }
      }
    })
    riot.tag('anonymous-test', '<div each="{ items }"></div>', function() {
      this.items = [1]
    })
    var tag = riot.mount('anonymous-test')[0]
    tag.unmount()
    riot.settings.skipAnonymousTags = true
  })

  it('the "riot.settings.skipAnonymousTags = false" option will let trigger the "mount" event on anonymous tags' , function() {
    riot.settings.skipAnonymousTags = false
    const spy = sinon.spy()

    injectHTML('<riot-tmp></riot-tmp>')

    riot.mixin({
      init() {
        this.on('mount', spy)
      }
    })

    riot.tag('riot-tmp', '<div each="{ items }"></div>', function() {
      this.items = [1]
    })

    var tag = riot.mount('riot-tmp')[0]
    tag.unmount()
    expect(spy).to.have.been.calledTwice

    riot.settings.skipAnonymousTags = true
  })

  it('the "updated" event gets properly triggered in a nested child', function(done) {
    injectHTML('<div id="updated-events-tester"></div>')
    var tag = riot.mount('#updated-events-tester', 'named-child-parent')[0],
      counter = 0

    tag.tags['named-child'].on('updated', function() {
      counter ++
      if (counter === 2) done()
    })

    tag.update()
    tag.tags['named-child'].update()

    tag.unmount()

  })

  it('only evalutes expressions once per update', function() {

    injectHTML('<expression-eval-count></expression-eval-count>')

    var tag = riot.mount('expression-eval-count')[0]
    expect(tag.count).to.be.equal(1)
    tag.update()
    expect(tag.count).to.be.equal(2)
    tag.unmount()
  })

  it('multi referenced elements to an array', function() {

    injectHTML('<multi-named></multi-named>')

    var mount = function() {
        var tag = this
        expect(tag.refs.rad[0].value).to.be.equal('1')
        expect(tag.refs.rad[1].value).to.be.equal('2')
        expect(tag.refs.rad[2].value).to.be.equal('3')
        expect(tag.refs.t.value).to.be.equal('1')
        expect(tag.refs.t_1.value).to.be.equal('1')
        expect(tag.refs.t_2.value).to.be.equal('2')
        expect(tag.refs.c[0].value).to.be.equal('1')
        expect(tag.refs.c[1].value).to.be.equal('2')
      },
      mountChild = function() {
        var tag = this
        expect(tag.refs.child.value).to.be.equal('child')
        expect(tag.refs.check[0].value).to.be.equal('one')
        expect(tag.refs.check[1].value).to.be.equal('two')
        expect(tag.refs.check[2].value).to.be.equal('three')

      }
    var tag = riot.mount('multi-named', { mount: mount, mountChild: mountChild })[0]

    tag.unmount()
  })


  it('input type=number', function() {

    injectHTML('<input-number></input-number>')

    var tag = riot.mount('input-number', {num: 123})[0]
    var inp = $('input', tag.root)
    expect(inp.getAttribute('type')).to.be.equal('number')
    expect(inp.value).to.be.equal('123')

    tag = riot.mount('input-number', {num: 0})[0]
    inp = $('input', tag.root)
    expect(inp.getAttribute('type')).to.be.equal('number')
    expect(inp.value).to.be.equal('0')

    tag = riot.mount('input-number', {num: null})[0]
    inp = $('input', tag.root)
    expect(inp.getAttribute('type')).to.be.equal('number')
    expect(inp.value).to.be.equal('')

    tag.unmount()

  })

  it('the input values should be updated corectly on any update call', function() {

    injectHTML('<input-values></input-values>')

    var tag = riot.mount('input-values')[0]
    expect(tag.refs.i.value).to.be.equal('hi')
    tag.update()
    expect(tag.refs.i.value).to.be.equal('foo')

    tag.unmount()
  })

  it('carrot position is preserved when input is same as calculated value', function() {

    injectHTML('<input-values></input-values>')

    var tag = riot.mount('input-values')[0]

    var newValue = 'some new text'
    tag.refs.i.value = newValue
    tag.refs.i.focus()
    setCarrotPos(tag.refs.i, 4)

    tag.message = newValue
    tag.update()

    expect(getCarrotPos(tag.refs.i)).to.be.equal(4)

    tag.unmount()
  })

  it('does not set value attribute', function() {

    injectHTML('<input-values></input-values>')

    var tag = riot.mount('input-values')[0]
    expect(tag.refs.i.value).to.be.equal('hi')
    expect(tag.refs.i.hasAttribute('value')).to.be.false
    tag.update()
    expect(tag.refs.i.value).to.be.equal('foo')
    expect(tag.refs.i.hasAttribute('value')).to.be.false

    tag.unmount()
  })

  it('updates the value of input which has been changed from initial one #2096', function() {

    injectHTML('<input-updated></input-updated>')

    var tag = riot.mount('input-updated')[0]
    expect(tag.refs.i.value).to.be.equal('Hello, Riot!')
    tag.refs.i.value = 'Hi!'
    fireEvent(tag.refs.b, 'click')
    expect(tag.refs.i.value).to.be.equal('Can you hear me?')

    tag.unmount()
  })

  it('fails to update the value of input which has the same internal value #1642 #2112', function() {

    injectHTML('<input-updated></input-updated>')

    var tag = riot.mount('input-updated')[0]
    fireEvent(tag.refs.b, 'click')
    expect(tag.refs.i.value).to.be.equal('Can you hear me?')

    tag.refs.i.value = 'Yeah.'
    fireEvent(tag.refs.b, 'click')
    expect(tag.refs.i.value).not.to.be.equal('Can you hear me?')
    // IT MAY SEEM WEIRD AT FIRST, BUT THIS IS SPEC.
    // See more detail on #1642

    tag.unmount()
  })

  it('recursive structure', function() {
    injectHTML('<treeview></treeview>')
    var tag = riot.mount('treeview')[0]
    expect(tag).to.be.an('object')
    expect(tag.isMounted).to.be.equal(true)
    tag.unmount()
  })

  it('top most tag preserve attribute expressions', function() {
    injectHTML('<top-attributes cls="classy"></top-attributes>')
    var tag = riot.mount('top-attributes')[0]
    expect(tag.root.className).to.be.equal('classy') // qouted
    expect(tag.root.getAttribute('data-noquote')).to.be.equal('quotes') // not quoted
    expect(tag.root.getAttribute('data-nqlast')).to.be.equal('quotes') // last attr with no quotes
    expect(tag.root.style.fontSize).to.be.equal('2em') // TODO: how to test riot-prefix?
    tag.unmount()
  })

  it('camelize the options passed via dom attributes', function() {
    injectHTML('<top-attributes></top-attributes>')
    var node = document.createElement('top-attributes'),
      tag

    node.setAttribute('my-random-attribute', 'hello')
    tag = riot.mount(node, {
      'another-random-option': 'hello'
    })[0]
    expect(tag.opts.myRandomAttribute).to.be.equal('hello')
    expect(tag.opts['another-random-option']).to.be.equal('hello')

    tag.unmount()
  })

  it('opts could be also an observable object (issue 2581)', function() {
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('riot-tmp', '<p>hello</p>')
    const [tag] = riot.mount('riot-tmp', riot.observable())

    expect(tag.opts.on).to.be.ok
    tag.unmount()
  })

  it('expressions object attributes get removed once used', function() {
    injectHTML('<top-attributes></top-attributes>')
    var node = document.createElement('top-attributes'),
      tag

    node.setAttribute('data', '{ opts }')
    tag = riot.mount(node, { message: 'hello' })[0]
    expect(tag.opts.data.message).to.be.equal('hello')
    expect(tag.root.getAttribute('data')).to.be.not.ok

    tag.unmount()
  })


  it('the "shouldUpdate" locks the tag update properly', function() {
    injectHTML('<should-update></should-update>')
    var tag = riot.mount('should-update')[0]
    expect(tag.update()).to.be.ok
    expect(tag.refs.count.innerHTML).to.be.equal('0')
    expect(tag.count).to.be.equal(0)
    tag.update(true)
    expect(tag.count).to.be.equal(1)
    tag.unmount()
  })

  it('the "shouldUpdate" accepts nextOpts', function() {
    injectHTML('<should-update-opts should-update="{ count === 0 }"></should-update-opts>')
    var tag = riot.mount('should-update-opts')[0]
    expect(tag.update()).to.be.ok
    expect(tag.count).to.be.equal(1)
    tag.update()
    expect(tag.count).to.be.equal(1)
    tag.unmount()
  })

  it('allow passing riot.observale instances to the children tags', function() {
    injectHTML('<observable-attr></observable-attr>')
    var tag = riot.mount('observable-attr')[0]
    expect(tag.tags['observable-attr-child'].wasTriggered).to.be.equal(true)
    tag.unmount()
  })

  it('nested virtual tags unmount properly', function() {
    injectHTML('<virtual-nested-unmount></virtual-nested-unmount>')
    var tag = riot.mount('virtual-nested-unmount')[0]
    var spans = $$('span', tag.root)
    var divs = $$('div', tag.root)
    expect(spans.length).to.be.equal(6)
    expect(divs.length).to.be.equal(3)
    expect(spans[0].innerHTML).to.be.equal('1')
    expect(spans[1].innerHTML).to.be.equal('1')
    expect(spans[2].innerHTML).to.be.equal('2')
    expect(spans[3].innerHTML).to.be.equal('1')
    expect(spans[4].innerHTML).to.be.equal('2')
    expect(spans[5].innerHTML).to.be.equal('3')
    expect(divs[0].innerHTML).to.be.equal('1')
    expect(divs[1].innerHTML).to.be.equal('2')
    expect(divs[2].innerHTML).to.be.equal('3')

    tag.childItems = [
      {title: '4', childchildItems: ['1', '2', '3', '4']},
      {title: '5', childchildItems: ['1', '2', '3', '4', '5']}
    ]
    tag.update()
    spans = $$('span', tag.root)
    divs = $$('div', tag.root)
    expect(spans.length).to.be.equal(9)
    expect(divs.length).to.be.equal(2)
    expect(spans[0].innerHTML).to.be.equal('1')
    expect(spans[1].innerHTML).to.be.equal('2')
    expect(spans[2].innerHTML).to.be.equal('3')
    expect(spans[3].innerHTML).to.be.equal('4')
    expect(spans[4].innerHTML).to.be.equal('1')
    expect(spans[5].innerHTML).to.be.equal('2')
    expect(spans[6].innerHTML).to.be.equal('3')
    expect(spans[7].innerHTML).to.be.equal('4')
    expect(spans[8].innerHTML).to.be.equal('5')
    expect(divs[0].innerHTML).to.be.equal('4')
    expect(divs[1].innerHTML).to.be.equal('5')

    tag.unmount()
  })

  it('render tag: input,option,textarea tags having expressions as value', function() {
    injectHTML('<form-controls></form-controls>')
    var val = 'my-value',
      tag = riot.mount('form-controls', { text: val })[0],
      root = tag.root

    expect($('input[type="text"]', root).value).to.be.equal(val)
    expect($('select option[selected]', root).value).to.be.equal(val)
    expect($('textarea[name="txta1"]', root).value).to.be.equal(val)
    expect($('textarea[name="txta2"]', root).value).to.be.equal('')
    if (IE_VERSION !== 9) expect($('textarea[name="txta2"]', root).placeholder).to.be.equal(val)

    tag.unmount()
  })

  it('multiple select will be properly rendered', function() {
    injectHTML('<multiple-select></multiple-select>')
    const tag = riot.mount('multiple-select')[0]
    const values = []
    ;[].forEach.call(tag.refs.sel.options, function(option) {
      if (option.selected) values.push(option.value)
    })
    expect(values).to.have.length(2)
    tag.unmount()
  })


  it('component nested in virtual unmounts correctly', function() {
    injectHTML('<virtual-nested-component></virtual-nested-component>')
    var tag = riot.mount('virtual-nested-component')[0]
    var components = $$('not-virtual-component2', tag.root)

    expect(components.length).to.be.equal(4)
    expect(tag.tags['not-virtual-component2']).to.have.length(4)

    tag.people.pop()
    tag.update()

    components = $$('not-virtual-component2', tag.root)
    expect(components.length).to.be.equal(3)
    expect(tag.tags['not-virtual-component2']).to.have.length(3)

    tag.unmount()

    components = $$('not-virtual-component2', tag.root)
    expect(components.length).to.be.equal(0)
  })

  it('event handler on each custom tag doesnt update parent', function() {

    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('inner', '<button ref="btn" onclick="{foo}" />', function() {
      this.foo = function() {}.bind()
    })

    riot.tag('riot-tmp', '<inner each="{item in items}" />', function() {
      this.items = [1]
      this.updateCount = 0
      this.on('update', function() { this.updateCount++ })
    })

    var tag = riot.mount('riot-tmp')[0]

    expect(tag.updateCount).to.be.equal(0)
    fireEvent(tag.tags.inner[0].refs.btn, 'click')
    expect(tag.updateCount).to.be.equal(0)


    tag.unmount()

  })

  it('the class attributes get properly removed in case of falsy values', function(done) {

    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<p class="{ foo: isFoo }">foo</p>', function() {
      this.isFoo = true
    })

    var tag = riot.mount('riot-tmp')[0],
      p = $('p', tag.root)

    expect(p.hasAttribute('class')).to.be.equal(true)

    // Edge 16 has some race condition issues so we need to defer this check
    setTimeout(() => {
      tag.isFoo = false
      tag.update()
      expect(p.hasAttribute('class')).to.be.equal(false)
      tag.unmount()
      done()
    }, 100)
  })

  it('custom attributes should not be removed if not falsy', function() {
    injectHTML('<riot-tmp data-index="{ index }"></riot-tmp>')

    riot.tag('riot-tmp', '<p></p>', function() {
      this.index = 0
    })

    var tag = riot.mount('riot-tmp')[0]

    expect(tag.opts.dataIndex).to.be.equal(0)
    expect(tag.root.getAttribute('data-index')).to.be.ok
    tag.index = false
    tag.update()
    expect(tag.root.getAttribute('data-index')).to.be.not.ok

    tag.unmount()
  })

  it('make sure the tag context is preserved during updates', function(done) {
    injectHTML('<update-context></update-context>')

    var tag = riot.mount('update-context')[0]

    expect(tag.message).to.be.equal('hi')

    tag.on('updated', function() {
      expect($('p', this.root).textContent).to.be.equal('goodbye')
      expect(tag.unmount()).to.be.an('object')
      done()
      tag.unmount()
    })
  })

  it('create tags extending the riot.Tag constructor', function() {
    class Component extends riot.Tag {
      get name() { return 'component' }
      get tmpl() { return '<h1 onclick="{ onClick }">{ opts.message } { user }</h1>' }
      onCreate() {
        this.user = 'dear User'
      }
      onClick() {
        this.user = 'the user is gone'
      }
    }

    var component = new Component(document.createElement('div'), {
      message: 'hello'
    })
    var h1 = $('h1', component.root)

    expect(component.opts.message).to.be.equal('hello')
    expect(component.user).to.be.equal('dear User')
    expect(h1.textContent).to.be.equal('hello dear User')

    fireEvent(h1, 'click')

    expect(h1.textContent).to.be.equal('hello the user is gone')

    // make sure the component is properly registered
    injectHTML('<component></component>')

    var tag = riot.mount('component', {message: 'hi'})[0]
    expect(tag.opts.message).to.be.equal('hi')

    tag.unmount()
    component.unmount()
  })

  it('extend existing tags created via riot.Tag constructor', function() {
    class Component extends riot.Tag {
      get name() { return 'component' }
      get tmpl() { return '<h1 onclick="{ onClick }">{ opts.message } { user }</h1>' }
      onCreate() {
        this.user = 'dear User'
      }
      onClick() {
        this.user = 'the user is gone'
      }
    }

    class SubComponent extends Component {
      get name() { return 'sub-component' }
      get tmpl() { return '<h2 onclick="{ onClick }">{ opts.message } { user }</h2>' }
    }

    var subComponent = new SubComponent(document.createElement('div'), {
      message: 'hello'
    })

    var h2 = $('h2', subComponent.root)

    expect(subComponent.opts.message).to.be.equal('hello')
    expect(subComponent.user).to.be.equal('dear User')
    expect(h2.textContent).to.be.equal('hello dear User')

    // make sure the sub-component is properly registered
    injectHTML('<sub-component></sub-component>')

    var tag = riot.mount('sub-component', {message: 'hi'})[0]
    expect(tag.opts.message).to.be.equal('hi')

    tag.unmount()
    subComponent.unmount()
  })

  it('gets the reference by data-ref attribute', function() {
    injectHTML('<named-data-ref></named-data-ref>')
    var tag = riot.mount('named-data-ref')[0]
    expect(tag.refs.greeting.value).to.be.equal('Hello')

    tag.unmount()
  })

  it('unmounting a tag containing ref will not throw', function() {

    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<div ref="child" onclick="{ unmount }"></div>', function() {
      this.isFoo = true
    })

    var tag = riot.mount('riot-tmp')[0]
    fireEvent(tag.refs.child, 'click')
    expect(tag.isMounted).to.be.equal(false)
    tag.unmount()
  })

  it('dom nodes  having "ref" attributes and upgraded to tags do not appeart twice in the parent', function() {
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('riot-tmp-sub', '<p>hi</p>')

    riot.tag('riot-tmp', '<div ref="child"></div>', function() {
      this.on('mount', () => {
        riot.mount(this.refs.child, 'riot-tmp-sub', { parent: this })
      })
    })

    var tag = riot.mount('riot-tmp')[0]

    expect(tag.refs.child).to.be.not.an('array')
    expect(tag.refs.child.hasAttribute('ref')).to.be.ok

    tag.unmount()
  })

  it('ref attributes will be removed only if falsy or not strings', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', `
      <div ref='child'></div>
      <div ref="{ expr }"></div>
      <div ref="{ null }"></div>
      <div ref="{ false }"></div>
      <div ref="{ '' }"></div>
    `, function() {
      this.expr = 'expr'
    })

    var tag = riot.mount('riot-tmp')[0],
      divs = $$('div', tag.root)

    expect(tag.refs.child).to.be.ok
    expect(tag.refs.expr).to.be.ok

    expect(divs[0].hasAttribute('ref')).to.be.ok
    expect(divs[1].hasAttribute('ref')).to.be.ok
    expect(divs[2].hasAttribute('ref')).to.be.not.ok
    expect(divs[3].hasAttribute('ref')).to.be.not.ok
    expect(divs[4].hasAttribute('ref')).to.be.not.ok

    tag.unmount()
  })


  it('virtual tags can be used with dynamic data-is', function() {
    injectHTML('<dynamic-virtual></dynamic-virtual>')

    var tag = riot.mount('dynamic-virtual')[0]
    var first = tag.root.firstElementChild
    expect(first.tagName).to.be.equal('P')
    expect(first.innerHTML).to.be.equal('yielded data')

    tag.render = 'xtag'
    tag.update()
    first = tag.root.firstElementChild
    expect(first.tagName).to.be.equal('SPAN')
    expect(first.innerHTML).to.be.equal('virtual data-is')

    tag.unmount()
  })

  it('nested dynamic tags retain data-is attribute', function() {
    injectHTML('<dynamic-nested></dynamic-nested>')
    var tag = riot.mount('dynamic-nested')[0]

    expect(tag.refs.dynamic.root.getAttribute('data-is')).to.be.equal('page-a')
    expect(tag.tags['page-a'].root.querySelector('h1').innerHTML).to.be.equal('page-a')

    tag.page = 'page-b'
    tag.update()
    expect(tag.refs.dynamic.root.getAttribute('data-is')).to.be.equal('page-b')
    expect(tag.tags['page-b'].root.querySelector('h1').innerHTML).to.be.equal('page-b')

    tag.unmount()
  })

  it('virtual tags with conditional will mount their children tags properly', function() {
    injectHTML('<virtual-conditional></virtual-conditional>')
    var tag = riot.mount('virtual-conditional')[0]

    riot.util.tmpl.errorHandler = function () {
      throw new Error('It should render without errors')
    }

    expect(tag.childMountCount).to.be.equal(0)
    tag.user = { name: 'foo' }

    tag.update()
    expect(tag.childMountCount).to.be.equal(1)

    riot.util.tmpl.errorHandler = null

    tag.unmount()

  })

  it('the value attribute on a riot tag gets properly passed as option', function() {
    injectHTML('<riot-tmp-value></riot-tmp-value>')
    riot.tag('riot-tmp', '<p>{ opts.value }</p>')
    riot.tag('riot-tmp-value', '<riot-tmp value="{ value }"></riot-tmp>', function() {
      this.value = 'foo'
    })
    var tag = riot.mount('riot-tmp-value')[0]
    expect(tag.tags['riot-tmp'].opts.value).to.be.equal('foo')
    expect(tag.tags['riot-tmp'].opts.riotValue).to.be.not.ok
    tag.unmount()
  })

  it('the null attributes should be not transformed to empty strings', function() {
    injectHTML('<riot-tmp-value></riot-tmp-value>')
    riot.tag('riot-tmp', '<p>{ opts.value }</p>')
    riot.tag('riot-tmp-value', '<riot-tmp value="{ null }" value2="{ undefined }"></riot-tmp>')
    var tag = riot.mount('riot-tmp-value')[0]
    expect(tag.tags['riot-tmp'].opts.value).to.be.equal(null)
    expect(tag.tags['riot-tmp'].opts.value2).to.be.equal(undefined)
    tag.unmount()
  })

  it('style properties could be passed also as object', function() {
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('riot-tmp', '<p riot-style="{ style }">hi</p>')
    var tag = riot.mount('riot-tmp')[0],
      p = $('p', this.root)

    tag.style = { color: 'red', height: '10px'}
    tag.update()

    expect(p.style.color).to.be.equal('red')
    expect(p.style.height).to.be.equal('10px')

    tag.unmount()
  })


  it('class properties could be passed also as object', function() {
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('riot-tmp', '<p class="{ classes }">hi</p>')
    var tag = riot.mount('riot-tmp')[0],
      p = $('p', this.root)

    tag.classes = { foo: true, bar: false }
    tag.update()
    expect(p.getAttribute('class')).to.be.equal('foo')
    tag.classes = { foo: true, bar: true }
    tag.update()
    expect(p.getAttribute('class')).to.be.equal('foo bar')
    tag.unmount()
  })

  it('undefined text node should not be rendered', function() {
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('riot-tmp', '<p>{ message }</p>')

    var tag = riot.mount('riot-tmp')[0],
      p = $('p', this.root)

    expect(p.innerHTML).to.be.not.equal('undefined')

    tag.unmount()
  })

  it('subtags created via is get properly unmounted', function() {
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('riot-tmp-sub', '<p>hi</p>')
    riot.tag('riot-tmp', '<div if="{ showSub }"><div data-is="{ subTag }"></div></div>')

    var tag = riot.mount('riot-tmp')[0],
      unmount = sinon.spy()

    expect(tag.tags['riot-tmp-sub']).to.be.not.ok

    tag.showSub = true
    tag.subTag = 'riot-tmp-sub'
    tag.update()

    expect(tag.tags['riot-tmp-sub']).to.be.ok
    tag.tags['riot-tmp-sub'].on('unmount', unmount)

    tag.showSub = false
    tag.update()

    expect(tag.tags['riot-tmp-sub']).to.be.not.ok
    expect(unmount).to.have.been.called

    tag.unmount()
  })

  it('riot can mount also inline templates', function() {
    injectHTML(`
      <riot-tmp>
        <p ref="mes">{ message }</p>
        <riot-tmp-sub ref="sub" message="{ message }">
          <p ref="mes">{ message }</p>
        </riot-tmp-sub>
      </riot-tmp>`)

    riot.tag('riot-tmp', false, function() {
      this.message = 'hello'
    })

    riot.tag('riot-tmp-sub', false, function(opts) {
      this.message = opts.message
    })

    var tag = riot.mount('riot-tmp')[0]

    expect(tag.refs.mes.innerHTML).to.be.equal(tag.message)
    expect(tag.refs.sub.refs.mes.innerHTML).to.be.equal(tag.message)

    tag.unmount()
  })


  it('tags in an svg context are automatically detected and properly created see #2290', function() {
    injectHTML('<svg id="tmpsvg"><g data-is="riot-tmp"></g></svg>')

    riot.tag('riot-tmp', '<circle riot-cx="{ 10 + 5 }" riot-cy="{ 10 + 5 }" r="2" fill="black"></circle>')

    var tag = riot.mount('riot-tmp')[0],
      circle = $('circle', this.root)

    expect(circle instanceof HTMLElement).to.be.equal(false)

    tag.unmount()
    document.body.removeChild(window.tmpsvg)
  })

  it('disable the auto updates via settings.autoUpdate = false', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<p ref="p" onclick="{ updateMessage }">{ message }</p>', function() {
      this.message = 'hi'
      this.updateMessage = function() {
        this.message = 'goodbye'
      }
    })

    riot.settings.autoUpdate = false
    var tag = riot.mount('riot-tmp')[0]

    expect(tag.refs.p.innerHTML).to.be.equal(tag.message)

    fireEvent(tag.refs.p, 'click')

    expect(tag.refs.p.innerHTML).to.be.not.equal(tag.message)

    tag.unmount()
    riot.settings.autoUpdate = true
  })

  it('updates during the mount event should properly update the DOM', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<p ref="p">{ message }</p>', function() {
      this.message = 'hi'
      this.on('mount', () => {
        this.message = 'goodbye'
        this.update()
      })
    })

    var tag = riot.mount('riot-tmp')[0]
    expect(tag.refs.p.innerHTML).to.be.equal('goodbye')
    tag.unmount()
  })

  it('avoid to get ref attributes on yield tags', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<yield ref="foo"/>')

    var tag = riot.mount('riot-tmp')[0]
    expect(tag.refs.foo).to.be.undefined
    tag.unmount()
  })

  it('remove style attributes if they contain blank values', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', "<p ref='p' riot-style=\"{changed ? 'background-color: green' : ''}\"></p>", function() {
      this.changed = true
    })

    var tag = riot.mount('riot-tmp')[0]
    expect(tag.refs.p.hasAttribute('style')).to.be.ok
    tag.changed = false
    tag.update()
    expect(tag.refs.p.hasAttribute('style')).to.be.not.ok

    tag.unmount()
  })

  it('avoid to clean the DOM for the default riot.unmount call', function(done) {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp-sub', '<p id="{ id }">foo</p>', function() {
      this.id = `id-${ this._riot_id }`

      this.on('before-unmount', () => {
        expect(document.getElementById(this.id)).to.be.ok
        done()
      })
    })

    riot.tag('riot-tmp', '<riot-tmp-sub></riot-tmp-sub>')

    var tag = riot.mount('riot-tmp')[0]

    setTimeout(() => {
      expect(document.getElementById(tag.tags['riot-tmp-sub'].id)).to.be.ok
      tag.unmount()
    }, 100)
  })

  it('avoid to bind wrong named events handlers (issue #2592)', function() {
    const click = sinon.spy()

    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<p ref="p" click="{onClick}"></p>',function() {
      this.onClick = click
    })

    const tag = riot.mount('riot-tmp')[0]
    const p = tag.refs.p

    fireEvent(p, 'click')

    expect(click).to.have.not.been.called

    tag.unmount()
  })

  it('does not attempt to makeReplaceVirtual when parentNode no longer exists in DOM (issue 2614)', function () {
    riot.tag('riot-unmountable', '<virtual ref="virtual">Hi</virtual>')
    injectHTML('<riot-unmountable></riot-unmountable>')
    const tag = riot.mount('riot-unmountable')[0]
    const virt = tag.refs.virtual

    // unmount the tag; virt.root.parentNode will now be null
    tag.unmount()
    riot.util.tags.makeReplaceVirtual(virt, virt.root)

    // getting to this point proves makeReplaceVirtual returned early (i.e., did not error)
    expect(true).to.be.true
  })

  it('make sure options will be not shared between components via riot.mount (issue 2613)', function () {
    injectHTML('<riot-tmp title="Bar"></riot-tmp>')
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('riot-tmp', '{opts.title}')

    const tags = riot.mount('riot-tmp', function() {
      return { title: 'Baz' }
    })

    expect(tags[0].opts.title).to.be.equal('Bar')
    expect(tags[1].opts.title).to.be.equal('Baz')

    tags.forEach(tag => tag.unmount())
  })

  it('Don\'t remove value attributes with the settings keepValueAttributes=true #2629', function(){
    injectHTML('<bug-2629></bug-2629>')
    riot.settings.keepValueAttributes = true
    const tag = riot.mount('bug-2629')[0]

    tag.update()
    expect(tag.refs.option.childNodes[1].hasAttribute('value')).to.be.ok
    expect(tag.refs.check[1].value).to.be.equal('')
    expect(tag.refs.radio[1].value).to.be.equal('')
    tag.unmount()
    riot.settings.keepValueAttributes = false
  })

  it('Remove empty attributes with the settings keepValueAttributes=false #2629', function(){
    injectHTML('<bug-2629></bug-2629>')
    riot.settings.keepValueAttributes = false

    const tag = riot.mount('bug-2629')[0]

    tag.update()
    expect(tag.refs.option.childNodes[1].hasAttribute('value')).to.be.not.ok
    expect(tag.refs.check[1].value).to.be.a('string')
    expect(tag.refs.radio[1].value).to.be.a('string')
    tag.unmount()
  })
})

Added public/riot-3.13.2/test/specs/browser/riot/each-keys.spec.js.















































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import { injectHTML } from '../../../helpers/index'

describe('Riot each keyed', () => {
  it('identity update', () => {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp-sub', '<div>{identifier}</div>', function(opts) {
      this.identifier = opts.identifier
    })

    riot.tag('riot-tmp', '<riot-tmp-sub key="id" each="{item in items}" ref="children" identifier="{ item.id }" />', function() {
      this.items = [
        { id: 0 },
        { id: 1 },
        { id: 2 }
      ]
    })

    const [tag] = riot.mount('riot-tmp')
    const [firstTag, secondTag, thirdTag] = tag.refs.children

    tag.items[0] = { id: 0, isNew: true }
    tag.items[1] = { id: 1, isNew: true }
    tag.items[2] = { id: 2, isNew: true }

    tag.update()

    expect(firstTag._riot_id).to.be.equal(tag.refs.children[0]._riot_id)
    expect(secondTag._riot_id).to.be.equal(tag.refs.children[1]._riot_id)
    expect(thirdTag._riot_id).to.be.equal(tag.refs.children[2]._riot_id)

    tag.unmount()
  })

  it('reorder', () => {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp-sub', '<div>{identifier}</div>', function(opts) {
      this.id = opts.identifier
    })

    riot.tag('riot-tmp', '<riot-tmp-sub key="id" each="{item in items}" ref="children" identifier="{ item.id }" />', function() {
      this.items = [
        { id: 0 },
        { id: 1 },
        { id: 2 }
      ]
    })

    const [tag] = riot.mount('riot-tmp')
    const [firstTag, secondTag, thirdTag] = tag.refs.children

    tag.items[0] = { id: 2 }
    tag.items[1] = { id: 1 }
    tag.items[2] = { id: 0 }

    tag.update()

    expect(firstTag._riot_id).to.be.equal(tag.refs.children[2]._riot_id)
    expect(secondTag._riot_id).to.be.equal(tag.refs.children[1]._riot_id)
    expect(thirdTag._riot_id).to.be.equal(tag.refs.children[0]._riot_id)

    tag.unmount()
  })

  it('identity (with expressions)', () => {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp-sub', '<div>{identifier}</div>', function(opts) {
      this.identifier = opts.identifier
    })

    riot.tag('riot-tmp', '<riot-tmp-sub key="{ item.id }" each="{item in items}" ref="children" identifier="{ item.id }" />', function() {
      this.items = [
        { id: 0 },
        { id: 1 },
        { id: 2 }
      ]
    })

    const [tag] = riot.mount('riot-tmp')
    const [firstTag, secondTag, thirdTag] = tag.refs.children

    tag.items[0] = { id: 0, isNew: true }
    tag.items[1] = { id: 1, isNew: true }
    tag.items[2] = { id: 2, isNew: true }

    tag.update()

    expect(firstTag._riot_id).to.be.equal(tag.refs.children[0]._riot_id)
    expect(secondTag._riot_id).to.be.equal(tag.refs.children[1]._riot_id)
    expect(thirdTag._riot_id).to.be.equal(tag.refs.children[2]._riot_id)

    tag.unmount()
  })

  it('reorder ( with expressions )', () => {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp-sub', '<div>{identifier}</div>', function(opts) {
      this.id = opts.identifier
    })

    riot.tag('riot-tmp', '<riot-tmp-sub key="{ item.id }" each="{item in items}" ref="children" identifier="{ item.id }" />', function() {
      this.items = [
        { id: 0 },
        { id: 1 },
        { id: 2 }
      ]
    })

    const [tag] = riot.mount('riot-tmp')
    const [firstTag, secondTag, thirdTag] = tag.refs.children

    tag.items[0] = { id: 2 }
    tag.items[1] = { id: 1 }
    tag.items[2] = { id: 0 }

    tag.update()

    expect(firstTag._riot_id).to.be.equal(tag.refs.children[2]._riot_id)
    expect(secondTag._riot_id).to.be.equal(tag.refs.children[1]._riot_id)
    expect(thirdTag._riot_id).to.be.equal(tag.refs.children[0]._riot_id)

    tag.unmount()
  })

  it('conditional and loop with strings (issue 2574)', () => {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<p ref="letter" each="{ letter in \'string\' }" if="{ /s|t/.test(letter) }">{letter}</p>')

    const [tag] = riot.mount('riot-tmp')

    expect(tag.refs.letter).to.have.length(2)

    tag.unmount()
  })

  it('object loop should unmount child nodes properly (issue 2580)', () => {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp-sub', '<div>{opts.identifier}</div>', function(opts) {
      this.id = opts.identifier
    })

    riot.tag('riot-tmp', '<riot-tmp-sub key="{ item.id }" each="{item in items}" ref="children" identifier="{ item.id }" />', function() {
      this.items = {
        1: { id: 1 },
        2: { id: 2 },
        3: { id: 3 },
      }
    })

    const [tag] = riot.mount('riot-tmp')
    const [firstTag, secondTag, thirdTag] = tag.refs.children // eslint-disable-line

    delete tag.items[2]

    tag.update()

    expect(firstTag._riot_id).to.be.equal(tag.refs.children[0]._riot_id)
    expect(thirdTag._riot_id).to.be.equal(tag.refs.children[1]._riot_id)

    tag.unmount()
  })
})

Added public/riot-3.13.2/test/specs/browser/riot/each-no-keys.spec.js.







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
import {
  injectHTML,
  $$,
  $,
  IE_VERSION,
  getNextSibling,
  getPreviousSibling,
  normalizeHTML,
  fireEvent,
} from '../../../helpers/index'

// include special tags to test specific features
import '../../../tag/loop-svg-nodes.tag'
import '../../../tag/loop-position.tag'
import '../../../tag/table-data.tag'
import '../../../tag/loop-option.tag'
import '../../../tag/loop-optgroup.tag'
import '../../../tag/loop-optgroup2.tag'
import '../../../tag/loop-arraylike.tag'
import '../../../tag/loop-ids.tag'
import '../../../tag/loop-unshift.tag'
import '../../../tag/loop-virtual.tag'
import '../../../tag/loop-null-items.tag'
import '../../../tag/loop-named.tag'
import '../../../tag/loop-single-tags.tag'
import '../../../tag/loop.tag'
import '../../../tag/loop-cols.tag'
import '../../../tag/loop-child.tag'
import '../../../tag/loop-combo.tag'
import '../../../tag/loop-reorder.tag'
import '../../../tag/loop-swap-type.tag'
import '../../../tag/loop-manip.tag'
import '../../../tag/loop-object.tag'
import '../../../tag/loop-object-conditional.tag'
import '../../../tag/loop-tag-instances.tag'
import '../../../tag/loop-nested.tag'
import '../../../tag/loop-numbers-nested.tag'
import '../../../tag/loop-nested-strings-array.tag'
import '../../../tag/loop-events.tag'
import '../../../tag/loop-sync-options-nested.tag'
import '../../../tag/loop-inherit.tag'
import '../../../tag/loop-root.tag'
import '../../../tag/loop-double-curly-brackets.tag'
import '../../../tag/loop-conditional.tag'
import '../../../tag/loop-protect-internal-attrs.tag'
import '../../../tag/loop-noloop-option.tag'
import '../../../tag/loop-items-attrs.tag'
import '../../../tag/ploop-tag.tag'
import '../../../tag/table-loop-extra-row.tag'
import '../../../tag/obj-key-loop.tag'
import '../../../tag/loop-sync-options.tag'
import '../../../tag/outer.tag'
import '../../../tag/reserved-names.tag'
import '../../../tag/loop-bug-1649.tag'
import '../../../tag/loop-bug-2205.tag'
import '../../../tag/loop-bug-2240.tag'
import '../../../tag/loop-bug-2242.tag'

import '../../../tag/select-test.tag'
import '../../../tag/named-select.tag'

import '../../../tag/table-thead-tfoot.tag'
import '../../../tag/table-multibody.tag'
import '../../../tag/table-thead-tfoot-nested.tag'
import '../../../tag/table-test.tag'

import '../../../tag/virtual-no-loop.tag'
import '../../../tag/virtual-yield-loop.tag'

describe('Riot each not keyed', function() {
  it('the loop elements keep their position in the DOM', function() {
    injectHTML('<loop-position></loop-position>')
    const tag = riot.mount('loop-position')[0],
      h3 = $('h3', tag.root)

    expect(getPreviousSibling(h3).tagName.toLowerCase()).to.be.equal('p')
    expect(getNextSibling(h3).tagName.toLowerCase()).to.be.equal('p')

    tag.unmount()

  })

  it('SVGs nodes can be properly looped', function() {

    injectHTML('<loop-svg-nodes></loop-svg-nodes>')

    const tag = riot.mount('loop-svg-nodes')[0]

    expect($$('svg circle', tag.root).length).to.be.equal(5)
    expect($('svg circle',  tag.root).ownerSVGElement).to.be.ok
    expect(tag.tags['loop-svg-nodes-custom-circle'][0].refs.circle.ownerSVGElement).to.be.ok
    expect($('p',  tag.root) instanceof HTMLElement).to.be.equal(true)

    tag.unmount()
  })

  it('the root keyword should be protected also in the loops', function() {

    injectHTML('<loop-root></loop-root>')
    const tag = riot.mount('loop-root')[0]

    expect($$('li', tag.root).length).to.be.equal(3)

    tag.splice()
    tag.update()

    expect($$('li', tag.root).length).to.be.equal(2)

    tag.unmount()

  })

  it('avoid to duplicate tags in multiple foreach loops', function() {

    injectHTML([
      '<outer id="outer1"></outer>',
      '<outer id="outer2"></outer>',
      '<outer id="outer3"></outer>'
    ])

    var mountTag = function(tagId) {
      var data = [],
        tag,
        itemsCount = 5

      while (itemsCount--) {
        data.push({
          value: 'item #' + itemsCount
        })
      }

      tag = riot.mount(tagId, {data: data})[0]
      // comment the following line to check the rendered html

      return tag

    }

    var outer1 = mountTag('#outer1'),
      outer2 = mountTag('#outer2'),
      outer3 = mountTag('#outer3')

    expect(outer1.root.getElementsByTagName('outer-inner').length).to.be.equal(5)
    expect(outer1.root.getElementsByTagName('span').length).to.be.equal(5)
    expect(outer1.root.getElementsByTagName('p').length).to.be.equal(5)
    expect(outer2.root.getElementsByTagName('outer-inner').length).to.be.equal(5)
    expect(outer2.root.getElementsByTagName('span').length).to.be.equal(5)
    expect(outer2.root.getElementsByTagName('p').length).to.be.equal(5)
    expect(outer3.root.getElementsByTagName('outer-inner').length).to.be.equal(5)
    expect(outer3.root.getElementsByTagName('span').length).to.be.equal(5)
    expect(outer3.root.getElementsByTagName('p').length).to.be.equal(5)

    outer1.unmount()
    outer2.unmount()
    outer3.unmount()

  })

  it('the each loops update correctly the DOM nodes', function() {

    injectHTML('<loop></loop>')

    var onItemClick = function(e) {
        var elIndex = Array.prototype.slice.call(children).indexOf(e.currentTarget)
        expect(tag.items[elIndex]).to.be.equal(e.item.item)
      },
      removeItemClick = function(e) {
        var index = tag.removes.indexOf(e.item)
        if (index < 0) return
        tag.removes.splice(index, 1)
      },
      tag = riot.mount('loop', { onItemClick: onItemClick, removeItemClick: removeItemClick })[0],
      root = tag.root,
      button = root.getElementsByTagName('button')[0],
      children,
      itemsCount = 5

    tag.items = []
    tag.removes = []

    while (itemsCount--) {
      tag.removes.push({
        value: 'remove item #' + tag.items.length
      })
      tag.items.push({
        value: 'item #' + tag.items.length
      })
    }
    tag.update()

    // remove the items being sure that item passed is the correct one
    for (var i = 0; i < tag.items.length; i++) {
      var curItem = tag.removes[0],
        ev = new CustomEvent('click'),
        el = root.getElementsByTagName('dt')[0]

      el.dispatchEvent(ev)
      expect(curItem).to.be.equal(ev.item)
    }

    children = root.getElementsByTagName('li')
    Array.prototype.forEach.call(children, function(child) {
      fireEvent(child, 'click')
    })
    expect(children.length).to.be.equal(5)

    // no update is required here
    fireEvent(button, 'click')
    children = root.getElementsByTagName('li')
    expect(children.length).to.be.equal(10)

    Array.prototype.forEach.call(children, function(child) {
      fireEvent(child, 'click')
    })

    expect(normalizeHTML(root.getElementsByTagName('ul')[0].innerHTML)).to.be.equal('<li>0 item #0 </li><li>1 item #1 </li><li>2 item #2 </li><li>3 item #3 </li><li>4 item #4 </li><li>5 item #5 </li><li>6 item #6 </li><li>7 item #7 </li><li>8 item #8 </li><li>9 item #9 </li>')

    tag.items.reverse()
    tag.update()
    children = root.getElementsByTagName('li')
    expect(children.length).to.be.equal(10)
    Array.prototype.forEach.call(children, function(child) {
      fireEvent(child, 'click')
    })

    expect(normalizeHTML(root.getElementsByTagName('ul')[0].innerHTML)).to.be.equal('<li>0 item #9 </li><li>1 item #8 </li><li>2 item #7 </li><li>3 item #6 </li><li>4 item #5 </li><li>5 item #4 </li><li>6 item #3 </li><li>7 item #2 </li><li>8 item #1 </li><li>9 item #0 </li>'.trim())

    var tempItem = tag.items[1]
    tag.items[1] = tag.items[8]
    tag.items[8] = tempItem
    tag.update()

    Array.prototype.forEach.call(children, function(child) {
      fireEvent(child, 'click')
    })

    expect(normalizeHTML(root.getElementsByTagName('ul')[0].innerHTML)).to.be.equal('<li>0 item #9 </li><li>1 item #1 </li><li>2 item #7 </li><li>3 item #6 </li><li>4 item #5 </li><li>5 item #4 </li><li>6 item #3 </li><li>7 item #2 </li><li>8 item #8 </li><li>9 item #0 </li>'.trim())

    tag.items = null
    tag.update()
    expect(root.getElementsByTagName('li').length).to.be.equal(0)

    tag.unmount()

  })

  it('the event.item property gets handled correctly also in the nested loops', function() {

    injectHTML('<loop-events></loop-events>')

    const tag = riot.mount('loop-events', {
      cb: function(e, item) {
        eventsCounter++
        if (e.stopPropagation)
          e.stopPropagation()
        expect(JSON.stringify(item)).to.be.equal(JSON.stringify(testItem))
      }
    })[0]

    let
      eventsCounter = 0,
      testItem

    // 1st test
    testItem = { outerCount: 'out', outerI: 0 }
    fireEvent(tag.root.getElementsByTagName('inner-loop-events')[0], 'click')
    // 2nd test inner contents
    testItem = { innerCount: 'in', innerI: 0 }
    fireEvent(tag.root.getElementsByTagName('button')[1], 'click')
    fireEvent(tag.root.getElementsByTagName('li')[0], 'click')

    expect(eventsCounter).to.be.equal(3)

    tag.unmount()

  })

  it('can loop also collections including null items', function() {

    injectHTML('<loop-null-items></loop-null-items>')

    const tag = riot.mount('loop-null-items')[0]
    expect($$('li', tag.root).length).to.be.equal(7)
    tag.unmount()
  })

  it('each loop creates correctly a new context', function() {

    injectHTML('<loop-child></loop-child>')

    const tag = riot.mount('loop-child')[0],
      root = tag.root,
      children = root.getElementsByTagName('looped-child')

    expect(children.length).to.be.equal(2)
    expect(tag.tags['looped-child'].length).to.be.equal(2)
    expect(tag.tags['looped-child'][0].hit).to.be.a('function')
    expect(normalizeHTML(children[0].innerHTML)).to.be.equal('<h3>one</h3><button>one</button>')
    expect(normalizeHTML(children[1].innerHTML)).to.be.equal('<h3>two</h3><button>two</button>')

    tag.items = [ {name: 'one'}, {name: 'two'}, {name: 'three'} ]
    tag.update()
    expect(root.getElementsByTagName('looped-child').length).to.be.equal(3)

    expect(tag.tags['looped-child'][2].isMounted).to.be.equal(true)
    expect(tag.tags['looped-child'].length).to.be.equal(3)

    expect(root.getElementsByTagName('looped-child')[0].style.color).to.be.equal('red')
    fireEvent(root.getElementsByTagName('looped-child')[0].getElementsByTagName('button')[0], 'click')
    expect(root.getElementsByTagName('looped-child')[0].style.color).to.be.equal('blue')

    tag.unmount()

  })


  it('the loop children tags must fire the \'mount\' event when they are already injectend into the parent', function(done) {

    injectHTML('<loop-child></loop-child>')

    const tag = riot.mount('loop-child')[0]

    setTimeout(function() {
      tag.tags['looped-child'].forEach(function(child) {
        expect(child.mountWidth).to.be.above(0)
      })

      tag.childrenMountWidths.forEach(function(width) {
        expect(width).to.be.above(0)
      })

      tag.unmount()

      done()
    }, 100)

  })

  it('the `array.unshift` method does not break the loop', function() {

    injectHTML('<loop-unshift></loop-unshift>')

    const tag = riot.mount('loop-unshift')[0]

    expect(tag.tags['loop-unshift-item'].length).to.be.equal(2)
    expect(normalizeHTML(tag.root.getElementsByTagName('loop-unshift-item')[0].innerHTML)).to.be.equal('<p>woo</p>')
    tag.items.unshift({ name: 'baz' })
    tag.update()
    expect(normalizeHTML(tag.root.getElementsByTagName('loop-unshift-item')[0].innerHTML)).to.be.equal('<p>baz</p>')

    tag.unmount()

  })

  it('each loop adds and removes items in the right position (when multiple items share the same html)', function() {

    injectHTML('<loop-manip></loop-manip>')

    const tag = riot.mount('loop-manip')[0],
      root = tag.root

    tag.top()
    tag.update()
    tag.bottom()
    tag.update()
    tag.top()
    tag.update()
    tag.bottom()
    tag.update()

    expect(normalizeHTML(root.getElementsByTagName('ul')[0].innerHTML)).to.be.equal('<li>100 <a>remove</a></li><li>100 <a>remove</a></li><li>0 <a>remove</a></li><li>1 <a>remove</a></li><li>2 <a>remove</a></li><li>3 <a>remove</a></li><li>4 <a>remove</a></li><li>5 <a>remove</a></li><li>100 <a>remove</a></li><li>100 <a>remove</a></li>'.trim())

    tag.unmount()

  })


  it('tags in different each loops dont collide', function() {

    injectHTML('<loop-combo></loop-combo>')

    const tag = riot.mount('loop-combo')[0]

    expect(normalizeHTML(tag.root.innerHTML))
      .to.be.equal('<lci x="a"></lci><div><lci x="y"></lci></div>')

    tag.update({b: ['z']})

    expect(normalizeHTML(tag.root.innerHTML))
      .to.be.equal('<lci x="a"></lci><div><lci x="z"></lci></div>')

    tag.unmount()

  })

  it('iterate over an object, then modify the property and update itself', function() {

    injectHTML('<loop-object></loop-object>')

    const tag = riot.mount('loop-object')[0]
    var root = tag.root

    expect(normalizeHTML(root.getElementsByTagName('div')[0].innerHTML))
      .to.be.equal('<p>zero = 0</p><p>one = 1</p><p>two = 2</p><p>three = 3</p>')

    for (var key in tag.obj) { // eslint-disable-line guard-for-in
      tag.obj[key] = tag.obj[key] * 2
    }

    tag.update()
    expect(normalizeHTML(root.getElementsByTagName('div')[0].innerHTML))
      .to.be.equal('<p>zero = 0</p><p>one = 2</p><p>two = 4</p><p>three = 6</p>')

    tag.unmount()
  })

  it('conditional directives work also on object loops', function() {
    injectHTML('<loop-object-conditional></loop-object-conditional>')
    const tag = riot.mount('loop-object-conditional')[0]
    expect(tag.refs.items).to.have.length(4)
    tag.unmount()
  })

  it('the loop children instances get correctly removed in the right order', function() {

    injectHTML('<loop-ids></loop-ids>')

    const tag = riot.mount('loop-ids')[0],
      thirdItemId = tag.tags['loop-ids-item'][2]._riot_id

    tag.items.splice(0, 1)
    tag.update(tag.tags['loop-ids-item'])
    expect(tag.items.length).to.be.equal(2)
    // the second tag instance got removed
    // so now the third tag got moved to the second position
    expect(tag.tags['loop-ids-item'][1]._riot_id).to.be.equal(thirdItemId)

    tag.unmount()

  })

  it('each tag in the "tags" property can be looped', function() {

    injectHTML('<loop-single-tags></loop-single-tags>')

    const tag = riot.mount('loop-single-tags')[0]

    expect($$('ul li', tag.root).length).to.be.equal(4)

    tag.unmount()

  })

  it('loop option tag', function() {
    injectHTML('<loop-option></loop-option>')

    const tag = riot.mount('loop-option')[0],
      root = tag.root,
      options = root.getElementsByTagName('select')[0]


    //expect(options[0].selected).to.be.equal(false)
    expect(options[1].selected).to.be.equal(true)
    expect(options[2].selected).to.be.equal(false)
    expect(options.selectedIndex).to.be.equal(1)

    tag.unmount()

  })

  it('the referenced on a select tag gets', function() {

    injectHTML('<named-select></named-select>')

    const tag = riot.mount('named-select')[0]

    expect(tag.refs.daSelect).to.not.be.equal(undefined)
    expect(tag.refs.daSelect.length).to.be.equal(2)

    tag.unmount()
  })

  it('loop optgroup tag', function() {

    injectHTML('<loop-optgroup></loop-optgroup>')

    const tag = riot.mount('loop-optgroup')[0],
      root = tag.root,
      select = $('select', root)

    expect(select.options[3].selected).to.be.equal(true)
    expect(select.options[0].value).to.be.equal('1')
    expect(select.options[0].text).to.be.equal('Option 1.1')
    expect(select.options[1].text).to.be.equal('Option 1.2')
    expect(select.selectedIndex).to.be.equal(3)

    tag.unmount()

  })

  it('loop optgroup tag (outer option, no closing option tags)', function() {

    injectHTML('<loop-optgroup2></loop-optgroup2>')

    const tag = riot.mount('loop-optgroup2')[0],
      root = tag.root,
      select = $('select', root)

    expect(select.options[0].selected).to.be.equal(true)
    expect(select.options[4].disabled).to.be.equal(true)
    expect(select.options[1].value).to.be.equal('1')
    expect(select.options[0].text).to.be.equal('<Select Option>')
    expect(select.selectedIndex).to.be.equal(0)

    tag.unmount()

  })

  it('loop tr table tag', function() {

    injectHTML('<table-data></table-data>')

    const tag = riot.mount('table-data')[0],
      root = tag.root

    expect(normalizeHTML(root.innerHTML)).to.match(/<h3>Cells<\/h3><table border="1"><tbody><tr><th>One<\/th><th>Two<\/th><th>Three<\/th><\/tr><tr><td>One<\/td><td>Two<\/td><td>Three<\/td><\/tr><\/tbody><\/table><h3>Rows<\/h3><table border="1"><tbody><tr><td>One<\/td><td>One another<\/td><\/tr><tr><td>Two<\/td><td>Two another<\/td><\/tr><tr><td>Three<\/td><td>Three another<\/td><\/tr><\/tbody><\/table>/)

    tag.unmount()

  })

  it('loop tr in tables preserving preexsisting rows', function() {

    injectHTML('<table-loop-extra-row></table-loop-extra-row>')

    const tag = riot.mount('table-loop-extra-row')[0],
      root = tag.root,
      tr = $$('table tr', root)

    expect(tr.length).to.be.equal(5)
    expect(normalizeHTML(tr[0].innerHTML)).to.be.equal('<td>Extra</td><td>Row1</td>')
    expect(normalizeHTML(tr[4].innerHTML)).to.be.equal('<td>Extra</td><td>Row2</td>')

    tag.unmount()
  })

  it('loop reorder dom nodes', function() {

    injectHTML('<loop-reorder></loop-reorder>')

    const tag = riot.mount('loop-reorder')[0]
    expect($$('span', tag.root)[0].className).to.be.equal('nr-0')
    expect($$('div', tag.root)[0].className).to.be.equal('nr-0')
    tag.items.reverse()
    tag.update()
    expect($$('span', tag.root)[0].className).to.be.equal('nr-5')
    expect($$('div', tag.root)[0].className).to.be.equal('nr-0')

    tag.unmount()
  })

  it('tags property in loop, varying levels of nesting', function() {

    injectHTML([
      '<ploop-tag></ploop-tag>',
      '<ploop1-tag></ploop1-tag>',
      '<ploop2-tag></ploop2-tag>',
      '<ploop3-tag></ploop3-tag>'
    ])

    const tag = riot.mount('ploop-tag, ploop1-tag, ploop2-tag, ploop3-tag', {
      elements: [{
        foo: 'foo',
        id: 0
      }, {
        foo: 'bar',
        id: 1
      }]
    })

    expect(tag[0].tags['ploop-child'].length).to.be.equal(2)
    expect(tag[0].tags['ploop-another']).to.be.an('object')
    expect(tag[1].tags['ploop-child'].length).to.be.equal(2)
    expect(tag[1].tags['ploop-another'].length).to.be.equal(2)
    expect(tag[2].tags['ploop-child'].length).to.be.equal(2)
    expect(tag[2].tags['ploop-another']).to.be.an('object')
    expect(tag[3].tags['ploop-child'].length).to.be.equal(2)
    expect(tag[3].tags['ploop-another']).to.be.an('object')

    tag.forEach(tag => tag.unmount())
  })

  it('dynamically referenced elements in a loop', function() {

    injectHTML('<loop-named></loop-named>')

    const tag = riot.mount('loop-named')[0]
    tag.on('mount', function () {
      expect(tag.first).name.to.be.equal('first')
      expect(tag.two).name.to.be.equal('two')
    })
    tag.unmount()
  })


  it('protect the internal "tags" attribute from external overrides', function() {
    injectHTML('<loop-protect-internal-attrs></loop-protect-internal-attrs>')
    const tag = riot.mount('loop-protect-internal-attrs')[0]
    expect(tag.tags['loop-protect-internal-attrs-child'].length).to.be.equal(4)
    tag.unmount()
  })

  it('the "updated" gets properly triggered also from the children tags in a loop', function(done) {

    injectHTML('<div id="updated-events-in-loop"></div>')
    const tag = riot.mount('#updated-events-in-loop', 'loop-unshift')[0]
    let counter = 0

    tag.tags['loop-unshift-item'][0].on('updated', function() {
      counter ++
      if (counter === 2) done()
    })

    tag.update()
    tag.tags['loop-unshift-item'][0].update()

    tag.unmount()

  })

  it('the loops children sync correctly their internal data with their options', function() {

    injectHTML('<loop-sync-options></loop-sync-options>')
    const tag = riot.mount('loop-sync-options')[0]

    function ch(idx) {
      return tag.root.getElementsByTagName('loop-sync-options-child')[idx]._tag
    }

    expect(ch(0).val).to.be.equal('foo')
    expect(ch(0).root.className).to.be.equal('active')
    expect(ch(1).val).to.be.equal(undefined)
    expect(ch(2).val).to.be.equal(undefined)
    expect(ch(0).num).to.be.equal(undefined)
    expect(ch(1).num).to.be.equal(3)
    expect(ch(2).num).to.be.equal(undefined)
    expect(ch(0).bool).to.be.equal(undefined)
    expect(ch(1).bool).to.be.equal(undefined)
    expect(ch(2).bool).to.be.equal(false)
    tag.update({
      children: tag.children.reverse()
    })
    expect(ch(0).val).to.be.equal(undefined)
    expect(ch(0).root.className).to.be.equal('')
    expect(ch(1).val).to.be.equal(undefined)
    expect(ch(2).val).to.be.equal('foo')
    expect(ch(2).root.className).to.be.equal('active')
    expect(ch(0).num).to.be.equal(undefined)
    expect(ch(1).num).to.be.equal(3)
    expect(ch(2).num).to.be.equal(undefined)
    expect(ch(0).bool).to.be.equal(false)
    expect(ch(1).bool).to.be.equal(undefined)
    expect(ch(2).bool).to.be.equal(undefined)

    tag.update({
      children: tag.children.reverse()
    })
    expect(ch(0).val).to.be.equal('foo')
    expect(ch(0).root.className).to.be.equal('active')
    expect(ch(1).val).to.be.equal(undefined)
    expect(ch(2).val).to.be.equal(undefined)
    expect(ch(2).root.className).to.be.equal('')
    expect(ch(0).num).to.be.equal(undefined)
    expect(ch(1).num).to.be.equal(3)
    expect(ch(2).num).to.be.equal(undefined)
    expect(ch(0).bool).to.be.equal(undefined)
    expect(ch(1).bool).to.be.equal(undefined)
    expect(ch(2).bool).to.be.equal(false)
    tag.unmount()
  })


  it('the loops children sync correctly their internal data even when they are nested', function() {

    injectHTML('<loop-sync-options-nested></loop-sync-options-nested>')
    const tag = riot.mount('loop-sync-options-nested')[0]

    expect(tag.tags['loop-sync-options-nested-child'][0].parent.root.tagName.toLowerCase()).to.be.equal('loop-sync-options-nested')
    expect(tag.tags['loop-sync-options-nested-child'][0].val).to.be.equal('foo')
    expect(tag.tags['loop-sync-options-nested-child'][1].val).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][2].val).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][0].num).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][1].num).to.be.equal(3)
    expect(tag.tags['loop-sync-options-nested-child'][2].num).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][0].bool).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][1].bool).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][2].bool).to.be.equal(false)
    tag.update({
      children: tag.children.reverse()
    })
    tag.update()
    expect(tag.tags['loop-sync-options-nested-child'][0].val).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][1].val).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][2].val).to.be.equal('foo')
    expect(tag.tags['loop-sync-options-nested-child'][0].num).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][1].num).to.be.equal(3)
    expect(tag.tags['loop-sync-options-nested-child'][2].num).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][0].bool).to.be.equal(false)
    expect(tag.tags['loop-sync-options-nested-child'][1].bool).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][2].bool).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][2].parent.root.tagName.toLowerCase()).to.be.equal('loop-sync-options-nested')
    tag.update({
      children: tag.children.reverse()
    })
    tag.update()
    expect(tag.tags['loop-sync-options-nested-child'][0].val).to.be.equal('foo')
    expect(tag.tags['loop-sync-options-nested-child'][1].val).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][2].val).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][0].num).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][1].num).to.be.equal(3)
    expect(tag.tags['loop-sync-options-nested-child'][2].num).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][0].bool).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][1].bool).to.be.equal(undefined)
    expect(tag.tags['loop-sync-options-nested-child'][2].bool).to.be.equal(false)

    tag.unmount()
  })

  it('the children tags are in sync also in multiple nested tags', function() {

    injectHTML('<loop-sync-options-nested-wrapper></loop-sync-options-nested-wrapper>')
    const tag = riot.mount('loop-sync-options-nested-wrapper')[0]
    expect(tag.tags['loop-sync-options-nested'].tags['loop-sync-options-nested-child'].length).to.be.equal(3)
    tag.unmount()
  })

  it('looped options between other options get inserted correctly', function() {
    injectHTML('<loop-noloop-option></loop-noloop-option>')

    const tag = riot.mount('loop-noloop-option')[0]
    var options = $$('option', tag.root)
    expect(options[1].value).to.be.equal('1')

    tag.unmount()
  })

  it('children in a loop inherit properties from the parent', function() {
    injectHTML('<loop-inherit></loop-inherit>')
    const tag = riot.mount('loop-inherit')[0]

    expect(tag.refs.me.opts.nice).to.be.equal(tag.isFun)
    tag.isFun = false
    tag.update()
    expect(tag.refs.me.opts.nice).to.be.equal(tag.isFun)
    expect(tag.refs.me.tags).to.be.empty
    tag.unmount()
  })

  it('loop tags get rendered correctly also with conditional attributes', function(done) {

    injectHTML('<loop-conditional></loop-conditional>')

    const tag = riot.mount('loop-conditional')[0]

    setTimeout(function() {
      expect(tag.root.getElementsByTagName('div').length).to.be.equal(2)
      expect(tag.root.getElementsByTagName('loop-conditional-item').length).to.be.equal(2)
      expect(tag.tags['loop-conditional-item'].length).to.be.equal(2)
      expect(tag.refs.article).to.have.length(tag.items.length)

      tag.items = []
      tag.update()
      expect(tag.root.getElementsByTagName('div').length).to.be.equal(0)
      expect(tag.root.getElementsByTagName('loop-conditional-item').length).to.be.equal(0)
      expect(tag.tags['loop-conditional-item']).to.be.equal(undefined)
      tag.items = [{value: 2}, {value: 2}, {value: 2}]
      tag.update()
      expect(tag.root.getElementsByTagName('div').length).to.be.equal(3)
      expect(tag.root.getElementsByTagName('loop-conditional-item').length).to.be.equal(3)
      expect(tag.tags['loop-conditional-item'].length).to.be.equal(3)
      tag.unmount()
      done()
    }, 100)
  })


  it('custom children items in a nested loop are always in sync with the parent tag', function() {

    injectHTML('<loop-inherit></loop-inherit>')

    const tag = riot.mount('loop-inherit')[0]

    expect(tag.tags['loop-inherit-item'].length).to.be.equal(4)
    expect(tag.tags['loop-inherit-item'][1].opts.name).to.be.equal(tag.items[0])
    expect(tag.tags['loop-inherit-item'][2].opts.name).to.be.equal(tag.items[1])
    expect(tag.tags['loop-inherit-item'][3].opts.name).to.be.equal(tag.items[2])

    tag.items.splice(1, 1)
    tag.update()
    expect(tag.root.getElementsByTagName('div').length).to.be.equal(2)

    tag.items.push('active')
    tag.update()
    expect(tag.root.getElementsByTagName('div').length).to.be.equal(3)
    expect(tag.root.getElementsByTagName('div')[2].innerHTML).to.contain('active')
    expect(tag.root.getElementsByTagName('div')[2].className).to.be.equal('active')
    expect(tag.tags['loop-inherit-item'][1].opts.name).to.be.equal(tag.items[0])
    expect(tag.tags['loop-inherit-item'][2].opts.name).to.be.equal(tag.items[1])
    expect(tag.tags['loop-inherit-item'].length).to.be.equal(4)

    tag.unmount()

  })

  it('the DOM events get executed in the right context', function() {
    injectHTML('<loop-inherit></loop-inherit>')
    const tag = riot.mount('loop-inherit')[0]
    fireEvent(tag.tags['loop-inherit-item'][0].root, 'mouseenter')
    expect(tag.wasHovered).to.be.equal(true)
    expect(tag.root.getElementsByTagName('div').length).to.be.equal(4)
    fireEvent(tag.tags['loop-inherit-item'][0].root, 'click')
    expect(tag.tags['loop-inherit-item'][0].wasClicked).to.be.equal(true)

    tag.unmount()
  })

  it('loops over other tag instances do not override their internal properties', function() {
    injectHTML('<loop-tag-instances></loop-tag-instances>')
    const tag = riot.mount('loop-tag-instances')[0]

    tag.start()

    expect(tag.tags['loop-tag-instances-child'].length).to.be.equal(5)
    expect(tag.tags['loop-tag-instances-child'][0].root.tagName.toLowerCase()).to.be.equal('loop-tag-instances-child')
    tag.update()
    expect(tag.tags['loop-tag-instances-child'][3].root.tagName.toLowerCase()).to.be.equal('loop-tag-instances-child')

    tag.unmount()

  })


  it('nested loops using non object data get correctly rendered', function() {
    injectHTML('<loop-nested-strings-array></loop-nested-strings-array>')
    const tag = riot.mount('loop-nested-strings-array')[0]
    let children = $$('loop-nested-strings-array-item', tag.root)
    expect(children.length).to.be.equal(4)
    children = $$('loop-nested-strings-array-item', tag.root)
    fireEvent(children[0], 'click')
    expect(children.length).to.be.equal(4)
    expect(normalizeHTML(children[0].innerHTML)).to.be.equal('<p>b</p>')
    expect(normalizeHTML(children[1].innerHTML)).to.be.equal('<p>a</p>')
    tag.unmount()
  })


  it('any DOM event in a loop updates the whole parent tag', function() {
    injectHTML('<loop-numbers-nested></loop-numbers-nested>')
    const tag = riot.mount('loop-numbers-nested')[0]
    expect(tag.root.getElementsByTagName('ul')[0].getElementsByTagName('li').length).to.be.equal(4)
    fireEvent(tag.root.getElementsByTagName('ul')[0].getElementsByTagName('li')[0], 'click')
    expect(tag.root.getElementsByTagName('ul')[0].getElementsByTagName('li').length).to.be.equal(2)
    tag.unmount()
  })

  it('riot.observable instances could be also used in a loop', function() {
    injectHTML('<loop-child></loop-child>')
    const tag = riot.mount('loop-child')[0]

    tag.items = [riot.observable({name: 1}), {name: 2}]
    tag.update()
    tag.items = [{name: 2}]
    tag.update()

    tag.unmount()
  })

  it('the update event returns the tag instance', function() {
    injectHTML('<loop-child></loop-child>')
    const tag = riot.mount('loop-child')[0]
    expect(tag.update()).to.not.be.equal(undefined)
    tag.unmount()
  })


  it('table with multiple bodies and dynamic styles #1052', function() {

    injectHTML('<table-multibody></table-multibody>')

    const tag = riot.mount('table-multibody')[0],
      bodies = $$('tbody', tag.root)

    expect(bodies.length).to.be.equal(3)
    for (var i = 0; i < bodies.length; ++i) {
      expect(normalizeHTML(bodies[0].innerHTML))
        .to.match(/<tr style="background-color: ?(?:white|lime);?"[^>]*>(?:<td[^>]*>[A-C]\d<\/td>){3}<\/tr>/)
    }

    expect(bodies[0].getElementsByTagName('tr')[0].style.backgroundColor).to.be.equal('white')
    fireEvent(tag.root.getElementsByTagName('button')[0], 'click')
    expect(bodies[0].getElementsByTagName('tr')[0].style.backgroundColor).to.be.equal('lime')

    tag.unmount()
  })

  it('table with tbody and thead #1549', function() {

    injectHTML('<table-thead-tfoot-nested></table-thead-tfoot-nested>')

    const tag = riot.mount('table-thead-tfoot-nested')[0],
      bodies = $$('tbody', tag.root),
      heads = $$('thead', tag.root),
      foots = $$('tfoot', tag.root)

    expect(bodies.length).to.be.equal(1)
    expect(heads.length).to.be.equal(1)
    expect(foots.length).to.be.equal(1)

    var ths = $$('th', tag.root),
      trs = $$('tr', tag.root),
      tds = $$('td', tag.root)

    expect(ths.length).to.be.equal(3)
    expect(trs.length).to.be.equal(5)
    expect(tds.length).to.be.equal(6)

    tag.unmount()
  })

  it('table with caption and looped cols, ths, and trs #1067', function() {
    injectHTML('<loop-cols></loop-cols>')
    var data = {
      // copied from loop-cols.tag
      headers: [
        'Name',
        'Number',
        'Address',
        'City',
        'Contact'
      ],
      data: [
        ['Abc', '10', 'A 4B', 'MΓ©xico', 'Juan'],
        ['Def', '20', 'B 50', 'USA', 'Anna'],
        ['Ghi', '30', 'D 60', 'Japan', ''],
        ['Jkl', '40', 'E 1C', 'France', 'Balbina']
      ]
    }
    const tag = riot.mount('loop-cols')[0]
    let el, i, k

    tag.update()

    el = getEls('caption')[0]
    expect(el.innerHTML).to.be.equal('Loop Cols')

    el = getEls('colgroup')
    expect(el.length).to.be.equal(1)

    el = getEls('col', el[0])
    expect(el.length).to.be.equal(5)

    el = getEls('tr', getEls('thead')[0])
    expect(el.length).to.be.equal(1)

    el = getEls('th', el[0])
    expect(el.length).to.be.equal(5)
    for (i = 0; i < el.length; ++i) {
      expect(el[i].tagName).to.be.equal('TH')
      expect(el[i].innerHTML.trim()).to.be.equal(data.headers[i])
    }

    el = getEls('tr', getEls('tbody')[0])
    expect(el.length).to.be.equal(4)
    //console.log(' - - - tbody.tr: ' + el[0].innerHTML)

    for (i = 0; i < el.length; ++i) {
      var cells = getEls('td', el[i])
      expect(cells.length).to.be.equal(5)
      for (k = 0; k < cells.length; ++k) {
        //console.log(' - - - getting data[' + i + ',' + k + ']')
        expect(cells[k].tagName).to.be.equal('TD')
        expect(cells[k].innerHTML.trim()).to.be.equal(data.data[i][k])
      }
    }

    tag.unmount()

    function getEls(t, e) {
      if (!e) e = tag.root
      return e.getElementsByTagName(t)
    }
  })



  it('table/thead/tbody/tfoot used as root element of custom tags', function() {

    injectHTML('<table-test></table-test>')
    var
      tag = riot.mount('table-test')[0],
      tbl

    // set "tbl" to the table-test root element
    expect(tag).to.not.be.empty
    tbl = tag.root
    expect(tbl).to.not.be.empty
    tag.update()

    testTable(tbl, 'table-caption', {
      tbody: 1,
      caption: true,
      colgroup: true
    })
    testTable(tbl, 'table-colgroup', {
      thead: 1,
      tbody: 1,
      colgroup: true
    })
    testTable(tbl, 'table-looped-col', {
      thead: 1,
      tbody: 1,
      col: true
    })
    testTable(tbl, 'table-multi-col', {
      thead: 1,
      tbody: 1,
      col: true
    })
    testTable(tbl, 'table-tfoot', {
      tfoot: 1,
      tbody: 1
    })
    testTable(tbl, 'table-tr-body-only', {
      tr: 2
    })
    testTable(tbl, 'table-tr-alone', {
      tr: 1
    })
    testTable(tbl, 'table-custom-thead-tfoot', {
      thead: 1,
      tfoot: 1,
      tbody: 2,
      colgroup: true
    })

    tag.unmount()

    // test the table and call the tests for the content
    function testTable(root, name, info) {
      var s, key

      root = $$('table[data-is=' + name + ']', root)
      s = name + '.length: '
      expect(s + root.length).to.be.equal(s + '1')
      root = root[0]

      // test content
      for (key in info) { // eslint-disable-line
        if (info[key] === true)
          testOther(root, key)
        else
          testRows(root, key, info[key])
      }
    }

    // test rows and cells for an element of thead/tfoot/tbody
    function testRows(root, name, cnt) {
      var s, i, r, c, rows, cells, templ

      // check the count of this element
      root = root.getElementsByTagName(name)
      s = name + '.length: '
      expect(s + root.length).to.be.equal(s + cnt)
      if (name === 'tr') {
        name = 'tbody'
        root = [{ rows: root }]
        //...and leave cnt as-is, else adjust cnt to expected rows
      } else cnt = name === 'tbody' ? 2 : 1

      // check each element
      for (i = 0; i < root.length; i++) {
        // test the rows
        rows = root[i].rows
        expect(rows.length).to.be.equal(cnt)
        // test the cols
        for (r = 0; r < rows.length; r++) {
          c = name[1].toUpperCase()
          s = r + 1
          cells = rows[r].cells
          templ = c === 'B' ? 'R' + s + '-C' : c + '-'
          expect(cells.length).to.be.equal(2)
          expect(cells[0].innerHTML).to.contain(templ + '1')
          expect(cells[1].innerHTML).to.contain(templ + '2')
        }
      }
    }

    // test caption, colgroup and col elements
    function testOther(root, name) {
      var cols, s = name + '.length: '

      // we'll search the parent for <col>, later in the switch
      if (name !== 'col') {
        root = root.getElementsByTagName(name)
        expect(s + root.length).to.be.equal(s + '1')
        root = root[0]
      }
      switch (name) {
      case 'caption':
        expect(root.innerHTML).to.contain('Title')
        break
      case 'colgroup':
      case 'col':
        cols = root.getElementsByTagName('col')
        expect(cols).to.have.length(2)
        expect(cols[0].width).to.be.equal('150')
        expect(cols[1].width).to.be.equal('200')
        break
      default:
        break
      }
    }
  })

  it('select as root element of custom riot tag', function () {
    // skip this test on IE9
    // because it fails for no reason
    if (IE_VERSION <= 9) return

    injectHTML('<select-test></select-test>')

    var
      CHOOSE = 0,     // option alone
      OPTION = 1,     // looped option
      OPTGRP = 2,     // optgroup with options
      list = {
        'select-single-option': [0, CHOOSE],
        'select-each-option': [1, OPTION],
        'select-each-option-prompt': [2, CHOOSE, OPTION],
        'select-each-two-options': [4, OPTION, OPTION],
        'select-optgroup-each-option': [0, OPTGRP],
        'select-optgroup-each-option-prompt': [3, OPTGRP, CHOOSE],
        'select-two-optgroup-each-option': [3, OPTGRP, CHOOSE, OPTGRP],
        'select-each-optgroup': [0, OPTGRP, OPTGRP]
      },
      sel, dat, tag = riot.mount('select-test')[0]

    expect(tag).to.not.be.empty

    for (const name in list) {
      dat = list[name]
      sel = $('select[data-is=' + name + ']', tag.root)
      expect(sel).to.not.be.empty
      expect(sel.selectedIndex).to.be.equal(dat[0], name + '.selectIndex ' + sel.selectedIndex + ' expected to be ' + dat[0])
      var s1 = listFromSel(sel)
      var s2 = listFromDat(dat)
      expect(s1).to.be.equal(s2)
    }

    function listFromDat(dat) {
      var op = [], s = 'Opt1,Opt2,Opt3'

      for (var i = 1; i < dat.length; i++) {
        if (dat[i] === OPTGRP) op.push('G,' + s)
        else if (dat[i] === OPTION) op.push(s)
        else op.push('(choose)')
      }

      return op.join(',')
    }

    function listFromSel(el) {
      var op = []
      el = el.firstChild

      while (el) {
        if (el.tagName === 'OPTGROUP') {
          op.push('G')
          op = op.concat(listFromSel(el))
        } else if (el.tagName === 'OPTION') {
          op.push(el.text)
        }
        el = el.nextSibling
      }

      return op.join(',')
    }

    tag.unmount()
  })

  it('loops get rendered correctly also when riot.brackets get changed', function() {

    injectHTML('<loop-double-curly-brackets></loop-double-curly-brackets>')

    // change the brackets
    riot.settings.brackets = '{{ }}'
    const tag = riot.mount('loop-double-curly-brackets')[0],
      ps = $$('p', tag.root)

    expect(ps.length).to.be.equal(2)
    expect(ps[0].innerHTML).to.be.equal(ps[1].innerHTML)
    expect(ps[0].innerHTML).to.be.equal('hello')
    tag.change()
    expect(ps.length).to.be.equal(2)
    expect(ps[0].innerHTML).to.be.equal(ps[1].innerHTML)
    expect(ps[0].innerHTML).to.be.equal('hello world')

    tag.unmount()
    riot.settings.brackets = '{ }'

  })

  it('loops correctly on array subclasses', function() {
    injectHTML('<loop-arraylike></loop-arraylike>')
    const tag = riot.mount('loop-arraylike')[0],
      root = tag.root
    expect(normalizeHTML(root.getElementsByTagName('div')[0].innerHTML))
      .to.be.equal('<p>0 = zero</p><p>1 = one</p><p>2 = two</p><p>3 = three</p>')
    tag.unmount()
  })


  it('virtual tags mount inner content and not the virtual tag root', function() {
    injectHTML('<loop-virtual></loop-virtual>') // no-reorder
    const tag = riot.mount('loop-virtual')[0],
      els = tag.root.children

    els[0].setAttribute('test', 'ok')
    expect(els[0].tagName).to.be.equal('DT')
    expect(els[0].innerHTML).to.be.equal('Coffee')
    expect(els[1].tagName).to.be.equal('DD')
    expect(els[1].innerHTML).to.be.equal('Black hot drink')
    expect(els[2].tagName).to.be.equal('DT')
    expect(els[2].innerHTML).to.be.equal('Milk')
    expect(els[3].tagName).to.be.equal('DD')
    expect(els[3].innerHTML).to.be.equal('White cold drink')

    tag.data.reverse()
    tag.update()

    expect(els[0].getAttribute('test')).to.be.equal('ok') // same place after reverse
    expect(els[2].tagName).to.be.equal('DT')
    expect(els[2].innerHTML).to.be.equal('Coffee')
    expect(els[3].tagName).to.be.equal('DD')
    expect(els[3].innerHTML).to.be.equal('Black hot drink')
    expect(els[0].tagName).to.be.equal('DT')
    expect(els[0].innerHTML).to.be.equal('Milk')
    expect(els[1].tagName).to.be.equal('DD')
    expect(els[1].innerHTML).to.be.equal('White cold drink')

    tag.data.unshift({ key: 'Tea', value: 'Hot or cold drink' })
    tag.update()
    expect(els[0].tagName).to.be.equal('DT')
    expect(els[0].innerHTML).to.be.equal('Tea')
    expect(els[1].tagName).to.be.equal('DD')
    expect(els[1].innerHTML).to.be.equal('Hot or cold drink')
    tag.unmount()

    injectHTML('<loop-virtual-reorder></loop-virtual-reorder>')

    const tag2 = riot.mount('loop-virtual-reorder')[0],
      els2 = tag2.root.children

    els2[0].setAttribute('test', 'ok')
    expect(els2[0].getAttribute('test')).to.be.equal('ok')
    expect(els2[0].tagName).to.be.equal('DT')
    expect(els2[0].innerHTML).to.be.equal('Coffee')
    expect(els2[1].tagName).to.be.equal('DD')
    expect(els2[1].innerHTML).to.be.equal('Black hot drink')
    expect(els2[2].tagName).to.be.equal('DT')
    expect(els2[2].innerHTML).to.be.equal('Milk')
    expect(els2[3].tagName).to.be.equal('DD')
    expect(els2[3].innerHTML).to.be.equal('White cold drink')

    tag2.data.reverse()
    tag2.update()

    expect(els2[2].getAttribute('test')).to.be.equal('ok') // moved after reverse
    expect(els2[2].tagName).to.be.equal('DT')
    expect(els2[2].innerHTML).to.be.equal('Coffee')
    expect(els2[3].tagName).to.be.equal('DD')
    expect(els2[3].innerHTML).to.be.equal('Black hot drink')
    expect(els2[0].tagName).to.be.equal('DT')
    expect(els2[0].innerHTML).to.be.equal('Milk')
    expect(els2[1].tagName).to.be.equal('DD')
    expect(els2[1].innerHTML).to.be.equal('White cold drink')
    tag2.unmount()

  })

  it('redraws correctly after items type is swapped from array to object and back', function () {
    injectHTML('<loop-swap-type></loop-swap-type>')
    const tag = riot.mount('loop-swap-type')[0]

    tag.swap()
    tag.update()
    var els = tag.root.children
    expect(els[0].innerHTML).to.be.equal('3')
    expect(els[1].innerHTML).to.be.equal('4')

    tag.swap()
    tag.update()
    els = tag.root.children
    expect(els[0].innerHTML).to.be.equal('1')
    expect(els[1].innerHTML).to.be.equal('2')
    tag.unmount()
  })

  it('still loops with reserved property names #1526', function() {
    injectHTML('<reserved-names></reserved-names>')
    const tag = riot.mount('reserved-names')[0]
    tag.reorder()
    tag.update()
    tag.reorder()
    tag.update()
    tag.unmount()
  })

  it('referenced elements in object key loop do not duplicate', function() {

    injectHTML('<obj-key-loop></obj-key-loop>')

    const tag = riot.mount('obj-key-loop')[0]

    expect(tag.refs.x.value).to.be.equal('3')
    expect(tag.refs.y.value).to.be.equal('44')
    expect(tag.refs.z.value).to.be.equal('23')

    tag.update()
    expect(tag.refs.x.value).to.be.equal('3')
    expect(tag.refs.y.value).to.be.equal('44')
    expect(tag.refs.z.value).to.be.equal('23')

    tag.unmount()
  })

  it('non looped and conditional virtual tags mount content', function() {
    injectHTML('<virtual-no-loop></virtual-no-loop>')
    var tag = riot.mount('virtual-no-loop')[0]

    var virts = $$('virtual', tag.root)
    expect(virts.length).to.be.equal(0)

    var spans = $$('span', tag.root)
    var divs = $$('div', tag.root)
    var ps = $$('p', tag.root)
    expect(spans.length).to.be.equal(2)
    expect(divs.length).to.be.equal(2)
    expect(spans[0].innerHTML).to.be.equal('if works text')
    expect(divs[0].innerHTML).to.be.equal('yielded text')
    expect(spans[1].innerHTML).to.be.equal('virtuals yields expression')
    expect(divs[1].innerHTML).to.be.equal('hello there')
    expect(ps.length).to.be.equal(1)
    expect(ps[0].innerHTML).to.be.equal('text')

    tag.unmount()
  })


  it('virtual tags with yielded content function in a loop', function() {
    injectHTML('<virtual-yield-loop></virtual-yield-loop>')
    const tag = riot.mount('virtual-yield-loop')[0]
    var spans = $$('span', tag.root)

    expect(spans[0].innerHTML).to.be.equal('one')
    expect(spans[1].innerHTML).to.be.equal('two')
    expect(spans[2].innerHTML).to.be.equal('three')

    tag.items.reverse()
    tag.update()

    spans = $$('span', tag.root)

    expect(spans[0].innerHTML).to.be.equal('three')
    expect(spans[1].innerHTML).to.be.equal('two')
    expect(spans[2].innerHTML).to.be.equal('one')

    tag.unmount()
  })

  it('looped items with conditional get properly inserted into the DOM', function() {
    injectHTML('<loop-bug-1649></loop-bug-1649>')
    const tag = riot.mount('loop-bug-1649')[0]
    var children

    children = $$('.list', tag.root)
    expect(children.length).to.be.equal(2)

    fireEvent($('.remove', children[0]), 'click')

    children = $$('.list', tag.root)
    expect(children.length).to.be.equal(1)

    fireEvent(tag.refs['folder-link-2'], 'click')

    children = $$('.list', tag.root)
    expect(children.length).to.be.equal(2)

    fireEvent($('.remove', children[0]), 'click')

    children = $$('.list', tag.root)
    expect(children.length).to.be.equal(1)

    tag.unmount()
  })

  it('looped items get removed properly see https://github.com/riot/riot/issues/2240', function() {
    injectHTML('<loop-bug-2240></loop-bug-2240>')
    const tag = riot.mount('loop-bug-2240')[0]

    expect(tag.refs.items).to.have.length(tag.items.length)
    tag.items = [tag.items[tag.items.length - 1]]
    tag.update()
    expect(tag.items).to.have.length(1)
    // TODO: the refs in a list should be always an array!
    //expect(tag.refs.items).to.have.length(1)
    expect(tag.refs.items.innerHTML).to.be.equal(tag.items[0].value)

    tag.unmount()
  })

  it('looped items will be rendered keeping the right order when sorted', function() {
    injectHTML('<loop-bug-2205></loop-bug-2205>')
    const tag = riot.mount('loop-bug-2205')[0]

    expect(tag.items).to.have.length(tag.itemsAmount)
    expect(tag.refs.items).to.have.length(tag.itemsAmount)

    tag.addEditList()
    tag.update()

    expect(tag.items).to.have.length(tag.itemsAmount)
    expect(tag.refs.items).to.have.length(tag.itemsAmount)

    expect(tag.refs.items[tag.itemsAmount - 1].textContent).to.be.equal(tag.items[tag.itemsAmount - 1].name)
    expect(tag.refs.items[tag.itemsAmount - 2].textContent).to.be.equal(tag.items[tag.itemsAmount - 2].name)

    tag.addEditList()
    tag.update()

    expect(tag.items).to.have.length(tag.itemsAmount)
    expect(tag.refs.items).to.have.length(tag.itemsAmount)

    expect(tag.refs.items[tag.itemsAmount - 1].textContent).to.be.equal(tag.items[tag.itemsAmount - 1].name)
    expect(tag.refs.items[tag.itemsAmount - 2].textContent).to.be.equal(tag.items[tag.itemsAmount - 2].name)
    expect(tag.refs.items[tag.itemsAmount - 3].textContent).to.be.equal(tag.items[tag.itemsAmount - 3].name)
    expect(tag.refs.items[tag.itemsAmount - 4].textContent).to.be.equal(tag.items[tag.itemsAmount - 4].name)

    tag.unmount()
  })

  it('looped tags should be in the DOM when their "mount" event gets triggered', function() {
    injectHTML('<loop-bug-2242></loop-bug-2242>')
    const tag = riot.mount('loop-bug-2242')[0]
    tag.tags['loop-bug-2242-child'].forEach((t) => expect(t.inDOM).to.be.ok)
    tag.items = tag.items.concat([4, 5, 6])
    tag.update()
    tag.tags['loop-bug-2242-child'].forEach((t) => expect(t.inDOM).to.be.ok)

    tag.unmount()
  })

  it('looped custom tags can update properly their root node attributes', function() {
    injectHTML('<loop-items-attrs></loop-items-attrs>')
    const tag = riot.mount('loop-items-attrs')[0]
    let subtag1, subtag2

    ;[subtag1, subtag2] = tag.tags['loop-items-attrs-item']
    expect(subtag1.root.getAttribute('data-color')).to.be.equal(subtag1.color)
    expect(subtag2.root.getAttribute('data-color')).to.be.equal(subtag2.color)

    tag.items.forEach(item => item.color = item.color === 'orange' ? 'red' : 'orange')
    tag.update()

    ;[subtag1, subtag2] = tag.tags['loop-items-attrs-item']
    expect(subtag1.root.getAttribute('data-color')).to.be.equal(subtag1.color)
    expect(subtag2.root.getAttribute('data-color')).to.be.equal(subtag2.color)
    tag.unmount()
  })

  it('looped custom tags shouldn\'t dispatch the "update" and "updated" events while mounted', (done) => {
    injectHTML('<riot-tmp></riot-tmp>')

    const updateEvent = sinon.spy(),
      updatedEvent = sinon.spy(),
      beforeMountEvent = sinon.spy(),
      beforeUnmountEvent = sinon.spy(),
      unmountEvent = sinon.spy(),
      mountEvent = sinon.spy()

    riot.tag('riot-tmp', '<riot-tmp-sub ref="children" each="{ getItems() }"/>', function() {
      this.on('mount', function() {
        this.update()
      })

      this.on('updated', () => {
        setTimeout(() => {
          expect(updateEvent, 'update event').to.have.not.been.called
          expect(updatedEvent, 'update event').to.have.not.been.called
          expect(beforeMountEvent, 'before mount event').to.have.been.calledTwice
          expect(mountEvent, 'mount event').to.have.been.calledTwice
          expect(beforeUnmountEvent, 'before unmount event').to.have.been.calledOnce
          expect(unmountEvent, 'unmount event').to.have.been.calledOnce
          this.unmount()
          done()
        }, 10)
      })

      this.getItems = () => {
        return [{}]
      }
    })

    riot.tag('riot-tmp-sub', '<p>subtag</p>', function() {
      this.on('before-mount', beforeMountEvent)
      this.on('mount', mountEvent)
      this.on('update', updateEvent)
      this.on('updated', updatedEvent)
      this.on('before-unmount', beforeUnmountEvent)
      this.on('unmount', unmountEvent)
    })

    riot.mount('riot-tmp')[0]
  })

  it('looped tags can properly receive parent properties via attributes', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<riot-tmp-sub func={func} each="{items}"/>', function(opts) {
      this.func = opts.func
      this.items = [1, 2, 3]
    })

    riot.tag('riot-tmp-sub', '', function(opts) {
      this.on('mount', opts.func)
    })

    const cb = sinon.spy()
    const tag = riot.mount('riot-tmp', { func: cb })[0]

    expect(cb).to.have.been.calledThrice
    tag.unmount()
  })

  it('objects iterations without any "key" attribute will not trigger unecessary rerenders (issue #2585)', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<p ref="p" each="{ items }"></p>', function() {
      this.items = {
        a: {},
        b: {},
        c: {},
        d: {}
      }
    })
    const tag = riot.mount('riot-tmp')[0]
    const ps = tag.refs.p

    ps[0].setAttribute('hello', 'world')
    tag.items = riot.util.misc.extend({}, tag.items)
    tag.update()

    expect(ps[0].getAttribute('hello')).to.be.equal('world')

    tag.unmount()
  })

  it('the same object can be properly re-added to a collection (issue #2600)', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    const item = {}

    riot.tag('riot-tmp', '<p ref="p" each="{ items }">hello</p>', function() {
      this.items = [item]
    })

    const tag = riot.mount('riot-tmp')[0]

    tag.items.push(item)
    tag.update()

    expect(tag.refs.p).to.have.length(2)

    tag.unmount()
  })


  it('All the items indexes are incrementally generated also in case of if statements in a loop (issue #2603)', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', '<p ref="p" each="{ item, i in items }" if="{ i !== 0 }">{i}</p>', function() {
      this.items = [{}, {}, {}]
    })

    const tag = riot.mount('riot-tmp')[0]

    expect(tag.refs.p[0].innerHTML).to.be.equal('1')
    expect(tag.refs.p[1].innerHTML).to.be.equal('2')

    tag.unmount()
  })

/*
  TODO: nested refs and tags should be in sync
  it('nested tags get properly moved', function() {
    injectHTML('<loop-nested></loop-nested>')
    const tag = riot.mount('loop-nested')[0]
    expect(tag.tags['loop-nested-item'][0].val).to.be.equal(1)
    expect(tag.refs.p[0].innerHTML).to.be.equal('1')
    tag.items.reverse()
    tag.update()
    expect(tag.refs.p[0].innerHTML).to.be.equal('3')
    expect(tag.tags['loop-nested-item'][0].val).to.be.equal(3)
    tag.unmount()
  })

*/
})

Added public/riot-3.13.2/test/specs/browser/riot/if.spec.js.































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
import {
  injectHTML,
  expectHTML,
  $$,
  fireEvent
} from '../../../helpers/index'


// include special tags to test specific features
import '../../../tag/if-mount.tag'
import '../../../tag/nested-child.tag'
import '../../../tag/if-unmount.tag'
import '../../../tag/named-unmount.tag'
import '../../../tag/bug-2229.tag'
import '../../../tag/bug-2609.tag'

describe('Riot if', function() {
  it('child tags are only rendered when if-condition is truthy', function() {

    injectHTML('<if-mount></if-mount>')

    var tag = riot.mount('if-mount')[0]

    var expectL2 = function(base, exist) {
      var ex = expect(base.tags['if-level2'])
      exist ? ex.to.not.be.undefined : ex.to.be.undefined
      expect($$('if-level2', base.root).length).to.be.equal(exist ? 1 : 0)
    }

    var expectCond = function(base, exist) {
      var ex = expect(base.tags['if-level2'].tags['conditional-tag'])
      exist ? ex.to.not.be.undefined : ex.to.be.undefined
      expect($$('conditional-tag', base.root).length).to.be.equal(exist ? 1 : 0)
    }

    expectL2(tag.refs.ff, false)
    expectL2(tag.refs.ft, false)

    expectL2(tag.refs.tf, true)
    expectCond(tag.refs.tf, false)

    expectL2(tag.refs.tt, true)
    expectCond(tag.refs.tt, true)

    tag.refs.tf.tags['if-level2'].toggleCondition()
    expectCond(tag.refs.tf, true)

    tag.refs.ft.toggleCondition()
    expectL2(tag.refs.ft, true)
    expectCond(tag.refs.ft, true)

    tag.unmount()
  })

  it('tags under a false if statement are unmounted', function() {

    injectHTML('<if-unmount></if-unmount>')

    var cb = sinon.spy()
    var tag = riot.mount('if-unmount', {cb: cb})[0]

    // check that our child tags exist, and record their ids
    expect(tag.tags['if-uchild'].length).to.be.equal(3)
    var firstIds = tag.tags['if-uchild'].map(function(c) { return c._riot_id })

    // set if conditions to false
    tag.items[0].bool = false
    tag.update({cond: false})

    // ensure the tags are gone, and that their umount callbacks were triggered
    expect(tag.tags['if-uchild']).to.be.undefined
    expect(cb).to.have.been.calledThrice

    // set conditions back to true
    tag.items[0].bool = true
    tag.update({cond: true})

    // ensure the tags exist, and get their ids
    expect(tag.tags['if-uchild'].length).to.be.equal(3)
    var secondIds = tag.tags['if-uchild'].map(function(c) { return c._riot_id })

    // ensure that all of the new tags are different instances from the first time
    var intersection = secondIds.filter(function(id2) {
      return firstIds.indexOf(id2) > -1
    })
    expect(intersection.length).to.be.equal(0)

    tag.unmount()
  })

  it('refs are removed from parent when element leaves DOM', function() {
    injectHTML('<named-unmount></named-unmount>')
    var tag = riot.mount('named-unmount')[0]

    expect(tag.refs.first).to.be.undefined
    expect(tag.refs.second).to.be.undefined

    tag.update({cond: true, items: ['third']})

    expect(tag.refs.first).to.be.ok
    expect(tag.refs.second).to.be.ok
    expect(tag.refs.third).to.be.ok

    tag.update({cond: false, items: []})

    expect(tag.refs.first).to.be.undefined
    expect(tag.refs.second).to.be.undefined
    expect(tag.refs.third).to.be.undefined

    tag.unmount()
  })

  it('Conditional tags should not inherit from the parent unless they are in a loop', function() {
    injectHTML('<nested-child></nested-child>')
    var tag = riot.mount('nested-child')[0]
    expect(tag.tags.child[0].name).to.be.equal(undefined)

    tag.unmount()
  })

  it('A custom tag with an if dispatches the "mount", "update" and "updated" properly', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    var spy = sinon.spy(), tag

    riot.tag('inner', '<br>', function() {
      this.on('mount', spy)
      this.on('update', spy)
      this.on('updated', spy)
    })
    riot.tag('riot-tmp', '<inner if="{cond}" />', function() {
      this.cond = false
    })

    tag = riot.mount('riot-tmp')[0]
    expect(spy).to.not.have.been.called

    tag.update({cond: true})
    expect(spy).to.have.been.calledOnce // only 'mount' event

    tag.update({cond: true})
    expect(spy).to.have.been.calledThrice // 'update' and 'updated'

    tag.unmount()
  })

  it('Custom tags with an if will dispatch the "mount" event only when the flag is', function() {
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('inner', '<br>')
    riot.tag('riot-tmp', '<inner each="{item in items}" if="{cond}" />', function() {
      this.items = [1]
      this.cond = true
    })
    var tag = riot.mount('riot-tmp')[0]

    expectHTML(tag).to.be.equal('<inner><br></inner>')

    tag.update({cond: false})
    expectHTML(tag).to.be.equal('')
    expect(tag.tags.inner).to.be.equal(undefined)

    tag.update({cond: true})
    expectHTML(tag).to.be.equal('<inner><br></inner>')
    expect(tag.tags.inner).not.to.be.equal(undefined)

    tag.unmount()
  })

  it('Custom tags with an if and multiple mixins will not throw (see #2100)', function() {
    injectHTML('<riot-tmp></riot-tmp>')

    var myMixin = {}
    var myMixin2 = {}

    riot.tag('inner', '<div>I am child</div>', function() {
      this.mixin(myMixin)
      this.mixin(myMixin2)
    })

    riot.tag('riot-tmp', '<inner if="{cond}" />', function() {
      this.cond = true
    })

    var tag = riot.mount('riot-tmp')[0]

    expectHTML(tag).to.be.equal('<inner><div>I am child</div></inner>')

    tag.update({cond: false})
    expectHTML(tag).to.be.equal('')
    expect(tag.tags.inner).to.be.equal(undefined)

    tag.update({cond: true})
    expectHTML(tag).to.be.equal('<inner><div>I am child</div></inner>')
    expect(tag.tags.inner).not.to.be.equal(undefined)

    tag.unmount()
  })


  it('each anonymous with an if', function() {
    injectHTML('<riot-tmp></riot-tmp>')
    riot.tag('riot-tmp', `
      <div each="{item, i in items}" if="{item.cond}">{i}</div>
    `, function() {
      this.items = [{cond: true}, {cond: false}]
    })
    var tag = riot.mount('riot-tmp')[0]
    expectHTML(tag).to.be.equal('<div>0</div>')
    tag.items[1].cond = true
    tag.update()
    expectHTML(tag).to.be.equal('<div>0</div><div>1</div>')
    tag.unmount()
  })

  it('if directive on a select should update properly the dom', function() {
    injectHTML('<bug-2229></bug-2229>')
    var tag = riot.mount('bug-2229')[0]

    expectHTML(tag.root).to.be.equal('<div><select><option value="1">One</option><option value="2">Two</option></select></div>')
    tag.flag = false
    tag.update()
    expectHTML(tag.root).to.be.equal('<div></div>')
    tag.flag = true
    tag.update()
    expectHTML(tag.root).to.be.equal('<div><select><option value="1">One</option><option value="2">Two</option></select></div>')

    tag.unmount()
  })

  it('conditional custom tags shouldn\'t dispatch only one "mount" event if toggled mounted', () => {
    injectHTML('<riot-tmp></riot-tmp>')
    const mountEvent = sinon.spy()

    riot.tag('riot-tmp', `
      <riot-tmp-sub if="{ showChild }"></riot-tmp-sub>
      <button ref="button" onclick="{ toggle }">btn</button>
    `, function() {
      this.showChild = true
      this.on('mount', () => {
        this.update()
      })
      this.toggle = () => this.update()
    })

    riot.tag('riot-tmp-sub', '<p>subtag</p>', function() {
      this.on('mount', mountEvent)
    })

    const [tag] = riot.mount('riot-tmp')

    fireEvent(tag.refs.button, 'click')
    expect(mountEvent, 'mount event').to.have.been.calledOnce
    tag.unmount()
  })

  it('nested if in a virtual tag should render properly (issue 2575)', () => {
    injectHTML('<riot-tmp></riot-tmp>')

    riot.tag('riot-tmp', `
      <virtual if="{ cond }">
        <p if="{ cond2 }">Hello</p>
      </virtual>
    `)

    const [tag] = riot.mount('riot-tmp')

    tag.cond = true
    tag.cond2 = true
    tag.update()
    tag.cond = false
    tag.update()
    tag.cond = true
    tag.update()
    expect($$('p', tag.root)).to.have.length(1)
    tag.unmount()
  })

  it('nested if should not cause race condition rendering issues (issue 2609)', () => {
    injectHTML('<bug-2609></bug-2609>')

    const [tag] = riot.mount('bug-2609')

    expect(tag.onClick).to.not.throw()

    tag.unmount()
  })
})

Added public/riot-3.13.2/test/specs/browser/riot/mixin.spec.js.





























































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
import { injectHTML } from '../../../helpers/index'

describe('Mixin', function() {

  const IdMixin = {
    getId: function() {
      return this._riot_id
    }
  }

  class FunctMixin {
    init() {
      this.type = 'func'
    }
    get message() {
      return 'Initialized'
    }
  }

  class ChildMixin extends FunctMixin {}

  const OptsMixin = {
    getOpts: function() {
      return this.opts
    },

    setOpts: function(options, update) {
      this.opts = options

      if (!update) {
        this.update()
      }

      return this
    }
  }

  const MixinWithInit = {
    init: function() {
      this.message = 'initialized'
    },
    message: 'not yet'
  }

  const globalMixin = {
    init: function() {
      this.__globalAttr__ = 'initialized'
      this.__optsKeys__ = Object.keys(this.opts)
    },
    __getGlobal__: function() {
      return 'global'
    }
  }

  const globalMixin2 = {
    init: function() {
      this.__globalAttr2__ = 'initialized2'
    },
    __getGlobal2__: function() {
      return 'global2'
    }
  }

  const getterSetterMixin = {
    _value: false
  }

  Object.defineProperty(getterSetterMixin, 'value', {
    get: function() {
      return this._value
    },
    set: function(value) {
      this._value = value
    }
  })

  it('Will register a mixin with getter/setter functions', function() {
    injectHTML('<my-mixin></my-mixin>')
    riot.tag('my-mixin', '<span>some tag</span>')

    var tag = riot.mount('my-mixin')[0]

    tag.mixin(getterSetterMixin)

    tag.value = true

    expect(true).to.be.equal(tag._value)
    expect(true).to.be.equal(tag.value)

    tag.unmount()
  })

  it('Will register a mixin whose prototype has getter/setter functions', function() {
    injectHTML('<my-mixin></my-mixin>')
    riot.tag('my-mixin', '<span>some tag</span>')

    var tag = riot.mount('my-mixin')[0]

    var mixinInstance = Object.create(getterSetterMixin)

    tag.mixin(mixinInstance)

    tag.value = true

    expect(true).to.be.equal(tag._value)
    expect(true).to.be.equal(tag.value)

    tag.unmount()
  })

  it('Will register a global mixin without name and mount a tag with global mixed-in attributes and methods', function() {
    riot.mixin(globalMixin)
    injectHTML('<my-mixin></my-mixin>')
    riot.tag('my-mixin', '<span>some tag</span>')

    var tag = riot.mount('my-mixin')[0]

    expect('initialized').to.be.equal(tag.__globalAttr__)
    expect('global').to.be.equal(tag.__getGlobal__())
    tag.unmount()
  })

  it('Will register multiple global mixin without name and mount a tag with global mixed-in attributes and methods', function() {
    riot.mixin(globalMixin)
    riot.mixin(globalMixin2)
    injectHTML('<my-mixin></my-mixin>')
    riot.tag('my-mixin', '<span>some tag</span>')

    var tag = riot.mount('my-mixin')[0]

    expect('initialized').to.be.equal(tag.__globalAttr__)
    expect('initialized2').to.be.equal(tag.__globalAttr2__)
    expect('global').to.be.equal(tag.__getGlobal__())
    expect('global2').to.be.equal(tag.__getGlobal2__())
    tag.unmount()
  })

  it('Will register a global mixin with name and mount a tag with global mixed-in attributes and methods', function() {
    riot.mixin('global', globalMixin, true)
    injectHTML('<my-mixin></my-mixin>')
    riot.tag('my-mixin', '<span>some tag</span>')

    var tag = riot.mount('my-mixin')[0]

    expect('initialized').to.be.equal(tag.__globalAttr__)
    expect('global').to.be.equal(tag.__getGlobal__())
    tag.unmount()
  })

  it('Will register multiple global mixin with name and mount a tag with global mixed-in attributes and methods', function() {
    riot.mixin('global', globalMixin, true)
    riot.mixin('global2', globalMixin2, true)
    injectHTML('<my-mixin></my-mixin>')
    riot.tag('my-mixin', '<span>some tag</span>')

    var tag = riot.mount('my-mixin')[0]

    expect('initialized').to.be.equal(tag.__globalAttr__)
    expect('initialized2').to.be.equal(tag.__globalAttr2__)
    expect('global').to.be.equal(tag.__getGlobal__())
    expect('global2').to.be.equal(tag.__getGlobal2__())
    tag.unmount()
  })

  it('Will mount a tag and provide mixed-in methods', function() {

    injectHTML('<my-mixin></my-mixin>')

    riot.tag('my-mixin', '<span>some tag</span>', function() {
      this.mixin(IdMixin)
    })

    var tag = riot.mount('my-mixin')[0]

    expect(tag._riot_id).to.be.equal(tag.getId())
    tag.unmount()
  })

  it('Will mount a tag and provide mixed-in methods from an function constructor instance', function() {
    injectHTML('<my-mixin></my-mixin>')

    function RootMixin() {
      this.getRoot = function() {
        return this.root
      }
    }

    var rootmixin = new RootMixin()

    riot.tag('my-mixin', '<span>some tag</span>', function() {
      this.mixin(rootmixin)
    })

    var tag = riot.mount('my-mixin')[0]

    expect(tag.root).to.be.equal(tag.getRoot())
    tag.unmount()
  })

  it('Will mount two tags, each having separate mix-in methods', function() {

    injectHTML([
      '<my-mixin2 id="one"></my-mixin2>',
      '<my-mixin2 id="two"></my-mixin2>'
    ])

    riot.tag('my-mixin2', '<span>some tag</span>', function() {
      this.mixin(IdMixin)
    })

    var first = riot.mount('#one')[0],
      second = riot.mount('#two')[0]

    expect(first._riot_id).to.be.equal(first.getId())
    expect(second._riot_id).to.be.equal(second.getId())
    expect(first._riot_id).not.to.be.equal(second._riot_id)
    expect(first.getId()).not.to.be.equal(second.getId())
    first.unmount()
    second.unmount()
  })

  it('Options should be available also in the "init" method', function() {
    injectHTML('<my-mixin baz="baz"></my-mixin>')

    riot.tag('my-mixin', '<p>foo</p>')

    const tag = riot.mount('my-mixin', { foo: 'foo', bar: 'bar'})[0]

    expect(tag.__optsKeys__).to.be.deep.equal(['foo', 'bar', 'baz'])
    tag.unmount()
  })

  it('Will mount a tag with multiple mixins mixed-in', function() {
    injectHTML('<my-mixin></my-mixin>')

    riot.tag('my-mixin', '<span>some tag</span>', function() {
      this.mixin(IdMixin, OptsMixin)
    })

    var tag = riot.mount('my-mixin')[0],
      newOpts = {
        'some': 'option',
        'value': Math.random()
      }

    expect(tag._riot_id).to.be.equal(tag.getId())
    expect(tag.opts).to.be.equal(tag.getOpts())
    tag.setOpts(newOpts)
    expect(tag.opts).to.be.equal(tag.getOpts())

    tag.unmount()
  })

  it('Will mount a parent tag with a mixin and a sub-tag wtih a mixin', function() {
    injectHTML('<my-mixin></my-mixin>')

    riot.tag('my-mixin', '<span>some tag</span><sub-mixin></sub-mixin>', function() {
      this.mixin(IdMixin, OptsMixin)
    })

    riot.tag('sub-mixin', '<span>sub mixin</span>', function() {
      this.mixin(IdMixin)
    })

    var tag = riot.mount('my-mixin')[0]

    expect(tag._riot_id).to.be.equal(tag.getId())
    expect(tag.tags['sub-mixin']).not.to.be.equal('undefined')
    expect(tag.tags['sub-mixin']._riot_id).to.be.equal(tag.tags['sub-mixin'].getId())
    expect(tag.getId()).not.to.be.equal(tag.tags['sub-mixin'].getId())
    tag.unmount()
  })

  it('use and initialize raw functions as mixin', function() {
    injectHTML('<my-mixin></my-mixin>')
    riot.tag('my-mixin', '<span>{ message }</span>', function() {
      this.mixin(FunctMixin)
    })
    var tag = riot.mount('my-mixin')[0]
    expect(tag.root.innerHTML).to.be.equal('<span>Initialized</span>')
    expect(tag.type).to.be.equal('func')
    tag.unmount()
  })

  it('binds this-reference to the tag object', function() {
    injectHTML('<my-mixin></my-mixin>')

    riot.tag('my-mixin', '<span>some tag { getId() }</span>', function() {
      this.mixin(IdMixin)
    })

    var tag = riot.mount('my-mixin')[0]

    expect(tag.root.innerHTML).to.be.equal('<span>some tag ' + tag._riot_id + '</span>')
    tag.unmount()
  })

  it('initializes the mixin', function() {
    injectHTML('<my-mixin></my-mixin>')

    riot.tag('my-mixin', '<span>some tag</span>', function() {
      this.mixin(MixinWithInit)
    })

    var tag = riot.mount('my-mixin')[0]

    expect(tag.message).to.be.equal('initialized')
    tag.unmount()
  })

  it('register a mixin to Riot and load mixin to a tag', function() {
    injectHTML('<my-mixin></my-mixin>')

    riot.mixin('idMixin', IdMixin) // register mixin
    riot.tag('my-mixin', '<span>some tag</span>', function() {
      this.mixin('idMixin') // load mixin
    })

    var tag = riot.mount('my-mixin')[0]

    expect(tag._riot_id).to.be.equal(tag.getId())
    tag.unmount()
  })

  it('register a function mixin to Riot and load mixin to a tag', function() {
    injectHTML('<my-mixin></my-mixin>')

    riot.mixin('functMixin', FunctMixin) // register mixin
    riot.tag('my-mixin', '<span>some tag</span>', function() {
      this.mixin('functMixin') // load mixin
    })

    var tag = riot.mount('my-mixin')[0]
    expect(tag.type).to.be.equal('func')
    tag.unmount()
  })

  it('register a child function mixin to Riot and load mixin to a tag', function() {
    injectHTML('<my-mixin></my-mixin>')

    riot.mixin('childMixin', ChildMixin) // register mixin
    riot.tag('my-mixin', '<span>some tag</span>', function() {
      this.mixin('childMixin') // load mixin
    })

    var tag = riot.mount('my-mixin')[0]
    expect(tag.type).to.be.equal('func')
    tag.unmount()
  })

  it('class mixins don\'t destroy the tag classes __proto__', function(done) {
    class ClassTag extends riot.Tag {
      // mandatory in order to use and identify this component
      get name() {
        return 'class-tag'
      }
      get tmpl() {
        return '<p onclick="{someclickfunction}">hi { message }</p>'
      }
      get attrs() {
        return ''
      }
      get css() {
        return ''
      }
      onCreate() {
        this.mixin(FunctMixin)
        expect(this.someclickfunction).to.be.a('function')
        done()
      }
      someclickfunction() {
        this.message = 'goodbye'
      }
    }
    new ClassTag(document.createElement('div'))
  })

  it('Unregistered mixins will throw an error', function() {
    expect(riot.mixin).to.throw(Error)
  })

  it('riot mixins should receive the riot options via init method', function(done) {
    injectHTML('<my-mixin></my-mixin>')

    riot.mixin('init-with-opts', {
      init(opts) {
        expect(opts).to.be.not.undefined
        done()
      }
    }) // register mixin
    riot.tag('my-mixin', '<span>some tag</span>', function() {
      this.mixin('init-with-opts') // load mixin
    })

    var tag = riot.mount('my-mixin')[0]
    tag.unmount()
  })
})

Added public/riot-3.13.2/test/specs/browser/riot/show.spec.js.























































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import {
  injectHTML,
  $,
  $$
} from '../../../helpers/index'

describe('Riot show/hide', function() {
  it('the show directive works as expected', function() {
    riot.tag('riot-tmp', '<p show="{ isVisible }">foo</p><p hide="{ isVisible }">foo</p>')
    injectHTML('<riot-tmp></riot-tmp>')
    var tag = riot.mount('riot-tmp')[0],
      p = $$('p', tag.root)

    expect(p[0].style.display).to.be.equal('none')
    expect(p[0].hidden).to.be.ok
    expect(p[1].style.display).to.be.not.equal('none')
    expect(p[1].hidden).to.be.not.ok
    tag.isVisible = true
    tag.update()
    expect(p[0].style.display).to.be.not.equal('none')
    expect(p[0].hidden).to.be.not.ok
    expect(p[1].style.display).to.be.equal('none')
    expect(p[1].hidden).to.be.ok
    tag.isVisible = false
    tag.update()
    expect(p[0].style.display).to.be.equal('none')
    expect(p[0].hidden).to.be.ok
    expect(p[1].style.display).to.be.not.equal('none')
    expect(p[1].hidden).to.be.not.ok

    tag.unmount()
  })

  it('the show directive gets preserved also in case of style expressions updates', function() {
    riot.tag('riot-tmp', '<p show="{ isVisible }" riot-style="{ \'color:red\' }">foo</p>')
    injectHTML('<riot-tmp></riot-tmp>')
    var tag = riot.mount('riot-tmp')[0],
      p = $('p', tag.root)

    expect(p.style.display).to.be.equal('none')
    expect(p.hidden).to.be.ok
    expect(p.style.color).to.be.equal('red')
    tag.isVisible = true
    tag.update()

    expect(p.style.display).to.be.not.equal('none')
    expect(p.hidden).to.be.not.ok
    expect(p.style.color).to.be.equal('red')

    tag.unmount()
  })

  it('the show directive works properly also against objects', function() {
    riot.tag('riot-tmp', '<p show="{ obj1 || obj2 }">foo</p>')
    injectHTML('<riot-tmp></riot-tmp>')
    var tag = riot.mount('riot-tmp')[0],
      p = $('p', tag.root)

    tag.obj1 = undefined
    tag.obj2 = undefined

    expect(p.hidden).to.be.ok

    tag.obj1 = { a: 'foo' }
    tag.obj2 = false

    tag.update()

    expect(p.hidden).to.be.not.ok
    tag.unmount()
  })

  it('the show directive evaluates also the parent values', function() {
    riot.tag('riot-tmp', `
      <riot-tmp-sub each="{ item in items }" show="{selected === item}"></riot-tmp-sub>
    `, function() {
      this.items = ['uno', 'due']
      this.selected = 'uno'
    })
    riot.tag('riot-tmp-sub', '<p>{ opts.item }</p>')
    injectHTML('<riot-tmp></riot-tmp>')

    var tag = riot.mount('riot-tmp')[0]

    expect(tag.tags['riot-tmp-sub'].length).to.be.equal(2)

    expect(tag.tags['riot-tmp-sub'][0].root.hidden).to.be.not.ok
    expect(tag.tags['riot-tmp-sub'][1].root.hidden).to.be.ok

    tag.unmount()
  })

  it('the show directive gives priority to the child values (see #2333)', function() {
    riot.tag('riot-tmp', `
      <riot-tmp-sub show="{number === 1}"></riot-tmp-sub>
    `, function() {
      this.number = 1
    })
    riot.tag('riot-tmp-sub', '<p ref="p" if={number === 2}>{ opts.item }</p>', function() {
      this.number = 2
    })
    injectHTML('<riot-tmp></riot-tmp>')

    var tag = riot.mount('riot-tmp')[0]

    expect(tag.tags['riot-tmp-sub'].refs.p.hidden).to.be.not.ok

    tag.unmount()
  })

  it('the show directive combined with yield behaves consistently like the if directive (see #2448)', function() {
    riot.tag('riot-tmp', `<riot-tmp-sub>
        <h1 if='{parent.doIt}'>show</h1>
        <h2 show='{parent.doIt}'>show</h2>
      </riot-tmp-sub>`,
    function() {
      this.doIt = true
    })

    riot.tag('riot-tmp-sub', '<yield/>')

    injectHTML('<riot-tmp></riot-tmp>')

    const tag = riot.mount('riot-tmp')[0],
      subRoot = tag.tags['riot-tmp-sub'].root


    expect($('h1', subRoot)).to.be.ok
    expect($('h2', subRoot).hidden).to.be.not.ok

    tag.doIt = false
    tag.update()

    expect($('h1', subRoot)).to.be.not.ok
    expect($('h2', subRoot).hidden).to.be.ok

    tag.unmount()
  })
})

Added public/riot-3.13.2/test/specs/browser/riot/style.spec.js.



















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import {
  injectHTML,
  getRiotStyles,
  $
} from '../../../helpers/index'

// include special tags to test specific features
import '../../../tag/style-tag.tag'
import '../../../tag/style-tag2.tag'
import '../../../tag/style-tag4.tag'
import '../../../tag/scoped.tag'

describe('Riot style', function() {
  it('style injection to single style tag', function() {
    injectHTML('<style-tag></style-tag><style-tag2></style-tag2>')
    var tags = riot.mount('style-tag, style-tag2')
    var styles = getRiotStyles(riot)
    expect(styles).to.match(/\bp\s*\{color: blue;}/)
    expect(styles).to.match(/\bdiv\s*\{color: red;}/)
    tags.forEach(tag => tag.unmount())
  })

  it('style injection removes type riot style tag', function() {
    var stag = $('style[type=riot]')
    expect(stag).to.be.equal(null)
  })

  it('scoped css tag supports htm5 syntax, multiple style tags', function () {

    injectHTML('<style-tag4></style-tag4>')

    checkCSS(riot.mount('style-tag4')[0], '3px')

    function checkCSS(t, x, p2) {
      t.update()
      var e = t.root.firstElementChild
      expect(e.tagName).to.be.equal('P')
      expect(window.getComputedStyle(e, null).borderTopWidth).to.be.equal(x)
      if (p2) {
        e = t.root.getElementsByTagName('P')[1]
        expect(e.innerHTML).to.be.equal('x')
        expect(window.getComputedStyle(e, null).borderTopWidth).to.be.equal('4px')
      }
      t.unmount()
    }
  })


  it('scoped css and data-is, mount(selector, tagname)', function() {


    function checkBorder(t) {
      var e = t.root.firstElementChild
      var s = window.getComputedStyle(e, null).borderTopWidth
      expect(s).to.be.equal('1px')
    }

    injectHTML([
      '<scoped-tag></scoped-tag>',
      '<div data-is="scoped-tag"></div>',
      '<div id="scopedtag"></div>'
    ])

    var stags = riot.mount('scoped-tag')

    var tag = stags[0]
    checkBorder(tag)

    var rtag = stags[1]
    checkBorder(rtag)

    var divtag = riot.mount('#scopedtag', 'scoped-tag')[0]
    checkBorder(divtag)

    divtag.unmount()
    rtag.unmount()
    tag.unmount()
  })

  it('deferred injection of styles in batch', function() {

    // test riot.util.styleNode
    expect(riot.util.styleNode).to.not.be.equal(undefined)
    expect(riot.util.styleNode.tagName).to.be.equal('STYLE')

    // test style isn't injected yet
    var styles = getRiotStyles(riot)
    expect(styles).not.to.match(/\bparsed-style\s*\{/)

    // define a styled tag
    riot.tag('runtime-style-parsing', '<div></div>', '.parsed-style { color: red; }', '', function() { })

    // test style isn't injected by the simple tag definition
    styles = getRiotStyles(riot)
    expect(styles).not.to.match(/\bparsed-style\s*\{/)

    // mount the tag
    injectHTML(['<runtime-style-parsing></runtime-style-parsing>' ])
    var tag = riot.mount('runtime-style-parsing')[0]

    // test style is correctly injected
    styles = getRiotStyles(riot)
    expect(styles).to.match(/\bparsed-style\s*\{\s*color:\s*red;\s*}/)

    // remount (unmount+mount)
    tag.unmount(true)
    tag = riot.mount('runtime-style-parsing')[0]
    expect(tag).to.not.be.equal(undefined)

    // test remount does not affect style
    styles = getRiotStyles(riot)
    expect(styles).to.match(/\bparsed-style\s*\{\s*color:\s*red;\s*}/)

    // test remount does not duplicate rule
    expect(styles.match(/\bparsed-style\s*\{/g)).to.have.length(1)

    tag.unmount()
  })


})

Added public/riot-3.13.2/test/specs/browser/riot/transclusion.spec.js.



































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import {
  injectHTML,
  $,
  normalizeHTML,
  fireEvent
} from '../../../helpers/index'


// include special tags to test specific features
import '../../../tag/inner-html.tag'
import '../../../tag/yield-no-slash.tag'
import '../../../tag/yield-multi.tag'
import '../../../tag/yield-multi2.tag'
import '../../../tag/yield-from-default.tag'
import '../../../tag/yield-nested.tag'


describe('Riot transclusion', function() {

  beforeEach(function() {
    // tag used in multiple tests
    riot.tag('inner', '<p>{opts.value}</p>')
  })

  it('simple html transclusion via <yield> tag', function() {

    injectHTML([
      '<inner-html>',
      '  { greeting }',
      '  <inner value="ciao mondo"></inner>',
      '</inner-html>'
    ])

    var tag = riot.mount('inner-html')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<h1>Hello, World  <inner value="ciao mondo"><p>ciao mondo</p></inner></h1>')

    tag.unmount()

  })

  it('yield without closing slash should be work as expected', function() {

    injectHTML([
      '<yield-no-slash>',
      '  foo',
      '</yield-no-slash>'
    ])

    var tag = riot.mount('yield-no-slash')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('foo')
    tag.unmount()

  })

  it('<yield> from/to multi-transclusion', function() {
    injectHTML('<yield-multi><yield to="content">content</yield><yield to="nested-content">content</yield><yield to="nowhere">content</yield></yield-multi>')
    var tag = riot.mount('yield-multi', {})[0]
    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<p>yield the content here</p><div><p>yield the nested content here</p><p>do not yield the unreference content here</p></div>')
    tag.unmount()
  })

  it('<yield> from/to multi-transclusion nested #1458', function() {
    var html = [
      '<yield-multi2>',
      '  <yield to="options">',
      '    <ul>',
      '      <li>Option 1</li>',
      '      <li>Option 2</li>',
      '    </ul>',
      '  </yield>',
      '  <div>',
      '    <yield to="toggle"><span class="icon"></span></yield>',
      '    <yield to="hello">Hello</yield><yield to="world">World</yield>',
      '    <yield to="hello">dummy</yield>',
      '  </div>',
      '</yield-multi2>'
    ]
    injectHTML(html.join('\n'))
    expect($('yield-multi2')).not.to.be.equal(null)
    var tag = riot.mount('yield-multi2', {})[0]
    html = '<ul><li>Option 1</li><li>Option 2</li></ul><span class="icon"></span><p>Hello World</p>'
    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal(html)
    tag.unmount()
  })


  it('<yield from> name can be unquoted, without <yield to> default to its content', function () {
    var html = [
      '<yield-from-default>',
      ' <yield to="icon">my-icon</yield>',
      ' <yield to="hello">Hello $1 $2</yield>',
      ' <yield to="loop">[⁗foo⁗,\'bar\']</yield>',
      '</yield-from-default>'
    ]

    injectHTML(html.join('\n'))
    expect($('yield-from-default')).not.to.be.equal(null)
    var tag = riot.mount('yield-from-default')[0]
    html = '<p>(no options)</p><p>Hello $1 $2 <span class="my-icon"></span></p><p>foo</p><p>bar</p>'
    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal(html)
    tag.unmount()
  })


  it('multiple mount <yield> tag', function() {

    injectHTML('<inner-html>World  <inner value="ciao mondo"></inner></inner-html>')

    riot.mount('inner-html')
    riot.mount('inner-html')
    riot.mount('inner-html')
    riot.mount('inner-html')

    var tag = riot.mount('inner-html')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<h1>Hello, World  <inner value="ciao mondo"><p>ciao mondo</p></inner></h1>')
    tag.unmount()

  })

  it('<yield> contents in a child get always compiled using its parent data', function(done) {

    injectHTML('<yield-parent>{ greeting }</yield-parent>')

    var tag = riot.mount('yield-parent', {
      saySomething: done
    })[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.match(/<h1>Hello, from the parent<\/h1><yield-child><h1>Greeting<\/h1><i>from the child<\/i><div(.+|)><b>wooha<\/b><\/div><\/yield-child>/)

    tag.update({
      isSelected: true
    })


    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<h1>Hello, from the parent</h1><yield-child><h1>Greeting</h1><i>from the child</i><div class="selected"><b>wooha</b></div></yield-child>')

    fireEvent($('i', tag.root), 'click')

    tag.unmount()

  })



  it('<yield> contents in a loop get always compiled using its parent data', function(done) {

    injectHTML([
      '<yield-loop>',
      '  { greeting }',
      '  <div>Something else</div>',
      '</yield-loop>'
    ])

    var tag = riot.mount('yield-loop', {
        saySomething: done
      })[0],
      child3

    expect(tag.tags['yield-child-2'].length).to.be.equal(5)

    child3 = tag.tags['yield-child-2'][3]

    expect(child3.root.getElementsByTagName('h2')[0].innerHTML.trim()).to.be.equal('subtitle4')

    fireEvent(child3.root.getElementsByTagName('i')[0], 'click')

    tag.unmount()

  })

  it('<yield> with dollar signs get replaced correctly', function() {

    injectHTML([
      '<yield-with-dollar-2>',
      '  <yield-with-dollar-1 cost="$25"></yield-with-dollar-1>',
      '</yield-with-dollar-2>'
    ])

    riot.tag('yield-with-dollar-1', '<span>{opts.cost}</span>')
    riot.tag('yield-with-dollar-2', '<yield></yield>')

    var tag = riot.mount('yield-with-dollar-2')[0]

    expect(normalizeHTML(tag.root.innerHTML)).to.be.equal('<yield-with-dollar-1 cost="$25"><span>$25</span></yield-with-dollar-1>')

    tag.unmount()

  })

})

Added public/riot-3.13.2/test/specs/server/index.js.





























































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
var glob = require('glob'),
  path = require('path'),
  riot = require('../../../lib/server'),
  expect = require('chai').expect,
  cheerio = require('cheerio')

describe('Node', function() {

  // adds custom riot parsers used by some tag/*.tag files
  // css
  riot.parsers.css.myparser = function (tag, css) {
    return css.replace(/@tag/, tag)
  }
  // js
  riot.parsers.js.myparser = function (js) {
    return js.replace(/@version/, '1.0.0')
  }

  it('require tags', function(done) {
    glob('../../tag/*.tag', { cwd: __dirname }, function (err, tags) {
      expect(err).to.be.equal(null)
      tags.forEach(function(tag) {
        if (/~/.test(tag)) return
        expect(require(tag)).to.be.ok
      })
      done()
    })
  })

  it('riot.default should not be exported in commonjs envirnonments', function() {
    expect(riot.default).to.be.not.ok
  })

  it('render tag: timer', function() {
    var tmr = riot.render('timer', { start: 42 })
    expect(tmr).to.be.equal('<timer><p>Seconds Elapsed: 42</p></timer>')
  })

  it('render tag: if-test', function() {
    var ift = riot.render('if-test')
    var $ = cheerio.load(ift)
    var els = $('if-child')
    expect(els.length).to.be.equal(1)
    expect(els.first().attr('style')).to.be.equal('display: none;')
  })

  it('render tag: attr-test', function() {
    var content = riot.render('attr-test', { red: true })
    expect(content).to.be.equal('<attr-test><input type="checkbox" class="red"> </attr-test>')

    content = riot.render('attr-test', { isChecked: true, includeTable: true })
    expect(content).to.be.equal('<attr-test><input type="checkbox" checked="checked"> <table></table></attr-test>')

    content = riot.render('attr-test', { isChecked: null, checkboxId: 0, includeTable: true, tableBorder: 0 })
    expect(content).to.be.equal('<attr-test><input type="checkbox" id="0"> <table border="0"></table></attr-test>')

    content = riot.render('attr-test', { isChecked: 0, checkboxId: 99 })
    expect(content).to.be.equal('<attr-test><input type="checkbox" id="99"> </attr-test>')
  })

  it('render tag: loop-child', function() {
    var lpc = riot.render('loop-child')
    var $ = cheerio.load(lpc)
    expect($('looped-child').length).to.be.equal(2)
    var h3s = $('h3')
    expect(h3s.length).to.be.equal(2)
    expect(h3s.first().text()).to.be.equal('one')
    expect(h3s.last().text()).to.be.equal('two')
  })

  it('render tag: loop-replace', function() {
    var lpr = riot.render('loop-replace')
    var $ = cheerio.load(lpr)
    var els = $('strong')
    expect(els.length).to.be.equal(3)
    expect(els.first().text()).to.be.equal('a')
    expect(els.first().next().text()).to.be.equal('9')
    expect(els.last().text()).to.be.equal('3')
  })

  it('render tag: blog (using yield)', function() {
    var blg = riot.render('blog')
    var $ = cheerio.load(blg)
    var els = $('h2')
    expect(els.length).to.be.equal(2)
    expect(els.first().text()).to.be.equal('post 1')
    expect(els.last().text()).to.be.equal('post 2')
  })

  it('tender tag: loop table', function() {
    var tbl = riot.render('table-loop-extra-row'),
      $ = cheerio.load(tbl)
    expect($('table tr').length).to.be.equal(5)
  })

  it('render tag: simple block (using yield)', function() {
    var blk = riot.render('block')
    var $ = cheerio.load(blk)
    expect($('block').length).to.be.equal(1)
    expect($('yoyo').length).to.be.equal(1)
    expect($('yoyo').html()).to.be.equal('Hello World!')
  })

  it('render tag: yield with no html content', function() {
    var blk = riot.render('yield-empty')
    expect(blk).to.be.equal('<yield-empty></yield-empty>')
  })

  it('render tag: svg loops', function() {
    var svg = riot.render('loop-svg-nodes')
    var $ = cheerio.load(svg)
    expect($('circle').length).to.be.equal(5)
  })

  it('render tag: loops having conditional directives', function() {
    var tag = riot.render('loop-conditional')
    var $ = cheerio.load(tag)
    expect($('loop-conditional-item').length).to.be.equal(2)
  })

  it('render tag: input,option,textarea tags having expressions as value', function() {
    var frm = riot.render('form-controls', { text: 'my-value', bool: true })
    var $ = cheerio.load(frm)
    expect($('input[type="text"]').val()).to.be.equal('my-value')
    expect($('select option:selected').val()).to.be.equal('my-value')
    expect($('textarea[name="txta1"]').val()).to.be.equal('my-value')
    expect($('textarea[name="txta2"]').val()).to.be.equal('')
  })

  it('render tag: looped virtual tags get properly rendered', function() {
    var tag = riot.render('loop-virtual')
    var $ = cheerio.load(tag)
    expect($('dt')).to.have.length(2)
    expect($('dd')).to.have.length(2)
  })

  it('load tag with custom options', function() {
    var tag = riot.require(path.resolve(__dirname, '../../tag/~custom-parsers.tag'), { exclude: ['html', 'css'] })
    var tmpl = riot.render('custom-parsers')

    expect(tag).to.be.equal('custom-parsers')
    expect(tmpl).to.be.equal('<custom-parsers></custom-parsers>')

    tag = riot.require(path.resolve(__dirname, '../../tag/~custom-parsers.tag'))
    tmpl = riot.render('custom-parsers')

    expect(tag).to.be.equal('custom-parsers')
    expect(tmpl).to.be.equal('<custom-parsers><p>hi</p></custom-parsers>')

    expect(require('../../../lib/server')).to.be.not.equal('custom-parsers')
  })

  it('Load tags containing nested require calls', function() {
    var tag = require(path.resolve(__dirname, '../../tag/~import-tags.tag'))
    var tmpl = riot.render('import-tags')

    expect(tag).to.be.equal('import-tags')
    expect(tmpl).to.have.length
  })

  it('render tag: async rendering', function(done) {
    riot.renderAsync('async-rendering').then(function(tmpl) {
      expect(tmpl).to.be.equal('<async-rendering><p>hi</p></async-rendering>')
      done()
    })
  })

  it('render tag: async rendering can timeout', function(done) {
    riot.renderAsync('async-rendering', { delay: 1010 }).catch(function(e) {
      expect(e).to.have.length
      done()
    })
  })
})

Added public/riot-3.13.2/test/tag/asyn-rendering.tag.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<async-rendering>
  <p>{ message }</p>

  <script>
    var self = this
    this.message = ''

    setTimeout(function() {
      self.message = 'hi'
      self.update()
      self.trigger('ready')
    }, opts.delay || 500)

  </script>
</async-rendering>

Added public/riot-3.13.2/test/tag/attr-selected.tag.



































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<attr-selected>
  <select>
    <option value="0" selected="{selected % 3 == 0}">0</option>
    <option value="1" selected="{selected % 3 == 1}">1</option>
    <option value="2" selected="{selected % 3 == 2}">2</option>
  </select>

  <button onclick={selectNext}>Select next</button>

  <script>
    this.selected = 0

    this.selectNext = function() {
      this.selected++
    }.bind(this)
  </script>
</attr-selected>

Added public/riot-3.13.2/test/tag/attr-test.tag.









>
>
>
>
1
2
3
4
<attr-test>
  <input type="checkbox" id={ opts.checkboxId } class={ red:opts.red } checked={ opts.isChecked }>
  <table if={ opts.includeTable } border={ opts.tableBorder }></table>
</attr-test>

Added public/riot-3.13.2/test/tag/block.tag.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<block>
	<yoyo>Hello World!</yoyo>
</block>

<yoyo>
	<yield/>
</yoyo>

Added public/riot-3.13.2/test/tag/blog.tag.



































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<blog>
  <h1>{ title }</h1>
  <my-post each={ posts }>
    <a href={ this.parent.backToHome }>Back to home</a>
    <div onclick={ this.parent.deleteAllPosts }>Delete all the posts</div>
  </my-post>

  this.backToHome = '/homepage'
  this.title = 'my blog title'

  this.posts = [
    { title: "post 1", description: 'my post description' },
    { title: "post 2", description: 'my post description' }
  ]

  // the bind is needed in this case to keep the parent context
  // also in the child tags
  deleteAllPosts() {
    this.posts = []

    // we need to trigger manually the update function
    // because this function gets triggered from a child tag
    // and it does not bubble up automatically
    this.update()
  }.bind(this)

</blog>

<my-post>
  <h2>{ title }</h2>
  <p>{ description }</p>
  <yield/>
</my-post>

Added public/riot-3.13.2/test/tag/bug-2229.tag.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
<bug-2229>
  <div>
    <select if={ flag }>
      <option each={ list } value={ value }>{ text }</option>
    </select>
  </div>
  <script>
    this.flag = true
    this.list = [{ value: 1, text: 'One' }, { value: 2, text: 'Two' }];
  </script>
</bug-2229>

Added public/riot-3.13.2/test/tag/bug-2369.tag.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
<bug-2369>
  <h1>{ getSpaceName(message) }</h1>

  <script>
    this.message = 'display/example/stuff'
    this.getSpaceName = function(link) {
        return link.match(/display\/(\w+)\//)[1]
    }
  </script>
</bug-2369>

Added public/riot-3.13.2/test/tag/bug-2609.tag.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<bug-2609>
  <bug-2609-child if={cond1}>
    <div if={cond2}>
      <h1>{ message }</h1>
    </div>
  </bug-2609-child>

  <script>
    this.cond1 = true

    onClick() {
      var child = this.tags['bug-2609-child']

      this.cond1 = false
      this.update()

      child.update({
        cond2: true,
        message: Math.random()
      })
    }
  </script>
</bug-2609>

<bug-2609-child>
  <script>
    this.cond2 = false
    this.message = 'hello there'
  </script>
</bug-2609-child>

Added public/riot-3.13.2/test/tag/bug-2629.tag.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
<bug-2629>
  <select data-ref="option" ><option each="{ opt in options }" value="{ opt.val }">{ opt.text }</option></select>
  <input data-ref="check" type="checkbox" each="{ opt in options }" value="{ opt.val }">
  <input data-ref="radio" type="radio" name="itm" each="{ opt in options }" value="{ opt.val }">

  <script>
    this.options = [
      { val:'R',  text:'Road'},
      { val:'',   text:'All '}
    ];
  </script>
</bug-2629>

Added public/riot-3.13.2/test/tag/data-is.tag.













>
>
>
>
>
>
1
2
3
4
5
6
<tag-data-is>
  <p>I'm html5 compliant</p>
  <p data-is="tag-data-is-nested"/>
</tag-data-is>

<tag-data-is-nested>Mee too!</tag-data-is-nested>

Added public/riot-3.13.2/test/tag/deferred-mount.tag.









































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<deferred-child-2>
  <p>I am the deferred-child-2</p>

  this.on('mount', function() {
    opts.onmount('deferred-child-2', this)
  })
</deferred-child-2>

<deferred-loop>
  <p>I am the deferred-loop</p>

  this.on('mount', function() {
    opts.onmount('deferred-loop', this)
  })
</deferred-loop>

<deferred-child-1>
  <p>I am the deferred-child-1</p>
  <deferred-child-2 onmount={ opts.onmount }></deferred-child-2>
  <deferred-loop onmount={ parent.opts.onmount } each={ items }></deferred-loop>

  this.items = [{},{},{},{},{}]

  this.on('mount', function() {
    opts.onmount('deferred-child-1', this)
  })
</deferred-child-1>

<deferred-mount>
  <p>I am the parent</p>
  <deferred-child-1 onmount={ opts.onmount }></deferred-child-1>

  this.on('mount', function() {
    opts.onmount('deferred-mount', this)
  })
</deferred-mount>

Added public/riot-3.13.2/test/tag/dynamic-data-is.tag.

























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<color>
  <input type="color" name="{ opts.inpname }" />
</color>

<calendar>
  <input type="date" name="{ opts.inpname }" />
</calendar>

<dynamic-data-toggle>
  <p>foo</p>
</dynamic-data-toggle>

<dynamic-data-is>
  <div each={ inp in intags } data-is={ inp.tag } inpname={ inp.name }></div>
  <div data-is={ single } inpname={ single }></div>
  <div data-is={ toggleTag } if={ toggle }></div>

  this.intags = [
    {name: 'aaa', tag: 'color'},
    {name: 'bbb', tag: 'color'},
    {name: 'ccc', tag: 'calendar'}
  ]

  this.toggle = true
  this.toggleTag = 'dynamic-data-toggle'

  this.single = 'calendar'
</dynamic-data-is>

Added public/riot-3.13.2/test/tag/dynamic-nested.tag.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dynamic-nested>
  <div ref="dynamic" data-is="{ page }"></div>
  this.page = 'page-a'
</dynamic-nested>

<page>
	<h1>{ opts.title }</h1>
</page>
<page-a>
  <page title="{ title }">
  	<p>{ parent.content }</p>
  </page>
  this.title = 'page-a'
  this.content = 'in page-a'
</page-a>
<page-b>
  <page title="{ title }">
    <p>{ parent.content }</p>
  </page>
  this.title = 'page-b'
  this.content = 'in page-b'
</page-b>

Added public/riot-3.13.2/test/tag/dynamic-virtual.tag.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dynamic-virtual>
  <virtual data-is={ render }>
    <p>yielded data</p>
  </virtual>
  var self = this
  this.render = "ytag"
</dynamic-virtual>

<ytag>
  <yield/>
</ytag>
<xtag>
  <span>virtual data-is</span>
</xtag>

Added public/riot-3.13.2/test/tag/events.tag.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

<events>
  <p onclick={ doSomething }>
    click
  </p><br>
  <p onmousedown={ doSomething }>
    mousedown
  </p><br>
  <textarea onchange={ doSomething }>
    change
  </textarea><br>
  <select onchange={ doSomething }>
    <option>1</option>
    <option>2</option>
  </select>
  <br>
  <input onkeydown={ doSomething } value=keydown><br>
  <events-child each={ val, index in items } onclick={ parent.opts.cb }></events-child>

  doSomething(event) {
    //console.log(event)
  }

  this.items = [1,2,3]

</events>

<events-child>
  <div onclick={ opts.onclick }>Click me</div>
</events-child>

Added public/riot-3.13.2/test/tag/expression-eval-count.tag.













>
>
>
>
>
>
1
2
3
4
5
6
<expression-eval-count>
  <span foo={increment()}></span>

  this.count = 0
  increment() { this.count++ }
</expression-eval-count>

Added public/riot-3.13.2/test/tag/form-controls.tag.





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

<form-controls>

  <label>
    <input type="checkbox" onclick={ check }> Click me
  </label>

  <select>
    <option value="all">All</option>
    <option selected value={ opts.text }>my-value</option>
  </select>

  <textarea name="txta1">{ opts.text }</textarea>

  <textarea name="txta2" placeholder={ opts.text }></textarea>

  <label>
    <input type="radio" onclick={ check }> Click me
  </label>

  <form onsubmit={ checkΒ }>
    <input value={ opts.text } type="text">
    <input value={ opts.bool } type="text">
  </form>

  check() {
    console.info('jooo')
  }

</form-controls>

Added public/riot-3.13.2/test/tag/if-mount.tag.

























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<conditional-tag>
    <p>Conditional Tag</p>
</conditional-tag>

<if-level2>

  <a href="" onclick="{toggleCondition}">Toggle Condition (Level 2)</a>

  <conditional-tag if="{condition}"></conditional-tag>

  this.condition = (opts.condition == 'true')
  var self = this

  this.toggleCondition = function() {
    self.condition = !self.condition
    self.update()
  }
</if-level2>
<if-level1>

  <p><a href="" onclick="{toggleCondition}">Toggle Condition (Level 1)</a></p>

  <div if={ condition }>
    <if-level2 condition="{level2Condition}"></if-level2>
  </div>


  this.condition = (opts.condition == 'true')
  this.level2Condition = opts.level2

  var self = this

  this.toggleCondition = function() {
    self.condition = !self.condition
    self.update()
  }
</if-level1>

<if-mount>
    <if-level1 ref="ff" condition="false" level2="false"></if-level1>
    <if-level1 ref="ft" condition="false" level2="true"></if-level1>
    <if-level1 ref="tf" condition="true" level2="false"></if-level1>
    <if-level1 ref="tt" condition="true" level2="true"></if-level1>
</if-mount>

Added public/riot-3.13.2/test/tag/if-test.tag.



























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

<if-child>
  <h3>Child tag</h3>
</if-child>

<if-test>

  <p>before</p>
  <p if={ flag }>COND</p>

  <p>after</p>

  <p each={ num, i in nums} if={ parent && num == parent.flag }>{ num }</p>

  <p>
    <if-child show={ flag } />
  </p>

  // this.flag = true
  var self = this

  this.nums = [1, 2, 3]

  setTimeout(function() {
    if (this.isMounted) self.update({ flag: true })
  }, 300)


</if-test>

Added public/riot-3.13.2/test/tag/if-unmount.tag.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<if-unmount>
  <if-uchild if={cond} cb={cb} />
  <div if={cond}>
    <if-uchild cb={cb} />
  </if-uchild>

  <div each={items}>
    <if-uchild if={bool} cb={cb} />
  </div>

  this.cond = true
  this.items = [{bool: true}]
  this.cb = opts.cb
</if-unmount>

<if-uchild>
  <span>Foo</span>
  this.on('unmount', function() { opts.cb() })
</if-uchild>

Added public/riot-3.13.2/test/tag/img-test.tag.

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<img-test>

  <img src={ src }>

  var self = this

  setTimeout(function() {
    self.update({ src: '../doc/logo/riot60x.png' })
  }, 10)

  setTimeout(function() {
    self.update({ src: '' })
  }, 2000)

</img-test>

Added public/riot-3.13.2/test/tag/inner-html.tag.











>
>
>
>
>
1
2
3
4
5
<inner-html>
  <h1>Hello, <yield/></h1>

  this.greeting = 'World'
</inner-html>

Added public/riot-3.13.2/test/tag/input-number.tag.







>
>
>
1
2
3
<input-number>
  <input value="{opts.num}" type="number" />
</input-number>

Added public/riot-3.13.2/test/tag/input-updated.tag.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
<input-updated>
  <h3>{ message }</h3>
  <input ref="i" value="{ message }">
  <button ref="b" onclick={ setOtherValue }>Click me!</button>
  <script>
    this.message = 'Hello, Riot!'
    setOtherValue () {
      this.message = 'Can you hear me?'
    }
  </script>
</input-updated>

Added public/riot-3.13.2/test/tag/input-values.tag.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<input-values>
  <input ref="i" value={ message } type="text" />
  this.message = 'hi'
  this.on('mount', function() {
    this.message = 'foo'
  })
</input-values>

Added public/riot-3.13.2/test/tag/isloop-test.tag.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<plans>
  <h2>Plans</h2>
  <plan each=" { name in names } " name="{ name }"></plan>

  this.names = ['plan1', 'plan2'];

</plans>
<plan>
  <p>{ name }</p>

  this.name = opts.name
</plan>

<isloop-test>
  <h1>{ name }</h1>

  <plans></plans>

  this.name = 'Test'
</isloop-test>

Added public/riot-3.13.2/test/tag/lazy-if.tag.



































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

<lazy-if>

  <ul if={ flag }>
    <li each={ el in items }>{ el }</li>
  </ul>

  var self = this
  this.items = [1, 2]

  setTimeout(function() {
    self.items.push(3)
    self.update({ flag: true })
  }, 10)

</lazy-if>

Added public/riot-3.13.2/test/tag/loop-arraylike.tag.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
<loop-arraylike>
  <div>
    <p each="{ value, key in arraylike }">{ key } = { value }</p>
  </div>

  var array = [ 'zero', 'one', 'two', 'three' ]
  this.arraylike = Object.create(Array.prototype)
  this.arraylike.push.apply(this.arraylike, array)
</loop-arraylike>

Added public/riot-3.13.2/test/tag/loop-bug-1649.tag.

































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<loop-bug-1649>
  <h3>Folders</h3>
  <div>
    <div ref='folder-link-1' onclick={ switchFolder1 }>Folder1</div>
    <div ref='folder-link-2' onclick={ switchFolder2 }>Folder2</div>
  </div>
  <div>
    <div class='list' each={ folder } if={ !removed }>
      <div>{ name }</div>
      <div class='remove' onclick={ parent.remove }>Remove</div>
    </div>
  </div>
  <script>
    function item(name) {
      return { name: name }
    }
    var folder1 = [ item('file1InFolder1'), item('file2InFolder1') ]
    var folder2 = [ item('file1InFolder2'), item('file2InFolder2') ]
    this.folder = folder1
    switchFolder1() {
      this.update({ folder: folder1 })
    }
    switchFolder2() {
      this.update({ folder: folder2 })
    }
    remove(e) {
      var item = e.item
      item.removed = true
      this.update()
    }
  </script>
</loop-bug-1649>

Added public/riot-3.13.2/test/tag/loop-bug-2205.tag.































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<loop-bug-2205>
  <ul>
    <li ref={ refAttr } each="{ items }">{ name }</li>
  </ul>

  <script>
    function generateString() {
        var text = ''
        var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'

      for(var i=0; i < 4; i++ )
        text += possible.charAt(Math.floor(Math.random() * possible.length))

      return text
    }

    generateInitial() {
      var i;
      var list = [];
      for (i = 0; i < this.itemsAmount; i++)
        list.push({ name: i + generateString() });
      return list;
    }

    addEditList() {
      this.items.splice(2, 1);
      this.items.splice(4, 1);

      this.items.push({ name: 'new' + generateString() });
      this.items.push({ name: 'new' + generateString() });

      this.items.sort(function(a, b) {
        if (a.name < b.name) {
          return -1
        } else if (a.name > b.name) {
          return 1
        }
        return 0
      })
    }

    this.itemsAmount = 10
    this.refAttr = 'items'
    this.items = this.generateInitial()

  </script>
</loop-bug-2205>

Added public/riot-3.13.2/test/tag/loop-bug-2240.tag.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
<loop-bug-2240>
  <ul>
    <li each={ item in items } ref='items'>{ item.value }</li>
  </ul>
  <script>
    this.items = [
      { value: 'foo' },
      { value: 'bar' },
      { value: 'baz' }
    ]
  </script>
</loop-bug-2240>

Added public/riot-3.13.2/test/tag/loop-bug-2242.tag.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<loop-bug-2242>
  <loop-bug-2242-child each={ items }></loop-bug-2242-child>
  <script>
    this.items = [1, 2, 3]
  </script>
</loop-bug-2242>

<loop-bug-2242-child>
  <p>foo</p>
  <script>
    this.on('mount', function() {
      this.inDOM = document.body.contains(this.root)
    })
  </script>
</loop-bug-2242-child>

Added public/riot-3.13.2/test/tag/loop-child.tag.



















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

<loop-child>

  <looped-child each={ item in items } el={item}></looped-child>

  this.items = [ {name: 'one'}, {name: 'two'} ]
  this.childrenMountWidths = []

  getWidth(el) {
    if (el.root.getBoundingClientRect) {
      return el.root.getBoundingClientRect().width
    } else {
      return false
    }
  }

  this.on('mount', function() {
    this.tags['looped-child'].forEach(function(child) {
      this.childrenMountWidths.push(this.getWidth(child))
    }.bind(this))
  })

</loop-child>


<looped-child style="color: { color };">

  <h3>{ opts.el.name }</h3>
  <button onclick={ hit }>{ opts.el.name }</button>

  this.color = 'red'

  this.on('mount', function() {
    this.mountWidth = this.parent.getWidth(this)
  })

  hit(e) {
    this.color = 'blue'
  }

</looped-child>

Added public/riot-3.13.2/test/tag/loop-cols.tag.



































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<loop-cols>
  <table>
    <caption>Loop Cols</caption>
    <colgroup>
      <col each={headers}>
    </colgroup>
    <thead>
      <tr>
        <th each={header in headers}>{header}</th>
      </tr>
    </thead>
    <tbody>
      <tr each={row in data}>
        <td each={value in row}>{value}</td>
      </tr>
    </tbody>
  </table>

  this.headers = [
    'Name',
    'Number',
    'Address',
    'City',
    'Contact'
  ]
  this.data = [
    ['Abc', '10', 'A 4B', 'MΓ©xico', 'Juan'],
    ['Def', '20', 'B 50', 'USA', 'Anna'],
    ['Ghi', '30', 'D 60', 'Japan', ''],
    ['Jkl', '40', 'E 1C', 'France', 'Balbina']
  ]

</loop-cols>

Added public/riot-3.13.2/test/tag/loop-combo.tag.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

<loop-combo>
  <lci x={x} each={x in a} />

  <div each={x in b}>
    <lci x={x} />
  </div>

  this.a = ['a']
  this.b = ['y']
</loop-combo>

<lci>
</lci>

Added public/riot-3.13.2/test/tag/loop-conditional.tag.



























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<loop-conditional>
  <div onclick={ change } each={ items } if={ value <= 2 }>
    <loop-conditional-nested-item value={value} ></loop-conditional-nested-item>
  </div>
  <article ref="article" each={ items } if={ items.length }>
    item
  </article>
  <loop-conditional-item onclick={ change } each={ items } if={ value <= 2 } value={ value }>
  </loop-conditional-item>

  <footer>
    <loop-conditional-nested-item each={ items } if={ false }></loop-conditional-nested-item>
  </footer>

  this.items = [{value: 1},{value: 2}, {value: 3 }]

  change() {
    this.items = [{value: 1}, {value: 2}, {value: 3}, {value: 4}, {value: 2}, { value: 1 }]
    this.update()
  }

</loop-conditional>
<loop-conditional-item>
  <p>{ opts.value }</p>
</loop-conditional-item>

<loop-conditional-nested-item>
  <p>{ opts.value }</p>
</loop-conditional-nested-item>

Added public/riot-3.13.2/test/tag/loop-context.tag.































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

<loop-context>

  <li each={ items }>
    <a onclick={ toggle }>{ title }</a>
    <a onclick={ remove }>remove</a>
    <a onclick={ fn }>fn</a>
    <span if={ done }>{ parent.rand }</span>
  </li>

  <button onclick={ random }>Set random</button>

  var self = this

  this.items = [
    { title: 'Existing #1', done: true },
    { title: 'Existing #2', fn: function() {
      self.items[2].title = 'kissala'
      self.update()
    }}
  ]

  toggle(e) {
    var item = e.item
    item.done = !item.done
  }

  remove(e) {
    var i = self.items.indexOf(e.item)
    self.items.splice(i, 1)
  }

  random() {
    self.rand = ('' + Math.random()).slice(10)
  }

  this.random()

  // add new items
  setTimeout(function() {
    self.items.unshift({ title: 'Top #1' })
    self.items.push({ title: 'Bottom #new' })
    self.update()

  }, 100)

</loop-context>

Added public/riot-3.13.2/test/tag/loop-double-curly-brackets.tag.

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<loop-double-curly-brackets-child>
  <p>{{opts.data}}</p>
  <p>{{parent.data}}</p>
</loop-double-curly-brackets-child>

<loop-double-curly-brackets>
  <loop-double-curly-brackets-child data={{data}}></loop-double-curly-brackets-child>

  this.data = 'hello';

  change() {
    this.data += ' world';
    this.update()
  }

</loop-double-curly-brackets>

Added public/riot-3.13.2/test/tag/loop-equalitems.tag.















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

<loop-equalitems>
  <h3>Equal items / reordering with pos values</h3>

  <h4>The loop:</h4>
  <span each="{name, i in items}">{name}({i}) </span>

  <h4>Should be:</h4>
  <p>{shouldbe}</p>

  this.shouldbe = '1(0) 2(1) 3(2) 3(3) 4(4) 5(5) 5(6) 6(7)'
  this.items = [1, 2, 3, 3, 4, 5, 5, 6]

  setInterval(function() {
    this.items.sort(function () {
      return Math.round(Math.random()*2-1)
    })
    this.shouldbe = this.items.map(function (item, i) {return item + '('+i+')'}).join(' ')
    this.update()

  }.bind(this), 2000)

</loop-equalitems>

Added public/riot-3.13.2/test/tag/loop-events.tag.





















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<loop-events>
  <inner-loop-events onclick={ click } each={ outerCount, outerI in counter }>{ outerCount }</inner-loop-events>
  this.counter = [ 'out' ]
  this.cb = opts.cb
  click(e) {
    this.cb(e, e.item)
  }
</loop-events>

<inner-loop-events>
  <p><yield></yield></p>
  <ul>
    <li each={ innerCount, innerI in counter } onclick={ click }>
      Click me! { innerI } - { innerCount }
      <loop-events-button-1 cb={ cb }></loop-events-button-1>
      <loop-events-button-2 cb={ cb }></loop-events-button-2>
    </li>
  </ul>

  this.cb = this.parent.cb
  this.counter = [ 'in' ]

  click(e) {
    this.cb(e, e.item)
  }

</inner-loop-events>

<loop-events-button-1>
  <button onclick={ click }>Click me { innerI }</button>
  click(e) {
    opts.cb(e, e.item)
  }
</loop-events-button-1>

<loop-events-button-2>
  <button onclick={ click }>Click me { innerI }</button>

  click(e) {
    opts.cb(e, e.item)
  }
</loop-events-button-2>

Added public/riot-3.13.2/test/tag/loop-ids.tag.



























>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
<loop-ids>
  <loop-ids-item each="{ items}"></loop-ids-item>
  this.items = [{
    name: 'woo'
  }, {
    name: 'bar'
  }, {
    name: 'baz'
  }]
</loop-ids>

<loop-ids-item>
</loop-ids-item>

Added public/riot-3.13.2/test/tag/loop-inherit.tag.































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<loop-inherit>
  <div each={ item, index in items} class={ active: item == 'active' }>
    <loop-inherit-item id={ index } ref={ item } name={ item } nice={ isFun } onmouseenter={ onMouseEnter }></loop-inherit-item>
  </div>

  <loop-inherit-list each={ item in items } if={ item != 'me' }></loop-inherit-list>

  <loop-inherit-item ref="boh" name="boh" onmouseenter={ onMouseEnter }></loop-inherit-item>

  <button onclick={ add }>
    add
  </button>

  <button onclick={ remove }>
    remove second last
  </button>

  var words = ['what', 'oh', 'good', 'foo', 'bar']

  this.items = [
    'me',
    'you',
    'everybody'
  ]

  this.isFun = true

  add() {
    this.items.push(words[~~(Math.random() * words.length)])
  }

  remove() {
    this.items.splice(this.items.length - 2, 1)
  }

  onMouseEnter() {
    if(!this.wasHovered) this.add()
    this.wasHovered = true
  }

</loop-inherit>

<loop-inherit-item onclick={ onClick }>

  <p class={ nice: opts.nice }>{ label } #{ id }</p>

  this.label = opts.name
  this.id = opts.id

  onClick() {
    this.wasClicked = true
  }

  this.on('update', function() {
    this.label = opts.name
    this.id = opts.id
  })

</loop-inherit-item>

<loop-inherit-list>
  <loop-inherit-item></loop-inherit-item>
</loop-inherit-list>

Added public/riot-3.13.2/test/tag/loop-items-attrs.tag.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<loop-items-attrs>
  <loop-items-attrs-item
    each={ items }
    data-color={ color }>
  </loop-items-attrs-item>

  <script>
    this.items = [{ color: 'red' }, { color: 'orange' }]
  </script>
</loop-items-attrs>

<loop-items-attrs-item>
  <p ref="color">{ color }</p>
</loop-items-attrs-item>

Added public/riot-3.13.2/test/tag/loop-manip.tag.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

<loop-manip>

  <ul>
    <li each={ item, i in items }>{ item } <a onclick={ parent.remove }>remove</a></li>
  </ul>

  <button onclick={ top }>Top</button>
  <button onclick={ bottom }>Bottom</button>

  this.items = [0,1,2,3,4,5]

  bottom(e) {
    this.items.push(100)
  }

  top() {
    this.items.unshift(100)
  }

  remove(e) {
    this.items.splice(e.item.i, 1)
  }

</loop-manip>

Added public/riot-3.13.2/test/tag/loop-multi.tag.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10

<loop-multi><p>b<h2 each={first}>{val}</h2>c<h2 each={second}>{val}</h2>d</p>

  <h2 each={third}>{val}</h2>

  this.first =  [ {val: '1' }, { val: '(1)'} ]
  this.second = [ {val: '2' }, { val: '(2)'} ]
  this.third =  [ {val: '3' }, { val: '(3)'} ]

</loop-multi>

Added public/riot-3.13.2/test/tag/loop-named.tag.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
<loop-named>
  <p each={ name, i in list }>
  { name }
  <input type="text" name={ name } value={ i }>
  </p>

  this.list = [ 'first', 'two' ];
</loop-named>

Added public/riot-3.13.2/test/tag/loop-nested-strings-array.tag.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<loop-nested-strings-array>
    <loop-nested-strings-array-list each={item in data}></loop-nested-strings-array-list>
    this.data = [
        {array: ['a', 'b']},
        {array: ['c', 'd']}
    ];
</loop-nested-strings-array>

<loop-nested-strings-array-list>
    <loop-nested-strings-array-item each={item in item.array}></loop-nested-strings-array-item>
</loop-nested-strings-array-list>

<loop-nested-strings-array-item onclick={ clicked }>
    <p>{item}</p>
    this.clicked = function(evt){
        this.parent.item.array.reverse()
        this.parent.update()
    }
</loop-nested-strings-array-item>

Added public/riot-3.13.2/test/tag/loop-nested.tag.











































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<loop-nested>
  <div each={ item in items }>
    <div each={ [1, 2] }>
      <p ref="p">{ item.val }</p>
      <loop-nested-item val={ item.val }></loop-nested-item>
    </div>
  </div>

  <script>
    this.items = [{ val: 1 }, { val: 2 }, { val: 3} ]
  </script>
</loop-nested>

<loop-nested-item>
  <p>{ val }<p>

  <script>
    this.val = opts.val
  </script>
</loop-nested-item>

Added public/riot-3.13.2/test/tag/loop-noloop-option.tag.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
<loop-noloop-option>
    <select>
        <option value="-1">x</option>
        <option value={row.id} each={row, index in list}>{row.name}</option>
        <option value="0">Other</option>
    </select>
    <script>
        this.list = [
            {id: 1, name: 'one'}
        ]
    </script>
</loop-noloop-option>

Added public/riot-3.13.2/test/tag/loop-null-items.tag.













>
>
>
>
>
>
1
2
3
4
5
6
<loop-null-items>
  <ul>
    <li each={items}></li>
  </ul>
  this.items = [1,2,null,3,undefined,8,1]
</loop-null-items>

Added public/riot-3.13.2/test/tag/loop-numbers-nested.tag.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
<loop-numbers-nested>
  <ul each="{ l1, i in data }">
    <li onclick={ onclick } each="{ l2, j in l1 } ">{ i } : { j }</li>
  </ul>
  this.data = [[4,3,2,1], [5,7,6], [8,9]]
  onclick() {
    this.data.reverse()
  }
</loop-numbers-nested>

Added public/riot-3.13.2/test/tag/loop-object-conditional.tag.

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<loop-object-conditional>
  <div ref='items' each={ item,key in items } if={ item.display }>
    { item.tag }
  </div>

  <script>
    this.items = {
      one: {name: 'one', display: '1', tag: 'field-1'},
      two: {name: 'two', display: 1, tag: 'field-2'},
      three: {name: 'three', display: true, tag: 'field-1'},
      four: {name: 'four', display: 0, tag: 'field-2'},
      five: {name: 'five', display: false, tag: 'field-1'},
      six: {name: 'six', display: '0', tag: 'field-1'}
    }
  </script>
</loop-object-conditional>

Added public/riot-3.13.2/test/tag/loop-object.tag.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

<loop-object>

  <h3>Object loop</h3>

  <div>
    <p each="{ value, key in obj }">{ key } = { value }</p>
  </div>

  this.obj = { zero: 0, one: 1, two: 2, three: 3 }

  var self = this

</loop-object>

Added public/riot-3.13.2/test/tag/loop-optgroup.tag.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<loop-optgroup>
  <select>
    <optgroup each="{ group in data }" label="{ group.name }">
        <option each="{ option in group.options }" selected="{ option.selected }" value="{ option.value }">{ option.name }</option>
    </optgroup>
  </select>

  this.data = [
    {
      name: 'Group 1',
      options: [ { name: 'Option 1.1', value: 1, selected: '' },{ name: 'Option 1.2', value: 2, selected: '' } ]
    },
    {
      name: 'Group 2',
      options: [ { name: 'Option 2.1', value: 3, selected: 0 },{ name: 'Option 2.2', value: 4, selected: 'selected' } ]
    }
  ]
</loop-optgroup>

Added public/riot-3.13.2/test/tag/loop-optgroup2.tag.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<loop-optgroup2>
  <select>
    <option selected="{ true }">&lt;Select Option&gt;
    <optgroup each="{ group in data }" label="{ group.name }">
        <option each="{ option in group.options }" value="{ option.value }" disabled={ option.disabled }>{ option.name }
    </optgroup>
  </select>

  this.data = [
    {
      name: 'Group 1',
      options: [ { name: 'Option 1.1', value: 1, disabled: '' },{ name: 'Option 1.2', value: 2, disabled: '1' } ]
    },
    {
      name: 'Group 2',
      options: [ { name: 'Option 2.1', value: 3, disabled: 0 },{ name: 'Option 2.2', value: 4, disabled: true } ]
    }
  ]
</loop-optgroup2>

Added public/riot-3.13.2/test/tag/loop-option.tag.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
<loop-option>
  <select>
    <option each={ data } selected={ id == 2  } value="{ id }">{ name }</option>
  </select>

  this.data = [
      {id: 1, name: 'Peter'},
      {id: 2, name: 'Sherman'},
      {id: 3, name: 'Laura'}
  ]
</loop-option>

Added public/riot-3.13.2/test/tag/loop-position.tag.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<loop-position>

  <p>
    <span each="{ items }">{ x }</span>
  </p>

  <h3>between</h3>

  <p>
    <span each="{ items }">{ x }</span>
  </p>

  this.items = [{ x: '1 ' }, { x: '2 ' }]

  setTimeout(function() {
    this.items.push({ x: 'third' })
    this.update()

  }.bind(this), 200)

</loop-position>

Added public/riot-3.13.2/test/tag/loop-protect-internal-attrs.tag.



































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

<loop-protect-internal-attrs>

  <div each={ items }>
    <loop-protect-internal-attrs-child></loop-protect-internal-attrs-child>
  </div>

  this.items = [
    { foo: 'foo', tags: 'tags' },
    { foo: 'foo', tags: 'tags' },
    { foo: 'foo', tags: 'tags' },
    { foo: 'foo', tags: 'tags' }
  ]

</loop-protect-internal-attrs>

<loop-protect-internal-attrs-child></loop-protect-internal-attrs-child>

Added public/riot-3.13.2/test/tag/loop-reorder.tag.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<loop-reorder>

  <div each="{items}" no-reorder>{x}</div>
  <span each="{items}">{x}</span>

  this.items = [{ x: 1 }, { x: 2 }, { x: 3 }, { x: 4 }, { x: 5 }, { x: 6 }]

  this.on('mount', function() {
    var spans = this.root.querySelectorAll('span'),
        divs = this.root.querySelectorAll('div')
    ;[].slice.call(spans).forEach(function(span, i){
      span.className = 'nr-' + i
    })
    ;[].slice.call(divs).forEach(function(div, i){
      div.className = 'nr-' + i
    })
  })

</loop-reorder>

Added public/riot-3.13.2/test/tag/loop-replace.tag.























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

<loop-replace>

  <div>
    <strong each="{ items }">{ v }</strong>
    <button onclick={ run }>Run</button>
  </div>

  var self = this
  self.items = [ { v: 'a' }, { v: 9 }, { v: 3 } ]

  run() {
    setTimeout(function() {
      self.update({ items: [ { v:'c'}, { v:'d' }, { v: 'e' }, { v: 'f' }, { v: 'g' } ] })
    }, 200)

    setTimeout(function() {
      self.items = self.items.concat([ { v:'c'},{ v:'c'},{ v:'c'},{ v:'c'} ])
      self.update()
    }, 400)

    setTimeout(function() { self.update({ items: [ {v:'e'}, {v:'f'} ] }) }, 600)
  }



</loop-replace>

Added public/riot-3.13.2/test/tag/loop-root.tag.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

<loop-root>

  <ul>
    <li each={ arr }>{ root }</li>
  </ul>

  this.arr = [{ root: 1 }, { root: 2 }, { root: 3 }]

  splice() {
    this.arr = this.arr.splice(1,2)
  }

</loop-root>

Added public/riot-3.13.2/test/tag/loop-single-tags.tag.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<loop-single-tags>
  <single-tag1></single-tag1>
  <single-tag2></single-tag2>
  <single-tag3></single-tag3>
  <single-tag4></single-tag4>
  <ul>
    <li each={ tags }>{ name }</li>
  </ul>
</loop-single-tags>

<single-tag1>
  this.name = 1
</single-tag1>

<single-tag2>
  this.name = 2
</single-tag2>

<single-tag3>
  this.name = 3
</single-tag3>

<single-tag4>
  this.name = 4
</single-tag4>

Added public/riot-3.13.2/test/tag/loop-strings.tag.



































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

<loop-strings>

  <h3>Array of primitives</h3>

  <p each="{ val, i in arr }">#{ i }: <strong>{ val }</strong></p>

  <button onclick={ set }>Update</button>

  this.arr = [ 'first', 110, Math.random(), 27.12 ]

  set() {
    this.arr[0] = 'manipulated'
    this.arr[2] = Math.random()
  }

</loop-strings>

Added public/riot-3.13.2/test/tag/loop-svg-nodes.tag.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<loop-svg-nodes>
  <svg>
    <g data-is='loop-svg-nodes-custom-circle' each={data in circles}></g>
    <circle each={ points } riot-cx={ x * 10 + 5 } riot-cy={ y * 10 + 5 } r="2" fill="black"></circle>
  </svg>
  <p>Description</p>

  this.points = [{'x': 1,'y': 0}, {'x': 9, 'y': 6}, {'x': 4, 'y': 7}]
  this.circles = [
    {'x': 40, 'y': 20, 'fill': 'red'},
    {'x': 60, 'y': 20, 'fill': 'yellow'},
  ]
</loop-svg-nodes>

<loop-svg-nodes-custom-circle>
  <circle
    ref='circle'
    riot-cx={data.x}
    riot-cy={data.y}
    r="10"
    fill={data.fill} />
</loop-svg-nodes-custom-circle>

Added public/riot-3.13.2/test/tag/loop-swap-type.tag.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<loop-swap-type>
  <div each="{ item in current }">{ item.num }</div>

  var arr = [
    { num: 1 },
    { num: 2 }
  ]

  var obj = {
    0: { num: 3 },
    1: { num: 4 }
  }

  this.current = arr
  this.swap = function () {
    if (Array.isArray(this.current)) {
      this.current = obj
    } else {
      this.current = arr
    }
  }
</loop-swap-type>

Added public/riot-3.13.2/test/tag/loop-sync-options-nested.tag.































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<loop-sync-options-nested>
  <div each={ child, index in children } reorder="true">
    <loop-sync-options-nested-child data={ child }></loop-sync-options-nested-child>
  </div>


  this.children = [{
    val: 'foo'
  },{
    num: 3
  },{
    bool: false
  }]

</loop-sync-options-nested>

<loop-sync-options-nested-child>
  this.val = opts.data.val
  this.bool = opts.data.bool
  this.num = opts.data.num

  this.on('update', function() {
    this.val = opts.data.val
    this.bool = opts.data.bool
    this.num = opts.data.num
  })
</loop-sync-options-nested-child>

<loop-sync-options-nested-wrapper>
  <loop-sync-options-nested></loop-sync-options-nested>
</loop-sync-options-nested-wrapper>

Added public/riot-3.13.2/test/tag/loop-sync-options.tag.

















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<loop-sync-options>
  <loop-sync-options-child each={ child in children } data={ child } class={ active: child.val }></loop-sync-options-child>

  this.children = [{
    val: 'foo'
  },{
    num: 3
  },{
    bool: false
  }]

</loop-sync-options>

<loop-sync-options-child>

  function sync() {
    this.val = opts.data.val
    this.bool = opts.data.bool
    this.num = opts.data.num
  }

  this.on('update', sync).on('mount', sync)

</loop-sync-options-child>

Added public/riot-3.13.2/test/tag/loop-tag-instances.tag.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<loop-tag-instances>
  <loop-tag-instances-child each={ inst }>
    <p>Hello { this.tags['loop-tag-instance'][0].name }</p>
  </loop-tag-instances-child>

  <loop-tag-instances-test>
    <loop-tag-instance>
    </loop-tag-instance>
  </loop-tag-instances-test>

  <loop-tag-instances-test>
    <loop-tag-instance>
    </loop-tag-instance>
  </loop-tag-instances-test>

  <loop-tag-instances-test>
    <loop-tag-instance>
    </loop-tag-instance>
  </loop-tag-instances-test>

  <loop-tag-instances-test>
    <loop-tag-instance>
    </loop-tag-instance>
  </loop-tag-instances-test>

  <loop-tag-instances-test>
    <loop-tag-instance>
    </loop-tag-instance>
  </loop-tag-instances-test>

  start() {
    this.inst = this.tags['loop-tag-instances-test']
    this.update()
  }

</loop-tag-instances>

<loop-tag-instances-child>
</loop-tag-instances-child>

<loop-tag-instance>
  this.name = 'hello'
</loop-tag-instance>

<loop-tag-instances-test>
</loop-tag-instances-test>

Added public/riot-3.13.2/test/tag/loop-unshift.tag.



























>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
<loop-unshift>
  <loop-unshift-item each={ item in items } data={ item }></loop-unshift-item>
  this.items = [{
    name: 'woo'
  }, {
    name: 'bar'
  }]
</loop-unshift>

<loop-unshift-item>
  <p>{ name }</p>
  this.name = opts.data.name
</loop-unshift-item>

Added public/riot-3.13.2/test/tag/loop-virtual.tag.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<loop-virtual>
  <virtual each={item in data} no-reorder>
    <dt>{item.key}</dt>
    <dd>{item.value}</dd>
  </virtual>

  this.data = [
  { key: 'Coffee', value: 'Black hot drink' },
  { key: 'Milk', value: 'White cold drink' }
  ]

</loop-virtual>

<loop-virtual-reorder>
  <virtual each={item in data}>
    <dt>{item.key}</dt>
    <dd>{item.value}</dd>
  </virtual>

  this.data = [
  { key: 'Coffee', value: 'Black hot drink' },
  { key: 'Milk', value: 'White cold drink' }
  ]

</loop-virtual-reorder>

Added public/riot-3.13.2/test/tag/loop.tag.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<loop>
  <ul>
    <li each="{ item, i in items }" onclick="{ parent.opts.onItemClick }">{ i } { item.value } </li>
  </ul>
  <dl>
    <dt each="{ this.removes }" onclick="{ parent.opts.removeItemClick }">{ value } </dt>
  </dl>
  <button onclick={ addSomeItems }>btn</button>

  this.items = []

  addSomeItems(e) {
    var amount = 5
    while(amount--){
      this.items.push({value: "item #" + this.items.length})
    }
  }
</loop>

Added public/riot-3.13.2/test/tag/multi-named.tag.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<multi-named>
  <input ref="rad" type="radio" value="1">
  <input ref="rad" type="radio" value="2">
  <input ref="rad" type="radio" value="3">
  <input ref="t" id="t" value="1">
  <input each="{v in items}" ref="t_{v}" id="t_{v}" value="{v}">
  <input type="checkbox" ref="c" each="{v in items}" value="{v}">
  <multi-nchild n='child' mount={opts.mountChild}></multi-nchild>

  this.on('mount', opts.mount)
  this.items = [1,2]
</multi-named>

<multi-nchild>
  <input ref={opts.n} value='child'>
  <input type='checkbox' each={v in checks} ref="check" value="{v}">

  this.checks = ['one', 'two', 'three']
  this.on('mount', opts.mount)
</multi-nchild>

Added public/riot-3.13.2/test/tag/multiple-select.tag.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<multiple-select>
  <select ref="sel" multiple>
    <option>A</option>
    <option selected={true}>B</option>
    <option selected={true}>C</option>
  </select>
</multiple-select>

Added public/riot-3.13.2/test/tag/named-child.tag.











>
>
>
>
>
1
2
3
4
5
<named-child-parent>
  <named-child ref="tags-child"></named-child>
</named-child-parent>

<named-child>I have a name</named-child>

Added public/riot-3.13.2/test/tag/named-data-ref.tag.







>
>
>
1
2
3
<named-data-ref>
  <input data-ref="greeting" type="text" value="Hello">
</named-data-ref>

Added public/riot-3.13.2/test/tag/named-select.tag.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
<named-select>
  <select ref="daSelect" each={ item in items }>
    <option>---</option>
    <option each={ option in item }>{ option }</option>
  </select>

  this.items = [
    ['foo', 'bar'],
    ['baz', 'foo']
  ]
</named-select>

Added public/riot-3.13.2/test/tag/named-unmount.tag.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
<named-unmount>
  <div ref='first' if={cond}>
    <div ref='second'></div>
  </div>

  <div each={item in items}>
    <div ref={item}></div>
  </div>

  this.cond = false
  this.items = []
</named-unmount>

Added public/riot-3.13.2/test/tag/nested-child.tag.

























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

<nested-child>

  <child title="first"></child>
  <child title="second"></child>
  <child title="third"></child>
  <child title="fourth"></child>
  <child title="fifth"></child>
  <child title="sixth"></child>

  <another-nested-child title="whathever"></another-nested-child>

  this.name = 'my name'

</nested-child>


<child>

  <h3>{ opts.title }</h3>

</child>

<another-nested-child>

  <h3>{ opts.title }</h3>

</another-nested-child>

Added public/riot-3.13.2/test/tag/nested-riot.tag.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
<nested-riot>
  <p>hello</p>
</nested-riot>

<container-riot>
  <div data-is="{ show }"></div>
  this.show = "nested-riot"
</container-riot>

Added public/riot-3.13.2/test/tag/obj-key-loop.tag.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<obj-key-loop>
   <div each={ value, name in looped}>
    <input ref="{name}" value="{value}"/><br>
  </div>

    this.looped = {x: 3, y: 44, z: 23}
</obj-key-loop>

Added public/riot-3.13.2/test/tag/observable-attr.tag.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<observable-attr>
  <observable-attr-child store={ store }></observable-attr-child>
  this.store = riot.observable()
  this.on('mount', function() {
    this.store.trigger('custom-event')
  })
</observable-attr>

<observable-attr-child>
  var self = this
  this.store = opts.store
  this.store.on('custom-event', function(){
    self.wasTriggered = true
  })
</observable-attr-child>

Added public/riot-3.13.2/test/tag/outer.tag.

























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
<outer-inner>
  <p>
    { opts.value }
  </p>
</outer-inner>

<outer>
  <div each="{ data, i in opts.data }">
    <span>{ i }</span>
    <outer-inner value="{ data.value }"></outer-inner>
  </div>
</outer>

Added public/riot-3.13.2/test/tag/pass-expr.tag.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11

<expr-parent>
  <expr-child code={ code }></expr-child>
  this.code = 'foo { bar }'
</expr-parent>

<expr-child>
  <pre>{ opts.code } == foo \{ bar \}</pre>
  if (console)
    console.info(opts)
</expr-child>

Added public/riot-3.13.2/test/tag/ploop-tag.tag.















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<ploop-tag>
    <ploop-child each="{ opts.elements }" foo="{ foo }" name="child-{ this.id }"></ploop-child>
    <ploop-another foo="test"></ploop-another>
</ploop-tag>

<ploop1-tag>
  <div each="{ opts.elements }">
    <ploop-child foo="{ foo }" name="child-{ this.id }"></ploop-child>
  </div>
  <ploop-another foo="test"></ploop-another>
  <ploop-another foo="test"></ploop-another>
</ploop1-tag>

<ploop2-tag>
  <div each="{ opts.elements }">
    <div>
      <ploop-child foo="{ foo }" name="child-{ this.id }"></ploop-child>
    </div>
  </div>
  <ploop-another foo="test"></ploop-another>
</ploop2-tag>

<ploop3-tag>
  <div each="{ opts.elements }">
    <div>
      <div>
        <ploop-child foo="{ foo }" name="child-{ this.id }"></ploop-child>
      </div>
    </div>
  </div>
  <ploop-another foo="test"></ploop-another>
</ploop3-tag>

<ploop-child>
  <p>{ opts.foo }</p>
</ploop-child>
<ploop-another>
  <p>{ opts.foo }</p>
</ploop-another>

Added public/riot-3.13.2/test/tag/preserve-attr.tag.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
<preserve-attr class='single-quote'>
  <p>say something</p>
</preserve-attr>

<preserve-attr2 class="double-quote">
  <p>html</p>

  this.nothing = opts.nothing
</preserve-attr2>

Added public/riot-3.13.2/test/tag/prevent-update.tag.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
<prevent-update>
  <p onclick={ changeNameSilently }>click me</p>
  <p ref="fancy-name">{ name }</p>

  this.name = 'john'
  changeNameSilently(e) {
    e.preventUpdate = true
    this.name = 'mark'
  }
</prevent-update>

Added public/riot-3.13.2/test/tag/raw-contents.tag.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
<raw-contents>
  <h1>Title: {= text } { text }</h1>
  <p>{= text }</p>

  <div data-content={ content } ></div>

  this.text = '<span style="color:lime">&nbsp; Hi &copy; there</span>'
  this.content = '<div>Ehy</div><p>ho</p>'
</raw-contents>

Added public/riot-3.13.2/test/tag/reserved-names.tag.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<reserved-names>
    <p>Looping over an array containing objects w/ reserved property names</p>
    <ul each={items}>
        <li>{name}: {String(tags)}</li>
    </ul>
    <button onclick={reorder}>Reorder</button>
    <script>
        this.items = [
            {refs: "item 1", tags: null, parent: 'foo'},
            {refs: "item 2", tags: ["a", "b", "c"]},
            {refs: "item3"}
        ]

        reorder() {
            this.items.reverse()
        }
    </script>
</reserved-names>

Added public/riot-3.13.2/test/tag/runtime-event-listener-switch.tag.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<runtime-event-listener-switch>
  <p class='first' onmouseenter={ flag ? ev1 : ev2 } onclick={ flag ? ev1 : ev2 }>Click</p>
  <p class='second' onmouseenter={ flag ? ev1 : ev2 } onclick={ flag ? ev1 : ev2 }>Click</p>

  <script>
    this.flag = true

    ev1(name) {
      this.flag = false
      this.opts.cb('ev1')
    }

    ev2(name) {
      this.flag = true
      this.opts.cb('ev2')
    }

  </script>
</runtime-event-listener-switch>

Added public/riot-3.13.2/test/tag/scoped.tag.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<scoped-tag>
  <p>should have a border</p>

  <style>
    p { border: solid 1px black }
  </style>
</scoped-tag>

Added public/riot-3.13.2/test/tag/script-tag.tag.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<script-tag>
  <p>{ foo }</p>

  <script type="text/javascript">
    this.foo = 'bar'
  </script>
</script-tag>

Added public/riot-3.13.2/test/tag/select-test.tag.



















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<select-test>
  <form id="select-test-form">
    <!--One single option, without expressions-->
    <select data={theOptions} data-is="select-single-option"></select>
    <!--Looped option, no group-->
    <select data={theOptions} data-is="select-each-option"></select>
    <!--Single option + looped option, no group-->
    <select data={theOptions} data-is="select-each-option-prompt"></select>
    <!--Two looped options, no group-->
    <select data={theOptions} data-is="select-each-two-options"></select>
    <!--One group with one looped option-->
    <select data={theOptions} data-is="select-optgroup-each-option"></select>
    <!--Single option + one group with one looped option-->
    <select data={theOptions} data-is="select-optgroup-each-option-prompt"></select>
    <!--Two groups with one looped option each-->
    <select data={theOptions} data-is="select-two-optgroup-each-option"></select>
    <!--Looped group (2 items) with looped options-->
    <select data={theOptions} data-is="select-each-optgroup"></select>
  </form>
  <script>
    this.theOptions = ['Opt1', 'Opt2', 'Opt3']
  </script>
</select-test>

<select-single-option>
  <option selected>(choose)</option>
</select-single-option>

<select-each-option>
  <option each={ opt, i in opts.data } selected={ i == 1 }>{ opt }</option>
</select-each-option>

<select-each-option-prompt>
  <option>(choose)</option>
  <option each={ opt, i in opts.data } selected={ i == 1 }>{ opt }</option>
</select-each-option-prompt>

<select-each-two-options>
  <option each={ opt, i in opts.data }>{ opt }</option>
  <option each={ opt, i in opts.data } selected={ i == 1 }>{ opt }</option>
</select-each-two-options>

<select-optgroup-each-option>
  <optgroup label="Group 1">
    <option each={ opt in opts.data }>{ opt }</option>
  </optgroup>
</select-optgroup-each-option>

<select-optgroup-each-option-prompt>
  <optgroup label="Group 1">
    <option each={ opt in opts.data }>{ opt }</option>
  </optgroup>
  <option selected>(choose)</option>
</select-optgroup-each-option-prompt>

<select-two-optgroup-each-option>
  <optgroup label="Group 1">
    <option each={ opt in opts.data }>{ opt }</option>
  </optgroup>
  <option selected>(choose)</option>
  <optgroup label="Group 2">
    <option each={ opt in opts.data }>{ opt }</option>
  </optgroup>
</select-two-optgroup-each-option>

<select-each-optgroup>
  <optgroup each={ group in groups } label={ group }>
    <option each={ opt in parent.opts.data }>{ opt }</option>
  </optgroup>
  <script>
    this.groups = ['Group 1', 'Group 2']
  </script>
</select-each-optgroup>

Added public/riot-3.13.2/test/tag/shared-opts.tag.









>
>
>
>
1
2
3
4

<shared-opts>
  <p>{ opts.val }</p>
</shared-opts>

Added public/riot-3.13.2/test/tag/should-update-opts.tag.



























>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
<should-update-opts>
  <p>{ count }</p>

  this.count = 0

  shouldUpdate(data, opts) {
    return opts.shouldUpdate
  }

  this.on('update', function() {
    this.count ++
  })
</should-update-opts>

Added public/riot-3.13.2/test/tag/should-update.tag.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
<should-update>
  <p ref="count">{ count }</p>

  this.count = 0

  shouldUpdate(data) { return data }

  this.on('update', function() {
    this.count ++
  })
</should-update>

Added public/riot-3.13.2/test/tag/style-tag.tag.











>
>
>
>
>
1
2
3
4
5
<style-tag>
  <style>
    p {color: blue;}
  </style>
</style-tag>

Added public/riot-3.13.2/test/tag/style-tag2.tag.











>
>
>
>
>
1
2
3
4
5
<style-tag2>
  <style scoped>
    div {color: red;}
  </style>
</style-tag2>

Added public/riot-3.13.2/test/tag/style-tag4.tag.













>
>
>
>
>
>
1
2
3
4
5
6
<style-tag4>
  <style>
    p {border: solid 3px black;}
  </style>
  <p></p>
</style-tag4>

Added public/riot-3.13.2/test/tag/svg-attr.tag.



























>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
<svg-attr>
  <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
      <g id="circle">
        <circle r="10"/>
      </g>
    </defs>
    <use ref='target' x="50" y="10" xlink:href={ href } />
  </svg>
  <script>
    this.href = '#circle'
  </script>
</svg-attr>

Added public/riot-3.13.2/test/tag/table-data.tag.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

<table-data>

  <h3>Cells</h3>
  <table border=1>
    <tr><th each={ rows }>{ cell }</th></tr>
    <tr><td each={ rows }>{ cell }</td></tr>
  </table>

  <h3>Rows</h3>
  <table border=1>
    <tr each={ rows }>
      <td>{ cell }</td>
      <td>{ cell } another</td>
    </tr>
  </table>

  this.rows = [{ cell: 'One'}, { cell: 'Two'}, { cell: 'Three'}]

</table-data>

Added public/riot-3.13.2/test/tag/table-loop-extra-row.tag.













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<table-loop-extra-row>

  <h3>Rows</h3>
  <table border=1>
    <tr>
      <td>Extra</td>
      <td>Row1</td>
    </tr>
    <tr each={ rows }>
      <td>{ cell }</td>
      <td>{ cell } another</td>
    </tr>
    <tr>
      <td>Extra</td>
      <td>Row2</td>
    </tr>
  </table>

  this.rows = [{ cell: 'One'}, { cell: 'Two'}, { cell: 'Three'}]

</table-loop-extra-row>

Added public/riot-3.13.2/test/tag/table-multibody.tag.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<table-multibody>
  <h3>Bodies</h3>
  <table border=1>
    <tbody each={ body, i in bodies }>
      <tr style="background-color:{ bgcolor[i&amp;1] }"><td each={ body }>{ body[i] }</td></tr>
    </tbody>
  </table>
  <button onclick={ swapColor }>Swap color</button>

  this.bodies = [['A1', 'A2', 'A3'], ['B1', 'B2', 'B3'], ['C1', 'C2', 'C3']]
  this.bgcolor = [ 'white', 'lime' ]
  swapColor(i) {
    this.bgcolor.reverse()
  }
</table-multibody>

Added public/riot-3.13.2/test/tag/table-test.tag.









































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<!--
  The main container. It is not neccesary but holds common data and all the
  the tags, so the test only needs one call to mount("table-test") to work.
-->
<table-test>

  <table data-is="table-caption"
    header={ header }
    footer={ footer } rows={ rows } widths={ widths }/>

  <table data-is="table-colgroup"
    header={ header }
    footer={ footer } rows={ rows } widths={ widths }/>

  <table data-is="table-looped-col"
    header={ header }
    footer={ footer } rows={ rows } widths={ widths }/>

  <table data-is="table-multi-col"
    header={ header }
    footer={ footer } rows={ rows } widths={ widths }/>

  <table data-is="table-tfoot"
    header={ header }
    footer={ footer } rows={ rows } widths={ widths }/>

  <table data-is="table-tr-body-only"
    header={ header }
    footer={ footer } rows={ rows } widths={ widths }/>

  <table data-is="table-tr-alone"
    header={ header }
    footer={ footer } rows={ rows } widths={ widths }/>

  <table data-is="table-custom-thead-tfoot"
    header={ header }
    footer={ footer } rows={ rows } widths={ widths }/>

  <script>
  this.widths = [150, 200]
  this.header = ['H-1', 'H-2']
  this.footer = ['F-1', 'F-2']
  this.rows = [['R1-C1', 'R1-C2'], ['R2-C1', 'R2-C2']]
  </script>
</table-test>

<!-- The nested riot tags -->

<table-caption>
  <caption>Title</caption>
  <colgroup>
    <col each={ width in opts.widths } width="{ width }">
  </colgroup>
  <tbody>
    <tr each={ row in opts.rows }>
      <td each={ cell in row }>{ cell }</td>
    </tr>
  </tbody>
</table-caption>

<table-colgroup>
  <colgroup>
    <col each={ width in opts.widths } width="{ width }">
  </colgroup>
  <thead>
    <tr><th each={ cell in opts.header }>{ cell }</th></tr>
  </thead>
  <tbody>
    <tr each={ row in opts.rows }>
      <td each={ cell in row }>{ cell }</td>
    </tr>
  </tbody>
</table-colgroup>

<table-looped-col>
  <col each={ width in opts.widths } width="{ width }">
  <thead>
    <tr><th each={ cell in opts.header }>{ cell }</th></tr>
  </thead>
  <tbody>
    <tr each={ row in opts.rows }>
      <td each={ cell in row }>{ cell }</td>
    </tr>
  </tbody>
</table-looped-col>

<!-- table starting with a multiple cols, without colgroup -->
<table-multi-col>
  <col width="{ opts.widths[0] }">
  <col width="{ opts.widths[1] }">
  <thead>
    <tr><th each={ cell in opts.header }>{ cell }</th></tr>
  </thead>
  <tbody>
    <tr each={ row in opts.rows }>
      <td each={ cell in row }>{ cell }</td>
    </tr>
  </tbody>
</table-multi-col>

<!-- table starting with a tfoot -->
<table-tfoot>
  <tfoot>
    <tr><td each={ cell in opts.footer }>{ cell }</td></tr>
  </tfoot>
  <tbody>
    <tr each={ row in opts.rows }>
      <td each={ cell in row }>{ cell }</td>
    </tr>
  </tbody>
</table-tfoot>

<!-- table with a looped TR, without TBODY -->
<table-tr-body-only>
  <tr each={ row in opts.rows }>
    <td each={ cell in row }>{ cell }</td>
  </tr>
</table-tr-body-only>

<!-- table with single literal TR, without expressions -->
<table-tr-alone>
  <tr><td>R1-C1</td><td>R1-C2</td></tr>
</table-tr-alone>

<!-- table with all the main elements as riot tags (2 tbody) -->
<table-custom-thead-tfoot>
  <colgroup data-is="tag-colgroup" widths={ opts.widths }/>
  <thead data-is="tag-thead" rows={ opts.header }/>
  <tfoot data-is="tag-tfoot" rows={ opts.footer }/>
  <tbody data-is="tag-tbody" rows={ opts.rows }/>
  <tbody data-is="tag-tbody" rows={ opts.rows }/>
</table-custom-thead-tfoot>

<!-- riot tags for the main table elements -->
<tag-colgroup>
  <col each={ width in opts.widths } width={ width }>
</tag-colgroup>
<tag-thead>
  <tr><td each={ cell in opts.rows }>{ cell }</td></tr>
</tag-thead>
<tag-tfoot>
  <tr><td each={ cell in opts.rows }>{ cell }</td></tr>
</tag-tfoot>
<tag-tbody>
  <tr each={ row in opts.rows }>
    <td each={ cell in row }>{ cell }</td>
  </tr>
</tag-tbody>

Added public/riot-3.13.2/test/tag/table-thead-tfoot-nested.tag.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
<table-thead-tfoot-nested>

  <table data-is="table-thead-tfoot" header="{ header }" footer="{ footer }" rows="{ rows }"></table>

  this.header = [{ cell: 'One'}, { cell: 'Two'}, { cell: 'Three'}]
  this.footer = [{ cell: 'One'}, { cell: 'Two'}, { cell: 'Three'}]
  this.rows = [['One'], ['Two'], ['Three']]

</table-thead-tfoot-nested>

Added public/riot-3.13.2/test/tag/table-thead-tfoot.tag.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<table-thead-tfoot>

  <thead>
    <tr><th each={ header }>{ cell }</th></tr>
  </thead>
  <tfoot>
    <tr><td each={ footer }>{ cell }</td></tr>
  </tfoot>
  <tbody>
    <tr each={ col in rows }>
      <td each={ cell in col }>{ cell }</td>
    </tr>
  </tbody>

  this.header = opts.header
  this.footer = opts.footer
  this.rows = opts.rows

</table-thead-tfoot>

Added public/riot-3.13.2/test/tag/tag-nesting.tag.

















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

<tag-nesting>

  <inner1 name="my_name" bar="{ bar }" foo={ foo } />

  this.foo = { value: 10 }
  this.bar = { value: 25 }

  this.on('mount', function() {
    this.tags.inner1.echo()
  })

  setTimeout(function() {
    this.foo.value = 30
    this.bar.value = 45
    this.update()

  }.bind(this), 600)


</tag-nesting>

<inner1>
  <p>Inner1 foo: { opts.foo.value }</p>
  <p>Inner1 bar: { opts.bar.value }</p>
  <p ref="test"></p>
  <inner2 bar={ opts.bar } />

  var bar = opts.bar.value

  echo() {
    this.refs.test.innerHTML = '+ECHOED+'
  }

</inner1>

<inner2>
  <p>Inner2: { opts.bar.value + 50 }</p>

</inner2>

Added public/riot-3.13.2/test/tag/textarea-value.tag.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
<textarea-value>
  <textarea>{ message }</textarea>
  <button onclick="{hello}">click</button>

  this.message = 'hello there'
  hello() {
    this.message = 'world'
  }

</textarea-value>

Added public/riot-3.13.2/test/tag/timer.tag.

















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<timer>

  <p>Seconds Elapsed: { time }</p>

  this.time = opts.start || 0

  tick() {

    this.update({ time: ++this.time })

    if (this.opts.ontick) {
      this.opts.ontick(this.time)
    }

  }

  var timer = setInterval(this.tick, 1000)

  this.on('unmount', function() {

    clearInterval(timer)
  })

</timer>

Added public/riot-3.13.2/test/tag/timetable.tag.























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
<foo>
   <p>{ opts.baz } { bar }</p>
   this.bar = "romutus"
</foo>
<timetable>
   <timer ontick={ parent.opts.ontick } start={ time } each={ time, i in times }></timer>
   <foo barz="899" baz="90"></foo>
   <p>{ kama }</p>
   this.times = [ 1, 3, 5 ]
   this.kama = "jooo"
</timetable>

Added public/riot-3.13.2/test/tag/top-attributes.tag.











>
>
>
>
>
1
2
3
4
5
<top-attributes class="{cls}" data-noquote={q} style="font-size: {s}" data-nqlast={q}>
  this.cls = opts.cls
  this.s = "2em"
  this.q = "quotes"
</top-attributes>

Added public/riot-3.13.2/test/tag/touch-events.tag.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

<touch-events>

  <div ontouchstart={ fn } ontouchmove={ fn } ontouchend={Β fn }>
    <h3>Touch me, touch me.</h3>
  </div>

  <div id="info" onclick={ clear }></div>

  fn(e) {
    this.info.innerHTML += e.type + '<br>'
  }

  clear() {
    this.info.innerHTML = ''
  }

</touch-events>

Added public/riot-3.13.2/test/tag/treeview.tag.









































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<treeview>

  <ul id='treeview'>
    <li>
      <treeitem data={ treedata }></treeitem>
    </li>
  </ul>

  <script>
  this.treedata = {
    name: 'My Tree',
    nodes: [
      { name: 'hello' },
      { name: 'wat' },
      {
        name: 'child folder',
        nodes: [
          {
            name: 'child folder',
            nodes: [
              { name: 'hello' },
              { name: 'wat' }
            ]
          },
          { name: 'hello' },
          { name: 'wat' },
          {
            name: 'child folder',
            nodes: [
              { name: 'hello' },
              { name: 'wat' }
            ]
          }
        ]
      }
    ]
  }
  </script>
</treeview>

<treeitem>

  <div class={ bold: isFolder() } onclick={ toggle } ondblclick={ changeType }>
    { name }
    <span if={ isFolder() }>[{open ? '-' : '+'}]</span>
  </div>

  <!-- TODO: now if is implemented as CSS display, so show must use isFolder as well, which should be removed -->

  <ul if={ isFolder() } show={ isFolder() && open }>
    <li each={ child, i in nodes }>
      <treeitem data={child}></treeitem>
    </li>
    <li onclick={ addChild }>+</li>
  </ul>

  <script>
  var self = this
  self.name = opts.data.name
  self.nodes = opts.data.nodes

  isFolder() {
    return self.nodes && self.nodes.length
  }

  toggle(e) {
    self.open = !self.open
  }

  changeType(e) {
    if (!self.isFolder()) {
      self.nodes = []
      self.addChild()
      self.open = true
    }
  }

  addChild(e) {
    self.nodes.push({
      name: 'new stuff'
    })
  }
  </script>
</treeitem>

Added public/riot-3.13.2/test/tag/update-context.tag.



























>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
<update-context>
  <p>{ message }</p>

  <script>
    this.message = 'hi'

    this.on('update', function() {
      this.message = 'goodbye'
    })

    setTimeout(this.update, 100)
  </script>
</update-context>

Added public/riot-3.13.2/test/tag/v-dom-1.tag.











>
>
>
>
>
1
2
3
4
5
<v-dom-1>

  <div></div>

</v-dom-1>

Added public/riot-3.13.2/test/tag/v-dom-2.tag.











>
>
>
>
>
1
2
3
4
5
<v-dom-2>

  <v-dom-3></v-dom-3>

</v-dom-2>

Added public/riot-3.13.2/test/tag/v-dom-3.tag.











>
>
>
>
>
1
2
3
4
5
<v-dom-3>

  <div></div>

</v-dom-3>

Added public/riot-3.13.2/test/tag/virtual-conditional.tag.











































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<virtual-conditional>
  <virtual if={ user != null }>
    <p>{ user.name }</p>
    <virtual-conditional-child></virtual-conditional-child>
  </virtual>

  <script>
    this.childMountCount = 0
    this.user = null
  </script>
</virtual-conditional>

<virtual-conditional-child>
  <p>hi</p>

  <script>
    this.on('mount', function() {
      this.parent.childMountCount ++
    })
  </script>
</virtual-conditional-child>

Added public/riot-3.13.2/test/tag/virtual-nested-component.tag.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<virtual-nested-component>
  <div>
    <virtual each={ person in people }>
      <not-virtual-component2 name={ person.name } age={ person.age }></not-virtual-component2>
    </virtual>
  </div>
  <script>
    this.people = [
      { name: 'Jack', age: 10 },
      { name: 'Susy', age: 5 },
      { name: 'Mel', age: 15 },
      { name: 'Fred', age: 20 }
    ]
  </script>

</virtual-nested-component>

<not-virtual-component2>
  <span>{ opts.name } - { opts.age } <br/></span>
</not-virtual-component2>

Added public/riot-3.13.2/test/tag/virtual-nested-unmount.tag.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<virtual-nested-unmount>
  <virtual each="{childItems}"><div>{title}</div>
    <virtual each="{value in childchildItems}">
      <span>{value}</span>
    </virtual>
    <br>
  </virtual>
  <button onclick="{ updateChildren }">updateChildren</button>
  var self = this;

  self.childItems = [
    {title:"1", childchildItems: ['1']},
    {title:"2", childchildItems: ['1','2']},
    {title:"3", childchildItems: ['1','2','3']}
  ]

  self.childItems
</virtual-nested-unmount>

Added public/riot-3.13.2/test/tag/virtual-no-loop.tag.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<virtual-no-loop>

  <virtual if={true} data-is="vtest-tag" msg="if works {attr}">yielded text</virtual>

  <virtual data-is="vtest-tag" msg="virtuals yields expression">{parent.message}</virtual>

  <virtual if={false} data-is="vtest-tag" msg={attr}>{ parent.message }</virtual>

  <virtual if={true}><p>{attr}</p></virtual>

  this.message = 'hello there'
  this.attr = 'text'

</virtual-no-loop>

<vtest-tag>
  <span>{opts.msg}</span>
  <div><yield></yield></div>
</vtest-tag>

Added public/riot-3.13.2/test/tag/virtual-yield-loop.tag.





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<virtual-yield-loop>
    <virtual  data-is="virtual-yield-test" each={ item in items }>{ item.v }</virtual>

    this.items = [
        {v: 'one'},
        {v: 'two'},
        {v: 'three'}
    ]
</virtual-yield-loop>

<virtual-yield-test>
    <div>take up space</div>
    <span><yield></yield></span>
</virtual-yield-test>

Added public/riot-3.13.2/test/tag/yield-empty.tag.







>
>
>
1
2
3
<yield-empty>
  <yield/>
</yield-empty>

Added public/riot-3.13.2/test/tag/yield-from-default.tag.











>
>
>
>
>
1
2
3
4
5
<yield-from-default>
  <yield from=options><p>(no options)</p></yield>
  <p><yield from=hello>Hi</yield> <span class="<yield from=icon/>"></span></p>
  <p each={ item in <yield from=loop/> }>{ item }</p>
</yield-from-default>

Added public/riot-3.13.2/test/tag/yield-multi.tag.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
<yield-multi>
  <p>yield the <yield from="content" /> here</p>
  <div>
     <p>yield the nested <yield from="nested-content" /> here</p>
     <p>do not yield the unreference content <yield from="unreferenced-content" />here</p>
  </div>
</yield-multi>

Added public/riot-3.13.2/test/tag/yield-multi2.tag.











>
>
>
>
>
1
2
3
4
5
<yield-multi2>
  <yield from="options"></yield>
  <yield from="toggle"></yield>
  <p><yield from="hello"/> <yield from="world"/></p>
</yield-multi2>

Added public/riot-3.13.2/test/tag/yield-nested.tag.























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<yield-child>

  <h1>Greeting</h1>
  <yield/>
  this.greeting = 'from the child'

</yield-child>

<yield-child-2>

  <h1>Greeting { this.parent.greeting }</h1>
  <h2>{ opts.subtitle }</h2>
  <yield/>
  this.greeting = 'from the child'
</yield-child-2>


<yield-parent>
  <h1>Hello, <yield/></h1>

  <yield-child>
    <i onclick={ parent.saySomething } >{ greeting }</i>
    <div class={ selected: parent.isSelected }>
      <b>wooha</b>
    </div>
  </yield-child>

  this.greeting = 'from the parent'

  saySomething() {

    this.greeting = 'I am alive!'

    if (opts.saySomething)
      opts.saySomething()

    this.update()

  }.bind(this)

</yield-parent>

<yield-loop>
  <h1>Hello, <yield/></h1>

  <yield-child-2 each={ items } subtitle={ name }>
    <i onclick={ parent.saySomething } >{ greeting }</i>
    <div class={ selected: parent.isSelected }>
      <b>wooha</b>
    </div>
  </yield-child-2>

  this.greeting = 'from the parent'
  this.items = [
    { name: "subtitle1" },
    { name: "subtitle2" },
    { name: "subtitle3" },
    { name: "subtitle4" },
    { name: "subtitle5" }
  ]

  saySomething() {

    this.greeting = 'I am alive!'

    if (opts.saySomething)
      opts.saySomething()

    this.update()

  }.bind(this)

</yield-loop>


Added public/riot-3.13.2/test/tag/yield-no-slash.tag.







>
>
>
1
2
3
<yield-no-slash>
  <yield>
</yield-no-slash>

Added public/riot-3.13.2/test/tag/~custom-parsers.tag.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
<custom-parsers>
  <p>hi</p>
  <style type="text/myparser">
    @tag {color: red;}
  </style>
  <script type="text/myparser">
    this.version = "@version"
  </script>
</custom-parsers>

Added public/riot-3.13.2/test/tag/~import-tags.tag.









>
>
>
>
1
2
3
4
require('./timer.tag')
<import-tags>
  <timer></timer>
</import-tags>

Added public/riot-3.13.2/test/tag/~style-tag3.tag.













>
>
>
>
>
>
1
2
3
4
5
6
<style-tag3>
  <style type="text/myparser">
    p {border: solid 3px black;}
  </style>
  <p></p>
</style-tag3>

Added public/riot-3.13.2/test/tags.html.















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<!doctype html>

<head>
  <title>Riot tag tests</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <style>
    body { font-family: 'myriad pro', sans-serif; font-size: 90% }
    #tags { margin: 30px auto; max-width: 1000px }
    #tags > * { display: inline-block; vertical-align: top; margin: 20px 50px }
    a { color: blue; cursor: pointer }
  </style>
</head>

<body>

  <div id="tags">

    <attr-selected></attr-selected>
    <form-controls></form-controls>
    <isloop-test></isloop-test>

    <if-test></if-test>
    <loop-object></loop-object>
    <img-test></img-test>

    <shared-opts val="1"></shared-opts>
    <shared-opts val="2"></shared-opts>

    <loop-replace></loop-replace>
    <touch-events></touch-events>
    <lazy-if></lazy-if>
    <loop-combo></loop-combo>
    <loop-multi></loop-multi>
    <loop-context></loop-context>
    <loop-option></loop-option>
    <loop-optgroup></loop-optgroup>
    <table-data></table-data>
    <timetable></timetable>
    <div data-is="table-data"></div>
    <loop-strings></loop-strings>
    <loop-position></loop-position>
    <loop-nested></loop-nested>
    <select-test></select-test>
    <loop-reorder></loop-reorder>
    <expr-parent></expr-parent>
    <expression-eval-count></expression-eval-count>

    <tag-nesting></tag-nesting>

    <loop-child></loop-child>
    <loop-manip></loop-manip>

    <loop-null-items></loop-null-items>


    <inner-html>
      { greeting }
    </inner-html>
    <yield-parent>
      { greeting }
      <div>Something else</div>
    </yield-parent>
    <yield-loop>
      { greeting }
      <div>Something else</div>
    </yield-loop>

    <loop-inherit></loop-inherit>

    <treeview></treeview>

    <events></events>

    <if-mount></if-mount>
    <if-unmount></if-unmount>

    <loop-numbers-nested></loop-numbers-nested>
    <loop-conditional></loop-conditional>
    <reserved-names></reserved-names>

  </div>

  <script src="../dist/riot/riot+compiler.js"></script>
  <script src="../dist/tags.js"></script>
  <script>var tags = riot.mount('*', { test: { zap: 100 }})</script>

</body>

Added public/riot-3.13.2/test/vendor/require.js.









































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
 RequireJS 2.1.18 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved.
 Available via the MIT or new BSD license.
 see: http://github.com/jrburke/requirejs for details
*/
var requirejs,require,define;
(function(ba){function G(b){return"[object Function]"===K.call(b)}function H(b){return"[object Array]"===K.call(b)}function v(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function T(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function t(b,c){return fa.call(b,c)}function m(b,c){return t(b,c)&&b[c]}function B(b,c){for(var d in b)if(t(b,d)&&c(b[d],d))break}function U(b,c,d,e){c&&B(c,function(c,g){if(d||!t(b,g))e&&"object"===typeof c&&c&&!H(c)&&!G(c)&&!(c instanceof
RegExp)?(b[g]||(b[g]={}),U(b[g],c,d,e)):b[g]=c});return b}function u(b,c){return function(){return c.apply(b,arguments)}}function ca(b){throw b;}function da(b){if(!b)return b;var c=ba;v(b.split("."),function(b){c=c[b]});return c}function C(b,c,d,e){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=e;d&&(c.originalError=d);return c}function ga(b){function c(a,k,b){var f,l,c,d,e,g,i,p,k=k&&k.split("/"),h=j.map,n=h&&h["*"];if(a){a=a.split("/");l=a.length-1;j.nodeIdCompat&&
Q.test(a[l])&&(a[l]=a[l].replace(Q,""));"."===a[0].charAt(0)&&k&&(l=k.slice(0,k.length-1),a=l.concat(a));l=a;for(c=0;c<l.length;c++)if(d=l[c],"."===d)l.splice(c,1),c-=1;else if(".."===d&&!(0===c||1===c&&".."===l[2]||".."===l[c-1])&&0<c)l.splice(c-1,2),c-=2;a=a.join("/")}if(b&&h&&(k||n)){l=a.split("/");c=l.length;a:for(;0<c;c-=1){e=l.slice(0,c).join("/");if(k)for(d=k.length;0<d;d-=1)if(b=m(h,k.slice(0,d).join("/")))if(b=m(b,e)){f=b;g=c;break a}!i&&(n&&m(n,e))&&(i=m(n,e),p=c)}!f&&i&&(f=i,g=p);f&&(l.splice(0,
g,f),a=l.join("/"))}return(f=m(j.pkgs,a))?f:a}function d(a){z&&v(document.getElementsByTagName("script"),function(k){if(k.getAttribute("data-requiremodule")===a&&k.getAttribute("data-requirecontext")===i.contextName)return k.parentNode.removeChild(k),!0})}function e(a){var k=m(j.paths,a);if(k&&H(k)&&1<k.length)return k.shift(),i.require.undef(a),i.makeRequire(null,{skipMap:!0})([a]),!0}function n(a){var k,c=a?a.indexOf("!"):-1;-1<c&&(k=a.substring(0,c),a=a.substring(c+1,a.length));return[k,a]}function p(a,
k,b,f){var l,d,e=null,g=k?k.name:null,j=a,p=!0,h="";a||(p=!1,a="_@r"+(K+=1));a=n(a);e=a[0];a=a[1];e&&(e=c(e,g,f),d=m(r,e));a&&(e?h=d&&d.normalize?d.normalize(a,function(a){return c(a,g,f)}):-1===a.indexOf("!")?c(a,g,f):a:(h=c(a,g,f),a=n(h),e=a[0],h=a[1],b=!0,l=i.nameToUrl(h)));b=e&&!d&&!b?"_unnormalized"+(O+=1):"";return{prefix:e,name:h,parentMap:k,unnormalized:!!b,url:l,originalName:j,isDefine:p,id:(e?e+"!"+h:h)+b}}function s(a){var k=a.id,b=m(h,k);b||(b=h[k]=new i.Module(a));return b}function q(a,
k,b){var f=a.id,c=m(h,f);if(t(r,f)&&(!c||c.defineEmitComplete))"defined"===k&&b(r[f]);else if(c=s(a),c.error&&"error"===k)b(c.error);else c.on(k,b)}function w(a,b){var c=a.requireModules,f=!1;if(b)b(a);else if(v(c,function(b){if(b=m(h,b))b.error=a,b.events.error&&(f=!0,b.emit("error",a))}),!f)g.onError(a)}function x(){R.length&&(ha.apply(A,[A.length,0].concat(R)),R=[])}function y(a){delete h[a];delete V[a]}function F(a,b,c){var f=a.map.id;a.error?a.emit("error",a.error):(b[f]=!0,v(a.depMaps,function(f,
d){var e=f.id,g=m(h,e);g&&(!a.depMatched[d]&&!c[e])&&(m(b,e)?(a.defineDep(d,r[e]),a.check()):F(g,b,c))}),c[f]=!0)}function D(){var a,b,c=(a=1E3*j.waitSeconds)&&i.startTime+a<(new Date).getTime(),f=[],l=[],g=!1,h=!0;if(!W){W=!0;B(V,function(a){var i=a.map,j=i.id;if(a.enabled&&(i.isDefine||l.push(a),!a.error))if(!a.inited&&c)e(j)?g=b=!0:(f.push(j),d(j));else if(!a.inited&&(a.fetched&&i.isDefine)&&(g=!0,!i.prefix))return h=!1});if(c&&f.length)return a=C("timeout","Load timeout for modules: "+f,null,
f),a.contextName=i.contextName,w(a);h&&v(l,function(a){F(a,{},{})});if((!c||b)&&g)if((z||ea)&&!X)X=setTimeout(function(){X=0;D()},50);W=!1}}function E(a){t(r,a[0])||s(p(a[0],null,!0)).init(a[1],a[2])}function I(a){var a=a.currentTarget||a.srcElement,b=i.onScriptLoad;a.detachEvent&&!Y?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=i.onScriptError;(!a.detachEvent||Y)&&a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function J(){var a;
for(x();A.length;){a=A.shift();if(null===a[0])return w(C("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));E(a)}}var W,Z,i,L,X,j={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},h={},V={},$={},A=[],r={},S={},aa={},K=1,O=1;L={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?r[a.map.id]=a.exports:a.exports=r[a.map.id]={}},module:function(a){return a.module?
a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return m(j.config,a.map.id)||{}},exports:a.exports||(a.exports={})}}};Z=function(a){this.events=m($,a.id)||{};this.map=a;this.shim=m(j.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};Z.prototype={init:function(a,b,c,f){f=f||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=u(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=
c;this.inited=!0;this.ignore=f.ignore;f.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],u(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=
this.map.url;S[a]||(S[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var f=this.exports,l=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&&
(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=
this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f);
if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval",
"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.undefed||
(this.defineDep(b,a),this.check())}));this.errback?q(a,"error",u(this,this.errback)):this.events.error&&q(a,"error",u(this,function(a){this.emit("error",a)}))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};
i={config:j,contextName:b,registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p,nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=
i.makeShimExports(a);b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b,a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b,null,!0))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,
e){function j(c,d,m){var n,q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild=!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,
{isBrowser:z,toUrl:function(b){var d,e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!==e&&(!("."===k||".."===k)||1<e))d=b.substring(e,b.length),b=b.substring(0,e);return i.nameToUrl(c(b,a&&a.id,!0),d,!0)},defined:function(b){return t(r,p(b,a,!1,!0).id)},specified:function(b){b=p(b,a,!1,!0).id;return t(r,b)||t(h,b)}});a||(j.undef=function(b){x();var c=p(b,a,!0),e=m(h,b);e.undefed=!0;d(b);delete r[b];delete S[c.url];delete $[b];T(A,function(a,c){a[0]===b&&A.splice(c,1)});e&&(e.events.defined&&($[b]=e.events),
y(b))});return j},enable:function(a){m(h,a.id)&&s(a).enable()},completeLoad:function(a){var b,c,d=m(j.shim,a)||{},g=d.exports;for(x();A.length;){c=A.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);E(c)}c=m(h,a);if(!b&&!t(r,a)&&c&&!c.inited){if(j.enforceDefine&&(!g||!da(g)))return e(a)?void 0:w(C("nodefine","No define call for "+a,null,[a]));E([a,d.deps||[],d.exportsFn])}D()},nameToUrl:function(a,b,c){var d,e,h;(d=m(j.pkgs,a))&&(a=d);if(d=m(aa,a))return i.nameToUrl(d,b,c);if(g.jsExtRegExp.test(a))d=
a+(b||"");else{d=j.paths;a=a.split("/");for(e=a.length;0<e;e-=1)if(h=a.slice(0,e).join("/"),h=m(d,h)){H(h)&&(h=h[0]);a.splice(0,e,h);break}d=a.join("/");d+=b||(/^data\:|\?/.test(d)||c?"":".js");d=("/"===d.charAt(0)||d.match(/^[\w\+\.\-]+:/)?"":j.baseUrl)+d}return j.urlArgs?d+((-1===d.indexOf("?")?"?":"&")+j.urlArgs):d},load:function(a,b){g.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ja.test((a.currentTarget||a.srcElement).readyState))N=null,
a=I(a),i.completeLoad(a.id)},onScriptError:function(a){var b=I(a);if(!e(b.id))return w(C("scripterror","Script error for: "+b.id,a,[b.id]))}};i.require=i.makeRequire();return i}var g,x,y,D,I,E,N,J,s,O,ka=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,la=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,Q=/\.js$/,ia=/^\.\//;x=Object.prototype;var K=x.toString,fa=x.hasOwnProperty,ha=Array.prototype.splice,z=!!("undefined"!==typeof window&&"undefined"!==typeof navigator&&window.document),ea=!z&&"undefined"!==
typeof importScripts,ja=z&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,Y="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),F={},q={},R=[],M=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(G(requirejs))return;q=requirejs;requirejs=void 0}"undefined"!==typeof require&&!G(require)&&(q=require,require=void 0);g=requirejs=function(b,c,d,e){var n,p="_";!H(b)&&"string"!==typeof b&&(n=b,H(c)?(b=c,c=d,d=e):b=[]);n&&n.context&&(p=n.context);
(e=m(F,p))||(e=F[p]=g.s.newContext(p));n&&e.configure(n);return e.require(b,c,d)};g.config=function(b){return g(b)};g.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=g);g.version="2.1.18";g.jsExtRegExp=/^\/|:|\?|\.js$/;g.isBrowser=z;x=g.s={contexts:F,newContext:ga};g({});v(["toUrl","undef","defined","specified"],function(b){g[b]=function(){var c=F._;return c.require[b].apply(c,arguments)}});if(z&&(y=x.head=document.getElementsByTagName("head")[0],
D=document.getElementsByTagName("base")[0]))y=x.head=D.parentNode;g.onError=ca;g.createNode=function(b){var c=b.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");c.type=b.scriptType||"text/javascript";c.charset="utf-8";c.async=!0;return c};g.load=function(b,c,d){var e=b&&b.config||{};if(z)return e=g.createNode(e,c,d),e.setAttribute("data-requirecontext",b.contextName),e.setAttribute("data-requiremodule",c),e.attachEvent&&!(e.attachEvent.toString&&
0>e.attachEvent.toString().indexOf("[native code"))&&!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)):(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=
I,q.baseUrl||(E=s.split("/"),s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl=O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),
function(b){if("interactive"===b.readyState)return N=b}),e=N;e&&(b||(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this);

Added public/samples/bd01.wav.

cannot compute difference between binary files

Added public/samples/bd02.wav.

cannot compute difference between binary files

Added public/samples/bd03.wav.

cannot compute difference between binary files

Added public/samples/bd04.wav.

cannot compute difference between binary files

Added public/samples/bd05.wav.

cannot compute difference between binary files

Added public/samples/bd06.wav.

cannot compute difference between binary files

Added public/samples/bd07.wav.

cannot compute difference between binary files

Added public/samples/bd08.wav.

cannot compute difference between binary files

Added public/samples/bd09.wav.

cannot compute difference between binary files

Added public/samples/bd10.wav.

cannot compute difference between binary files

Added public/samples/cp01.wav.

cannot compute difference between binary files

Added public/samples/cp02.wav.

cannot compute difference between binary files

Added public/samples/cp03.wav.

cannot compute difference between binary files

Added public/samples/cp04.wav.

cannot compute difference between binary files

Added public/samples/cr01.wav.

cannot compute difference between binary files

Added public/samples/cr02.wav.

cannot compute difference between binary files

Added public/samples/cr03.wav.

cannot compute difference between binary files

Added public/samples/cr04.wav.

cannot compute difference between binary files

Added public/samples/hh01.wav.

cannot compute difference between binary files

Added public/samples/hh02.wav.

cannot compute difference between binary files

Added public/samples/hh03.wav.

cannot compute difference between binary files

Added public/samples/hh04.wav.

cannot compute difference between binary files

Added public/samples/ht01.wav.

cannot compute difference between binary files

Added public/samples/ht02.wav.

cannot compute difference between binary files

Added public/samples/ht03.wav.

cannot compute difference between binary files

Added public/samples/ht04.wav.

cannot compute difference between binary files

Added public/samples/ht05.wav.

cannot compute difference between binary files

Added public/samples/ht06.wav.

cannot compute difference between binary files

Added public/samples/ht07.wav.

cannot compute difference between binary files

Added public/samples/ht08.wav.

cannot compute difference between binary files

Added public/samples/lt01.wav.

cannot compute difference between binary files

Added public/samples/lt02.wav.

cannot compute difference between binary files

Added public/samples/lt03.wav.

cannot compute difference between binary files

Added public/samples/lt04.wav.

cannot compute difference between binary files

Added public/samples/lt05.wav.

cannot compute difference between binary files

Added public/samples/lt06.wav.

cannot compute difference between binary files

Added public/samples/lt07.wav.

cannot compute difference between binary files

Added public/samples/lt08.wav.

cannot compute difference between binary files

Added public/samples/mt01.wav.

cannot compute difference between binary files

Added public/samples/mt02.wav.

cannot compute difference between binary files

Added public/samples/mt03.wav.

cannot compute difference between binary files

Added public/samples/mt04.wav.

cannot compute difference between binary files

Added public/samples/mt05.wav.

cannot compute difference between binary files

Added public/samples/mt06.wav.

cannot compute difference between binary files

Added public/samples/mt07.wav.

cannot compute difference between binary files

Added public/samples/mt08.wav.

cannot compute difference between binary files

Added public/samples/oh01.wav.

cannot compute difference between binary files

Added public/samples/oh02.wav.

cannot compute difference between binary files

Added public/samples/oh03.wav.

cannot compute difference between binary files

Added public/samples/oh04.wav.

cannot compute difference between binary files

Added public/samples/rd01.wav.

cannot compute difference between binary files

Added public/samples/rd02.wav.

cannot compute difference between binary files

Added public/samples/rd03.wav.

cannot compute difference between binary files

Added public/samples/rd04.wav.

cannot compute difference between binary files

Added public/samples/rs01.wav.

cannot compute difference between binary files

Added public/samples/rs02.wav.

cannot compute difference between binary files

Added public/samples/sd01.wav.

cannot compute difference between binary files

Added public/samples/sd02.wav.

cannot compute difference between binary files

Added public/samples/sd03.wav.

cannot compute difference between binary files

Added public/samples/sd04.wav.

cannot compute difference between binary files

Added public/samples/sd05.wav.

cannot compute difference between binary files

Added public/samples/sd06.wav.

cannot compute difference between binary files

Added public/samples/sd07.wav.

cannot compute difference between binary files

Added public/samples/sd08.wav.

cannot compute difference between binary files

Added public/samples/sd09.wav.

cannot compute difference between binary files

Added public/samples/sd10.wav.

cannot compute difference between binary files

Added public/samples/sd11.wav.

cannot compute difference between binary files

Added public/samples/sd12.wav.

cannot compute difference between binary files

Added public/samples/sd13.wav.

cannot compute difference between binary files

Added public/samples/sd14.wav.

cannot compute difference between binary files

Added public/samples/sd15.wav.

cannot compute difference between binary files

Added public/teoria-master/LICENSE.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Copyright (c) 2015 Jakob Miland <saebekassebil@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Added public/teoria-master/README.md.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
Teoria.js
=========

Teoria.js is a lightweight and fast JavaScript library
for music theory, both Jazz and Classical. It aims at providing an intuitive
programming interface for music software (such as Sheet Readers,
Sheet Writers, MIDI Players etc.).

Features
---------

 - A note object (`teoria.Note`), which understands alterations, octaves,
 key number, frequency and etc. and Helmholtz notation

 - A chord object (`teoria.Chord`), which understands everything
 from simple major/minor chords to advanced Jazz chords (Ab#5b9, F(#11) and such)

 - A scale object (`teoria.Scale`), The scale object is a powerful presentation of
 a scale, which supports quite a few handy methods. A scale can either be
 constructed from the predefined scales, which by default contains the 7 modes
 (Ionian, Dorian, Phrygian etc.) a major and minor pentatonic and the harmonic
 chromatic scale or from an arbitrary array of intervals. The scale object
 also supports solfège, which makes it perfect for tutorials on sight-reading.

 - An interval object (`teoria.Interval`), which makes it easy to find the
 interval between two notes, or find a note that is a given interval from a note.
 There's also support for counting the interval span in semitones and inverting the
 interval.

Usage
--------

    $ npm install teoria

Can be used with both Node and Browserify/webpack/etc.

### ... or less preferable

Include the bundled build file, `teoria.js` from this repository, directly:
```html
<script src="path/to/teoria.js"></script>
```
Syntax
---------

This is just a short introduction to what teoria-code looks like,
for a technical library reference, look further down this document.

```javascript

// Create notes:
var a4 = teoria.note('a4');       // Scientific notation
var g5 = teoria.note("g''");      // Helmholtz notation
var c3 = teoria.note.fromKey(28); // From a piano key number

// Find and create notes based on intervals
teoria.interval(a4, g5);    // Returns a Interval object representing a minor seventh
teoria.interval(a4, 'M6');  // Returns a Note representing F#5
a4.interval('m3');          // Returns a Note representing C#4
a4.interval(g5);            // Returns a Interval object representing a minor seventh
a4.interval(teoria.note('bb5')).invert(); // Returns a Interval representing a major seventh

// Create scales, based on notes.
a4.scale('mixolydian').simple();  // Returns: ["a", "b", "c#", "d", "e", "f#", "g"]
a4.scale('aeolian').simple();     // Returns: ["a", "b", "c", "d", "e", "f", "g"]
g5.scale('ionian').simple();      // Returns: ["g", "a", "b", "c", "d", "e", "f#"]
g5.scale('dorian');               // Returns a Scale object

// Create chords with the powerful chord parser
a4.chord('sus2').name;    // Returns the name of the chord: 'Asus2'
c3.chord('m').name;       // Returns 'Cm'
teoria.chord('Ab#5b9');   // Returns a Chord object, representing a Ab#5b9 chord
g5.chord('dim');          // Returns a Chord object, representing a Gdim chord

// Calculate note frequencies or find the note corresponding to a frequency
teoria.note.fromFrequency(467); // Returns: {'note':{...},'cents':3.102831} -> A4# a little out of tune.
a4.fq(); // Outputs 440
g5.fq(); // Outputs 783.9908719634985

// teoria allows for crazy chaining:
teoria.note('a')    // Create a note, A3
  .scale('lydian')  // Create a lydian scale with that note as root (A lydian)
  .interval('M2')   // Transpose the whole scale a major second up (B lydian)
  .get('third')     // Get the third note of the scale (D#4)
  .chord('maj9')    // Create a maj9 chord with that note as root (D#maj9)
  .toString();      // Make a string representation: 'D#maj9'
```

Documentation
------------------------

## teoria.note (name | coord[, duration])

*name* - The name argument is the note name as a string. The note can both
be expressed in scientific and Helmholtz notation.
Some examples of valid note names: `Eb4`, `C#,,`, `C4`, `d#''`, `Ab2`

*coord* - If the first argument isn't a string, but a coord array,
it will instantiate a `Note` instance.

*duration* - The duration argument is an optional `object` argument.
The object has two also optional parameters:

 - `value` - A `number` corresponding to the value of the duration, such that:
`1 = whole`, `2 = half (minim)`, `4 = quarter`, `8 = eight`

 - `dots` - The number of dots attached to the note. Defaults to `0`.

### teoria.note.fromKey(key)
A static method that returns an instance of Note set to the note
at the given piano key, where A0 is key number 1.
See [Wikipedia's piano key article](http://en.wikipedia.org/wiki/Piano_key_frequencies)
for more information.

### teoria.note.fromFrequency(fq)
A static method returns an object containing two elements:

*note* - A `Note` which corresponds to the closest note with the given frequency

*cents* - A number value of how many cents the note is out of tune

### teoria.note.fromMIDI(note)
 - Returns an instance of Note set to the corresponding MIDI note value.

*note* - A number ranging from 0-127 representing a MIDI note value

### teoria.note.fromString(note)
 - Returns an instance of Note representing the note name

*note* - The name argument is the note name as a string. The note can both
be expressed in scientific and Helmholtz notation.
Some examples of valid note names: `Eb4`, `C#,,`, `C4`, `d#''`, `Ab2`

#### Note.name()
 - The name of the note, in lowercase letter (*only* the name, not the
 accidental signs)

#### Note.octave()
 - The numeric value of the octave of the note

#### Note.duration
 - The duration object as described in the constructor for Note

#### Note.accidental()
 - Returns the string symbolic of the accidental sign (`x`, `#`, `b` or `bb`)

#### Note.accidentalValue()
 - Returns the numeric value (mostly used internally) of the sign:
`x = 2, # = 1, b = -1, bb = -2`

#### Note#key([whitenotes])
 - Returns the piano key number. E.g. A4 would return 49

*whitenotes* - If this parameter is set to `true` only the white keys will
be counted when finding the key number. This is mostly for internal use.

#### Note#midi()
 - Returns a number ranging from 0-127 representing a MIDI note value

#### Note#fq([concertPitch])
 - Calculates and returns the frequency of the note.

*concertPitch* - If supplied this number will be used instead of the normal
concert pitch which is 440hz. This is useful for some classical music.

#### Note#chroma()
 - Returns the pitch class (index) of the note.

This allows for easy enharmonic checking:

    teoria.note('e').chroma() === teoria.note('fb').chroma();

The chroma number is ranging from pitch class C which is 0 to 11 which is B

#### Note#scale(scaleName)
 - Returns an instance of Scale, with the tonic/root set to this note.

*scaleName* - The name of the scale to be returned. `'minor'`,
`'chromatic'`, `'ionian'` and others are valid scale names.

#### Note#interval(interval)
 - A sugar function for calling teoria.interval(note, interval);

Look at the documentation for `teoria.interval`

#### Note#transpose(interval)
 - Like the `#interval` method, but changes `this` note, instead of returning a new

#### Note#chord([name])
 - Returns an instance of Chord, with root note set to this note

*name* - The name attribute is the last part of the chord symbol.
Examples: `'m7'`, `'#5b9'`, `'major'`. If the name parameter
isn't set, a standard major chord will be returned.

#### Note#helmholtz()
 - Returns the note name formatted in Helmholtz notation.

Example: `teoria.note('A5').helmholtz() -> "a''"`

#### Note#scientific()
 - Returns the note name formatted in scientific notation.

Example: `teoria.note("ab'").scientific() -> "Ab4"`

#### Note#enharmonics(oneAccidental)
 - Returns all notes that are enharmonic with the note

*oneAccidental* - Boolean, if set to true, only enharmonic notes with one
accidental is returned. E.g. results such as 'eb' and 'c#' but not 'ebb' and 'cx'

```javascript
teoria.note('c').enharmonics().toString();
// -> 'dbb, b#'

teoria.note('c').enharmonics(true).toString();
// -> 'b#'
```

#### Note#durationInSeconds(bpm, beatUnit)
 - Returns the duration of the note, given a tempo (in bpm) and a beat unit
 (the lower numeral of the time signature)

#### Note#solfege(scale, showOctaves)
 - Returns the solfege step in the given scale context

*scale* - An instance of `Scale`, which is the context of the solfege step measuring

*showOctaves* - A boolean. If set to true, a "Helmholtz-like" notation will be
used if there's bigger intervals than an octave

#### Note#durationName()
 - Returns the duration name.

Examples: `teoria.note('A', 8).durationName() -> 'eighth'`,
`teoria.note('C', 16).durationName() -> 'sixteenth'`

#### Note#scaleDegree(scale)
 - Returns this note's degree in a given scale (Scale). For example a
 `D` in a C major scale will return `2` as it is the second degree of that scale.
 If however the note *isn't* a part of the scale, the degree returned will be
 `0`, meaning that the degree doesn't exist. This allows this method to be both
 a scale degree index finder *and* an "isNoteInScale" method.

*scale* - An instance of `Scale` which is the context of the degree measuring

#### Note#toString([dontShow])
 - Usability function for returning the note as a string

*dontShow* - If set to `true` the octave will not be included in the returned string.

## Chord(root, chord)
 - A chord class with a lot of functionality to alter and analyze the chord.

*root* - A `Note` instance which is to be the root of the chord

*chord* - A string containing the chord symbol. This can be anything from
simple chords, to super-advanced jazz chords thanks to the detailed and
robust chord parser engine. Example values:
`'m'`, `'m7'`, `'#5b9'`, `'9sus4` and `'#11b5#9'`

### teoria.chord(name || note[, octave || symbol])
 - A simple function for getting the notes, no matter the octave, in a chord

*name* - A string containing the full chord symbol, with note name. Examples:
`'Ab7'`, `'F#(#11b5)'`

*note* - Instead of supplying a string containing the full chord symbol,
one can pass a `Note` object instead. The note will be considered root in
the new chord object

*octave* - If the first argument of the function is a chord name (`typeof "string"`),
then the second argument is an optional octave number (`typeof "number"`) of the root.

*symbol* - A string containing the chord symbol (excluding the note name)

#### Chord.name
 - Holds the full chord symbol, inclusive the root name.

#### Chord.root
 - Holds the `Note` that is the root of the chord.

#### Chord#notes()
 - Returns an array of `Note`s that the chord consists of.

#### Chord#simple()
 - Returns an `Array` of only the notes' names, not the full `Note` objects.

#### Chord#bass()
 - Returns the bass note of the chord (The note voiced the lowest)

#### Chord#voicing([voicing])
 - Works both as a setter and getter. If no parameter is supplied the
 current voicing is returned as an array of `Interval`s

*voicing* - An optional array of intervals in simple-format
that represents the current voicing of the chord.

Here's an example:
```javascript
var bbmaj = teoria.chord('Bbmaj7');
// Default voicing:
bbmaj.voicing();  // #-> ['P1', 'M3', 'P5', 'M7'];
bbmaj.notes();    // #-> ['bb', 'd', 'f', 'a'];

// New voicing
bbmaj.voicing(['P1', 'P5', 'M7', 'M10']);
bbmaj.notes();    // #-> ['bb', 'f', 'a', 'd'];
```
*NB:* Note that above returned results are pseudo-results, as they will be
returned wrapped in `Interval` and `Note` objects.

#### Chord#quality()
 - Returns a string which holds the quality of the chord, `'major'`, `'minor'`,
 `'augmented'`, `'diminished'`, `'half-diminished'`, `'dominant'` or `undefined`

#### Chord#get(interval)
 - Returns the note at a given interval in the chord, if it exists.

*interval* - A string name of an interval, for example `'third'`, `'fifth'`, `'ninth'`.

#### Chord#dominant([additional])
 - Returns the naΓ―vely chosen dominant which is a perfect fifth away.

*additional* - Additional chord extension, for example: `'b9'` or `'#5'`

#### Chord#subdominant([additional])
 - Returns the naΓ―vely chosen subdominant which is a perfect fourth away.

*additional* - Like the dominant's.

#### Chord#parallel([additional])
 - Returns the parallel chord for major and minor triads

*additional* - Like the dominant's

#### Chord#chordType()
 - Returns the type of the chord: `'dyad'`, `'triad'`, `'trichord'`,
 `'tetrad'` or `'unknown'`.

#### Chord#interval(interval)
 - Returns the same chord, a `interval` away

#### Chord#transpose(interval)
 - Like the `#interval` method, except it's `this` chord that gets changed instead of
 returning a new chord.

#### Chord#toString()
 - Simple usability function which is an alias for Chord.name


## Scale(tonic, scale)
 - The teoria representation of a scale, with a given tonic.

*tonic* - A `Note` which is to be the tonic of the scale

*scale* - Can either be a name of a scale (string), or an array of
absolute intervals that defines the scale. The scales supported by default are:

 - major
 - minor
 - ionian (Alias for major)
 - dorian
 - phrygian
 - lydian
 - mixolydian
 - aeolian (Alias for minor)
 - locrian
 - majorpentatonic
 - minorpentatonic
 - chromatic
 - harmonicchromatic (Alias for chromatic)
 - blues
 - doubleharmonic
 - flamenco
 - harmonicminor
 - melodicminor
 - wholetone

### teoria.scale(tonic, scale)
 - Sugar function for constructing a new `Scale` object

#### teoria.Scale.KNOWN_SCALES
 - An array of all the scale ID's that comes with teoria

#### Scale.name
 - The name of the scale (if available). Type `string` or `undefined`

#### Scale.tonic
 - The `Note` which is the scale's tonic

#### Scale#notes()
 - Returns an array of `Note`s which is the scale's notes

#### Scale#simple()
 - Returns an `Array` of only the notes' names, not the full `Note` objects.

#### Scale#type()
 - Returns the type of the scale, depending on the number of notes.
 A scale of length x gives y:
  - 2 gives 'ditonic'
  - 3 gives 'tritonic'
  - 4 gives 'tetratonic'
  - 5 gives 'pentatonic'
  - 6 gives 'hexatonic',
  - 7 gives 'heptatonic',
  - 8 gives 'octatonic'

#### Scale#get(index)
 - Returns the note at the given scale index

*index* - Can be a number referring to the scale step, or the name (string) of the
scale step. E.g. 'first', 'second', 'fourth', 'seventh'.

#### Scale#solfege(index, showOctaves)
 - Returns the solfege name of the given scale step

*index* Same as `Scale#get`

*showOctaves* - A boolean meaning the same as `showOctaves` in `Note#solfege`


## teoria.interval(from, to)
 - A sugar function for the `#from` and `#between` methods of the same namespace and
 for creating `Interval` objects.

#### teoria.interval(`string`: from)
 - A sugar method for the `Interval.toCoord` function

#### teoria.interval(`Note`: from, `string`: to)
 - A sugar method for the `Interval.from` function

#### teoria.interval(`Note`: from, `Interval`: to)
 - Like above, but with a `Interval` instead of a string representation of
 the interval

#### teoria.interval(`Note`: from, `Note`: to)
 - A sugar method for the `Interval.between` function

##### teoria.interval.from -> Interval.from
##### teoria.interval.between -> Interval.between
##### teoria.interval.invert -> Interval.invert
##### teoria.interval.toCoord -> Interval.toCoord


## Interval(coord)
 - A representation of a music interval

### Interval.toCoord(simpleInterval)
 - Returns a `Interval` representing the interval expressed in string form.

### Interval.from(from, to)
 - Returns a note which is a given interval away from a root note.

*from* - The `Note` which is the root of the measuring

*to* - A `Interval`

### Interval.between(from, to)
 - Returns an interval object which represents the interval between two notes.

*from* and *to* are two `Note`s which are the notes that the
interval is measured from. For example if 'a' and 'c' are given, the resulting
interval object would represent a minor third.

```javascript
Interval.between(teoria.note("a"), teoria.note("c'")) -> teoria.interval('m3')
```

### Interval.invert(simpleInterval)
 - Returns the inversion of the interval provided

*simpleInterval* - An interval represented in simple string form. Examples:

 - 'm3' = minor third
 - 'P4' = perfect fourth
 - 'A4' = augmented fifth
 - 'd7' = diminished seventh
 - 'M6' = major sixth.

`'m' = minor`, `'M' = major`, `'A' = augmented` and
`'d' = diminished`

The number may be prefixed with a `-` to signify that its direction is down. E.g.:

`m-3` means a descending minor third, and `P-5` means a descending perfect fifth.

#### Interval.coord
 - The interval representation of the interval

#### Interval.number()
 - The interval number (A ninth = 9, A seventh = 7, fifteenth = 15)

#### Interval.value()
 - The value of the interval - That is a ninth = 9, but a downwards ninth is = -9

#### Interval.toString()
 - Returns the *simpleInterval* representation of the interval. E.g. `'P5'`,
 `'M3'`, `'A9'`, etc.

#### Interval.base()
 - Returns the name of the simple interval (not compound)

#### Interval.type()
 - Returns the type of array, either `'perfect'` (1, 4, 5, 8) or `'minor'` (2, 3, 6, 7)

#### Interval.quality([verbose])
 - The quality of the interval (`'dd'`, `'d'` `'m'`, `'P'`, `'M'`, `'A'` or `'AA'`)

*verbose*  is set to a truish value, then long quality names are returned:
 `'doubly diminished'`, `'diminished'`, `'minor'`, etc.

#### Interval.direction([dir])
 - The direction of the interval

*dir* - If supplied, then the interval's direction is to the `newDirection`
which is either `'up'` or `'down'`

#### Interval#semitones()
 - Returns the `number` of semitones the interval span.

#### Interval#simple([ignoreDirection])
 - Returns the simple part of the interval as a Interval. Example:

*ignoreDirection* - An optional boolean that, if set to `true`, returns the
"direction-agnostic" interval. That is the interval with a positive number.

```javascript
teoria.interval('M17').simple();    // #-> 'M3'
teoria.interval('m23').simple();    // #-> 'm2'
teoria.interval('P5').simple();     // #-> 'P5'
teoria.interval('P-4').simple();    // #-> 'P-4'

// With ignoreDirection = true
teoria.interval('M3').simple(true);     // #->'M3'
teoria.interval('m-10').simple(true);   // #-> 'm3'
```

*NB:* Note that above returned results are pseudo-results, as they will be
returned wrapped in `Interval` objects.

#### Interval#octaves()
 - Returns the number of compound intervals

#### Interval#isCompound()
 - Returns a boolean value, showing if the interval is a compound interval

#### Interval#add(interval)
 - Adds the `interval` to this interval, and returns a `Interval`
 representing the result of the addition

#### Interval#equal(interval)
 - Returns true if the supplied `interval` is equal to this interval

#### Interval#greater(interval)
 - Returns true if the supplied `interval` is greater than this interval

#### Interval#smaller(interval)
 - Returns true if the supplied `interval` is smaller than this interval

#### Interval#invert()
 - Returns the inverted interval as a `Interval`

#### Interval#qualityValue() - *internal*
 - Returns the relative to default, value of the quality.
 E.g. a teoria.interval('M6'), will have a relative quality value of 1, as all the
 intervals defaults to minor and perfect respectively.

Added public/teoria-master/index.js.

































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
var Note = require('./lib/note');
var Interval = require('./lib/interval');
var Chord = require('./lib/chord');
var Scale = require('./lib/scale');

var teoria;

// never thought I would write this, but: Legacy support
function intervalConstructor(from, to) {
  // Construct a Interval object from string representation
  if (typeof from === 'string')
    return Interval.toCoord(from);

  if (typeof to === 'string' && from instanceof Note)
    return Interval.from(from, Interval.toCoord(to));

  if (to instanceof Interval && from instanceof Note)
    return Interval.from(from, to);

  if (to instanceof Note && from instanceof Note)
    return Interval.between(from, to);

  throw new Error('Invalid parameters');
}

intervalConstructor.toCoord = Interval.toCoord;
intervalConstructor.from = Interval.from;
intervalConstructor.between = Interval.between;
intervalConstructor.invert = Interval.invert;

function noteConstructor(name, duration) {
  if (typeof name === 'string')
    return Note.fromString(name, duration);
  else
    return new Note(name, duration);
}

noteConstructor.fromString = Note.fromString;
noteConstructor.fromKey = Note.fromKey;
noteConstructor.fromFrequency = Note.fromFrequency;
noteConstructor.fromMIDI = Note.fromMIDI;

function chordConstructor(name, symbol) {
  if (typeof name === 'string') {
    var root, octave;
    root = name.match(/^([a-h])(x|#|bb|b?)/i);
    if (root && root[0]) {
      octave = typeof symbol === 'number' ? symbol.toString(10) : '4';
      return new Chord(Note.fromString(root[0].toLowerCase() + octave),
                            name.substr(root[0].length));
    }
  } else if (name instanceof Note)
    return new Chord(name, symbol);

  throw new Error('Invalid Chord. Couldn\'t find note name');
}

function scaleConstructor(tonic, scale) {
  tonic = (tonic instanceof Note) ? tonic : teoria.note(tonic);
  return new Scale(tonic, scale);
}

teoria = {
  note: noteConstructor,

  chord: chordConstructor,

  interval: intervalConstructor,

  scale: scaleConstructor,

  Note: Note,
  Chord: Chord,
  Scale: Scale,
  Interval: Interval
};


require('./lib/sugar')(teoria);
exports = module.exports = teoria;

Added public/teoria-master/lib/chord.js.



































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
var daccord = require('daccord');
var knowledge = require('./knowledge');
var Note = require('./note');
var Interval = require('./interval');

function Chord(root, name) {
  if (!(this instanceof Chord)) return new Chord(root, name);
  name = name || '';
  this.name = root.name().toUpperCase() + root.accidental() + name;
  this.symbol = name;
  this.root = root;
  this.intervals = [];
  this._voicing = [];

  var bass = name.split('/');
  if (bass.length === 2 && bass[1].trim() !== '9') {
    name = bass[0];
    bass = bass[1].trim();
  } else {
    bass = null;
  }

  this.intervals = daccord(name).map(Interval.toCoord);
  this._voicing = this.intervals.slice();

  if (bass) {
    var intervals = this.intervals, bassInterval, note;
    // Make sure the bass is atop of the root note
    note = Note.fromString(bass + (root.octave() + 1)); // crude

    bassInterval = Interval.between(root, note);
    bass = bassInterval.simple();
    bassInterval = bassInterval.invert().direction('down');

    this._voicing = [bassInterval];
    for (var i = 0, length = intervals.length;  i < length; i++) {
      if (!intervals[i].simple().equal(bass))
        this._voicing.push(intervals[i]);
    }
  }
}

Chord.prototype = {
  notes: function() {
    var root = this.root;
    return this.voicing().map(function(interval) {
      return root.interval(interval);
    });
  },

  simple: function() {
    return this.notes().map(function(n) { return n.toString(true); });
  },

  bass: function() {
    return this.root.interval(this._voicing[0]);
  },

  voicing: function(voicing) {
    // Get the voicing
    if (!voicing) {
      return this._voicing;
    }

    // Set the voicing
    this._voicing = [];
    for (var i = 0, length = voicing.length; i < length; i++) {
      this._voicing[i] = Interval.toCoord(voicing[i]);
    }

    return this;
  },

  resetVoicing: function() {
    this._voicing = this.intervals;
  },

  dominant: function(additional) {
    additional = additional || '';
    return new Chord(this.root.interval('P5'), additional);
  },

  subdominant: function(additional) {
    additional = additional || '';
    return new Chord(this.root.interval('P4'), additional);
  },

  parallel: function(additional) {
    additional = additional || '';
    var quality = this.quality();

    if (this.chordType() !== 'triad' || quality === 'diminished' ||
        quality === 'augmented') {
      throw new Error('Only major/minor triads have parallel chords');
    }

    if (quality === 'major') {
      return new Chord(this.root.interval('m3', 'down'), 'm');
    } else {
      return new Chord(this.root.interval('m3', 'up'));
    }
  },

  quality: function() {
    var third, fifth, seventh, intervals = this.intervals;

    for (var i = 0, length = intervals.length; i < length; i++) {
      if (intervals[i].number() === 3) {
        third = intervals[i];
      } else if (intervals[i].number() === 5) {
        fifth = intervals[i];
      } else if (intervals[i].number() === 7) {
        seventh = intervals[i];
      }
    }

    if (!third) {
      return;
    }

    third = (third.direction() === 'down') ? third.invert() : third;
    third = third.simple().toString();

    if (fifth) {
      fifth = (fifth.direction === 'down') ? fifth.invert() : fifth;
      fifth = fifth.simple().toString();
    }

    if (seventh) {
      seventh = (seventh.direction === 'down') ? seventh.invert() : seventh;
      seventh = seventh.simple().toString();
    }

    if (third === 'M3') {
      if (fifth === 'A5') {
        return 'augmented';
      } else if (fifth === 'P5') {
        return (seventh === 'm7') ? 'dominant' : 'major';
      }

      return 'major';
    } else if (third === 'm3') {
      if (fifth === 'P5') {
        return 'minor';
      } else if (fifth === 'd5') {
        return (seventh === 'm7') ? 'half-diminished' : 'diminished';
      }

      return 'minor';
    }
  },

  chordType: function() { // In need of better name
    var length = this.intervals.length, interval, has, invert, i, name;

    if (length === 2) {
      return 'dyad';
    } else if (length === 3) {
      has = {unison: false, third: false, fifth: false};
      for (i = 0; i < length; i++) {
        interval = this.intervals[i];
        invert = interval.invert();
        if (interval.base() in has) {
          has[interval.base()] = true;
        } else if (invert.base() in has) {
          has[invert.base()] = true;
        }
      }

      name = (has.unison && has.third && has.fifth) ? 'triad' : 'trichord';
    } else if (length === 4) {
      has = {unison: false, third: false, fifth: false, seventh: false};
      for (i = 0; i < length; i++) {
        interval = this.intervals[i];
        invert = interval.invert();
        if (interval.base() in has) {
          has[interval.base()] = true;
        } else if (invert.base() in has) {
          has[invert.base()] = true;
        }
      }

      if (has.unison && has.third && has.fifth && has.seventh) {
        name = 'tetrad';
      }
    }

    return name || 'unknown';
  },

  get: function(interval) {
    if (typeof interval === 'string' && interval in knowledge.stepNumber) {
      var intervals = this.intervals, i, length;

      interval = knowledge.stepNumber[interval];
      for (i = 0, length = intervals.length; i < length; i++) {
        if (intervals[i].number() === interval) {
          return this.root.interval(intervals[i]);
        }
      }

      return null;
    } else {
      throw new Error('Invalid interval name');
    }
  },

  interval: function(interval) {
    return new Chord(this.root.interval(interval), this.symbol);
  },

  transpose: function(interval) {
    this.root.transpose(interval);
    this.name = this.root.name().toUpperCase() +
                this.root.accidental() + this.symbol;

    return this;
  },

  toString: function() {
    return this.name;
  }
};

module.exports = Chord;

Added public/teoria-master/lib/interval.js.























































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
var knowledge = require('./knowledge');
var vector = require('./vector');
var toCoord = require('interval-coords');

function Interval(coord) {
  if (!(this instanceof Interval)) return new Interval(coord);
  this.coord = coord;
}

Interval.prototype = {
  name: function() {
    return knowledge.intervalsIndex[this.number() - 1];
  },

  semitones: function() {
    return vector.sum(vector.mul(this.coord, [12, 7]));
  },

  number: function() {
    return Math.abs(this.value());
  },

  value: function() {
    var toMultiply = Math.floor((this.coord[1] - 2) / 7) + 1;
    var product = vector.mul(knowledge.sharp, toMultiply);
    var without = vector.sub(this.coord, product);
    var i = knowledge.intervalFromFifth[without[1] + 5];
    var diff = without[0] - knowledge.intervals[i][0];
    var val = knowledge.stepNumber[i] + diff * 7;

    return (val > 0) ? val : val - 2;
  },

  type: function() {
    return knowledge.intervals[this.base()][0] <= 1 ? 'perfect' : 'minor';
  },

  base: function() {
    var product = vector.mul(knowledge.sharp, this.qualityValue());
    var fifth = vector.sub(this.coord, product)[1];
    fifth = this.value() > 0 ? fifth + 5 : -(fifth - 5) % 7;
    fifth = fifth < 0 ? knowledge.intervalFromFifth.length + fifth : fifth;

    var name = knowledge.intervalFromFifth[fifth];
    if (name === 'unison' && this.number() >= 8)
      name = 'octave';

    return name;
  },

  direction: function(dir) {
    if (dir) {
      var is = this.value() >= 1 ? 'up' : 'down';
      if (is !== dir)
        this.coord = vector.mul(this.coord, -1);

      return this;
    }
    else
      return this.value() >= 1 ? 'up' : 'down';
  },

  simple: function(ignore) {
    // Get the (upwards) base interval (with quality)
    var simple = knowledge.intervals[this.base()];
    var toAdd = vector.mul(knowledge.sharp, this.qualityValue());
    simple = vector.add(simple, toAdd);

    // Turn it around if necessary
    if (!ignore)
      simple = this.direction() === 'down' ? vector.mul(simple, -1) : simple;

    return new Interval(simple);
  },

  isCompound: function() {
    return this.number() > 8;
  },

  octaves: function() {
    var toSubtract, without, octaves;

    if (this.direction() === 'up') {
      toSubtract = vector.mul(knowledge.sharp, this.qualityValue());
      without = vector.sub(this.coord, toSubtract);
      octaves = without[0] - knowledge.intervals[this.base()][0];
    } else {
      toSubtract = vector.mul(knowledge.sharp, -this.qualityValue());
      without = vector.sub(this.coord, toSubtract);
      octaves = -(without[0] + knowledge.intervals[this.base()][0]);
    }

    return octaves;
  },

  invert: function() {
    var i = this.base();
    var qual = this.qualityValue();
    var acc = this.type() === 'minor' ? -(qual - 1) : -qual;
    var idx = 9 - knowledge.stepNumber[i] - 1;
    var coord = knowledge.intervals[knowledge.intervalsIndex[idx]];
    coord = vector.add(coord, vector.mul(knowledge.sharp, acc));

    return new Interval(coord);
  },

  quality: function(lng) {
    var quality = knowledge.alterations[this.type()][this.qualityValue() + 2];

    return lng ? knowledge.qualityLong[quality] : quality;
  },

  qualityValue: function() {
    if (this.direction() === 'down')
      return Math.floor((-this.coord[1] - 2) / 7) + 1;
    else
      return Math.floor((this.coord[1] - 2) / 7) + 1;
  },

  equal: function(interval) {
      return this.coord[0] === interval.coord[0] &&
          this.coord[1] === interval.coord[1];
  },

  greater: function(interval) {
    var semi = this.semitones();
    var isemi = interval.semitones();

    // If equal in absolute size, measure which interval is bigger
    // For example P4 is bigger than A3
    return (semi === isemi) ?
      (this.number() > interval.number()) : (semi > isemi);
  },

  smaller: function(interval) {
    return !this.equal(interval) && !this.greater(interval);
  },

  add: function(interval) {
    return new Interval(vector.add(this.coord, interval.coord));
  },

  toString: function(ignore) {
    // If given true, return the positive value
    var number = ignore ? this.number() : this.value();

    return this.quality() + number;
  }
};

Interval.toCoord = function(simple) {
  var coord = toCoord(simple);
  if (!coord)
    throw new Error('Invalid simple format interval');

  return new Interval(coord);
};

Interval.from = function(from, to) {
  return from.interval(to);
};

Interval.between = function(from, to) {
  return new Interval(vector.sub(to.coord, from.coord));
};

Interval.invert = function(sInterval) {
  return Interval.toCoord(sInterval).invert().toString();
};

module.exports = Interval;

Added public/teoria-master/lib/knowledge.js.





































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// Note coordinates [octave, fifth] relative to C
module.exports = {
  notes: {
    c: [0, 0],
    d: [-1, 2],
    e: [-2, 4],
    f: [1, -1],
    g: [0, 1],
    a: [-1, 3],
    b: [-2, 5],
    h: [-2, 5]
  },

  intervals: {
    unison: [0, 0],
    second: [3, -5],
    third: [2, -3],
    fourth: [1, -1],
    fifth: [0, 1],
    sixth: [3, -4],
    seventh: [2, -2],
    octave: [1, 0]
  },

  intervalFromFifth: ['second', 'sixth', 'third', 'seventh', 'fourth',
                         'unison', 'fifth'],

  intervalsIndex: ['unison', 'second', 'third', 'fourth', 'fifth',
                      'sixth', 'seventh', 'octave', 'ninth', 'tenth',
                      'eleventh', 'twelfth', 'thirteenth', 'fourteenth',
                      'fifteenth'],

// linear index to fifth = (2 * index + 1) % 7
  fifths: ['f', 'c', 'g', 'd', 'a', 'e', 'b'],
  accidentals: ['bb', 'b', '', '#', 'x'],

  sharp: [-4, 7],
  A4: [3, 3],

  durations: {
    '0.25': 'longa',
    '0.5': 'breve',
    '1': 'whole',
    '2': 'half',
    '4': 'quarter',
    '8': 'eighth',
    '16': 'sixteenth',
    '32': 'thirty-second',
    '64': 'sixty-fourth',
    '128': 'hundred-twenty-eighth'
  },

  qualityLong: {
    P: 'perfect',
    M: 'major',
    m: 'minor',
    A: 'augmented',
    AA: 'doubly augmented',
    d: 'diminished',
    dd: 'doubly diminished'
  },

  alterations: {
    perfect: ['dd', 'd', 'P', 'A', 'AA'],
    minor: ['dd', 'd', 'm', 'M', 'A', 'AA']
  },

  symbols: {
    'min': ['m3', 'P5'],
    'm': ['m3', 'P5'],
    '-': ['m3', 'P5'],

    'M': ['M3', 'P5'],
    '': ['M3', 'P5'],

    '+': ['M3', 'A5'],
    'aug': ['M3', 'A5'],

    'dim': ['m3', 'd5'],
    'o': ['m3', 'd5'],

    'maj': ['M3', 'P5', 'M7'],
    'dom': ['M3', 'P5', 'm7'],
    'ΓΈ': ['m3', 'd5', 'm7'],

    '5': ['P5']
  },

  chordShort: {
    'major': 'M',
    'minor': 'm',
    'augmented': 'aug',
    'diminished': 'dim',
    'half-diminished': '7b5',
    'power': '5',
    'dominant': '7'
  },

  stepNumber: {
    'unison': 1,
    'first': 1,
    'second': 2,
    'third': 3,
    'fourth': 4,
    'fifth': 5,
    'sixth': 6,
    'seventh': 7,
    'octave': 8,
    'ninth': 9,
    'eleventh': 11,
    'thirteenth': 13
  },

  // Adjusted Shearer syllables - Chromatic solfege system
  // Some intervals are not provided for. These include:
  // dd2 - Doubly diminished second
  // dd3 - Doubly diminished third
  // AA3 - Doubly augmented third
  // dd6 - Doubly diminished sixth
  // dd7 - Doubly diminished seventh
  // AA7 - Doubly augmented seventh
  intervalSolfege: {
    'dd1': 'daw',
    'd1': 'de',
    'P1': 'do',
    'A1': 'di',
    'AA1': 'dai',
    'd2': 'raw',
    'm2': 'ra',
    'M2': 're',
    'A2': 'ri',
    'AA2': 'rai',
    'd3': 'maw',
    'm3': 'me',
    'M3': 'mi',
    'A3': 'mai',
    'dd4': 'faw',
    'd4': 'fe',
    'P4': 'fa',
    'A4': 'fi',
    'AA4': 'fai',
    'dd5': 'saw',
    'd5': 'se',
    'P5': 'so',
    'A5': 'si',
    'AA5': 'sai',
    'd6': 'law',
    'm6': 'le',
    'M6': 'la',
    'A6': 'li',
    'AA6': 'lai',
    'd7': 'taw',
    'm7': 'te',
    'M7': 'ti',
    'A7': 'tai',
    'dd8': 'daw',
    'd8': 'de',
    'P8': 'do',
    'A8': 'di',
    'AA8': 'dai'
  }
};

Added public/teoria-master/lib/note.js.





































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
var scientific = require('scientific-notation');
var helmholtz = require('helmholtz');
var pitchFq = require('pitch-fq');
var knowledge = require('./knowledge');
var vector = require('./vector');
var Interval = require('./interval');

function pad(str, ch, len) {
  for (; len > 0; len--) {
    str += ch;
  }

  return str;
}


function Note(coord, duration) {
  if (!(this instanceof Note)) return new Note(coord, duration);
  duration = duration || {};

  this.duration = { value: duration.value || 4, dots: duration.dots || 0 };
  this.coord = coord;
}

Note.prototype = {
  octave: function() {
    return this.coord[0] + knowledge.A4[0] - knowledge.notes[this.name()][0] +
      this.accidentalValue() * 4;
  },

  name: function() {
    var value = this.accidentalValue();
    var idx = this.coord[1] + knowledge.A4[1] - value * 7 + 1;
    return knowledge.fifths[idx];
  },

  accidentalValue: function() {
    return Math.round((this.coord[1] + knowledge.A4[1] - 2) / 7);
  },

  accidental: function() {
    return knowledge.accidentals[this.accidentalValue() + 2];
  },

  /**
   * Returns the key number of the note
   */
  key: function(white) {
    if (white)
      return this.coord[0] * 7 + this.coord[1] * 4 + 29;
    else
      return this.coord[0] * 12 + this.coord[1] * 7 + 49;
  },

  /**
  * Returns a number ranging from 0-127 representing a MIDI note value
  */
  midi: function() {
    return this.key() + 20;
  },

  /**
   * Calculates and returns the frequency of the note.
   * Optional concert pitch (def. 440)
   */
  fq: function(concertPitch) {
    return pitchFq(this.coord, concertPitch);
  },

  /**
   * Returns the pitch class index (chroma) of the note
   */
  chroma: function() {
    var value = (vector.sum(vector.mul(this.coord, [12, 7])) - 3) % 12;

    return (value < 0) ? value + 12 : value;
  },

  interval: function(interval) {
    if (typeof interval === 'string') interval = Interval.toCoord(interval);

    if (interval instanceof Interval)
      return new Note(vector.add(this.coord, interval.coord), this.duration);
    else if (interval instanceof Note)
      return new Interval(vector.sub(interval.coord, this.coord));
  },

  transpose: function(interval) {
    this.coord = vector.add(this.coord, interval.coord);
    return this;
  },

  /**
   * Returns the Helmholtz notation form of the note (fx C,, d' F# g#'')
   */
  helmholtz: function() {
    var octave = this.octave();
    var name = this.name();
    name = octave < 3 ? name.toUpperCase() : name.toLowerCase();
    var padchar = octave < 3 ? ',' : '\'';
    var padcount = octave < 2 ? 2 - octave : octave - 3;

    return pad(name + this.accidental(), padchar, padcount);
  },

  /**
   * Returns the scientific notation form of the note (fx E4, Bb3, C#7 etc.)
   */
  scientific: function() {
    return this.name().toUpperCase() + this.accidental() + this.octave();
  },

  /**
   * Returns notes that are enharmonic with this note.
   */
  enharmonics: function(oneaccidental) {
    var key = this.key(), limit = oneaccidental ? 2 : 3;

    return ['m3', 'm2', 'm-2', 'm-3']
      .map(this.interval.bind(this))
      .filter(function(note) {
      var acc = note.accidentalValue();
      var diff = key - (note.key() - acc);

      if (diff < limit && diff > -limit) {
        var product = vector.mul(knowledge.sharp, diff - acc);
        note.coord = vector.add(note.coord, product);
        return true;
      }
    });
  },

  solfege: function(scale, showOctaves) {
    var interval = scale.tonic.interval(this), solfege, stroke, count;
    if (interval.direction() === 'down')
      interval = interval.invert();

    if (showOctaves) {
      count = (this.key(true) - scale.tonic.key(true)) / 7;
      count = (count >= 0) ? Math.floor(count) : -(Math.ceil(-count));
      stroke = (count >= 0) ? '\'' : ',';
    }

    solfege = knowledge.intervalSolfege[interval.simple(true).toString()];
    return (showOctaves) ? pad(solfege, stroke, Math.abs(count)) : solfege;
  },

  scaleDegree: function(scale) {
    var inter = scale.tonic.interval(this);

    // If the direction is down, or we're dealing with an octave - invert it
    if (inter.direction() === 'down' ||
       (inter.coord[1] === 0 && inter.coord[0] !== 0)) {
      inter = inter.invert();
    }

    inter = inter.simple(true).coord;

    return scale.scale.reduce(function(index, current, i) {
      var coord = Interval.toCoord(current).coord;
      return coord[0] === inter[0] && coord[1] === inter[1] ? i + 1 : index;
    }, 0);
  },

  /**
   * Returns the name of the duration value,
   * such as 'whole', 'quarter', 'sixteenth' etc.
   */
  durationName: function() {
    return knowledge.durations[this.duration.value];
  },

  /**
   * Returns the duration of the note (including dots)
   * in seconds. The first argument is the tempo in beats
   * per minute, the second is the beat unit (i.e. the
   * lower numeral in a time signature).
   */
  durationInSeconds: function(bpm, beatUnit) {
    var secs = (60 / bpm) / (this.duration.value / 4) / (beatUnit / 4);
    return secs * 2 - secs / Math.pow(2, this.duration.dots);
  },

  /**
   * Returns the name of the note, with an optional display of octave number
   */
  toString: function(dont) {
    return this.name() + this.accidental() + (dont ? '' : this.octave());
  }
};

Note.fromString = function(name, dur) {
  var coord = scientific(name);
  if (!coord) coord = helmholtz(name);
  return new Note(coord, dur);
};

Note.fromKey = function(key) {
  var octave = Math.floor((key - 4) / 12);
  var distance = key - (octave * 12) - 4;
  var name = knowledge.fifths[(2 * Math.round(distance / 2) + 1) % 7];
  var subDiff = vector.sub(knowledge.notes[name], knowledge.A4);
  var note = vector.add(subDiff, [octave + 1, 0]);
  var diff = (key - 49) - vector.sum(vector.mul(note, [12, 7]));

  var arg = diff ? vector.add(note, vector.mul(knowledge.sharp, diff)) : note;
  return new Note(arg);
};

Note.fromFrequency = function(fq, concertPitch) {
  var key, cents, originalFq;
  concertPitch = concertPitch || 440;

  key = 49 + 12 * ((Math.log(fq) - Math.log(concertPitch)) / Math.log(2));
  key = Math.round(key);
  originalFq = concertPitch * Math.pow(2, (key - 49) / 12);
  cents = 1200 * (Math.log(fq / originalFq) / Math.log(2));

  return { note: Note.fromKey(key), cents: cents };
};

Note.fromMIDI = function(note) {
  return Note.fromKey(note - 20);
};

module.exports = Note;

Added public/teoria-master/lib/scale.js.



























































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
var knowledge = require('./knowledge');
var Interval = require('./interval');

var scales = {
  aeolian: ['P1', 'M2', 'm3', 'P4', 'P5', 'm6', 'm7'],
  blues: ['P1', 'm3', 'P4', 'd5', 'P5', 'm7'],
  chromatic: ['P1', 'm2', 'M2', 'm3', 'M3', 'P4',
    'A4', 'P5', 'm6', 'M6', 'm7', 'M7'],
  dorian: ['P1', 'M2', 'm3', 'P4', 'P5', 'M6', 'm7'],
  doubleharmonic: ['P1', 'm2', 'M3', 'P4', 'P5', 'm6', 'M7'],
  harmonicminor: ['P1', 'M2', 'm3', 'P4', 'P5', 'm6', 'M7'],
  ionian: ['P1', 'M2', 'M3', 'P4', 'P5', 'M6', 'M7'],
  locrian: ['P1', 'm2', 'm3', 'P4', 'd5', 'm6', 'm7'],
  lydian: ['P1', 'M2', 'M3', 'A4', 'P5', 'M6', 'M7'],
  majorpentatonic: ['P1', 'M2', 'M3', 'P5', 'M6'],
  melodicminor: ['P1', 'M2', 'm3', 'P4', 'P5', 'M6', 'M7'],
  minorpentatonic: ['P1', 'm3', 'P4', 'P5', 'm7'],
  mixolydian: ['P1', 'M2', 'M3', 'P4', 'P5', 'M6', 'm7'],
  phrygian: ['P1', 'm2', 'm3', 'P4', 'P5', 'm6', 'm7'],
  wholetone: ['P1', 'M2', 'M3', 'A4', 'A5', 'A6']
};

// synonyms
scales.harmonicchromatic = scales.chromatic;
scales.minor = scales.aeolian;
scales.major = scales.ionian;
scales.flamenco = scales.doubleharmonic;

function Scale(tonic, scale) {
  if (!(this instanceof Scale)) return new Scale(tonic, scale);
  var scaleName, i;
  if (!('coord' in tonic)) {
    throw new Error('Invalid Tonic');
  }

  if (typeof scale === 'string') {
    scaleName = scale;
    scale = scales[scale];
    if (!scale)
      throw new Error('Invalid Scale');
  } else {
    for (i in scales) {
      if (scales.hasOwnProperty(i)) {
        if (scales[i].toString() === scale.toString()) {
          scaleName = i;
          break;
        }
      }
    }
  }

  this.name = scaleName;
  this.tonic = tonic;
  this.scale = scale;
}

Scale.prototype = {
  notes: function() {
    var notes = [];

    for (var i = 0, length = this.scale.length; i < length; i++) {
      notes.push(this.tonic.interval(this.scale[i]));
    }

    return notes;
  },

  simple: function() {
    return this.notes().map(function(n) { return n.toString(true); });
  },

  type: function() {
    var length = this.scale.length - 2;
    if (length < 8) {
      return ['di', 'tri', 'tetra', 'penta', 'hexa', 'hepta', 'octa'][length] +
        'tonic';
    }
  },

  get: function(i) {
    var isStepStr = typeof i === 'string' && i in knowledge.stepNumber;
    i = isStepStr ? knowledge.stepNumber[i] : i;
    var len = this.scale.length;
    var interval, octaves;

    if (i < 0) {
      interval = this.scale[i % len + len - 1];
      octaves = Math.floor((i - 1) / len);
    } else if (i % len === 0) {
      interval = this.scale[len - 1];
      octaves = (i / len) - 1;
    } else {
      interval = this.scale[i % len - 1];
      octaves = Math.floor(i / len);
    }

    return this.tonic.interval(interval).interval(new Interval([octaves, 0]));
  },

  solfege: function(index, showOctaves) {
    if (index)
      return this.get(index).solfege(this, showOctaves);

    return this.notes().map(function(n) {
      return n.solfege(this, showOctaves);
    });
  },

  interval: function(interval) {
    interval = (typeof interval === 'string') ?
      Interval.toCoord(interval) : interval;
    return new Scale(this.tonic.interval(interval), this.scale);
  },

  transpose: function(interval) {
    var scale = this.interval(interval);
    this.scale = scale.scale;
    this.tonic = scale.tonic;

    return this;
  }
};
Scale.KNOWN_SCALES = Object.keys(scales);

module.exports = Scale;

Added public/teoria-master/lib/sugar.js.





































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var knowledge = require('./knowledge');

module.exports = function(teoria) {
  var Note = teoria.Note;
  var Chord = teoria.Chord;
  var Scale = teoria.Scale;

  Note.prototype.chord = function(chord) {
    var isShortChord = chord in knowledge.chordShort;
    chord = isShortChord ? knowledge.chordShort[chord] : chord;

    return new Chord(this, chord);
  };

  Note.prototype.scale = function(scale) {
    return new Scale(this, scale);
  };
};

Added public/teoria-master/lib/vector.js.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module.exports = {
  add: function(note, interval) {
    return [note[0] + interval[0], note[1] + interval[1]];
  },

  sub: function(note, interval) {
    return [note[0] - interval[0], note[1] - interval[1]];
  },

  mul: function(note, interval) {
    if (typeof interval === 'number')
      return [note[0] * interval, note[1] * interval];
    else
      return [note[0] * interval[0], note[1] * interval[1]];
  },

  sum: function(coord) {
    return coord[0] + coord[1];
  }
};

Added public/teoria-master/package.json.



















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
  "name": "teoria",
  "version": "2.5.0",
  "description": "Music theory for JavaScript",
  "homepage": "http://saebekassebil.github.com/teoria",
  "keywords": [
    "music",
    "theory",
    "jazz",
    "classical",
    "chord"
  ],
  "main": "./index.js",
  "author": {
    "name": "Jakob Miland <saebekassebil>",
    "email": "saebekassebil@gmail.com",
    "url": "https://github.com/saebekassebil"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/saebekassebil/teoria"
  },
  "license": "MIT",
  "scripts": {
    "test": "vows --dot-matric test/*",
    "lint": "jshint index.js lib/",
    "bundle": "browserify index.js --standalone teoria > teoria.js",
    "build": "npm run lint && npm test && npm run bundle"
  },
  "devDependencies": {
    "jshint": ">=0.9.0",
    "vows": ">= 0.6.0"
  },
  "dependencies": {
    "daccord": "^1.0.1",
    "helmholtz": "^2.0.1",
    "interval-coords": "^1.1.1",
    "pitch-fq": "^1.0.0",
    "scientific-notation": "^1.0.2"
  }
}

Added public/teoria-master/teoria.js.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.teoria = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var Note = require('./lib/note');
var Interval = require('./lib/interval');
var Chord = require('./lib/chord');
var Scale = require('./lib/scale');

var teoria;

// never thought I would write this, but: Legacy support
function intervalConstructor(from, to) {
  // Construct a Interval object from string representation
  if (typeof from === 'string')
    return Interval.toCoord(from);

  if (typeof to === 'string' && from instanceof Note)
    return Interval.from(from, Interval.toCoord(to));

  if (to instanceof Interval && from instanceof Note)
    return Interval.from(from, to);

  if (to instanceof Note && from instanceof Note)
    return Interval.between(from, to);

  throw new Error('Invalid parameters');
}

intervalConstructor.toCoord = Interval.toCoord;
intervalConstructor.from = Interval.from;
intervalConstructor.between = Interval.between;
intervalConstructor.invert = Interval.invert;

function noteConstructor(name, duration) {
  if (typeof name === 'string')
    return Note.fromString(name, duration);
  else
    return new Note(name, duration);
}

noteConstructor.fromString = Note.fromString;
noteConstructor.fromKey = Note.fromKey;
noteConstructor.fromFrequency = Note.fromFrequency;
noteConstructor.fromMIDI = Note.fromMIDI;

function chordConstructor(name, symbol) {
  if (typeof name === 'string') {
    var root, octave;
    root = name.match(/^([a-h])(x|#|bb|b?)/i);
    if (root && root[0]) {
      octave = typeof symbol === 'number' ? symbol.toString(10) : '4';
      return new Chord(Note.fromString(root[0].toLowerCase() + octave),
                            name.substr(root[0].length));
    }
  } else if (name instanceof Note)
    return new Chord(name, symbol);

  throw new Error('Invalid Chord. Couldn\'t find note name');
}

function scaleConstructor(tonic, scale) {
  tonic = (tonic instanceof Note) ? tonic : teoria.note(tonic);
  return new Scale(tonic, scale);
}

teoria = {
  note: noteConstructor,

  chord: chordConstructor,

  interval: intervalConstructor,

  scale: scaleConstructor,

  Note: Note,
  Chord: Chord,
  Scale: Scale,
  Interval: Interval
};


require('./lib/sugar')(teoria);
exports = module.exports = teoria;

},{"./lib/chord":2,"./lib/interval":3,"./lib/note":5,"./lib/scale":6,"./lib/sugar":7}],2:[function(require,module,exports){
var daccord = require('daccord');
var knowledge = require('./knowledge');
var Note = require('./note');
var Interval = require('./interval');

function Chord(root, name) {
  if (!(this instanceof Chord)) return new Chord(root, name);
  name = name || '';
  this.name = root.name().toUpperCase() + root.accidental() + name;
  this.symbol = name;
  this.root = root;
  this.intervals = [];
  this._voicing = [];

  var bass = name.split('/');
  if (bass.length === 2 && bass[1].trim() !== '9') {
    name = bass[0];
    bass = bass[1].trim();
  } else {
    bass = null;
  }

  this.intervals = daccord(name).map(Interval.toCoord);
  this._voicing = this.intervals.slice();

  if (bass) {
    var intervals = this.intervals, bassInterval, note;
    // Make sure the bass is atop of the root note
    note = Note.fromString(bass + (root.octave() + 1)); // crude

    bassInterval = Interval.between(root, note);
    bass = bassInterval.simple();
    bassInterval = bassInterval.invert().direction('down');

    this._voicing = [bassInterval];
    for (var i = 0, length = intervals.length;  i < length; i++) {
      if (!intervals[i].simple().equal(bass))
        this._voicing.push(intervals[i]);
    }
  }
}

Chord.prototype = {
  notes: function() {
    var root = this.root;
    return this.voicing().map(function(interval) {
      return root.interval(interval);
    });
  },

  simple: function() {
    return this.notes().map(function(n) { return n.toString(true); });
  },

  bass: function() {
    return this.root.interval(this._voicing[0]);
  },

  voicing: function(voicing) {
    // Get the voicing
    if (!voicing) {
      return this._voicing;
    }

    // Set the voicing
    this._voicing = [];
    for (var i = 0, length = voicing.length; i < length; i++) {
      this._voicing[i] = Interval.toCoord(voicing[i]);
    }

    return this;
  },

  resetVoicing: function() {
    this._voicing = this.intervals;
  },

  dominant: function(additional) {
    additional = additional || '';
    return new Chord(this.root.interval('P5'), additional);
  },

  subdominant: function(additional) {
    additional = additional || '';
    return new Chord(this.root.interval('P4'), additional);
  },

  parallel: function(additional) {
    additional = additional || '';
    var quality = this.quality();

    if (this.chordType() !== 'triad' || quality === 'diminished' ||
        quality === 'augmented') {
      throw new Error('Only major/minor triads have parallel chords');
    }

    if (quality === 'major') {
      return new Chord(this.root.interval('m3', 'down'), 'm');
    } else {
      return new Chord(this.root.interval('m3', 'up'));
    }
  },

  quality: function() {
    var third, fifth, seventh, intervals = this.intervals;

    for (var i = 0, length = intervals.length; i < length; i++) {
      if (intervals[i].number() === 3) {
        third = intervals[i];
      } else if (intervals[i].number() === 5) {
        fifth = intervals[i];
      } else if (intervals[i].number() === 7) {
        seventh = intervals[i];
      }
    }

    if (!third) {
      return;
    }

    third = (third.direction() === 'down') ? third.invert() : third;
    third = third.simple().toString();

    if (fifth) {
      fifth = (fifth.direction === 'down') ? fifth.invert() : fifth;
      fifth = fifth.simple().toString();
    }

    if (seventh) {
      seventh = (seventh.direction === 'down') ? seventh.invert() : seventh;
      seventh = seventh.simple().toString();
    }

    if (third === 'M3') {
      if (fifth === 'A5') {
        return 'augmented';
      } else if (fifth === 'P5') {
        return (seventh === 'm7') ? 'dominant' : 'major';
      }

      return 'major';
    } else if (third === 'm3') {
      if (fifth === 'P5') {
        return 'minor';
      } else if (fifth === 'd5') {
        return (seventh === 'm7') ? 'half-diminished' : 'diminished';
      }

      return 'minor';
    }
  },

  chordType: function() { // In need of better name
    var length = this.intervals.length, interval, has, invert, i, name;

    if (length === 2) {
      return 'dyad';
    } else if (length === 3) {
      has = {unison: false, third: false, fifth: false};
      for (i = 0; i < length; i++) {
        interval = this.intervals[i];
        invert = interval.invert();
        if (interval.base() in has) {
          has[interval.base()] = true;
        } else if (invert.base() in has) {
          has[invert.base()] = true;
        }
      }

      name = (has.unison && has.third && has.fifth) ? 'triad' : 'trichord';
    } else if (length === 4) {
      has = {unison: false, third: false, fifth: false, seventh: false};
      for (i = 0; i < length; i++) {
        interval = this.intervals[i];
        invert = interval.invert();
        if (interval.base() in has) {
          has[interval.base()] = true;
        } else if (invert.base() in has) {
          has[invert.base()] = true;
        }
      }

      if (has.unison && has.third && has.fifth && has.seventh) {
        name = 'tetrad';
      }
    }

    return name || 'unknown';
  },

  get: function(interval) {
    if (typeof interval === 'string' && interval in knowledge.stepNumber) {
      var intervals = this.intervals, i, length;

      interval = knowledge.stepNumber[interval];
      for (i = 0, length = intervals.length; i < length; i++) {
        if (intervals[i].number() === interval) {
          return this.root.interval(intervals[i]);
        }
      }

      return null;
    } else {
      throw new Error('Invalid interval name');
    }
  },

  interval: function(interval) {
    return new Chord(this.root.interval(interval), this.symbol);
  },

  transpose: function(interval) {
    this.root.transpose(interval);
    this.name = this.root.name().toUpperCase() +
                this.root.accidental() + this.symbol;

    return this;
  },

  toString: function() {
    return this.name;
  }
};

module.exports = Chord;

},{"./interval":3,"./knowledge":4,"./note":5,"daccord":10}],3:[function(require,module,exports){
var knowledge = require('./knowledge');
var vector = require('./vector');
var toCoord = require('interval-coords');

function Interval(coord) {
  if (!(this instanceof Interval)) return new Interval(coord);
  this.coord = coord;
}

Interval.prototype = {
  name: function() {
    return knowledge.intervalsIndex[this.number() - 1];
  },

  semitones: function() {
    return vector.sum(vector.mul(this.coord, [12, 7]));
  },

  number: function() {
    return Math.abs(this.value());
  },

  value: function() {
    var toMultiply = Math.floor((this.coord[1] - 2) / 7) + 1;
    var product = vector.mul(knowledge.sharp, toMultiply);
    var without = vector.sub(this.coord, product);
    var i = knowledge.intervalFromFifth[without[1] + 5];
    var diff = without[0] - knowledge.intervals[i][0];
    var val = knowledge.stepNumber[i] + diff * 7;

    return (val > 0) ? val : val - 2;
  },

  type: function() {
    return knowledge.intervals[this.base()][0] <= 1 ? 'perfect' : 'minor';
  },

  base: function() {
    var product = vector.mul(knowledge.sharp, this.qualityValue());
    var fifth = vector.sub(this.coord, product)[1];
    fifth = this.value() > 0 ? fifth + 5 : -(fifth - 5) % 7;
    fifth = fifth < 0 ? knowledge.intervalFromFifth.length + fifth : fifth;

    var name = knowledge.intervalFromFifth[fifth];
    if (name === 'unison' && this.number() >= 8)
      name = 'octave';

    return name;
  },

  direction: function(dir) {
    if (dir) {
      var is = this.value() >= 1 ? 'up' : 'down';
      if (is !== dir)
        this.coord = vector.mul(this.coord, -1);

      return this;
    }
    else
      return this.value() >= 1 ? 'up' : 'down';
  },

  simple: function(ignore) {
    // Get the (upwards) base interval (with quality)
    var simple = knowledge.intervals[this.base()];
    var toAdd = vector.mul(knowledge.sharp, this.qualityValue());
    simple = vector.add(simple, toAdd);

    // Turn it around if necessary
    if (!ignore)
      simple = this.direction() === 'down' ? vector.mul(simple, -1) : simple;

    return new Interval(simple);
  },

  isCompound: function() {
    return this.number() > 8;
  },

  octaves: function() {
    var toSubtract, without, octaves;

    if (this.direction() === 'up') {
      toSubtract = vector.mul(knowledge.sharp, this.qualityValue());
      without = vector.sub(this.coord, toSubtract);
      octaves = without[0] - knowledge.intervals[this.base()][0];
    } else {
      toSubtract = vector.mul(knowledge.sharp, -this.qualityValue());
      without = vector.sub(this.coord, toSubtract);
      octaves = -(without[0] + knowledge.intervals[this.base()][0]);
    }

    return octaves;
  },

  invert: function() {
    var i = this.base();
    var qual = this.qualityValue();
    var acc = this.type() === 'minor' ? -(qual - 1) : -qual;
    var idx = 9 - knowledge.stepNumber[i] - 1;
    var coord = knowledge.intervals[knowledge.intervalsIndex[idx]];
    coord = vector.add(coord, vector.mul(knowledge.sharp, acc));

    return new Interval(coord);
  },

  quality: function(lng) {
    var quality = knowledge.alterations[this.type()][this.qualityValue() + 2];

    return lng ? knowledge.qualityLong[quality] : quality;
  },

  qualityValue: function() {
    if (this.direction() === 'down')
      return Math.floor((-this.coord[1] - 2) / 7) + 1;
    else
      return Math.floor((this.coord[1] - 2) / 7) + 1;
  },

  equal: function(interval) {
      return this.coord[0] === interval.coord[0] &&
          this.coord[1] === interval.coord[1];
  },

  greater: function(interval) {
    var semi = this.semitones();
    var isemi = interval.semitones();

    // If equal in absolute size, measure which interval is bigger
    // For example P4 is bigger than A3
    return (semi === isemi) ?
      (this.number() > interval.number()) : (semi > isemi);
  },

  smaller: function(interval) {
    return !this.equal(interval) && !this.greater(interval);
  },

  add: function(interval) {
    return new Interval(vector.add(this.coord, interval.coord));
  },

  toString: function(ignore) {
    // If given true, return the positive value
    var number = ignore ? this.number() : this.value();

    return this.quality() + number;
  }
};

Interval.toCoord = function(simple) {
  var coord = toCoord(simple);
  if (!coord)
    throw new Error('Invalid simple format interval');

  return new Interval(coord);
};

Interval.from = function(from, to) {
  return from.interval(to);
};

Interval.between = function(from, to) {
  return new Interval(vector.sub(to.coord, from.coord));
};

Interval.invert = function(sInterval) {
  return Interval.toCoord(sInterval).invert().toString();
};

module.exports = Interval;

},{"./knowledge":4,"./vector":8,"interval-coords":12}],4:[function(require,module,exports){
// Note coordinates [octave, fifth] relative to C
module.exports = {
  notes: {
    c: [0, 0],
    d: [-1, 2],
    e: [-2, 4],
    f: [1, -1],
    g: [0, 1],
    a: [-1, 3],
    b: [-2, 5],
    h: [-2, 5]
  },

  intervals: {
    unison: [0, 0],
    second: [3, -5],
    third: [2, -3],
    fourth: [1, -1],
    fifth: [0, 1],
    sixth: [3, -4],
    seventh: [2, -2],
    octave: [1, 0]
  },

  intervalFromFifth: ['second', 'sixth', 'third', 'seventh', 'fourth',
                         'unison', 'fifth'],

  intervalsIndex: ['unison', 'second', 'third', 'fourth', 'fifth',
                      'sixth', 'seventh', 'octave', 'ninth', 'tenth',
                      'eleventh', 'twelfth', 'thirteenth', 'fourteenth',
                      'fifteenth'],

// linear index to fifth = (2 * index + 1) % 7
  fifths: ['f', 'c', 'g', 'd', 'a', 'e', 'b'],
  accidentals: ['bb', 'b', '', '#', 'x'],

  sharp: [-4, 7],
  A4: [3, 3],

  durations: {
    '0.25': 'longa',
    '0.5': 'breve',
    '1': 'whole',
    '2': 'half',
    '4': 'quarter',
    '8': 'eighth',
    '16': 'sixteenth',
    '32': 'thirty-second',
    '64': 'sixty-fourth',
    '128': 'hundred-twenty-eighth'
  },

  qualityLong: {
    P: 'perfect',
    M: 'major',
    m: 'minor',
    A: 'augmented',
    AA: 'doubly augmented',
    d: 'diminished',
    dd: 'doubly diminished'
  },

  alterations: {
    perfect: ['dd', 'd', 'P', 'A', 'AA'],
    minor: ['dd', 'd', 'm', 'M', 'A', 'AA']
  },

  symbols: {
    'min': ['m3', 'P5'],
    'm': ['m3', 'P5'],
    '-': ['m3', 'P5'],

    'M': ['M3', 'P5'],
    '': ['M3', 'P5'],

    '+': ['M3', 'A5'],
    'aug': ['M3', 'A5'],

    'dim': ['m3', 'd5'],
    'o': ['m3', 'd5'],

    'maj': ['M3', 'P5', 'M7'],
    'dom': ['M3', 'P5', 'm7'],
    'ΓΈ': ['m3', 'd5', 'm7'],

    '5': ['P5']
  },

  chordShort: {
    'major': 'M',
    'minor': 'm',
    'augmented': 'aug',
    'diminished': 'dim',
    'half-diminished': '7b5',
    'power': '5',
    'dominant': '7'
  },

  stepNumber: {
    'unison': 1,
    'first': 1,
    'second': 2,
    'third': 3,
    'fourth': 4,
    'fifth': 5,
    'sixth': 6,
    'seventh': 7,
    'octave': 8,
    'ninth': 9,
    'eleventh': 11,
    'thirteenth': 13
  },

  // Adjusted Shearer syllables - Chromatic solfege system
  // Some intervals are not provided for. These include:
  // dd2 - Doubly diminished second
  // dd3 - Doubly diminished third
  // AA3 - Doubly augmented third
  // dd6 - Doubly diminished sixth
  // dd7 - Doubly diminished seventh
  // AA7 - Doubly augmented seventh
  intervalSolfege: {
    'dd1': 'daw',
    'd1': 'de',
    'P1': 'do',
    'A1': 'di',
    'AA1': 'dai',
    'd2': 'raw',
    'm2': 'ra',
    'M2': 're',
    'A2': 'ri',
    'AA2': 'rai',
    'd3': 'maw',
    'm3': 'me',
    'M3': 'mi',
    'A3': 'mai',
    'dd4': 'faw',
    'd4': 'fe',
    'P4': 'fa',
    'A4': 'fi',
    'AA4': 'fai',
    'dd5': 'saw',
    'd5': 'se',
    'P5': 'so',
    'A5': 'si',
    'AA5': 'sai',
    'd6': 'law',
    'm6': 'le',
    'M6': 'la',
    'A6': 'li',
    'AA6': 'lai',
    'd7': 'taw',
    'm7': 'te',
    'M7': 'ti',
    'A7': 'tai',
    'dd8': 'daw',
    'd8': 'de',
    'P8': 'do',
    'A8': 'di',
    'AA8': 'dai'
  }
};

},{}],5:[function(require,module,exports){
var scientific = require('scientific-notation');
var helmholtz = require('helmholtz');
var pitchFq = require('pitch-fq');
var knowledge = require('./knowledge');
var vector = require('./vector');
var Interval = require('./interval');

function pad(str, ch, len) {
  for (; len > 0; len--) {
    str += ch;
  }

  return str;
}


function Note(coord, duration) {
  if (!(this instanceof Note)) return new Note(coord, duration);
  duration = duration || {};

  this.duration = { value: duration.value || 4, dots: duration.dots || 0 };
  this.coord = coord;
}

Note.prototype = {
  octave: function() {
    return this.coord[0] + knowledge.A4[0] - knowledge.notes[this.name()][0] +
      this.accidentalValue() * 4;
  },

  name: function() {
    var value = this.accidentalValue();
    var idx = this.coord[1] + knowledge.A4[1] - value * 7 + 1;
    return knowledge.fifths[idx];
  },

  accidentalValue: function() {
    return Math.round((this.coord[1] + knowledge.A4[1] - 2) / 7);
  },

  accidental: function() {
    return knowledge.accidentals[this.accidentalValue() + 2];
  },

  /**
   * Returns the key number of the note
   */
  key: function(white) {
    if (white)
      return this.coord[0] * 7 + this.coord[1] * 4 + 29;
    else
      return this.coord[0] * 12 + this.coord[1] * 7 + 49;
  },

  /**
  * Returns a number ranging from 0-127 representing a MIDI note value
  */
  midi: function() {
    return this.key() + 20;
  },

  /**
   * Calculates and returns the frequency of the note.
   * Optional concert pitch (def. 440)
   */
  fq: function(concertPitch) {
    return pitchFq(this.coord, concertPitch);
  },

  /**
   * Returns the pitch class index (chroma) of the note
   */
  chroma: function() {
    var value = (vector.sum(vector.mul(this.coord, [12, 7])) - 3) % 12;

    return (value < 0) ? value + 12 : value;
  },

  interval: function(interval) {
    if (typeof interval === 'string') interval = Interval.toCoord(interval);

    if (interval instanceof Interval)
      return new Note(vector.add(this.coord, interval.coord), this.duration);
    else if (interval instanceof Note)
      return new Interval(vector.sub(interval.coord, this.coord));
  },

  transpose: function(interval) {
    this.coord = vector.add(this.coord, interval.coord);
    return this;
  },

  /**
   * Returns the Helmholtz notation form of the note (fx C,, d' F# g#'')
   */
  helmholtz: function() {
    var octave = this.octave();
    var name = this.name();
    name = octave < 3 ? name.toUpperCase() : name.toLowerCase();
    var padchar = octave < 3 ? ',' : '\'';
    var padcount = octave < 2 ? 2 - octave : octave - 3;

    return pad(name + this.accidental(), padchar, padcount);
  },

  /**
   * Returns the scientific notation form of the note (fx E4, Bb3, C#7 etc.)
   */
  scientific: function() {
    return this.name().toUpperCase() + this.accidental() + this.octave();
  },

  /**
   * Returns notes that are enharmonic with this note.
   */
  enharmonics: function(oneaccidental) {
    var key = this.key(), limit = oneaccidental ? 2 : 3;

    return ['m3', 'm2', 'm-2', 'm-3']
      .map(this.interval.bind(this))
      .filter(function(note) {
      var acc = note.accidentalValue();
      var diff = key - (note.key() - acc);

      if (diff < limit && diff > -limit) {
        var product = vector.mul(knowledge.sharp, diff - acc);
        note.coord = vector.add(note.coord, product);
        return true;
      }
    });
  },

  solfege: function(scale, showOctaves) {
    var interval = scale.tonic.interval(this), solfege, stroke, count;
    if (interval.direction() === 'down')
      interval = interval.invert();

    if (showOctaves) {
      count = (this.key(true) - scale.tonic.key(true)) / 7;
      count = (count >= 0) ? Math.floor(count) : -(Math.ceil(-count));
      stroke = (count >= 0) ? '\'' : ',';
    }

    solfege = knowledge.intervalSolfege[interval.simple(true).toString()];
    return (showOctaves) ? pad(solfege, stroke, Math.abs(count)) : solfege;
  },

  scaleDegree: function(scale) {
    var inter = scale.tonic.interval(this);

    // If the direction is down, or we're dealing with an octave - invert it
    if (inter.direction() === 'down' ||
       (inter.coord[1] === 0 && inter.coord[0] !== 0)) {
      inter = inter.invert();
    }

    inter = inter.simple(true).coord;

    return scale.scale.reduce(function(index, current, i) {
      var coord = Interval.toCoord(current).coord;
      return coord[0] === inter[0] && coord[1] === inter[1] ? i + 1 : index;
    }, 0);
  },

  /**
   * Returns the name of the duration value,
   * such as 'whole', 'quarter', 'sixteenth' etc.
   */
  durationName: function() {
    return knowledge.durations[this.duration.value];
  },

  /**
   * Returns the duration of the note (including dots)
   * in seconds. The first argument is the tempo in beats
   * per minute, the second is the beat unit (i.e. the
   * lower numeral in a time signature).
   */
  durationInSeconds: function(bpm, beatUnit) {
    var secs = (60 / bpm) / (this.duration.value / 4) / (beatUnit / 4);
    return secs * 2 - secs / Math.pow(2, this.duration.dots);
  },

  /**
   * Returns the name of the note, with an optional display of octave number
   */
  toString: function(dont) {
    return this.name() + this.accidental() + (dont ? '' : this.octave());
  }
};

Note.fromString = function(name, dur) {
  var coord = scientific(name);
  if (!coord) coord = helmholtz(name);
  return new Note(coord, dur);
};

Note.fromKey = function(key) {
  var octave = Math.floor((key - 4) / 12);
  var distance = key - (octave * 12) - 4;
  var name = knowledge.fifths[(2 * Math.round(distance / 2) + 1) % 7];
  var subDiff = vector.sub(knowledge.notes[name], knowledge.A4);
  var note = vector.add(subDiff, [octave + 1, 0]);
  var diff = (key - 49) - vector.sum(vector.mul(note, [12, 7]));

  var arg = diff ? vector.add(note, vector.mul(knowledge.sharp, diff)) : note;
  return new Note(arg);
};

Note.fromFrequency = function(fq, concertPitch) {
  var key, cents, originalFq;
  concertPitch = concertPitch || 440;

  key = 49 + 12 * ((Math.log(fq) - Math.log(concertPitch)) / Math.log(2));
  key = Math.round(key);
  originalFq = concertPitch * Math.pow(2, (key - 49) / 12);
  cents = 1200 * (Math.log(fq / originalFq) / Math.log(2));

  return { note: Note.fromKey(key), cents: cents };
};

Note.fromMIDI = function(note) {
  return Note.fromKey(note - 20);
};

module.exports = Note;

},{"./interval":3,"./knowledge":4,"./vector":8,"helmholtz":11,"pitch-fq":14,"scientific-notation":15}],6:[function(require,module,exports){
var knowledge = require('./knowledge');
var Interval = require('./interval');

var scales = {
  aeolian: ['P1', 'M2', 'm3', 'P4', 'P5', 'm6', 'm7'],
  blues: ['P1', 'm3', 'P4', 'd5', 'P5', 'm7'],
  chromatic: ['P1', 'm2', 'M2', 'm3', 'M3', 'P4',
    'A4', 'P5', 'm6', 'M6', 'm7', 'M7'],
  dorian: ['P1', 'M2', 'm3', 'P4', 'P5', 'M6', 'm7'],
  doubleharmonic: ['P1', 'm2', 'M3', 'P4', 'P5', 'm6', 'M7'],
  harmonicminor: ['P1', 'M2', 'm3', 'P4', 'P5', 'm6', 'M7'],
  ionian: ['P1', 'M2', 'M3', 'P4', 'P5', 'M6', 'M7'],
  locrian: ['P1', 'm2', 'm3', 'P4', 'd5', 'm6', 'm7'],
  lydian: ['P1', 'M2', 'M3', 'A4', 'P5', 'M6', 'M7'],
  majorpentatonic: ['P1', 'M2', 'M3', 'P5', 'M6'],
  melodicminor: ['P1', 'M2', 'm3', 'P4', 'P5', 'M6', 'M7'],
  minorpentatonic: ['P1', 'm3', 'P4', 'P5', 'm7'],
  mixolydian: ['P1', 'M2', 'M3', 'P4', 'P5', 'M6', 'm7'],
  phrygian: ['P1', 'm2', 'm3', 'P4', 'P5', 'm6', 'm7'],
  wholetone: ['P1', 'M2', 'M3', 'A4', 'A5', 'A6']
};

// synonyms
scales.harmonicchromatic = scales.chromatic;
scales.minor = scales.aeolian;
scales.major = scales.ionian;
scales.flamenco = scales.doubleharmonic;

function Scale(tonic, scale) {
  if (!(this instanceof Scale)) return new Scale(tonic, scale);
  var scaleName, i;
  if (!('coord' in tonic)) {
    throw new Error('Invalid Tonic');
  }

  if (typeof scale === 'string') {
    scaleName = scale;
    scale = scales[scale];
    if (!scale)
      throw new Error('Invalid Scale');
  } else {
    for (i in scales) {
      if (scales.hasOwnProperty(i)) {
        if (scales[i].toString() === scale.toString()) {
          scaleName = i;
          break;
        }
      }
    }
  }

  this.name = scaleName;
  this.tonic = tonic;
  this.scale = scale;
}

Scale.prototype = {
  notes: function() {
    var notes = [];

    for (var i = 0, length = this.scale.length; i < length; i++) {
      notes.push(this.tonic.interval(this.scale[i]));
    }

    return notes;
  },

  simple: function() {
    return this.notes().map(function(n) { return n.toString(true); });
  },

  type: function() {
    var length = this.scale.length - 2;
    if (length < 8) {
      return ['di', 'tri', 'tetra', 'penta', 'hexa', 'hepta', 'octa'][length] +
        'tonic';
    }
  },

  get: function(i) {
    var isStepStr = typeof i === 'string' && i in knowledge.stepNumber;
    i = isStepStr ? knowledge.stepNumber[i] : i;
    var len = this.scale.length;
    var interval, octaves;

    if (i < 0) {
      interval = this.scale[i % len + len - 1];
      octaves = Math.floor((i - 1) / len);
    } else if (i % len === 0) {
      interval = this.scale[len - 1];
      octaves = (i / len) - 1;
    } else {
      interval = this.scale[i % len - 1];
      octaves = Math.floor(i / len);
    }

    return this.tonic.interval(interval).interval(new Interval([octaves, 0]));
  },

  solfege: function(index, showOctaves) {
    if (index)
      return this.get(index).solfege(this, showOctaves);

    return this.notes().map(function(n) {
      return n.solfege(this, showOctaves);
    });
  },

  interval: function(interval) {
    interval = (typeof interval === 'string') ?
      Interval.toCoord(interval) : interval;
    return new Scale(this.tonic.interval(interval), this.scale);
  },

  transpose: function(interval) {
    var scale = this.interval(interval);
    this.scale = scale.scale;
    this.tonic = scale.tonic;

    return this;
  }
};
Scale.KNOWN_SCALES = Object.keys(scales);

module.exports = Scale;

},{"./interval":3,"./knowledge":4}],7:[function(require,module,exports){
var knowledge = require('./knowledge');

module.exports = function(teoria) {
  var Note = teoria.Note;
  var Chord = teoria.Chord;
  var Scale = teoria.Scale;

  Note.prototype.chord = function(chord) {
    var isShortChord = chord in knowledge.chordShort;
    chord = isShortChord ? knowledge.chordShort[chord] : chord;

    return new Chord(this, chord);
  };

  Note.prototype.scale = function(scale) {
    return new Scale(this, scale);
  };
};

},{"./knowledge":4}],8:[function(require,module,exports){
module.exports = {
  add: function(note, interval) {
    return [note[0] + interval[0], note[1] + interval[1]];
  },

  sub: function(note, interval) {
    return [note[0] - interval[0], note[1] - interval[1]];
  },

  mul: function(note, interval) {
    if (typeof interval === 'number')
      return [note[0] * interval, note[1] * interval];
    else
      return [note[0] * interval[0], note[1] * interval[1]];
  },

  sum: function(coord) {
    return coord[0] + coord[1];
  }
};

},{}],9:[function(require,module,exports){
var accidentalValues = {
  'bb': -2,
  'b': -1,
  '': 0,
  '#': 1,
  'x': 2
};

module.exports = function accidentalNumber(acc) {
  return accidentalValues[acc];
}

module.exports.interval = function accidentalInterval(acc) {
  var val = accidentalValues[acc];
  return [-4 * val, 7 * val];
}

},{}],10:[function(require,module,exports){
var SYMBOLS = {
  'm': ['m3', 'P5'],
  'mi': ['m3', 'P5'],
  'min': ['m3', 'P5'],
  '-': ['m3', 'P5'],

  'M': ['M3', 'P5'],
  'ma': ['M3', 'P5'],
  '': ['M3', 'P5'],

  '+': ['M3', 'A5'],
  'aug': ['M3', 'A5'],

  'dim': ['m3', 'd5'],
  'o': ['m3', 'd5'],

  'maj': ['M3', 'P5', 'M7'],
  'dom': ['M3', 'P5', 'm7'],
  'ΓΈ': ['m3', 'd5', 'm7'],

  '5': ['P5'],

  '6/9': ['M3', 'P5', 'M6', 'M9']
};

module.exports = function(symbol) {
  var c, parsing = 'quality', additionals = [], name, chordLength = 2
  var notes = ['P1', 'M3', 'P5', 'm7', 'M9', 'P11', 'M13'];
  var explicitMajor = false;

  function setChord(name) {
    var intervals = SYMBOLS[name];
    for (var i = 0, len = intervals.length; i < len; i++) {
      notes[i + 1] = intervals[i];
    }

    chordLength = intervals.length;
  }

  // Remove whitespace, commas and parentheses
  symbol = symbol.replace(/[,\s\(\)]/g, '');
  for (var i = 0, len = symbol.length; i < len; i++) {
    if (!(c = symbol[i]))
      return;

    if (parsing === 'quality') {
      var sub3 = (i + 2) < len ? symbol.substr(i, 3).toLowerCase() : null;
      var sub2 = (i + 1) < len ? symbol.substr(i, 2).toLowerCase() : null;
      if (sub3 in SYMBOLS)
        name = sub3;
      else if (sub2 in SYMBOLS)
        name = sub2;
      else if (c in SYMBOLS)
        name = c;
      else
        name = '';

      if (name)
        setChord(name);

      if (name === 'M' || name === 'ma' || name === 'maj')
        explicitMajor = true;


      i += name.length - 1;
      parsing = 'extension';
    } else if (parsing === 'extension') {
      c = (c === '1' && symbol[i + 1]) ? +symbol.substr(i, 2) : +c;

      if (!isNaN(c) && c !== 6) {
        chordLength = (c - 1) / 2;

        if (chordLength !== Math.round(chordLength))
          return new Error('Invalid interval extension: ' + c.toString(10));

        if (name === 'o' || name === 'dim')
          notes[3] = 'd7';
        else if (explicitMajor)
          notes[3] = 'M7';

        i += c >= 10 ? 1 : 0;
      } else if (c === 6) {
        notes[3] = 'M6';
        chordLength = Math.max(3, chordLength);
      } else
        i -= 1;

      parsing = 'alterations';
    } else if (parsing === 'alterations') {
      var alterations = symbol.substr(i).split(/(#|b|add|maj|sus|M)/i),
          next, flat = false, sharp = false;

      if (alterations.length === 1)
        return new Error('Invalid alteration');
      else if (alterations[0].length !== 0)
        return new Error('Invalid token: \'' + alterations[0] + '\'');

      var ignore = false;
      alterations.forEach(function(alt, i, arr) {
        if (ignore || !alt.length)
          return ignore = false;

        var next = arr[i + 1], lower = alt.toLowerCase();
        if (alt === 'M' || lower === 'maj') {
          if (next === '7')
            ignore = true;

          chordLength = Math.max(3, chordLength);
          notes[3] = 'M7';
        } else if (lower === 'sus') {
          var type = 'P4';
          if (next === '2' || next === '4') {
            ignore = true;

            if (next === '2')
              type = 'M2';
          }

          notes[1] = type; // Replace third with M2 or P4
        } else if (lower === 'add') {
          if (next === '9')
            additionals.push('M9');
          else if (next === '11')
            additionals.push('P11');
          else if (next === '13')
            additionals.push('M13');

          ignore = true
        } else if (lower === 'b') {
          flat = true;
        } else if (lower === '#') {
          sharp = true;
        } else {
          var token = +alt, quality, intPos;
          if (isNaN(token) || String(token).length !== alt.length)
            return new Error('Invalid token: \'' + alt + '\'');

          if (token === 6) {
            if (sharp)
              notes[3] = 'A6';
            else if (flat)
              notes[3] = 'm6';
            else
              notes[3] = 'M6';

            chordLength = Math.max(3, chordLength);
            return;
          }

          // Calculate the position in the 'note' array
          intPos = (token - 1) / 2;
          if (chordLength < intPos)
            chordLength = intPos;

          if (token < 5 || token === 7 || intPos !== Math.round(intPos))
            return new Error('Invalid interval alteration: ' + token);

          quality = notes[intPos][0];

          // Alterate the quality of the interval according the accidentals
          if (sharp) {
            if (quality === 'd')
              quality = 'm';
            else if (quality === 'm')
              quality = 'M';
            else if (quality === 'M' || quality === 'P')
              quality = 'A';
          } else if (flat) {
            if (quality === 'A')
              quality = 'M';
            else if (quality === 'M')
              quality = 'm';
            else if (quality === 'm' || quality === 'P')
              quality = 'd';
          }

          sharp = flat = false;
          notes[intPos] = quality + token;
        }
      });
      parsing = 'ended';
    } else if (parsing === 'ended') {
      break;
    }
  }

  return notes.slice(0, chordLength + 1).concat(additionals);
}

},{}],11:[function(require,module,exports){
var coords = require('notecoord');
var accval = require('accidental-value');

module.exports = function helmholtz(name) {
  var name = name.replace(/\u2032/g, "'").replace(/\u0375/g, ',');
  var parts = name.match(/^(,*)([a-h])(x|#|bb|b?)([,\']*)$/i);

  if (!parts || name !== parts[0])
    throw new Error('Invalid formatting');

  var note = parts[2];
  var octaveFirst = parts[1];
  var octaveLast = parts[4];
  var lower = note === note.toLowerCase();
  var octave;

  if (octaveFirst) {
    if (lower)
      throw new Error('Invalid formatting - found commas before lowercase note');

    octave = 2 - octaveFirst.length;
  } else if (octaveLast) {
    if (octaveLast.match(/^'+$/) && lower)
      octave = 3 + octaveLast.length;
    else if (octaveLast.match(/^,+$/) && !lower)
      octave = 2 - octaveLast.length;
    else
      throw new Error('Invalid formatting - mismatch between octave ' +
        'indicator and letter case')
  } else
    octave = lower ? 3 : 2;

  var accidentalValue = accval.interval(parts[3].toLowerCase());
  var coord = coords(note.toLowerCase());

  coord[0] += octave;
  coord[0] += accidentalValue[0] - coords.A4[0];
  coord[1] += accidentalValue[1] - coords.A4[1];

  return coord;
};

},{"accidental-value":9,"notecoord":13}],12:[function(require,module,exports){
var pattern = /^(AA|A|P|M|m|d|dd)(-?\d+)$/;

// The interval it takes to raise a note a semitone
var sharp = [-4, 7];

var pAlts = ['dd', 'd', 'P', 'A', 'AA'];
var mAlts = ['dd', 'd', 'm', 'M', 'A', 'AA'];

var baseIntervals = [
  [0, 0],
  [3, -5],
  [2, -3],
  [1, -1],
  [0, 1],
  [3, -4],
  [2, -2],
  [1, 0]
];

module.exports = function(simple) {
  var parser = simple.match(pattern);
  if (!parser) return null;

  var quality = parser[1];
  var number = +parser[2];
  var sign = number < 0 ? -1 : 1;

  number = sign < 0 ? -number : number;

  var lower = number > 8 ? (number % 7 || 7) : number;
  var octaves = (number - lower) / 7;

  var base = baseIntervals[lower - 1];
  var alts = base[0] <= 1 ? pAlts : mAlts;
  var alt = alts.indexOf(quality) - 2;

  // this happens, if the alteration wasn't suitable for this type
  // of interval, such as P2 or M5 (no "perfect second" or "major fifth")
  if (alt === -3) return null;

  return [
    sign * (base[0] + octaves + sharp[0] * alt),
    sign * (base[1] + sharp[1] * alt)
  ];
}

// Copy to avoid overwriting internal base intervals
module.exports.coords = baseIntervals.slice(0);

},{}],13:[function(require,module,exports){
// First coord is octaves, second is fifths. Distances are relative to c
var notes = {
  c: [0, 0],
  d: [-1, 2],
  e: [-2, 4],
  f: [1, -1],
  g: [0, 1],
  a: [-1, 3],
  b: [-2, 5],
  h: [-2, 5]
};

module.exports = function(name) {
  return name in notes ? [notes[name][0], notes[name][1]] : null;
};

module.exports.notes = notes;
module.exports.A4 = [3, 3]; // Relative to C0 (scientic notation, ~16.35Hz)
module.exports.sharp = [-4, 7];

},{}],14:[function(require,module,exports){
module.exports = function(coord, stdPitch) {
  if (typeof coord === 'number') {
    stdPitch = coord;
    return function(coord) {
      return stdPitch * Math.pow(2, (coord[0] * 12 + coord[1] * 7) / 12);
    }
  }

  stdPitch = stdPitch || 440;
  return stdPitch * Math.pow(2, (coord[0] * 12 + coord[1] * 7) / 12);
}

},{}],15:[function(require,module,exports){
var coords = require('notecoord');
var accval = require('accidental-value');

module.exports = function scientific(name) {
  var format = /^([a-h])(x|#|bb|b?)(-?\d*)/i;

  var parser = name.match(format);
  if (!(parser && name === parser[0] && parser[3].length)) return;

  var noteName = parser[1];
  var octave = +parser[3];
  var accidental = parser[2].length ? parser[2].toLowerCase() : '';

  var accidentalValue = accval.interval(accidental);
  var coord = coords(noteName.toLowerCase());

  coord[0] += octave;
  coord[0] += accidentalValue[0] - coords.A4[0];
  coord[1] += accidentalValue[1] - coords.A4[1];

  return coord;
};

},{"accidental-value":9,"notecoord":13}]},{},[1])(1)
});

Added public/teoria-master/test/chords.js.

















































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
var vows = require('vows'),
    assert = require('assert'),
    teoria = require('../');

vows.describe('Chords').addBatch({
  'Chord parser': {
    'Emaj7': function() {
      assert.deepEqual(teoria.chord('Emaj7').simple(), ['e', 'g#', 'b', 'd#']);
    },

    'A+': function() {
      assert.deepEqual(teoria.chord('A+').simple(), ['a', 'c#', 'e#']);
    },

    'Bb+': function() {
      assert.deepEqual(teoria.chord('Bb+').simple(), ['bb', 'd', 'f#']);
    },

    'F#maj7': function() {
      assert.deepEqual(teoria.chord('F#maj7').simple(), ['f#', 'a#', 'c#', 'e#']);
    },

    'Hmaj7': function() {
      assert.deepEqual(teoria.chord('Hmaj7').simple(), ['b', 'd#', 'f#', 'a#']);
    },

    'H#maj7': function() {
      assert.deepEqual(teoria.chord('H#maj7').simple(), ['b#', 'dx', 'fx', 'ax']);
    },

    'C7b5': function() {
      assert.deepEqual(teoria.chord('C7b5').simple(), ['c', 'e', 'gb', 'bb']);
    },

    'Eb7b5': function() {
      assert.deepEqual(teoria.chord('Eb7b5').simple(), ['eb', 'g', 'bbb', 'db']);
    },

    'D#7b5': function() {
      assert.deepEqual(teoria.chord('D#7b5').simple(), ['d#', 'fx', 'a', 'c#']);
    },

    'C9': function() {
      assert.deepEqual(teoria.chord('C9').simple(), ['c', 'e', 'g', 'bb', 'd']);
    },

    'Eb9': function() {
      assert.deepEqual(teoria.chord('Eb9').simple(), ['eb', 'g', 'bb', 'db', 'f']);
    },

    'G#(#9)': function() {
      assert.deepEqual(teoria.chord('G#(#9)').simple(), ['g#', 'b#', 'd#', 'f#', 'ax']);
    },

    'Ab(b9)': function() {
      assert.deepEqual(teoria.chord('Ab(b9)').simple(), ['ab', 'c', 'eb', 'gb', 'bbb']);
    },

    'F#(#11)': function() {
      assert.deepEqual(teoria.chord('F#(#11)').simple(), ['f#', 'a#', 'c#', 'e', 'g#', 'b#']);
    },

    'Ab13': function() {
      assert.deepEqual(teoria.chord('Ab13').simple(), ['ab', 'c', 'eb', 'gb', 'bb', 'db', 'f']);
    },

    'C7sus4': function() {
      assert.deepEqual(teoria.chord('C7sus4').simple(), ['c', 'f', 'g', 'bb']);
    },

    'Cmaj9': function() {
      assert.deepEqual(teoria.chord('Cmaj9').simple(), ['c', 'e', 'g', 'b', 'd']);
    },

    'Dmb6': function() {
      assert.deepEqual(teoria.chord('Dmb6').simple(), ['d', 'f', 'a', 'bb']);
    },

    'C#(#5#9)': function() {
      assert.deepEqual(teoria.chord('C#(#5#9)').simple(), ['c#', 'e#', 'gx', 'b', 'dx']);
    },

    'Cm(maj7)': function() {
      assert.deepEqual(teoria.chord('Cm(maj7)').simple(), ['c', 'eb', 'g', 'b']);
    },

    'F#m(11b5b9)': function() {
      assert.deepEqual(teoria.chord('F#m(11b5b9)').simple(), ['f#', 'a', 'c', 'e', 'g', 'b']);
    },

    'C/e': function() {
      assert.deepEqual(teoria.chord('C/e').simple(), ['e', 'c', 'g']);
    },

    'A7/g': function() {
      assert.deepEqual(teoria.chord('A7/g').simple(), ['g', 'a', 'c#', 'e']);
    },

    'G/f#': function() {
      assert.deepEqual(teoria.chord('G/f#').simple(), ['f#', 'g', 'b', 'd']);
    },

    'C6': function() {
      assert.deepEqual(teoria.chord('C6').simple(), ['c', 'e', 'g', 'a']);
    },

    'A#6': function() {
      assert.deepEqual(teoria.chord('A#6').simple(), ['a#', 'cx', 'e#', 'fx']);
    },

    'Bb6': function() {
      assert.deepEqual(teoria.chord('Bb6').simple(), ['bb', 'd', 'f', 'g']);
    },

    'Am6': function() {
      assert.deepEqual(teoria.chord('Am6').simple(), ['a', 'c', 'e', 'f#']);
    },

    'D(#6)': function() {
      assert.deepEqual(teoria.chord('D(#6)').simple(), ['d', 'f#', 'a', 'b#']);
    },

    'Eo': function() {
      assert.deepEqual(teoria.chord('Eo').simple(), ['e', 'g', 'bb']);
    },

    'EΓΈ': function() {
      assert.deepEqual(teoria.chord('EΓΈ').simple(), ['e', 'g', 'bb', 'd']);
    },

    'Do': function() {
      assert.deepEqual(teoria.chord('Do').simple(), ['d', 'f', 'ab']);
    },

    'DΓΈ': function() {
      assert.deepEqual(teoria.chord('DΓΈ').simple(), ['d', 'f', 'ab', 'c']);
    },

    'Fo7': function() {
      assert.deepEqual(teoria.chord('Fo7').simple(), ['f', 'ab', 'cb', 'ebb']);
    },

    'G#ΓΈ7': function() {
      assert.deepEqual(teoria.chord('G#ΓΈ7').simple(), ['g#', 'b', 'd', 'f#']);
    },

    'Cmin': function() {
      assert.deepEqual(teoria.chord('Cmin').simple(), ['c', 'eb', 'g']);
    },

    'Bmin11': function() {
      assert.deepEqual(teoria.chord('Bmin11').simple(), ['b', 'd', 'f#', 'a', 'c#', 'e']);
    },

    'C+M7': function() {
      assert.deepEqual(teoria.chord('C+M7').simple(), ['c', 'e', 'g#', 'b']);
    },

    'Bbdom7b5': function() {
      assert.deepEqual(teoria.chord('Bbdom7b5').simple(), ['bb', 'd', 'fb', 'ab']);
    },

    'E5': function() {
      assert.deepEqual(teoria.chord('E5').simple(), ['e', 'b']);
    },

    'A5': function() {
      assert.deepEqual(teoria.chord('A5').simple(), ['a', 'e']);
    },

    'C13#9b5': function() {
      assert.deepEqual(teoria.chord('C13#9b5').simple(), ['c', 'e', 'gb', 'bb', 'd#', 'f', 'a']);
    },

    'D13#5b9': function() {
      assert.deepEqual(teoria.chord('D13#5b9').simple(), ['d', 'f#', 'a#', 'c', 'eb', 'g', 'b']);
    },

    'C6/9': function() {
      assert.deepEqual(teoria.chord('C6/9').simple(), ['c', 'e', 'g', 'a', 'd']);
    },

    'Ab6/9': function() {
      assert.deepEqual(teoria.chord('Ab6/9').simple(), ['ab', 'c', 'eb', 'f', 'bb']);
    },

    'CM7': function() {
      assert.deepEqual(teoria.chord('CM7').simple(), ['c', 'e', 'g', 'b']);
    },

    'CmM7': function() {
      assert.deepEqual(teoria.chord('CmM7').simple(), ['c', 'eb', 'g', 'b']);
    },

    'DM': function() {
      assert.deepEqual(teoria.chord('DM').simple(), ['d', 'f#', 'a']);
    },

    'EM#5': function() {
      assert.deepEqual(teoria.chord('EM#5').simple(), ['e', 'g#', 'b#']);
    },

    'FM9': function() {
      assert.deepEqual(teoria.chord('FM9').simple(), ['f', 'a', 'c', 'e', 'g']);
    },

    'Dmi': function() {
      assert.deepEqual(teoria.chord('Dmi').simple(), ['d', 'f', 'a']);

    },

    'Emi7': function() {
      assert.deepEqual(teoria.chord('Emi7').simple(), ['e', 'g', 'b', 'd']);
    },

    'Dma': function() {
      assert.deepEqual(teoria.chord('Dma').simple(), ['d', 'f#', 'a']);
    },

    'Ema9': function() {
      assert.deepEqual(teoria.chord('Ema9').simple(), ['e', 'g#', 'b', 'd#', 'f#']);
    }
  },

  'Case doesn\'t matter': {
    'BbDom': function() {
      assert.deepEqual(teoria.chord('BbDom').simple(), teoria.chord('Bbdom').simple());
    },

    'EbMaj9': function() {
      assert.deepEqual(teoria.chord('EbMaj9').simple(), teoria.chord('Ebmaj9').simple());
    },

    'ASus4': function() {
      assert.deepEqual(teoria.chord('ASus4').simple(), teoria.chord('Asus4').simple());
    },

    'EAdd9': function() {
      assert.deepEqual(teoria.chord('EAdd9').simple(), teoria.chord('Eadd9').simple());
    }
  },

  'Chord Methods': {
    '#bass of Cmaj7': function() {
      assert.equal(teoria.chord('Cmaj7').bass().toString(true), 'c');
    },

    '#bass of A/C#': function() {
      assert.equal(teoria.chord('A/C#').bass().toString(true), 'c#');
    },

    '#bass of D6/9': function() {
      assert.equal(teoria.chord('D6/9').bass().toString(true), 'd');
    },

    '#quality() of Bmaj7': function() {
      assert.equal(teoria.chord('Bmaj7').quality(), 'major');
    },

    '#quality() of E7': function() {
      assert.equal(teoria.chord('E7').quality(), 'dominant');
    },

    '#quality() of Dbm7b5': function() {
      assert.equal(teoria.chord('Dbm7b5').quality(), 'half-diminished');
    },

    '#quality() of Cmin11': function() {
      assert.equal(teoria.chord('Cmin11').quality(), 'minor');
    },

    '#quality() of A+': function() {
      assert.equal(teoria.chord('A+').quality(), 'augmented');
    },

    '#quality() of A#(b13)': function() {
      assert.equal(teoria.chord('A#(b13)').quality(), 'dominant');
    },

    '#quality() of Gmb5': function() {
      assert.equal(teoria.chord('Gmb5').quality(), 'diminished');
    },

    '#quality() of Asus4': function() {
      assert.equal(teoria.chord('Asus4').quality(), undefined);
    },

    '#quality() of Fm#5': function() {
      assert.equal(teoria.chord('Fm#5').quality(), 'minor');
    },

    '#chordType() of C': function() {
      assert.equal(teoria.chord('C').chordType(), 'triad');
    },

    '#chordType() of Dm': function() {
      assert.equal(teoria.chord('Dm').chordType(), 'triad');
    },

    '#chordType() of A7': function() {
      assert.equal(teoria.chord('A7').chordType(), 'tetrad');
    },

    '#chordType() of Bsus4': function() {
      assert.equal(teoria.chord('Bsus4').chordType(), 'trichord');
    },

    '#chordType() of E5': function() {
      assert.equal(teoria.chord('E5').chordType(), 'dyad');
    },
  }
}).export(module);

Added public/teoria-master/test/intervals.js.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
var vows = require('vows'),
    assert = require('assert'),
    teoria = require('../');

function addSimple(interval1, interval2) {
  return teoria.interval(interval1).add(teoria.interval(interval2));
}

vows.describe('Intervals').addBatch({
  'Relative Intervals': {
    topic: function() {
      return teoria.note('F#,');
    },

    'Doubly diminished second': function(note) {
      assert.deepEqual(note.interval('dd2'), teoria.note('Gbb,'));
    },

    'Diminished second': function(note) {
      assert.deepEqual(note.interval('d2'), teoria.note('Gb,'));
    },

    'Diminished second, API method two': function(note) {
      assert.deepEqual(teoria.interval(note, teoria.interval('d2')), teoria.note('Gb,'));
    },

    'Diminished second, API method three': function(note) {
      assert.deepEqual(note.interval(teoria.interval('d2')), teoria.note('Gb,'));
    },

    'Minor second': function(note) {
      assert.deepEqual(note.interval('m2'), teoria.note('G,'));
    },

    'Major second': function(note) {
      assert.deepEqual(note.interval('M2'), teoria.note('G#,'));
    },

    'Augmented second': function(note) {
      assert.deepEqual(note.interval('A2'), teoria.note('Gx,'));
    },

    'Doubly diminished third': function(note) {
      assert.deepEqual(note.interval('dd3'), teoria.note('Abb,'));
    },

    'Diminished third': function(note) {
      assert.deepEqual(note.interval('d3'), teoria.note('Ab,'));
    },

    'Minor third': function(note) {
      assert.deepEqual(note.interval('m3'), teoria.note('A,'));
    },

    'Major third': function(note) {
      assert.deepEqual(note.interval('M3'), teoria.note('A#,'));
    },

    'Augmented third': function(note) {
      assert.deepEqual(note.interval('A3'), teoria.note('Ax,'));
    },

    'Doubly diminished fourth': function(note) {
      assert.deepEqual(note.interval('dd4'), teoria.note('Bbb,'));
    },

    'Diminished fourth': function(note) {
      assert.deepEqual(note.interval('d4'), teoria.note('Bb,'));
    },

    'Perfect fourth': function(note) {
      assert.deepEqual(note.interval('P4'), teoria.note('B,'));
    },

    'Augmented fourth': function(note) {
      assert.deepEqual(note.interval('A4'), teoria.note('B#,'));
    },

    'Doubly augmented fourth': function(note) {
      assert.deepEqual(note.interval('AA4'), teoria.note('Bx,'));
    },

    'Doubly diminished fifth': function(note) {
      assert.deepEqual(note.interval('dd5'), teoria.note('Cb'));
    },

    'Diminished fifth': function(note) {
      assert.deepEqual(note.interval('d5'), teoria.note('C'));
    },

    'Perfect fifth': function(note) {
      assert.deepEqual(note.interval('P5'), teoria.note('C#'));
    },

    'Augmented fifth': function(note) {
      assert.deepEqual(note.interval('A5'), teoria.note('Cx'));
    },

    'Doubly diminished sixth': function(note) {
      assert.deepEqual(note.interval('dd6'), teoria.note('Dbb'));
    },

    'Diminished sixth': function(note) {
      assert.deepEqual(note.interval('d6'), teoria.note('Db'));
    },

    'Minor sixth': function(note) {
      assert.deepEqual(note.interval('m6'), teoria.note('D'));
    },

    'Major sixth': function(note) {
      assert.deepEqual(note.interval('M6'), teoria.note('D#'));
    },

    'Augmented sixth': function(note) {
      assert.deepEqual(note.interval('A6'), teoria.note('Dx'));
    },

    'Doubly diminished seventh': function(note) {
      assert.deepEqual(note.interval('dd7'), teoria.note('Ebb'));
    },

    'Diminished seventh': function(note) {
      assert.deepEqual(note.interval('d7'), teoria.note('Eb'));
    },

    'Minor seventh': function(note) {
      assert.deepEqual(note.interval('m7'), teoria.note('E'));
    },

    'Major seventh': function(note) {
      assert.deepEqual(note.interval('M7'), teoria.note('E#'));
    },

    'Augmented seventh': function(note) {
      assert.deepEqual(note.interval('A7'), teoria.note('Ex'));
    },

    'Doubly diminished octave': function(note) {
      assert.deepEqual(note.interval('dd8'), teoria.note('Fb'));
    },

    'Diminished octave': function(note) {
      assert.deepEqual(note.interval('d8'), teoria.note('F'));
    },

    'Perfect octave': function(note) {
      assert.deepEqual(note.interval('P8'), teoria.note('F#'));
    },

    'Augmented octave': function(note) {
      assert.deepEqual(note.interval('A8'), teoria.note('Fx'));
    },

    'Minor ninth': function(note) {
      assert.deepEqual(note.interval('m9'), teoria.note('G'));
    },

    'Major ninth': function(note) {
      assert.deepEqual(note.interval('M9'), teoria.note('G#'));
    },

    'Minor tenth': function(note) {
      assert.deepEqual(note.interval('m10'), teoria.note('A'));
    },

    'Major tenth': function(note) {
      assert.deepEqual(note.interval('M10'), teoria.note('A#'));
    },

    'Perfect eleventh': function(note) {
      assert.deepEqual(note.interval('P11'), teoria.note('B'));
    },

    'Diminished twelfth': function(note) {
      assert.deepEqual(note.interval('d12'), teoria.note('c'));
    },

    'Perfect twelfth': function(note) {
      assert.deepEqual(note.interval('P12'), teoria.note('c#'));
    },

    'Minor thirteenth': function(note) {
      assert.deepEqual(note.interval('m13'), teoria.note('d'));
    },

    'Major thirteenth': function(note) {
      assert.deepEqual(note.interval('M13'), teoria.note('d#'));
    },

    'Minor fourteenth': function(note) {
      assert.deepEqual(note.interval('m14'), teoria.note('e'));
    },

    'Major fourteenth': function(note) {
      assert.deepEqual(note.interval('M14'), teoria.note('e#'));
    },

    'Doubly diminished second up': function() {
      assert.deepEqual(teoria.note('e').interval(teoria.note('fbb')),
          teoria.interval('dd2'));
    },

    'Doubly diminished second down': function() {
      assert.deepEqual(teoria.note('f').interval(teoria.note('ex')),
          teoria.interval('dd-2'));
    }
  },

  'Interval descending': {
    'A major third down from E4': function() {
      assert.deepEqual(teoria.note('E4').interval('M-3'), teoria.note('C4'));
    },

    'Minor second down from C2': function() {
      assert.deepEqual(teoria.note('C2').interval('m-2'), teoria.note('B1'));
    },

    'A diminished fifth down from Eb5': function() {
      assert.deepEqual(teoria.note('Eb5').interval('d-5'), teoria.note('A4'));
    },

    'A major ninth down from G#4': function() {
      assert.deepEqual(teoria.note('G#4').interval('M-9'), teoria.note('F#3'));
    },

    'An augmented sixth down from Bb4': function() {
      assert.deepEqual(teoria.note('Bb4').interval('A-6'), teoria.note('Dbb4'));
    }
  },

  'Interval inversions': {
    'Invert m2 is M7': function() {
      assert.equal(teoria.interval.invert('m2'), 'M7');
    },

    'Invert M2 is m7': function() {
      assert.equal(teoria.interval.invert('M2'), 'm7');
    },

    'Invert m3 is M6': function() {
      assert.equal(teoria.interval.invert('m3'), 'M6');
    },

    'Invert M3 is m6': function() {
      assert.equal(teoria.interval.invert('M3'), 'm6');
    },

    'Invert P4 is P5': function() {
      assert.equal(teoria.interval.invert('P4'), 'P5');
    },

    'Invert A5 is d4': function() {
      assert.equal(teoria.interval.invert('A5'), 'd4');
    }
  },

  'Interval base': {
    'Base of d5 is a fifth': function() {
      assert.equal(teoria.interval('d5').base(), 'fifth');
    },

    'Base of A7 is a seventh': function() {
      assert.equal(teoria.interval('A7').base(), 'seventh');
    },

    'Base of m2 is a second': function() {
      assert.equal(teoria.interval('m2').base(), 'second');
    },

    'Base of M6 is a sixth': function() {
      assert.equal(teoria.interval('M6').base(), 'sixth');
    },

    'Base of dd8 is an octave': function() {
      assert.equal(teoria.interval('dd8').base(), 'octave');
    },

    'Base of AA4 is a fourth': function() {
      assert.equal(teoria.interval('AA4').base(), 'fourth');
    },

    'Base of d-5 is a fifth': function() {
      assert.equal(teoria.interval('d-5').base(), 'fifth');
    },

    'Base of m-9 is a second': function() {
      assert.equal(teoria.interval('m-2').base(), 'second');
    },

    'Base of M-13 is a sixth': function() {
      assert.equal(teoria.interval('M-13').base(), 'sixth');
    },

    'Base of P-11 is a fourth': function() {
      assert.equal(teoria.interval('P-11').base(), 'fourth');
    },

    'Base of AA-7 is a seventh': function() {
      assert.equal(teoria.interval('AA-7').base(), 'seventh');
    }
  },

  'Compound Intervals': {
    'A major seventeenth is a compound interval': function() {
      assert.equal(teoria.interval('M17').isCompound(), true);
    },

    'A major seventeenth\'s simple part is a major third': function() {
      assert.equal(teoria.interval('M17').simple(), 'M3');
    },

    'A descending major fourteenth\'s simple part is a descending major seventh': function() {
      assert.equal(teoria.interval('M-14').simple(), 'M-7');
    },

    'A perfect nineteenth\'s simple part is equal to a perfect fifth': function() {
      assert.equal(teoria.interval('P19').simple().equal(teoria.interval('P5')), true);
    },

    'A perfect nineteenth\'s simple part is not equal to a major sixth': function() {
      assert.equal(teoria.interval('P19').simple().equal(teoria.interval('M6')), false);
    },

    'A descending augmented ninth\'s simple part is equal to a descending augmented second': function() {
      assert.equal(teoria.interval('A-9').simple().equal(teoria.interval('A-2')), true);
    },

    'A 22nd has two compound octaves': function() {
      assert.equal(teoria.interval('P22').octaves(), 2);
    },

    'A descending fourth has no compound octaves': function() {
      assert.equal(teoria.interval('P-4').octaves(), 0);
    },

    'A descending eleventh has one compound octave': function() {
      assert.equal(teoria.interval('P-11').octaves(), 1);
    },

    'A descending augmented third has no compound octaves': function() {
      assert.equal(teoria.interval('A-3').octaves(), 0);
    },

    'A descending major 16th has two compound octaves': function() {
      assert.equal(teoria.interval('M-16').octaves(), 2);
    },

    'A major seventh is greater than a minor seventh': function() {
      assert.equal(teoria.interval('M7').greater(teoria.interval('m7')), true);
    },

    'An augmented octave is smaller than a major ninth': function() {
      assert.equal(teoria.interval('A8').smaller(teoria.interval('M9')), true);
    },

    'A major third is equal to another major third': function() {
      assert.equal(teoria.interval('M3').equal(teoria.interval('M3')), true);
    },

    'An augmented fifth is not equal to a minor sixth': function() {
      assert.equal(teoria.interval('P5').equal(teoria.interval('m6')), false);
    },

    'A perfect fifth is not equal to a perfect octave': function() {
      assert.equal(teoria.interval('P5').equal(teoria.interval('P8')), false);
    },

    'The simple part of a major 23th is a major second': function() {
      assert.equal(teoria.interval('M23').simple(), 'M2');
    }
  },

  'Interval direction': {
    'A3 to C4 is up': function() {
      assert.equal(teoria.note('A3').interval(teoria.note('C4')).direction(), 'up');
    },

    'Bb5 to Bb5 is up (a unison is always up)': function() {
      assert.equal(teoria.note('Bb5').interval(teoria.note('Bb5')).direction(), 'up');
    },

    'G#4 to D4 is down': function() {
      assert.equal(teoria.note('G#4').interval(teoria.note('D4')).direction(), 'down');
    },

    'F6 to E6 is down': function() {
      assert.equal(teoria.note('F6').interval(teoria.note('E6')).direction(), 'down');
    },

    'C4 to A3 is up, w. direction set to up': function() {
      assert.equal(teoria.note('C4').interval(teoria.note('A3')).direction('up').direction(), 'up');
    },

    'A3 to C4 remains up w. direction set to up': function() {
      assert.equal(teoria.note('A3').interval(teoria.note('C4')).direction('up').direction(), 'up');
    },

    'm2 is up': function() {
      assert.equal(teoria.interval('m2').direction(), 'up');
    },

    'P11 is up': function() {
      assert.equal(teoria.interval('P11').direction(), 'up');
    },

    'P1 is up': function() {
      assert.equal(teoria.interval('P1').direction(), 'up');
    },

    'A1 is up': function() {
      assert.equal(teoria.interval('A1').direction(), 'up');
    },

    'd1 is up': function() {
      assert.equal(teoria.interval('d1').direction(), 'up');
    },

    'm-2 is down': function() {
      assert.equal(teoria.interval('m-2').direction(), 'down');
    },

    'M-17 is down': function() {
      assert.equal(teoria.interval('M-17').direction(), 'down');
    },

    'd-2 is down': function() {
      assert.equal(teoria.interval('d-2').direction(), 'down');
    },

    'dd-2 is down (although it is up)': function() {
      assert.equal(teoria.interval('dd-2').direction(), 'down');
    },

    'A-2 is down': function() {
      assert.equal(teoria.interval('A-2').direction(), 'down');
    },

    'd-1 is up (all unison values are up)': function() {
      assert.equal(teoria.interval('d-1').direction(), 'up');
    },

    'A-1 is up (all unison values are up)': function() {
      assert.equal(teoria.interval('A-1').direction(), 'up');
    }
  },

  'Interval arithmetic': {
    'm3 + M2 = P4': function() {
      assert.equal(addSimple('m3', 'M2').toString(), 'P4');
    },

    'P4 + P5 = P8': function() {
      assert.equal(addSimple('P4', 'P5').toString(), 'P8');
    },

    'M6 + A4 = A9': function() {
      assert.equal(addSimple('M6', 'A4').toString(), 'A9');
    },

    'M-2 + m-2 = m-3': function() {
      assert.equal(addSimple('M-2', 'm-2').toString(), 'm-3');
    },

    'A11 + M9 = A19': function() {
      assert.equal(addSimple('A11', 'M9').toString(), 'A19');
    },

    'm-10 + P4 = m-7': function() {
      assert.equal(addSimple('m-10', 'P4').toString(), 'm-7');
    }
  },

  'Theoretical intervals - Triple augmented': {
    topic: function() {
      return teoria.note('F').interval(teoria.note('Bx'));
    },

    'F to Bx has quality value = 3 (triple augmented)': function(interval) {
      assert.equal(interval.qualityValue(), 3);
    },

    '#simple() works': function(interval) {
      assert.deepEqual(interval.simple().coord, [-11, 20]);
    }
  }
}).export(module);

Added public/teoria-master/test/notes.js.







































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
var vows = require('vows'),
    assert = require('assert'),
    teoria = require('../');

vows.describe('TeoriaNote class').addBatch({
  'A4 - a\'': {
    topic: function() {
      return teoria.note('A4');
    },

    'Octave should be 4': function(note) {
      assert.equal(note.octave(), 4);
    },

    'Note name is lower case': function(note) {
      assert.equal(note.name(), 'a');
    },

    'A4 is the 49th piano key': function(note) {
      assert.equal(note.key(), 49);
    },

    'A4 is expressed a\' in Helmholtz notation': function(note) {
      assert.equal(note.helmholtz(), 'a\'');
    },

    'A4 is expressed A4 in scientific notation': function(note) {
      assert.equal(note.scientific(), 'A4');
    },

    'The frequency of A4 is 440hz': function(note) {
      assert.equal(note.fq(), 440);
    }
  },

  'C#5 - c#\'\'': {
    topic: function() {
      return teoria.note('c#\'\'');
    },

    'Octave should be 5': function(note) {
      assert.equal(note.octave(), 5);
    },

    'The name attribute of c# is just c': function(note) {
      assert.equal(note.name(), 'c');
    },

    'The accidental.sign attribute is #': function(note) {
      assert.equal(note.accidental(), '#');
    },

    'The accidental.value attribute is 1': function(note) {
      assert.equal(note.accidentalValue(), 1);
    },

    'C#5 is the 53rd piano key': function(note) {
      assert.equal(note.key(), 53);
    },

    'C#5 is c#\'\' in Helmholtz notation': function(note) {
      assert.equal(note.helmholtz(), 'c#\'\'');
    },

    'c#\'\' is C#5 in scientific notation': function(note) {
      assert.equal(note.scientific(), 'C#5');
    },

    'The frequency of C#5 is approximately 554.365': function(note) {
      assert.equal(note.fq(), 554.3652619537442);
    },

    'The interval between C#5 and A4 is a major third': function(note) {
      var a4 = teoria.note('A4');

      assert.deepEqual(note.interval(a4), teoria.interval('M-3'));
    },

    'The interval between C#5 and Eb6 is diminished tenth': function(note) {
      var eb6 = teoria.note('Eb6');

      assert.deepEqual(note.interval(eb6), teoria.interval('d10'));
    },

    'An diminished fifth away from C#5 is G5': function(note) {
      var g5 = teoria.note('G5');

      assert.deepEqual(note.interval('d5'), g5);
    },

    'The interval between C#4 and Db4 is a diminished second': function() {
      var cis4 = teoria.note('c#4');
      var db4 = teoria.note('db4');

      assert.deepEqual(cis4.interval(db4), teoria.interval('d2'));
    }
  },

  'Instantiate with coords': {
    '[0, 0] is A4': function() {
      assert.equal(teoria.note([0, 0]).scientific(), 'A4');
    },

    '[-4, 4] is C#3': function() {
      assert.equal(teoria.note([-4, 4]).scientific(), 'C#3');
    },

    '[3, -4] is F5': function() {
      assert.equal(teoria.note([3, -4]).scientific(), 'F5');
    },

    '[4, -7] is Ab4': function() {
      assert.equal(teoria.note([4, -7]).scientific(), 'Ab4');
    }
  },

  'Instantiate from key': {
    '#49 is A4': function() {
      assert.equal(teoria.note.fromKey(49).scientific(), 'A4');
    },

    '#20 is E2': function() {
      assert.equal(teoria.note.fromKey(20).scientific(), 'E2');
    },

    '#57 is F5': function() {
      assert.equal(teoria.note.fromKey(57).scientific(), 'F5');
    },

    '#72 is G#6': function() {
      assert.equal(teoria.note.fromKey(72).scientific(), 'G#6');
    }
  },

  'Instantiate from frequency': {
    '391.995Hz is G4': function() {
      assert.equal(teoria.note.fromFrequency(391.995).note.scientific(), 'G4');
    },

    '220.000Hz is A3': function() {
      assert.equal(teoria.note.fromFrequency(220.000).note.scientific(), 'A3');
    },

    '155.563Hz is Eb3': function() {
      assert.equal(teoria.note.fromFrequency(155.563).note.scientific(), 'Eb3');
    },

    '2959.96Hz is F#7': function() {
      assert.equal(teoria.note.fromFrequency(2959.96).note.scientific(), 'F#7');
    }
  },

  'Instantiate from MIDI': {
    'MIDI#36 is C2': function() {
      assert.equal(teoria.note.fromMIDI(36).scientific(), 'C2');
    },

    'MIDI#77 is F5': function() {
      assert.equal(teoria.note.fromMIDI(77).scientific(), 'F5');
    },

    'MIDI#61 is Db4': function() {
      assert.equal(teoria.note.fromMIDI(61).scientific(), 'Db4');
    },

    'MIDI#80 is G#5': function() {
      assert.equal(teoria.note.fromMIDI(80).scientific(), 'G#5');
    }
  },

  'Return MIDI note number': {
    'MIDI#36 is C2': function() {
      assert.equal(teoria.note('C2').midi(), 36);
    },

    'MIDI#77 is F5': function() {
      assert.equal(teoria.note('F5').midi(), 77);
    },

    'MIDI#61 is Db4': function() {
      assert.equal(teoria.note('Db4').midi(), 61);
    },

    'MIDI#80 is G#5': function() {
      assert.equal(teoria.note('G#5').midi(), 80);
    }
  },

  'Chroma': {
    'C has chroma 0': function() {
      assert.equal(teoria.note('c').chroma(), 0);
    },

    'C# has chroma 1': function() {
      assert.equal(teoria.note('c#').chroma(), 1);
    },

    'B has chroma 11': function() {
      assert.equal(teoria.note('b').chroma(), 11);
    },

    'Db has chroma 1': function() {
      assert.equal(teoria.note('db').chroma(), 1);
    },

    'Dbb has chroma 0': function() {
      assert.equal(teoria.note('dbb').chroma(), 0);
    },

    'E has chroma 4': function() {
      assert.equal(teoria.note('e').chroma(), 4);
    },

    'F has chroma 5': function() {
      assert.equal(teoria.note('f').chroma(), 5);
    },

    'Fb has chroma 4': function() {
      assert.equal(teoria.note('fb').chroma(), 4);
    },

    'H# has chroma 0': function() {
      assert.equal(teoria.note('h#').chroma(), 0);
    },

    'Bx has chroma 1': function() {
      assert.equal(teoria.note('bx').chroma(), 1);
    },

    'Cbb has chroma 10': function() {
      assert.equal(teoria.note('cbb').chroma(), 10);
    }
  },

  'Scale Degrees': {
    'Eb is scale degree 1 (tonic) in an Eb minor scale': function() {
      var note = teoria.note('eb');
      assert.equal(note.scaleDegree(teoria.scale('eb', 'major')), 1);
    },

    'E is scale degree 3 in a C# dorian': function() {
      var note = teoria.note('e');
      assert.equal(note.scaleDegree(teoria.scale('c#', 'dorian')), 3);
    },

    'C is scale degree 0 in a D major scale (not in scale)': function() {
      var note = teoria.note('c');
      assert.equal(note.scaleDegree(teoria.scale('d', 'major')), 0);
    },

    'Bb is scale degree 7 in a C minor': function() {
      var note = teoria.note('bb');
      assert.equal(note.scaleDegree(teoria.scale('c', 'minor')), 7);
    },
    
    'Db is scale degree 4 in an Ab major scale': function() {
      var note = teoria.note('db');
      assert.equal(note.scaleDegree(teoria.scale('ab', 'major')), 4);
    },

    'A# is scale degree 0 in a G minor scale': function() {
      var note = teoria.note('a#');
      assert.equal(note.scaleDegree(teoria.scale('g', 'minor')), 0);
    }
  },

  'Enharmonics': {
    'c is enharmonic with dbb and b#': function() {
      assert.deepEqual(teoria.note('c4').enharmonics(),
        ['dbb4', 'b#3'].map(teoria.note));
    },

    'fb is enharmonic with e and dx': function() {
      assert.deepEqual(teoria.note('fb4').enharmonics(),
        ['e4', 'dx4'].map(teoria.note));
    },

    'cb is enharmonic with ax and b': function() {
      assert.deepEqual(teoria.note('cb4').enharmonics(),
        ['b3', 'ax3'].map(teoria.note));
    }
  },

  'Enharmonics with only one accidental': {
    'c is enharmonic with b#': function() {
      assert.deepEqual(teoria.note('c4').enharmonics(true),
        ['b#3'].map(teoria.note));
    },

    'fb is enharmonic with e': function() {
      assert.deepEqual(teoria.note('fb4').enharmonics(true),
        ['e4'].map(teoria.note));
    },

    'cb is enharmonic with b': function() {
      assert.deepEqual(teoria.note('cb4').enharmonics(true),
        ['b3'].map(teoria.note));
    }
  },

  'copy duration on interval': {
    'stay whole note on call interval': function() {
      var note = teoria.note('a#', { duration: 1 });
      assert.equal(note.duration.value, note.interval('P5').duration.value);
    }
  }
}).export(module);

Added public/teoria-master/test/scales.js.

























































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var vows = require('vows'),
    assert = require('assert'),
    teoria = require('../');

vows.describe('Scales').addBatch({
  'Ab2': {
    topic: function() {
      return teoria.note('Ab2');
    },

    'Blues': function(note) {
      assert.deepEqual(teoria.note('g#').scale('blues').simple(),
          ['g#', 'b', 'c#', 'd', 'd#', 'f#']);
    },

    'Ionian/Major': function(note) {
      assert.deepEqual(note.scale('ionian').simple(),
          ['ab', 'bb', 'c', 'db', 'eb', 'f', 'g']);
    },

    'Dorian': function(note) {
      assert.deepEqual(note.scale('dorian').simple(),
          ['ab', 'bb', 'cb', 'db', 'eb', 'f', 'gb']);
    },

    'Phrygian': function(note) {
      assert.deepEqual(note.scale('phrygian').simple(),
          ["ab", "bbb", "cb", "db", "eb", "fb", "gb"]);
    },

    'Lydian': function(note) {
      assert.deepEqual(note.scale('lydian').simple(),
          ["ab", "bb", "c", "d", "eb", "f", "g"]);
    },

    'Mixolydian': function(note) {
      assert.deepEqual(note.scale('mixolydian').simple(),
          ["ab", "bb", "c", "db", "eb", "f", "gb"]);
    },

    'Aeolian/Minor': function(note) {
      assert.deepEqual(note.scale('aeolian').simple(),
          ["ab", "bb", "cb", "db", "eb", "fb", "gb"]);
    },

    'Locrian': function(note) {
      assert.deepEqual(note.scale('locrian').simple(),
          ["ab", "bbb", "cb", "db", "ebb", "fb", "gb"]);
    },

    'Major Pentatonic': function(note) {
      assert.deepEqual(note.scale('majorpentatonic').simple(),
          ["ab", "bb", "c", "eb", "f"]);
    },

    'Minor Pentatonic': function(note) {
      assert.deepEqual(note.scale('minorpentatonic').simple(),
          ["ab", "cb", "db", "eb", "gb"]);
    },

    'Chromatic': function(note) {
      assert.deepEqual(note.scale('chromatic').simple(),
          ["ab", "bbb", "bb", "cb", "c", "db",
           "d", "eb", "fb", "f", "gb", "g"]);
    },

    'Whole Tone': function(note) {
      assert.deepEqual(teoria.note('c').scale('wholetone').simple(),
        ["c", "d", "e", "f#", "g#", "a#"]);
    }
  },

  'Is the #get() method octave-relative (pentatonic)?': {
    topic: function(){
      return teoria.note('Bb3').scale('majorpentatonic');
    },
    
    'Gets notes w/in octave': function(topic){
      assert.deepEqual(topic.get(3), teoria.note('D4'));
    },

    'Gets notes above octave': function(topic){
      assert.deepEqual(topic.get(12), teoria.note('C6'));
    },

    'Gets notes below octave': function(topic){
      assert.deepEqual(topic.get(-12), teoria.note('D1'));
    },
  },

  'Is the #get() method octave-relative (diatonic)': {
    topic: function() {
      return teoria.note('A4').scale('major');
    },

    '0 is one note down': function(topic) {
      assert.deepEqual(topic.get(0), teoria.note('G#4'));
    },

    '7 is one seventh up': function(topic) {
      assert.deepEqual(topic.get(7), teoria.note('G#5'));
    },

    '8 is one octave up': function(topic) {
      assert.deepEqual(topic.get(8), teoria.note('A5'));
    },

    '9 is one ninth up': function(topic) {
      assert.deepEqual(topic.get(9), teoria.note('B5'));
    },

    '-5 is one seventh down': function(topic) {
      assert.deepEqual(topic.get(-5), teoria.note('B3'));
    },

    '-6 is one octave down': function(topic) {
      assert.deepEqual(topic.get(-6), teoria.note('A3'));
    },

    '-13 is two octaves down': function(topic) {
      assert.deepEqual(topic.get(-13), teoria.note('A2'));
    }
  }
}).export(module);

Added public/teoria-master/test/solfege.js.

































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
var vows = require('vows'),
    assert = require('assert'),
    teoria = require('../');

vows.describe('Solfege').addBatch({
  'C in C minor': function() {
    var note = teoria.note('c');
    assert.equal(note.solfege(teoria.scale(note, 'minor')), 'do');
  },

  'A in d major': function() {
    var note = teoria.note('a');
    var tonic = teoria.note('d');
    assert.equal(note.solfege(teoria.scale(tonic, 'major')), 'so');
  },

  'F# in B major': function() {
    var note = teoria.note('f#');
    var tonic = teoria.note('B');
    assert.equal(note.solfege(teoria.scale(tonic, 'major')), 'so');
  },

  'C4 in C4 minor': function() {
    var note = teoria.note('c4');
    var scale = teoria.scale(note, 'minor');
    assert.equal(note.solfege(scale, true), 'do');
  },

  'A3 in D4 major': function() {
    var note = teoria.note('a3');
    var scale = teoria.scale('d4', 'major');
    assert.equal(note.solfege(scale, true), 'so,');
  },

  'F#6 in B5 major': function() {
    var note = teoria.note('f#6');
    var scale = teoria.scale('b5', 'major');
    assert.equal(note.solfege(scale, true), 'so');
  },

  'F2 in E6 phrygian': function() {
    var note = teoria.note('f2');
    var scale = teoria.scale('e6', 'phrygian');
    assert.equal(note.solfege(scale, true), 'ra,,,,');
  },

  'Eb10 in E8 dorian': function() {
    var note = teoria.note('eb10');
    var scale = teoria.scale('e8', 'dorian');
    assert.equal(note.solfege(scale, true), 'de\'\'');
  },

  'A#6 in Bb4 locrian': function() {
    var note = teoria.note('A#6');
    var scale = teoria.scale('Bb4', 'locrian');
    assert.equal(note.solfege(scale, true), 'tai\'');
  },

  'E2 in C3 major': function() {
    var note = teoria.note('e2');
    var scale = teoria.scale('c3', 'major');
    assert.equal(note.solfege(scale, true), 'mi,');
  }
}).export(module);

Added public/tune.js.

cannot compute difference between binary files

Added requirements.txt.































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
aiofiles==0.6.0
alabaster==0.7.12
appdirs==1.4.4
appnope==0.1.2
astor==0.8.1
astroid==2.5.6
asttokens==2.0.5
attrs==21.2.0
Babel==2.9.1
backcall==0.2.0
beautifulsoup4==4.9.3
black==21.5b1
certifi==2020.12.5
chardet==4.0.0
click==7.1.2
cogapp==3.0.0
colorama==0.4.4
decorator==5.0.7
dialite==0.5.3
docutils==0.16
flexx==0.8.1
funcparserlib==0.3.6
furo==2021.4.11b34
httptools==0.2.0
hy==0.20.0
idna==2.10
imagesize==1.2.0
ipdb==0.13.7
ipython==7.22.0
ipython-genutils==0.2.0
isort==5.8.0
jedi==0.18.0
Jinja2==2.11.3
jsonschema==3.2.0
jupyter-core==4.7.1
lazy-object-proxy==1.6.0
leo==6.3
Mako==1.1.4
markdown-it-py==1.1.0
MarkupSafe==1.1.1
mccabe==0.6.1
mdit-py-plugins==0.2.8
meta==1.0.2
multidict==5.1.0
mypy-extensions==0.4.3
myst-parser==0.14.0
nbformat==5.1.3
packaging==20.9
parso==0.8.2
pathspec==0.8.1
pexpect==4.8.0
pickleshare==0.7.5
prompt-toolkit==3.0.18
pscript==0.7.5
ptyprocess==0.7.0
pydata-sphinx-theme==0.6.3
pyflakes==2.3.1
Pygments==2.8.1
pylint==2.8.2
pyparsing==2.4.7
PyQt5==5.15.4
PyQt5-Qt5==5.15.2
PyQt5-sip==12.8.1
PyQtWebEngine==5.15.4
PyQtWebEngine-Qt5==5.15.2
pyrsistent==0.17.3
pyshortcuts==1.8.0
pytz==2021.1
PyYAML==5.4.1
regex==2021.4.4
requests==2.25.1
rply==0.7.8
sanic==21.3.4
sanic-routing==0.6.2
six==1.16.0
snowballstemmer==2.1.0
soupsieve==2.2.1
Sphinx==3.5.4
sphinx-book-theme==0.1.1
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==1.0.3
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.4
toml==0.10.2
tornado==6.1
traitlets==5.0.5
ujson==4.0.2
urllib3==1.26.4
uvloop==0.15.2
wcwidth==0.2.5
webruntime==0.5.8
websockets==8.1
wrapt==1.12.1

Added source/Makefile.









































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS    ?=
SPHINXBUILD   ?= sphinx-build
SOURCEDIR     = .
BUILDDIR      = _build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

Added source/_static/analytics.js.







>
>
>
1
2
3
window.goatcounter = {
    path: function(p) { return location.host + p }
}

Added source/_static/custom.css.







>
>
>
1
2
3
.custom-nav-footer {
    margin-top: 8em;
}

Added source/bookmarks.md.









































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# Bookmarks

## WebAudio

<http://blog.mecheye.net/2017/09/i-dont-know-who-the-web-audio-api-is-designed-for/>  
<https://joshondesign.com/p/books/canvasdeepdive/chapter12.html>  
<https://robert.ocallahan.org/2017/09/some-opinions-on-history-of-web-audio.html>  
<https://webaudioapi.com/book/Web_Audio_API_Boris_Smus.pdf>  

<https://web.noom.com/company-blog/2015/08/cooking-is-like-programming/>  

<https://github.com/ideoforms/isobar>  
<https://github.com/tmhglnd/mercury/blob/master/docs/reference.md>  
<https://foxdot.org/docs/pattern-functions/>  
<https://faustdoc.grame.fr/>  

## Obsevers

<https://github.com/rsimmons/plinth>  
<https://github.com/gullerya/object-observer>  
<https://awesomeopensource.com/project/nx-js/observer-util>  
<https://doc.esdoc.org/github.com/jstoolkit/dom-observer/>  
<https://github.com/tannerntannern/micro-observer>  
<https://github.com/colxi/deep-observer>  
<https://www.npmjs.com/package/observe>  
<https://www.vertexshaderart.com/new/>  

## Visuals

<https://compform.net/turtles/>  
<https://github.com/capnmidnight/Primrose>  

The code editor borrows some CSS styles from this project 
<https://github.com/htor/repeat-editor>  

## Inspiration

<http://wavepot.com/>  
<https://glicol.web.app/>  
<http://charlie-roberts.com/gibber/>  
<https://tweakable.org/> 
  
## Misc

<https://ccrma.stanford.edu/~blackrse/algorithm.html>   
<https://oeis.org/>  
<https://www.cs.cmu.edu/~music/cmsip/readings/MIDI%20tutorial%20for%20programmers.html>
<https://en.wikipedia.org/wiki/Computational_creativity>  
<https://en.wikipedia.org/wiki/Algorithmic_composition>  



Added source/changelog.md.











































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Changelog

June - July 2019 ~ First prototype  

    Eval, tone.js and an checkoxbased input visualization for rhythm

Feb ~ May 2021 ~ Second Prototype  

```
    Save feature
    Added Samples
    Moving to riot javascript
    Fix for not mounting
    Refactoring codebase
    Added sphinx
    Added number and monitoring for knob
    Added clock
    Changed Theme
    Visuals
    Observers and Misc Libraries
    New sections
    Fix for crackling
    Docs
```

June - July 2021 - Demo

```
    Theme changes
    Lots of Docs
    Tutorials
    Working visuals
    Code Mirror Issue
```



Added source/common.py.























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
external_libraries = """
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/tensorflow/1.2.8/tf.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@magenta/music@^1.0.0/es6/core.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@magenta/music@^1.0.0/es6/music_vae.js"></script>

<script sec="https://mohayonao.github.io/timbre.js/timbre.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tunajs/1.0.1/tuna-min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tone/14.7.77/Tone.js" integrity="sha512-gwSDP1iEKl4KG0wi3N89RAJU91s78jb/TGC6lsbF5IyR2c19Rn7Jl1icK4K4kUiJNwQUEPI7o98T+GJVWNuvIQ==" crossorigin="anonymous"></script>
<script src="/teoria-master/teoria.js"></script>

<script src="https://cdn.jsdelivr.net/npm/p5@1.3.1/lib/p5.js"></script>
<script src="https://cdn.jsdelivr.net/npm/d3@5.7.0/dist/d3.min.js"></script>
<script src="https://threejs.org/build/three.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.12.11/paper-full.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/butterchurn@2.6.7/lib/butterchurn.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/butterchurn-presets@2.4.7/lib/butterchurnPresets.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/webmidi@2.0.0"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="/nexus-js/dist/NexusUI.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/cellx/1.10.19/cellx.umd.min.js" integrity="sha512-ojEcAP3e6N+n5MDKPW6CexXzuLDahDPkNZmzyRV4t2zqh9nwljJNuV8JGa+xjpnAaGB/FhsAU7P6IHEP0dtJQA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
"""

Added source/conf.py.































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html

# -- Path setup --------------------------------------------------------------

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))


# -- Project information -----------------------------------------------------

project = 'Bitrhythm'
copyright = '(c) Xyzzy Apps, 2021'
author = 'Xyzzy Apps'
master_doc = "index"


# -- General configuration ---------------------------------------------------

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = ['myst_parser', 'sphinx.ext.todo']
todo_include_todos = True

source_suffix = ['.rst', '.md']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']


# -- Options for HTML output -------------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_book_theme'
html_title = "Bitrhythm's literate documentation"

html_theme_options = {
    "use_fullscreen_button": True,
    "single_page": False,
    "use_download_button": False,
    "home_page_in_toc": False,
    "extra_navbar": """
<a target="_blank" href="/">Bitrhythm App Home</a><br>
<a target="_blank" href="https://xyzzyapps.link">Xyzzy Apps Home</a><br>
<p class='custom-nav-footer'>(c) Xyzzy Apps, 2021</p>
"""
}

html_sidebars = {
   "**": ["sidebar-logo.html", "sbt-sidebar-nav.html", "sbt-sidebar-footer.html"]
}

html_show_sphinx = False
html_show_sourcelink = False

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
html_js_files = [
        'analytics.js',
        ('https://analytics.xyzzyapps.link/count.js', {'data-goatcounter': "https://analytics.xyzzyapps.link/count", 'async': "async"}),
    ]
html_css_files = ["custom.css"]

Added source/demo.md.























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
# Demo and Tutorial

## Video

<iframe width="560" height="315" src="https://www.youtube.com/embed/GTfmTMrSpag" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Postprocessed using Reaper with EQ and Surround effects to add some sparkle.
Video is recorded with the help of Blackhole and Kap and rendered by Reaper.

Samples taken from Deep Techno and Dub Techno collections from splice. Sadly I can't distribute the song itself as I would also have to distribute the samples with it.  

## Demo Song 1 // Techno

Code for the Demo Song. The visualisation was disabled in the Demo as it was causing a huge lag while recording on both windows and mac.

```
volume_guard1 = guard([-20,15])
volume_guard2 = guard([-20,15])
Tone.Master.volume.value = volume_guard1(Math.round(dials[0]["cell"]() * 30) -20);
 //mem["stab_channel"].volume.value = volume_guard2(-2);
 //mem["stab_filter"].frequency.value = Math.round(dials[1]["cell"]() * 10000);
//mem["l_filter"].frequency.value = Math.round(dials[1]["cell"]() * 1000);


scene1 = [
    cellx("p 1000 1000 1000 1000"),
    cellx("p x000 0000 0000 0000"),
    cellx("p 0x00 0000 0x00 x000"),
    cellx("p 0000 x000 0000 x000"),
    cellx("p x000 00x0 0x00 x0xx"),
    cellx("p 00x0 00x0 0000 00x0"),
    cellx("p 00x0 00x0 00x0 00x0"),
]

patterns = scene1

always();

function Sample(name, no, filter, volume) {
    name = name
    filter = filter || 10000
    volume = volume || 0
    mem[name + "_filter"] = new Tone.Filter(filter, 'lowpass', -96);
    mem[name + "_channel"] = new Tone.Channel({channelCount: 2, volume: volume}).chain(mem[name + "_filter"], mem.master)
    samples[no].connect(mem[name + "_channel"]);
}

function p(s, note, len) {
    note = note || "C3"
    len = len || "16n"
    samples[s].triggerAttackRelease(note, len, time);
}

function once () {
    
	var vis = initWinamp("Cope - The Neverending Explosion of Red Liquid Fire");
    render_loop = function () {
       vis.render();
    }

    Tone.Master.volume.value = -30
    mem.master = new Tone.Channel({channelCount: 2, volume: -10}).chain(Tone.Destination);

    Sample("k", 0, 20000, 5);
    Sample("h", 1, 20000, -5);
    Sample("sn",2, 6000, -3);
    Sample("c", 3, 1200, -10);
    Sample("stab", 4, 420, 10);
    Sample("l", 5, 20000, 8);
    Sample("o", 6, 20000, -8);


    handlers["1"] = function (val) {
        if (val > 0.5) {
            mem["start_snare"] = true;
        }
    }

    dials[1]["cell"].onChange(function (e) {
        var val = parseFloat(e["data"].value);
        handlers["1"](val);
    })

}

function tweak () {
	mem.k1 = knob({initial : 0.42, ramp : [0.42, 0.525, 0.8, 0.4, 1, 0.65, 0.75, 1, 0.8], "number": dials[2]["cell"] });
    always = function () {
        mem["stab_filter"].frequency.value = mem.k1.move() * 1000;
    }
}

function sampleTest () {
    Sample("l", 4, 10000, -5);

}

if (bars <= 3 ) {
	transition = once;
} else {
	transition = tweak;
}

if (isHit) {
    if (track_no == 1) {
   		 if (bars > 4 ) {
       		 p(0);
        }
    }
    if (track_no == 2) {
        if (bars > 8 ) {
       	 	p(1,  "C3", "1n");
        }	
    }
    if (track_no == 3) {
        if (bars > 0 ) {
    		p(4, "C3", "1n");
        }
        if (bars == 15) {
        	transition();
        }
    }
    if (track_no == 4) {
		  if( mem["start_snare"]) {
           p(2);
        }
 
    }
    if (track_no == 5) {
    }
    if (track_no == 6) {
       if (bars > 12) {
	       p(5, "F2", "16n")
       } 
    }
	if (track_no == 7) {
       if (bars > 48) {

     		p(6, "C3", "48n")
       }
    }

}
```


## Example1

This illustrates the core concepts of bitrhythm.

1. Samples (Tone.Sampler)
2. Dials (use cellx internally)
3. Observers (cellx)

See <https://tonejs.github.io/> for more notes.

For an understanding of the global variables see the concepts and code walkthrough section.

    - patterns and track_no
    - isHit, current_bit
    - samples
    - Tone
    - cellx
    - window and any thing included with the script tag is available here

`mem` is short for memory. All instruments and effects are saved here so that they can be accessed everywhere.

Step to create the basic song.

1. Click on `Add Sample URL` to add the following URLs

    - /Kick01.wav
    - /Snare19.wav
    - /Closedhat01.wav
    - /MiscSynthStab04.wav

2. Click on `Add Dial`

3. Enter the following into the window

```
scene1 = [
    cellx("p 1000 1000 1000 1000"),
    cellx("p 00x0 00x0 00x0 00x0"),
    cellx("p 0000 x000 0000 x000"),
]

scene2 = [
    cellx("p 1011 1001 1000 1000"),
    cellx("p 00x0 00x0 00x0 00x0"),
    cellx("p 0000 x000 0000 x000"),
]

patterns = scene1

function Sample(name, no) {
    name = name || "sample"
    name += no
    mem[name + "_filter"] = new Tone.Filter(10000, 'lowpass', -96);
    mem[name + "_channel"] = new Tone.Channel({channelCount: 2, volume:0}).chain(mem[name + "_filter"], mem.master)
    samples[no].connect(mem[name + "_channel"]);
}

function p(s, note) {
    note = note || "C3"
    samples[s].triggerAttack(note, time);
}

var once = function () {
    Tone.Master.volume.value = -30
    mem.master = new Tone.Channel({channelCount: 2, volume: -10}).chain( Tone.Destination);
    mem.volume_guard = guard([-20,-10]);

    Sample("k", 0);
    Sample("h", 1);
    Sample("sn", 2);

    handlers["ex"] = function (val) {
        if (val > 0.5) {
            mem["start_snare"] = true;
        }
    }

    dials[0]["cell"].onChange(function (e) {
        var val = parseFloat(e["data"].value);
        handlers["ex"](val);
    })

}

if (bars <= 3 ) {
	transition = once;
} else {
	transition = tweak;
}

if (isHit) {
    if (track_no == 1) {
        p(0);
    }
    if (track_no == 2) {
        p(1);
    }
    if (track_no == 3) {
		if (mem["start_snare"]) {
            p(2);
        };
    }
}


```

Now try changing the code.

```
patterns = scene2
```

Increase the dial to see the addition of the snare. This is how you can use observers to trigger unrelated changes. I call them sideevents, as the logic is similar to sidechain, which typically observers the volume.

Comment and Uncomment lines in the `if (isHit)` block. To mute and unmute sections.

*Note:* `mem["k0_channel"].solo = true;` is not working.

**Visuals**

Change the once function to this and click `+ Execute Once`

Code is taken from butterchurn. Try changing [presets](https://butterchurnviz.com/) to get different visuals.

```
var tweak = function() {
    var can = document.getElementById("visual");
    var can_container = document.getElementById("canvas-container");
    can.width = window.innerWidth;
    can.height = window.innerHeight;
    can_container.width = window.innerWidth;
    window.visualizer = window.butterchurn.default.createVisualizer(Tone.getContext().rawContext, can, {
        width: window.innerWidth,
        height: window.innerHeight,
    });
    window.visualizer.connectAudio(Tone.getContext().destination);
    const presets = butterchurnPresets.getPresets();
    const preset = presets["_Aderrasi - Wanderer in Curved Space - mash0000 - faclempt kibitzing meshuggana schmaltz (Geiss color mix)"]
    window.visualizer.loadPreset(preset, 0.0); // 2nd argument is the number of seconds to blend presets

    render_loop = function () {
        window.visualizer.render();
    }
}
```

**Tweaking**

First click `+ Number`. This is useful to check if the knob function is actually working. And click `+ Execute Once`

```
var tweak = function () {
    mem.k1 = knob({ramp : [0.09,1.8, 0.4, 2, 1.5, 1, 0.5, 3, 5, 8, 2], "number": numbers[0]["v"] });
    always = function () {
        mem["k0_filter"].frequency.value = mem.k1.move() * 1000;
    }
}
```

As you can sere numbers and dials will be available as a global array.

There is no way to remove them so be careful about the order in which you add them.

The following code will always be executed as its at the top level. As you can see this code implies that the first dial is connected to the master volume. Use guards to avoid going deaf as sometimes editing can created bad frequency numbers.

```
Tone.Master.volume.value = volume_guard((1 - dials[0]["cell"]()) * -30);
```

## Example2

- Kick + Filter
- Snare + Filter
- Snare + Filter + Delay
- High Hat
- Lead + Filter
- Dub Stab + Filter + Reverb

Tip: In Tone.js you can't call connect one after another, you need to use chain.

TODO: Add glide to Lead to make it more 303 sounding

Master is connected with Surround and Volume Limiter.
Use Gates and Limiters to avoid going deaf.

Tone.MultiInstrument gave lots of glitches, so custom voices are written in the voice function

Channels provide
- Mute
- Solo

More improvements for the Stab

    - Chorus or Phaser
    - Compressor
    - Decay in envelope
    - Separate filters
    - EQ
    - Sends for more delay
    - LFO for filters


Freeverb does not work and also needs Mono to function properly

```
var reverb = new Tone.Freeverb().toDestination();
var reverb_mono = new Tone.Mono().connect(reverb);
reverb.dampening = 100;
reverb.roomSize = 0.9;
```

## Full Code

```
volume_guard1 = guard([-20,15])
volume_guard2 = guard([-20,15])
Tone.Master.volume.value = volume_guard1(Math.round(dials[0]["cell"]() * 30) -20);
 //mem["stab_channel"].volume.value = volume_guard2(-2);
// mem["stab_filter"].frequency.value = Math.round(dials[1]["cell"]() * 10000);
// mem["l_filter"].frequency.value = Math.round(dials[1]["cell"]() * 1000);


scene1 = [
    cellx("p 1000 1000 1000 1000"),
    cellx("p 00x0 00x0 00x0 00x0"),
    cellx("p 0x00 0000 0000 x000"),
    cellx("p 0000 x000 0000 x000"),
    cellx("p xx0x x0x0 x0x0 0xxx"),
    cellx("p x000 x0x0 0000 x0x0"),
]

patterns = scene1

always();

function NoiseSynth (name) {
    name = name || "wf";
    mem[name + "_stereo"] = new Tone.StereoWidener({width: 1});
    mem[name] =  new Tone.Noise("pink").start();
    mem[name + "_filter"] = new Tone.Filter(400, 'lowpass', -96);
    mem[name + "_channel"] = new Tone.Channel({channelCount: 2, volume: -10, pan: -0.8}).chain(mem[name + "_filter"], mem[name + "_stereo"], mem.master);
    mem[name].connect(mem[name + "_channel"])
}


function Sample(name, no, filter, volume) {
    name = name
    filter = filter || 10000
    volume = volume || 0
    mem[name + "_filter"] = new Tone.Filter(filter, 'lowpass', -96);
    mem[name + "_channel"] = new Tone.Channel({channelCount: 2, volume: volume}).chain(mem[name + "_filter"], mem.master)
    samples[no].connect(mem[name + "_channel"]);
}

function Stab(name) {
    name = name || "stab";

    mem[name + "_filter"] = new Tone.Filter(5250, 'lowpass', -96);
    mem[name + "_hfilter"] = new Tone.Filter(80, 'highpass', -96);
    mem[name + "_reverb"] = new Tone.Reverb(0.1);
    mem[name + "_delay"] = new Tone.FeedbackDelay("4n", 0.4);
    // mem[name + "_pdelay"] = new Tone.PingPongDelay("2n", 0.1);
     mem[name + "_stereo"] = new Tone.StereoWidener({width: 0.25});
     mem[name + "_channel"] = new Tone.Channel({channelCount: 2, volume: -2}).chain(mem[name + "_filter"] ,   mem[name + "_delay"], mem[name + "_reverb"],  mem[name + "_hfilter"] ,mem[name + "_stereo"], mem.master)


    function voice(no, type) {
        mem[name + "_synth" + no] = new Tone.MonoSynth({
            oscillator: {
                type: type
            }
        })
        mem[name + "_synth" + no].connect(mem[name + "_channel"]);
    }

    voice(1, "sawtooth")
    voice(2, "sawtooth")
    voice(3, "sawtooth")
    voice(4, "pwm")
    voice(5, "pwm")
    voice(6, "pwm")
}


function p(s, note, len) {
    note = note || "C3"
    len = len || "16n"
    samples[s].triggerAttackRelease(note, len, time);
}


function s(vel, notes, duration) {
    vel = vel || 1.0;
    duration = duration || "2n";
    notes = notes ||  ["E2", "B2", "G2"];
    mem["stab_synth1"].triggerAttackRelease(notes[0], duration, time, vel);
    mem["stab_synth2"].triggerAttackRelease(notes[1], duration, time, vel);
    mem["stab_synth3"].triggerAttackRelease(notes[2], duration, time, vel);

    mem["stab_synth4"].triggerAttackRelease(notes[0], duration, time, vel);
    mem["stab_synth5"].triggerAttackRelease(notes[1], duration, time, vel);
   mem["stab_synth6"].triggerAttackRelease(notes[2], duration, time, vel);
}




function once () {
    
	// var vis = initWinamp("Unchained - Rewop");
    render_loop = function () {
       // vis.render();
    }

    Tone.Master.volume.value = -30
    mem.master = new Tone.Channel({channelCount: 2, volume: -10}).chain(Tone.Destination);

    // NoiseSynth();
    Stab();
    Sample("k", 0, 3000, 3);
    Sample("h", 1, 7000, -15);
    Sample("sn",2, 6000, -15);
    Sample("c", 3, 800, -10);
    Sample("l", 4, 420, -15);


    handlers["1"] = function (val) {
        if (val > 0.5) {
            mem["start_snare"] = true;
        } else {
            mem["start_snare"] = false;
        }
        mem["stab_filter"].Q.value = Math.round(val * 5);
    }

    dials[1]["cell"].onChange(function (e) {
        var val = parseFloat(e["data"].value);
        handlers["1"](val);
    })
    
    

}


function tweak () {
	mem.k1 = knob({ramp : [0.525, 0.8, 0.4, 1, 0.25, 0.75, 1, 0.25, 0.1], "number": dials[2]["cell"] });
    always = function () {
        mem["stab_filter"].frequency.value = mem.k1.move() * 10000;
    }
}




function sampleTest () {
    Sample("l", 4, 10000, -5);

}



if (bars <= 3 ) {
	transition = once;
} else {
	transition = tweak;
}

if (isHit) {
    if (track_no == 1) {
   		 if (bars > 0 ) {
       		 p(0);
        }
    }
    if (track_no == 2) {
        if (bars > 8 ) {
       	 	p(1);
        }	
    }
    if (track_no == 3) {
        if (bars > 4 ) {
    		s();
        }
        if (bars == 6) {
        	transition();
        }
    }
    if (track_no == 4) {
        // Uncomment for snare
      //  if (mem["start_snare"]) {
            p(2);
      //  }

    }
    if (track_no == 5) {
         if (bars > 12) {
	  		p(3)
        }
       // a();
    }
    if (track_no == 6) {
      // p(4, "B3", "8n")
    }

}
```


Added source/early-attempts.md.

















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# Early Attempts

My first attempt at this project was called bang256 ~ 2016, meant to mess with Renoise's OSC. Its still usable.

The music loop for OSC sequencing. You need to install osc and nanotimer. Alternatively you can use portmidi

```
var fs = require("fs");
var osc = require("osc");
var NanoTimer = require('nanotimer');
var timer = new NanoTimer();

function bang256(host, port, tempo, lines_per_beat, measure, tracks, title) {

    var udpPort = new osc.UDPPort({
        remoteAddress: host,
        remotePort: port
    });

    udpPort.open();

    var beat = 60.0 / tempo;
    var lines_per_measure = lines_per_beat * measure;
    var tick = beat / lines_per_beat;
    var bangs = 0;
    var count = 0;

    timer.setInterval(function() {
        var bang = (bangs % lines_per_measure);
        if (bang == 0) {
            count++;
        }
        for (var t = 1; t <= tracks; t++) {
            var path = title + "/" + t;
            if (fs.existsSync(path)) {
                var code = fs.readFileSync(path, {encoding: 'utf-8'});
                var f = eval(code);
                f(udpPort, bang, count, bangs);
            }
        }

        bangs++;

    }, '', tick + "s");

}

var argv = require('minimist')(process.argv.slice(2));
var bang256 = require("bang256").bang256;

var host = argv["host"] || "127.0.0.1";
var port = argv["port"] || 8000;
var tempo = argv["tempo"];
var lines_per_beat = argv["lpb"] || 4;
var measure = argv["measure"] || 4;
var tracks = argv["tracks"] || 4;
var title = argv["title"];

bang256(host, port, tempo, lines_per_beat, measure, tracks, title);
```

To run,

```
node ./bang256 -host "127.0.0.1" --tempo=120 --lpb=4 --measure=4 --tracks=4 --title=foo
```

Edit files in foo/1 and foo/2 and foo/3 and foo/4 to create live music with an OSC compatible synthesizer.

Inside the file `foo/1`

```
(function (osc, bang, count, bangs, thread) {

    if ([4, 12].indexOf(bang) != -1) {
        var msg = {
            address: "/renoise/trigger/note_on",
            args: [ 1, 1, 38, 127],
        };
        osc.send(msg);
    }

})
```

<https://www.perl.com/pub/2004/08/31/livecode.html/>  also uses the ticks approach but uses a message bus for events.  
<https://github.com/psenough/teach_yourself_demoscene_in_14_days>

Added source/index.rst.























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Welcome to Bitrhythm's  documentation!
===========================================


.. meta::
   :description lang=en: Bitrhythm's - literate documentation
   :keywords: literate programming, p5, live coding, algorave, demoscene, creative programming, music, techno, programming, webaudio, webgl, improvising

.. toctree::
    :caption: Table of Contents
    :maxdepth: 5
    :glob:
    :includehidden:

    what
    source-code
    demo
    tweaking
    limitations
    midi
    samples
    early-attempts
    changelog
    main
    saving
    bookmarks

Added source/limitations.md.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
# Limitations and Recording

- Opening developer tools might slow down the execution a bit
- Using excessive delays and reverbs seems to cause some glitches
- Mobile browsers don't work properly
- Firefox does not seem to work well with tone.js

I use [BlackHole](https://existential.audio/blackhole/) to record audio from the browser window to Reaper. You can use any screenrecording software to record the screen. Have a distinct sound to match both audio and video.  


Added source/main.cog.





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
@<
@>
This is just a sample
Copyright (C) 2021 Xyzzy Apps
See https://bitrhythm.xyzzyapps.link/docs/source-code.html for the latest source code
@@

# Concepts and Code Walkthrough

@<
import cog
import os

if DEV == "1":
    stuff = """
## Running

ls source/main.cog | entr -r runserver.sh -b
"""
    cog.out(stuff)
@>
@@

## Core Tracker Loop

In bitrhythm code is evaluated for every cycle.

1 beat = 60 / tempo
1 cycle = 1 beat / ticks

For every cycle visual and audio code is evaluated.

The edit checkbox allows you to perform long edits, where only old code is evaluated. Once you disable it, all the new edit changes are applied in the next cycle.

If there is any syntax error, previous working code is used.

If the click the `execute transition` is selected, the transition function is run. Use this progressing the song from initializing to tweaking.


Patterns is an array of strings, each string can be hexadecimal, decimal or something like β€œx000 x000 x000 x000”.
isHit and track_no can be used to identify the layer in the live editor. Hexadecimal uses \`0 \`1 \`2 \`3 \`4 \`5 instead of the Roman numerals abcde for 10, 11, 12 ...

Scheduled Time as signified by the variable time is crucial when calling note triggers. This is used by Tone.js to schedule notes to play in the future.

### Observers

Sidechain compression is a simple algorithm which observes amplitude of another instrument but you can generalise it to anything. By attaching observers  to time or other instruments you can create sections within the song that can trigger others with conditional logic. This is similar to pure data's bangs - [see this](https://www.youtube.com/watch?v=nTTZZyD4xlE). In future this will be referred to as side events. You could decrease the volume of the drums to have the snares drop automatically for example.

This is something that you can't do in DAWs.

```{code-block} js
---
force: true
---

@<
core_loop = """

async play() {
    var self = this;
    var cellx = window.cellx.cellx;

    await Tone.start();
    Tone.Transport.start();
    Tone.Transport.bpm.value = this.state.tempo;
    Tone.Transport.swing.value = 0;

    var transition = function () {
    }

    var always = function () {
    }


    var render_loop = function () {
    }

    var animation = function () {
        render_loop();
        window.requestAnimationFrame(animation)
    }

    Tone.Master.mute = false;
    document.getElementById('tempo-value').disabled = true;
    document.getElementById('tick-value').disabled = true;

    var mem = self.state.mem;
    var handlers = {};
    var count = -1;

    var text = editor.getValue();
    editor.on("change", function () {
            text = editor.getValue();
    });

    var patterns = [ cellx("0000") ]; // need this for first eval

    var bars = 0;
    var tick = 0;

    loop = new Tone.ToneEvent((time, chord) => {
        count = count + 1;
        tick = (count % this.state.ticks);
        if (tick === 0) ++bars;

        $("#duration").html("" + bars + "." + tick + " / " + count + " / " + window.roundTo(Tone.Transport.seconds, 2));

        for (var i = 0; i < patterns.length; i++) {
            var samples = this.state.samples;
            var dials = self.state.dials;
            var numbers = self.state.numbers;

            if (document.getElementById('edit-mode').checked) {
                p = oldPatterns[i];
            } else {
                var p = patterns[i];
                oldPatterns[i] = p;
            }
            if (p && p.length !== 0) {
                var track_no = i + 1;
                var pattern = pattern_clean(p());
                var isHit = (pattern.split('')[tick] == "1") ? true : false;

                try {
                    if (document.getElementById('edit-mode').checked) {
                        eval(oldCode);
                    } else {
                        eval(text);
                        if (document.getElementById('load-mode').checked) {
                            document.getElementById('load-mode').checked = false;
                            transition();
                        }
                        oldCode = text;
                    }
                    $("#error").html("");
                } catch (ex) {
                    $("#error").html(ex);
                    eval(oldCode);
                }
            }
        }
    }, []);
    loop.loop = true;
    loop.loopEnd = this.state.ticks + "n";
    loop.start();

   window.requestAnimationFrame(animation)

}
"""
cog.out(core_loop)
@>
@@
```

## Dials

Bitrhythm provides custom dials. These dials can be mapped to any aspects of Tone.js. All dials are available as an array dials in the live code editor.

```{code-block} html
---
force: true
---

@<
import cog
import os

dial = """
<dial>
    <vbox>
        <div class="ml-4">
            <hstack>
                <div id={"knob" + props.ti}></div>
                <div class="mt-1" style="height: 22px" id={"knob-value" + props.ti}></div>
                <span class="cursor-pointer" id={"sample" + this.props.ti} onclick={remove(this.props.ti -1)}>(x)</span>
            </hstack>
        </div>
    </vbox>

    <script>

this.props = opts;

remove(index) {
    return () => {
        this.props.rmdial(index);
    }
}

this.on("mount", () => {
    if (opts.v) {

        Nexus.colors.accent = "#000000"
        Nexus.colors.fill = "#ffffff"

        var cell = window.cellx.cellx(0.5);
        var dial = new Nexus.Dial('#knob' + this.props.ti, {
            'size': [45, 45],
            'value': 0.5
        });
        cell.onChange(evt => {
            if (evt.data.prevValue !== evt.data.value) {
                dial.value = evt.data.value;
            }
        });
        dial.colorize("accent","#000")
        dial.on('change', (val) => {
            val = window.roundTo(val, 4);
            $('#knob-value' + this.props.ti).html(val);
            cell(val);
        });
       this.props.v["cell"] = cell;
    }
});
   </script>

</dial>
"""

cog.out(dial)
os.system("rm public/components/dial.tag")
f = open("public/components/dial.tag", "w")
f.write(dial)
f.close()
@>
@@
```

## Numbers

These numbers can be mapped to any aspect of Tone.js. All number boxes are available as an array numbers in the live code editor. Useful for debugging purposes.

```{code-block} html
---
force: true
---

@<
import cog
import os

number = """
<number>
    <vbox>
        <div  class="ml-4">
            <hstack>
            <div id={"number" + props.ti}></div>
            <div class="mt-1" style="height: 22px" id={"number-value" + props.ti}></div>
            <span class="cursor-pointer" onclick={remove(this.props.ti -1)}>(x)</span>
        </hstack>
        </div>
    </vbox>

    <script>

this.props = opts;

    remove(index) {
        return () => {
            this.props.rmnumber(index);
        }
    }

this.on("mount", () => {
    if (opts.v) {

        Nexus.colors.accent = "#000000"
        Nexus.colors.fill = "#ffffff"

        var cell = window.cellx.cellx(0)
        var number = new Nexus.Number('#number' + this.props.ti, {
            'value': 0,
            'step': 0.01
        });
        cell.onChange(evt => {
            if (evt.data.prevValue !== evt.data.value) {
                number.value = evt.data.value;
            }
        });

        this.props.v["v"] = cell;
    }
});
   </script>

</number>
"""

cog.out(number)
os.system("rm public/components/number.tag")
f = open("public/components/number.tag", "w")
f.write(number)
f.close()
@>
@@
```

## AutoKnob

AutoKnob enables programmatic automation in Bitrhythm

`x -> [1, 2.5, 4, 3.2] | by 0.3`

x will go from 1 to 2.5 to 4 to 3.2 in increments of 0.3 for every tick. While x will increase till 4 ... it will decrease once it reaches 4 and drop down to 3.2. After reaching 3.2 you can stay there or reverse back. At any point during live editing, you can add an extra element to the array. If you add 5 for example, the loop will continue from 3.2 to 5.

You can think of each element in the array as the "final knob position" and in each cycle we are moving to the next knob position in increments of 0.3

An alternate to AutoKnob is to use TimedKnob. In the endless acid banger  project, the basic code was using a simple timer to randomly move the knob position along with note collections and weighted random choice on note collections for generating rhythms.

TimedKnobs can be used to add small variations in volume to make the drums sounds more natural.

```{code-block} js
---
force: true
---

@<
import cog

knob_code = """
function knob(options) {
    options = options || {};
    var context = {};
    context.ramp = options.ramp || [0 , 1];
    context.count_skip = options.speed || 4;
    context.step = options.step || 0.01;
    context.reverse = options.reverse || true;
    context.number = options.number || null;

    context.current_count = 0;
    context.index = 0;
    context.val = window.cellx.cellx(options.initial || 0.5)

    function changeContext() {
        context.next_val = context.ramp[context.index + 1];

        context.val(context.ramp[context.index]);
        if (context.val() > context.next_val) {
            context.direction = -1;
        } else {
            context.direction = 1;
        }
    }

    changeContext();

    return {
        "cell": context.val,
        "push": function (val) {
            context.ramp.push(val);
        },
        "replace": function (val) {
            context.ramp = val;
        },
        "speed": function (val) {
            context.count_skip = val;
        },
        "step": function (val) {
            context.step = val;
        },
        "up": function (val) {
            val = val || 0.1;
            context.ramp.push(context.ramp[context.ramp.length - 1] + val);
        },
        "down": function (val) {
            val = val || -0.1;
            context.ramp.push(context.ramp[context.ramp.length - 1] + val);
        },
       "move": function () {
            if (context.current_count >= context.count_skip) {
                context.current_count = 1;

                if (context.direction == 1) {
                    var cmp = function () {
                        return (context.val() >= context.next_val);
                    };
                } else {
                    var cmp = function () {
                        return (context.next_val >= context.val());
                    };
                }

                if (cmp()) {
                    context.val(context.next_val);
                    context.index = context.index + 1;
                    if (context.index === context.ramp.length -1) {
                        if (context.reverse) {
                            context.index = 0;
                            context.ramp = context.ramp.reverse();
                        } else {
                            context.index = context.index - 1;
                        }
                    }
                    changeContext();
                    context.val(context.val() + context.step * context.direction);
                    if (context.number) context.number(context.val());
                } else {
                    context.val(context.val() + context.step * context.direction);
                    if (context.number) context.number(context.val());
                }
            } else {
                context.current_count += 1;
            }

           return context.val();
        }
    }
}

function timedKnob(options) {
    options = options || {};
    var context = {};
    context.interval = options.interval || 100;
    context.knob = knob(options);

    context.timer = setInterval(function () {
       context.knob.move();
    }, context.interval);

    context.knob["clear"] = function () {
        clearInterval(context.timer);
    }

    return context.knob;
}
"""
cog.out(knob_code)
@>
@@
```

## Main UI

@<
import cog
import os

if DEV == "1":
    stuff = """
```
// Not working

.CodeMirror-selected,
.CodeMirror-focused,
.CodeMirror-activeline,
.CodeMirror-activeline-background {
    background: transparent;
    color: #882d2d;
    z-index: 5 !important;
}
```
"""
    cog.out(stuff)
@>
@@


```{code-block} html
---
force: true
---

@<
import cog
import os

bitrhythm = """
<bitrhythm>

<div>
    <vstack id="header-playback">
        <hstack>
            <div class="ml-2">
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addDial}>+ Dial</button>
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addNumber}>+ Number</button>
                <!-- <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addSample}>+ Sample File</button> -->
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addSampleURL}>+ Sample URL</button>
            </div>

            <div class="ml-2" >
                <label for="tempo-value">Tempo / Ticks</label><br>
                <input type="text" id="tempo-value" value={state.tempo} style="width: 150px" onkeyup={ editTempo }/>
                <input type="text"  class="mt-2" id="tick-value" value={state.ticks} style="width: 150px" onkeyup={editTicks}/>
            </div>
            <div class="ml-2" style="min-width: 250px;">
                <label for="duration">Bars / Ticks / Seconds</label><br>
                <div id="duration" ></div>
            </div>
        </hstack>

        <div class="mt-2 ml-2" >
            <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1"  onclick={play}>Play</button>
            <button type="button" class="btn btn-primary ml-2" onclick={save}>Save</button>
            <button type="button" class="btn btn-primary ml-2" onclick={reset}>Reset</button>
            <button type="button" class="btn btn-primary ml-2" onclick={reload}>Window Reload</button>

            <input class="ml-1" name="edit-mode" id="edit-mode" type="checkbox"/>
            <label for="edit-mode">Edit</label>
            <input class="ml-1" name="load-mode" id="load-mode" type="checkbox"/>
            <label for="load-mode">Execute Transition</label>
        </div>

        <hstack>
            <div each={ key, index in state.samples} >
                <div if={ state.samples && state.samples[index] }>
                    <sample  setsample={setSample} rmsample={rmSample} samples={state.samples} ti={index + 1}></sample>
                </div>
            </div>
        </hstack>

        <hstack>
            <div each={ key, index in state.dials}>
                <dial rmdial={rmDial}  v={state.dials[index]} ti={index + 1}></dial>
            </div>
        </hstack>

        <hstack>
            <div each={ key, index in state.numbers}>
                <number rmnumber={rmNumber} v={state.numbers[index]} ti={index + 1}></number>
            </div>
        </hstack>

    </vstack>

    <div id="error" class="p-2" style="color: yellow !important; height: 32px; font-size: 12px;"></div>
    <div id="canvas-container" style="position: relative;">
        <div id="p5" style="position: absolute; width: 100%; background: black"></div>
        <canvas id="visual" style="position: absolute; width: 100%; background: black;"></canvas>
        <div id="code" style="position: absolute;"></div>
    </div>
    
</div>

<style>
:host {
    margin-top: 4vh;
}
</style>

<script>
var oldCode = "";
var oldPatterns = [];

// var audio = new Audio();
// audio.loop = true;
const actx = Tone.context;
const dest = actx.createMediaStreamDestination();
const recorder = new MediaRecorder(dest.stream);
let chunks = [];
var sampleURL = "";
var sam;
var loop;
this.props = opts;

this.state = {
    mem: {},
    dials: [],
    numbers: [],
    samples: [],
    tempo: 120,
    ticks: 16,
}

async function copyTextToClipboard(text) {
    try { await navigator.clipboard.writeText(text); }
    catch(err) {
        alert('Error in copying text: ', err);
    }
}

shouldUpdate(data, nextOpts) {
    return true;
}

this.on('mount', function() {
    var self = this;
    $("#load-mode").click();
    editor = CodeMirror(document.getElementById("code"), {
        mode: "null",
        spellcheck: false,
        autocorrect: false,
        scrollbarStyle: "null",
        lineWrapping: false,
        lineNumbers: false,
        styleActiveLine: false,
        matchBrackets: false,
        value: `// track_no, pattern, current_bit, samples, sample and Tone are available as globals`
    });

    editor.setSize(null, window.innerHeight - document.getElementById("header-playback").clientHeight - 160);

    if (this.props.song) {
        const lib = window.JsonUrl('lzma');
        lib.decompress(this.props.song).then(data => {
            var sample_names = data["sample_names"];
            var dial_count = data["dial_count"];
            var numbers_count = data["numbers_count"];
            delete data["sample_names"];
            delete data["dial_count"];
            delete data["numbers_count"];
            this.state.tempo = data.tempo;
            this.state.ticks = data.ticks;
            this.state.code = data.code;
            sample_names.map(function (url) {
                self.addURL(url);
            });
            for (var i = 0; i < dial_count; i++) {
                this.state.dials.push({});
            }
            for (var i = 0; i < numbers_count; i++) {
                this.state.numbers.push({});
            }
            editor.setValue(this.state.code);
            this.update();
            riot.mount('');
        })
    }


});


pattern_clean(p) {
    return window.pattern_clean(p);
}

save() {
    this.state.code = editor.getValue();
    var text = {
        tempo: this.state.tempo,
        dial_count: this.state.dials.length,
        numbers_count: this.state.numbers.length,
        sample_names: this.state.samples.map(function (item) {return item["__url"]}),
        ticks: 16,
        code: this.state.code,
    };
    const lib = window.JsonUrl('lzma');
	lib.compress(text).then(encodedData => {
        var link = "/song/" + encodedData;
        window.open(link, "_blank");
    });
}

reload() {
    window.location.replace( "//" + window.location.host)
}

reset() {

    Tone.Master.mute = true;
    if (loop) {
        loop.stop();
        loop.cancel();
        loop.dispose();
        Tone.Master.mute = false;
    }
    document.getElementById('tempo-value').disabled = false;
    document.getElementById('tick-value').disabled = false;
    editor.setValue("");

    this.state = {
        mem: {},
        dials: [],
        samples: [],
        tempo: 120,
        ticks: 16,
    }

    this.update();
    riot.mount('bitrhythm', {
        song: this.props.song
    })


}

editTempo(e) {
    this.update({
        tempo: e.target.value
    })
}

editTicks(e) {
    this.update({
        ticks: e.target.value
    })
}

${core_loop}

start() {
    recorder.start();
}

stop() {
    recorder.stop();
}

addDial() {
    this.state.dials.push({});
    this.update();
}

addNumber() {
    this.state.numbers.push({});
    this.update();
}

addURL(value) {
    var self = this;
    this.state.samples.push({"__name": value});
    var sam;
    sam = new Tone.Sampler({
        urls:  {
            "C3": value,
        }
    });
    sam["__name"] = value;
    sam["__url"] = value;
    self.setSample(sam, self.state.samples.length - 1);
}

addSampleURL() {
    var self = this;
    alertify.prompt( 'Enter Sample URL', '', ''
        , function(evt, value) {
            self.addURL(value);
        }
        , function() {
            alertify.error('Cancel')
        });
}

addSample() {
    this.state.samples.push({});
    this.update();
}

rmSample(index) {
   this.state.samples.splice(index, 1);
   this.update();
}

rmDial(index) {
   this.state.dials.splice(index, 1);
   this.update();
}

rmNumber(index) {
   this.state.numbers.splice(index, 1);
   this.update();
}

setSample(e, i) {
    this.state.samples[i] = e;
    this.update();
}

</script>

</bitrhythm>

"""
from mako.template import Template

code = Template(bitrhythm).render(core_loop=core_loop)
cog.out(bitrhythm)
os.system("rm public/components/bitrhythm.tag")
f = open("public/components/bitrhythm.tag", "w")
f.write(code)
f.close()
@>
@@
```

## Sample

You can add samples using the file upload. All samples are available as an array – samples. Initialise samples, global variables and synthesisers using the transition function and change the sample parameters using the same during live coding.

```{code-block} html
---
force: true
---

@<
import cog
import os

sample = """
<sample>
    <vbox class="ml-2">
        <vstack class="ml-2">
        <!-- <input type="file" id={"sample-file" + this.props.ti} style="width: 120px;"/> -->
        <div style="max-width: 120px;text-overflow: ellipsis; white-space: nowrap;overflow: hidden;">
            <span>{ getLast(this.props.ti -1)} </span>
            <span class="cursor-pointer" id={"sample" + this.props.ti} onclick={remove(this.props.ti -1)}>(x)</span>
        </div>
        </vstack>
    </vbox>

    <script>
    this.props = opts;

    remove(index) {
        return () => {
            this.props.rmsample(index);
        }
    }

    getLast (index) {
        if (this.props.samples && this.props.samples[index] && this.props.samples[index]["__name"]) {
            var e = this.props.samples[index]["__name"];
            var elems = e.split("/");
            var name = elems[elems.length - 1];
            return name;
        } else {
            console.log(this.props)
            return "";
        }
    }


    this.on("mount", function () {

        var self = this;
/*
        var sample_file = $("#sample-file" + this.props.ti).get(0);
        var sam;

        sample_file.addEventListener('change', (event) => {
            var file = event.srcElement.files[0];
            var a = new Audio();
            a.onloadedmetadata = (e) => {
                sam = new Tone.Sampler({
                    urls:  {
                        "C3": URL.createObjectURL(file),
                    },
                    onload: () => {
                        this.update();
                        sam.triggerAttackRelease("C3", 0.5);
                    }
                });

                sam["__name"] = file.name;
                sam["__url"] = "";
                // riot doesn't allow camelcase ?
                self.props.setsample(sam, self.props.ti - 1);
            }
            a.src = URL.createObjectURL(file);
        });
        */

    });
   </script>
</sample>
"""

cog.out(sample)
os.system("rm public/components/sample.tag")
f = open("public/components/sample.tag", "w")
f.write(sample)
f.close()
@>
@@
```

@<
import cog
import os

app = """
(import [sanic [Sanic response]])
(import [sanic.response [json text]])
(import [sanic.exceptions [NotFound abort]])
(import [jinja2 [Environment FileSystemLoader]])
(import re)
(import ipdb)
(import sys)
(import traceback)
(import json)
(import datetime)
(import [email.utils [format_datetime]])
(import [urllib.parse [urlparse]])
(import base64)

(setv file-loader (FileSystemLoader "templates"))
(setv env (Environment :loader file-loader))

(setv app (Sanic "Bitrhythm"))

(with-decorator
  (app.exception NotFound)
  (defn/a ignore_404s [request exception]
    (return (text (+ "Yep, I totally found the page " request.url)))
  )
)

(with-decorator
  (app.route "/song/<name>")
  (defn/a get-index [request name]
    (setv template (env.get_template "index.html"))
    (return (response.html (template.render {"data" name})))
  )
)

(with-decorator
  (app.route "/")
  (defn/a get-index [request]
    (setv template (env.get_template "index.html"))
    (return (response.html (template.render {"data" ""})))
  )
)

(with-decorator
  (app.route "/issue")
  (defn/a get-index [request]
    (setv template (env.get_template "page.html"))
    (return (response.html (template.render)))
  )
)

(app.static "/" "./public")

(defmain [&rest args]
    (app.run :host "0.0.0.0" :port 8015)
)
"""

if DEV == "1":
    for_docs = """
## App

```{code-block} hylang
---
force: true
---
%s
```
"""
    cog.out(for_docs % (app,))
os.system("rm bitrhythm.hy")
f = open("bitrhythm.hy", "w")
f.write(app)
f.close()
@>
@@

@<
import cog
import os

index = """
<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="utf-8">

        <title>Bitrhythm</title>

        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Expires" content="0" />

        <meta content="Bitrhythm" name="description" xml:lang="en" lang="en">
        <meta content="literate programming, p5, live coding, algorave, demoscene, creative programming, music, techno, programming, webaudio, webgl, p5, improvising">

       ${common_scripts}

        <link rel="preconnect" href="https://fonts.gstatic.com">
        <link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,700;1,100;1,200;1,300;1,400;1,500;1,700&display=swap" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css2?family=Major+Mono+Display&family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,700;1,100;1,200;1,300;1,400;1,500;1,700&display=swap" rel="stylesheet">

        <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
        <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/micromodal/0.4.6/micromodal.min.js" integrity="sha512-RMMh+IHzfZLsVFo1rX9PBoysxrJJqjyOS31HYWftobWtv2At6KBTqKpvVDIWAjL5aiV+LjFqkQ6e53Rdw3VOBg==" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/whenipress@1.8.0/dist/whenipress.js"></script>

        <script src="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/alertify.min.js" integrity="sha512-JnjG+Wt53GspUQXQhc+c4j8SBERsgJAoHeehagKHlxQN+MtCCmFDghX9/AcbkkNRZptyZU4zC8utK59M5L45Iw==" crossorigin="anonymous"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/css/alertify.min.css" integrity="sha512-IXuoq1aFd2wXs4NqGskwX2Vb+I8UJ+tGJEu/Dc0zwLNKeQ7CW3Sr6v0yU3z5OQWe3eScVIkER4J9L7byrgR/fA==" crossorigin="anonymous" />
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/css/themes/default.min.css" integrity="sha512-RgUjDpwjEDzAb7nkShizCCJ+QTSLIiJO1ldtuxzs0UIBRH4QpOjUU9w47AF9ZlviqV/dOFGWF6o7l3lttEFb6g==" crossorigin="anonymous" />

        <script src="/json-url-master/dist/browser/json-url.js"></script>
        <script src="/riot-3.13.2/riot+compiler.js"></script>

        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.1.2/tailwind.min.css" integrity="sha512-RntatPOhEcQEA81gC/esYoCkGkL7AYV7TeTPoU+R9zE44/yWxVvLIBfBSaMu78rhoDd73ZeRHXRJN5+aPEK53Q==" crossorigin="anonymous" />
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/lib/codemirror.css">
        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/addon/hint/show-hint.css">
        <script src="https://esironal.github.io/cmtouch/lib/codemirror.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/hint/show-hint.js"></script>
        <script src="http://esironal.github.io/cmtouch/addon/hint/xml-hint.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/hint/html-hint.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/xml/xml.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/javascript/javascript.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/css/css.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/htmlmixed/htmlmixed.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/selection/active-line.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/edit/matchbrackets.js"></script>
        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/theme/neonsyntax.css">
        <link rel="stylesheet" href="https://unpkg.com/pyloncss@latest/css/pylon.css"/>


        <script src="/tune.js"></script>
        <script src="/misc.js"></script>

        <style type="text/css">
body {
    background: black;
    color: white;
    font-family: 'Roboto Mono', monospace;
}

a {
    color: white;
}

input {
    color: black;
}

.btn {
    background: white;
    color: black;
    padding: 4px;
}

.CodeMirror {
    font-size: 12px;
    width: 100%;
    padding-left: 4px;
    line-height: 1;
    background: transparent !important;
    color: white !important;
    font-family: 'Roboto Mono', monospace !important;
}

.CodeMirror-vscrollbar, .CodeMirror-hscrollbar {
    overflow-x: hidden !important;
    overflow-y: hidden !important;
}

.CodeMirror-cursor {
  border-left: 2px solid white !important;
}

.CodeMirror pre,
.CodeMirror-line > span,
.CodeMirror-lines {
  padding: 0 !important;
}


        </style>

        <script type="riot/tag" src="/components/bitrhythm.tag"></script>
        <script type="riot/tag" src="/components/dial.tag"></script>
        <script type="riot/tag" src="/components/sample.tag" ></script>
        <script type="riot/tag" src="/components/number.tag" ></script>

        <script>
            window.goatcounter = {
                path: function(p) { return location.host + p }
            }
        </script>
	    <script data-goatcounter="https://analytics.xyzzyapps.link/count" async src="//analytics.xyzzyapps.link/count.js"></script>
    </head>

    <body>
        <div class="containera-full">
            <hstack class="mb-2">
                <h5 class="ml-4"><a href="/docs/index.html" target="_blank">Docs</a></h5>
                <h5 class="ml-4"><a target="_blank" href="/issue">Report bugs / Feedback</a></h5>
                <h5 class="ml-4"><a href="/song/XQAAAALHCwAAAAAAAABDKUqGU5vI8Eygv8VLc6H1NFIzdYQ4SmT-79BTKosH6Xje2IYnNRgEOpeuhg9Ej9Iz-_uEg-npGX0y9CmzyyVpwgaOUrKNlF-pzVXf3YmslEqBloRY0JslK5KapeSFSSH9ScweRgAPu9a4t1L0-t71Xb9Eb3KJ-lezPo7xcmK9xCnNGorm__kixtPuM_8L3YNc30OA3GMBPHu5pAH__cKjLF6k5mCGKsNp8WFWYQACckBR03VaZGhfZv946NYyFQlw6boXQuVis292UUboEkaCJ0CV5wGurbJUA7il2uX-okyMSjx7WVseVG-zDQ0wBjbMLNYnXzoT0kYxI_6-GOAOVamJJHTrkulVfd1k0AgzCHByI6zCNtWyBa3i_2ks4ncMec8vqsjAy8BhwFAbKAP1RDKh7MUxwsecBuzyLR0hKGddivZmPn-xyYB-p8-Xru_Min2-3Z_3YZal2_wv8s6cIcqPAJ4wf5DH29U7le-eRLcUN6lhK77651_xeU--z7A6E3NDQ6WEb6UPc-brxTz-L-wZwFwy95QkwAZw4bWR2LNW78DVdCSnMC8zf-DVWgFkKP9SU9iGQj6yk6E8qBAlZfd3YavthZBdwhs2mtzsvIL8qcBTBRhy2Fxx5n5tLq2lXuPkH19-cqIoJCHJUjiuGKWh3PqOAnTj9n2PejvNlp1GUMMixR7YMUofcLeA5oQCQpMSuIEP8sUshtk3zY35vG4xr3FfPj7OZiOQx5jRtMaw7l8xqFVm_PZ-kEgxoIVFtpZFcgsACnuBeJF1yZ2ss1GN95XEt9BsF3UY_UM1x8ePgY8BL4WH7BcHZRCOV2YZeRXZ6sYLNjKBjGVD_FAR_ZL6yd6l_1wqpQJPb3lL1fhBecNTcaXAn61RhySOvokAJ5TcrTtqdhsGEBUnaQOGRIfKU0NV4zPmgTm9TLASz5gs1VRoUZ06htWirfNfjiWNrbw8I9ggo8KMKwDZ2v4CnfqyL4eCpFNZjVIYOEWGGktLAadafQjdjOkWHWF8KIdr3uPBt1kXY_-IEkn11gjmn1q9ybgMLxriz7kWqzyawAEpqM27wzIwET2smzbJ-zHcx01rdHu3AqLMHk-AliQLGvGknluJNjWmK-WFwZUR8ZokJ6cVYW70a6X1dYWncQsPwyC3AOplDyUChlC_Rmgvz9fqeMs-fXub0odr01b7PFrraLWJ02Xk7trVq_Gqh8V2A2LATUKewJT05dG0bVJTBdM9n86C-mgyLf7s7JeNf9ul97CsS3BalNZ--N0hfkPbT_VPU9heFko9goG_mkF7Ky6FbtVpERCqw7UbvPgdFdIOEkoqPYEwAmjwzva2U-7cLo3g3uEQq1NBV3C8LijP10-1Avqu2df_R8XtykOk4H8yitylcxka4vSq1Jo2fv-wp74EiJi6Tn6T3epZJYXAMBRXRxozyl1r4lbOqRjDfqjWRTRrr8l9U2iKbAiIz6Ssy74Ic9sQABR9F4UahwsDQuJgjOHKdaLXmBHoPuD7nX_9mMYV">Example1</a></h5>
                <h5 class="ml-4"><a href="/song/XQAAAALYEwAAAAAAAABDKUqGU5vI8Eygv8VLc6H1NFIzdYQe5mT-79BTKosH6Xje2IYnNRgEOpeuhg9NTfIT-_uEg-npGX0y9CmzyyVpwgaOUrKNlF-pzVXf3YnQ2gSfpzY3zlYLujavQRq73hSEM-RaGxTxuud9naok9rMpYn-UCaNiF2zrnnqUB61s_22pYOE_9KuFo7vEJMCtU2bkxyNdgSXzwmIDuo8OyxcIh9HQP59UZbNRixlBnmw73PnywS5DJBoH8NEIAnlLpL4rqaokfN9Cfte0Id3929n26IjA7zVZF75ovX37KO1xT9iBa8gt-w8cvYBdIdVL5JUOrbf0ccVJSoXGFoM0U4GXoEDThw00FdKnfsq1WeJjEQt4Qn8f90TkkQgkpSajR9dA0AJBqKDuVeEgDoFsbVI-ZZVvJW2dD_9GIm5PpQSTzpuBslzD7ZJQSI3XA1g2F_QP4w6U4rOrTMZUQSr___s22d8Plp0FbffDCq8dri0C8kUYPqS_np_Nnr7sDY9KsxgNZJmUxYkt1XBTO3iWmR6RZ7OFk6PZ8R44NXwhvxbUEikMoboPSW1XPiV4xtCfZb4qE4yCP2xHPlEniUhcNrWc5608hrNkVfpQUmYLFvXFTyUHA4aOkRDoHf0jHwGzyBV-YanP65YlZpupZC4oW3bjhO01tfh_qYWNA_ZpDVCCXRoGZJfrBjkmaYom9Gd6mvGVzillbk6LD0_Amu_Zublb4_AZ1SAxKSWlMfbmbXQfW16RSMidtmTCKAMmF9LCONKcjTR_1P2vU3fPR7hBhRtbtNR0xNEfRstXJ81ZcyC5YTK8dnpMwMXKk5uoaBMDbochbAKXaswgZKIn2usyi5Z4pyQf8xCSheQawyYSA031ZHA3wRuq_7rjhn0bXZrEGnB0QFzxgM-dYsY7CUojKr8ziZGXGb9zoVHvGDI0SIFyFIrMs6kEzpZAq_CnJyqJi4nbbqfoHlE3nDyLNKFk1e4OHqPsU9G1LRNnHBwSjiJCnvZO_xv_VQbtWmQwLrT7j6PZeXvNOz-yKWQFcE-0RXn6-EuqT7LNTF1GSo2o9AFS5Z2PJqIXioD9ebr9xjFXNrfTdIe32dgcgQHVHNyjEIH22AABUQWYtHRvZQpcfsUjJQM140MJ8nmpjmxlhtAMEstPzbGYUKZdjhF1LkeePxXD46zniN9cFEtRPTNR9luP4W2rhfHnvP4_tRAipmQiB_6RSRvLaiVYfkYYXdzMkX_M5blfwCKQ-DyDFy0hTw3mYZ-SbYT11RVO-5dEm_YntYmgQOI1FI7AhMxpmyE27Lwb73oDO0SeS-SDj4T6nbfltfHdWDPFaeUWd12KRmI-E8AQCcnmJayoBnMXyXNw3muX0319WhuitTtab3n3vwZM1e7ku11q1rNoaA3VXLbBJdyS1Vxvdvm8Tled56S54siOsEYGRqmdiC3gO2ZGaBq68SJZ9zxe9yttNFEXFFgWYFnIn_EMSTNj1ILB0wkOQPzsjFXEEa3W6esXTujFuoHK05q4rrfYicKZkq01hfaoZcovIbDFNyGtpgEzn-BFPJXKWwqn5gkgrvZiYxVxG7a449Gjj_R2HqNbbiTmd1la0MKDnVLWv9yXXRdRLQrKC4Z2kAJIOdwxluk6fRBFzRWT_o046yjM-nvgp3KLJU-n_CWu3mgfmQi5vCbNxRczEeyaJGg3DJL-anxXk0A2CFsFCXRLccmhHV7MjQdh4sdvnvl3JO1Ypt1_nsBXQJqXvahwkjpEC5jzduvTd0rIHgDBAzO3PA7YNjWF_r1EmagtsB_1VFSRqAQdXjbEep8SLKNqv8N7ILkix2NeTM30r9xyXtXcGOOmoQK4AMk1tHBmQ4m6YYNalWXJ_aGIjdBgx4jgsRYjWp1H9qRr0wMkmG75zOSbuOy_lg5-C-xbszvp7B5YELZblpjnpXCW8AhXMWCLM_iG16lkgw24Z40VWh4Q9DCXoMgZmOXm-98WidEFfkMP_8L7sdQjWRxMAodkLhUkHnsBRlYNChmAexNvzKW3xiiDhC_k6qKRfldVgCGSBFfpldJF_8e7EyQ">Example2</a></h5>
                <h5 class="ml-4"><a href="/docs/demo.html">See Demo Song // Techno</a></h5>
            </hstack>

            <bitrhythm song="{{data}}"></bitrhythm>
        </div>

    <script>
        riot.compile(function() {
            var bitrhythm = riot.mount('bitrhythm');
            window.bitrhythm = bitrhythm[0];
            var dial = riot.mount('dial');
            var number = riot.mount('number');
            var sample = riot.mount('sample');
        })
    </script>


    </body>

</html>

"""

from mako.template import Template
import common
code = Template(index).render(common_scripts=common.external_libraries)

if DEV == "1":
    for_docs = """
## Index

```{code-block} html
---
force: true
---
%s
```
    """
    cog.out(for_docs % (index,))

os.system("rm templates/index.html")
f = open("templates/index.html", "w")
f.write(code)
f.close()
@>
@@


@<
import cog
import os

page = """
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Expires" content="0" />
        <title>About birthythm</title>
        <link rel="icon" href="favicon.ico">
        <style>
        html, body {
            margin: 0;
            width: 100%;
            height: 100%;
            padding: 0;
        }
        iframe {
            position:fixed;
            top:0;
            left:0;
            bottom:0;
            right:0;
            width:100%;
            height:100%;
            border:none;
            margin:0;
            padding:0;
            overflow:hidden;
            z-index:999999;
        }
        </style>
        <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
        <script>
            window.goatcounter = {
                path: function(p) { return location.host + p }
            }
        </script>
        <script data-goatcounter="https://analytics.xyzzyapps.link/count" async src="//analytics.xyzzyapps.link/count.js"></script>
    </head>
    <body>
        <iframe src="https://blog.xyzzyapps.link/bitrhythm-submit-issue-feedback" frameborder="0"></iframe>
    </body>
</html>
"""

if DEV == "1":
    for_docs = """
## Page

```{code-block} html
---
force: true
---
%s
```
    """
    cog.out(for_docs % (page,))

os.system("rm templates/page.html")
f = open("templates/page.html", "w")
f.write(page)
f.close()
@>
@@

## Javascript

```{code-block} js
---
force: true
---

@<
import cog
import os

misc_js = """
function initWinamp(preset) {
    var can = document.getElementById("visual");
    can.height = window.innerHeight - document.getElementById("header-playback").clientHeight - 75;
    can.width = window.innerWidth;
    var can_container = document.getElementById("canvas-container");
    can_container.width = window.innerWidth;
    var visualizer = window.butterchurn.default.createVisualizer(Tone.getContext().rawContext, can, {
        height: window.innerHeight - document.getElementById("header-playback").clientHeight - 75,
        width: window.innerWidth,
        meshWidth: 24,
        meshHeight: 18,
    });
    visualizer.connectAudio(Tone.getContext().destination);
    const presets = window.butterchurnPresets.getPresets();
    const presetParam = presets[preset];
    visualizer.loadPreset(presetParam, 0.0); // 2nd argument is the number of seconds to blend presets
    return visualizer;
}

function guard(range) {
    var state = null;
    return function (val) {
        if ((val >= range[0]) && (val <= range[1])) {
            state = val;
            return val;
        } else {
            return state;
        }
    }
}

function hex2bin(hex) {
    var letters = hex.replace('`1','a');
    letters = hex.replace('`2','b');
    letters = hex.replace('`3','c');
    letters = hex.replace('`4','d');
    letters = hex.replace('`5','e');
    letters = hex.replace('`6','f');
    letters = letters.split('');
    var bin = "";
    letters.map(function(letter) {
        if (letter == "0") {
            bin += "0000";
        }
        if (letter == "1") {
            bin += "0001";
        }
        else if (letter == "2") {
            bin += "0010";
        }
        else if (letter == "3") {
            bin += "0011";
        }
        else if (letter == "4") {
            bin += "0100";
        }
        else if (letter == "5") {
            bin += "0101";
        }
        else if (letter == "6") {
            bin += "0110";
        }
        else if (letter == "7") {
            bin += "0111";
        }
        else if (letter == "8") {
            bin += "1000";
        }
        else if (letter == "9") {
            bin += "1001";
        }
        else if (letter == "a") {
            bin += "1010";
        }
        else if (letter == "b") {
            bin += "1011";
        }
        else if (letter == "c") {
            bin += "1100";
        }
        else if (letter == "d") {
            bin += "1101";
        }
        else if (letter == "e") {
            bin += "1110";
        }
        else if (letter == "f") {
            bin += "1111";
        }

    })
    return bin;
}


function pattern_clean(p) {
    if (!p) {
        return "";
    }
    p = p.replace(/ /g, "");
    var fc = p.split('')[0];
    if (fc== "p") {
        var ptype = "xo";
        var l = (p.length - 1);
    }
    else if (fc== "b") {
        var l = (p.length - 1);
        var ptype = "bin";
    }
    else {
        var ptype = "hex";
        var l = (p.length) * 4;
    }

    if (ptype == "bin") {
        var fp =  p.substring(1);
    } else if (ptype == "xo") {
        var fp = p.substr(1);
        fp = fp.replace(/x/g, "1");
    } else {
        var fp = hex2bin(p);
    }

    return fp;
}

function download(data, filename, type) {
    var file = new Blob([data], { type: type });
    if (window.navigator.msSaveOrOpenBlob) // IE10+
        window.navigator.msSaveOrOpenBlob(file, filename);
    else { // Others
        var a = document.createElement("a"),
            url = URL.createObjectURL(file);
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        setTimeout(function () {
            document.body.removeChild(a);
            window.URL.revokeObjectURL(url);
        }, 0);
    }
}

// https://stackoverflow.com/questions/15762768/javascript-math-round-to-two-decimal-places
function roundTo(n, digits) {
    var negative = false;
    if (digits === undefined) {
        digits = 0;
    }
    if (n < 0) {
        negative = true;
        n = n * -1;
    }
    var multiplicator = Math.pow(10, digits);
    n = parseFloat((n * multiplicator).toFixed(11));
    n = (Math.round(n) / multiplicator).toFixed(digits);
    if (negative) {
        n = (n * -1).toFixed(digits);
    }
    return n;
}

${knob_code}
"""
from mako.template import Template

code = Template(misc_js).render(knob_code=knob_code)
cog.out(misc_js)

os.system("rm public/misc.js")
f = open("public/misc.js", "w")
f.write(code)
f.close()
@>
@@
```

Added source/main.md.































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231

# Concepts and Code Walkthrough


## Running

ls source/main.cog | entr -r runserver.sh -b

## Core Tracker Loop

In bitrhythm code is evaluated for every cycle.

1 beat = 60 / tempo
1 cycle = 1 beat / ticks

For every cycle visual and audio code is evaluated.

The edit checkbox allows you to perform long edits, where only old code is evaluated. Once you disable it, all the new edit changes are applied in the next cycle.

If there is any syntax error, previous working code is used.

If the click the `execute transition` is selected, the transition function is run. Use this progressing the song from initializing to tweaking.


Patterns is an array of strings, each string can be hexadecimal, decimal or something like β€œx000 x000 x000 x000”.
isHit and track_no can be used to identify the layer in the live editor. Hexadecimal uses \`0 \`1 \`2 \`3 \`4 \`5 instead of the Roman numerals abcde for 10, 11, 12 ...

Scheduled Time as signified by the variable time is crucial when calling note triggers. This is used by Tone.js to schedule notes to play in the future.

### Observers

Sidechain compression is a simple algorithm which observes amplitude of another instrument but you can generalise it to anything. By attaching observers  to time or other instruments you can create sections within the song that can trigger others with conditional logic. This is similar to pure data's bangs - [see this](https://www.youtube.com/watch?v=nTTZZyD4xlE). In future this will be referred to as side events. You could decrease the volume of the drums to have the snares drop automatically for example.

This is something that you can't do in DAWs.

```{code-block} js
---
force: true
---



async play() {
    var self = this;
    var cellx = window.cellx.cellx;

    await Tone.start();
    Tone.Transport.start();
    Tone.Transport.bpm.value = this.state.tempo;
    Tone.Transport.swing.value = 0;

    var transition = function () {
    }

    var always = function () {
    }


    var render_loop = function () {
    }

    var animation = function () {
        render_loop();
        window.requestAnimationFrame(animation)
    }

    Tone.Master.mute = false;
    document.getElementById('tempo-value').disabled = true;
    document.getElementById('tick-value').disabled = true;

    var mem = self.state.mem;
    var handlers = {};
    var count = -1;

    var text = editor.getValue();
    editor.on("change", function () {
            text = editor.getValue();
    });

    var patterns = [ cellx("0000") ]; // need this for first eval

    var bars = 0;
    var tick = 0;

    loop = new Tone.ToneEvent((time, chord) => {
        count = count + 1;
        tick = (count % this.state.ticks);
        if (tick === 0) ++bars;

        $("#duration").html("" + bars + "." + tick + " / " + count + " / " + window.roundTo(Tone.Transport.seconds, 2));

        for (var i = 0; i < patterns.length; i++) {
            var samples = this.state.samples;
            var dials = self.state.dials;
            var numbers = self.state.numbers;

            if (document.getElementById('edit-mode').checked) {
                p = oldPatterns[i];
            } else {
                var p = patterns[i];
                oldPatterns[i] = p;
            }
            if (p && p.length !== 0) {
                var track_no = i + 1;
                var pattern = pattern_clean(p());
                var isHit = (pattern.split('')[tick] == "1") ? true : false;

                try {
                    if (document.getElementById('edit-mode').checked) {
                        eval(oldCode);
                    } else {
                        eval(text);
                        if (document.getElementById('load-mode').checked) {
                            document.getElementById('load-mode').checked = false;
                            transition();
                        }
                        oldCode = text;
                    }
                    $("#error").html("");
                } catch (ex) {
                    $("#error").html(ex);
                    eval(oldCode);
                }
            }
        }
    }, []);
    loop.loop = true;
    loop.loopEnd = this.state.ticks + "n";
    loop.start();

   window.requestAnimationFrame(animation)

}
```

## Dials

Bitrhythm provides custom dials. These dials can be mapped to any aspects of Tone.js. All dials are available as an array dials in the live code editor.

```{code-block} html
---
force: true
---


<dial>
    <vbox>
        <div class="ml-4">
            <hstack>
                <div id={"knob" + props.ti}></div>
                <div class="mt-1" style="height: 22px" id={"knob-value" + props.ti}></div>
                <span class="cursor-pointer" id={"sample" + this.props.ti} onclick={remove(this.props.ti -1)}>(x)</span>
            </hstack>
        </div>
    </vbox>

    <script>

this.props = opts;

remove(index) {
    return () => {
        this.props.rmdial(index);
    }
}

this.on("mount", () => {
    if (opts.v) {

        Nexus.colors.accent = "#000000"
        Nexus.colors.fill = "#ffffff"

        var cell = window.cellx.cellx(0.5);
        var dial = new Nexus.Dial('#knob' + this.props.ti, {
            'size': [45, 45],
            'value': 0.5
        });
        cell.onChange(evt => {
            if (evt.data.prevValue !== evt.data.value) {
                dial.value = evt.data.value;
            }
        });
        dial.colorize("accent","#000")
        dial.on('change', (val) => {
            val = window.roundTo(val, 4);
            $('#knob-value' + this.props.ti).html(val);
            cell(val);
        });
       this.props.v["cell"] = cell;
    }
});
   </script>

</dial>
```

## Numbers

These numbers can be mapped to any aspect of Tone.js. All number boxes are available as an array numbers in the live code editor. Useful for debugging purposes.

```{code-block} html
---
force: true
---


<number>
    <vbox>
        <div  class="ml-4">
            <hstack>
            <div id={"number" + props.ti}></div>
            <div class="mt-1" style="height: 22px" id={"number-value" + props.ti}></div>
            <span class="cursor-pointer" onclick={remove(this.props.ti -1)}>(x)</span>
        </hstack>
        </div>
    </vbox>

    <script>

this.props = opts;

    remove(index) {
        return () => {
            this.props.rmnumber(index);
        }
    }

this.on("mount", () => {
    if (opts.v) {

        Nexus.colors.accent = "#000000"
        Nexus.colors.fill = "#ffffff"

        var cell = window.cellx.cellx(0)
        var number = new Nexus.Number('#number' + this.props.ti, {
            'value': 0,
            'step': 0.01
        });
        cell.onChange(evt => {
            if (evt.data.prevValue !== evt.data.value) {
                number.value = evt.data.value;
            }
        });

        this.props.v["v"] = cell;
    }
});
   </script>

</number>
```

## AutoKnob

AutoKnob enables programmatic automation in Bitrhythm

`x -> [1, 2.5, 4, 3.2] | by 0.3`

x will go from 1 to 2.5 to 4 to 3.2 in increments of 0.3 for every tick. While x will increase till 4 ... it will decrease once it reaches 4 and drop down to 3.2. After reaching 3.2 you can stay there or reverse back. At any point during live editing, you can add an extra element to the array. If you add 5 for example, the loop will continue from 3.2 to 5.

You can think of each element in the array as the "final knob position" and in each cycle we are moving to the next knob position in increments of 0.3

An alternate to AutoKnob is to use TimedKnob. In the endless acid banger  project, the basic code was using a simple timer to randomly move the knob position along with note collections and weighted random choice on note collections for generating rhythms.

TimedKnobs can be used to add small variations in volume to make the drums sounds more natural.

```{code-block} js
---
force: true
---


function knob(options) {
    options = options || {};
    var context = {};
    context.ramp = options.ramp || [0 , 1];
    context.count_skip = options.speed || 4;
    context.step = options.step || 0.01;
    context.reverse = options.reverse || true;
    context.number = options.number || null;

    context.current_count = 0;
    context.index = 0;
    context.val = window.cellx.cellx(options.initial || 0.5)

    function changeContext() {
        context.next_val = context.ramp[context.index + 1];

        context.val(context.ramp[context.index]);
        if (context.val() > context.next_val) {
            context.direction = -1;
        } else {
            context.direction = 1;
        }
    }

    changeContext();

    return {
        "cell": context.val,
        "push": function (val) {
            context.ramp.push(val);
        },
        "replace": function (val) {
            context.ramp = val;
        },
        "speed": function (val) {
            context.count_skip = val;
        },
        "step": function (val) {
            context.step = val;
        },
        "up": function (val) {
            val = val || 0.1;
            context.ramp.push(context.ramp[context.ramp.length - 1] + val);
        },
        "down": function (val) {
            val = val || -0.1;
            context.ramp.push(context.ramp[context.ramp.length - 1] + val);
        },
       "move": function () {
            if (context.current_count >= context.count_skip) {
                context.current_count = 1;

                if (context.direction == 1) {
                    var cmp = function () {
                        return (context.val() >= context.next_val);
                    };
                } else {
                    var cmp = function () {
                        return (context.next_val >= context.val());
                    };
                }

                if (cmp()) {
                    context.val(context.next_val);
                    context.index = context.index + 1;
                    if (context.index === context.ramp.length -1) {
                        if (context.reverse) {
                            context.index = 0;
                            context.ramp = context.ramp.reverse();
                        } else {
                            context.index = context.index - 1;
                        }
                    }
                    changeContext();
                    context.val(context.val() + context.step * context.direction);
                    if (context.number) context.number(context.val());
                } else {
                    context.val(context.val() + context.step * context.direction);
                    if (context.number) context.number(context.val());
                }
            } else {
                context.current_count += 1;
            }

           return context.val();
        }
    }
}

function timedKnob(options) {
    options = options || {};
    var context = {};
    context.interval = options.interval || 100;
    context.knob = knob(options);

    context.timer = setInterval(function () {
       context.knob.move();
    }, context.interval);

    context.knob["clear"] = function () {
        clearInterval(context.timer);
    }

    return context.knob;
}
```

## Main UI


```
// Not working

.CodeMirror-selected,
.CodeMirror-focused,
.CodeMirror-activeline,
.CodeMirror-activeline-background {
    background: transparent;
    color: #882d2d;
    z-index: 5 !important;
}
```


```{code-block} html
---
force: true
---


<bitrhythm>

<div>
    <vstack id="header-playback">
        <hstack>
            <div class="ml-2">
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addDial}>+ Dial</button>
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addNumber}>+ Number</button>
                <!-- <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addSample}>+ Sample File</button> -->
                <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1" onclick={addSampleURL}>+ Sample URL</button>
            </div>

            <div class="ml-2" >
                <label for="tempo-value">Tempo / Ticks</label><br>
                <input type="text" id="tempo-value" value={state.tempo} style="width: 150px" onkeyup={ editTempo }/>
                <input type="text"  class="mt-2" id="tick-value" value={state.ticks} style="width: 150px" onkeyup={editTicks}/>
            </div>
            <div class="ml-2" style="min-width: 250px;">
                <label for="duration">Bars / Ticks / Seconds</label><br>
                <div id="duration" ></div>
            </div>
        </hstack>

        <div class="mt-2 ml-2" >
            <button type="button" class="btn btn-primary w-1/10 ml-2 mt-1"  onclick={play}>Play</button>
            <button type="button" class="btn btn-primary ml-2" onclick={save}>Save</button>
            <button type="button" class="btn btn-primary ml-2" onclick={reset}>Reset</button>
            <button type="button" class="btn btn-primary ml-2" onclick={reload}>Window Reload</button>

            <input class="ml-1" name="edit-mode" id="edit-mode" type="checkbox"/>
            <label for="edit-mode">Edit</label>
            <input class="ml-1" name="load-mode" id="load-mode" type="checkbox"/>
            <label for="load-mode">Execute Transition</label>
        </div>

        <hstack>
            <div each={ key, index in state.samples} >
                <div if={ state.samples && state.samples[index] }>
                    <sample  setsample={setSample} rmsample={rmSample} samples={state.samples} ti={index + 1}></sample>
                </div>
            </div>
        </hstack>

        <hstack>
            <div each={ key, index in state.dials}>
                <dial rmdial={rmDial}  v={state.dials[index]} ti={index + 1}></dial>
            </div>
        </hstack>

        <hstack>
            <div each={ key, index in state.numbers}>
                <number rmnumber={rmNumber} v={state.numbers[index]} ti={index + 1}></number>
            </div>
        </hstack>

    </vstack>

    <div id="error" class="p-2" style="color: yellow !important; height: 32px; font-size: 12px;"></div>
    <div id="canvas-container" style="position: relative;">
        <div id="p5" style="position: absolute; width: 100%; background: black"></div>
        <canvas id="visual" style="position: absolute; width: 100%; background: black;"></canvas>
        <div id="code" style="position: absolute;"></div>
    </div>
    
</div>

<style>
:host {
    margin-top: 4vh;
}
</style>

<script>
var oldCode = "";
var oldPatterns = [];

// var audio = new Audio();
// audio.loop = true;
const actx = Tone.context;
const dest = actx.createMediaStreamDestination();
const recorder = new MediaRecorder(dest.stream);
let chunks = [];
var sampleURL = "";
var sam;
var loop;
this.props = opts;

this.state = {
    mem: {},
    dials: [],
    numbers: [],
    samples: [],
    tempo: 120,
    ticks: 16,
}

async function copyTextToClipboard(text) {
    try { await navigator.clipboard.writeText(text); }
    catch(err) {
        alert('Error in copying text: ', err);
    }
}

shouldUpdate(data, nextOpts) {
    return true;
}

this.on('mount', function() {
    var self = this;
    $("#load-mode").click();
    editor = CodeMirror(document.getElementById("code"), {
        mode: "null",
        spellcheck: false,
        autocorrect: false,
        scrollbarStyle: "null",
        lineWrapping: false,
        lineNumbers: false,
        styleActiveLine: false,
        matchBrackets: false,
        value: `// track_no, pattern, current_bit, samples, sample and Tone are available as globals`
    });

    editor.setSize(null, window.innerHeight - document.getElementById("header-playback").clientHeight - 160);

    if (this.props.song) {
        const lib = window.JsonUrl('lzma');
        lib.decompress(this.props.song).then(data => {
            var sample_names = data["sample_names"];
            var dial_count = data["dial_count"];
            var numbers_count = data["numbers_count"];
            delete data["sample_names"];
            delete data["dial_count"];
            delete data["numbers_count"];
            this.state.tempo = data.tempo;
            this.state.ticks = data.ticks;
            this.state.code = data.code;
            sample_names.map(function (url) {
                self.addURL(url);
            });
            for (var i = 0; i < dial_count; i++) {
                this.state.dials.push({});
            }
            for (var i = 0; i < numbers_count; i++) {
                this.state.numbers.push({});
            }
            editor.setValue(this.state.code);
            this.update();
            riot.mount('');
        })
    }


});


pattern_clean(p) {
    return window.pattern_clean(p);
}

save() {
    this.state.code = editor.getValue();
    var text = {
        tempo: this.state.tempo,
        dial_count: this.state.dials.length,
        numbers_count: this.state.numbers.length,
        sample_names: this.state.samples.map(function (item) {return item["__url"]}),
        ticks: 16,
        code: this.state.code,
    };
    const lib = window.JsonUrl('lzma');
	lib.compress(text).then(encodedData => {
        var link = "/song/" + encodedData;
        window.open(link, "_blank");
    });
}

reload() {
    window.location.replace( "//" + window.location.host)
}

reset() {

    Tone.Master.mute = true;
    if (loop) {
        loop.stop();
        loop.cancel();
        loop.dispose();
        Tone.Master.mute = false;
    }
    document.getElementById('tempo-value').disabled = false;
    document.getElementById('tick-value').disabled = false;
    editor.setValue("");

    this.state = {
        mem: {},
        dials: [],
        samples: [],
        tempo: 120,
        ticks: 16,
    }

    this.update();
    riot.mount('bitrhythm', {
        song: this.props.song
    })


}

editTempo(e) {
    this.update({
        tempo: e.target.value
    })
}

editTicks(e) {
    this.update({
        ticks: e.target.value
    })
}

${core_loop}

start() {
    recorder.start();
}

stop() {
    recorder.stop();
}

addDial() {
    this.state.dials.push({});
    this.update();
}

addNumber() {
    this.state.numbers.push({});
    this.update();
}

addURL(value) {
    var self = this;
    this.state.samples.push({"__name": value});
    var sam;
    sam = new Tone.Sampler({
        urls:  {
            "C3": value,
        }
    });
    sam["__name"] = value;
    sam["__url"] = value;
    self.setSample(sam, self.state.samples.length - 1);
}

addSampleURL() {
    var self = this;
    alertify.prompt( 'Enter Sample URL', '', ''
        , function(evt, value) {
            self.addURL(value);
        }
        , function() {
            alertify.error('Cancel')
        });
}

addSample() {
    this.state.samples.push({});
    this.update();
}

rmSample(index) {
   this.state.samples.splice(index, 1);
   this.update();
}

rmDial(index) {
   this.state.dials.splice(index, 1);
   this.update();
}

rmNumber(index) {
   this.state.numbers.splice(index, 1);
   this.update();
}

setSample(e, i) {
    this.state.samples[i] = e;
    this.update();
}

</script>

</bitrhythm>

```

## Sample

You can add samples using the file upload. All samples are available as an array – samples. Initialise samples, global variables and synthesisers using the transition function and change the sample parameters using the same during live coding.

```{code-block} html
---
force: true
---


<sample>
    <vbox class="ml-2">
        <vstack class="ml-2">
        <!-- <input type="file" id={"sample-file" + this.props.ti} style="width: 120px;"/> -->
        <div style="max-width: 120px;text-overflow: ellipsis; white-space: nowrap;overflow: hidden;">
            <span>{ getLast(this.props.ti -1)} </span>
            <span class="cursor-pointer" id={"sample" + this.props.ti} onclick={remove(this.props.ti -1)}>(x)</span>
        </div>
        </vstack>
    </vbox>

    <script>
    this.props = opts;

    remove(index) {
        return () => {
            this.props.rmsample(index);
        }
    }

    getLast (index) {
        if (this.props.samples && this.props.samples[index] && this.props.samples[index]["__name"]) {
            var e = this.props.samples[index]["__name"];
            var elems = e.split("/");
            var name = elems[elems.length - 1];
            return name;
        } else {
            console.log(this.props)
            return "";
        }
    }


    this.on("mount", function () {

        var self = this;
/*
        var sample_file = $("#sample-file" + this.props.ti).get(0);
        var sam;

        sample_file.addEventListener('change', (event) => {
            var file = event.srcElement.files[0];
            var a = new Audio();
            a.onloadedmetadata = (e) => {
                sam = new Tone.Sampler({
                    urls:  {
                        "C3": URL.createObjectURL(file),
                    },
                    onload: () => {
                        this.update();
                        sam.triggerAttackRelease("C3", 0.5);
                    }
                });

                sam["__name"] = file.name;
                sam["__url"] = "";
                // riot doesn't allow camelcase ?
                self.props.setsample(sam, self.props.ti - 1);
            }
            a.src = URL.createObjectURL(file);
        });
        */

    });
   </script>
</sample>
```


## App

```{code-block} hylang
---
force: true
---

(import [sanic [Sanic response]])
(import [sanic.response [json text]])
(import [sanic.exceptions [NotFound abort]])
(import [jinja2 [Environment FileSystemLoader]])
(import re)
(import ipdb)
(import sys)
(import traceback)
(import json)
(import datetime)
(import [email.utils [format_datetime]])
(import [urllib.parse [urlparse]])
(import base64)

(setv file-loader (FileSystemLoader "templates"))
(setv env (Environment :loader file-loader))

(setv app (Sanic "Bitrhythm"))

(with-decorator
  (app.exception NotFound)
  (defn/a ignore_404s [request exception]
    (return (text (+ "Yep, I totally found the page " request.url)))
  )
)

(with-decorator
  (app.route "/song/<name>")
  (defn/a get-index [request name]
    (setv template (env.get_template "index.html"))
    (return (response.html (template.render {"data" name})))
  )
)

(with-decorator
  (app.route "/")
  (defn/a get-index [request]
    (setv template (env.get_template "index.html"))
    (return (response.html (template.render {"data" ""})))
  )
)

(with-decorator
  (app.route "/issue")
  (defn/a get-index [request]
    (setv template (env.get_template "page.html"))
    (return (response.html (template.render)))
  )
)

(app.static "/" "./public")

(defmain [&rest args]
    (app.run :host "0.0.0.0" :port 8015)
)

```


## Index

```{code-block} html
---
force: true
---

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="utf-8">

        <title>Bitrhythm</title>

        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Expires" content="0" />

        <meta content="Bitrhythm" name="description" xml:lang="en" lang="en">
        <meta content="literate programming, p5, live coding, algorave, demoscene, creative programming, music, techno, programming, webaudio, webgl, p5, improvising">

       ${common_scripts}

        <link rel="preconnect" href="https://fonts.gstatic.com">
        <link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,700;1,100;1,200;1,300;1,400;1,500;1,700&display=swap" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css2?family=Major+Mono+Display&family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,700;1,100;1,200;1,300;1,400;1,500;1,700&display=swap" rel="stylesheet">

        <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
        <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/micromodal/0.4.6/micromodal.min.js" integrity="sha512-RMMh+IHzfZLsVFo1rX9PBoysxrJJqjyOS31HYWftobWtv2At6KBTqKpvVDIWAjL5aiV+LjFqkQ6e53Rdw3VOBg==" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/whenipress@1.8.0/dist/whenipress.js"></script>

        <script src="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/alertify.min.js" integrity="sha512-JnjG+Wt53GspUQXQhc+c4j8SBERsgJAoHeehagKHlxQN+MtCCmFDghX9/AcbkkNRZptyZU4zC8utK59M5L45Iw==" crossorigin="anonymous"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/css/alertify.min.css" integrity="sha512-IXuoq1aFd2wXs4NqGskwX2Vb+I8UJ+tGJEu/Dc0zwLNKeQ7CW3Sr6v0yU3z5OQWe3eScVIkER4J9L7byrgR/fA==" crossorigin="anonymous" />
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/css/themes/default.min.css" integrity="sha512-RgUjDpwjEDzAb7nkShizCCJ+QTSLIiJO1ldtuxzs0UIBRH4QpOjUU9w47AF9ZlviqV/dOFGWF6o7l3lttEFb6g==" crossorigin="anonymous" />

        <script src="/json-url-master/dist/browser/json-url.js"></script>
        <script src="/riot-3.13.2/riot+compiler.js"></script>

        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.1.2/tailwind.min.css" integrity="sha512-RntatPOhEcQEA81gC/esYoCkGkL7AYV7TeTPoU+R9zE44/yWxVvLIBfBSaMu78rhoDd73ZeRHXRJN5+aPEK53Q==" crossorigin="anonymous" />
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/lib/codemirror.css">
        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/addon/hint/show-hint.css">
        <script src="https://esironal.github.io/cmtouch/lib/codemirror.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/hint/show-hint.js"></script>
        <script src="http://esironal.github.io/cmtouch/addon/hint/xml-hint.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/hint/html-hint.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/xml/xml.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/javascript/javascript.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/css/css.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/htmlmixed/htmlmixed.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/selection/active-line.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/edit/matchbrackets.js"></script>
        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/theme/neonsyntax.css">
        <link rel="stylesheet" href="https://unpkg.com/pyloncss@latest/css/pylon.css"/>


        <script src="/tune.js"></script>
        <script src="/misc.js"></script>

        <style type="text/css">
body {
    background: black;
    color: white;
    font-family: 'Roboto Mono', monospace;
}

a {
    color: white;
}

input {
    color: black;
}

.btn {
    background: white;
    color: black;
    padding: 4px;
}

.CodeMirror {
    font-size: 12px;
    width: 100%;
    padding-left: 4px;
    line-height: 1;
    background: transparent !important;
    color: white !important;
    font-family: 'Roboto Mono', monospace !important;
}

.CodeMirror-vscrollbar, .CodeMirror-hscrollbar {
    overflow-x: hidden !important;
    overflow-y: hidden !important;
}

.CodeMirror-cursor {
  border-left: 2px solid white !important;
}

.CodeMirror pre,
.CodeMirror-line > span,
.CodeMirror-lines {
  padding: 0 !important;
}


        </style>

        <script type="riot/tag" src="/components/bitrhythm.tag"></script>
        <script type="riot/tag" src="/components/dial.tag"></script>
        <script type="riot/tag" src="/components/sample.tag" ></script>
        <script type="riot/tag" src="/components/number.tag" ></script>

        <script>
            window.goatcounter = {
                path: function(p) { return location.host + p }
            }
        </script>
	    <script data-goatcounter="https://analytics.xyzzyapps.link/count" async src="//analytics.xyzzyapps.link/count.js"></script>
    </head>

    <body>
        <div class="containera-full">
            <hstack class="mb-2">
                <h5 class="ml-4"><a href="/docs/index.html" target="_blank">Docs</a></h5>
                <h5 class="ml-4"><a target="_blank" href="/issue">Report bugs / Feedback</a></h5>
                <h5 class="ml-4"><a href="/song/XQAAAALHCwAAAAAAAABDKUqGU5vI8Eygv8VLc6H1NFIzdYQ4SmT-79BTKosH6Xje2IYnNRgEOpeuhg9Ej9Iz-_uEg-npGX0y9CmzyyVpwgaOUrKNlF-pzVXf3YmslEqBloRY0JslK5KapeSFSSH9ScweRgAPu9a4t1L0-t71Xb9Eb3KJ-lezPo7xcmK9xCnNGorm__kixtPuM_8L3YNc30OA3GMBPHu5pAH__cKjLF6k5mCGKsNp8WFWYQACckBR03VaZGhfZv946NYyFQlw6boXQuVis292UUboEkaCJ0CV5wGurbJUA7il2uX-okyMSjx7WVseVG-zDQ0wBjbMLNYnXzoT0kYxI_6-GOAOVamJJHTrkulVfd1k0AgzCHByI6zCNtWyBa3i_2ks4ncMec8vqsjAy8BhwFAbKAP1RDKh7MUxwsecBuzyLR0hKGddivZmPn-xyYB-p8-Xru_Min2-3Z_3YZal2_wv8s6cIcqPAJ4wf5DH29U7le-eRLcUN6lhK77651_xeU--z7A6E3NDQ6WEb6UPc-brxTz-L-wZwFwy95QkwAZw4bWR2LNW78DVdCSnMC8zf-DVWgFkKP9SU9iGQj6yk6E8qBAlZfd3YavthZBdwhs2mtzsvIL8qcBTBRhy2Fxx5n5tLq2lXuPkH19-cqIoJCHJUjiuGKWh3PqOAnTj9n2PejvNlp1GUMMixR7YMUofcLeA5oQCQpMSuIEP8sUshtk3zY35vG4xr3FfPj7OZiOQx5jRtMaw7l8xqFVm_PZ-kEgxoIVFtpZFcgsACnuBeJF1yZ2ss1GN95XEt9BsF3UY_UM1x8ePgY8BL4WH7BcHZRCOV2YZeRXZ6sYLNjKBjGVD_FAR_ZL6yd6l_1wqpQJPb3lL1fhBecNTcaXAn61RhySOvokAJ5TcrTtqdhsGEBUnaQOGRIfKU0NV4zPmgTm9TLASz5gs1VRoUZ06htWirfNfjiWNrbw8I9ggo8KMKwDZ2v4CnfqyL4eCpFNZjVIYOEWGGktLAadafQjdjOkWHWF8KIdr3uPBt1kXY_-IEkn11gjmn1q9ybgMLxriz7kWqzyawAEpqM27wzIwET2smzbJ-zHcx01rdHu3AqLMHk-AliQLGvGknluJNjWmK-WFwZUR8ZokJ6cVYW70a6X1dYWncQsPwyC3AOplDyUChlC_Rmgvz9fqeMs-fXub0odr01b7PFrraLWJ02Xk7trVq_Gqh8V2A2LATUKewJT05dG0bVJTBdM9n86C-mgyLf7s7JeNf9ul97CsS3BalNZ--N0hfkPbT_VPU9heFko9goG_mkF7Ky6FbtVpERCqw7UbvPgdFdIOEkoqPYEwAmjwzva2U-7cLo3g3uEQq1NBV3C8LijP10-1Avqu2df_R8XtykOk4H8yitylcxka4vSq1Jo2fv-wp74EiJi6Tn6T3epZJYXAMBRXRxozyl1r4lbOqRjDfqjWRTRrr8l9U2iKbAiIz6Ssy74Ic9sQABR9F4UahwsDQuJgjOHKdaLXmBHoPuD7nX_9mMYV">Example1</a></h5>
                <h5 class="ml-4"><a href="/song/XQAAAALYEwAAAAAAAABDKUqGU5vI8Eygv8VLc6H1NFIzdYQe5mT-79BTKosH6Xje2IYnNRgEOpeuhg9NTfIT-_uEg-npGX0y9CmzyyVpwgaOUrKNlF-pzVXf3YnQ2gSfpzY3zlYLujavQRq73hSEM-RaGxTxuud9naok9rMpYn-UCaNiF2zrnnqUB61s_22pYOE_9KuFo7vEJMCtU2bkxyNdgSXzwmIDuo8OyxcIh9HQP59UZbNRixlBnmw73PnywS5DJBoH8NEIAnlLpL4rqaokfN9Cfte0Id3929n26IjA7zVZF75ovX37KO1xT9iBa8gt-w8cvYBdIdVL5JUOrbf0ccVJSoXGFoM0U4GXoEDThw00FdKnfsq1WeJjEQt4Qn8f90TkkQgkpSajR9dA0AJBqKDuVeEgDoFsbVI-ZZVvJW2dD_9GIm5PpQSTzpuBslzD7ZJQSI3XA1g2F_QP4w6U4rOrTMZUQSr___s22d8Plp0FbffDCq8dri0C8kUYPqS_np_Nnr7sDY9KsxgNZJmUxYkt1XBTO3iWmR6RZ7OFk6PZ8R44NXwhvxbUEikMoboPSW1XPiV4xtCfZb4qE4yCP2xHPlEniUhcNrWc5608hrNkVfpQUmYLFvXFTyUHA4aOkRDoHf0jHwGzyBV-YanP65YlZpupZC4oW3bjhO01tfh_qYWNA_ZpDVCCXRoGZJfrBjkmaYom9Gd6mvGVzillbk6LD0_Amu_Zublb4_AZ1SAxKSWlMfbmbXQfW16RSMidtmTCKAMmF9LCONKcjTR_1P2vU3fPR7hBhRtbtNR0xNEfRstXJ81ZcyC5YTK8dnpMwMXKk5uoaBMDbochbAKXaswgZKIn2usyi5Z4pyQf8xCSheQawyYSA031ZHA3wRuq_7rjhn0bXZrEGnB0QFzxgM-dYsY7CUojKr8ziZGXGb9zoVHvGDI0SIFyFIrMs6kEzpZAq_CnJyqJi4nbbqfoHlE3nDyLNKFk1e4OHqPsU9G1LRNnHBwSjiJCnvZO_xv_VQbtWmQwLrT7j6PZeXvNOz-yKWQFcE-0RXn6-EuqT7LNTF1GSo2o9AFS5Z2PJqIXioD9ebr9xjFXNrfTdIe32dgcgQHVHNyjEIH22AABUQWYtHRvZQpcfsUjJQM140MJ8nmpjmxlhtAMEstPzbGYUKZdjhF1LkeePxXD46zniN9cFEtRPTNR9luP4W2rhfHnvP4_tRAipmQiB_6RSRvLaiVYfkYYXdzMkX_M5blfwCKQ-DyDFy0hTw3mYZ-SbYT11RVO-5dEm_YntYmgQOI1FI7AhMxpmyE27Lwb73oDO0SeS-SDj4T6nbfltfHdWDPFaeUWd12KRmI-E8AQCcnmJayoBnMXyXNw3muX0319WhuitTtab3n3vwZM1e7ku11q1rNoaA3VXLbBJdyS1Vxvdvm8Tled56S54siOsEYGRqmdiC3gO2ZGaBq68SJZ9zxe9yttNFEXFFgWYFnIn_EMSTNj1ILB0wkOQPzsjFXEEa3W6esXTujFuoHK05q4rrfYicKZkq01hfaoZcovIbDFNyGtpgEzn-BFPJXKWwqn5gkgrvZiYxVxG7a449Gjj_R2HqNbbiTmd1la0MKDnVLWv9yXXRdRLQrKC4Z2kAJIOdwxluk6fRBFzRWT_o046yjM-nvgp3KLJU-n_CWu3mgfmQi5vCbNxRczEeyaJGg3DJL-anxXk0A2CFsFCXRLccmhHV7MjQdh4sdvnvl3JO1Ypt1_nsBXQJqXvahwkjpEC5jzduvTd0rIHgDBAzO3PA7YNjWF_r1EmagtsB_1VFSRqAQdXjbEep8SLKNqv8N7ILkix2NeTM30r9xyXtXcGOOmoQK4AMk1tHBmQ4m6YYNalWXJ_aGIjdBgx4jgsRYjWp1H9qRr0wMkmG75zOSbuOy_lg5-C-xbszvp7B5YELZblpjnpXCW8AhXMWCLM_iG16lkgw24Z40VWh4Q9DCXoMgZmOXm-98WidEFfkMP_8L7sdQjWRxMAodkLhUkHnsBRlYNChmAexNvzKW3xiiDhC_k6qKRfldVgCGSBFfpldJF_8e7EyQ">Example2</a></h5>
                <h5 class="ml-4"><a href="/docs/demo.html">See Demo Song // Techno</a></h5>
            </hstack>

            <bitrhythm song="{{data}}"></bitrhythm>
        </div>

    <script>
        riot.compile(function() {
            var bitrhythm = riot.mount('bitrhythm');
            window.bitrhythm = bitrhythm[0];
            var dial = riot.mount('dial');
            var number = riot.mount('number');
            var sample = riot.mount('sample');
        })
    </script>


    </body>

</html>


```
    



## Page

```{code-block} html
---
force: true
---

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Expires" content="0" />
        <title>About birthythm</title>
        <link rel="icon" href="favicon.ico">
        <style>
        html, body {
            margin: 0;
            width: 100%;
            height: 100%;
            padding: 0;
        }
        iframe {
            position:fixed;
            top:0;
            left:0;
            bottom:0;
            right:0;
            width:100%;
            height:100%;
            border:none;
            margin:0;
            padding:0;
            overflow:hidden;
            z-index:999999;
        }
        </style>
        <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
        <script>
            window.goatcounter = {
                path: function(p) { return location.host + p }
            }
        </script>
        <script data-goatcounter="https://analytics.xyzzyapps.link/count" async src="//analytics.xyzzyapps.link/count.js"></script>
    </head>
    <body>
        <iframe src="https://blog.xyzzyapps.link/bitrhythm-submit-issue-feedback" frameborder="0"></iframe>
    </body>
</html>

```
    

## Javascript

```{code-block} js
---
force: true
---


function initWinamp(preset) {
    var can = document.getElementById("visual");
    can.height = window.innerHeight - document.getElementById("header-playback").clientHeight - 75;
    can.width = window.innerWidth;
    var can_container = document.getElementById("canvas-container");
    can_container.width = window.innerWidth;
    var visualizer = window.butterchurn.default.createVisualizer(Tone.getContext().rawContext, can, {
        height: window.innerHeight - document.getElementById("header-playback").clientHeight - 75,
        width: window.innerWidth,
        meshWidth: 24,
        meshHeight: 18,
    });
    visualizer.connectAudio(Tone.getContext().destination);
    const presets = window.butterchurnPresets.getPresets();
    const presetParam = presets[preset];
    visualizer.loadPreset(presetParam, 0.0); // 2nd argument is the number of seconds to blend presets
    return visualizer;
}

function guard(range) {
    var state = null;
    return function (val) {
        if ((val >= range[0]) && (val <= range[1])) {
            state = val;
            return val;
        } else {
            return state;
        }
    }
}

function hex2bin(hex) {
    var letters = hex.replace('`1','a');
    letters = hex.replace('`2','b');
    letters = hex.replace('`3','c');
    letters = hex.replace('`4','d');
    letters = hex.replace('`5','e');
    letters = hex.replace('`6','f');
    letters = letters.split('');
    var bin = "";
    letters.map(function(letter) {
        if (letter == "0") {
            bin += "0000";
        }
        if (letter == "1") {
            bin += "0001";
        }
        else if (letter == "2") {
            bin += "0010";
        }
        else if (letter == "3") {
            bin += "0011";
        }
        else if (letter == "4") {
            bin += "0100";
        }
        else if (letter == "5") {
            bin += "0101";
        }
        else if (letter == "6") {
            bin += "0110";
        }
        else if (letter == "7") {
            bin += "0111";
        }
        else if (letter == "8") {
            bin += "1000";
        }
        else if (letter == "9") {
            bin += "1001";
        }
        else if (letter == "a") {
            bin += "1010";
        }
        else if (letter == "b") {
            bin += "1011";
        }
        else if (letter == "c") {
            bin += "1100";
        }
        else if (letter == "d") {
            bin += "1101";
        }
        else if (letter == "e") {
            bin += "1110";
        }
        else if (letter == "f") {
            bin += "1111";
        }

    })
    return bin;
}


function pattern_clean(p) {
    if (!p) {
        return "";
    }
    p = p.replace(/ /g, "");
    var fc = p.split('')[0];
    if (fc== "p") {
        var ptype = "xo";
        var l = (p.length - 1);
    }
    else if (fc== "b") {
        var l = (p.length - 1);
        var ptype = "bin";
    }
    else {
        var ptype = "hex";
        var l = (p.length) * 4;
    }

    if (ptype == "bin") {
        var fp =  p.substring(1);
    } else if (ptype == "xo") {
        var fp = p.substr(1);
        fp = fp.replace(/x/g, "1");
    } else {
        var fp = hex2bin(p);
    }

    return fp;
}

function download(data, filename, type) {
    var file = new Blob([data], { type: type });
    if (window.navigator.msSaveOrOpenBlob) // IE10+
        window.navigator.msSaveOrOpenBlob(file, filename);
    else { // Others
        var a = document.createElement("a"),
            url = URL.createObjectURL(file);
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        setTimeout(function () {
            document.body.removeChild(a);
            window.URL.revokeObjectURL(url);
        }, 0);
    }
}

// https://stackoverflow.com/questions/15762768/javascript-math-round-to-two-decimal-places
function roundTo(n, digits) {
    var negative = false;
    if (digits === undefined) {
        digits = 0;
    }
    if (n < 0) {
        negative = true;
        n = n * -1;
    }
    var multiplicator = Math.pow(10, digits);
    n = parseFloat((n * multiplicator).toFixed(11));
    n = (Math.round(n) / multiplicator).toFixed(digits);
    if (negative) {
        n = (n * -1).toFixed(digits);
    }
    return n;
}

${knob_code}
```

Added source/midi.md.







































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# MIDI and DAW Terms

## MIDI

<a href="https://en.wikipedia.org/wiki/MIDI">MIDI</a> changed music.

Consider what a classically trained Musician needs to do, to make his 
music heard.

He needs to,

1. Write it
2. Get a bunch of musicians
3. Practice
4. Play
5. goto 1
6. Record the Final Cut in a Studio

With MIDI,

1. Write it. Save it, with a Software
2. Get the electronic instruments to play it for him
   -or-
   Get a computer Software to play it for him
3. Tweak
4. Record the Final Cut in Software or a Studio

MIDI is - Musical Instrument Digital Interface.

It abstracts <a href="https://en.wikipedia.org/wiki/Musical_notation">Music Notation</a> into bytes.
Since its bytes, you can replay it with software.

MIDI made production,

* Dirt Cheap
* Made Producers more efficient

How about Audio Quality ?

* A Classical Ensemble still has its place. Panning is unique there.
* But MIDI + Electronic Instrument increased the Range. It helped form whole new genres in Music like EDM, IDM, SynthPunk ...

Limitations ?

* MIDI is limited to 16 instruments.
* Integers.
* 16 is a big number.
* <a href="https://en.wikipedia.org/wiki/Open_Sound_Control">OSC</a> overcomes these.

Usage
=====

To use MIDI you need,

1. A Sequencer

   This generates MIDI messages like,

    ```
   Command param1 param2 param3
   Command param1 param2
   Command param1 param2 param3
   Command param1 param2
   ...
   ```

   Important messages are,

   1. Note On => Channel [1-16]**, Pitch[0-127], Volume[0-127]
   2. Note Off                 "
   3. Controller => No [0-127], Value[0-127]

   ** Channel 10 is reserved for Drums.

   Note On and Note Off are typically sent by keys, buttons.
   Controller Messages are typically sent by knobs and pedals.

2. A Synthesizer

   This accepts MIDI data.
   It Maps channels to DSP.
   It Maps knobs** to effects like distortion and reverb.

   ** The positions of the knob are called patches.

3. A Sampler.

   This accepts MIDI data.
   It Maps channels to sound recordings.
   It Maps knobs to effects like distortion and reverb.

If you buy Music Hardware you have both 1 and 2.  The sequencing capabilities are limited in a synth,  so you can't Edit MIDI data in the instrument.

Some notes,

0. You can buy hardware and get a Synthesizer + a limited Sequencer.

1. You can buy A Sequencer and use a Computer as a Synthesizer

or

2. Use a Software Sequencer to Program your Synthesizer

or

3. Forget Hardware and go complete nuts with Software

<iframe width="480" height="360" src="//www.youtube.com/embed/VouHPeO4Gls" frameborder="0" allowfullscreen></iframe>

<p><a href="http://vimeo.com/93923609">Also, Robots love it.</a><p>

## Terms

Instruments used in Electronic Music

- Tr 909  
- Tr 303  
- Tr 808  

Instruments commonly used in Disco, Synth Wave and Funk

- Samplers
- FM Synthesiser

Rock Pedals used in

- Reverb (sludge)
- Delay (slow rock)
- Distortion (metal)

DAW Terms

- track
- sequencer
- piano roll
- OSC
- sampler
- soundfont
- synthesizer (DSP, FM, AM, AS, SS, PM)
- effect
- mixer, LFO
- automation, equalizer
- filter
- arpegiator



Added source/samples.md.



























>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
# Samples

You can use Sample URL to add samples from anywhere. Currently there are three samples available from the main site for use in the demos.

 - /Kick01.wav
 - /Snare19.wav
 - /Closedhat01.wav
- /MiscSynthStab04.wav
- /Perc11.wav
- /PianoStab03.wav
- /Snare06.wav
- /Snare12.wav
- /Snare09.wav

Added source/saving.md.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
# Saving and Sharing

There is a save button that converts the state of bitrhythm into a url paramter. This means there is an upper limit on how much code you can write, making it useful for demoscene like situations. You can share the url with tinyurl.

To make a complete song use `bars` to trigger multiple transitions.


Added source/source-code.md.































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Source Code and License

The literate code framework wheel uses extensively in this project is available [here](https://xyzzyapps.link/wheel).

The documentation, demo code and the source code in the following webpages is distributed under [creative commons, attribution-noncommercial-sharealike license](https://creativecommons.org/licenses/by-nc-sa/4.0/). The source code is self-hosted using fossil [here](https://fossil.xyzzyapps.link/bitrhythm/timeline). You can report issues, browse and download the source code from fossil. An Iframe is provided below. You can also get the latest source code [here](https://fossil.xyzzyapps.link/bitrhythm/download).

<iframe style="width:100%; height:75vh" src="https://fossil.xyzzyapps.link/bitrhythm/dir?ci=tip" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Coding conventions

1. 4 Spaces
2. EcmaScript5

Written using the Vim editor.

Added source/tweaking.md.



















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# What exactly is Tweaking ?

For that you need some context.

Historically speaking, music was an accompaniment for theatrical plays. A typical song has a Theme and develops Exposition / Conflict / Resolution through time. Its not a coincidence that the sonata and the dramatic structure share the same form. In a typical play you have scenes, transitions, sets in the background and characters in the foreground. While the play progresses and characters clash you get music alongside each of these elements. Every song has a title that guides the listener to what the song is about. Typical Scenes include intro, bridge, buildup, section, breakdown and climax. What is the intro about ?  What is the bridge about ?  What is the verse about ?  What is the chorus about ?  What are the sections about ? The essential question driving any story is how to be ? In a drama this question is answered with doubts, emotion, circularity, warnings from the chorus, exposition, rises, falls, reprisals, conclusions, contradictions, denouncements, confrontations, mistakes, reversals, recognition, revelation resolution, statements and breakdowns.

Modern music has evolved to be standalone but it retains elements of theatrical story telling. You can divide a song into verses and sections. In the documentation, we will use the terms from plays. Within each musical scene you typically have,

- Background: You use layers of rhythm and groove to set the mood.
- Foreground: Lead (Soliloquy), Counterpoint (Character Conflict), Call Response(Dialogues), Motif, Ornaments (Exposition)

In Electronic Music, the foreground is mainly developed using Layers(polyrhythms) and Tweaking. Tweaking and Layers effectively function for the purposes of Exposition and Conflict. Chorus, Fade, Drop are used for transitions typically in electronic music. Tweaking is also called knob-twisting by hardware users. To compare the foreground in others,   

Classical Music: Counterpoint and Harmony  
Rock: Call Response   

Now EDM - Dub, Techno and Jungle - are distinct musical genres. What could they possibly share ?

1. All three uphold the primacy of Rhythm for start.
2. All three are instrumental.
3. Voices are used sparingly as samples.
4. All three have a tradition of live acts.
5. Dub Plates are common for these genres.
6. Melody is nothing but a repeating stab (motif)

If you want to add a solo to EDM, you typically add a live instrument.

Dub Music is made by messing with the Recording Engineer's Mixing desk. A prime example of tweaking.

<iframe width="420" height="315" src="https://www.youtube.com/embed/oJs1wR8tLr4" frameborder="0" allowfullscreen></iframe>

Techno is made by messing with Hardware or Hardware + Software.  Tweaking + Layering.

<iframe width="560" height="315" src="https://www.youtube.com/embed/ppEhaH3jSzo" frameborder="0" allowfullscreen></iframe>

Jungle is used as a catch all for Breakbeat, Hardcore as well. Jungle Music is made by messing with Hardware + Software combo. Complex Layering is used here.

<iframe width="560" height="315" src="https://www.youtube.com/embed/q72qoGYirwU" frameborder="0" allowfullscreen></iframe>

Bitrhythm only supports rhythmic notations and is geared towards electronic music. My current goal is to produce an IDM track and Chiptune with it with complex rhythmic patterns. As for techno the current setup seems alright. Support will be added in the future for pitch manipulation in a different module or a different project. There is a piano module in the code with midi support but its currently deactivated.

You can treat a musical scale as no different than a drumset. The pentatanic scale approximately maps to a drumset and you can use techniques from [melodic drumming](https://www.youtube.com/watch?v=1qdyxML4tF0) with multiple samples. This is typically how drummers approach guitars.

## Is Bitrhythm Maths heavy ?

You will need some basic maths operations to understand and use bitrhythm effectively. These operations are about working with lists of numbers and lists of strings.

Some common operations on lists include

- Rotate
- Invert
- Slicing
- Choose
- Reverse
- Shuffle
- Filter
- Map

Other math operations are useful for working with envelope ranges,

- Clamp
- Ramp
- Waves

Programming is not that difficult. Programming is about organising reactions to events. A typical event comes from

1. The timer
2. User interface elements like sliders and dials
3. Data change

A typical reaction to an event (often called a handler) either changes data or displays data. A data change triggers more events. Other programming concepts needed for birthythm

As Tone.js provides the bulk of sound generation in Bitrhythm you should make youself comfortable with its APIs.

You will also need to understand

- Conditions
- Loops
- Functions
- Javascript Math.random
- Modulo Arithmetic
- SetInterval Timers

What comes next - This is the pertinent question when composing music. If you are feeling adventurous you can try to use,

1. Mathematical patterns like fibonacci series, geometric series,
pi, fractals ...
2. Neo-Riemannian_theory, Combinatory theory
3. Sacred Geometry
4. Circle of fifths, chord progressions
5. Set transformations like inversion on Scales
6. Licks from books
7. Randomness, I Ching, Playing Cards

## DJ Controls

```{todo}
Expand
```

Essentially a DJ is like a conductor. Loops are like individual instrumentalists.

1. Cueing -> Mute / Solo
2. Dynamics -> Volume
3. Ornamentation -> Cutoff
5. Tempo, Beat Counting -> Beat Matching

## Music is arrangement

<iframe width="420" height="315" src="https://www.youtube.com/embed/tprMEs-zfQA" frameborder="0" allowfullscreen></iframe>

## See Also

In screenplays you also have a [setup / payoff](https://www.youtube.com/watch?v=cG5zKwmXLgo) dynamic.

Setup
- Obstacles
- Challenges
- Forces
- Context

Added source/what.cog.



























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# What is bitrhythm about ?

Currently this is how you can use code with music,

1. VST plugins
2. DAW scripting
3. Embedded code to interact with electronics
4. ML approaches
5. Live coding
6. Use some weird algorithms / number sequences / hardcoded chords / random numbers
7. Web Audio / Audio Programming languages

Bitrhythm offers 4-7.  In Bitrhythm you get a coding playground to explore and learn webaudio and webgl apis for the purposes of

1. live visual programming
2. live audio programming
3. music sequencing
4. interactive music
5. audio visualisation
6. music learning

Apart from the core html apis, you can also use the following libraries

1. Tuna
2. Timbral
3. Tone.js
4. Underscore / Rambda
5. cellx
6. Magenta.js (Machine Learning)
7. Three.js / P5.js / D3 / Paper.js
8. Winamp Visualisations (butterchurn)

```{code-block} html
---
force: true
---
@<
import common
cog.out(common.external_libraries)
@>
@@
```

## About Author

I make [web apps](https://xyzzyapps.link) apps for a living. I started messing with algorithmic composition using pure data around 2011.  Although nothing much came out of it musically, it transformed the way I view programming. The unix pipes concept is identical to the data flow model in pure data; albeit with more connections.

For my music I moved onto Electribe, Renoise, Reaper and live looping with my guitar. I started exploring sonic pi in 2019 but TBH none of the live coding tools were doing what I wanted - basically tweaking /knob-twisting in techno so I started my work on this project. [This library](https://www.youtube.com/watch?v=adz1Gv5Lm34) in sonic pi comes close to what I am trying todo with this project. In bitrhythm time is divided into ticks like renoise tracker.

After my initial work on the project in 2019, the project got sidetracked. After seeing [endless acid banger](https://www.vitling.xyz/toys/acid-banger/) I had an epiphany to work on this project again. I was able to compose an endless and interactive dubtechno demo track. In March 2021, I also picked up on literate programming so this document will have both code and documentation intertwined.

The documentation for the literate programming project - wheel is [available here](https://xyzzyapps.link/wheel/).

## Support this project

My goal is to make bitrhythm easy for both professionals and music learners. Support my work to get regular updates. Supporters will also get free accounts when I add pro features! Also get notified on latest developments and tutorials in the web audio world.

<p><script src="https://gumroad.com/js/gumroad.js"></script><a class="gumroad-button" href="https://gumroad.com/l/kQSCv" target="_blank" rel="noopener"><span class="gumroad-button-logo"></span>Support Bitrhythm</a></p>

You can find me on [theaudioprogrammer](https://theaudioprogrammer.com/) and algorave discord as @xyzzy.

## Future Features

- Saving Songs
- More Synths with Presets
- Visualisation Presets
- Autocomplete Rhythms and Chords
- Automation Recording
- Version Control
- Record
- Midi Support
- More tutorials and examples on Web APIs
- Synthesizer
- Collaboration
- Adding DJ Transition / Hints support


Added source/what.md.



































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# What is bitrhythm about ?

Currently this is how you can use code with music,

1. VST plugins
2. DAW scripting
3. Embedded code to interact with electronics
4. ML approaches
5. Live coding
6. Use some weird algorithms / number sequences / hardcoded chords / random numbers
7. Web Audio / Audio Programming languages

Bitrhythm offers 4-7.  In Bitrhythm you get a coding playground to explore and learn webaudio and webgl apis for the purposes of

1. live visual programming
2. live audio programming
3. music sequencing
4. interactive music
5. audio visualisation
6. music learning

Apart from the core html apis, you can also use the following libraries

1. Tuna
2. Timbral
3. Tone.js
4. Underscore / Rambda
5. cellx
6. Magenta.js (Machine Learning)
7. Three.js / P5.js / D3 / Paper.js
8. Winamp Visualisations (butterchurn)

```{code-block} html
---
force: true
---

<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/tensorflow/1.2.8/tf.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@magenta/music@^1.0.0/es6/core.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@magenta/music@^1.0.0/es6/music_vae.js"></script>

<script sec="https://mohayonao.github.io/timbre.js/timbre.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tunajs/1.0.1/tuna-min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tone/14.7.77/Tone.js" integrity="sha512-gwSDP1iEKl4KG0wi3N89RAJU91s78jb/TGC6lsbF5IyR2c19Rn7Jl1icK4K4kUiJNwQUEPI7o98T+GJVWNuvIQ==" crossorigin="anonymous"></script>
<script src="/teoria-master/teoria.js"></script>

<script src="https://cdn.jsdelivr.net/npm/p5@1.3.1/lib/p5.js"></script>
<script src="https://cdn.jsdelivr.net/npm/d3@5.7.0/dist/d3.min.js"></script>
<script src="https://threejs.org/build/three.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.12.11/paper-full.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/butterchurn@2.6.7/lib/butterchurn.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/butterchurn-presets@2.4.7/lib/butterchurnPresets.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/webmidi@2.0.0"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="/nexus-js/dist/NexusUI.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/cellx/1.10.19/cellx.umd.min.js" integrity="sha512-ojEcAP3e6N+n5MDKPW6CexXzuLDahDPkNZmzyRV4t2zqh9nwljJNuV8JGa+xjpnAaGB/FhsAU7P6IHEP0dtJQA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
```

## About Author

I make [web apps](https://xyzzyapps.link) apps for a living. I started messing with algorithmic composition using pure data around 2011.  Although nothing much came out of it musically, it transformed the way I view programming. The unix pipes concept is identical to the data flow model in pure data; albeit with more connections.

For my music I moved onto Electribe, Renoise, Reaper and live looping with my guitar. I started exploring sonic pi in 2019 but TBH none of the live coding tools were doing what I wanted - basically tweaking /knob-twisting in techno so I started my work on this project. [This library](https://www.youtube.com/watch?v=adz1Gv5Lm34) in sonic pi comes close to what I am trying todo with this project. In bitrhythm time is divided into ticks like renoise tracker.

After my initial work on the project in 2019, the project got sidetracked. After seeing [endless acid banger](https://www.vitling.xyz/toys/acid-banger/) I had an epiphany to work on this project again. I was able to compose an endless and interactive dubtechno demo track. In March 2021, I also picked up on literate programming so this document will have both code and documentation intertwined.

The documentation for the literate programming project - wheel is [available here](https://xyzzyapps.link/wheel/).

## Support this project

My goal is to make bitrhythm easy for both professionals and music learners. Support my work to get regular updates. Supporters will also get free accounts when I add pro features! Also get notified on latest developments and tutorials in the web audio world.

<p><script src="https://gumroad.com/js/gumroad.js"></script><a class="gumroad-button" href="https://gumroad.com/l/kQSCv" target="_blank" rel="noopener"><span class="gumroad-button-logo"></span>Support Bitrhythm</a></p>

You can find me on [theaudioprogrammer](https://theaudioprogrammer.com/) and algorave discord as @xyzzy.

## Future Features

- Saving Songs
- More Synths with Presets
- Visualisation Presets
- Autocomplete Rhythms and Chords
- Automation Recording
- Version Control
- Record
- Midi Support
- More tutorials and examples on Web APIs
- Synthesizer
- Collaboration
- Adding DJ Transition / Hints support


Added templates/index.html.























































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="utf-8">

        <title>Bitrhythm</title>

        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Expires" content="0" />

        <meta content="Bitrhythm" name="description" xml:lang="en" lang="en">
        <meta content="literate programming, p5, live coding, algorave, demoscene, creative programming, music, techno, programming, webaudio, webgl, p5, improvising">

       
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/tensorflow/1.2.8/tf.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@magenta/music@^1.0.0/es6/core.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@magenta/music@^1.0.0/es6/music_vae.js"></script>

<script sec="https://mohayonao.github.io/timbre.js/timbre.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tunajs/1.0.1/tuna-min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tone/14.7.77/Tone.js" integrity="sha512-gwSDP1iEKl4KG0wi3N89RAJU91s78jb/TGC6lsbF5IyR2c19Rn7Jl1icK4K4kUiJNwQUEPI7o98T+GJVWNuvIQ==" crossorigin="anonymous"></script>
<script src="/teoria-master/teoria.js"></script>

<script src="https://cdn.jsdelivr.net/npm/p5@1.3.1/lib/p5.js"></script>
<script src="https://cdn.jsdelivr.net/npm/d3@5.7.0/dist/d3.min.js"></script>
<script src="https://threejs.org/build/three.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.12.11/paper-full.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/butterchurn@2.6.7/lib/butterchurn.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/butterchurn-presets@2.4.7/lib/butterchurnPresets.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/webmidi@2.0.0"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="/nexus-js/dist/NexusUI.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/cellx/1.10.19/cellx.umd.min.js" integrity="sha512-ojEcAP3e6N+n5MDKPW6CexXzuLDahDPkNZmzyRV4t2zqh9nwljJNuV8JGa+xjpnAaGB/FhsAU7P6IHEP0dtJQA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


        <link rel="preconnect" href="https://fonts.gstatic.com">
        <link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,700;1,100;1,200;1,300;1,400;1,500;1,700&display=swap" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css2?family=Major+Mono+Display&family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,700;1,100;1,200;1,300;1,400;1,500;1,700&display=swap" rel="stylesheet">

        <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
        <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/micromodal/0.4.6/micromodal.min.js" integrity="sha512-RMMh+IHzfZLsVFo1rX9PBoysxrJJqjyOS31HYWftobWtv2At6KBTqKpvVDIWAjL5aiV+LjFqkQ6e53Rdw3VOBg==" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/whenipress@1.8.0/dist/whenipress.js"></script>

        <script src="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/alertify.min.js" integrity="sha512-JnjG+Wt53GspUQXQhc+c4j8SBERsgJAoHeehagKHlxQN+MtCCmFDghX9/AcbkkNRZptyZU4zC8utK59M5L45Iw==" crossorigin="anonymous"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/css/alertify.min.css" integrity="sha512-IXuoq1aFd2wXs4NqGskwX2Vb+I8UJ+tGJEu/Dc0zwLNKeQ7CW3Sr6v0yU3z5OQWe3eScVIkER4J9L7byrgR/fA==" crossorigin="anonymous" />
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.13.1/css/themes/default.min.css" integrity="sha512-RgUjDpwjEDzAb7nkShizCCJ+QTSLIiJO1ldtuxzs0UIBRH4QpOjUU9w47AF9ZlviqV/dOFGWF6o7l3lttEFb6g==" crossorigin="anonymous" />

        <script src="/json-url-master/dist/browser/json-url.js"></script>
        <script src="/riot-3.13.2/riot+compiler.js"></script>

        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.1.2/tailwind.min.css" integrity="sha512-RntatPOhEcQEA81gC/esYoCkGkL7AYV7TeTPoU+R9zE44/yWxVvLIBfBSaMu78rhoDd73ZeRHXRJN5+aPEK53Q==" crossorigin="anonymous" />
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/lib/codemirror.css">
        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/addon/hint/show-hint.css">
        <script src="https://esironal.github.io/cmtouch/lib/codemirror.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/hint/show-hint.js"></script>
        <script src="http://esironal.github.io/cmtouch/addon/hint/xml-hint.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/hint/html-hint.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/xml/xml.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/javascript/javascript.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/css/css.js"></script>
        <script src="https://esironal.github.io/cmtouch/mode/htmlmixed/htmlmixed.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/selection/active-line.js"></script>
        <script src="https://esironal.github.io/cmtouch/addon/edit/matchbrackets.js"></script>
        <link rel="stylesheet" href="https://esironal.github.io/cmtouch/theme/neonsyntax.css">
        <link rel="stylesheet" href="https://unpkg.com/pyloncss@latest/css/pylon.css"/>


        <script src="/tune.js"></script>
        <script src="/misc.js"></script>

        <style type="text/css">
body {
    background: black;
    color: white;
    font-family: 'Roboto Mono', monospace;
}

a {
    color: white;
}

input {
    color: black;
}

.btn {
    background: white;
    color: black;
    padding: 4px;
}

.CodeMirror {
    font-size: 12px;
    width: 100%;
    padding-left: 4px;
    line-height: 1;
    background: transparent !important;
    color: white !important;
    font-family: 'Roboto Mono', monospace !important;
}

.CodeMirror-vscrollbar, .CodeMirror-hscrollbar {
    overflow-x: hidden !important;
    overflow-y: hidden !important;
}

.CodeMirror-cursor {
  border-left: 2px solid white !important;
}

.CodeMirror pre,
.CodeMirror-line > span,
.CodeMirror-lines {
  padding: 0 !important;
}


        </style>

        <script type="riot/tag" src="/components/bitrhythm.tag"></script>
        <script type="riot/tag" src="/components/dial.tag"></script>
        <script type="riot/tag" src="/components/sample.tag" ></script>
        <script type="riot/tag" src="/components/number.tag" ></script>

        <script>
            window.goatcounter = {
                path: function(p) { return location.host + p }
            }
        </script>
	    <script data-goatcounter="https://analytics.xyzzyapps.link/count" async src="//analytics.xyzzyapps.link/count.js"></script>
    </head>

    <body>
        <div class="containera-full">
            <hstack class="mb-2">
                <h5 class="ml-4"><a href="/docs/index.html" target="_blank">Docs</a></h5>
                <h5 class="ml-4"><a target="_blank" href="/issue">Report bugs / Feedback</a></h5>
                <h5 class="ml-4"><a href="/song/XQAAAALHCwAAAAAAAABDKUqGU5vI8Eygv8VLc6H1NFIzdYQ4SmT-79BTKosH6Xje2IYnNRgEOpeuhg9Ej9Iz-_uEg-npGX0y9CmzyyVpwgaOUrKNlF-pzVXf3YmslEqBloRY0JslK5KapeSFSSH9ScweRgAPu9a4t1L0-t71Xb9Eb3KJ-lezPo7xcmK9xCnNGorm__kixtPuM_8L3YNc30OA3GMBPHu5pAH__cKjLF6k5mCGKsNp8WFWYQACckBR03VaZGhfZv946NYyFQlw6boXQuVis292UUboEkaCJ0CV5wGurbJUA7il2uX-okyMSjx7WVseVG-zDQ0wBjbMLNYnXzoT0kYxI_6-GOAOVamJJHTrkulVfd1k0AgzCHByI6zCNtWyBa3i_2ks4ncMec8vqsjAy8BhwFAbKAP1RDKh7MUxwsecBuzyLR0hKGddivZmPn-xyYB-p8-Xru_Min2-3Z_3YZal2_wv8s6cIcqPAJ4wf5DH29U7le-eRLcUN6lhK77651_xeU--z7A6E3NDQ6WEb6UPc-brxTz-L-wZwFwy95QkwAZw4bWR2LNW78DVdCSnMC8zf-DVWgFkKP9SU9iGQj6yk6E8qBAlZfd3YavthZBdwhs2mtzsvIL8qcBTBRhy2Fxx5n5tLq2lXuPkH19-cqIoJCHJUjiuGKWh3PqOAnTj9n2PejvNlp1GUMMixR7YMUofcLeA5oQCQpMSuIEP8sUshtk3zY35vG4xr3FfPj7OZiOQx5jRtMaw7l8xqFVm_PZ-kEgxoIVFtpZFcgsACnuBeJF1yZ2ss1GN95XEt9BsF3UY_UM1x8ePgY8BL4WH7BcHZRCOV2YZeRXZ6sYLNjKBjGVD_FAR_ZL6yd6l_1wqpQJPb3lL1fhBecNTcaXAn61RhySOvokAJ5TcrTtqdhsGEBUnaQOGRIfKU0NV4zPmgTm9TLASz5gs1VRoUZ06htWirfNfjiWNrbw8I9ggo8KMKwDZ2v4CnfqyL4eCpFNZjVIYOEWGGktLAadafQjdjOkWHWF8KIdr3uPBt1kXY_-IEkn11gjmn1q9ybgMLxriz7kWqzyawAEpqM27wzIwET2smzbJ-zHcx01rdHu3AqLMHk-AliQLGvGknluJNjWmK-WFwZUR8ZokJ6cVYW70a6X1dYWncQsPwyC3AOplDyUChlC_Rmgvz9fqeMs-fXub0odr01b7PFrraLWJ02Xk7trVq_Gqh8V2A2LATUKewJT05dG0bVJTBdM9n86C-mgyLf7s7JeNf9ul97CsS3BalNZ--N0hfkPbT_VPU9heFko9goG_mkF7Ky6FbtVpERCqw7UbvPgdFdIOEkoqPYEwAmjwzva2U-7cLo3g3uEQq1NBV3C8LijP10-1Avqu2df_R8XtykOk4H8yitylcxka4vSq1Jo2fv-wp74EiJi6Tn6T3epZJYXAMBRXRxozyl1r4lbOqRjDfqjWRTRrr8l9U2iKbAiIz6Ssy74Ic9sQABR9F4UahwsDQuJgjOHKdaLXmBHoPuD7nX_9mMYV">Example1</a></h5>
                <h5 class="ml-4"><a href="/song/XQAAAALYEwAAAAAAAABDKUqGU5vI8Eygv8VLc6H1NFIzdYQe5mT-79BTKosH6Xje2IYnNRgEOpeuhg9NTfIT-_uEg-npGX0y9CmzyyVpwgaOUrKNlF-pzVXf3YnQ2gSfpzY3zlYLujavQRq73hSEM-RaGxTxuud9naok9rMpYn-UCaNiF2zrnnqUB61s_22pYOE_9KuFo7vEJMCtU2bkxyNdgSXzwmIDuo8OyxcIh9HQP59UZbNRixlBnmw73PnywS5DJBoH8NEIAnlLpL4rqaokfN9Cfte0Id3929n26IjA7zVZF75ovX37KO1xT9iBa8gt-w8cvYBdIdVL5JUOrbf0ccVJSoXGFoM0U4GXoEDThw00FdKnfsq1WeJjEQt4Qn8f90TkkQgkpSajR9dA0AJBqKDuVeEgDoFsbVI-ZZVvJW2dD_9GIm5PpQSTzpuBslzD7ZJQSI3XA1g2F_QP4w6U4rOrTMZUQSr___s22d8Plp0FbffDCq8dri0C8kUYPqS_np_Nnr7sDY9KsxgNZJmUxYkt1XBTO3iWmR6RZ7OFk6PZ8R44NXwhvxbUEikMoboPSW1XPiV4xtCfZb4qE4yCP2xHPlEniUhcNrWc5608hrNkVfpQUmYLFvXFTyUHA4aOkRDoHf0jHwGzyBV-YanP65YlZpupZC4oW3bjhO01tfh_qYWNA_ZpDVCCXRoGZJfrBjkmaYom9Gd6mvGVzillbk6LD0_Amu_Zublb4_AZ1SAxKSWlMfbmbXQfW16RSMidtmTCKAMmF9LCONKcjTR_1P2vU3fPR7hBhRtbtNR0xNEfRstXJ81ZcyC5YTK8dnpMwMXKk5uoaBMDbochbAKXaswgZKIn2usyi5Z4pyQf8xCSheQawyYSA031ZHA3wRuq_7rjhn0bXZrEGnB0QFzxgM-dYsY7CUojKr8ziZGXGb9zoVHvGDI0SIFyFIrMs6kEzpZAq_CnJyqJi4nbbqfoHlE3nDyLNKFk1e4OHqPsU9G1LRNnHBwSjiJCnvZO_xv_VQbtWmQwLrT7j6PZeXvNOz-yKWQFcE-0RXn6-EuqT7LNTF1GSo2o9AFS5Z2PJqIXioD9ebr9xjFXNrfTdIe32dgcgQHVHNyjEIH22AABUQWYtHRvZQpcfsUjJQM140MJ8nmpjmxlhtAMEstPzbGYUKZdjhF1LkeePxXD46zniN9cFEtRPTNR9luP4W2rhfHnvP4_tRAipmQiB_6RSRvLaiVYfkYYXdzMkX_M5blfwCKQ-DyDFy0hTw3mYZ-SbYT11RVO-5dEm_YntYmgQOI1FI7AhMxpmyE27Lwb73oDO0SeS-SDj4T6nbfltfHdWDPFaeUWd12KRmI-E8AQCcnmJayoBnMXyXNw3muX0319WhuitTtab3n3vwZM1e7ku11q1rNoaA3VXLbBJdyS1Vxvdvm8Tled56S54siOsEYGRqmdiC3gO2ZGaBq68SJZ9zxe9yttNFEXFFgWYFnIn_EMSTNj1ILB0wkOQPzsjFXEEa3W6esXTujFuoHK05q4rrfYicKZkq01hfaoZcovIbDFNyGtpgEzn-BFPJXKWwqn5gkgrvZiYxVxG7a449Gjj_R2HqNbbiTmd1la0MKDnVLWv9yXXRdRLQrKC4Z2kAJIOdwxluk6fRBFzRWT_o046yjM-nvgp3KLJU-n_CWu3mgfmQi5vCbNxRczEeyaJGg3DJL-anxXk0A2CFsFCXRLccmhHV7MjQdh4sdvnvl3JO1Ypt1_nsBXQJqXvahwkjpEC5jzduvTd0rIHgDBAzO3PA7YNjWF_r1EmagtsB_1VFSRqAQdXjbEep8SLKNqv8N7ILkix2NeTM30r9xyXtXcGOOmoQK4AMk1tHBmQ4m6YYNalWXJ_aGIjdBgx4jgsRYjWp1H9qRr0wMkmG75zOSbuOy_lg5-C-xbszvp7B5YELZblpjnpXCW8AhXMWCLM_iG16lkgw24Z40VWh4Q9DCXoMgZmOXm-98WidEFfkMP_8L7sdQjWRxMAodkLhUkHnsBRlYNChmAexNvzKW3xiiDhC_k6qKRfldVgCGSBFfpldJF_8e7EyQ">Example2</a></h5>
                <h5 class="ml-4"><a href="/docs/demo.html">See Demo Song // Techno</a></h5>
            </hstack>

            <bitrhythm song="{{data}}"></bitrhythm>
        </div>

    <script>
        riot.compile(function() {
            var bitrhythm = riot.mount('bitrhythm');
            window.bitrhythm = bitrhythm[0];
            var dial = riot.mount('dial');
            var number = riot.mount('number');
            var sample = riot.mount('sample');
        })
    </script>


    </body>

</html>

Added templates/page.html.



























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Expires" content="0" />
        <title>About birthythm</title>
        <link rel="icon" href="favicon.ico">
        <style>
        html, body {
            margin: 0;
            width: 100%;
            height: 100%;
            padding: 0;
        }
        iframe {
            position:fixed;
            top:0;
            left:0;
            bottom:0;
            right:0;
            width:100%;
            height:100%;
            border:none;
            margin:0;
            padding:0;
            overflow:hidden;
            z-index:999999;
        }
        </style>
        <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
        <script>
            window.goatcounter = {
                path: function(p) { return location.host + p }
            }
        </script>
        <script data-goatcounter="https://analytics.xyzzyapps.link/count" async src="//analytics.xyzzyapps.link/count.js"></script>
    </head>
    <body>
        <iframe src="https://blog.xyzzyapps.link/bitrhythm-submit-issue-feedback" frameborder="0"></iframe>
    </body>
</html>

Added wheel.sh.











































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/local/Cellar/fish/3.2.2_1/bin/fish

set DEV "1"

function build
    kill -9  (cat ./pidfile)
    rm source/main.md
    rm source/what.md
    ./env/bin/cog --markers="@< @> @@" -D DEV=$DEV -d source/main.cog > source/main.md
    ./env/bin/cog --markers="@< @> @@" -D DEV=$DEV -d source/what.cog > source/what.md
    hy bitrhythm.hy &
    set PID %1
    rm -rf build
    make html
    echo $PID > ./pidfile
end

function final
    set DEV "0"
    build
end

function pack
    rm bitrhythm.tgz
    gtar  -czv --exclude "public/closed" --exclude "_sources" --exclude "searchindex.js" --exclude ".DS_Store" --exclude "*.inv" --exclude "__init__.py" --exclude "doctrees"  --exclude "__pycache__" --exclude "*.tcl" --exclude "*.tgz" --exclude "draft" --exclude "*env*" --exclude "tags" --exclude "tags.*" --exclude "*.git" -f bitrhythm.tgz .
end

switch $argv[1]
        case "--prod"
            final
        case "--dev"
            build
        case "--zip"
            pack
end