提交 8553aae0 编写于 作者: dallascao's avatar dallascao

1

上级
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.
# Apache Roller
[Apache Roller](http://roller.apache.org) 是一个基于 Java 的、功能齐全的、多用户和组博客服务器,适合于大小博客网站。
Roller 通常与 Apache Tomcat 和 MySQL 一起运行。 Roller 由以下专家组成 Projects :
* Roller -项目:顶级项目
* 应用程序: Roller WebLogger WebApp,JSP 页面,Velocity 模板
* Assembly-Release:用于创建 Roller 的正式发行版
* 文档:ODT 格式的 Roller 文档
* IT-Selenium: Roller 使用 Selenium 的集成浏览器测试
## 文档
Roller 安装、用户和模板指南以 ODT 格式(对于 OpenOffice 或 LibraOffice)提供:
* <https://github.com/apache/roller/tree/master/docs>
## 有关更多信息
点击 Roller 汇流维基:
* 如何构建和运行 Roller :<https://cwiki.apache.org/confluence/x/EM4>
* 如何为 Roller 做出贡献:<https://cwiki.apache.org/confluence/x/2hsB>
* 如何发布 Roller :<https://cwiki.apache.org/confluence/x/gycB>
* 其他开发人员资源:<https://cwiki.apache.org/confluence/x/D84>
## 安装 Roller
如果你希望在生产中运行 Roller ,那么你应该下载最新的官方版本,并按照安装指南进行安装,你可以在文档链接中找到该指南:<https://github.com/apache/roller/tree/master/docs>
## 快速启动:通过 Maven 运行
你可能不应该使用这种技术在生产中运行 Roller ,但是这是一种相对简单的方法,可以自己尝试 Roller 。假设你有一个 UNIX shell、Java、Maven 和 Git:
获取代码:
$ git clone https://github.com/apache/roller.git
编译和构建 Roller :
$ cd roller
$ mvn -DskipTests=true install
使用嵌入式 Derby 数据库在 Jetty 中运行 Roller (仅用于测试):
$ mvn jetty:run
一旦 Jetty 启动并运行,浏览 <http://localhost:8080/roller> 以尝试 Roller 。
## 快速启动:通过 docker 运行
另一种尝试 Roller 的方法是使用 docker 。这实际上比通过 Maven 运行更容易,因为你不需要 Maven 或 Java。如果你有 docker ,这里是如何运行 Roller 用于演示目的。
获取代码:
$ git clone https://github.com/apache/roller.git
运行 docker Compose 来构建和启动 Roller 以及 PostgreSQL 数据库:
$ cd roller
$ docker-compose up
构建和启动 docker 图像需要一段时间。完成后,浏览 <http://localhost:8080/roller> 以尝试 Roller 。
<svg height="1024" width="896" xmlns="http://www.w3.org/2000/svg">
<!-- MIT license https://octicons.github.com -->
<path d="M128 768h256v64H128v-64z m320-384H128v64h320v-64z m128 192V448L384 640l192 192V704h320V576H576z m-288-64H128v64h160v-64zM128 704h160v-64H128v64z m576 64h64v128c-1 18-7 33-19 45s-27 18-45 19H64c-35 0-64-29-64-64V192c0-35 29-64 64-64h192C256 57 313 0 384 0s128 57 128 128h192c35 0 64 29 64 64v320h-64V320H64v576h640V768zM128 256h512c0-35-29-64-64-64h-64c-35 0-64-29-64-64s-29-64-64-64-64 29-64 64-29 64-64 64h-64c-35 0-64 29-64 64z" />
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Feather" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 2392.5 4226.6" enable-background="new 0 0 2392.5 4226.6" xml:space="preserve">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-5167.0962" y1="697.5549" x2="-4570.1162" y2="1395.619" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0" style="stop-color:#F69923"/>
<stop offset="0.3123" style="stop-color:#F79A23"/>
<stop offset="0.8383" style="stop-color:#E97826"/>
</linearGradient>
<path fill="url(#SVGID_1_)" d="M1798.9,20.1C1732.6,59.2,1622.5,170,1491,330.5l120.8,228c84.8-121.3,170.9-230.4,257.8-323.6
c6.7-7.4,10.2-10.9,10.2-10.9c-3.4,3.6-6.8,7.3-10.2,10.9c-28.1,31-113.4,130.5-242.1,328.1c123.9-6.2,314.3-31.5,469.6-58.1
c46.2-258.8-45.3-377.3-45.3-377.3S1935.5-60.6,1798.9,20.1z"/>
<path fill="none" d="M1594.4,1320.7c0.9-0.2,1.8-0.3,2.7-0.5l-17.4,1.9c-1.1,0.5-2,1-3.1,1.4
C1582.6,1322.6,1588.5,1321.6,1594.4,1320.7z"/>
<path fill="none" d="M1471.1,1729.1c-9.9,2.2-20,3.9-30.2,5.4C1451.1,1733,1461.2,1731.2,1471.1,1729.1z"/>
<path fill="none" d="M633.1,2645.2c1.3-3.4,2.6-6.8,3.8-10.2c26.6-70.2,52.9-138.4,79-204.9c29.3-74.6,58.2-146.8,86.8-216.8
c30.1-73.8,59.8-145.1,89.1-214c30.7-72.3,61-141.9,90.7-208.9c24.2-54.5,48-107.3,71.5-158.4c7.8-17,15.6-33.9,23.4-50.6
c15.4-33.1,30.7-65.6,45.7-97.3c13.9-29.3,27.7-57.9,41.4-86c4.5-9.4,9.1-18.6,13.6-27.9c0.7-1.5,1.5-3,2.2-4.5l-14.8,1.6
l-11.8-23.2c-1.1,2.3-2.3,4.5-3.5,6.8c-21.2,42.1-42.2,84.6-63,127.5c-12,24.8-24,49.7-35.9,74.7c-33,69.3-65.5,139.2-97.4,209.6
c-32.3,71.1-63.9,142.6-94.9,214.2c-30.5,70.3-60.3,140.7-89.6,210.9c-29.2,70.1-57.7,140-85.6,209.4
c-29.1,72.5-57.4,144.3-84.8,215.3c-6.2,16-12.4,32-18.5,48c-22,57.3-43.4,113.8-64.3,169.6l18.6,36.7l16.6-1.8
c0.6-1.7,1.2-3.4,1.8-5C580.1,2786.5,606.7,2714.9,633.1,2645.2z"/>
<path fill="none" d="M1433.2,1735.7L1433.2,1735.7c0.1,0,0.1-0.1,0.2-0.1C1433.4,1735.6,1433.3,1735.6,1433.2,1735.7z"/>
<path fill="#BE202E" d="M1393.2,1934.8c-15.4,2.8-31.3,5.5-47.6,8.3c-0.1,0-0.2,0.1-0.3,0.1c8.2-1.2,16.3-2.4,24.3-3.8
C1377.6,1938,1385.4,1936.5,1393.2,1934.8z"/>
<path opacity="0.35" fill="#BE202E" d="M1393.2,1934.8c-15.4,2.8-31.3,5.5-47.6,8.3c-0.1,0-0.2,0.1-0.3,0.1
c8.2-1.2,16.3-2.4,24.3-3.8C1377.6,1938,1385.4,1936.5,1393.2,1934.8z"/>
<path fill="#BE202E" d="M1433.6,1735.5c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0.1-0.2,0.1c2.6-0.3,5.1-0.8,7.6-1.1
c10.3-1.5,20.4-3.3,30.2-5.4C1458.8,1731.2,1446.3,1733.4,1433.6,1735.5L1433.6,1735.5L1433.6,1735.5z"/>
<path opacity="0.35" fill="#BE202E" d="M1433.6,1735.5c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0.1-0.2,0.1c2.6-0.3,5.1-0.8,7.6-1.1
c10.3-1.5,20.4-3.3,30.2-5.4C1458.8,1731.2,1446.3,1733.4,1433.6,1735.5L1433.6,1735.5L1433.6,1735.5z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-9585.3418" y1="620.5048" x2="-5326.209" y2="620.5048" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0.3233" style="stop-color:#9E2064"/>
<stop offset="0.6302" style="stop-color:#C92037"/>
<stop offset="0.7514" style="stop-color:#CD2335"/>
<stop offset="1" style="stop-color:#E97826"/>
</linearGradient>
<path fill="url(#SVGID_2_)" d="M1255.7,1147.6c36.7-68.6,73.9-135.7,111.5-201c39-67.8,78.5-133.6,118.4-197c2.3-3.7,4.7-7.5,7-11.3
c39.4-62.4,79.2-122.4,119.3-179.8l-120.8-228c-9.1,11.1-18.2,22.4-27.5,33.9c-34.8,43.4-71,90.1-108.1,139.6
c-41.8,55.8-84.8,115.4-128.5,177.9c-40.3,57.8-81.2,118.3-122.1,180.9c-34.8,53.3-69.8,108.2-104.5,164.5c-1.3,2.1-2.6,4.2-3.9,6.3
l157.2,310.5C1187.3,1277.6,1221.3,1212,1255.7,1147.6z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-9071.207" y1="1047.6898" x2="-6533.1782" y2="1047.6898" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0" style="stop-color:#282662"/>
<stop offset="9.548390e-02" style="stop-color:#662E8D"/>
<stop offset="0.7882" style="stop-color:#9F2064"/>
<stop offset="0.9487" style="stop-color:#CD2032"/>
</linearGradient>
<path fill="url(#SVGID_3_)" d="M539.7,2897.1c-20.8,57.2-41.7,115.4-62.7,174.9c-0.3,0.9-0.6,1.7-0.9,2.6c-3,8.4-5.9,16.8-8.9,25.2
c-14.1,40.1-26.4,76.2-54.5,158.3c46.3,21.1,83.5,76.7,118.7,139.8c-3.7-65.3-30.8-126.7-82.1-174.2
c228.3,10.3,425-47.4,526.7-214.3c9.1-14.9,17.4-30.5,24.9-47.2c-46.2,58.6-103.5,83.5-211.4,77.4c-0.2,0.1-0.5,0.2-0.7,0.3
c0.2-0.1,0.5-0.2,0.7-0.3c158.8-71.1,238.5-139.3,308.9-252.4c16.7-26.8,32.9-56.1,49.5-88.6C1009,2841.2,848.1,2881.8,678.6,2851
l-127.1,13.9C547.5,2875.6,543.6,2886.3,539.7,2897.1z"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="580.817" x2="-5086.9941" y2="580.817" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0.3233" style="stop-color:#9E2064"/>
<stop offset="0.6302" style="stop-color:#C92037"/>
<stop offset="0.7514" style="stop-color:#CD2335"/>
<stop offset="1" style="stop-color:#E97826"/>
</linearGradient>
<path fill="url(#SVGID_4_)" d="M599,2612.4c27.5-71,55.8-142.8,84.8-215.3c27.8-69.4,56.4-139.2,85.6-209.4
c29.2-70.2,59.1-140.5,89.6-210.9c31-71.6,62.7-143.1,94.9-214.2c31.9-70.3,64.4-140.3,97.4-209.6c11.9-25,23.9-49.9,35.9-74.7
c20.8-42.9,41.8-85.4,63-127.5c1.1-2.3,2.3-4.5,3.5-6.8l-157.2-310.5c-2.6,4.2-5.1,8.4-7.7,12.6c-36.6,59.8-73.1,121-108.9,183.5
c-36.2,63.1-71.7,127.4-106.4,192.6c-29.3,55-57.9,110.5-85.7,166.5c-5.6,11.4-11.1,22.6-16.6,33.9
c-34.3,70.5-65.2,138.6-93.2,204.1c-31.7,74.2-59.6,145.1-84,212.3c-16.1,44.2-30.7,86.9-44.1,127.9c-11,35-21.5,70.1-31.4,105
c-23.5,82.3-43.7,164.4-60.3,246.2L516.2,2830c20.9-55.8,42.3-112.3,64.3-169.6C586.6,2644.5,592.8,2628.4,599,2612.4z"/>
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-9035.5029" y1="638.4408" x2="-6797.2012" y2="638.4408" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0" style="stop-color:#282662"/>
<stop offset="9.548390e-02" style="stop-color:#662E8D"/>
<stop offset="0.7882" style="stop-color:#9F2064"/>
<stop offset="0.9487" style="stop-color:#CD2032"/>
</linearGradient>
<path fill="url(#SVGID_5_)" d="M356.1,2529.2c-19.8,99.8-33.9,199.2-41,298c-0.2,3.5-0.6,6.9-0.8,10.4
c-49.3-79-181.3-156.1-181-155.4c94.5,137,166.2,273,176.9,406.5c-50.6,10.4-119.9-4.6-200-34.1c83.5,76.7,146.2,97.9,170.6,103.6
c-76.7,4.8-156.6,57.5-237.1,118.2c117.7-48,212.8-67,280.9-51.6C216.6,3530.6,108.3,3868.2,0,4226.6c33.2-9.8,53-32.1,64.1-62.3
c19.3-64.9,147.4-490.7,348.1-1050.4c5.7-15.9,11.5-31.9,17.3-48c1.6-4.5,3.3-9,4.9-13.4c21.2-58.7,43.2-118.6,65.9-179.7
c5.2-13.9,10.4-27.8,15.6-41.8c0.1-0.3,0.2-0.6,0.3-0.8l-157.8-311.8C357.7,2521.9,356.8,2525.5,356.1,2529.2z"/>
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1021.6218" x2="-5086.9941" y2="1021.6218" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0.3233" style="stop-color:#9E2064"/>
<stop offset="0.6302" style="stop-color:#C92037"/>
<stop offset="0.7514" style="stop-color:#CD2335"/>
<stop offset="1" style="stop-color:#E97826"/>
</linearGradient>
<path fill="url(#SVGID_6_)" d="M1178.1,1370.3c-4.5,9.2-9,18.5-13.6,27.9c-13.6,28.1-27.4,56.7-41.4,86
c-15.1,31.7-30.3,64.1-45.7,97.3c-7.8,16.7-15.5,33.5-23.4,50.6c-23.5,51.1-47.3,103.9-71.5,158.4c-29.7,67-60,136.6-90.7,208.9
c-29.3,68.9-59,140.2-89.1,214c-28.6,70-57.5,142.3-86.8,216.8c-26.1,66.5-52.4,134.7-79,204.9c-1.3,3.4-2.6,6.8-3.8,10.2
c-26.4,69.7-53,141.3-79.8,214.7c-0.6,1.7-1.2,3.4-1.8,5l127.1-13.9c-2.5-0.5-5.1-0.8-7.6-1.3c152-18.9,354-132.5,484.6-272.7
c60.2-64.6,114.8-140.8,165.3-230c37.6-66.4,72.9-140,106.5-221.5c29.4-71.2,57.6-148.3,84.8-231.9c-34.9,18.4-74.9,31.9-119,41.3
c-7.7,1.6-15.6,3.2-23.6,4.6c-8,1.4-16.1,2.7-24.3,3.8l0,0l0,0c0.1,0,0.2-0.1,0.3-0.1c141.7-54.5,231.1-159.8,296.1-288.7
c-37.3,25.4-97.9,58.7-170.5,74.7c-9.9,2.2-20,3.9-30.2,5.4c-2.6,0.4-5.1,0.8-7.6,1.1l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1
c0,0,0.1,0,0.1-0.1l0,0c49.2-20.6,90.7-43.6,126.7-70.8c7.7-5.8,15.2-11.8,22.4-18.1c11-9.5,21.4-19.5,31.4-30
c6.4-6.7,12.6-13.6,18.6-20.8c14.1-16.8,27.3-34.9,39.7-54.6c3.8-6,7.5-12.1,11.2-18.4c4.7-9.1,9.2-18,13.6-26.8
c19.8-39.8,35.6-75.3,48.2-106.5c6.3-15.6,11.8-30,16.5-43.4c1.9-5.3,3.7-10.5,5.4-15.5c5-15,9.1-28.3,12.3-40
c4.8-17.5,7.7-31.4,9.3-41.5l0,0l0,0c-4.8,3.8-10.3,7.6-16.5,11.3c-42.8,25.6-116.2,48.8-175.4,59.7l116.7-12.8l-116.7,12.8
c-0.9,0.2-1.8,0.3-2.7,0.5c-5.9,1-11.9,1.9-17.9,2.9c1.1-0.5,2-1,3.1-1.4l-399.3,43.8C1179.6,1367.4,1178.9,1368.8,1178.1,1370.3z"
/>
<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-9610.334" y1="999.733" x2="-5351.2017" y2="999.733" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0.3233" style="stop-color:#9E2064"/>
<stop offset="0.6302" style="stop-color:#C92037"/>
<stop offset="0.7514" style="stop-color:#CD2335"/>
<stop offset="1" style="stop-color:#E97826"/>
</linearGradient>
<path fill="url(#SVGID_7_)" d="M1627.6,563.1c-35.5,54.5-74.3,116.4-116,186.5c-2.2,3.6-4.4,7.4-6.6,11.1
c-36,60.7-74.3,127.3-114.5,200.3c-34.8,63-71,130.6-108.6,203.3c-32.8,63.3-66.7,130.5-101.5,201.6l399.3-43.8
c116.3-53.5,168.3-101.9,218.8-171.9c13.4-19.3,26.9-39.5,40.3-60.4c41-64,81.2-134.5,117.2-204.6c34.7-67.7,65.3-134.8,88.8-195.3
c14.9-38.5,26.9-74.3,35.2-105.7c7.3-27.7,13-54,17.4-79.1C1941.9,531.6,1751.5,557,1627.6,563.1z"/>
<path fill="#BE202E" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
<path opacity="0.35" fill="#BE202E" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1152.7261" x2="-5086.9941" y2="1152.7261" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0.3233" style="stop-color:#9E2064"/>
<stop offset="0.6302" style="stop-color:#C92037"/>
<stop offset="0.7514" style="stop-color:#CD2335"/>
<stop offset="1" style="stop-color:#E97826"/>
</linearGradient>
<path fill="url(#SVGID_8_)" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
<path fill="#BE202E" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7L1433.2,1735.7z"/>
<path opacity="0.35" fill="#BE202E" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7
L1433.2,1735.7z"/>
<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1137.7247" x2="-5086.9941" y2="1137.7247" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0.3233" style="stop-color:#9E2064"/>
<stop offset="0.6302" style="stop-color:#C92037"/>
<stop offset="0.7514" style="stop-color:#CD2335"/>
<stop offset="1" style="stop-color:#E97826"/>
</linearGradient>
<path fill="url(#SVGID_9_)" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7L1433.2,1735.7z"
/>
<path fill="#BE202E" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"/>
<path opacity="0.35" fill="#BE202E" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"
/>
<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-6953.4072" y1="1134.7161" x2="-6011.9995" y2="1134.7161" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
<stop offset="0.3233" style="stop-color:#9E2064"/>
<stop offset="0.6302" style="stop-color:#C92037"/>
<stop offset="0.7514" style="stop-color:#CD2335"/>
<stop offset="1" style="stop-color:#E97826"/>
</linearGradient>
<path fill="url(#SVGID_10_)" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"/>
<path fill="#6D6E71" d="M2218.7,387v11.7h27.4v77.4h12.7v-77.4h27.6V387H2218.7z M2377,387l-30.6,62.2l-30.8-62.2h-15.3v89.1h11.7
v-70.7l30.3,61.3h8.1l30.3-61.3v70.7h11.7V387H2377z"/>
</svg>
<?xml version="1.0" standalone="no"?>
<!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">
<metadata></metadata>
<defs>
<font id="fontawesomeregular" horiz-adv-x="1536" >
<font-face units-per-em="1792" ascent="1536" descent="-256" />
<missing-glyph horiz-adv-x="448" />
<glyph unicode=" " horiz-adv-x="448" />
<glyph unicode="&#x09;" horiz-adv-x="448" />
<glyph unicode="&#xa0;" horiz-adv-x="448" />
<glyph unicode="&#xa8;" horiz-adv-x="1792" />
<glyph unicode="&#xa9;" horiz-adv-x="1792" />
<glyph unicode="&#xae;" horiz-adv-x="1792" />
<glyph unicode="&#xb4;" horiz-adv-x="1792" />
<glyph unicode="&#xc6;" horiz-adv-x="1792" />
<glyph unicode="&#x2000;" horiz-adv-x="768" />
<glyph unicode="&#x2001;" />
<glyph unicode="&#x2002;" horiz-adv-x="768" />
<glyph unicode="&#x2003;" />
<glyph unicode="&#x2004;" horiz-adv-x="512" />
<glyph unicode="&#x2005;" horiz-adv-x="384" />
<glyph unicode="&#x2006;" horiz-adv-x="256" />
<glyph unicode="&#x2007;" horiz-adv-x="256" />
<glyph unicode="&#x2008;" horiz-adv-x="192" />
<glyph unicode="&#x2009;" horiz-adv-x="307" />
<glyph unicode="&#x200a;" horiz-adv-x="85" />
<glyph unicode="&#x202f;" horiz-adv-x="307" />
<glyph unicode="&#x205f;" horiz-adv-x="384" />
<glyph unicode="&#x2122;" horiz-adv-x="1792" />
<glyph unicode="&#x221e;" horiz-adv-x="1792" />
<glyph unicode="&#x2260;" horiz-adv-x="1792" />
<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
<glyph unicode="&#xf116;" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" />
<glyph unicode="&#xf117;" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" />
<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1708 881l-188 -881h-304l181 849q4 21 1 43q-4 20 -16 35q-10 14 -28 24q-18 9 -40 9h-197l-205 -960h-303l204 960h-304l-205 -960h-304l272 1280h1139q157 0 245 -118q86 -116 52 -281z" />
<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
<glyph unicode="&#xf158;" horiz-adv-x="1664" d="M1664 352v-32q0 -132 -94 -226t-226 -94h-128q-132 0 -226 94t-94 226v480h-224q-2 -102 -14.5 -190.5t-30.5 -156t-48.5 -126.5t-57 -99.5t-67.5 -77.5t-69.5 -58.5t-74 -44t-69 -32t-65.5 -25.5q-4 -2 -32 -13q-8 -2 -12 -2q-22 0 -30 20l-71 178q-5 13 0 25t17 17 q7 3 20 7.5t18 6.5q31 12 46.5 18.5t44.5 20t45.5 26t42 32.5t40.5 42.5t34.5 53.5t30.5 68.5t22.5 83.5t17 103t6.5 123h-256q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h1216q14 0 23 -9t9 -23v-160q0 -14 -9 -23t-23 -9h-224v-512q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v64q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1280 1376v-160q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h960q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
<glyph unicode="&#xf18b;" horiz-adv-x="1920" d="M805 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM453 1176v-344q0 -179 -89.5 -326t-234.5 -217q-129 152 -129 351q0 200 129.5 352t323.5 184zM958 991q-128 -152 -128 -351q0 -201 128 -351q-145 70 -234.5 218t-89.5 328 v341q196 -33 324 -185zM1638 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM1286 1176v-344q0 -179 -91 -326t-237 -217v0q133 154 133 351q0 195 -133 351q129 151 328 185zM1920 640q0 -201 -129 -351q-145 70 -234.5 218 t-89.5 328v341q194 -32 323.5 -184t129.5 -352z" />
<glyph unicode="&#xf18c;" horiz-adv-x="1792" />
<glyph unicode="&#xf18d;" horiz-adv-x="1792" />
<glyph unicode="&#xf18e;" horiz-adv-x="1792" />
<glyph unicode="&#xf500;" horiz-adv-x="1792" />
</font>
</defs></svg>
\ No newline at end of file
# 文档/readme.md
在这个目录中,你可以找到 ASCIIDoc 格式的 Roller 文档、各种示例和测试计划。
* `roller-install-guide.adoc`-如何安装 Roller
* `roller-user-guide.adoc`-如何使用 Roller
* `roller-template-guide.adoc`-如何创建 Roller 模板和主题
* `examples/`-示例配置和脚本文件
* `testing/`-各种测试脚本
# docs/README.md
In this directory you'll find Roller docs in AsciiDoc format, various examples and test plans.
* `roller-install-guide.adoc` - How to install Roller
* `roller-user-guide.adoc` - How to use Roller
* `roller-template-guide.adoc` - How to create Roller templates and themes
* `examples/` - example configuration and script files
* `testing/` - Various test scripts
= Installation Guide
Apache Roller Weblogger
:toc:
:sectnums:
:imagesdir: ./images
== Overview
This document describes how to install the Apache Roller Weblogger
software. It explains what you need to install first, how to download
Roller, how to configure Roller and how to install it to your existing
Java application server and relational database.
=== Copyright and trademark information
The contents of this document are subject to the terms of the Apache
Software License.
All trademarks within this document belong to legitimate owners.
=== Feedback
Please direct any comments or suggestions about this document to the
Roller User Mailing list. For more information on the Roller mailing
lists please refer to the following page:
Roller Mailing Lists -
https://cwiki.apache.org/confluence/x/ZYk[_https://cwiki.apache.org/confluence/x/ZYk_]
=== Acknowledgments
The original version of this document was written by Dave Johnson. The
document is currently written and updated by the Apache Roller project
of the Apache Software Foundation.
== Securing Roller
Security should be top-of-mind when setting up any web site, even one
that is on a private network and internal to your organization. Here are
some recommendations for keeping your Roller installation secure:
* *Perform Roller installation on a secure network*. When you are
installing Roller it is possible for other users to interfere with your
installation. If other users have access to the server, one of them
could create the admin account before you do. So, when you install
Roller, do so on a server that cannot be accessed by others.
* *Do not allow open registration of new users*. Roller can offer a
registration link so that new users can register themselves, but this
feature is turned off because it is not safe to allow just anybody to
register for an account on your blog server. If you want to turn it on,
login as an administrative user, go to Roller’s Server Administration
page and enable the *Allow New Users* option.
* *Enable HTML Sanitization*. If you cannot trust the webloggers who
will use your Roller site to author HTML, then you should configure
Roller to sanitize all HTML published by the system. Do this by setting
the _weblogAdminsUntrusted=true_ property in your
_roller-custom.properties_ file.
* *Do not allow HTML in comments*. Roller can allow users to write
comments in a safe-subset of HTML, but HTML use in comments is not
allowed at all because of security concerns with even a so called
safe-subset of HTML. If you want to turn it on, login as an
administrative user, go to Roller’s Server Administration page, enable
the *Allow html in comments* option and make sure the *HTML Subset
Restriction* box is checked.
* *Run Roller over SSL connection*. If you run Roller over a plain old
HTTP connection, it is possible for others to snoop your password when
you login, for example over an open WIFI network. To configure Roller to
work over SSL (i.e., using https:// URLs), first modify the web.xml
located in the Roller WAR (WEB-INF folder), uncommenting the
<security-constraint/> element and following the instructions given in
that file above that element. Next, follow your servlet container’s
documentation for setting up SSL
(http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html for Tomcat, for
example.) Then redeploy Roller and confirm that pages containing secure
data such as the login page and new user registration page are available
only via https:// URLs.
== Ready to roll?
First, let’s make sure you have everything you need to install and run
Roller.
Roller is a database-driven Java web application. To run it you need
Java, a Java Servlet container such as Tomcat, a connection to a
database such as MySQL and optionally a connect to a mail server. More
specifically, here’s what you need to install and run Roller:
* *Java Development Kit*, specifically the Java 2 SE 1.6 JDK or more
recent. The computer on which you install Roller should already have the
JDK installed and configured.
* *Java EE 6 Application Server*, or more specifically a Servlet
container that supports at least the Servlet 2.4 API. Hereinafter, we’ll
just call this your _server_. Roller has traditionally worked best on
Tomcat and Tomcat only, but Roller 6.0.0 is known to run on:
** Tomcat 8
** Jetty 9
* *Relational database* such as MySQL or Apache Derby. Roller stores
blog entries, comments, bookmarks and almost all other data in a
relational database accessed via the Java Persistence API 2.0.
PostgresSQL, MySQL and Derby are best supported but Roller. Roller also
includes database creation scripts for DB2, HSQL-DB, Microsoft SQL
Server and Oracle but these have not been tested recently.
* *(Optional) An SMTP mail server*. Roller can send email notifications
for comments and other events via the JavaMail and Activation APIs.
* *Roller installation file*. The Roller installation file contains the
Roller WAR file, ready to deploy to your server, plus Roller license
files, README and documentation. Unpack using either file based on a
compression method your operating system supports:
** roller-release-6.0.0-standard.zip
** roller-release-6.0.0-standard.tar.gz
This step can also be done after deployment and determination that you
would like themes other than the defaults available available, just
modify the WAR and redeploy on your servlet container.
* *(Optional) Additional blog themes*. Roller comes pre-packaged with
several blog themes (templates) for you to choose and optionally
customize for each blog you create. You may wish to add additional
themes to the Roller WAR file so they will be available to choose from
when you deploy the application. To do this, just open the Roller WAR
and add the theme to the "themes" folder located at the top level of
the WAR. Google <Apache Roller Themes> and/or check the non-Apache
resources section of the Roller wiki page
(https://cwiki.apache.org/confluence/display/ROLLER/Roller+Wiki) for any
externally available themes—external themes are not supported by the
Roller team, however.
== Download and un-package Roller
Download the Apache Roller release file from
http://roller.apache.org/[http://roller.apache.org]. If you’re a Windows
user download the .zip file and use your favorite ZIP program to unzip
the release into a directory on your computer’s disk. Unix users can
download the .tar.gz file and use GNU tar to un-package.
=== Installation directory layout
Once you’ve unpackaged the files you’ll find a directory structure like
this:
----
README.txt
LICENSE.txt
NOTICE.txt
docs/
roller-install-guide.pdf
roller-user-guide.pdf
roller-template-guide.pdf
webapp/
roller.war
----
The _LICENCE.txt_ and _NOTICE.txt_ files contain the Apache Software
License and other legal notices related to the release. The _README.txt_
file just points to the documentation in the _docs_ directory.
https://cwiki.apache.org/confluence/display/ROLLER/Roller+Wiki
== Prepare your database for Roller
Before you can install Roller you’ll probably need to some work to
prepare your database. You’ll need to create a place to put the Roller
tables; some call this a table-space and we refer to it as a _database_
in this installation guide. You’ll need to create a database for Roller,
or get your database administrator to do it for you. You also need to
have a JDBC driver for your database of choice, but we’ll cover that
later.
=== Create a database for Roller
If you’re luck enough to have your own database administrator, ask them
to setup a database for Roller. When they are done, ask them to provide
you with this information, you’ll need it later:
* Username and password for connecting to database
* JDBC connection URL for database
* JDBC driver class name
If you don’t have a database administrator then you’ll have to refer to
the documentation for your database and do it yourself. You need to
create a database for Roller, protected by username and password. For
example, if you’re using MySQL you might do something like this (be sure
to use a different username and password from the scott/tiger below):
----
% sudo service mysql start
% mysql -u root -p
password: *****
mysql> create database rollerdb DEFAULT CHARACTER SET utf8 DEFAULT
COLLATE utf8_general_ci;
mysql> grant all on rollerdb.* to scott@`%' identified by `tiger';
mysql> grant all on rollerdb.* to scott@localhost identified by `tiger';
mysql> exit;
----
If you’re using Derby:
----
% ij
ij> connect `jdbc:derby:/path/to/new/MYROLLERDB;create=true';
ij> quit;
----
For PostgreSQL:
----
%sudo -u postgres psql postgres
postgres=# create user scott createdb;
postgres=# \du (see list of users and roles)
postgres=# \password scott
Enter new password: ?????
postgres-# \q
%createdb -h localhost -U scott -W pgsqlroller -E UTF8
----
=== MySQL and Oracle considerations
Based on our experience supporting MySQL, we have the following
recommendations:
* For MySQL, make sure that TCP/IP networking is enabled.
* For MySQL, UTF-8 must be enabled for your database, as done in the
"create database rollerdb" command above or server-wide
(http://dev.mysql.com/doc/refman/5.6/en/charset-applications.html).
+
If a non-UTF8 database has already been created you can switch the
database to UTF-8 as follows providing the tables have *not* already
been created:
+
----
ALTER DATABASE roller DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci;
----
* For Oracle users, use the 10g (10.1.0.2 higher) drivers which should
be packaged as ojdbc14.jar, even if operating on Oracle 9 server.
* See the server specific sections to information on where to place the
JDBC driver jars.
== Deploy Roller to Tomcat
Deploying Roller to the Tomcat servlet container involves creating a
Roller configuration file, adding some jars to Tomcat and then deploying
the Roller WAR file.
You are expected to install and configure Apache Tomcat before you
attempt to install Roller, and be aware of how to deploy a WAR archive
on Tomcat. Refer to the Tomcat documentation linked from this page for
more information: http://tomcat.apache.org/[_http://tomcat.apache.org_]
=== Tomcat: Create Roller Configuration File
There are a variety of ways to configure Roller and Tomcat and here
we’ll explain the easiest route: providing database and mail connection
information directly to Roller via the Roller configuration file.
*Create the Configuration File*
For most settings, Roller can be configured from its own web console.
But for some startup-properties and advanced configuration options you
must set properties in an override file called:
roller-custom.properties
That is a simple Java properties file, a text file that overrides
settings defined in Roller’s internal __roller.properties __file. To
configure Roller you look at Roller’s internal properties file, decide
which properties you need to override and then set those in your
_roller-custom.properties_ file.
The precise roller.properties file your distribution is using is located
in /WEB-INF/classes/ org/apache/roller/ weblogger/config/ within the
roller.war file. It is also viewable online at
http://svn.apache.org/viewvc/roller/trunk/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties,
click the "(view)" button at a revision just prior to the Roller
release you’re using. We encourage you to look through this file to
determine other properties you may wish to override, but we’ll get you
started right here and now with a simple example that shows you the
minimum startup, database, and mail configuration settings that you need
to run Roller. You’ll need to alter this information using settings
appropriate for your filesystem, database, and mail server. (Also note
the database and mail configuration shown below will be done differently
if you’re using JNDI, which will be discussed in the next section. JNDI,
in particular, is presently required if your mail SMTP server requires
authentication.)
Example: _roller-custom.properties_ file
----
installation.type=auto
mediafiles.storage.dir=/usr/local/rollerdata/mediafiles
search.index.dir=/usr/local/rollerdata/searchindex
log4j.appender.roller.File=/usr/local/rollerdata/roller.log
database.configurationType=jdbc
database.jdbc.driverClass=com.mysql.jdbc.Driver
database.jdbc.connectionURL=jdbc:mysql://localhost:3306/rollerdb?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8
database.jdbc.username=scott
database.jdbc.password=tiger
mail.configurationType=properties
mail.hostname=smtp-server.example.com
mail.username=scott
mail.password=tiger
----
The _installation.type=auto_ property tells Roller to operate in
automatic installation mode. In this mode Roller will provide very
detailed error output to help you debug database connection problems. If
Roller finds that the database exists but its tables are not, it will
offer to run the database creation scripts. If find finds that the
tables are there, but they are not up-to-date Roller will offer to
upgrade them for you. Once your Roller installation is complete and you
are ready to go "live" then you should set __installation.type=manual__.
The above sample __roller-custom.properties__ uses a MySQL connection.
It shows the MySQL JDBC driver class name, an example MySQL connection
URL and username/password settings for the mail connection:
If you’re using Derby, database configuration properties
similar to the following will be more appropriate. Note authentication
is not used by default with Derby (any username and password provided
below will be accepted), see
http://db.apache.org/derby/docs/10.2/tuning/rtunproper27467.html on how
to require authentication with Derby. The username configured below will
be the table owner used when the Roller installation process later
creates the database tables.
----
database.configurationType=jdbc
database.jdbc.driverClass=org.apache.derby.jdbc.EmbeddedDriver
database.jdbc.connectionURL=jdbc:derby:/path/to/new/MYROLLERDB
database.jdbc.username=app
database.jdbc.password=app
----
For PostgreSQL:
----
database.configurationType=jdbc
database.jdbc.driverClass=org.postgresql.Driver
database.jdbc.connectionURL=jdbc:postgresql://localhost:5432/pgsqlroller
database.jdbc.username=scott
database.jdbc.password=tiger
----
*Alternative Authentication Options*
The above instructions rely on Roller’s default user authentication
mechanism, i.e., using a Roller-provided database table (roller_user) to
store usernames and encrypted passwords. Roller provides other
authentication options defined under the "authentication.method"
setting in the roller.properties file: OpenID, OpenID/DB combination,
and LDAP
(https://cwiki.apache.org/confluence/display/ROLLER/Roller+5.1+with+LDAP).
These authentication methods are used less frequently so should be
tested more thoroughly with your particular setup if you wish to use
them. Check the roller.properties file included in your WAR for
available options and configuration information, and consult the Roller
User’s Mailing List should you need assistance.
Add Configuration file to Tomcat
Place the configuration file into the Tomcat lib directory so that it is
on the Tomcat classpath and therefore available to Roller.
=== Using Server-provided database & mail resources (optional)
It’s easiest to setup your Roller for Tomcat database connection using
the `jdbc' approach and the mail connection using `properties' but in
some cases you might want to use the datasource and/or mail session
resources provided by your application server instead. For
authentication-requiring mail connections like Google’s Gmail service,
JNDI is presently required. For databases, you might use JNDI to take
advantage of the database connection pool management that is built into
your server. Or, your boss might want everything to be managed via your
server’s Admin Console. No matter the reason, it’s easy to do in Roller.
Here, you omit the _roller-custom.properties_ database and mail
configuration given in the previous section and replace it with just:
----
installation.type=auto
mediafiles.storage.dir=/usr/local/rollerdata/mediafiles
search.index.dir=/usr/local/rollerdata/searchindex
log4j.appender.roller.File=/usr/local/rollerdata/roller.log
database.configurationType=jndi
database.jndi.name=jdbc/rollerdb
mail.configurationType=jndi
mail.jndi.name=mail/Session
----
The _database.configurationType=jndi_ setting tells Roller to look up
its datasource via Java Naming and Directory Interface (JNDI). Roller
will look for a datasource with the JNDI name _jdbc/rollerdb_. You must
set that datasource up in your server.
The _mail.configurationType=jndi_ setting tells Roller to look up it’s
mail sessions via JNDI. Roller will look for a mail session provider
with the JNDI name _mail/Session_. You must set that provider up in your
server. Let’s discuss how to do that on Tomcat.
Setting up database and mail resources on Tomcat
There are a couple of different ways to setup database and mail
resources on Tomcat. One way is to provide a Context Configuration file.
Here’s how to do this on Tomcat.
Before you deploy Roller to Tomcat, create a new Context Configuration
file in the installation directory _webapp/roller/META-INF_. You’ll find
an example configuration file there, shown below. Rename it from
_context.xml-example_ to _context.xml_ and substitute the correct values
for driverClassName, url, username, password in 'jdbc/rollerdb' Resource and mail.smtp.user
password in 'mail/Session' Resource.
----
<Context path="/roller" debug="0">
<Resource name="jdbc/rollerdb" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/rollerdb?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;mysqlEncoding=utf8"
username="scott"
password="tiger"
maxActive="20" maxIdle="3" removeAbandoned="true" maxWait="3000" />
<Resource name="mail/Session" auth="Container" type="javax.mail.Session"
mail.transport.protocol="smtp"
mail.smtp.host="smtp.gmail.com"
mail.smtp.port="465"
mail.smtp.auth="true"
mail.smtp.user="blah.blah@gmail.com"
password="yourgmailpassword"
mail.smtp.starttls.enable="true"
mail.smtp.socketFactory.class="javax.net.ssl.SSLSocketFactory"
mail.smtp.socketFactory.port="465"
mail.smtp.socketFactory.fallback="false"
mail.debug="false"/>
</Context>
----
The Java mail properties listed above are defined here:
https://javamail.java.net/nonav/docs/api/com/sun/mail/smtp/package-summary.html.
Note the email account defined above will appear in the "From:" line
of notification email messages sent to blog owners (and, if they select
"Notify me of further comments", blog commenters) so take care not to
use an email account you wish to keep private.
Another method is to the add the configuration to the Tomcat server.xml
file under the correct host value already present in the file. (The
Tomcat project advises against this method as it requires restarting the
server whenever changes are made to this file, see
http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Defining_a_context.)
For example, with the same mail connection as above:
----
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context
path="/roller"
docBase="roller"
antiResourceLocking="false">
<Resource name="mail/Session"
auth="Container"
type="javax.mail.Session"
mail.transport.protocol="smtp"
mail.smtp.host="smtp.gmail.com"
…rest of properties same as above…
/>
</Context>
</Host>
----
=== Tomcat: Add JDBC Driver and JavaMail API Files
You will also need to place some additional jars in the Tomcat _lib_
directory:
* **JDBC Driver Jars. **Add the appropriate JDBC driver jars to the
Tomcat classpath. Once they are in your classpath, Roller’s database
subsystem will be able to find and use them. Download them from your
database vendor/provider and place them in Tomcat’s _lib_ directory.
* **Java Mail and Activation. **Tomcat does not include the Java Mail
and Activation jars. Even if you do not plan to use email features, you
must download those jars and place them in Tomcat’s classpath. Download
them from Oracle (https://java.net/projects/javamail/pages/Home) and
place them in Tomcat’s _lib_ directory.
=== Tomcat: Set URI Encoding
Roller supports internationalization (I18N), but on Tomcat some
additional configuration is necessary. You must ensure that Tomcat’s URI
encoding is set to UTF-8. You can do this by editing the Tomcat
configuration file conf/server.xml and adding URIEncoding=”UTF-8” to
each connector element, as shown below:
----
<Connector port="8080" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false" redirectPort="8443" debug="0"
acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true"
URIEncoding="UTF-8"/>
----
And make sure you do this for _every_ connector through which you use
Roller. For example, if you use the AJP connector or HTTPS connector you
need to add the URIEncoding="UTF-8" attribute to those connectors as
well.
=== Tomcat: Deploy Roller
Refer to the Tomcat documentation for information on the various ways to
deploy a WAR. By renaming the Roller WAR to roller.war and placing it in
the webapps directory of a running Tomcat instance, you should be able
to access Roller at http://localhost:8080/roller (the /roller portion
comes from the name of the WAR.) Another way to do this is to use the
Tomcat Manager application, which you can reach at the following URL
http://localhost:8080/manager. Once you are there, you’ll see something
like this:
image::roller-install-guide-tomcat.png[]
On the manager screen above, scroll down until you see the *Deploy*
section, see below:
image::roller-install-guide-tomcat-deploy.png[]
Enter the context path at which you would like to see Roller, above we
use _/roller_. Enter the full path to the Roller WAR file, in the
webapps directory of the Roller installation and click *Deploy* to
deploy Roller.
Finally, navigate to http://localhost:8080/roller to complete the
installation.
== Getting started with Roller
You’re not quite done with the installation process, but now you’re
ready to start using Roller, so we’ll walk you through getting started,
registering a user and setting up a blog. We’ll also discuss briefly
what happens when there is an error.
=== Navigate to Roller and finish the install
Navigate to Roller, if you are using a default Tomcat or Glassfish
installation then then URL of Roller is probably
http://localhost:8080/roller. You will see either a web page of error
messages, a web page offering to create database tables for you or web
page asking you to complete the installation by registering an admin
user and creating a front-page blog. First, let’s talk about what
happens when things go wrong.
image::db-connection-error.png[]
If there’s a problem with your database configuration, Roller will
display a page or error messages to help you diagnose the problem. It’s
possible that you entered the wrong JDBC driver class name, connection
URL, username or password. Or perhaps your database is not running. Use
the information provided to determine what is wrong, fix it and then
redeploy Roller.
*Automatic tables creation*
If your database configuration is good but Roller cannot find its
database tables, then Roller will offer to create those pages
automatically for you. If you give the go-ahead, Roller will run the
appropriate database creation script for your database and then show you
the results. You can then proceed to the next step to setup your first
user account and weblog.
image::no-tables-found.png[]
=== Register a user and create a weblog
If Roller starts up fine but doesn’t find a front-page weblog then it
will display the Completing Your Installation below that explains how to
register your first user, create your first weblog and setup your site’s
front page.
image::roller-home.png[]
You have to decide what you want as the front-page of your Roller site.
If you are using Roller to run your personal weblog, then you probably
want your weblog to be the front-page of the site. In this case, create
a weblog for yourself, _don’t_ choose the front-page theme but _do_ set
your weblog as the front-page weblog for the site.
If you are using Roller to run a community of multiple weblogs, then
you’ll probably want to display an aggregated front-page combining all
weblogs on the site. In that case, create a weblog to serve as the
front-page, set it as the front-page weblog and make sure you set the
"aggregated front-page" setting on the Server Admin page.
*Don’t forget: Reset the _installation.type_ flag*
Now that you’re done with the installation you should turn off Roller’s
auto-installation system. Edit your _roller-custom.properties_ file and
set _installation.type=manual_. Then restart your server or Roller so
that it accepts the new setting.
*What’s next?*
Once you’ve gotten Roller up and running refer to the Roller User Guide
for more information on running your Roller system and your weblog. For
information on customizing your weblog, refer to the Roller Template
Guide. If you can’t find what you want in the documentation then
subscribe to the Roller user mailing list and ask your questions there:
https://cwiki.apache.org/confluence/display/ROLLER/Roller+Mailing+Lists
== Configuration tips and tricks
This section covers some tips and tricks that can help you get the most
out of Roller. It covers Roller’s Planet feed aggregator and how to
setup Roller to use server-provided resources.
=== Setting up Roller’s Planet feed aggregator
Roller includes a RSS/Atom feed aggregator that makes it possible to run
a site like https://blogs.oracle.com/ which provides weblogs for
thousands of writers and an aggregated front-page that displays the most
recent posts from those plus dozens of Sun bloggers from other sites
such as blogger.com, typepad.com and other services. Here’s what you
need to do.
==== STEP 1: Create a Planet cache directory
Roller Planet needs a cache directory in which to store the feeds it
fetches. By default, Roller Planet will put it’s cache in your home
directory under _roller_data/planetcache_. If you want to place the
cache somewhere else, you must override the planet.aggregator.cache.dir
property in your _roller-custom.properties_ file. For example:
`cache.dir=c:\\roller_data\planetcache`
Whether you override that property or not, *you must create the cache
directory*. Planet will not work unless the cache directory exists and
is writable by Roller.
==== STEP 2: Enable Planet via Roller custom properties
Enable Planet by adding the following to your _roller-custom.properties_
file:
----
planet.aggregator.enabled=true
# Tasks which are enabled. Only tasks listed here will be run.
tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,\
PingQueueTask,RefreshRollerPlanetTask,SyncWebsitesTask
# Set of page models specifically for site-wide rendering
rendering.siteModels=\
org.apache.roller.weblogger.ui.rendering.model.SiteModel,\
org.apache.roller.weblogger.ui.rendering.model.PlanetModel
----
Those property settings enable Planet and enable the Planet tasks, both
the _RefreshRollerPlanetTask_, which runs every hour and fetches all
RSS/Atom feed subsciptions, and the _SyncWebsitesTask_, which runs every
midnight and ensures that each weblog in the Roller system is
represented by a subscription in the Planet aggregator. To enable usage
of the PlanetModel in the front-page weblog, we also override the
_rendering.siteModels_ property.
==== STEP 3: Configure Planet via Planet custom properties
Create a new file called _planet-custom.properties_ and place it in the
same directory as your existing _roller-custom.properties_ file. In this
configuration file, add a property called __cache.dir __that points to
the directory that you’d like Planet to use for caching it’s RSS and
Atom newsfeeds. The default setting is:
`_cache.dir=${user.home}/roller_data/planetcache_`
Once you’ve made those property settings restart Roller and proceed to
the next step.
==== STEP 4: Display your Planet aggregations
You can use Roller’s UI to add external RSS/Atom feeds to the Planet
setup. To display these feeds you’ll need to do a little template
customization. The easier way to get started is to Roller’s existing
Front-Page theme. Here’s how.
Create a weblog to server as the front-page of your Roller site. Start
with the Front-Page theme and customize it. Edit the weblog template and
look for the part that mentions PLANET-entries. Comment-out the
SITE-WIDE part and un-comment the PLANET-entries part. The double hash
"##" marks indicate a commented-out line. The code should look like
this:
----
## 1) SITE-WIDE entries (the default)
##set($pager = $site.getWeblogEntriesPager($since, $maxResults))
## 2) PLANET-entries
#set($pager = $planet.getAggregationPager($since, $maxResults))
----
With that in place, your front-page will be display your Planet entries.
You can find your Planet feeds at the following URLs:
* Main Planet feed
http://localhost:8080/roller/planetrss
* Per group feed
http://localhost:8080/roller/planetrss?group=<group-name>[]
=== Manual table creation and upgrade
If you would rather create your database tables yourself instead of
letting Roller do it automatically, you can. Instead of enabling
automatic installation you should disable it by putting this in your
_roller-custom.properties_ file:
installation.type=manual
Now you’ve got to run the database creation script. You can find the
database creation scripts in the
_webapp/roller/WEB-INF/classes/dbscripts_ directory. You’ll find a
_createdb.sql_ script for each of the databases we hope to support.
If you are upgrading Roller, you’ll have to run the migration scripts
instead of createdb.sql. You’ll find those under the _dbscripts_
directory too. However, the migration script should probably be run
statement-by-statement checking the database responses as you go along,
or alternatively by first removing any delete index or delete foreign
key statement that you know doesn’t exist in your database. Certain
databases like MySQL throw errors when one attempts to delete objects
such as foreign keys or indexes that don’t already exist, a specific
error type which the automated installation process is coded to ignore.
== Upgrading Roller
This section describes how to upgrade an existing Roller installation to
the latest release of Roller by shutting down, backing up and then
following the installation instructions with a couple of key exceptions.
But first, there is some required reading for those upgrading from
ancient versions of Roller.
=== Backup your old Roller
Before you get started with your upgrade, shutdown your existing Roller
install and make a backup of your Roller data.
Backup your database to somewhere safe on your system or to a remote
file-system. Here are a couple of examples: of how to do that on various
databases:
* On MySQL you create a dump file
`mysqldump -u scott -p rollerdb >
/somewhere/safe/roller.dmp`
* With PostgreSQL you can do the same thing
`pg_dump -h 127.0.0.1 -W -U
scott rollerdb > /somewhere/safe/roller.db`
And backup any other data. Make a copy of your Roller data directory,
i.e. the one with your Roller resources and search-index files. If you
added or modified any files within your old Roller web application
directory, then you’ll want to backup that whole directory.
Migrating your old file uploads to the new Media Blogging system
If upgrading from Roller 4.0 to 5.1 (5.0 already has this configuration
done), when you first start Roller 5.1 it will migrate your old file
uploads to the new Media Blogging system. If this is to work properly
you *MUST* ensure that the three properties below are set correctly
before you start Roller 5.0/5.1 for the first time.
----
# The directory in which Roller 5.x will upload files
mediafiles.storage.dir=$\{user.home}/roller_data/mediafiles
# The directory in which Roller 4.0 uploaded files
uploads.dir=$\{user.home}/roller_data/uploads
# Set to true to enable migration
uploads.migrate.auto=true
----
The _mediafiles.storage.dir_ property should be set to the location
where you would like to store uploaded files. The _uploads.dir_ property
should be set to the location where you stored uploaded files in Roller
4.0.
=== Install and startup the new Roller
Follow the normal installation instructions for the new version of
Roller, but…
* When creating your _roller-custom.properties_, copy of your old one.
Carefully review each property and compare it to the property settings
in the Roller property file described in Section link:#tomcat-create-roller-configuration-file[6.1].
* Don’t create a new database for Roller. Instead point Roller to your
existing Roller database. *This is completely safe because you created a
backup of your database, right?*
When you deploy and startup, Roller will detect that your database needs
to be upgraded and it will offer to run each of the migrations scripts
necessary to upgrade you from your old version to the new version of
Roller.
*NOTE*: You can run the database scripts manually too, see Section
link:#manual-table-creation-and-upgrade[8.2].
*NOTE*: On Tomcat, before startup you should delete the contents of the
Tomcat work directory (located under the webapps folder.)
= Template Guide
Apache Roller Weblogger
:toc:
:sectnums:
:imagesdir: ./images
== Overview
This document is a Template Guide to the Apache Roller Weblogger, the
Java-based and open source weblog server that is produced by the Apache
Roller project of the Apache Software Foundation.
=== Copyright and trademark information
The contents of this document are subject to the terms of the Apache
Software License.
All trademarks within this document belong to legitimate owners.
=== Feedback
Please direct any comments or suggestions about this document to:
dev@roller.apache.org
== Introduction
If you know a little about HTML and CSS, then you’ll find that it’s easy
to customize the appearance, layout and content of your Roller-based
weblog. You can change the appearance of any of your weblog’s pages and
add as many new pages as you want. Any Roller user can do it through
Roller’s web-based interface and it’s all done with Roller’s simple and
easy-to-use template language. In this guide, we’ll tell you how. We’ll
start by explaining how Roller’s weblog template system works then we’ll
provide a reference to the objects and macros that you can use in your
templates.
NOTE: If you have only AUTHOR or LIMITED permissions within a weblog
then you won’t have access to the Design -> Theme or
Design -> Templates pages and you won’t be able to change or
customize your theme. You need to have ADMIN permission within a weblog
to be able to do the things described in this guide.
NOTE: It is possible for a Roller site administrator to disable theme
customization. So if you do have ADMIN permission in your weblog and you
still don’t see the Design -> Templates page, perhaps your Roller
site does not allow customization.
== The Roller template system
Each Roller weblog is defined by a set of page templates, which you can
edit to customize the content, layout and appearance of your weblog.
=== Page templates
When you create a new Roller weblog you must pick a theme to define the
new weblog’s appearance and layout. A theme is just a small set of
templates, where each template contains HTML code, template language
expressions and macros. What’s a template? A template for an HTML web
page is simply an HTML web page with some Velocity code embedded inside.
For example, this is a valid Roller template, with one Velocity
expression:
----
<html>
<body>
My blog is named $model.weblog.name
</body>
</html>
----
The string "$model.weblog.name" is a template language expression and
when Roller displays the template, that expression will be replaced with
the name of the weblog.
Note that *$model* is something special. Roller makes a set of objects,
known as _models_, available to page templates. In the example above, we
see only the $model object, but here are others. You’ll learn more about
models in Section 5 and Section 6 provides a complete reference.
=== The Velocity template language
The simple template language that we use inside Roller page templates is
called Velocity. It’s designed to be simple and easy for even
non-programmers, but it’s also a simple programming language. You can
set variables, use if-else conditional logic and create loops.
For example, this Roller page template will list the categories
available in your weblog except for the one named Music:
----
<html>
<body>
My blog is named $model.weblog.name. These are my categories:<br>
#foreach ($cat in $model.weblog.categories)
#if ($cat.name != "Music")
$cat.name<br>
#end
#end
</body>
</html>
----
Velocity also supports the concepts of _macros_. A macro is essentially
a Velocity method call. We use them in Roller to generate HTML. For
example, as illustrated below, to display a bookmark folder you first
retrieve if from the weblog and second pass it to the
_#showBookmarkLinksList()_ macro to display it as an HTML _<ul>_ list.
----
<html>
<body>
<h2>Blogroll</h2>
#set($rootFolder = $model.weblog.getBookmarkFolder("/"))
#showBookmarkLinksList($rootFolder)
</body>
</html>
----
You’ll learn more about macros in Section 5 and Section 8 provides a
complete reference to the standard Roller macros. If you want more
information on Velocity, see http://wiki.apache.org/velocity/.
Now that we’ve covered the basic concepts of page templates and the
Velocity template language, let’s dig into the details of editing
templates.
== Editing and creating page templates
After you’ve used Roller *Design -> Themes* page to customize your
weblog theme, you can edit and create page templates through the
*Design -> Templates* page. We’ll show you how to do that, but first
you need to understand how the required pages, found in every theme,
work together to display a weblog.
Every theme is different, but all themes must have two required pages –
pages that you cannot rename or delete. These are the *Weblog* template,
which defines the main page of your blog, and the *_day* template, which
defines how each day’s worth of blog entries is displayed on your main
page. Some themes also have a required page named *_css* which defines
the CSS style code used by the weblog.
First, let’s look at a simple Weblog template.
=== The Weblog template
Below is a simple Weblog page that displays all of the data that weblog
typically contains including recent entries with paging to past entries,
category link, feed links, a calendar and feed auto-discovery. Check the
annotations for more detail.
Listing 1: a typical Weblog template
----
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>$model.weblog.name : $model.weblogPage.name</title> #1
#showAutodiscoveryLinks($model.weblog) #2
<style type="text/css">#includeTemplate($model.weblog "_css")</style> #3
</head>
<body>
<table border="0" align="center" width="95%">
<tr>
<td class="entries" width="80%" valign="top">
<h1>$model.weblog.name</h1> #4
<p class="descrip">$model.weblog.description</p>
#set($rootCategory = $model.weblog.getWeblogCategory("nil")) #5
#showWeblogCategoryLinksList($rootCategory false false)<br>
#set($pager = $model.getWeblogEntriesPager()) #6
<div class="next-previous">
#if ($model.results) #7
#showWeblogSearchAgainForm($model.weblog)
#showNextPrevSearchControl($pager)
#else
#showNextPrevEntriesControl($pager) #8
#end
</div>
#showWeblogEntriesPager($pager) #9
#if ($model.permalink) #10
#showWeblogEntryComments($entry)
#showWeblogEntryCommentForm($entry)
#end
</td>
<td width="20%" valign="top">
<h2>Calendar</h2>
#showWeblogEntryCalendar($model.weblog "nil") #11
<h2>Feeds</h2>
#showAtomFeedsList($model.weblog) #12
<h2>Search</h2>
#showWeblogSearchForm($model.weblog false) #13
<h2>Links</h2>
#set($defaultFolder = $model.weblog.getBookmarkFolder("/")) #14
#showBookmarkLinksList($defaultFolder)
<h2>Navigation</h2>
#showPageMenu($model.weblog) #15
#showAuthorMenu(true) #16
<h2>Referrers</h2>
#set($refs = $model.weblog.getTodaysReferrers()) #17
#showReferrersList($refs 30 20)
</td>
</tr>
</table>
</body>
</html>
----
The above template includes a good mix of Velocity expressions and
statements. There’s a lot going on, so let’s explain it in detail.
Here’s the point-by-point breakdown.
. *HTML title* For the HTML title we use the weblog’s name, a colon
and the name of the page template that is currently being displayed.
. *Auto-discovery links*
The __#showAutodiscoveryLinks() __macro adds
the HTML _<link>_ elements required for RSS and Atom feed auto-discovery
as well as RSD for weblog clients.
. *Include CSS styles* Here we use the include the theme’s *_css*
template directly in the page, right inside a pair of _<style>_ tags.
. *Display a page title* Here we use the weblogs name again in an
_<h1>_ title.
. *Category links list* Display a list of weblog category links.
. *Get entries pager* Get the entries pager object so we can display
entries and a paging control.
. *Show search results control?* Show search results pager control if
search in progress
. **Else . . . ** Show normal entries pager control.
. *Show entries* Show current pages worth of entries (or search
results). Calls on *_day* template to do the display of each days worth
of entries.
. *Show comments?* If were on a permalink page, then show comments
and comments form
. *Show the calendar* Show the standard weblog calendar.
. *Show feed links* Show links to all available Atom entry feeds, one
per category.
. *Search form* Show the weblog search form, false indicates no
category chooser.
. *Display blogroll* Display contents of the default (main) bookmark
folder.
. *Show page menu* Display navigation bar of pages available in
weblog.
. *Show author menu* Display authors menu, only visible to authorized
users.
. *Display todays referrers* Display todays referrer URL with hit
counts.
Note in point #9 that the display of the weblog entries is controlled by
another template, the _day template. So next lets take a look at that
_day template.
=== The _day template
A themes _day template is responsible for displaying one days worth of
weblog entries. Heres a typical _day template, one that corresponds to
the above Weblog template.
Listing 2: a typical _day template
----
<div class="dayBox">
<div class="dayTitle">
$utils.formatDate($day, "EEEE MMM dd, yyyy") #1
</div>
#foreach($entry in $entries) #2
<div class="entryBox">
<p class="entryTitle">$entry.title</p> #3
<p class="entryContent">
#if($model.permalink) #4
$entry.displayContent
#else
$entry.displayContent($url.entry($entry.anchor))
#end
</p>
<p class="entryInfo">
Posted at
<a href="$url.entry($entry.anchor)"> #5
$utils.formatDate($entry.pubTime, "hh:mma MMM dd, yyyy")</a>
by $entry.creator.fullName in #6
<span class="category">$entry.category.name</span> &nbsp;|&nbsp; #7
#if
($utils.isUserAuthorizedToAuthor($entry.website)) #8
<a href="$url.editEntry($entry.anchor)">Edit</a> &nbsp;|&nbsp;
#end
#if($entry.commentsStillAllowed || $entry.commentCount > 0) #9
#set($link = "$url.comments($entry.anchor)" )
<a href="$link" class="commentsLink">
Comments[$entry.commentCount]</a>
#end
</p>
</div>
#end
</div>
----
And heres a point-by-point description of the template language
expressions and statements found in the above day template:
. *Display day header.* For the day header, we display the current date
in a long format.
. *Loop through days entries.* Here we use a $foreach loop to iterate
through the $entries collection
. *Display entry title.* Display the entry title in a <div> so that it
can be easily styled.
. *Display entry content or summary.* If were on a permalink page, show
the entrys content. Otherwise, show the summary if a summary is
available.
. *Display entry permalink.* Display permanent link to the entry.
. *Display entry authors name.* Display the name of the author of the
entry.
. *Display entry category.* Display the name of the category associated
with the entry.
. *Show edit link.* If user is authorized, display link to edit the
entry.
. *Show comments link.* If comments are available or are still allowed,
display link to entry comments.
Now youve seen the required templates and youve seen most of the
commonly used macros in action, lets discuss the mechanics of
customizing your theme.
=== Customizing your theme
When you start a Roller weblog and you pick a theme, your weblog uses a
_shared_ copy of that theme. The page templates that define your theme
are shared by all of the other users who have also picked that theme.
Using a shared theme is nice because, when your Roller site
administrator makes fixes and improvements to that shared theme, then
youll get those automatically. But you cant customize a shared theme.
Before you can customize your theme, youve got to get your own copy of
the themes page templates like so:
1) *Go to the Design -> Theme page.*
Login to Roller and go to your
weblogs *Design -> Theme* page and select the 'Custom Theme' option.
image::customize-theme-1.png[]
2) *Click on 'Update Theme' button*
If the you are using 'Custom Theme' option, you will see the following note:
_Since this is the first time using a custom theme, Roller will copy the templates from your existing Shared Theme so you can edit them._
Click on 'Update Theme' button to proceed.
When you do this, copies of the themes page templates will
be copied into your weblog so you can edit them.
image::customize-theme-2.png[]
3) *Customize your theme by editing and creating page templates.*
Go to the Design -> Templates page, edit your page templates and add new
ones as needed as described in the next section.
And if you get tired of your customized theme, just use the
*Design -> Theme* page to switch back to a shared theme or pick
another one to customize. Now lets discuss editing and creating
templates.
=== Editing and creating page templates
Once youve got the page templates copied into your weblog, you can do
just about anything you want to your theme. You can use the
*Design -> Templates* page, shown below, to create a new page, delete
a page or choose a page to edit.
image::templates.png[]
Now might be a good time to describe the _page template properties_
since you can see them in the table above. The properties are name,
description. Lets explain each:
* *Name*: Each template has a name, which you can display in your
templates. You can also use the _#includeTemplate()_ macro to include
the contents of one page in another, by referring to the template by
name.
* *Description*: You can enter an option description for each page for
display or just as a reminder to yourself as to the purpose of the page.
For new templates that you add, youll be able to edit all of those
properties using the *Design -> Template* page (shown
below).
image::template-edit.png[]
But the rules for _required pages_ are different. The weblog pages named
Weblog, _day and _css are considered to be required pages. You can
change the template code for those pages but you cannot edit the name,
link or any other properties.
Now that you know how to edit and create page templates, lets discuss
how to use the models, objects and macros that Roller makes available to
template authors.
== Using models, objects and macros
Roller makes weblog data available to page templates in the form of
_models_ and _data_ __objects __and makes it easy for you to generate
the HTML for your weblog by providing _macros_. Lets explain these new
terms.
* *Model objects*: Model objects provide access to data from Roller and
specifically from your Roller weblog. A model object returns data
objects or collections or data objects. In Section 7, well describe each model, its
properties and methods.
* *Data objects*: Data objects each represent an item of data within
your Roller weblog, for example there is a _Weblog_ object that
represents your weblog, _WeblogEntry_ objects which represent individual
weblog entries and _Bookmark_ objects that represent items in your
blogroll. In Section 8, well describe each data object, its properties
and methods.
* *Macros*. A macro is Velocity routine that generates HTML based on a
data object or a collection of data objects. In Section 9 well describe
each of Rollers build-in macros.
Lets discuss how to access data via models and data objects.
=== Accessing data via models and objects
Models and data objects are objects and there are two ways to access
data from objects. One way is to access an objects properties. Another
is to call the objects methods. Lets talk about these two techniques.
==== Accessing object properties
To access an objects properties, you use a simple dot-notation. For
example, if you want to display the Roller version number property of
the *$config* model object, you do something like this in your page:
<p>**$config.rollerVersion**</p>
Or, if youd like to save the Roller version number in a variable named
$version, youd do this:
*#set( $version = $config.rollerVersion )*
And some properties are themselves objects, which in turn have their own
properties and methods. For example, you can get the Weblog object from
the $model object and from the weblog object you can display the
weblogs name and description like so:
<p>**$model.weblog.name**</a>
<p>**$model.weblog.description**</a>
==== Calling object methods
Another way to access an objects data is to call an objectss methods.
Methods are different from properties because they require parameters.
You use the same simple dot-notation, but you must end the expression
with a list of parameters in parentheses. For example, if youd like to
display an image from within your theme, you can use the $url model like
so:
<img='**$url.themeResource("basic", "background.gif")**'></a>
Argument one is the name of the theme and argument two is the name of a
file that exists in the themes directory. Note that a comma is used to
separate the arguments.
=== Calling macros
In page templates, you get data from objects and you use template code
to display that data as HTML. To help you along, Roller includes some
macros which can be used to generate commonly used HTML constructs on
your weblog. There are macros for displaying your weblog entries,
displaying your blogroll and displaying a comment form.
Calling a macro is a little different from calling a macro. A macro call
starts with a # pound-sign, followed by the macro name and the macro
parameters enclosed in parentheses. For example, you call the weblog
calendar macro like so:
*#showWeblogEntryCalendar($model.weblog "nil")*
Argument one is the weblog for the calendar and argument two is the
category, where "nil" indicates that no category is specified. Note
that the arguments for a macro are separated by a space and NOT a comma
as was the case for methods.
=== A word about pagers
There are many cases in a weblog when we want to display a large
collection of values and we want that collection to be page-able that
is, we want a Next link to go to the next page of results and possibly a
Previous link to go to the previous page. So in Roller, weve introduced
the concept of a pager. A _pager_ is a special type of object that makes
it easy to display a page-able collection of items within a page
template. You can see a pager in action in Listing 1 above.
You probably wont need to use a pager object directly, since the macros
do it for you. But if you do, heres what a pager looks like:
* $pager.homeLink URL of the first page of results
* $pager.homeName Name to be displayed for that URL
* $pager.nextLink URL of the next page of results
* $pager.nextName Name to be displayed for that URL
* $pager.prevLink URL of the previous page of results
* $pager.prevName Name to be displayed for that URL
* $pager.items Collection of data objects; the current page of results
There is also a WeblogEntryPager interface that provides some extra
methods for next-collection paging. The collection methods exist because
often, with weblog entries, we are paging through the entries that exist
within one time period, a month for example. In that case. the nextLink
point to the next page of results within that month and the
nextCollectionLink points to the next months entries.
* $pager.homeLink URL of the first page of results
* $pager.homeName Name to be displayed for that URL
* $pager.nextLink URL of the next page of results
* $pager.nextName Name to be displayed for that URL
* $pager.prevLink URL of the previous page of results
* $pager.prevName Name to be displayed for that URL
* $pager.nextCollectionLink URL of next collection in sequence
* $pager.nextCollectionName Name to be displayed for that URL
* $pager.prevCollectionLink URL of previous collection in sequence
* $pager.prevCollectionName Name to be displayed for that URL
* $pager.items Collection of data objects; the current page of results
== Model Object Reference
This section covers the standard model objects available in all page
templates:
* $config provides access to the Roller site configuration parameters
* $model provides access to data for one specific weblog
* $url for creating Roller URLs and URLs within one specific weblog
* $utils utility methods needed within page templates
For each model, well cover properties and methods.
=== $config
The $config model provides access to the Roller configuration data that
youll need in your weblog.
==== $config Properties
|===
|Property Name |Type |Description
|$config.analyticsOverrideAllowed
|Boolean
|True if individual bloggers are allowed to override the default tracking code (if any) provided by the blog administrator.
|$config.commentAutoFormat
|Boolean
|True if comments should be formatted with added line feeds.
|$config.commentEmailNotify
|Boolean
|True if notification of new comments via email is enabled.
|$config.commentEscapeHtml
|Boolean
|True if all HTML will be stripped of comments before display.
|$config.defaultAnalyticsTrackin gCode
|String
|Default tracking code for web analytics software, if configured by the blog administrator (See Roller Users Guide, Roller Administration chapter.)
|$config.feedMaxSize
|Integer
|Maximum number of items displayed in RSS and Atom feeds.
|$config.feedStyle
|Boolean
|True if feeds are displayed with user-friendly formatting (via XSL stylesheet).
|$config.rollerVersion
|String
|Version number of Roller build.
|$config.registrationEnabled
|Boolean
|True if new user registration is enabled.
|$config.registrationURL
|String
|URL of new user registration site (if not using standard Roller registration).
|$config.siteDescription
|String
|Description of this Roller site.
|$config.siteEmail
|String
|Email address of this Roller site's administrator.
|$config.siteName
|String
|Name of this Roller site.
|$config.siteShortName
|String
|Short name of this Roller site.
|===
==== $config Methods
The *$config* model also provides a set of methods for accessing
properties by name. Generally, you should be able to get the
configuration data you need from the properties above. You shouldnt
need to call these methods, but just so you know:
* *boolean getBooleanProperty(String propertyName)* Returns the named
runtime property as a booean.
* *String getProperty(String propertyName)* Returns the named runtime
property as a String.
* *int getIntProperty(String propertyName)* Returns the named runtime
property as an integer.
=== $model
The **$model** object provides you with access to all of the data
objects that make up your weblog. You can get a pager object to access
your weblog entries, the weblog entry referenced by the request, the
category object referenced by the request and the weblog itself.
The diagram below show the objects you can get from the *$model* and the
collections of objects that you can get from those. See Section 7 for a
complete reference to the data objects and their properties.
image::model-object.png[]
Now lets the details of the $model object, starting with properties.
==== $model Properties
|===
|Name |Type |Description
|$model.commentForm
|CommentForm
|On a comment-page, this object will be populated with the comment form values. Values available are $model.commentForm.name, $model.commentForm.url and $model.commenForm.content.
|$model.locale
|String
|Name of locale if one is specified in the URL.
|$model.weblog
|Weblog
|Current weblog being displayed.
|$model.weblogCategory
|WeblogCategory
|Weblog category specified by URL or null if not specified.
|$model.weblogEntry
|WeblogEntry
|Weblog entry object specified by URL or null if none specified.
|$model.weblogEntriesPager
|Pager
|Weblog entry pager for paging over entries specified by URL.
|$model.weblogPage
|PageTemplate
|Weblog page object specified or implied by URL.
|$model.permalink
|Boolean
|True if URL specifies one specific Weblog Entry permalink.
|$model.searchResults
|Boolean
|True if displaying search results.
|$model.tags
|List of strings
|List of tags specified by request.
|===
==== $model Search Properties
If the URL indicates a search, then the pager returned by
*$model.weblogEntriesPager* will return entries from the search and some additional properties will be available on the *$model* object:
|===
|Name |Type |Description
|$model.categories
|List of Strings
|List of category names available in search.
|$model.hits
|Integer
|Total number of hits found.
|$model.limit
|Integer
|Max. number of search results displayed per page.
|$model.offset
|Integer
|Offset into current page of search results.
|$model.weblogSpecificSearch
|Boolean
|True if search is specific to one weblog.
|===
==== $model methods
The *$model* object also provides a couple of methods:
* *Pager getWeblogEntriesPager(String catPath)* Returns a pager that
contains only entries from the specified category.
* *String getRequestParameter(String paramName)* Returns a specific
request parameter from the URL. This is only supported on custom pages
and not on the default pages of a weblog (e.g. the Weblog page).
=== $url
To ensure that your URLs are formed correctly, you should use the *$url*
model to form all URLs that point to the Roller site or to your weblog.
Every possible type of Roller URL is supported:
|===
|Name |Type |Description
|$url.absoluteSite
|String
|Absolute URL of Roller site.
|$url.category(String catPath)
|String
|URL for one category within weblog.
|$url.category(String catPath, int pageNum)
|String
|URL for one category within weblog, w/page.
|$url.commentAuthenticator
|String
|URL of comment authenticator.
|$url.comment(String anchor, String timeStamp)
|String
|URL of comment for entry specified by anchor.
|$url.comments(String anchor)
|String
|URL of comments for entry specified by anchor.
|$url.createEntry
|String
|URL for new-entry page in Roller UI.
|$url.editEntry(String anchor)
|String
|URL for edit-single-entry page in Roller UI.
|$url.date(String dateString)
|String
|URL for one specific 6 or 8 character date.
|$url.date(String dateString, int pageNum)
|String
|URL for one specific 6 or 8 character date, w/page.
|$url.editSettings
|String
|URL for edit-weblog-settings page in Roller UI.
|$url.entry(String anchor)
|String
|URL for entry specified by anchor.
|$url.feed.entries.atom
|String
|URL of entries feed (Atom).
|$url.feed.entries.rss
|String
|URL of entries feed (RSS).
|$url.feed.comments.atom
|String
|URL of comments feed (Atom).
|$url.feed.comments.rss
|String
|URL of comments feed (RSS).
|$url.home
|String
|URL of weblog.
|$url.home(String locale)
|String
|URL to access weblog in one specific language
|$url.home(String locale, int pageNum)
|String
|URL to access weblog in one specific language, with paging
|$url.login
|String
|URL of login page.
|$url.logout
|String
|URL of logout page.
|$url.rsd
|String
|URL of Really Simple Discovery (RSD) service.
|$url.page(String pageLink)
|String
|URL of page specified by pageLink.
|$url.page(String pageLink, String dateString, String catPath, int pageNum)
|String
|URL of page specified by pageLink, dateString, catPath and pageNum.
|$url.search
|String
|URL of search
|$url.search(String query, String catPath, int pageNum)
|String
|URL of search for specific search string, catPath and pageNum.
|$url.site
|String
|Relative URL of Roller site.
|$url.resource(String filePath)
|String
|URL of uploaded file resource in weblog.
|$url.themeResource(String theme, String file)
|String
|URL of a resource within a Roller theme.
|$url.themeResource(String theme, String file, boolean abs)
|String
|Absolute URL of a resource within a Roller theme.
|$url.trackback(String anchor)
|String
|Trackback URL for entry specified by anchor.
|===
=== $utils
The *$utils* object provides all of the string manipulation methods
youll ever need for your weblog, including methods for formatting
dates, escapeing HTML, encoding URLs and even removing HTML entirely.
Heres a comprehensive list of the $utils methods:
* **User getAuthenticatedUser() **Get the current user, or null if no
use is logged in.
* *String addNowFollow(String s)* Adds the nofollow attribute to any
HTML links found within the string.
* *String autoformat(String s)* Converts any line-breaks in the string
with* <br>* tags.
* *String decode(String s)* Decodes a string that has been URL encoded.
* *String encode(String s)* Applies URL encoding to a string.
* *String escapeHTML(String s)* Escapes any non-HTML characters found in
the string.
* *String escapeXML(String s)* Escapes any non-XML compatible characters
found in the string.
* *String formatDate(Date date, String fmt)* Formats a date object
according to the format specified (see java.text.SimpleDateFormat)
* *String formatIso8601Date(Date date)* Formats a date object using
ISO-8601 date formatting.
* *String formatRfc822Date(Data date)* Formats a date object using
RFC-822 date formatting.
* *boolean isEmpty(Object o)* Returns true if the object is null or if
it is an empty string.
* *boolean IsNotEmpty(Object o)* Returns true of the object is not null
or is a non-empty string.
* *String removeHTML(String s)* Remove all HTML markup from a string.
* *String replace(String str, String target, String replacement)* In the
string str, replace the target string with the replacement string.
* *String toBase64(String s)* Convert a string to Base64 encoding.
* *String transformToHTMLSubset(String s)* Transform any HTML in the
string to a safe HTML subset.
* *String truncate(String str, int lower, int upper, String append)*
Truncate a string str so that it is between lower and upper characters
in length and add the append string.
* *String unescapeHTML(String s)* Unscape a string that has been HTML
escaped.
* *String unescapeXML(String s)* Unescape a string that has been XML
escaped.
Thats it for the $url model and for models in general. Lets move on to
the data objects.
== Data Object Reference
In this section well list each of the properties and methods of the
Roller data objects. These are:
* *Bookmark*: A single link within a weblogs web bookmark collection,
exists with a Folder
* *Bookmark Folder*: A Folder containing Bookmarks, tied to a weblog.
* *Comment*: A Comment associated with a specific Weblog Entry
* *Page Template*: An individual page template within a Weblog.
* *Referrer*: A Referrer represents an external site that links to the
Weblog
* *User*: Represents a single user within the Roller site.
* *Weblog*: a Weblog containing Weblog Entries, Page Templates, Bookmark
Folders, etc.
* *Weblog Entry*: an individual Weblog Entry
* *Weblog Entry Attrbute*: a name value pair-associated with a Weblog
Entry
* *Weblog Category*: A category within a weblog, categories in Roller
are hierarchical
=== Bookmark
|===
|Name |Type |Description
|$bookmark.description
|String
|Description of the bookmark
|$bookmark.feedUrl
|String
|URL of the newsfeed associated with the bookmark
|$bookmark.folder
|BookmarkFolder
|Parent folder of the bookmark
|$bookmark.image
|String
|URL of image to be displayed for bookmark
|$bookmark.name
|String
|Name of the bookmark
|$bookmark.url
|String
|URL of the bookmark
|$bookmark.priority
|Integer
|Numerical position of the bookmark in the list, higher number means lower in the list.
|===
=== BookmarkFolder
|===
|Name |Type |Description
|$folder.bookmarks
|List of Bookmarks
|Bookmarks contained in folder.
|$folder.name
|String
|Name of folder
|$folder.website
|Weblog
|Weblog in which folder is contained
|===
=== Comment
|===
|Name |Type |Description
|$comment.approved
|Boolean
|True if comment has been approved for display
|$comment.content
|String
|Content of the comment
|$comment.email
|String
|Email address of the commenter
|$comment.name
|String
|Name of the commenter
|$comment.notify
|Boolean
|True if commenter choose the 'please notify me via email' option
|$comment.pending
|Boolean
|True if comment is waiting for approval
|$comment.postTime
|Date
|Time that comment was created
|$comment.remoteHost
|String
|Host name or IP address of commenter
|$comment.spam
|Boolean
|True if comment is marked as spam
|$comment.url
|String
|URL of the commenter
|$comment.weblogEntry
|WeblogEntry
|Weblog entry with which comment is associated
|===
=== PageTemplate
|===
|Name |Type |Description
|$page.contents
|String
|The content of the page template, typically HTML and Velocity code
|$page.description
|String
|Description of the page
|$page.lastModified
|Date
|Date that page properties or content was last modified
|$page.link
|String
|String used to form URL to page
|$page.name
|String
|Name of the page
|$page.navbar
|String
|True if page should be included in page navigation menu
|$page.hidden
|String
|True if page is NOT callable by URL
|===
=== TagStat
|===
|Name |Type |Description
|$tagStat.name
|String
|Name of tag
|$tagStat.count
|Integer
|Number of usages of tag within weblog or site (depending on context)
|$tagStat.intensity
|Integer
|Relative intensity rating of tag (values 1 through 5)
|===
=== User
|===
|Name |Type |Description
|$user.dateCreated
|Date
|Date that user was created
|$user.emailAddress
|String
|User's email address
|$user.fullName
|String
|User's full name
|$user.screenName
|String
|User's screen name
|$user.locale
|String
|User's locale
|$user.timeZone
|String
|User's timezone
|$user.userName
|String
|User's username (this will always return the user's screen- name unless the property user.privateUserNames is set to false in roller-custom.proprerties).
|===
=== Weblog
|===
|Name |Type |Description
|$weblog.about
|String
|“About your blog” text
|$weblog.active
|Boolean
|True if weblog is considered active
|$weblog.allowComments
|Boolean
|True if comments are allowed in weblog
|$weblog.analyticsCode
|String
|Web analytics tracking code for the weblog. Will be null if not configured at the blog level, see $config.defaultAnalyticsTrackingCode for the global tracking code for blogs which do not have this value set. See Weblog Settings - Web Analytics section of Roller User’s Guide.
|$weblog.commentCount
|Long
|Total number of comments of approved in weblog
|$weblog.creator
|User
|User who created this weblog
|$weblog.dateCreated
|Date
|Date weblog was created
|$weblog.emailAddress
|String
|Email address of weblog's managing editor
|$weblog.emailComments
|Boolean
|True if email notification of comments is enabled
|$weblog.emailFromAddress
|String
|Email address for from-address of notifications
|$weblog.enableBloggerApi
|Boolean
|True if remote blogging API is enabled
|$weblog.enabled
|Boolean
|True if weblog is enabled
|$weblog.entryCount
|Long
|Total number of entries in weblog
|$weblog.entryDisplayCount
|Integer
|Default number of entries to display in pagers
|$weblog.handle
|String
|Simple string handle that uniquely identifies weblog
|$weblog.lastModified
|Date
|Timestamp of last modification to weblog
|$weblog.locale
|String
|Default locale used by weblog
|$weblog.moderateComments
|True
|True if comment moderation is enabled in weblog
|$weblog.name
|String
|Name of the weblog
|$weblog.pages
|List of PageTemplates
|Page templates of weblog
|$weblog.popularTags(int sinceDays, int length)
|List of TagStat objects
|Popular tags in past sinceDays number of days. Returns up to length number of objects.
|$weblog.tagline
|String
|Weblog tagline (short description)
|$weblog.timeZone
|String
|Timezone of the weblog
|$weblog.todaysHits
|Integer
|Number of hits counted today
|$weblog.weblogCategories
|List of WeblogCategories
|Weblog categories
|===
Weblog Methods
* *WeblogEntry getWeblogEntry(String anchor)* Get an individual
weblog entry by the entrys anchor, which is unique within a weblog.
* *List getRecentWeblogEntries(String cat, int max)* Get most recent
WeblogEntries in the weblog up to the number max. You can specify a
category name if youd like only entries from one category (or "nil"
for all categories).
* *List getRecentComments(int max)* Get most recent Comments in the
weblog up to the limit max.
* *WeblogCategory getWeblogCategory(String name)* Get weblog category specified by name.
* *PageTemplate getPageByName(String name)* Get page template specified
by name.
* *PageTemplate getPageByLink(String link)* Get page template specified by link.
=== WeblogCategory
|===
|Name |Type |Description
|$category.description
|String
|Description
|$category.image
|String
|URL of image to be displayed for category
|$category.inUse
|Boolean
|True if category is in use, i.e. if WeblogEntry objects use it
|$category.name
|String
|Name of the category
|$category.website
|Weblog
|Weblog that contains category
|===
=== WeblogEntry
|===
|Name |Type |Description
|$entry.allowComments
|Boolean
|True if this weblog entry allows comments
|$entry.anchor
|String
|Simple string that uniquely identifies post in weblog
|$entry.categories
|List of WeblogCategories
|Weblog categories associated with this entry
|$entry.category
|WeblogCategory
|Primary weblog category of this entry
|$entry.commentDays
|Integer
|Number of days that comments are allowed
|$entry.commentsStillAllowed
|Boolean
|True if comments are currently allowed
|$entry.contentSrc
|String
|URL of entry content, if out-of-line
|$entry.contentType
|String
|MIME content-type of entry
|$entry.creator
|User
|User who created the entry
|$entry.entryAttributes
|List of EntryAttributes
|Arbitrary name/value attributes associated with entry
|$entry.pubTime
|Date
|Timestamp when entry was published
|$entry.rightToLeft
|Boolean
|True if entry text is to be displayed right-to-left
|$entry.searchDescription
|String
|Descriptive text that can be added to the weblog entry's HTML header for search engine optimization (SEO).
|$entry.status
|String
|Status of entry (i.e. PUBLISHED)
|$entry.summary
|String
|Raw summary text of entry
|$entry.tags
|List of WeblogEntryTags
|Tags associated with entry
|$entry.tagsAsString
|String
|Tags listed as a string
|$entry.text
|String
|Raw content text of entry
|$entry.transformedText
|String
|Content text of entry processed by plugins
|$entry.transformedSummary
|String
|Summary text of entry processed by plugins
|$entry.updateTime
|Date
|Timestamp of last modification to entry
|$entry.website
|Weblog
|Entry's weblog
|===
WeblogEntry methods
* *public String getDisplayContent()* Returns transformed text of entry
or transformed summary if there is no entry.
* *public String getDisplayContent(String readMoreLink)* If you pass in
a non-null and non-empty entry permalink, then this method will return
the transformed summary of the entry, or the text if there is no
summary.
* *public String findEntryAttribute(String name)* Returns the value of
the entry attribute specified or null if no such attribute
=== WeblogEntryTag
A user can assign as many tags as they wish to each weblog entry.
|===
|Name |Type |Description
|$tag.name
|String
|Weblog entry associated with this attribute
|$tag.user
|User
|User who added the tag
|$tag.weblogEntry
|WeblogEntry
|Weblog entry associated with tag
|$tag.weblog
|Weblog
|Weblog associated with tag
|===
=== WeblogEntryAttribute
Weblog entry attributes are name/value pairs that can be
assigned to weblog entries. Currently, theyre only used to add podcasts
to blog entries.
== Macro Reference
This section lists the macros that are available for use in Roller page
templates, a brief description of how each works and where appropriate
an outline of the generated HTML, which highlights the CSS classes
defined.
=== Entry macros
`#showWeblogEntriesPager($pager)`
Arguments:
*$pager:* Pager object returned by a getWeblogEntriesPager() method
Synopsis:
Displays the weblog entries contained in the specified $pager object by
calling your weblogs _day template for each days worth of entries.
Generated HTML and CSS classes used
Depends entirely on contents of your weblogs _day template.
`#showNextPrevEntriesControl($pager)`
Arguments:
*$pager:* Pager object returned by a getWeblogEntriesPager() method
Synopsis:
Display the next/prev links of the specified $pager object.
Generated HTML and CSS classes used
Assuming you the page has prev and next links, the HTML will look
something like the below. As you can see, no CSS classes are defined.
----
&laquo;
<a href="..."> ...prev... </a> |
<a href="..."> ...home...</a> |
<a href="..."> ...next... </a>
&raquo;
----
`#showEntryTags($entry)`
Arguments:
*$entry:* WeblogEntry object
Synopsis:
Display tags associated with one weblog entry as list of links to tag
specific views of weblog.
Generated HTML and CSS classes used
No CSS classes are used, only a series of links like so:
----
<a href="…" rel="tag"> tag name </a>
<a href="…" rel="tag"> tag name </a>
----
=== Comment macros
`#showWeblogEntryComments($entry)`
Arguments:
*$entry:* WeblogEntry object
Synopsis:
Display the comments associated with the specified entry, not including
those entries that are not approved for posting or that are marked as
spam.
Generated HTML and CSS classes used
----
<div class="comments" id="comments">
<div class="comments-head"> <!-- Comments title --> </div>
<div class="comment even" id="">
<!-- even like above or odd as below -->
<div class="comment odd" id="">
...comment content...
<p class="comment-details">
...comment details...
<a href="link to comment" class="entrypermalink" >#</a>
</p>
</div>
</div>
----
`#showWeblogEntryCommentForm($entry)`
Arguments:
*$entry:* WeblogEntry object
Synopsis:
Display a comment form for adding a comment to the specified entry.
Generated HTML and CSS classes used
If comments are no longer allowed for the weblog entry in question, then
only a status message is generated:
----
<span class="status"> comments closed message </span>
----
Otherwise we display the comment form.
----
<div class="comments-form">
<div class="comments-head"> ...comment form title...</div>
<span class="error"> ...error message... </span>
<span class="status"> ...status message... </span>
<form method="post" name="commentForm" ...>
<ul>
<li>
<label class="desc"> ...text field... </label>
<input type="text" name="name" class="text large" .../></li>
<li>
<input type="checkbox" class="checkbox" .../> <label class="choice"> ...checkbox field... </label>
</li>
<li>
<label class="desc"> ... </label>
<textarea name="content" class="textarea large" cols="" rows="">
<!-- Comment content -->
</textarea>
</li>
<li class="info">
<span class="comments-syntax-indicator">
<span class="disabled"> Disabled </span>
<!-- disabled as above or enabled as below --> <span class="enabled"> Enabled </span>
</span>
</li>
<li class="info">
<div id="commentAuthenticator"></div>
</li>
<li>
<input type="button" class="button" .../> <!-- preview button -->
<input type="submit" class="button" .../> <!-- preview button --> </li>
</ul>
</form>
----
=== List macros
`#showWeblogEntryLinksList($entries)`
Arguments:
$entries: List of WeblogEntry objects to be displayed in a list inks
Synopsis:
Display a simple list of entries, with a title and link for each.
Generated HTML and CSS classes used
We use a simple HTML list:
----
<ul class="rEntriesList">
<li class="recentposts"><a href="..."> ...title... </a></li>
</ul>
----
`#showBookmarkLinksList($folderObj)`
Arguments:
$folderObj: Folder object from which bookmarks are to be shown
Synopsis:
Displays all bookmarks in a specified bookmark folder object.
Generated HTML and CSS classes used
We generate a simple nested list with different CSS classes for the <ul>
list and <li> list item elements. The bookmark CSS class is prepended
with the priority number of the bookmark.
----
<ul class="rFolder">
<li class="rFolderItem">
<a href="..." class="rBookmark10"/>...bookmark name... </a> </li>
<li class="rFolderItem">
<a href="..." class="rBookmark5"/>...bookmark name... </a>
</li>
</ul>
----
`#showWeblogCategoryLinksList()`
Synopsis:
Displays the defined categories for a given weblog.
Generated HTML and CSS classes used
----
<ul class="rCategory">
<li> ...unselected category name...</li>
<li class="selected"> ...selected category name...</li>
</ul>
----
`#showMobileCategoryLinksList()`
Synopsis:
Displays the defined categories for a given weblog in a format better
suited for mobile devices.
Generated HTML and CSS classes used
----
<ul>
...
<li class="ui-btn-active">
...
</ul>
----
=== Menu macros
#showPageMenu($weblog)
Arguments:
*$weblog:* Show page menu for this weblog
Synopsis:
Display a page navigation menu that lists all pages in the weblog.
Generated HTML and CSS classes used
The page menu is displayed as a simple HTML list with separate CSS
styles for list and list-items.
----
<ul class="rNavigationBar">
<li class="rNavItem">
<a href="..."> ...name... </a>
</li>
</ul>
----
`#showAuthorMenu($vertical)`
Arguments:
*$vertical:* True to display vertical menu, false to display
horizontal
Synopsis:
Display an authoring menu for the current weblog. If $vertical is true,
then display a menu suitable for use in a narrow sidebar.
Generated HTML and CSS classes used
For a vertical menu, we use a simple HTML list:
----
<ul class="rMenu">
<li><a href="..."> ...menu item name... </a></li>
</ul>
----
For a horizontal menu, we simply emit a series of pipe-separated links:
----
<a href="..."> ...menu item name... </a> &nbsp;|&nbsp;
<a href="..."> ...menu item name... </a> &nbsp;|&nbsp;
<a href="..."> ...menu item name... </a>
----
=== Search macros
`#showWeblogSearchForm($weblog $withCats)`
Arguments:
*$weblog:* show search form for this Weblog object** $withCats: **set
to true to display a category combo-box
Show a search form for searching the weblog and, if $withCats is true
show a category chooser.
Generated HTML and CSS classes used
----
<form id="searchForm" style="margin: 0; padding: 0" ...>
...form markup...
</form>
----
`#showWeblogSearchAgainForm($weblog)`
Arguments:
*$weblog:* show search-again form for this Weblog object****
Synopsis:
Show search again form, suitable for display at the start of a page of
search results.
Generated HTML and CSS classes used
----
<div id="searchAgain">
<form>
...form markup...
</form>
</div>
----
`#showNextPrevSearchControl($pager)`
Arguments:
*$pager:* Pager returned by getWeblogEntriesPager() in the context of
a search page
Synopsis:
Show special pager designed for paging through search results.
Generated HTML and CSS classes used
----
<h3> ...search summary... </h3>
&laquo;
<a href="..."> ...prev... </a> |
<a href="..."> ...home... </a> |
<a href="..."> ...next... </a>
&raquo;
----
=== Misc. macros
`#showWeblogEntryCalendar($weblog $category)`
Arguments:
*$weblog:* Weblog object
*$category:* Category restriction (or `nil' for no restriction)
Synopsis:
Show weblog entry calendar, optionally restricted by category name
("nil" for no category)
Generated HTML and CSS classes used
A weblog entry calendar is displayed as a table with different CSS
classes for <td>, <th>, <div> and links elements within, as illustrated
below.
----
<table class="hCalendarTable" ...>
<tr>
<td colspan="7" class="hCalendarMonthYearRow">
<a href="..." class="hCalendarNavBar">&laquo; ...prev month...</a> |
<a href="..." class="hCalendarNavBar">&raquo; ...next month...</a></td>
</tr>
<tr>
<th class="hCalendarDayNameRow" align="center">Sun</th>
...days of week...
<th class="hCalendarDayNameRow" align="center">Sat</th>
</tr>
<tr>
<td class="hCalendarDayNotInMonth">&nbsp;</td>
...days of week...
<td class="hCalendarDay">
<div class="hCalendarDayTitle">1</div>
</td>
<td class="hCalendarDayLinked">
<div class="hCalendarDayTitle">
<a href="...">2</a>
</div>
</td>
</tr>
<tr class="hCalendarNextPrev">
<td colspan="7" align="center">
<a href="..." class="hCalendarNavBar">Today</a></td>
</tr>
</table>
----
`#includeTemplate($weblog $pageName)`
Arguments:
*$weblog:* Weblog object from which page is to be included
*$pageName:* Name of page to be included
Synopsis:
Parse and include a page template into current page.
`#showAutodiscoveryLinks($weblog)`
Arguments:
*$weblog:* Weblog object
Synopsis:
Show the RSS, Atom and RSD auto-discovery links suitable for use within
an HTML <head> element.
Generated HTML and CSS classes used
No style-able markup is produced.
`showMetaDescription()`
Arguments: None
Synopsis:
Adds a meta description tag, suitable for use in HTML header sections.
This tag is frequently used by
search engines to provide a short description for links returned. The
description value will set to the
weblogs tagline (weblog.description) if on a multiple blog entry page
or the weblog entry search description (weblogEntry.searchDescription)
if on a single blog entry (permalink) page. If the relevant description
value has not been configured no meta tag will be created.
Generated HTML and CSS classes used
No style-able markup is produced.
`showAnalyticsTrackingCode($weblog)`
Arguments:
*$weblog:* Weblog object
Synopsis:
Adds either the blog-specific or blog server-level web analytics
tracking code provided by such services as Google Analytics. The
server-level default tracking code is used unless a blog-specific one
has been configured. See the Roller Users Guide - Weblog Settings and
Roller Administration sections for information on where to configure the
tracking codes within Roller. This tag is normally placed within the
HTML header section.
Generated HTML and CSS classes used
No style-able markup is produced.
`#showTrackbackAutodiscovery($entry)`
Arguments:
*$entry:* WeblogEntry object
Synopsis:
Show trackback autodiscovery code for a specified weblog entry, suitable
for use within a day template.
Generated HTML and CSS classes used
No style-able markup is produced.
`#showAtomFeedsList($weblog)`
Arguments:
$weblog: Weblog object
Synopsis:
Displays a list of links to a weblogs Atom newsfeeds. One for entries
and one for entries in each category that is defined in your weblog.
Generated HTML and CSS classes used
The feed list is displayed as a simple HTML list with separate styles
for list and list-items.
----
<ul class="rFeeds">
<li> <a href="..."> ...feed name...</a> </li>
</ul>
----
`#showRSSFeedsList($weblog)`
$weblog: Weblog object
Synopsis:
Displays a list of links to a weblogs RSS newsfeeds. One for entries
and one for entries in each category that is defined in your weblog.
Generated HTML and CSS classes used
The feed list is displayed as a simple HTML list with separate styles
for list and list-items.
----
<ul class="rFeeds">
<li><a href="..."> ...feed name... </a></li>
</ul>
----
And thats it for the Roller macros. Before we move on to additional
models, lets cover something you might want to do, but that doesnt yet
have a macro creating a tag cloud.
=== Displaying a Tag Cloud
We dont yet include a Tag Cloud macro in Roller because its so easy to
create one yourself. Heres what you do to display a tag cloud for your
weblog. First, if you have not already done so, customize your theme.
Next, youve got to get the tags you want to display from your weblog
object. For example, to get your most 30 most often used tags for all
time youd do this:
`#set($mytags = $model.weblog.getPopularTags(-1, 30))`
Or if you want to only get tags used in the last 90 days youd do this:
`#set($mytags = $model.weblog.getPopularTags(90, 30))`
Once youve got your tags, you can display them with a _foreach_ loop.
For example, heres a loop that displays each tag as a link to your
weblog that displays only entries in that tag. It also gives each tag a
CSS class that indicates the intensity of the tag, which indicates on a
scale of zero to five how often-used the tag is.
----
#foreach ($tag in $mytags)
<a class="tag s${tag.intensity}" href="$url.tag($tag.name)" title="$tag.count">
$tag.name
</a>
#end
----
Include that _#set_ statement and loop in your weblog template and
youll see a tag cloud, but it all the tags will be displayed in the
same size and font. If youd like to vary the size of the tags based on
how often they are used, then youll need to add some CSS. Edit your CSS
template and add this to size often used tags larger than those less
often used:
----
.s1 {font-size:60%;}
.s2 {font-size:80%;}
.s3 {font-size:100%;}
.s4 {font-size:120%;}
.s5 {font-size:140%;}
----
== Additional models
There are some additional models that can be made available to Roller
weblogs by a site administrator. These are the
*$site* for accessing site-wide data,and the *planet* model for accessing Planet Roller data. Lets start with the $site
model.
=== $site
The *$site* model provides access to site-wide data: aggregations of
webog entries from all weblogs, comments from all weblogs, lists of
users, lists of weblogs, etc. in short, everything you need to build
an interesting community front page for Roller.
==== $site Objects
Site object
|===
|Name |Type |Description
|$site.commentCount
|Long
|Total number of comments in entire site
|$site.entryCount
|Long
|Total number of entries in entire site
|$site.userCount
|Long
|Total number of users in entire site
|$site.weblogCount
|Long
|Total number of weblogs in entire site
|===
For some SiteModel methods (e.g. hot-blogs, most commented, etc.) return
a special type of object use to expressing a count with a short name, a
long name and an internationalized type:
*StatCount object*
|===
|Name |Type |Description
|$stat.subjectNameLong
|WeblogEntry
|Long name of subject of statistic (e.g. name of a weblog)
|$stat.subjectNameShort
|String
|Short name of subject of statistic (e.g. handle of a weblog)
|$stat.count
|Integer
|Value of the statistic (i.e. number of hits)
|$stat.typeKey
|String
|I18N key for type of the statistic
|===
==== $site Methods
* *Pager getWeblogEntriesPager(int sinceDays, int max)* Get pager that
returns WeblogEntry objects. Will only return entries created in last
sinceDays number of days and never more than max items.
* *Pager getWeblogEntriesPager(Weblog weblog, int sinceDays, int max)*
Get pager that returns WeblogEntry objects from one specific weblog.
Will only return entries created in last sinceDays number of days and
never more than max items.
* **Pager getWeblogEntriesPager(**[#anchor-27]##*Pager
getWeblogEntriesPager(Weblog weblog, User user, int sinceDays, int max)*
Get pager that returns WeblogEntry objects from one specific weblog and
user. Will only return entries created in last sinceDays number of days
and never more than max items.
* *Pager getWeblogEntriesPager(Weblog weblog, User user, String
category, int sinceDays, int max)* Get pager that returns WeblogEntry
objects from one specific weblog and category. Will only return entries
created in last sinceDays number of days and never more than max items.
* *Pager getCommentsPager(int sinceDays, int max)* Get pager that
returns Comment objects. Will only return comments created in last
sinceDays number of days and never more than max items.
* *Pager getUsersByLetterPager(String letter, int sinceDays, int max)*
Get pager that returns User objects. Will only return users whose names
start with letter, created in last sinceDays number of days and never
more than max items.
* *Pager getWeblogsByLetterPager(String letter, int sinceDays, int max)*
Get pager that returns Weblog objects. Will return weblogs whose handles
start with the provided (single) letter, created in last sinceDays
number of days and never more than max items. If the provided letter
parameter is more than one character only its first character will be
used.
* *Map getUserNameLetterMap()* Get map of User objects keyed by first
letter.
* *Map getWeblogHandleLetterMap()* Get map of Weblog objects keyed by
first letter.
* *List getUsersWeblogs(String userName)* Get list of all Weblog objects
associated with a specified user.
* *List getWeblogsUsers(String handle)* Get list of all User objects
associated with a specified weblog.
* *Weblog getWeblog(String handle)* Get Weblog object by handle.
* *List getNewWeblogs(int sinceDays, int max)* Get newest Weblog
objects, i.e. only those created in last sinceDays number of days.
* *List getNewUsers(int sinceDays, int max)* Get newest User objects,
i.e. only those created in last sinceDays number of days.
* *List getHotWeblogs(int sinceDays, int max)* Get recent hot Weblogs in
the form of StatCount objects, but only those updated in last sinceDays
number of days.
* *List getMostCommentedWeblogs(int sinceDays, int max)* Get most commented weblogs in the form of
StatCount objects, but only those updated in last sinceDays number of
days.
* *List getMostCommentedWeblogEntries(List cats, int
sinceDays, int max)* Get most commented WeblogEntries in the form of
StatCount objects, but only those updated in last sinceDays number of
days.
=== $planet
The *$planet* model makes Planet Roller data available to weblog pages.
It allows you to display the main aggregation (i.e. the one named
"external"), any custom group aggregation, a feed and ranked
subscriptions.
==== Configuring the planet model
The PlanetModel is not enabled by default in Roller, so before you can
use it in your weblogs youll need to enable it. To do that, you need to
define some properties in your Roller configuration and specifically, in
your _roller-custom.properties_ override file, which is explained in
STEP 8 and Appendix B of the Roller Installation Guide.
If you want to make the Planet model available in weblog pages then add
the Planet model to the list of models specified by the
_rendering.pageModels_ property by overriding the property in your
_roller-custom.properties_ file like so:
----
rendering.pageModels=\
org.apache.roller.ui.rendering.model.PageModel,\
org.apache.roller.ui.rendering.model.ConfigModel,\
org.apache.roller.ui.rendering.model.UtilitiesModel,\
org.apache.roller.ui.rendering.model.URLModel,\
org.apache.roller.ui.rendering.model.MessageModel,\
org.apache.roller.ui.rendering.model.CalendarModel,\
org.apache.roller.ui.rendering.model.MenuModel, \
org.apache.roller.ui.rendering.model.PlanetModel
----
Thats just a copy of the property setting from the default Roller
properties file, plus the Planet model (shown in bold). Actually,
depending on where want to use the Planet Model in Roller, youll need
to add the Planet model to a couple of different properties.
To make Planet model available in all blogs, youll want to add it to
these model list properties:
* rendering.pageModels: to make it available in blog pages.
* rendering.previewModels: to make it available when entries are
previewed in the blog editor
To make Planet model available in the front page blog only:
* rendering.siteModels: to make the model available in site-wide blogs
Now lets discuss the objects available from the Planet model.
==== $planet Objects
The $planet model returns two types of objects that we havent seen
before: the PlanetSubscription object, which represents a feed
subscription, and PlanetEntry, which represents one entry from a feed.
*PlanetSubscription object*
|===
|Name |Type |Description
| $sub.author
|String
|Author, from feed header
|$sub.feedURL
|String
|URL of the feed
|$sub.inboundBlogs
|Integer
|Number of weblogs that link to this weblog (or 0 if no Technorati license available)
|$sub.inboundLinks
|Integer
|Number of links to this weblog (or 0 if no Technorati license available)
|$sub.lastUpdated
|Date
|Last update time, from feed header
|$sub.name
|String
|Name of the feed
|$sub.title
|String
|Title of the feed
|$sub.URL
|String
|Same as feedURL
|===
*PlanetEntry object*
|===
|Name |Type |Description
|$entry.author
|String
|Name of author of entry
|$entry.category
|WeblogCategory
|Category of entry
|$entry.creator
|User
|User object representing author
|$entry.guid
|String
|Unique ID of entry
|$entry.permalink
|String
|Permanent link to entry
|$entry.pubTime
|Date
|Time entry was published
|$entry.summary
|String
|Entry summary text
|$entry.text
|String
|Entry content text
|$entry.title
|String
|Entry title
|$entry.updateTime
|Date
|Time entry was last updated
|$entry.website
|PlanetSubscription
|Subscription to which entry belongs
|===
==== $planet Methods
* *Pager getAggregationPager(int sinceDays, int max)* Get pager that
returns PlanetEntry objects from the main aggregation. Will only return
entries created in last sinceDays number of days and never more than max
items.
* *Pager getAggregationPager(String groupHandle, int sinceDays, int
max)* Get pager that returns PlanetEntry objects from the specified
group aggregation. Will only return entries created in last sinceDays
number of days and never more than max items.
* *Pager getFeedPager(String feedURL, int max)* Get pager that returns
PlanetEntry objects from the specified feed, up to max items.
* *List getRankedSubscriptions(int sinceDays, int max)* Get all
PlanetSubscription objects ordered by Technorati ranking. Will only
return subscriptions updated in last sinceDays number of days and never
more than max items.
* *List getRankedSubscriptions(String groupHandle, int sinceDays, int
length)* Get PlanetSubscription objects in the specified group ordered
by Technorati ranking. Will only return subscriptions updated in last
sinceDays number of days and never more than max items.
= User Guide
Apache Roller Weblogger
:toc:
:sectnums:
:imagesdir: ./images
== Overview
This document is a user guide to the Apache Roller Weblogger, the
Java-based and open source weblog server that is produced by the Apache
Roller project of the Apache Software Foundation.
There are separate guides available on other topics; a Template Guide
for those who wish to customize the layout and design of their weblog
pages and an Installation Guide for those installing the Roller software
on a web server.
=== Copyright and trademark information
The contents of this document are subject to the terms of the Apache
Software License.
All trademarks within this document belong to legitimate owners.
=== Feedback
Please direct any comments or suggestions about this document to:
dev@roller.apache.org
== Introduction
This user guide describes how to use the Apache Roller Weblogger or
Roller for short, a web application that can support a single user
weblog, thousands of weblogs and/or group weblogs.
You’ll learn how to register as a new user. You’ll learn how to create
one or more weblogs for yourself or a group of your friends. You’ll
learn how to create, edit and post weblog entries. We will also cover
more advanced topics such as adjusting your weblog’s settings, how to
customize your blogroller, how to manage weblog pings and more.
First, let’s get some terminology out of the way because there’s a lot
of jargon in weblogging. Here’s a list of some of the terms we use in
this manual without a whole lot of background.
* *Weblog*: A set of web pages and RSS/Atom feeds that display weblog
entries written by one or more authors, uploaded images, bookmarks and
comments posted by visitors. Weblog entries are displayed on the main
page of the weblog and in the weblog’s feeds in reverse chronological
order.
* *Weblog entry*. A single weblog entry with a title, publication
timestamp, summary, content and some settings that indicate if and when
comments are allowed.
* *Comment*. A comment posted by a visitor to a weblog and regarding one
specific weblog post. A comment has an email address, a publication
timestamp and some content.
* *Trackback*. A comment posted by a remote weblog regarding one
specific weblog post. Trackbacks are stored as comments by Roller.
* *Templates*. Each Roller weblog is defined by a set of HTML and CSS
templates that provide the layout and styles for the weblog. Normally
templates are authored using Velocity template language, but other
languages are possible via plugins (i.e. Groovy Server Pages, JRuby,
etc.)
* *Feed*. A feed is an XML representation of the most recent entries,
comments or other data. Folks can subscribe to your feed to be alerted
of new weblog entries and comments posted. Roller supports both RSS and
Atom formats for feeds.
* *Feed reader*. Software that makes it easy to subscribe to and read
feeds, e.g. Google Reader, Net News Wire, Feed Demon, etc.
* *Blog client*. Software that makes it easy to post to your weblog,
e.g. Ecto and Mars Edit.
With that out of the way, let’s get started blogging with Roller.
== Getting started with Roller
Getting started with Roller means different things to different people.
If you are using an existing Roller server, then getting started means
registering a new user and creating or joining a weblog. If that’s the
case for you, skip ahead to section 3.2. If you just finished setting up
your own Roller installation on your own web server, then getting
started means a little bit more. You’ve got a little post installation
work to do.
=== Getting started with a new Roller installation
Once you’ve got Roller up and running you will see a screen like the one
below, which explains exactly what you’ve got to do to get started with
Roller. First, create a new user so you can login. Second, login and
create a weblog for yourself or one to server as the front page of the
site or both. Third, designate which weblog is the front page weblog.
image::user-guide-1-welcome.png[]
**Creating the first user. **Your first step is to create a new user.
Remember, the first user you create will be given administrative
privileges. You might want to use the username "admin" or something
similar. Later, you can login as the admin user when you need to change
site-wide settings. If you wish, you can grant other users admin
privileges so they can help out with admin duties. Let’s take a look at
the user registration page. You can see the new user registration form
in the next section.
**Create the first weblog(s). **Next you should create at least one
weblog. See section 3.2 below for some more information the create
weblog page. If you are running a personal blog site, then you might
want your weblog to serve as the front page of your site. In that case,
create a weblog, use a normal weblog theme (i.e. not the Roller Homepage
theme) and assign your weblog as the front page weblog of the site.
If you are running a community weblog site with multiple weblogs, then
you will probably want to create a weblog to serve as the front page of
the site. Create a new weblog, name it "main" or "community" or
something suitable because its name will appear in URLs. And we
recommend that you use the Roller Homepage theme because it is specially
designed to serve as a weblog community front page, aggregating all of
the site’s weblogs together but having no content of its own.
**Designate a front page weblog. **Once you’ve created a front page
weblog, whether it be a personal weblog or a community aggregator, you
need to tell Roller. So, select your front page weblog and, if you are
running a community site then set the _Enable aggregated site-wide
frontpage_ checkbox before you click Save.
If you’ve read this far, you’ve probably created your own user and
weblog and if so you can skip the next section.
=== Creating a new user and weblog
To create a new user use the Register link, which can be found in the
top right of the Roller login page. That link will take you to the New
User Registration page shown below.
image::user-guide-2-registration.png[]
The New User Registration form is pretty self-explanatory, but keep in
mind that your username cannot be changed; it is your unique identifier
in the system. But that’s OK because your screen name is the name that
will be displayed on your weblog and in your feeds and you _can_ change
it later if you wish.
Instead of username and password, the Roller administrator may provide
(or require) OpenID (http://openid.net/[http://openid.net])
authentication. With OpenID you will not provide a password (as you will
be logging into another system to authenticate) but just your OpenID
account name, whose format will vary based on the OpenID provider. For
example, using Google+ as your OpenID provider will result in an account
name similar to https://profiles.google.com/&lt;numeric-ID &gt;, where the
numeric identifier can be determined simply by Googling your name along
with "google plus". (Note the OpenID string does _not_ use the
plus.google.com domain returned by this query.)
**Picking your language and timezone. **You can set your language of
choice and timezone too, but these values don’t do much in Roller. The
locale and timezone of your weblog are really what matter. The values
you set here will be used as your defaults when you create your weblog.
**Creating a weblog . **Once you’ve created a user, then log in and
you’ll see the Roller Main Menu page and a greeting that reads:
You’ve got a user account, but no weblog. Would you like to _create
one_?
Follow that link to create your first weblog. You’ll see the form below.
image::user-guide-3-webblog.png[]
The form is designed to be self-explanatory. Note that you can change
everything later, except for the weblog handle, which is the unique
identifier for your weblog.
Now that you’ve got a user and a weblog, let’s discuss how to get around
in the Roller interface.
=== Getting around in Roller
Once you’ve logged into Roller’s editor pages you should be able to find
your way around using Roller’s tabbed menu. To provide a little extra
assistance, Roller displays a status bar at the top of each editor page.
For example, the status bar below indicates that you are logged in as
user 'admin' and you are not editing a weblog. You can go directly to
the front page of the site by clicking the first link on the right (it
might not be labelled Front Page on your site), to the main menu with
the second link and you can log out entirely by using the Logout.
image::user-guide-4-statusbar.png[]
For example, the status bar below indicates that you are logged in as
user 'admin' and you are editing a weblog with the handle 'adminblog'.
image::user-guide-5-statusbar-webblog.png[]
If you are not logged into Roller then you can either access the login
link directly or use a Login link from one of the weblogs on the site.
The login link is of this form:
_http://hostname/roller-ui/login-redirect.rol_
Or this form if Roller is installed under its own context:
_http://hostname/roller/roller-ui/login-redirect.rol_
You probably won’t need to cut-and-paste that link because most weblogs
display an author menu like so:
image::user-guide-6-navigation.png[]
Now that we’ve covered the basics of registering a new user, creating a
new weblog and finding your way around let’s start blogging.
== Creating and editing your weblog
First, you log in to Roller. What happens next depends on the number of
weblogs that you have. If you have one weblog, you’ll be taken directly
to the *New Entry* page for that weblog.
If you have more than one weblog or none at all, then you’ll be taken to
the *Main Menu* page, shown below, so you can pick which weblog to edit
and/or create new weblogs.
image::user-guide-7-main-menu.png[]
The main menu page lists all of your weblogs and for each, shows you
links to its New Entry, Entries, Comments, Theme and Settings pages. You
can also create a new weblog, edit your user profile.
If you are logged in as a Global Administrator, you will also see a
Server Admin link in the actions side-bar. And if you have Roller’s
Planet aggregator enabled, then you will also see a Planet Admin link
there as well.
=== Creating and editing a weblog entry
Use the *Create & Edit -> New Entry* page (also known as the Weblog
editor page) to create, edit and publish weblog entries. Using this
page, shown below in illustration 7, you can set entry title, category,
content and summary. You can also set some advanced settings by
expanding the _Plugins To Apply_ and _Advanced Settings_ controls at the
bottom of the page. Let’s review those fields, buttons and settings.
image::user-guide-8-editor.png[]
==== Weblog editor fields
Let’s discuss each of the fields on the New Entry page, so you know how
to use them.
* *Title* – Each weblog entry must have a title. Be careful when you
pick your title, it will be used in the permalink (URL) for your weblog
entry (up to the first five words of the blog title, separated by
hyphens). For best results, _do_ use titles that are short and
to-the-point. __Don’t __include any HTML in your titles, just plain text
– if you want your titles to be bold, then customize your templates
instead of embedding HTML in your titles.
+
To generate a permalink different from the actual blog title, first type
in the desired permalink, then hit Save As Draft which will create the
permalink. Then change the blog title to whatever desired for the blog
entry prior to publishing it—the permalink won’t change.
* *Status* – This read-only field tells you about the current state of
the weblog entry that you are editing. There are three possible status
settings:
* _Not Saved_ – the entry has never been saved
* _Draft_ – the entry is saved as a draft and is not yet visible to your
weblog’s readers
* _Published_ – the entry has been published and is visible to your
weblog’s readers
* *Permalink* – this read-only field is the permalink link to your
weblog entry. It is set the first time that you save an entry, based on
the title at the time you save (see Title section above), and it cannot
be changed later. As a workaround for getting a new permalink, the text
of a blog entry can be copied to a new blog entry with the desired
permalink and the published date set back to that of the original blog
entry (Advanced settings). Once the new blog entry is published, then
just delete the old blog entry with the undesired URL. However, be
cautious about changing a permalink in this manner because all external
links to original blog entry will be broken as a result.
* *Category* – You can pick one category for your weblog entry.
Categories are for folks who want to organize their weblog entries by
subject. You can add and remove categories via the Categories page.
* *Tags* – (optional) In addition to assigning each of your weblog
entries to a category you can also tag them. You can assign a list of
tags to each entry. You can use any tag name you want. Separate your
tags with spaces. Currently, the only way to do multi-word tags is to
use an underbar, for example to tag something with "apache roller" you
would use the tag apache_roller. As you type, Roller may suggest tags
that you’ve used before.
* *Content* – This is the main body of your weblog entry, in HTML
format. We try to make that easy by providing two ways to edit the
content. Via the Settings page, you can pick either of these:
* *Rich Text Editor (Xinha)* – a rich-text editor that’s designed to
make editing HTML as easy as using MS Word or Open Office.
* *Text Editor* – a plain-text editor that you can use to edit the raw
HTML markup of your weblog entries. Don’t use this unless you know HTML.
* *Summary* – (optional) If you wish, you can enter a short summary of
your weblog post. If you do so, then the short summary will be displayed
on the main page of your weblog and your readers will have to click a
Read More link to get to the full-content. Some bloggers like to do this
when they have very long post and they don’t want that long post to
dominate the main page of their weblog.
==== Weblog editor buttons
Here’s a guide to the buttons that appear on the Weblog editor page.
* *Post to weblog* – Using this button will publish your weblog entry
and make it visible to the world. Make sure you’re happy with your post
before you publish because once something is published on the web, and
grabbed by the blog aggregators and search engines, _there’s really no
way to un-publish_ it.
* *Submit for review* – if you’re just a limited blogger, you won’t see
the Post to weblog button because you cannot post to the web. Instead,
you’ll see a Submit for review button which you can use to send your
entry to the author/admin of the blog that you are working in. If they
like the post, they can publish it – or they can return it to you for
further edits.
* *Save as draft* – this will save your weblog post for later editing,
but will _not_ publish it to the web. When you’re working on a new
weblog entry, use Save as draft often so you won’t lose your post in the
event of internet connection loss or session time-out.
* *Delete entry* – use this to delete the current weblog entry, you’ll
be asked to confirm.
* *Full preview* – You won’t see this button until you’ve saved your
entry as a draft. It allows you to view, in a separate window, a preview
of your entry, displayed using the layout and style of your blog.
==== Weblog editor plugin settings
If you expand the _Plugins to Apply_ control, you’ll see a set of
check-boxes, one for each Weblog Entry Plugin that is available. Check
the ones that you’d like to apply to your current weblog entry. If you
have a favorite plugin, one that you want to use on every entry, then
you can set it as a default on your weblog’s Settings page.
image::user-guide-plugin.png[]
==== Weblog editor advanced settings
If you expand the _Advanced Settings_ control, you’ll see what’s below.
image::user-guide-settings.png[]
All of these are optional settings.
* *Pub Time* – if you’d like to set the publication time of your weblog
entry to a specific time, possibly one in the future, you can do so
here.
* *Allow comments for* – this setting allows you to turn comments on/off
for your weblog entry and to limit the number of days that comments are
allowed.
* *Text reads left-to-right* – this settings allows you to set the reads
left-to-right flag for a weblog entry. Currently, none of the stock
Roller templates respect this setting.
* Pinned to main – only Global Administrators will see this setting.
It’s a way to indicate that a post is a __special announcement __that
should be pinned to the top of the front-page of a weblog site. The
front-page theme respects this setting.
* *Enclosure URL*: if you’d like to include a audio, video or image file
as a p__odcast__ in your weblog’s RSS feed, then enter the URL of that
file here.
=== Finding and editing weblog entries
All of your weblog entries are saved in a database. Once your entries
scroll off the front page or off the recent entries list of the weblog
editor page, they are still available via next and previous links
displayed on your weblog and via the weblog calendar that is included in
most weblog themes.
You can also access your entries via the Edit Entries page, which allows
you to search entries via keyword, category, tags, date and status.
image::user-guide-9-entries.png[]
=== Managing categories
Each weblog can define its own unique list of categories to be used for
categorizing weblog entries, using the Categories page shown below. When
you or another author of your weblog creates a new entry you _must_
choose one of the categories you have defined.
image::user-guide-10-categories.png[]
You can use the Categories page to add new categories and to edit your
existing ones. You can change category names if you wish. And you can
also delete categories and if a category is in use you will be asked to
re-categorize the entries in that category.
You can also define icons for each category, but support for icon images
has not been coded in most Roller themes, requiring you to do template
customization if you wish to display them.
=== Managing your weblog’s blogroll
Roller makes it easy to maintain a _blogroll_, that is, a list of your
favorite weblogs and web sites that is displayed in the sidebar of your
weblog. Individual blogroll items are known as _bookmarks_. Use the *Create &
Edit:Blogroll* page to add, edit and delete bookmarks and bookmark
folders in your blogroll.
image::user-guide-11-blogroll.png[]
=== Uploading images and other files to your weblog
If you’d like to upload images or other files for use in your weblog, go
to your weblog’s *Create & Edit -> Media Files* page. From there you can
upload files, browse and search files. You can also manage your files,
organize them into directories and post them to your weblog.
image::user-guide-12-media.png[]
You can see the Media File View page above. Below we’ll discuss all of
the things you can do with Media Files via the Media File View page and
the new Media File browser that we’ve added to the Weblog Editor.
==== How to upload files
To upload files you follow the *Add Media File* link in the top right of
the page. You will see the Media File Add page, which is pictured below.
image::user-guide-13-add-media.png[]
You can upload up to five files at a time and you can enter information
about the images including title, description, copyright statement and
tags. You can pick which directory should receive the uploaded images.
You can also decide whether or not you want your images to be included
in the Gallery, which means that they will be made available in the
Media File Feed for your blog.
After your file upload completes, Roller will show you the *Upload
Complete* page (below) with the files that you uploaded and will offer
to include them in a new weblog post for you. You can choose any or all
of the images, or you can skip this step and return to the Media File
View.
image::user-guide-14-upload-complete.png[]
==== How to edit and update files
From the Media File View page, you can edit any Media File simply by
clicking on it. When you click you will be shown the Media File Edit
page (below). From this page, you can edit the same information that you
entered when you uploaded the file.
You can also upload a new version of the file. The file will maintain
the same URL as before the update, so no worries about broken links. If
the file is an image, a new thumbnail will be generated for you and
image size information will be updated.
image::user-guide-15-edit-media.png[]
==== How to use Media File Directories
You can use directories to organize your Media Files. You can move files
around and not worry about breaking any links because directory and file
names are not part of URLs.
To create a new directory, enter a new directory name in the new
directory control, and click the create button.
image::user-guide-media-directory.png[]
To navigate into a directory in the Media File View page, simply click
on the directory.
==== How to delete Media Files
To delete Media Files, go to the *Media File View* page, select the
checkboxes of the files you wish to delete and then click the Delete
button. You will have to confirm the delete before it executes.
==== How to delete Media File Directories
To delete Media File Directories you must first empty them out. You can
only delete directories that are empty.
==== How to post media files to your weblog
We explained above how to post images during the upload process. From
the Blog entry edit page, click on the "Add Media File" link located
above and to the right of the Content field. Roller will insert the
media file at the cursor location in the content field. If there’s a
problem with the insertion location, hit Ctrl-Z to undo the action and
try again.
==== How to post a podcast to your weblog
Upon uploading a non-image media file, such as a podcast, Roller
provides you an option to create a new blog entry with that media file
(podcast). If chosen, Roller will include the media file in the post
content and in the Enclosure URL field in the Advanced Settings section
of the Blog Edit Entry page. The Enclosure URL field is used just for
your blog’s RSS and Atom feeds, it will include the podcast as a feed
enclosure (http://en.wikipedia.org/wiki/RSS_enclosure) to make it easy
for podcast readers to fetch it.
Alternatively, you can select an podcast from the Add Media File link
referenced in the previous section, which will add its URL to the post
content, and then copy that URL to the Enclosure URL field in the
Advanced Settings section if you wish to add it to your blog’s RSS
and/or Atom feeds.
=== Podcasting with Roller
Roller includes support for _podcasting_, a way to distribute files
through your weblog’s newsfeed. Typically, folks use podcasting to
distribute audio files, but the technique can be used to distribute any
type of file. Specialized podcast client software downloads the audio
files that are referenced in your newsfeed and copies them to an music
player, such as an MP3 player.
This section assumes that you want to upload your podcasts to some other
server, one with lots of space and bandwidth, and not to Roller. If you
want to upload your podcasts to Roller, then see *Section 4.5.7* for an
explanation of posting a Media File to your weblog as a podcast.
==== *How to create a podcast feed with Roller*
In Roller a Podcast is like an attachment to a weblog entry. Here are
the steps involved in Podcasting with Roller:
* Record an interesting Podcast (that’s the hard part, by the way) and
save your Podcast in MP3 format or whatever format you prefer.
* Upload your Podcast to a web server somewhere and take note of your
Podcast’s URL. For example, if you were to upload a file to Roller, then
the URL might look something like this:
_http://hostname/roller/yourname/resource/mycast.mp3_
* Create a new Roller weblog entry announcing your new Podcast. You
might want to provide a link to it so that those without a Podcast
client can click to download it directly. For example:
Hey now! I just created my first Podcast you can download it here: <a
href="http://hostname/roller/yourname/resource/mycast.mp3">mycast.mp3</a>
* And the most important step: in the lower-half of the weblog editor
page, you’ll see an expandable control labelled _Advanced Settings_.
Click on that to expand the control and paste in the URL of your
podcast.
* Once your blog post is ready, save it as a draft or publish it. Once
you’ve done that you’ll see that the Advanced Settings control has
picked up the content-type and file-size of your podcast. If not, then
Roller could not access your podcast due to network problems or perhaps
a bad URL. Make sure the URL is correct and save again. If your podcast
is OK, you’ll see something like this:
image::user-guide-podcast.png[]
* Roller will add the podcast to your RSS newsfeed as an _<enclosure>_.
You can check this by looking at your RSS newsfeed and any podcast
software that is subscribed to your feed will pick it up automatically.
<enclosure url="http://example.com/roller/nina/resource/mycast.mp3"
type="audio/x-mpeg" length="3409127" />
=== Using a weblog client with Roller
Using a nice weblog client like Ecto or MarsEdit can make it easier for
you to post to your Roller weblog. You can also post to your weblog
remotely from services like Flickr.com and del.icio.us. This is possible
because Roller supports a standard publishing protocols such as the
MetaWeblog API and the Atom Publishing Protocol. Here’s how to set up a
weblog client to post to Roller.
Configuring a weblog client for use with Roller
First, make sure to enable weblog client API support in your weblog via
your weblog’s Weblog Settings page.
image::user-guide-17-api.png[]
Next, start your blogging client, find the preferences or account setup
dialog. You’ll need to set the following parameters:
* *Username*: your Roller username
* *Password*: your Roller password
* *BlogID*: the handle of your Roller weblog
* *URL*: the URL of Roller’s web services end-point
Note that you may not need to enter your BlogID because some blog
clients will login to Roller and then present you with a list of the
weblogs that are available to your user.
*A blogs.sun.com example*. For example, if you have an account on
blogs.sun.com, your username is fred and your blog’s handle is fredsblog
(i.e. your weblog’s URL is _http://blogs.sun.com/fredsblog_), then your
parameters would be:
* *Username*: fred
* *Password*: (your password)
* *BlogID*: fredsblog
* *URL*: http://blogs.sun.com/roller-services/xmlrpc
You may not need to enter your BlogID because some blog clients will
login to Roller and then present you with a list of the weblogs that are
available to your user.
*A jroller.com example*. If you have an account on jroller.com, your
username is fred and your blog’s handle is fredsblog (i.e. your weblog’s
URL is _http://jroller.com/fredsblog_), then your parameters would be:
* *Username*: fred
* *Password*: (your password)
* *BlogID*: fredsblog
* *URL*: http://jroller.com/roller-services/xmlrpc
== Working with comments and trackbacks
Roller supports weblog comments and _trackbacks_, which provide a way
for other bloggers to add comments to your blog remotely. By default
comments and trackbacks are enabled, but you can turn them off on your
weblog’s Weblog Settings page of your weblog. Note that turning off
comments will disable both comments and trackbacks.
=== Comment notification via email
If you’re going to leave comments turn on then take the time to read
them, to respond where appropriate and, when you receive spam or other
forms of offensive comments, delete them from your weblog. You can’t
respond to comments if you don’t know when you get one, so make sure you
enable email notification of comments. You can do that on the Weblog
Settings page.
If you’ve got email turned on then you’ll receive an email every time
you get a new comment and the email will include the text of the
comment, a link to the entry that was commented upon and a link to the
comment management page, shown below, where you may choose to approve,
mark as spam or even delete the new comment.
=== Comment management
You can use the Comments page to manage your weblog comments. You can
mark comments as spam or delete them entirely. You can search comments
by keyword, date and status. If you’ve got comment moderation turned on,
you will use the Comments page to approve new comments.
image::user-guide-18-comments.png[]
*A word about status*
You can’t edit comments, but you can mark them as spam or dis-approve
them. Someday, Roller may provide some spam filtering based on data
collected from comments marked as spam but currently, marking as spam
and dis-approving of a comment do the same thing – they prevent the
comment from being displayed on your weblog.
*How to get to the Comments page*
There are a couple of ways to get to the Comments page. You can use
Roller’s tabbed menu to go there and manage comment across your entire
weblog. If you’ve got email notification of new comments turned on, the
you might arrive at the Comments page via a link sent to you in your
email.
You can also manage comments for just one weblog. When you are editing a
weblog entry with comments you’ll see a link in the top-right corner of
the weblog editor page like the one below, which you can use to access
the entry’s comments.
=== Comment moderation
If you’d like to preview and approve comments before they are displayed
on your weblog, then you’ll want to turn on _comment moderation_ via
Weblog Settings page. When comment moderation is enabled, then each new
comment will be marked as pending and unapproved and will not appear on
your weblog. To check for new comments, go to the Comments page to check
for and either approve or delete new comments. If you’ve got comment
notification enabled, make sure you also enable comment notification so
you’ll know when new comments arrive. To moderate comments, use the
comment management page, described below.
How to moderate comments
* Review each new comment and decide if it is to be approved for
display, marked as spam and hidden or deleted entirely.
* Only comments that are marked as approved and are not spam will be
displayed on your weblog. So set (or unset) the corresponding checkboxes
for each comment, or leave them the way they are.
* When you are done. Click the save changes button at the bottom of the
page. You’ll see that comments that were pending are no longer pending
and those that you marked for delete will be gone.
=== Global comment management
If your user has global administration privileges, then you can manage
comments across the entire Roller site, including every weblog. To do
this, go to the *Server Administration:Comments* page and you’ll see a
page that is almost identical to the weblog-specific comment management
page.
Limitations of global comment management
You can use this page to mark as spam or delete any comment in the
system, however you cannot change the approval status of comments
through this interface. Approving comments for display is the duty and
responsibility of the individual webloggers, so comment approval is only
available in the context of a weblog.
=== *Preventing weblog spam*
There are two forms of comment spam that can affect your weblog:
** _Comment spam_: spam that arrives via the comment form on your
weblog. Sometimes spam comments are added by a human and sometimes by a
computer program known as a _spambot._
** _Trackback spam_: spam that arrives via trackbacks sent by a spambot.
Fortunately, there are counter-measures for each type of spam. Here are
Roller’s built in spam prevention measures:
* _Pluggable comment authentication_. By default, Roller asks each
commenter a simple math question to ensure that they are a person and
not a spam robot. Your site administrator can turn this off or replace
it with another form of authentication.
* _Pluggable comment validation_. Roller includes five comment
validators below. Your site administrator can adjust the settings for
these validators and can enable/disable them as needed by overriding
Roller’s configuration properties (see the Installation Guide for more
information).
** Excess links validator will mark comments with more than three links
as spam (default: on)
** Excess size validator marks any comment with more than 1000
characters as spam (default: on)
** Bannedwordslist validator marks comments containing any of your site’s
designated bad words as spam (default: on)
** Trackback verification validator will check incoming trackbacks to
ensure that they link to you.
** Akismet validator allows you to use the Akismet.com spam prevention
service.
* _Comment throttling_. If your site is being abused by a spam robot
your site administrator can set up throttling, which will watch for
abusers and ban IP addresses that are posting too many comments too
quickly.
But nothing beats comment moderation
Even if you’ve got all of those measures enabled you should still enable
email notification of comments so that you are constantly aware of new
comments on your weblog. None of the measures are 100% effective. If you
are really concerned about displaying offensive content on your weblog
even for a short time, then enable comment moderation on your weblog.
Roller uses a _bannedwordslist_, a lists of words which are used to check
incoming comments, trackbacks and requestors for spam URLs. If the name,
URL or content of a comment or trackback includes one of the bannedwordslist
words or matches one of the expressions then that comment or trackback
is marked as spam and is not displayed on your weblog, unless you use
the comment management page to unmark it.
Actually, there are three levels of bannedwordslist:
** Level 1 bannedwordslist: This is the built-in bannedwordslist, the one that comes
with Roller. This can only be changed by somebody with root access to
the Roller server itself.
** Level 2 bannedwordslist: This is the site wide bannedwordslist, which can only be
edited by a global administrator via the Server Admin page.
** Level 3 bannedwordslist: Weblog specific bannedwordslist, which you control in
the Weblog Settings page of your weblog.
Incoming comments and trackbacks are checked against all three levels of
bannedwordslist. Incoming web page requests, however, are only checked against
the levels 2 and 3 bannedwordslist and will receive a 403 (forbidden) message
if found.
If you have a spam problem on your weblog and you’d like to add words to
the bannedwordslist, it’s probably better for you to ask your administrator to
add the words to the level 2 bannedwordslist for you. That way, every blogger
on the site will benefit from the addition. If you must do it yourself,
here’s how you do it:
** Go to the Weblog Settings page and scroll down to the bannedwordslist
fields
** Enter your spam words, one per line
** Lines that begin with a left parenthesis will be treated as regular
expressions (see the Java API documentation for
_javax.util.regex.Pattern_ for a guide to regular expressions). Don’t
try to use a regular expression unless you really know what you’re
doing.
=== Sending trackbacks
If you are writing about something you read on another weblog, you want
to let the author and readers of that weblog know that you are doing so,
and that other weblog is trackback enabled, then you should send that
weblog a trackback ping. Here’s a story that illustrates how trackback
works:
* You read an interesting blog entry on Otto’s blog. You notice that
Otto’s blog entry has a trackback URL, so instead of leaving a comment
on Otto’s blog you decide to comment by writing a blog entry in your own
blog. You copy that trackback URL (using ALT-C, or right-click-copy, or
whatever) cause you’ll need it later.
* You go to your blog and write a new blog entry in response to Otto’s
entry. Click the Post to Weblog button to publish your new entry. After
you publish, scroll down on the New Entry page until you see the
following text field and button:
* Enter the trackback URL from Otto’s blog entry into the text field and
click the Send Trackback button. Roller will respond by printing the
response received from Otto’s blog server. If the trackback was
successful, you should see something like this:
* You should now see your trackback listed among the comments on Otto’s
blog entry.
== Choosing your weblog theme
A weblog theme is a set of templates, style-sheets and image that
determine how your weblog will be displayed. A theme can define both the
layout and color-scheme of your weblog. You can pick from one of a
number of predefined themes. Some themes will allow you to control
design by using a stylesheet. Other themes require you to edit the
templates that define the theme if you want to customize them.
You can access Roller’s theme and template features for your weblog via
the Design menu, shown below:
image::user-guide-20-design-menu.png[]
The Theme menu leads you to the theme chooser page, shown below. Using
this page you can pick from one or more different themes for your
weblog. If none of the themes are appealing to you, then speak to your
site administrator about obtaining or developing some additional themes.
The Roller Support project is one place where you can obtain additional
themes (_http://roller.dev.java.net_, _not_ an Apache site).
image::user-guide-design-theme.png[]
For more information on customizing Roller themes refer to the Template
Guide.
== Managing your weblog preferences
As a Roller user, you are free to customize the settings of your weblog
as you wish. When you establish your Roller user account, you can choose
one of the dozen or so stock themes for your website. Later, you can use
the theme switcher to switch to a different theme. Or, if you know
something about HTML and CSS you can customize the look-and-feel and
layout of your weblog yourself by modifying the page templates that make
up your site and by adding new pages. Best of all, you can do all of
this through the web-based Roller Editor UI.
=== Weblog settings
The *Preferences:Settings* page allows you to set the configuration
parameters for your weblog.
Here is an explanation of each of the settings on the weblog
*Preferences:Settings* page:
==== *General settings*
image::user-guide-settings.png[]
* *Title* - The title of your weblog may include HTML, but the HTML will
be stripped out in your RSS feed. You can access your title in a page
template with the expression _#showWebsiteTitle()_
* *Tagline* – Short description or sub title of your weblog. May include
HTML, but the HTML will be stripped out in your RSS feed. You can access
your tagline in a page template with the expression
_#showWebsiteDescription()_.
* *Icon* - The image file name (ex: thumbnail.jpg) or image url (ex:
http://yoursite/thumbnail.com) that shows on some of the default themes.
You’ll need to upload the image via the *Create & Edit:File Uploads* tab
first.
* About your blog – A more detailed description of the blog or blog
author(s) that shows on some of the default themes.
* *Email address of weblog owner*: Enter the email address that you
would like people to use to contact the person in charge of your blog;
usually that’s you. To thwart spammers, your email address will be
obfuscated when displayed on your blog. Please enter a valid address,
otherwise Roller’s email features will not work.
* *Weblog editor page to be used* - Choose a weblog editor page, some
are rich-text editors:
** editor-text.jsp: Simple text editor, you must enter HTML
** editor-rte.jsp: Rich text editor (works in Firefox and IE but not
Safari)
* **Weblog is active: **un-check this box to indicate that your weblog
is no longer active and should not appear in hot-blog and other weblog
listing on the site. You might want to do this if you take a very long
vacation or if you have decided to stop updating your weblog for some
other reason.
* *Number of entries to display on weblog*: Enter the maximum number of
entries to be displayed on your weblog.
==== Internationalization Settings
image::user-guide-internationalization.png[]
* I publish my weblog in multiple languages: check this box if you blog
in multiple languages and would like to specify a language locale for
each of your weblog entries.
* Show my weblog entries from all languages on my home page: check this
box if you’d like your weblog’s main page to show your posts in all
languages. If you don’t check it, then readers will only see weblog
entries from your default locale.
* Locale set the default locale for your weblog.
* Timezone: the timezone to be used in your weblog.
==== Comments and default comment settings
image::user-guide-comments.png[]
* *Allow comments for your weblog?* – Check this box to allow visitors
to leave comments on your weblog.
* *Moderate comments* – Check this box to enable comment moderation
(i.e. you must approve each comment before it is displayed).
Note the next two options are visible only if the Roller Administrator
has enabled email notifications for user blogs (See Section 9.2, Roller
Administration):
* *Email notification of comments?* – Check this box to receive an email
notification of each new comments.
* *Default from e-mail address for comments* – This will be used as the
from address in comment emails sent by Roller.
* *By default, allow comments for new entries* – Check this box to
enable comments on your weblog. You can also control comments on each
individual weblog entry.
* Default time to allow comments for new entries – Choose the default
amount of time to allow comments for new blog entries. This setting may
also be overridden using the Comment Settings section of the New Entry
page.
* *Apply comment defaults to all existing entries? *- If you check this
box, when you click the Save button the comment defaults you have set
will be applied to all existing comments.
==== *Weblog client API*
image::user-guide-17-api.png[]
* *Enable Blogger API for your weblog* - Set to true to enable
weblogging via the MetaWeblog API. This will allow you to use handy
blogging clients like Ecto to post to your weblog.
* *Category for posts received via Blogger API* - Choose the category
for incoming posts made via the Blogger API. This only applies if you
blogging client does not support categories
==== *Formatting*
image::user-guide-formatting.png[]
* **Default entry formatters: **this is the list of plug-ins to be
enabled by default on a new weblog entry.
==== *Spam prevention*
image::user-guide-spam.png[]
* **Ignore incoming URLs that contain any of these words - **you can use
this to filter out what commentors, trackbacks, and referrers (web page
requestors) are accepted. See Section
[link:#5.5.Preventing%20weblog%20spam%20%7Coutline[5.5]]for more
information on spam prevention.
==== Web Analytics
If you wish to use Web Analytics software tools such as Google Analytics
(a fuller list of services is here:
http://en.wikipedia.org/wiki/List_of_web_analytics_software) to track
blog readers you can place your tracking code (usually a JavaScript
snippet including the <script> element that contains it) in this field.
Then, add the “#showAnalyticsTrackingCode($model.weblog)” macro to an
appropriate area in your blog’s template (the HTML <head/> section is
a good place) and this tracking code will be active for your blog.
(Most if not all of the blog templates pre-packaged with Roller
will already have this macro present; it will not output anything
if no tracking code is provided.)
This option will be available only if it has been activated by the blog
server administrator; alternatively, the tracking code can be directly
placed within the blog template if your administrator has enabled
template customization for blog owners. The blog server administrator
may configure a blog server-level default tracking key that will hold
for all blogs or alternatively just for blogs which haven’t overwritten
this default key.
=== Weblog members: managing a group blog
To create a group blog, create a new weblog or log into an existing
weblog that you’d like members to contribute to. Creating a weblog for
group blogging is the same a creating a personal weblog (see section
http://www.rollerweblogger.org/wiki/Wiki.jsp?page=UserGuide_2.x#ref-UserGuide_2.x-3[[3]]
for instructions). Navigate to the *Members* menu item in the
*Preferences* tab. The *Preferences:Members* page enables weblog admins
to invite members to a group blog and manage the group blog user access.
image::user-guide-21-member.png[]
You can use the *Invite new member* link to invite any Roller user to
join your weblog, but before you do you should understand the three
different permission levels allowed for members of a weblog. They are:
* *Admin*: an admin can create/edit weblog entries and publish them to
the web. They can also manage the weblog by changing the theme, editing
the page templates that define the look of the blog, and managing the
users of the blog. Roller will grant you admin rights in any weblog you
create. Admin users can see both the Create & Edit tab and the
Preferences tab of Roller.
* *Author*: author permission allows users to create entries, edit
entries and upload files. But authors cannot change weblog settings,
modify the theme or manage users. Authors can see the weblog Create &
Edit tab, but not the weblog Preferences tab.
* *Limited*: limited bloggers can create and edit blog entries and save
them as drafts, but cannot publish them to the web.
Select *Invite new member* from the right navigation to invite Admins,
Authors, and Limited authors to join the group blog. You’ll need to know
the users individual blog username to find them in the list of users.
You may scroll through the list, but it’s best to begin typing their
username to locate them. Set the users Permissions by selecting Admin,
Author, or Limited. Click on *Send Invitation*. If Roller is not
configured to talk to the mail server, you may get the following
messages:
User successfully invited.
ERROR: Notification email(s) not sent, due to Roller configuration or
mail server problem.
As long as the first message is present, the invite is successful. The
next time the user logs into the blog site, they will see the message
show in the screenshot below asking them to accept or decline your
invitation.
Once a user is a member of your blog, you can change their permissions.
Just click the appropriate radio button in the table and click the
*Save* button. You can also remove users from the site, but note that
you cannot reduce your own permissions or remove yourself from the
weblog.
*Accept or Decline a Group Blog Invitation*
If you are invited to become a member of a group blog, an invitation
will be present at the top of the Main Menu page. Example:
image::user-guide-22-invite-member.png[]
Click 'accept' to become a member of the group blog or 'decline' to turn
down the invitation.
*Contribute to a group blog*
Once you’re a member of a group blog, contributing is as easy as
creating blog entry content. To access the group blog, login, from the
*Main Menu* navigate to the group blog you’d like to contribute to and
select any of the following: New Entry, Edit Entries, Settings (weblog
admins only).
For users who participate in multiple weblogs it is important to note
that the Main Menu page is how you switch between the various weblogs
you can author to. The Main Menu will always show you what weblogs you
are participating in and what privileges you have on each weblog.
*Resign from a Group Blog*
To resign from a group blog, login, on the Main Menu page, navigate to
the blog information for which you wish to resign. Select 'Resign'.
== Using weblog pings
Weblog update pings provide a means for you to notify aggregation and
indexing sites (for example Weblogs.com, Technorati and javablogs.com)
that your weblog has changed so that they will pick up your latest
content from your RSS feed.
Roller supports the conventional XML-RPC weblog update ping mechanism
used by many sites for such notifications.
=== Registering with an Aggregator
Generally speaking, aggregation sites first require you to register your
weblog with their site. During this registration process you normally
provide both the HTTP URL and the RSS feed URL for your weblog. This is
important because the ping message conveys only the normal HTTP URL of
your site, and the site will use that to lookup the registered RSS feed
URL to fetch from.
Aggregation sites that accept ping notifications generally publish the
ping URL to use to ping their site on their (human-readable) web site.
Once you have registered your site with an aggregator, you can set up
your weblog to deliver pings to that site.
=== Ping Targets, Common and Custom
You can set up the Roller server to ping sites of your choice
automatically whenever you post published updates to your weblog.
Roller uses the term *ping target* to refer to a site, such as an
aggregator, that accepts weblog update ping notifications. A ping target
is configured with a (display) name and the ping URL needed to reach the
site. Before you can send a ping to a site, you must configure a ping
target in Roller for the site. Roller comes pre-shipped with multiple
ping targets and the Roller administrator can configure additional ones
as desired.
=== Setting up Automated Pings
Once a ping target has been configured for the site that you wish to
ping, you can use the *Weblog:Pings* page (shown below) to enable
automatic pings and send manual pings.
image::user-guide-23-ping.png[]
To enable automatic pings to a ping target, find the ping target on the
page and click the *Enable* link in the Automatic column. The status
indicator turns to *ON* and the link changes to *Disable* (as shown for
some sites in the screenshot above). To disable automatic pings to a
ping target click the *Disable* link in the Automatic column. The status
indicator turns to *OFF* and the link changes to *Enable*.
When you have enabled automatic pinging for a ping target, Roller will
automatically send a ping to that site whenever you publish a new weblog
entry or update a published weblog entry.
NOTE: In actuality, Roller queues a request to send the ping and
processes this request in the background, so that you can get on with
your blogging. The ping queue is processed at an interval configured by
the site administrator; this interval is 5 minutes in a default
configuration. In case the aggregator site is temporarily unreachable,
Roller will requeue your ping request and retry on subsequent passes
through the queue; in a default configuration the ping is requeued for
up to 3 ping attempts._
=== Sending a Manual Ping
You can also send a manual ping to a ping target using the *Send Ping
Now* link listed for the target on the *Weblog:Pings* page. When you
send a manual ping the ping is not queued, it is sent immediately and
attempted only once. Roller shows you the response status (success or a
failure message) that results from the ping.
You do not need to enable automatic pinging in order to send manual
pings. You can send a manual ping whether or not you have enabled
automatic pinging for that target.
You can use manual pings if you ping a site very rarely, or if you are
feeling a bit impatient, and you don’t want to wait for the next queue
processing interval.
If you don’t find a ping target listed for the site you wish to ping,
you can request that your administrator add a a new one for all blogs to
have available. See Chapter 10 for more information on adding ping
targets.
=== More on Registering with an Aggregator
When you register with an aggregator, you will usually need to provide
two pieces of information as part of the registration, your blog’s base
(HTML) url and your RSS feed (XML) URL. Make sure to read the
aggregator’s documentation and help on registering.
For Roller weblogs, you get your weblog’s base URL by viewing your
weblog and taking the URL to the point just following your weblog’s
handle. (In other words it should end with _page_/_handlenamehere_).
The RSS feed URL for your whole feed can be obtained by substituting
_page_ in your weblog’s URL with _RSS_. Most browsers will display this
link in the status bar when you place your mouse over RSS badge (the
little orange XML box) on your weblog page.
You also have category-specific feeds, which are useful for registering
with topical aggregators like *java.blogs*. To get a category-specific
feed URL, just append _?catname=/categoryname_ substituting _name_ for
the category name. The "basic" theme has some category RSS feeds just
below the RSS badge in the right-hand vertical bar.
Some aggregators can also scrape (read and parse the HTML of your
weblog) to discover the feed URL automatically when provided with the
HTML URL. The default Roller theme template pages include hints in the
form of tags that many sites can use to determine the feed URL
automatically.
== Roller administration
This section of the Roller user guide is for users with the global admin
role. How do you get the admin role? The first user created in a Roller
system gets that role and then can grant it to other users via the
*Global Admin->User Admin* page, which just happens to be the first
topic we’ll cover in the section.
We’ll also describe how to configure Roller via the **Global
Admin->Configuration **page and how to configure Roller’s custom ping
facility via the *Global Admin->Ping Targets* page.
=== Managing users
The *Global Admin->User Admin* page, shown below, allows you to find
users, edit users and create new users.
image::user-guide-24-user-admin.png[]
To find a user, just enter the user’s username in the username in the
the Username field and click the edit button. If you don’t know the
user’s username, then start typing what you think might be the first
letters of her username or email address and the list-box will be
populated with all users whose usernames or email addresses match. When
you see the user you want in the list box, click her and then click the
Edit button to edit her user information.
You can also create a new user by clicking the *create a new user link*.
When a user is loaded into the *Global Admin->User Admin* page, or when
you create a new user, you’ll see the form shown below. You can set the
user’s full name, email address, locale and timezone. You can also reset
the user’s password, if you enter both a password and password
confirmation fields.
image::user-guide-25-user-admin.png[]
You can also disable a user, which will prevent the user from logging
into Roller.
Or you can check the Administrator checkbox to grant grant the user
Global Admin privileges.
At the bottom of the page, there’s a *Users Weblogs* section, which you
can use to edit any of the user’s weblogs. This feature is here to make
it easy for Global Admin’s to help users who are having trouble with any
of Roller’s features, so please use it for that reason only; don’t use
it to invade your user’s privacy.
NOTE: you can disable a user but there is no way to remove a user from
Roller.
=== Configuring Roller
The *Global Admin->Configuration* page allows you to set Roller’s
runtime configuration properties. It is a big page, so we will discuss
each section separately below.
image::user-guide-26-site-setting.png[]
* *Site name*: name of the site, to be included in site-wide newsfeeds
(RSS and Atom) and on the default front page of the Roller.
* *Short name*: short name of the site, to be included as the link in
the banner that appears at the top of every page in the Roller
editor/admin UI.
* *Site description*: description of site, to be included in site-wide
newsfeeds (RSS and Atom) and on the default front page of the site.
* *Site Administrator’s emailConfiguring Roller Address*: admin’s email address, to be
include in side-side newsfeeds (RSS and Atom)
* *Handle of weblog to serve as frontpage blog*: specify the weblog that
is to be displayed as the frontpage of this Roller site.
* *Enable aggregated frontpage feeds*: Set this to true if you would
like the frontpage weblog’s RSS and Atom feeds to be an aggregation of
all weblogs on the Roller site.
* *Absolute URL to this site*: to be used as basis for creating absolute
URLs. Required for Roller’s Planet aggregator feature.
* *Suspend all ping processing*: Allows you to turn off all (outgoing)
weblogs pings for all weblogs in the system.
* *Enable debug mode*: currently not used.
image::user-guide-27-comments.png[]
* *Allow New Users*: Set this to enable the _register as new user_ link
on the main page. If you turnoff user creation, you’ll only be able to
create new users via the *Global Admin->User Admin* page.
* *External registration URL*: Controls the URL of Roller’s "Register
as new users" link. If you use an external system to create Roller
users and blogs, set the URL of that system here.
* Editor pages: this is the list of weblog editors to be provided to
users.
* *Allow weblog comments*: By un-setting this you can turn off weblog
comments on all weblogs in the system.
* *Allow trackbacks*: By un-setting this you can turn off incoming
trackbacks on all weblogs in the system.
* *Autoformat comments*: If this is on, Roller will auto-format comments
by adding in line-breaks where appropriate.
* *Escape comment HTML*: By setting this, you can disallow HTML in
comments and thereby protect your site from malicious JavaScript and
some forms of cross-site scripting.
* *E-mail notification of comments*: set this to enable email
notification of new comments. This won’t work unless you configured
Roller properly for sending email as described in the Roller
installation guide.
* *Enable verification of trackback links*: Trackback verification
checks each incoming trackback to verify that the site sending the
trackback actually links to the specific weblog entry that is the target
of the trackback.
image::user-guide-28-feed.png[]
* *Default number of entries*: default number of entries to appear in
each newsfeed (RSS and Atom).
* *Maximum number of entries*: maximum number of entries to be allowed
in each newsfeed (RSS and Atom).
* *Display styled newsfeeds for browsers*: Set to true to enable
user-friendly RSS and Atom feed display, so that users don’t see raw XML
when they load the feed in their browsers.
image::user-guide-29-fileupload.png[]
* *Enable File Uploads*: Are users allowed to upload files?
* *Allowed Extensions*: Comma-separated list of file extensions that
users are allowed to upload.
* *Forbidden Extensions*: Comma-separated list of file extensions that
users are NOT allowed to upload.
* *Max File Size (MB)*: Maximum size of file that users are allowed to
upload.
* *Max Directory Size (MB)*: Total upload directory size per user.
The We Analytics section allows you to provide a JavaScript snippet if
you wish to activate Google Analytics or other tracking services. The
value you place here will hold for all blogs, unless you enable the
individual blog overriding option in this section; in the latter case
the default key will be used only for blogs which don’t have their own
defined. Note that even if individual overrides are disallowed bloggers
can still place their own tracking code within their blog templates if
you enable custom themes (in the "Theme Settings" section on this
configuration page.)
== Weblog update ping administration
This section, intended for Roller administrators, describes how the
Roller weblog update ping feature works and how to configure and
administer it.
=== Creating and editing common ping targets
Common ping targets are ping targets that are shared by all users. You
can create and edit common ping targets using the *Global Admin->Ping
Targets* page.
image::user-guide-30-ping.png[]
You can create and edit common ping in the same way that regular users
create and edit custom ping targets, but keep in mind that common ping
targets are shared amongst all users, and that your changes affect all
users using the ping target. Administrators should make sure to test new
common ping targets after creating them.
Before adding a ping target, the administrator must determine the proper
ping URL for the site that you wish to ping. This information can be
obtained from the aggregator’s web site or from another knowledgeable
source.
It can be hard to find the aggregator’s documentation for the specific
ping URL to use to notify their site. Commonly aggregators list this on
their web site under a topic providing help about registering your feed,
or under a topic providing information for developers. Keep in mind that
some aggregators only use periodic polling and do not accept ping
notifications at all. If you can’t find any information about pinging on
the aggregator’s web site, the site may not support pinging.
Click the *Add New* button to add a new ping target. This will bring up
a form with a *Name* field and a *Ping URL* field. Fill in both fields,
and click the *Save* button.
image::user-guide-31-add-ping.png[]
Once the new ping target has been created, it will be listed for all
blogs on their *Weblog:Pings* page with the default activation status
defined by the administrator. From this page, individual users can
override the ping target’s enable status for their own blog as well as
send manual pings to the new target.
=== How Roller Processes Weblog Update Pings
Roller processes weblog update pings in the background. When a user
updates his or her weblog, Roller automatically queues any required
automated pings on a queue. Roller only keeps one ping queue entry for a
given user weblog and ping target. Subsequent updates to a weblog
occurring before the ping is processed will not cause additional pings
to be queued.
Roller makes a full pass through the ping queue at regular intervals.
(Configuration of this interval is discussed below) In each pass, Roller
will attempt to send every queued ping request once. If any send fails
(and provided the failure appears to be a transient one), the ping
request will be re-queued, until the ping succeeds or a configured
number of attempts has been made. Note that when a ping request fails
and is re-queued, it is processed again only on subsequent ping passes.
If the number of attempts to reach a given ping target reaches the
maximum without succeeding, then an error message is logged and the ping
request is dropped.
There is currently no mechanism for alerting users of failing ping
targets (though we plan some improvements in subsequent releases to
provide condition information on the weblog *Preferences->Pings* page,
as well as a failure policy to deactivate persistently failing ping
targets).
=== Configuration Properties Controlling Ping Processing
These properties control processing of the ping queue. They are
configured in the __roller.properties __file.
**pings.queueProcessingIntervalMins **The interval in minutes between
ping queue processing runs. This must be a value in the range 0 to 120.
The default value is 5 minutes. We think the default value should work
for most sites, and is tolerable for most users. The number of users
publishing or updating entries in a given interval determines the length
of the queue, and Roller requires enough time in an interval to process
the queue once. We think that for all but the largest and most active
sites, it can probably be lowered as low as 1 minute if desired.
*IMPORTANT*: The value 0 (zero) has a special meaning. If the processing
interval is set to 0, ping queue processing is disabled on the server.
This can be used to exclude all but one host from sending pings in a
clustered environment where multiple Roller servers are sharing one
database schema. *Make sure to retain one host in the cluster that does
process the ping queue!* If multiple hosts in a cluster process the ping
queue, you may send duplicate pings and failing ping requests may drop
out of the queue sooner than the expected maximum (configured by the
next parameter). If no hosts in a cluster process the ping queue, auto
ping requests will accumulate in the queue and this will eventually
cause the database to run out of space, so don’t try to use this as a
way to disable ping features. You can use the properties described in
the following sections to disable ping features.
**pings.maxPingAttempts **The maximum number of ping attempts made
before the ping request will no longer be requeued and will instead be
dropped from the queue. The default value is 3. We think this value is
fine for most sites.
=== Suspending all ping processing
Administrators can suspend all ping processing at runtime by checking
the *Suspend ping processing?* checkbox under the *Site Settings*
heading on the *Global Admin->Configuration* page and saving that form.
When this checkbox is set, all ping processing is suspended. New
automatic ping requests are not added to the queue, and existing entries
on the queue are not processed. Manual pings are not sent either; they
result in a message telling the user that ping processing has been
suspended. Suspending ping processing is appropriate to temporarily stop
all ping processing if problems are encountered.
Unchecking the checkbox and saving allows normal ping processing to
resume. Note, however, that autopings for weblogs that are updated while
ping processing is suspended will never be queued and hence never sent,
but pings queued before the suspension are sent once the suspension is
lifted.
=== Controlling and disabling ping usage
Since use of a ping target causes an outbound network connection to the
ping site, some administrators may not want to allow users to create
their own custom ping targets. It is possible to enable or disable the
use of custom ping targets across the whole site and also to disable all
ping usage. The following two properties are used to control this.
**pings.disallowCustomTargets. **This property controls whether users
are allowed to create custom ping targets. If set to true, all existing
custom ping targets are _removed_, and the *Weblog:Custom Ping Targets*
page and the associated actions are disabled preventing any
configuration of custom ping targets. *Note:* __Setting this to true
this will cause the Roller server to __remove _any custom ping targets
that users have created when Roller is next started._
Administrators may also wish to disable ping functionality entirely. The
following property, used in conjunction with the above property, can be
used to do this.
**pings.disablePingUsage. **This property controls whether users are
allowed to set up automatic pings or send manual pings. If set to true,
all existing autoping configurations are removed (i.e. disabled), the
weblog *Preferences->Pings* page and associated actions are disabled,
preventing any use of the ping features by regular users. *Note:*
__Setting this to true will cause the Roller server to __remove _any
autopings that users have configured when Roller is next started._
If both of the above properties are set to true, all ping functionality
is effectively disabled for regular users. The *Global Admin:Ping
Targets* page is still accessible (to administrators); you can use that
page to clear out any common targets if you wish. No user (including
administrators) will be able to configure automatic pings or send pings.
Ping queue processing continues but the queue will always be empty; you
can safely disable ping queue processing (by setting the processing
interval to zero) in this situation.
=== Initialization of common ping targets
The initial set of common ping targets is determined by the following
configuration property.
**pings.initialCommonTargets. **This value is used to initialize the set
of common ping targets. The value consists of a comma-separated list of
ping targets, where each ping target is specified in the form
{{name}{url}}
This value is used every time Roller starts _and finds an empty list of
common ping targets._ Normally, this is only the first time Roller is
started on a fresh or upgraded database; note, however, that if you
really want to maintain an empty list of common ping targets, you will
need to comment out this value or set it to an empty string.
== Weblog Export
Roller includes an optional weblog export feature that allows you to
export your weblog entries and uploaded Media Files to a format that is
compatible with both Wordpress and MovableType. You can use the *Create
& Edit -> Export* menu to do this. When you click one of the Export
buttons, you will be prompted to download the resulting file.
*Enabling Weblog Export*
Export is an optional feature that is disabled by default.
If you do not see it in Roller, as your Roller admin to enable it by
setting the _weblog.export.enabled_ property to _true_ in the
**roller-custom.properties **file.
== Planet Roller administration
Roller includes an aggregator known as Planet Roller, which makes it
possible for you to aggregate together weblogs from a Roller server with
weblogs that are hosted elsewhere. You can create multiple aggregation
groups each with its own set of feeds, you can display aggregation
groups on your weblog pages and Roller provides an RSS feed for each
group you create.
Roller’s aggregator is not enabled by default. If you want to use it,
you’ll have to ask your site administrator to enable and configure it
for you. Please refer to the Roller Installation Guide for more
information on that topic.
=== Configuring Planet Roller
If you’ve got Planet enabled, when you login as a global admin you’ll
see a Planet Administration link on the Roller Main Menu page. Click
that link to view the *Planet Admin->Configuration* page, shown below.
image::user-guide-32-planet-config.png[]
To configure Planet Roller, you must:
* Ensure that your site has an absolute URL in the *Global
Admin->Configuration* page in the Site Settings section.
* If you are behind a proxy, you must enter proxy settings in the
*Planet Admin->Configuration* page.
=== Adding external weblogs to Planet Roller
Planet Roller allows you to create multiple aggregation groups each
containing a different set of feeds, but there is also a special group
known the _external_ group that is managed by Roller. The external group
includes all weblogs on your Roller server plus any externally hosted
weblogs you choose to add. The RSS feed for the external group is
available at /planetrss, so on a default Roller install its URL will be:
http://localhost:8080/roller/planetrss
This section describes how to add and remove weblogs using the *Planet
Admin->Subscriptions* page, shown below.
image::user-guide-33-subscription.png[]
*Adding an external weblog to Planet Roller*
To add an externally hosted weblog to the Planet, use the *Planet
Admin->Subscriptions* page. Enter its title, newsfeed URL and website
URL and click the Save button.
NOTE: Planet Roller only supports Atom and RSS newsfeeds that include
entry level date information. If you enter a subscription that does not
include dates, Planet Roller will accept it, but you may not see entries
from the feed because Roller will assume that its entries are at least
one day old.
Removing an external weblog from Planet Roller
You can select an existing subscription and edit it or delete it. The
change will not be evident on the front page until the next scheduled
Refresh Entries task runs.
=== Adding custom groups to Planet Roller
You can also add custom aggregation groups and Planet Roller will
provide an RSS newsfeed for each group you add. For example, if you add
groups with the handles _music_ and _politics_, then you’ll get two
feeds at URLs like this:
http://localhost:8080/roller/planetrss?group=music
http://localhost:8080/roller/planetrss?group=politics
To add new custom groups just use the *Planet Admin->Custom Groups*
page, shown below.
To create a custom group
Go to the *Planet Admin->Custom Groups* page and enter the title and
enter a title for the group, one that is appropriate for display in the
group’s RSS feed. Enter a handle a one word name for the group, which
you’ll use to refer to the group in your page templates. When you’re
done click the Save button
You’ll see your new group appear in the Existing Custom Aggregation
Groups table. Click on the Subscriptions icons for your new group and
you’ll be taken to the *Planet Admin->Subscriptions* page so you can add
feed subscriptions to the group.
Enter the title, newsfeed URL and website URL for the feed you’d like to
add and click the Save button to add it to the feeds list. Repeat once
for each subscription you’d like to add to the group.
\ No newline at end of file
= 安装指南
Apache Roller Weblogger
:TOC:
:部门:
:imagesdir: ./images
== 概述
本文描述了如何安装 Apache Roller WebLoggerSoftware。它解释了首先需要安装什么,如何下载 roller,如何配置 Roller ,以及如何将其安装到当前的 Java 应用程序服务器和关系数据库中。
=== 版权和商标信息
本文件的内容以 ApacheSoftware 许可证的条款为准。
本文档中的所有商标都属于合法所有者。
=== 反馈
请将有关此文档的任何意见或建议直接发送到 Theroller 用户邮件列表。有关 Roller 邮件列表的更多信息,请参阅以下页面:
Roller 邮件列表-https://cwiki.apache.org/confluence/x/zyk[_https://cwiki.apache.org/confluence/x/zyk_]
=== 鸣谢
这份文件的原始版本是由戴夫 · 约翰逊写的。该文档目前由 Apache 软件基金会的 Apache Roller 项目编写和更新。
== 保护 Roller
在设置任何网站时,安全性都应该放在首位,即使是在私有网络上并且是组织内部的网站也是如此。以下是一些保持安装安全的建议:
* 在安全的网络上执行安装。在安装时,其他用户可能会干扰你的安装。如果其他用户有访问服务器的权限,其中一个用户可以在你这样做之前创建管理帐户。因此,当你安装 Roller 时,请在其他人无法访问的服务器上进行安装。
* 不允许新用户的开放注册。 Roller 可以提供 Aregistration 链接,以便新用户可以注册自己,但此功能已关闭,因为仅允许任何人在你的博客服务器上注册帐户是不安全的。如果你想打开它,可以作为管理用户登录,转到 Roller 的服务器管理页面,并启用“允许新用户”选项。
* 启用 HTML 杀毒功能。如果你不能信任将使用你的 Roller 站点来编写 HTML 的 Weblogger,那么你应该配置 Roller 来清除系统发布的所有 HTML。通过在 _Roller -custom.properties _file 中设置 weblogAdminsuntrusted=true 属性来实现这一点。
* 不允许在注释中使用 HTML。 Roller 可以允许用户在 HTML 的安全子集中写注释,但是在注释中使用 HTML 是根本不允许的,因为即使是如此称为安全子集的 HTML 也存在安全问题。如果你想打开它,请以管理用户身份登录,进入 Roller 的服务器管理页面,启用“允许 HTML 在注释中”选项,并确保选中了 HTML 子 setrestriction 框。
* 在 SSL 连接上运行 Roller 。如果你通过普通的 OldHTTP 连接运行,那么其他人在你登录时可能会监听你的密码,例如通过开放的 WiFi 网络。要配置 Roller 在 SSL 上工作(即使用 https://urls),首先修改位于 Roller WAR(WEB-INF 文件夹)中的 web.xmlfolder,取消注释
<security-constraint/> 元素,并遵循其中给出的指令
在那个元素之上的那个文件。接下来,请按照 Servlet容器的文档设置 SSL(例如,为 Tomcat,http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html)。)然后重新部署 Roller ,并确认仅通过 https://urls 提供包含安全数据的页面(例如登录页面和新用户注册页面)。
== 准备好了吗?
首先,让我们确保你有一切你需要安装和运行。
Roller 是一种数据库驱动的 Java Web 应用程序。要运行它,你需要 Java、Java Servlet容器(如 Tomcat)、与 AdataBase(如 MySQL)的连接,以及可选的与邮件服务器的连接。更重要的是,以下是你需要安装和运行的内容 Roller :
* Java 开发工具包,特别是 Java2SE1.6JDK 或更近期的。安装 Roller 的计算机应该已经安装并配置了 JDK。
* Java EE6Application Server,或者更具体地说,是至少支持 Servlet2.4API 的 ServletContainer。下面,我们就把它称为你的服务器。 Roller 传统上只在 Tomcat 和 Tomcat 上工作得最好,但是 Roller 6.0.0 已知运行在:
** Tomcat8
** 9 号码头
* 关系数据库,如 MySQL 或 Apache Derby。 Roller StoresBlog 条目、评论、书签和几乎所有其他通过 Java 持久性 API2.0 访问的数据库中的数据。PostgresSQL、MySQL 和 Derby 是最好的支持,但是 Roller 。 Roller 还包括用于 DB2、HSQL-DB、Microsoft SQLServer 和 Oracle 的数据库创建脚本,但这些脚本最近尚未进行过测试。
* (可选的)SMTP 邮件服务器。 Roller 可以通过 JavaMail 和激活 API 发送电子邮件通知以获取评论和其他事件。
* Roller 安装文件。 Roller 安装文件包含 Theroller WAR 文件(已准备好部署到你的服务器),以及 Roller LicenseFiles、README 和文档。使用基于操作系统支持的压缩方法的任意一个文件解包:
** Roller -Release-6.0.0-Standard。拉链
** Roller -release-6.0.0-standard.tar。GZ
这一步骤也可以在部署之后完成,并确定除了缺省可用的主题外,还需要修改 WAR 并在 servlet 上重新部署容器。
* (可选)额外的博客主题。 Roller 预先打包了几个博客主题(模板)供你选择,并可选择为你创建的每个博客进行定制。你可能希望在 Roller WAR 文件中添加额外的主题,以便在部署应用程序时可以从它们中进行选择。要做到这一点,只需打开 Roller WARD,并将主题添加到位于 WARE 顶层的“Themes”文件夹中。Google<Apache Roller Themes> 和 / 或检查 roller wiki 页面的 non-apacheresources 部分(https://cwiki.apache.org/confluence/display/roller/roller/roller+wiki)以获取任何外部可用的主题—但是,Theroller 团队不支持外部主题。
== 下载和解包滚筒
从 http://roller.apache.org/[http://roller.apache.org]下载 ApacheRoller 发布文件。如果你是一名视窗管理员,请下载。ZIP 文件,并使用你最喜欢的 ZIP 程序将释放解压缩到计算机磁盘上的一个目录中。unix 用户可以直接加载。gz 文件,并使用 GNUtar 来解包。
=== 安装目录布局
一旦你把这些文件解包了,你就会发现一个类似的目录结构:
----
readme.txt
license.txt
notice.txt
文档 /
滚筒-安装-guide.pdf
roller-user-guide.pdf
滚筒-模板-guide.pdf
WebApp/
Roller.War---
license.txt 和 notice.txt 文件包含 Apache SoftwareLicense 和其他与发布相关的法律通知。txtfile 只指向 docs 目录中的文档。
https://cwiki.apache.org/confluence/display/ROLLER/Roller+Wiki
== 为滚筒准备你的数据库
在安装 Roller 之前,你可能需要做一些准备数据库的工作。你需要创建一个放置轮滑的位置;有些人将其称为表空间,我们在本安装指南中将其称为数据库。你需要为 Roller 创建一个数据库,或者让你的数据库管理员为你创建一个数据库。你还需要为你所选择的数据库提供一个 JDBC 驱动程序,但是我们将在后面讨论这个问题。
=== 为 Roller 创建一个数据库
如果你足够幸运,有自己的数据库管理员,请他们为 Roller 设置一个数据库。完成后,请他们向你提供这些信息,你以后就会需要这些信息:
* 连接到数据库的用户名和密码
* 数据库的 JDBC 连接 URL
* JDBC 驱动程序类名称
如果你没有数据库管理员,那么你就必须参考数据库的文档,然后自己动手做。你需要为 Roller 创建一个由用户名和密码保护的数据库。例如,如果你正在使用 MySQL,你可能会这样做(一定要使用与下面的 Scott/Tiger 不同的用户名和密码):
----
%sudo 服务 MySQL 启动
%mysql-u root-p
密码:*
mysql> 创建数据库 rollerdb 默认字符集 utf8defaultcollate utf8_general_ci;
grant all on RollerDB.* 给“老虎”识别的“%”;
grant all on RollerDB.* 给 Scott@localhost,由 `Tiger’识别;
mysql> 退出;
----
如果你正在使用 Derby:
----
%ij
ij> 连接 `jdbc:derby:/path/to/new/myrollerdb;create=true’;
ij>quit;
----
对于 PostgreSQL:
----
%sudo-u postgres psql postgres
postgres=# 创建用户 Scott CreateDB;
postgres=#\du(请参阅用户和角色列表)
postgres=#\password 斯科特
输入新密码:????
Postgres-#\q
%createdb-h localhost-u scott-w pgsqlroller-e utf8
----
=== MySQL 和 Oracle 的考虑因素
根据我们支持 MySQL 的经验,我们有以下建议:
* 对于 MySQL,请确保启用了 TCP/IP 网络。
* 对于 MySQL,必须为你的数据库启用 UTF-8,就像上面的“create database rollerdb”命令或服务器范围内所做的那样(http://dev.mysql.com/doc/refman/5.6/en/charset-applications.html)。
+
如果已经创建了非 UTF8 数据库,则可以按如下方式将数据库切换到 UTF-8,前提是还没有创建表:
+
----
ALTER 数据库 Roller 缺省字符集 UTF8COLLATEUTF8_GENERAL_CI;
----
* 对于 Oracle 用户,使用 10G(10.1.0.2 更高)驱动程序,这些驱动程序应该打包为 ojdbc14.jar,即使在 Oracle9 服务器上运行也是如此。
* 有关将 JDBC 驱动程序 JAR 放置在何处的信息,请参阅服务器特定部分。
== 部署 Roller 到 Tomcat
将 Roller 部署到 Tomcat Servlet容器需要创建 Aroller 配置文件,向 Tomcat 添加一些 JAR,然后部署 Roller WAR 文件。
在尝试安装 Roller 之前,你需要安装和配置 Apache Tomcat,并了解如何在 Tomcat 上部署 WAR 归档。参考此页面链接的 Tomcat文档Formore 信息:http://tomcat.apache.org/[_http://tomcat.apache.org_]
=== Tomcat:创建 Roller 配置文件
配置 Roller 和 Tomcat 有多种方法,在此我们将解释最简单的途径:通过 Roller 配置文件直接向 Roller 提供数据库和邮件连接信息。
创建配置文件
对于大多数设置, Roller 可以从自己的 Web 控制台进行配置。但是对于某些启动属性和高级配置选项,你必须在一个名为:
roller-custom.properties
这是一个简单的 Java 属性文件,一个覆盖 Roller 内部 Roller 中定义的设置的文本文件。属性文件。要配置 Roller ,你需要查看 Roller 的内部属性文件,确定需要覆盖哪些属性,然后在 _roller-custom.properties_file 中设置这些属性。
精确的 Roller 。你的发行版使用的属性文件位于 theroller.war 文件中的 /WEB-INF/classes/org/apache/ Roller /weblogger/config/。它也可以通过以下方式在线查看://svn.apache.org/viewvc/ Roller /trunk/app/src/main/resources/org/apache/ Roller /weblogger/config/ Roller .properties,在你正在使用的 RollerRelease 发布之前的修订版中单击“(查看)”按钮。我们鼓励你查看这个文件,以确定你可能希望重写的其他属性,但是我们现在就从这里开始,通过一个简单的示例,向你展示你需要运行的最小启动、数据库和邮件配置设置 Roller 。你需要使用适合你的文件系统、数据库和邮件服务器的设置来更改这些信息。(还请注意,如果你使用 JNDI,下面所示的数据库和邮件配置将有所不同,这将在下一节中讨论。如果你的邮件 SMTP 服务器需要进行身份验证,那么目前尤其需要 JNDI。
示例: Roller -custom.properties 文件
----
安装.type=auto
mediaFiles.storage.dir=/usr/local/rollerdata/mediaFiles
search.index.dir=/usr/local/rollerdata/searchindex
Log4J.Appender。 Roller .file=/usr/local/rollerdata/ Roller 。日志
database.configrationType=jdbc
database.jdbc.driverclass=com.mysql.jdbc.driver
jdbc.connectionurl=jdbc:mysql://localhost:3306/rollerdb?autoreconnect=true&useunicode=true&characterencoding=utf-8&mysqlencoding=utf8
database.jdbc.username=scott
database.jdbc.password=tiger
mail.configrationType=properties
mail.hostname=smtp-server.example.com
mail.username=scott
mail.password=tiger
----
type=auto 属性告诉 Roller 在非自动安装模式下进行操作。在这种模式下 Roller 将提供非常详细的错误输出,以帮助你调试数据库连接问题。ifroller 发现数据库存在,但其表不存在,它将运行数据库创建脚本。如果 FIND 发现这些表在那里,但它们不是最新的 Roller 将为你提供 ToupGrade 它们。一旦你的 Roller 安装完成,并且你已经准备好开始“运行”,那么你应该设置安装。type=manual。
上面的示例 Roller -custom.properties 使用了一个 MySQL 连接。它显示了 MySQL JDBC 驱动程序类名、一个示例 MySQL ConnectionURL 和用于邮件连接的用户名 / 密码设置:
如果你正在使用 Derby,那么数据库配置 Propertiessimilar 将更适合于下面的内容。注意,默认情况下,Derby 不使用身份验证(以下提供的任何用户名和密码都将被接受),在 Howto 上,Seehttp://db.apache.org/derby/文档/10.2/tuning/rtunproper27467.html 需要使用 Derby 进行身份验证。下面配置的用户名将是 Roller 安装过程在创建数据库表时使用的表所有者。
----
database.configrationType=jdbc
database.jdbc.driverclass=org.apache.derby.jdbc.embeddeddriver
database.jdbc.connectionurl=jdbc:derby:/path/to/new/myrollerdb
database.jdbc.username=app
database.jdbc.password=app
----
对于 PostgreSQL:
----
database.configrationType=jdbc
database.jdbc.driverclass=org.postgresql.driver
jdbc.connectionurl=jdbc:postgreSQL://localhost:5432/pgsqlroller
database.jdbc.username=scott
database.jdbc.password=tiger
----
可选的身份验证选项
上述指令依赖于 Roller 的默认用户身份验证机制,即使用 Roller 提供的数据库表来存储用户名和加密的密码。 Roller 提供了在 Roller 中的“身份验证.方法”设置下定义的其他身份验证选项。属性文件:OpenID、OpenID/DB 组合和 LDAP(https://cwiki.apache.org/confluence/display/ Roller / Roller +5.1+with+LDAP)。这些身份验证方法的使用频率较低,因此如果你希望使用它们,应该对你的特定设置进行更彻底的测试。检查 Roller 。WAR 中包含的属性文件提供了可用的选项和配置信息,如果需要帮助,请参阅 RollerUser 的邮件列表。
将配置文件添加到 Tomcat
将配置文件放置到 Tomcat lib 目录中,以便它与 Tomcat 类路径一致,因此 Roller 可用。
=== 使用服务器提供的数据库和邮件资源(可选)
使用 `jdbc' approach and the mail connection using ` 属性为 Tomcat 数据库连接设置 Roller 是最简单的,但在某些情况下,你可能希望使用应用程序服务器提供的数据源和 / 或邮件资源。对于像谷歌的 Gmail 服务那样需要认证的邮件连接,目前需要 JNDI。对于数据库,你可以使用 JNDI 来利用构建在服务器中的数据库连接池管理。或者,你的老板可能希望一切都通过服务器的管理控制台来管理。无论出于什么原因,在 Roller 中都很容易做到。
在这里,你省略了上一节中给出的 Roller -custom.properties 数据库和 mailconfiguration,并将其替换为:
----
type=automediaFiles.storage.dir=/usr/local/rollerdata/mediaFilessearch.index.dir=/usr/local/rollerdata/searchindexlog4j.appender。 Roller .file=/usr/local/rollerdata/ Roller 。日志
configrationType=jndidatabase.jndi.name=jdbc/rollerdbmail.configurationType=jndimail.jndi.name=mail/session
----
database.configurationType=JNDI 设置告诉 Roller 通过 Java 命名和目录接口查找其数据源。Roller 将寻找一个名为 JDBC/RollerDB 的 JNDI 数据源。你必须在服务器中设置该数据源。
mail.configurationType=JNDI 设置告诉 Roller 通过 JNDI 查找它的邮件会话。 Roller 将查找带有 JNDI 名称 mail/session 的邮件会话。你必须在你的服务器中设置该提供程序。让我们讨论一下如何在 Tomcat 上做到这一点。
在 Tomcat 上设置数据库和邮件资源
在 Tomcat 上有两种不同的设置数据库和邮件资源的方法。一种方法是提供一个上下文配置文件,下面是如何在 Tomcat 上实现这一点的方法。
在将 Roller 部署到 Tomcat 之前,在安装目录 webapp/ Roller /meta-inf 中创建一个新的上下文配置文件。你将在那里找到示例配置文件,如下所示。从 context 重命名它。xml-example_to context.xml,并在“jdbc/rollerdb”资源中替换 driverclassname、url、username、password,在“mail/session”资源中替换 mail.smtp.userpassword 的正确值。
----
< 上下文 path=“/roller” debug="0">
<resource name=“jdbc/rollerdb”auth=“container”type=“javax.sql.datasource”
driverclassname=“com.mysql.jdbc.driver”
url=“jdbc:mysql://localhost:3306/rollerdb?autoreconnect=true&useunicode=true&characterencoding=utf-8&mysqlencoding=utf8”
username=“Scott”
password=“tiger”
maxactive=“20”maxidle=“3”removeburdived=“true”maxwait=“3000”/>
<resource name=“mail/session”auth=“container”type=“javax.mail.session”
mail.transport.protocol=“smtp”
mail.smtp.host=“smtp.gmail.com”
mail.smtp.port=“465”
mail.smtp.auth=“true”
mail.smtp.user=“blah.blah@gmail.com”
password=“yourgmailpassword”
mail.smtp.starttls.enable=“true”
class="javax.net。SSL.SSLSocketFactory"
mail.smtp.socketFactory.port=“465”
mail.smtp.socketFactory.fallback=“false”
mail.debug=“false”/></context>
----
上面列出的 Java 邮件属性在这里定义:https://javamail.java .NET /nonav/文档/api/com/sun/mail/smtp/package-summary.html。请注意,上面定义的电子邮件帐户将出现在发送给博客所有者(以及,如果他们选择“通知我的进一步评论”,博客评论者)的“从:”线通知电子邮件消息中,因此请小心不要使用你希望保持隐私的电子邮件帐户。
另一种方法是将配置添加到 tomcat server.xmlfile 文件中已经存在的正确主机值下。(Tomcat 项目建议不要使用此方法,因为每当对此文件进行更改时,它都需要重新启动服务器,见 http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#defining_a_context。)例如,使用与上述相同的邮件连接:
----
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context
path="/roller"
docbase=“roller”
antisourcelocking=“false”>
< 资源名称 =“mail/session”
auth=“容器”
type=“javax.mail.session”
mail.transport.protocol=“smtp”
mail.smtp.host=“smtp.gmail.com”
…其他属性同上…
/>
</Context></Host>
----
=== Tomcat:添加 JDBC 驱动程序和 JavaMail API 文件
你还需要在 Tomcat libdirectory 中放置一些额外的 JAR:
* JDBC 驱动程序 jars。将适当的 JDBC 驱动程序 JAR 添加到 Tomcat 类路径。一旦它们进入了你的类路径, Roller 的 DatabaseSubsystem 将能够找到并使用它们。从你的数据库供应商 / 提供者那里下载它们,并将它们放在 Tomcat 的 lib 目录中。
* Java 邮件和激活。Tomcat 不包括 Java Mailand Activation JAR。即使你不打算使用电子邮件功能,你也必须下载这些罐子,并将其放在 Tomcat 的类路径中。从 Oracle(https://java .NET / Projects /javamail/pages/home)下载它们,并将它们放在 Tomcat 的 lib 目录中。
=== Tomcat:设置 URI 编码
Roller 支持国际化(i18n),但是在 Tomcat 上需要一些额外的配置。你必须确保 Tomcat 的 URIEncoding 设置为 UTF-8。你可以通过编辑 TomcatConfiguration 文件 conf/server.xml 并向每个连接器元素添加 uriencoding=“utf-8”来实现这一点,如下所示:
----
<connector port=“8080”maxthreads=“150”minsparethreads=“25”
maxSpareThreads=“75”enableLookups=“false”redirectport=“8443”debug=“0”acceptCount=“100”connectiontimeout=“20000”disableuploadtimeout=“true”uriencoding=“utf-8”/>
----
并确保你对每一个通过它的连接器都执行此操作。例如,如果你使用 AJP 连接器或 HTTPS 连接器,那么你还需要将 uriencoding=“UTF-8”属性添加到这些连接器中。
=== Tomcat:部署 Roller
有关部署战争的各种方式的信息,请参阅 Tomcat文档。通过将 Roller 战争改名为 Roller 。WAR 并将其放入正在运行的 Tomcat 实例的 WebApps 目录中,你应该能够访问 http://localhost:8080/ Roller 上的 Roller (该 / Roller 分词来自 WAR 的名称)。)实现此目的的另一种方法是使用 Tomcat Manager 应用程序,你可以通过以下网址访问该应用程序 http://localhost:8080/Manager。一旦你到了那里,你就会看到这样的东西:
image::roller-install-guide-tomcat.png[]
在上面的 Manager 屏幕上,向下滚动直到看到 DeploySection,如下所示:
image::roller-install-guide-tomcat-deploy.png[]
在 Weuse/ Roller 上方输入你希望看到 Roller 的上下文路径。在 Roller 安装的 webapps 目录中输入 Roller WAR 文件的完整路径,然后单击 DeployToDeploye Roller 。
最后,导航到 http://localhost:8080/ Roller 以完成安装。
== 开始使用 Roller
你还没有完全完成安装过程,但是现在你已经准备好开始使用 Roller 了,所以我们将引导你开始安装、注册用户和建立博客。我们还将简要讨论当出现错误时会发生什么。
=== 导航到 Roller 并完成安装
导航到 Roller ,如果你使用的是默认的 Tomcat 或 GlassFishInstallation,那么 Roller 的 URL 可能是 http://localhost:8080/ Roller 。你将看到一个包含 ErrorMessages 的网页,一个提供为你创建数据库表的网页,或者一个要求你通过注册一个管理用户并创建一个首页博客来完成安装的网页。首先,让我们来谈谈当事情出错时会发生什么。
image::db-connection-error.png[]
如果你的数据库配置有问题, Roller 将显示一个页面或错误消息,以帮助你诊断问题。你可能输入了错误的 JDBC 驱动程序类名、连接 URL、用户名或密码。或者你的数据库没有运行。使用所提供的信息来确定问题所在,修复它并重新部署 Roller 。
自动创建表
如果你的数据库配置很好,但是 Roller 找不到它的数据库表,那么 Roller 将提供自动为你创建这些页面。如果你允许, Roller 将为你的数据库运行适当的数据库创建脚本,然后向你显示结果。然后,你可以继续进行下一步来设置你的 FirstUser 帐户和 Weblog。
image::no-tables-found.png[]
=== 注册用户并创建一个网络日志
如果 Roller 启动良好,但没有找到一个首页网页,那么它将显示以下完整的安装,说明如何注册你的第一个用户,创建你的第一个博客,并设置你的网站的首页。
image::roller-home.png[]
你必须决定你想要什么作为你的 Roller 网站的首页。如果你正在使用 Roller 运行你的个人网站日志,那么你可能希望你的网站日志成为网站的首页。在这种情况下,CreateaWeblog 自己,不要选择首页主题,而是设置你的网站作为该网站的首页。
如果你使用 Roller 来运行一个由多个博客组成的社区,那么你可能会希望显示一个聚合的首页,该首页将网站上的所有博客合并在一起。在这种情况下,创建一个 Weblog 作为首页,将其设置为首页,并确保你在服务器管理页面上设置了“聚合首页”设置。
别忘了:重置安装。键入标志
现在你已经完成了安装,你应该关闭 Roller 的自动安装系统。编辑你的 Roller -custom.properties 文件并设置安装.type=manual。然后重新启动你的服务器或 Roller ,使其接受新设置。
下一步是什么?
一旦你得到了 Roller 并开始运行,请参考 Roller 用户指南,以获得关于运行你的 Roller 系统和你的网络日志的更多信息。有关自定义博客的信息,请参阅 Roller TemplateGuide。如果你在文档中找不到你想要的内容,那么请订阅 Roller 用户邮件列表,并在该列表中提出你的问题:
https://cwiki.apache.org/confluence/display/ROLLER/Roller+Mailing+Lists
== 配置技巧和窍门
本节介绍了一些技巧和窍门,可以帮助你了解 Roller 中最重要的部分。它涵盖了 Roller 的 Planet Feed 聚合器,以及如何设置 Roller 来使用服务器提供的资源。
=== 设置 Roller 的 Planet Feed 聚合器
Roller 包括一个 RSS/Atom 提要聚合器,该聚合器使得能够运行类似于 https://blogs.oracle.com/ 的站点,该站点提供了数千名作者的博客,以及一个聚合的首页,该聚合的首页显示了来自这些作者以及来自其他网站(例如 blogger.com、typepad.com 和其他服务)的数十名 Sun 博客作者的最新帖子。下面是你需要做的。
==== 步骤 1:创建一个 Planet 缓存目录
Roller Planet 需要一个缓存目录来存储它所获取的提要。默认情况下, Roller Planet 将把它的缓存放在你的 homeDirectory 中的 RollerData/PlanetCache_ 下。如果你想要将 TheCache 放置在其他地方,则必须在 Roller -custom.properties 文件中覆盖 planet.aggregator.cache.dirproperty。例如:
`cache.dir=c:\\roller_data\planetcache`
无论是否覆盖该属性,都必须创建 cacheDirectory。Planet 将不会工作,除非缓存目录存在并且在 Roller 之前是可写的.
==== 步骤 2:通过 Roller 自定义属性启用 Planet
通过在 Roller -custom.propertiesFile 中添加以下内容来启用 Planet:
----
planet.aggregator.enabled=true
# 已启用的任务。只运行这里列出的任务。tasks.enabled=scheduledentriestask,resethitCountstask,\pingqueuetask,refreshrollerplanettask,syncwebsitestask
# 一组页面模型,专门用于站点范围的渲染.sitemodels=\org.apache。 Roller .weblogger.ui.rendering.model.sitemodel,\org.apache。 Roller .weblogger.ui.rendering.model.planetmodel
----
这些属性设置支持 Planet 和 Planet 任务,其中包括每小时运行一次并获取 AllRSS/Atom Feed 订阅的 RefreshrollerPlanettask,以及每天午夜运行的 SyncWebSiteStask,它确保 Roller 系统中的每个 Weblog 都由 Planet 聚合器中的订阅表示。为了在首页 Weblog 中启用 PlanetModel 的用法,我们还覆盖了 _rendering。sitemodels_property。
==== 第 3 步:通过 Planet 自定义属性配置 Planet
创建一个名为 planet-custom.properties 的新文件,并将其放置在相同的目录中,作为你现有的 Roller -custom.properties 文件。在这个配置文件中,添加一个名为 cache.dir 的属性,它指向你希望 Planet 用来缓存它的 RSS 和 Datom 新闻源的目录。默认设置为:
`_cache.dir=${user.home}/roller_data/planetcache_`
完成这些属性设置后,重新启动 Roller 并继续进行下一步。
==== 第 4 步:显示你的 Planet 聚合
你可以使用 Roller 的 UI 将外部 RSS/Atom 提要添加到 PlanetSetup。要显示这些提要,你需要做一些 TemplateCustomization。最简单的入门方法是使用 Roller 的现有首页主题。这是怎么做的。
创建一个 Weblog to Server 作为你的 Roller 站点的首页。从首页主题开始,并对其进行自定义。编辑 Weblog 模板,查找提到行星条目的部分。注释掉整个节目的部分和取消注释的行星条目的部分.双散列“##”标记表示注释掉的行。代码应该是这样的:
----
## 1) 全站范围的条目(默认)
##set($pager=$site.getWebLogentriespager($since,$maxresults))
## 2) 行星条目
#set($pager=$planet.getAggregationPager($since,$maxResults))---
有了这一点,你的首页将显示你的行星条目。你可以在以下网址找到你的行星饲料:
* 主行星馈送 http://localhost:8080/ Roller /planetrss
* 每个组的 feedhttp://localhost:8080/ Roller /planetrss?group=<group-name>[]
=== 手工创建和升级表格
如果你愿意自己创建数据库表,而不是让 Roller 自动创建数据库表,那么你可以这样做。你不应该启用自动安装,而应该通过将其放入 _roller-custom.properties_file 中来禁用它:
安装.type= 手动
现在,你必须运行数据库创建脚本。你可以在 _webapp/roller/WEB-INF/classes/dbscripts_ 目录中找到数据库创建脚本。你会发现一个 _createdb。我们希望支持的每个数据库的 SQL_Script。
如果要升级 Roller,则必须运行 createdb.sql 的迁移脚本。你也可以在 dbscriptsdirectory 下找到。但是,迁移脚本可能应该是逐条语句运行,在执行过程中检查数据库响应,或者首先删除数据库中不存在的任何 Delete Index 或 Delete ForeignKey 语句。某些数据库,比如 MySQL,在试图删除对象时会抛出错误,比如不存在的外键或索引,这是一种特定的错误类型,自动安装过程会对其进行编码,以忽略这种类型。
== 升级压路机
这一部分描述了如何通过关闭、备份和遵循安装说明来将现有的辊子安装升级到最新版本的辊子,但有几个关键的例外。但是首先,对于那些升级现有版本的辊子,有一些必读的内容。
=== 把你的旧滚筒备份起来。
在开始升级之前,请关闭现有的滚筒安装程序,并备份滚筒数据。
将数据库备份到系统中安全的地方或远程文件系统。下面是几个例子:如何在各种数据库上做到这一点:
* 在 MySQL 上创建一个转储文件
mysqldump-u scott-p rollerdb>
/somewhere/safe/ Roller 。DMP`
* 有了 PostgreSQL,你也可以做同样的事情。
`pg_dump -h 127.0.0.1 -W -Uscott rollerdb > /somewhere/safe/roller.db`
并备份任何其他数据。复制你的 Roller 数据目录,即带有 Roller 资源和搜索索引文件的目录。如果你在旧的 Roller Web ApplicationDirectory 中添加或修改了任何文件,那么你将需要备份整个目录。
将旧文件上传到新的媒体博客系统
如果从 Roller 4.0 升级到 5.1(5.0 已经有了此配置),当你第一次启动 Roller 5.1 时,它将把旧的文件上传迁移到新的媒体博客系统。如果这要正常工作,则必须确保在首次启动 Roller 5.0/5.1 之前正确设置下面的三个属性。
----
# Roller 5 中的目录。X 将上传文件
mediaFiles.storage.dir=$\{user.home}/roller_data/mediaFiles
# Roller 4.0 上载文件的目录
uploads.dir=$\{user.home}/roller_data/uploads
# 设置为 true 以启用迁移
uploads.migrate.auto=true
----
mediaFiles.storage.dir 属性应该设置为你想要存储上载文件的位置。应该将 uploads.dirProperty 设置为在 Roller 中存储上载文件的位置
4.0.
=== 安装并启动新的 Roller
按照新版本的正常安装说明操作,但是…
* 在创建你的 Roller -custom.properties 时,复制你的旧属性。仔细检查每个属性,并将其与 Roller 属性文件中的属性设置进行比较,该属性设置在[6.1]节中描述:#Tomcat-create- Roller -configuration-file[6.1]。
* 不要为 Roller 创建新的数据库。相反,指向 Roller yourexisting Roller 数据库。这是完全安全的,因为你创建了数据库的 abackup,对吗?
当你部署和启动时, Roller 将检测到你的数据库需要进行升级,并且它将提供运行从旧版本升级到新版本所需的每个迁移脚本。
注意:你也可以手动运行数据库脚本,参见 sectionlink:#manual-table-creation-and-upgrade[8.2]。
注意:在 Tomcat 上,在启动之前,你应该删除 Tomcat 工作目录的内容(位于 WebApps 文件夹下)。
= 模板指南
Apache Roller 网络日志ger
:TOC:
:部门:
:imagesdir: ./images
== 概述
本文是 Apache Roller Weblogger 的模板指南,这是由 Apache 软件基金会的 Apacheroller 项目制作的基于 Java 的开源 Weblog 服务器。
=== 版权和商标信息
本文件的内容以 ApacheSoftware 许可证的条款为准。
本文档中的所有商标都属于合法所有者。
=== 反馈
请将对此文档的任何评论或建议发送至:dev@roller.apache.org。
== 导言
如果你对 HTML 和 CSS 稍有了解,那么你就会发现,定制基于滚动日志的外观、布局和内容是很容易的。你可以改变你的任何网页的外观,也可以随意添加新的网页。任何 Roller 用户都可以通过 Roller 的基于 Web 的界面来完成这件事,而这一切都是通过 Roller 的简单的、易于使用的模板语言来完成的。在这篇指南中,我们将告诉你怎么做。首先,我们将解释 Roller 的 Weblog 模板系统是如何工作的,然后我们将提供一个对象和宏的参考,你可以在你的模板中使用这些对象和宏。
注意:如果你在网络日志中只有作者权限或有限权限,那么你将无法访问 Design->Theme 或 Design->Templates 页面,并且你将无法更改或自定义你的主题。你需要在 WebLogo 中拥有管理权限,才能执行本指南中描述的操作。
注意:滚筒现场管理员可以禁用机械操作.所以,如果你在你的博客中有管理权限,但你仍然没有看到 Design->Templates 页面,也许你的 RollerSite 不允许自定义。
== Roller 模板系统
每个 Roller Weblog 都由一组页面模板定义,你可以编辑这些模板来定制 Weblog 的内容、布局和外观。
=== 页面模板
当你创建一个新的 Roller Weblog 时,你必须选择一个主题来定义新的 Weblog 的外观和布局。主题只是一小组模板,其中每个模板都包含 HTML 代码、模板语言表达式和宏。什么是模板?HTML 网页的模板只是一个 HTML 网页,其中嵌入了一些 Velocity 代码。例如,这是一个有效的 Roller 模板,有一个 VelocityExpression:
----
<html>
<body>
我的博客名为 $model .网络日志。name</body>
</html>
----
字符串“$model.weblog.name”是一个模板语言表达式,当 Roller 显示模板时,该表达式将被替换为 Weblog 的名称。
请注意,$model 是一种特殊的东西。 Roller 使一组对象(称为模型)可用于页面模板。在上面的示例中,我们只使用 $model 对象,但这里有其他的对象。你将在第 5 节中了解更多关于模型的内容,第 6 节提供了完整的参考。
=== Velocity 模板语言
我们在 Roller 页模板中使用的简单模板语言叫做 Velocity。它被设计成一种简单易用的编程语言,即使不是程序员,但它也是一种简单的编程语言。你可以设置变量,使用 if-else 条件逻辑并创建循环。
例如,这个 Roller 页面模板将列出你的网络日志中可用的类别,除了名为 Music 的类别:
----
<html>
<body>
我的博客名为 $model.weblog.name。以下是我的分类:<br>
#foreach($model.weblog.categories 中的 $cat)
# 如果($CAT.NAME!=“音乐”)
$cat.name<br>
# 结束
# 结束
</body></html>
----
Velocity 还支持宏的概念。一个宏是必需的速度方法调用.我们在 Roller 中使用它们来生成 HTML。例如,如下所示,如果你从 Weblog 中第一次显示一个书签文件夹,然后将其传递到 _#showbookmarklinkslist()_macro,将其显示为 HTML<ul> 列表。
----
<html>
<body>
<h2>blogroll</h2>
# 设置($rootfolder=$model.weblog.getbookmarkfolder)
#ShowbookMarkLinksList($rootfolder)
</body></html>
----
你将在第 5 节中了解更多关于宏的信息,第 8 节提供了对标准滚筒宏的完整引用。如果你想了解更多关于 Velocity 的信息,请参见 http://wiki.apache.org/velocity/。
现在我们已经介绍了页面模板和 Velocity 模板语言的基本概念,让我们深入了解编辑模板的细节。
== 编辑和创建页面模板
在使用 Roller Design->Themes 页面自定义 Weblog 主题之后,你可以通过
设计-> 模板页面。我们将向你展示如何做到这一点,但首先你需要了解在每个主题中找到的所需页面是如何协同工作来显示一个网络日志的。
每个主题都是不同的,但所有主题都必须有两个必需的页面——无法重命名或删除的页面。这些是 Weblog 模板,它定义了你博客的主页面,还有 Day 模板,它定义了如何在你的主页面上显示每天的博客条目。一些主题还需要一个名为 CSS 的页面,该页面定义了 Weblog 使用的 CSS 样式代码。
首先,让我们来看一个简单的网络日志模板。
=== 网络日志模板
下面是一个简单的 Weblog 页面,该页面显示了 Weblog 通常包含的所有数据,包括带有分页到过去条目的最近条目、类别链接、提要链接、日历和提要自动发现。检查注释以获得更多细节。
清单 1:一个典型的 Weblog 模板
----
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>$model.weblog.name:$model.weblogpage.name</title>#1
#ShowAutoDiscoveryLinks#2
<style type="text/css">#includeTemplate</style>#3</head>
<body>
<table border="0" align="center" width="95%">
<tr>
<td class="entries" width="80%" valign="top">
<h1>$model.weblog.name</h1>#4
<p class="descrip">$model.weblog.description</p>
#set($rootcategory=$model.weblog.getweblogcategory(“nil”))#5
#ShowWebLogCategoryLinksList($rootcategory false)<br>
#set($pager=$model.getWebLogentriespager())#6
<div class="next-previous">
# 如果#7
#ShowWebLogSearchAgainForm
#ShowNextPrevSearchControl
# 其他
#ShowNextPreventiesControl#8
# 结束
</div>
#ShowWebLogentriesPager#9
#if#10
#ShowWebLogentry 评论s($entry)
#ShowWebLogentryCommentForm($entry)
# 结束
</td>
<td width="20%" valign="top">
<h2> 日历 </h2>
#ShowWebLogentryCalendar($model.weblog“nil”)#11
<h2>feeds</h2>
#ShowatoFeedsList#12
<h2> 搜索 </h2>
#ShowWebLogSearchForm#13
<h2> 链接 </h2>
# 设置($defaultFolder=$model.weblog.getBookMarkFolder)#14
#ShowbookMarkLinksList($defaultFolder)
<h2> 导航 </h2>
#ShowPageMenu#15
#ShowAuthorMenu(真)#16
<h2> 推荐人 </h2>
# 设置($refs=$model.weblog.gettodaysreferrers())#17
#showreferrerslist($refs3020)
</td>
</tr>
</table></body>
</html>
----
上面的模板包含了一个很好的速度表达式和语句的组合。这里有很多事情要做,所以让我们来详细解释一下。
.HTML 标题我们使用 Weblog 的名称,一个冒号来表示 HTML 标题
以及当前显示的页面模板的名称。
.自动发现链接
#showAutoDiscoveryLinks()宏添加了用于 RSS 和 AtomFeed 自动发现的 HTML<gtr="13"/> 元素,以及用于 Weblog 客户机的 RSD。
.包含 CSS 样式在这里我们使用的是 include the theme’s_css
模板直接在页面中,右内有一对 <style> 标记
.在此显示一个页面标题我们在一个页面中再次使用该博客的名称
<h1> 标题
.类别链接列表显示一个列表的网络日志类别链接.
.获取条目寻呼机获取条目寻呼机对象这样我们就可以显示
条目和分页控件
.显示搜索结果控制显示搜索结果寻呼机控件如果
搜索正在进行中
.否则...显示正常条目寻呼机控制
.显示条目显示当前页面的条目或搜索的价值
结果)。调用 on_day 模板来显示每天有价值的条目
.显示评论如果我们在一个永久链接页面上那么显示评论
和批注表
.显示日历显示标准的 Weblog 日历
.显示提要链接显示到所有可用的 Atom 条目提要的链接一个
每个类别
.搜索表单显示 Weblog 搜索表单false 表示 no
类别选择器
.显示 Blogroll 显示默认书签的内容
文件夹
.显示页面菜单显示导航条的页面可在
weblog.
.显示作者菜单显示作者菜单仅对经过授权的用户可见
用户
.显示今天的推荐人显示今天的推荐人网址与点击
很重要
请注意第 9 Weblog 条目的显示由另一个模板 day template 控制接下来让我们来看看 That Day Template
=== The_Day 模板
主题日模板负责显示一天的博客条目下面是一个典型的日间模板它与上面的 Weblog 模板相对应
清单 2:一个典型的 _day 模板
----
<div class="dayBox">
<div class="dayTitle">
$utils .formatDate($day,“eeee mmddyyyy”)#1
</div>
#foreach($entry 中的 $entry)#2
<div class="entryBox">
<p class="entryTitle">$进入title</p>#3
<p class="entryContent">
#if#4
$进入displaycontent
# 其他
$entry.displaycontent($url .entry($entry.anchor))
# 结束
</p>
<p class="entryInfo">
发布于
<a href="$url.entry($entry.anchor)">#5
$utils.formatDate($entry.pubtime,“hh:mma mmmddyyyy”)</a>
通过 #6 中的 $entry.creator.fullname
<span class="category">$entry.category.name</span> | #7
#if
($utils.isuserAuthorizedToAuthor($entry.website))#8
<a href="$url.editEntry($entry.anchor)"> 编辑 </a> |
# 结束
#if($entry.commentsstillallowed||$entry.commentcount>0)#9
#set($link=“$url.comments($entry.anchor)”)
<a href="$link" class="commentsLink">
注释[$entry.commentcount]</a>
# 结束
</p>
</div>
#end</div>
----
下面是对上述 Day 模板中的模板语言表达式和语句的逐点描述:
.显示日标头对于日标头我们显示当前日期
以一种很长的格式
.循环查看当天的条目这里我们使用 $foreach 循环来迭代
通过 $Entries 收藏
.显示条目标题 <div> 中显示条目标题以便
可以很容易地定型
.显示条目内容或摘要如果我们在一个永久链接页面上显示
条目的内容否则如果摘要可用则显示摘要
.显示条目永久链接显示到条目的永久链接
.显示条目作者的姓名显示文章作者的姓名
entry.
.显示条目类别显示相关类别的名称
有了入口
.显示编辑链接如果用户已获得授权请显示链接以编辑
entry.
.显示评论链接如果可以发表评论或者仍然允许发表评论
显示到条目注释的链接
现在你已经看到了所需的模板并且已经看到了大多数实际使用的宏让我们来讨论定制主题的机制
=== 自定义主题
当你启动一个滚筒式网络日志并选择一个主题时你的网络日志使用该主题的 _shared_copy定义你的主题的页面模板被其他所有选择了这个主题的用户共享使用一个共享的主题是很好的因为当你的轮轴站管理员对这个共享的主题进行修复和改进时你会自动得到这些但是你不能自定义一个共享的主题在你可以自定义主题之前你必须得到你自己的主题页面模板的副本比如:
1) 转到设计-> 主题页面
登录到 Roller进入 YourWeblog 的设计-> 主题页面并选择自定义主题选项
image::customize-theme-1.png[]
2) 点击更新主题按钮
如果你正在使用自定义主题选项你将看到以下注释:
由于这是第一次使用自定义主题Roller 将从你现有的共享主题复制模板以便你可以编辑它们
点击更新主题按钮继续当你这样做时主题页面模板的副本将被复制到你的网站日志中以便你可以编辑它们
image::customize-theme-2.png[]
3) 通过编辑和创建页面模板来定制你的主题转到 Design->Templates 页面编辑你的页面模板并根据需要添加新的模板——如下一节所述
如果你厌倦了定制的主题只需使用
设计-> 主题页面切换回一个共享的主题-或挑选另一个定制.现在让我们来讨论编辑和创建模板
=== 编辑和创建页面模板
一旦你把页面模板复制到了你的博客中你就可以为你的主题做任何你想做的事情你可以使用
Design->Templates 页面如下所示可创建新页面删除页面或选择要编辑的页面.
image::templates.png[]
现在可能是描述页面模板属性的好时机因为你可以在上面的表格中看到它们属性是名称描述让我们来分别解释一下:
* 名称:每个模板都有一个名称你可以将其显示在你的模板中你还可以使用 #includeTemplate()通过引用模板的 byname将一个页面的内容包含到另一个页面中
* 说明:你可以为显示的每个页面输入一个选项说明或者只是作为提醒你自己该页面的目的
对于你添加的新模板你将能够使用 Design->Template 页面见下图编辑所有这些属性
image::template-edit.png[]
但要求页面的规则是不同的命名为 WeblogDay CSS Weblog 页面被认为是必需的页面你可以更改这些页面的模板代码但不能编辑名称链接或任何其他属性
既然你已经知道了如何编辑和创建页面模板那么让我们来讨论如何使用 Roller 为模板作者提供的模型对象和宏
== 使用模型对象和宏
Roller 使 Weblog 数据以 _models_ 和数据对象的形式可用于页面模板并通过提供宏使你很容易为你的 Weblog 生成 HTML让我们来解释一下这些新术语
* 模型对象:模型对象提供对来自 Roller 特别是来自 Roller Weblog 的数据的访问模型对象返回数据对象或集合或数据对象在第 7 节中我们将描述每个模型它的属性和方法
* 数据对象:每个数据对象都代表你的 Roller Weblog 中的一项数据例如有一个 Weblog 对象代表你的 WeblogWeblogentry 对象代表个性化的 Weblog 条目以及书签对象代表你的 Blogroll 中的条目在第 8 节中我们将描述每个数据对象它的属性和方法
* 一个宏是 Velocity 例程它基于 Adata 对象或一组数据对象生成 HTML在第 9 节中我们将描述 Roller 的每个内置宏
让我们讨论一下如何通过模型和数据对象访问数据
=== 通过模型和对象访问数据
模型和数据对象是对象有两种方法可以从对象访问数据一种方法是访问对象属性另一种方法是调用对象的方法让我们来谈谈这两种技术
==== 访问对象属性
要访问对象属性可以使用简单的点记号例如如果你希望显示 $ 配置 模型对象的 Roller 版本号属性那么你可以在页面中执行如下操作:
<p>**$config.rollerversion**</p>
或者如果你想将 Roller 版本号保存在一个名为 $version 的变量中你可以这样做:
# 设置($version=$config.rollerversion
而有些属性本身就是对象它们又有自己的属性和方法例如你可以从 $model 对象获得 Weblog 对象并且可以从 Weblog 对象中显示 Weblog 的名称和描述如下所示:
<p>**$model.weblog.name**</a>
<p>**$model.weblog.description**</a>
==== 调用对象方法
访问对象数据的另一种方法是调用对象的方法方法与属性不同因为它们需要参数你使用相同的简单点记法但必须以括号中的参数列表结束表达式例如如果你想在主题中显示一个图像可以使用 $URL 模型 likeso:
<img='**$url.themeResource("basic", "background.gif")**'></a>
参数 1 是主题的名称参数 2 是存在于主题目录中的 afile 的名称请注意逗号是用来分隔参数的
=== 调用宏
在页面模板中你从对象获取数据然后使用模板代码将这些数据显示为 HTML为了帮助你 Roller 包含了 SomemaCros它可以用来在你的 Weblog 上生成常用的 HTML 构造有一些宏用于显示你的 Weblog 条目显示 Blogroll 和显示评论表单
调用宏与调用宏有些不同宏呼叫以 #pound-sign 开始后面跟着宏名和括号中的宏参数例如你可以这样调用 WebLogCalendar :
#ShowWebLogentryCalendar($model.weblognil”)
参数 1 是日历的 Weblog参数 2 category其中nil表示未指定任何类别注意宏的参数是用空格分隔的而不是 commaas 方法的情况
=== 关于寻呼机的一句话
在网络日志中有很多情况当我们想要显示大量的值时我们希望集合是可页面访问的——这就是我们想要一个下一个链接去到下一个页面的结果并可能有一个新的链接去到上一个页面所以在 Roller 我们引入了寻呼机的概念寻呼机是一种特殊类型的对象它便于在页面模板中显示可页的项目集合你可以在上面的清单 1 中看到一个寻呼机
你可能不需要直接使用寻呼机对象因为宏可以为你完成它但如果你这么做了下面是寻呼机的样子:
* $Pager.Homelink结果第一页的 URL
* $pager.homename要为该 URL 显示的名称
* $pager.nextlink下一页结果的 URL
* $pager.nextname要为该 URL 显示的名称
* $pager.prevlink上一页结果的 URL
* $pager.prevname要为该 URL 显示的名称
* $pager.items数据对象的集合结果的当前页面
还有一个 WebLogentRyPager 接口为下一个集合分页提供了一些外推方法收集方法之所以存在是因为在使用 Weblog 条目时我们通常会在一个时间段例如一个月内对存在的条目进行分页在这种情况下下一个链接点指向该月内结果的下一页 extCollectionLink 指向下一个月的条目
* $Pager.Homelink结果第一页的 URL
* $pager.homename要为该 URL 显示的名称
* $pager.nextlink下一页结果的 URL
* $pager.nextname要为该 URL 显示的名称
* $pager.prevlink上一页结果的 URL
* $pager.prevname要为该 URL 显示的名称
* $pager.nextCollectionLink-按顺序排列的下一个集合的 URL
* $pager.nextCollectionName要为该 URL 显示的名称
* $pager.prevcollectionlink-按顺序排列的前一次收集的 URL
* $pager.prevCollectionName要为该 URL 显示的名称
* $pager.items数据对象的集合结果的当前页面
== 模型对象引用
本节介绍了所有页面模板中可用的标准模型对象:
* $config提供对 Roller 站点配置参数的访问
* $model为一个特定的 Weblog 提供对数据的访问
* $URL用于在一个特定的 Weblog 中创建 Roller URL URL
* $utils页面模板中需要的实用方法
对于每个模型我们将介绍属性和方法
=== $config
$config 模型提供了对你在 Weblog 中需要的 Roller 配置数据的访问
==== $config 属性
|===
属性名称 | 类型 | 描述
|$config.analyticsoverriredelowed
| 布尔值
| 如果允许个人博客覆盖由博客管理员提供的默认跟踪代码如果有的话),则为真
|$config.commentAutoFormat
| 布尔值
| 如果注释应该使用添加的线源进行格式化则为真
|$config.commentemailnotify
| 布尔值
| 如果启用了通过电子邮件通知新的评论则为真
|$config.commentescapeHTML
| 布尔值
| 如果所有 HTML 在显示前都会被删除注释则为真
|$config.defaultAnalyticStrackin Gcode
| 字符串
| 如果是由博客管理员配置的那么 Web 分析软件的默认跟踪代码参见 Roller 用户指南 Roller 管理章节)。
|$config.feedmaxsize
| 整数
| RSS Atom 提要中显示的项的最大数量
|$config.feedstyle
| 布尔值
| 如果提要以用户友好的格式显示通过 XSL 样式表),则为真
|$config.rollerversion
| 字符串
| 版本号 Roller build
|$config.registrationenabled
| 布尔值
| 如果启用了新用户注册则为真
|$config.registrationurl
| 字符串
| 新用户注册站点的 URL如果不使用标准的 Roller 注册)。
|$config.sitesdescription
| 字符串
| 这个 Roller 站点的描述
|$config.sitemail
| 字符串
| Roller 网站管理员的电子邮件地址
|$config.sitename
| 字符串
| 这个 Roller 网站的名称
|$config.siteshortName
| 字符串
| 这个 Roller 网站的简称
|===
==== $config 方法
$config 模型还提供了一组按名称访问属性的方法通常你应该能够从上面的属性获得所需的构形数据你不需要调用这些方法但只是想让你知道:
* Boolean getBooleanPropertyName Booean 的形式返回名称 runtime 属性
* 字符串 getPropertyName 以字符串的形式返回已命名的 runtimeProperty
* int getIntPropertyName 以整数形式返回已命名的 runtimeProperty
=== $model
$model 对象为你提供了对组成 Weblog 的所有数据对象的访问权限你可以获得一个寻呼对象来访问我们的 Weblog 条目请求引用的 Weblog 条目请求引用的 Ecategory 对象以及 Weblog 本身
下面的图表显示了你可以从 $model 中获得的对象以及你可以从这些对象中获得的对象集合有关对数据对象及其属性的完整引用请参见第 7
image::model-object.png[]
现在让我们来看看 $Model 对象的详细信息从属性开始
==== $Model Properties
|===
名称 | 类型 | 描述
|$model.commentform
|commentform
| 在注释页面上将使用注释窗体值填充此对象可用的值是 $model.commentform.name、$model.commentform.url $model.commenform.content
|$model.locale
| 字符串
| 如果在 URL 中指定了区域设置名称
|$model.weblog
| 网络日志
| 正在显示当前的 Weblog
|$model.weblogcategory
| 网络日志category
| URL 指定的 Weblog 类别如果没有指定则为 NULL
|$model.weblogentry
|WebLogentry
| URL 指定的 Weblog 条目对象如果没有指定则为 NULL
|$model.weblogentriespager
| 寻呼机
| 用于对由 URL 指定的条目进行分页的 Weblog 条目寻呼机
|$model.weblogpage
页面模板
| URL 指定或暗示的 Weblog 页面对象
|$Model.Permalink
| 布尔值
| 如果 URL 指定了一个特定的 Weblog 条目 Permalink则为真
|$model.searchresults
| 布尔值
| 如果显示搜索结果则为真
|$model.tags
| 字符串列表
| 由请求指定的标记列表
|===
==== $ 模型搜索属性
如果 URL 表示进行了搜索那么传呼机将通过
$model.weblogentriespager 将返回搜索中的条目并且在 $model 对象上可以使用一些附加属性:
|===
名称 | 类型 | 描述
|$model.categories
| 字符串列表
| 搜索中可用的类别名称列表
|$model.hits
| 整数
| 找到的总点击数
|$model.limit
| 整数
| 最多每个页面显示的搜索结果数
|$model.offset
| 整数
| 偏移到搜索结果的当前页面
|$model.weblogspecificsearch
| 布尔值
| 如果搜索特定于一个网络日志则为真
|===
==== $ 模型方法
$model 对象还提供了几个方法:
* 寻呼机 getWebLogEntriesPager 返回一个只包含来自指定类别的条目的寻呼机
* String getRequestParameter URL 返回一个 SpecificRequest 参数这仅在自定义页面上支持而不在 Weblog 的默认页面例如 Weblog 页面上支持
=== $url
为了确保你的 URL 被正确地形成你应该使用 $URLModel 来形成指向 Roller 站点或你的 Weblog 的所有 URL
|===
名称 | 类型 | 描述
|$url.absolutesite
| 字符串
| Roller 站点的绝对 URL
|$url.category
| 字符串
| 网络日志 中一个类别的 URL
|$url.category
| 字符串
|weblog 中的一个类别的 URLw/page
|$url.commentAuthenticator
| 字符串
| 注释验证器的 URL
|$url.commentString AnchorString Timestamp
| 字符串
| 由锚点指定的条目的注释 URL
|$url.comments
| 字符串
| 由锚点指定的条目的注释的 URL
|$url.createentry
| 字符串
Roller UI 中新条目页面的 URL
|$url.editentry
| 字符串
Roller UI 中的 Edit-Single-Entry 页面的 URL
|$url.date
| 字符串
| 一个特定的 6 8 字符日期的 URL
|$url.date
| 字符串
| 一个特定的 6 8 字符日期的 URLW/page
|$url.editsettings
| 字符串
Roller UI 中的编辑-weblog-设置页面的 URL
|$url.entry
| 字符串
| 由锚点指定的条目的 URL
|$url.feed.entries.atom
| 字符串
| 条目提要的 URL
|$url.feed.entries.rss
| 字符串
| 条目提要的 URL
|$url.feed.comments.atom
| 字符串
| 注释提要的 URL
|$url.feed.comments.rss
| 字符串
| 评论提要的 URL
|$url.home
| 字符串
weblog 的网址
|$url.home
| 字符串
用一种特定语言访问 Weblog URL
|$url.home
| 字符串
| 以一种特定语言访问 Weblog URL并带有分页
|$url.login
| 字符串
| 登录页面的网址
|$url.logout
| 字符串
| 注销页面的 URL
|$url.rsd
| 字符串
| 真正简单的发现服务的 URL
|$url.page
| 字符串
| PageLink 指定的页面的 URL
|$url.pageString PageLinkString DateStringString CatPathint Pagenum
| 字符串
| PageLinkDateStringCatPath Pagenum 指定的页面的 URL
|$url.search
| 字符串
| 搜索网址
|$url.search字符串查询字符串 catpathint pagenum
| 字符串
| 特定搜索字符串catpath pagenum 的搜索 URL
|$url.site
| 字符串
Roller 站点的相对 URL
|$url.resource
| 字符串
Weblog 中上传的文件资源的 URL
|$url.themeResource字符串主题字符串文件
| 字符串
| Roller 主题内的资源的 URL
|$url.themeResource字符串主题字符串文件布尔 ABS
| 字符串
| Roller 主题内的资源的绝对 URL
|$url.trackback字符串锚点
| 字符串
| 由锚点指定的条目的 trackback URL
|===
=== $utils
$utils 对象提供了你的 Weblog 所需的所有字符串操作方法包括格式化日期转义 HTML编码 URL 甚至完全删除 HTML 的方法
* 用户 getauthenticateduser()获取当前用户如果 nose 已登录则获取 NULL
* String AddnowFollow nofollow 属性添加到字符串中找到的任何 HTML 链接中
* String AutoFormat 使用 *<br>* 标记转换字符串中的任何换行符
* String Decode 解码已经过 URL 编码的字符串
* String Encode URL 编码应用于字符串
* 字符串转义 HTML 可以转义字符串中的任何非 HTML 字符
* String EscapeXML 转义字符串中的任何与 XML 不兼容的字符
* String FormatDateDate DateString FMT根据指定的格式对日期对象进行格式化参见 java.text.SimpleDateFormat
* 字符串 Formatiso8601Date日期日期使用 ISO-8601 日期格式来格式化日期对象
* String FormatRFC822Date数据日期格式化日期对象 usingRFC-822 日期格式
* 如果对象是空的或者 iFit 是空的字符串 Boolean ISEMPTY 返回 TRUE
* Boolean isnoTempty 返回该对象的 true 不是空的字符串
* String RemoveHTML 从字符串中删除所有 HTML 标记
* 字符串替换String STRString TargetString Replacement String STR 用替换字符串替换目标字符串
* 字符串转换为 Base64 编码.
* String TransformtoHTMLSubset 将字符串中的任何 HTML 转换为安全的 HTML 子集
* 字符串截断string strint lowerint upperstring append截断字符串 str使其介于长度较低和较高的字符之间并添加追加字符串
* 字符串 unescapeHTML 取消已转义的字符串的 scape
* 字符串 unescapexml unescape 已被 XMLescape 的字符串.
对于 $URL 模型和一般模型来说就是这样让我们继续讨论数据对象
== 数据对象引用
在本节中我们将列出 Theroller 数据对象的每个属性和方法这些是:
* 书签:网络日志的网络书签集合中的单个链接存在于一个文件夹中
* 书签文件夹:一个包含书签的文件夹绑定到一个网络日志
* 注释:与特定的 Weblog 条目关联的注释
* 页面模板:网络日志中的单个页面模板
* Referrer:Referrer 表示链接到 Weblog 的外部站点
* 用户:表示 Roller 站点内的单个用户
* 网络日志:一种包含网络日志条目页面模板书签文件夹等的网络日志
* Weblog 条目:一个单独的 Weblog 条目
* Weblog 条目 attrbute:与 WebLogentry 关联的名称值对
* Weblog 类别:Weblog 中的类别Roller 中的类别是分层的
=== 书签
|===
名称 | 类型 | 描述
|$Bookmark.Description
| 字符串
| 书签说明
|$bookmark.feedurl
| 字符串
| 与书签关联的新闻提要的 URL
|$bookmark.folder
bookmarkfolder
| 书签的父文件夹
|$bookmark.image
| 字符串
| 要为书签显示的图像的 URL
|$bookmark.name
| 字符串
| 书签名称
|$bookmark.url
| 字符串
| 书签的网址
|$Bookmark.priority
| 整数
| 书签在列表中的数字位置较高的数字表示在列表中较低的数字
|===
=== 书签文件夹
|===
名称 | 类型 | 描述
|$folder.bookmarks
| 书签列表
书签包含在文件夹中
|$folder.name
| 字符串
| 文件夹名称
|$folder.website
| 网络日志
| 包含在哪个文件夹中的 Weblog
|===
=== Comment
|===
名称 | 类型 | 描述
|$Comment.Approved
| 布尔值
| 如果批注已被批准显示则为真
|$comment.content
| 字符串
| 评论内容
|$comment.email
| 字符串
| 评论者的电子邮件地址
|$comment.name
| 字符串
| 评论者姓名
|$comment.notify
| 布尔值
| 如果评论者选择请通过电子邮件通知我选项则为真
|$comment.pending
| 布尔值
| 如果评论正在等待批准则为真
|$comment.posttime
| 日期
| 该评论创建的时间
|$comment.remotehost
| 字符串
| 评论者的主机名称或 IP 地址
|$comment.spam
| 布尔值
| 如果评论被标记为垃圾邮件则为真
|$comment.url
| 字符串
| 评论者的网址
|$comment.weblogentry
|WebLogentry
| 与注释关联的 Weblog 条目
|===
=== PageTemplate
|===
名称 | 类型 | 描述
|$page.contents
| 字符串
| 页面模板的内容通常是 HTML Velocity 代码
|$page.description
| 字符串
| 页面描述
|$page.lastmodified
| 日期
| 上次修改页面属性或内容的日期
|$page.link
| 字符串
| 用于将 URL 形式转换为页面的字符串
|$page.name
| 字符串
| 页面名称
|$page.navbar
| 字符串
| 如果页面导航菜单中包含页面则为真
|$page.hidden
| 字符串
| 如果页面不能通过 URL 调用则为真
|===
=== 标记符
|===
名称 | 类型 | 描述
|$tagstat.name
| 字符串
| 标签名称
|$tagstat.count
| 整数
| Weblog 或站点中标记的使用次数取决于上下文
|$tagstat.intensity
| 整数
标签的相对强度等级 1 5)
|===
=== User
|===
名称 | 类型 | 描述
|$user.datecreated
| 日期
| 创建该用户的日期
|$user.emailaddress
| 字符串
| 用户的电子邮件地址
|$user.fullName
| 字符串
| 用户全名
|$user.screenName
| 字符串
| 用户的网名
|$user.locale
| 字符串
| 用户的语言环境
|$user.timezone
| 字符串
| 用户时区
|$user.username
| 字符串
| 用户的用户名这将始终返回用户的屏幕名除非属性 user.privateusernames Roller -custom.propreties 中设置为 false)。
|===
=== Weblog
|===
名称 | 类型 | 描述
|$Weblog.about
| 字符串
|关于你的博客文字
|$weblog.active
| 布尔值
| 如果 Weblog 被认为是活动的则为真
|$weblog.allowcomments
| 布尔值
| 如果在 Weblog 中允许注释则为真
|$weblog.analyticscode
| 字符串
| 网络日志 Web 分析跟踪代码如果没有在博客级别进行配置则将是空的请参阅 $config.defaultAnalyticStrackingCode以获取没有此值设置的博客的全局跟踪代码请参阅 Roller 用户指南中的 Weblog 设置-Web 分析部分
|$weblog.commentcount
|
| 在网络日志中被批准的评论总数
|$weblog.creator
User
| 创建此博客的用户
|$weblog.datecreated
| 日期
| 网站日志创建日期
|$weblog.emailaddress
| 字符串
|Weblog 执行编辑的电子邮件地址
|$weblog.emailcomments
| 布尔值
| 如果启用了评论的电子邮件通知则为真
|$Weblog.emailfromaddress
| 字符串
| 来自通知地址的电子邮件地址
|$Weblog.enablebloggerapi
| 布尔值
| 如果启用了远程博客 API则为真
|$weblog.enabled
| 布尔值
| 如果启用了 Weblog则为真
|$Weblog.entrycount
|
|Weblog 中的条目总数
|$Weblog.entryDisplayCount
| 整数
| 在寻呼机中显示的默认条目数量
|$weblog.handle
| 字符串
| 唯一标识 Weblog 的简单字符串句柄
|$weblog.lastmodified
| 日期
| 上次修改 Weblog 的时间戳
|$weblog.locale
| 字符串
|Weblog 使用的默认区域设置
|$weblog.moderatecomments
| 真的
| 如果在 Weblog 中启用了评论审核则为真
|$weblog.name
| 字符串
| 网络日志的名称
|$weblog.pages
| 页面模板列表
| 网页模板
|$Weblog.PopularTagsint sincedaysint length
|TagStat 对象列表
| 过去几天的流行标签返回最大长度的对象数量
|$weblog.tagline
| 字符串
|Weblog 标语简短描述
|$weblog.timezone
| 字符串
|weblog 的时区
|$weblog.todayshits
| 整数
| 今天统计的点击数
|$weblog.weblogcategories
|Weblogcategories 列表
| 网络日志分类
|===
网络日志方法
* WebLogentry 通过该条目的锚来获得一个单独的 Weblog 条目这在 Weblog 中是唯一的
* 列出 GetreCentWebLogentryString Catint max Weblog 中获得最多的最近 WebLogentry直到最大值如果你只想要一个类别的条目或者所有类别的nil”),你可以指定学术名称
* List getrecentcomments weblog 中获取最多的最新评论
* WebLogCategory getWebLogCategory字符串名称获取由名称指定的 Weblog 类别
* 页面模板 getPagebyName字符串名称获取按名称指定的页面模板
* 页面模板 getPagebyLink字符串链接获取由链接指定的页面模板.
=== Weblogcategory
|===
名称 | 类型 | 描述
|$category.description
| 字符串
| 描述
|$category.image
| 字符串
| 要为类别显示的图像的 URL
|$category.inuse
| 布尔值
| 如果 Category 正在使用即如果 WebLogentry 对象使用它则为 true
|$category.name
| 字符串
| 类别名称
|$category.website
|Weblog
| 包含类别的 Weblog
|===
=== 网络语言
|===
名称 | 类型 | 描述
|$entry.allowcomments
| 布尔值
| 如果此博客条目允许注释则为真
|$entry.anchor
| 字符串
| Weblog 中唯一标识 POST 的简单字符串
|$entry.categories
|Weblogcategories 列表
| 与此条目关联的 Weblog 类别
|$entry.category
|Weblogcategory
| 此条目的主要 Weblog 类别
|$entry.commentdays
| 整数
| 允许评论的天数
|$entry.commentsstill 允许
| 布尔值
| 如果当前允许注释则为真
|$entry.contentsrc
| 字符串
| 条目内容的 URL如果超出行
|$entry.ContentType
| 字符串
MIME 内容-条目类型
|$entry.creator
User
| 创建该条目的用户
|$entry.entryAttributes
| 入口属性列表
| 与条目关联的任意名称 / 值属性
|$entry.pubtime
| 日期
| 发表条目的时间戳
|$entry.righttoleft
| 布尔值
| 如果要从右向左显示条目文本则为真
|$entry.searchDescription
| 字符串
| 可添加到 Weblog 条目的 HTML 头中用于搜索引擎优化的描述性文本
|$entry.status
| 字符串
输入状态即已发布
|$entry.summary
| 字符串
| 条目的原始摘要文本
|$entry.tags
|WebloGentryTags 列表
| 与条目关联的标记
|$entry.tagsastring
| 字符串
| 作为字符串列出的标记
|$entry.text
| 字符串
| 原始内容条目文本
|$entry.transformedtext
| 字符串
| 插件处理的条目的内容文本
|$entry.transformedsummary
| 字符串
| 插件处理的条目的摘要文本
|$entry.updateTime
| 日期
| 对条目最后一次修改的时间戳
|$entry.website
|Weblog
|Entry 的网络日志
|===
网络语言生成方法
* 公共字符串 getDisplayContent()返回转换后的 Entryor 或转换后的摘要文本如果没有条目的话)。
* 公共字符串 getDisplayContent 如果你通过了一个非空和非空的条目 Permalink那么这个方法将返回该条目的转换摘要或者如果没有摘要则返回文本
* 公共字符串 FindentryAttribute字符串名称返回指定的条目属性的值如果没有这样的属性则返回 NULL
=== WebloGentryTag
用户可以为每个 Weblog 条目分配尽可能多的标记
|===
名称 | 类型 | 描述
|$tag.name
| 字符串
| 与此属性关联的 Weblog 条目
|$tag.user
User
| 添加标签的用户
|$tag.weblog entry
|WebLogentry
| 与标记关联的 Weblog 条目
|$tag.weblog
|Weblog
| 与标记关联的 Weblog
|===
=== WebloGentryAttribute
Weblog 条目属性是可以分配给 Weblog 条目的名称 / 值对目前它们只用于添加 Podcaststo 博客条目
== 宏观参考
本节列出了可在 Roller 页模板中使用的宏简要描述了每个宏的工作方式以及所生成 HTML 的使用范围其中突出了 CSS classesseded
=== 入口宏
`#showWeblogEntriesPager($pager)`
论点:
$pager:由 getWebLogEntrieSpager()方法返回的 pager 对象
内容提要:
通过调用你的 Weblog _day 模板来显示指定的 $pager 对象中包含的 Weblog 条目以获取每天的条目
使用生成的 HTML CSS
这完全取决于你的 weblogs_day 模板的内容
`#showNextPrevEntriesControl($pager)`
论点:
$pager:由 getWebLogEntrieSpager()方法返回的 pager 对象
内容提要:
显示指定的 $pager 对象的 next/prev 链接
使用生成的 HTML CSS
假设你的页面有上一页和下一页的链接HTML 将看起来像下面这样正如你所看到的没有定义 CSS
----
«
<a href="...">...prev...</a>|
<a href="...">...home...</a>|
<a href="...">...next...</a>
»
----
`#showEntryTags($entry)`
论点:
$entry:WebLogentry 对象
内容提要:
显示与一个 Weblog 条目相关联的标记作为指向 Weblog tagspecificviews 的链接的列表
使用生成的 HTML CSS
没有使用 CSS 只使用了一系列类似于 So 的链接:
----
<a href="…" rel="tag">标记名称</a>
<a href="…" rel="tag">标记名称</a>
----
=== 注释宏
`#showWeblogEntryComments($entry)`
论点:
$entry:WebLogentry 对象
内容提要:
显示与指定条目相关联的评论不包括那些未被批准发布或标记为垃圾邮件的条目
使用生成的 HTML CSS
----
<div class="comments" id="comments">
<div class="comments-head"> <!-- Comments title --> </div>
<div class="comment even" id="">
<!-- even like above or odd as below -->
<div class="comment odd" id="">
...评论内容..
<p class="comment-details">
...评论详细信息..
<a href="link to comment" class="entrypermalink" >#</a>
</p>
</div></div>
----
`#showWeblogEntryCommentForm($entry)`
论点:
$entry:WebLogentry 对象
内容提要:
显示用于向指定条目添加注释的注释窗体
使用生成的 HTML CSS
如果不再允许对所讨论的 Weblog 条目进行注释那么只会生成一条状态消息:
----
<span class="status">评论关闭消息</span>
----
否则我们将显示注释表单
----
<div class="comments-form">
<div class="comments-head">...comment form title..</div>
<span class="error">...错误消息...</span>
<span class="status">...状态消息...</span>
<form method="post" name="commentForm" ...>
<ul>
<li>
<label class="desc">...文本字段...</label>
<input type="text" name="name" class="text large" .../></li>
<li>
<input type="checkbox" class="checkbox" .../><label class="choice">..复选框字段...</label>
</li>
<li>
<label class="desc"> ... </label>
<textarea name="content" class="textarea large" cols="" rows="">
<!-- Comment content -->
</textarea>
</li>
<li class="info">
<span class="comments-syntax-indicator">
<span class="disabled"> 禁用 </span>
<!-- disabled as above or enabled as below --><span class="enabled"> 已启用 </span>
</span>
</li>
<li class="info">
<div id="commentAuthenticator"></div>
</li>
<li>
<input type="button" class="button" .../> <!-- preview button -->
<input type="submit" class="button" .../> <!-- preview button --> </li>
</ul>
</form>----
=== 列表宏
`#showWeblogEntryLinksList($entries)`
论点:
$entries:要在列表墨水中显示的 WebLogentry 对象列表
内容提要:
显示一个简单的条目列表每个条目都有一个标题和链接
使用生成的 HTML CSS
我们使用一个简单的 HTML 列表:
----
<ul class="rEntriesList">
<li class="recentposts"><a href="...">..title...</a></li>
</ul>
----
`#showBookmarkLinksList($folderObj)`
论点:
$FolderObj:显示书签的文件夹对象
内容提要:
显示指定的书签文件夹对象中的所有书签
使用生成的 HTML CSS
我们为 <ul> 列表和 <li> 列表项元素生成一个带有不同 CSS 类的简单嵌套列表Bookmark CSS 类与 Bookmark 的优先级序号连接在一起
----
<ul class="rFolder">
<li class="rFolderItem">
<a href="..." class="rBookmark10"/>...书签名称...</a></li>
<li class="rFolderItem">
<a href="..." class="rBookmark5"/>...书签名称...</a>
</li></ul>
----
`#showWeblogCategoryLinksList()`
内容提要:
显示给定 Weblog 的已定义类别
使用生成的 HTML CSS
----
<ul class="rCategory">
<li>...未选择的类别名称...</li>
<li class="selected">...选定类别名称..</li></ul>
----
`#showMobileCategoryLinksList()`
内容提要:
以更适合于移动设备的格式显示给定 Weblog 的已定义类别
使用生成的 HTML CSS
----
<ul>
...
<li class="ui-btn-active"> ...
</ul>
----
=== 菜单宏
#ShowPageMenu($Weblog
论点:
$Weblog:显示此 Weblog 的页面菜单
内容提要:
显示一个页面导航菜单其中列出了 Weblog 中的所有页面
使用生成的 HTML CSS
页面菜单显示为一个简单的 HTML 列表其中包含用于列表和列表项的单独的 CSSStyles
----
<ul class="rNavigationBar">
<li class="rNavItem">
<a href="...">...name...</a>
</li></ul>
----
`#showAuthorMenu($vertical)`
论点:
$vertical:true 表示显示垂直菜单false 表示显示水平菜单
内容提要:
显示当前 Weblog 的创作菜单如果 $vertical 是真的那么在一个狭窄的边栏中显示一个适合使用的菜单
使用生成的 HTML CSS
对于垂直菜单我们使用一个简单的 HTML 列表:
----
<ul class="rMenu">
<li><a href="...">..菜单项名...</a></li></ul>
----
对于水平菜单我们只需发出一系列以管道分隔的链接:
----
<a href="...">...菜单项名...</a> |
<a href="...">...菜单项名...</a> |
<a href="...">...菜单项名...</a>
----
=== 搜索宏
`#showWeblogSearchForm($weblog $withCats)`
论点:
$Weblog:显示此 Weblog 对象的搜索表单 **$WithCats:Setto True 显示类别组合框
显示用于搜索 Weblog 的搜索表单如果 $WithCats TrueShow则显示一个类别选择器
使用生成的 HTML CSS
----
<form id="searchForm" style="margin: 0; padding: 0" ...>
...表单标记..</form>
----
`#showWeblogSearchAgainForm($weblog)`
论点:
$Weblog:显示此 Weblog 对象的 search-again 表单 ***
内容提要:
再次显示搜索表单适用于在搜索结果页面的开头显示
使用生成的 HTML CSS
----
<div id="searchAgain">
<form>
...表单标记..
</form></div>
----
`#showNextPrevSearchControl($pager)`
论点:
$pager:getWeblogentriespager() OFA 搜索页面的上下文中返回的寻呼器
内容提要:
显示专为在搜索结果中进行分页而设计的特殊寻呼机
使用生成的 HTML CSS
----
<h3>...搜索摘要...</h3>
«
<a href="...">...prev...</a>|
<a href="...">...home...</a>|
<a href="...">...next...</a>
»
----
=== Misc
`#showWeblogEntryCalendar($weblog $category)`
论点:
$Weblog:Weblog 对象
$ 类别:类别限制表示不受限制
内容提要:
显示 Weblog 条目日历可选地受类别名称的限制(“nil表示没有类别
使用生成的 HTML CSS
Weblog 条目日历显示为带有 <td><th><div> 的不同 CSSCLASS 的表以及其中的链接元素如下所示
----
<table class="hCalendarTable" ...>
<tr>
<td colspan="7" class="hCalendarMonthYearRow">
<a href="..." class="hCalendarNavBar">«...上一个月...</a>|
<a href="..." class="hCalendarNavBar">»...下个月...</a></td>
</tr>
<tr>
<th class="hCalendarDayNameRow" align="center"> 太阳 </th>
一周几天……
<th class="hCalendarDayNameRow" align="center"> 星期六 </th>
</tr>
<tr>
<td class="hCalendarDayNotInMonth"> </td>
一周几天……
<td class="hCalendarDay">
<div class="hCalendarDayTitle">1</div>
</td>
<td class="hCalendarDayLinked">
<div class="hCalendarDayTitle">
<a href="...">2</a>
</div>
</td>
</tr>
<tr class="hCalendarNextPrev">
<td colspan="7" align="center">
<a href="..." class="hCalendarNavBar"> 今日 </a></td>
</tr></table>
----
`#includeTemplate($weblog $pageName)`
论点:
$Weblog:要从哪个页面开始包含的 Weblog 对象
$Pagename:要包含的页面名称
内容提要:
解析并在当前页面中包含一个页面模板
`#showAutodiscoveryLinks($weblog)`
论点:
$Weblog:Weblog 对象
内容提要:
显示适合使用 HTML<head> 元素的 RSSAtom RSD 自动发现链接
使用生成的 HTML CSS
不会产生可用于样式的标记
`showMetaDescription()`
论点:无
内容提要:
添加一个 Meta Description 标记该标记适合在 HTML 头部分中使用
搜索引擎为返回的链接提供简短的描述描述值将设置为
如果在多个博客条目页面上则为 Weblog 的标语如果在单个博客条目永久链接页面上则为 Weblog 条目搜索描述如果没有配置相关的描述值则不会创建元标记
使用生成的 HTML CSS
不会产生可用于样式的标记
`showAnalyticsTrackingCode($weblog)`
论点:
$Weblog:Weblog 对象
内容提要:
添加由 Google Analytics 等服务提供的特定于博客或博客服务器级别的 Web 分析编制代码除非已经配置了特定于博客的代码否则将使用服务器级别的默认跟踪代码请参阅 Roller 用户指南-Weblog 设置和 roller 管理部分以获取有关在 Roller 内在何处配置跟踪代码的信息这个标记通常放在 HTML 头部分中
使用生成的 HTML CSS
不会产生可用于样式的标记
`#showTrackbackAutodiscovery($entry)`
论点:
$entry:WebLogentry 对象
内容提要:
为指定的 Weblog 条目显示 trackback 自动发现代码适合在一天内使用的模板
使用生成的 HTML CSS
不会产生可用于样式的标记
`#showAtomFeedsList($weblog)`
论点:
$Weblog:Weblog 对象
内容提要:
显示指向网络日志 Atom Newsfeeds 的链接列表一个用于 Entriese另一个用于你的 Weblog 中定义的每个类别中的条目
使用生成的 HTML CSS
提要列表显示为一个简单的 HTML 列表其中包含用于列表和列表项的单独样式
----
<ul class="rFeeds">
<li><a href="...">...提要名称...</a></li></ul>
----
`#showRSSFeedsList($weblog)`
$Weblog:Weblog 对象
内容提要:
显示指向网络日志的 RSS 新闻源的链接列表一个用于 Entriese另一个用于你的 Weblog 中定义的每个类别中的条目
使用生成的 HTML CSS
提要列表显示为一个简单的 HTML 列表其中包含用于列表和列表项的单独样式
----
<ul class="rFeeds">
<li><a href="...">..feed name...</a></li></ul>
----
Roller 宏就是这样在我们继续讨论附加模型之前让我们先介绍一些你可能想做的事情但这并不是一个宏——创建一个标记云
=== 显示标记云
我们还没有在 Roller 中包含一个标记云宏因为自己创建一个这样的标记云宏非常容易下面是为你的博客显示标记云的方法首先如果你还没有这样做那么定制你的主题然后你需要从你的 WebLogObject 中获得你想要显示的标签例如为了让你的 30 个最常使用的标签你可以这样做:
`#set($mytags = $model.weblog.getPopularTags(-1, 30))`
或者如果你只想在过去 90 天内使用标签你可以这样做:
`#set($mytags = $model.weblog.getPopularTags(90, 30))`
一旦你有了标签你就可以用一个 foreach 循环来显示它们例如这里有一个循环它将每个标签显示为到你的 Weblog 的链接只显示该标签中的条目它还给出了每个标记 ACSS 该类指示标记的强度该强度在 0 5 ascale 上指示标记的使用频率
----
#foreach($tag $mytags
<a class="tag s${tag.intensity}" href="$url.tag($tag.name)" title="$tag.count">
$tag.name
</a>
# 结束---
在你的博客模板中包含 #set 语句和循环你会看到一个标记云但是所有的标签都会以相同的大小和字体显示如果你想根据标签的使用频率来改变它们的大小那么你需要添加一些 CSS编辑你的 csstemplate并将其添加到比常用标签大的大小中:
----
.s1{font-size:60%;}
.s2{font-size:80%;}
.s3{font-size:100%;}
.s4{font-size:120%;}
.s5{font-size:140%;}
----
== 其他型号
网站管理员可以为 RollerWeblog 提供一些其他模型这些就是
$ 用于访问全站数据的 SITE以及用于访问 Planet Roller 数据的 Planet 模型让我们从 $SiteModel 开始
=== $ 网站
$SITE 模型提供了对全站数据的访问:来自所有 Weblog Webog 条目的聚合来自所有 Weblog 的评论列表浏览器Weblog 列表等——简而言之所有你需要的内容都可以为 Roller 构建有趣的社区首页
==== $ 网站对象
网站对象
|===
名称 | 类型 | 描述
|$site.commentcount
|
| 整个网站的评论总数
|$site.entrycount
|
| 整个网站的条目总数
|$site.usercount
|
| 整个网站的用户总数
|$site.weblogcount
|
| 整个网站的博客总数
|===
对于某些 SiteModel 方法例如hot-blogmost commoted ),返回一种特殊类型的对象用于用短名称长名称和国际化类型表示一个计数:
StatCount 对象
|===
名称 | 类型 | 描述
|$Stat.SubjectNamelong
|WebLogentry
| 统计主题的长名例如网络日志的名称
|$stat.SubjectNameshort
| 字符串
统计主题的简称如网络日志的句柄
|$stat.count
| 整数
统计值即命中数
|$stat.typekey
| 字符串
| 统计类型的 i18n
|===
==== $SITE 方法
* 寻呼机 getWebLogentriesPagerint sincedaysint max获取返回 WebLogentry 对象的寻呼机只会返回在最近几天内创建的条目并且不会超过最大项
* 寻呼机 getWebLogentriesPagerWeblog Weblogint sincedaysint max获取从一个特定的 Weblog 返回 WebLogentry 对象的寻呼机
* Pager getWebLogentriesPager[#Anchor-27]##*PagergetWebLogentriesPagerWeblog Webloguser userint sincedaysint max))* 获取从一个特定的 Weblog duser 返回 WebLogentry 对象的 Pager只会返回在最近一天创建的条目数量并且不会超过最大项
* 寻呼机 getWebLogentriesPagerWeblog WeblogUser UserStringCategoryint Sincedaysint Max从一个特定的 Weblog 和类别返回 WebLogentRyObjects 的寻呼机只会返回在最近几天内创建的项目并且不会超过最大项目
* 寻呼机 getcommentspagerint sincedaysint max获取返回注释对象的寻呼机只会返回在最近几天内创建的评论并且不会超过最大项
* 寻呼机 getUsersByletterPager字符串字母int sincedaysint max获取返回用户对象的寻呼机将只返回名称以字母开头的用户这些用户在最近几天内创建并且不超过最大项
* 寻呼机 getWebLogsByletterPagerString Letterint sincedaysint max获取返回 Weblog 对象的寻呼机将返回其 handlesstart 与提供的单一信件创建在最近一天的数目从不超过最大项目的博客如果所提供的字母参数是多个字符则只使用其第一个字符
* map getUsernameLetterMap()获取由 FirstLetter 键控的用户对象的地图
* 获取以第一个字母为键的 Weblog 对象的地图
* 列表 getUsersWeblog字符串用户名获取与指定用户关联的所有 Weblog 对象的列表
* 列表 getWeblogsusers字符串句柄获取与指定的 Weblog 关联的所有用户对象的列表
* Weblog getWeblog字符串句柄通过句柄获取 Weblog 对象
* 列出 getNewWeblogint sincedaysint max获取最新的 Weblogobjects即只有那些在最近几天内创建的
* List getNewUsersint sincedaysint max获取最新的用户对象即只有那些在最近几天内创建的对象
* 列出 getThotWeblogint sincedaysint max statcount 对象的形式获得最近的热门 Weblog但仅限于那些在最近一段时间更新的 Weblog
* 列表 getMostCommentedWeblogint sincedaysint max statcount 对象的形式获得最多的被评论的 Weblog但仅限于那些在最近几天内更新的 Weblog
* List getmostcommentedWeblogentriesList catsintsincedaysint max statcount 对象的形式获得最多的被评论的 Weblogentries但仅限于那些在最近几天内更新的
=== $Planet
Planet 模型使 Planet Roller 数据可用于 Weblog 页面它允许你显示主要的聚合即名为外部的聚合)、任何自定义组聚合提要和 RankedSubscriptions
==== 配置行星模型
Roller PlanetModel 在默认情况下是不启用的因此在你可以在 Weblog 中使用它之前你需要启用它要做到这一点你需要在 Roller 配置中定义一些属性特别是在 Roller -custom.properties 重写文件中这在 Roller 安装指南的步骤 8 和附录 B 中进行了解释
如果你想让 Planet 模型在 Weblog 页面中可用那么将 Planet 模型添加到 _Rendering 指定的模型列表中pageModels_property 通过如下方式重写 _roller-custom.properties_file 中的属性:
----
pagemodels=\org.apache Roller .ui.rendering.model.pagemodel,\org.apache Roller .ui.rendering.model.configmodel,\org.apache Roller .ui.rendering.model.utilitiesmodel,\org.apache Roller .ui.rendering.model.urlmodel,\org.apache Roller .ui.rendering.model.messagemodel,\org.apache Roller .ui.rendering.model.calendarmodel,\org.apache Roller .ui.rendering.model.menumodel,\org.apache Roller .ui.rendering.model.planetmodel
----
这只是默认 RollerProperties 文件中属性设置的副本加上 Planet 模型以粗体显示)。实际上根据在 Roller 中想要使用行星模型的位置你需要将行星模型添加到几个不同的属性中
要使 Planet 模型在所有博客中都可用你需要将其添加到以下模型列表属性中:
* pageModels:使其在博客页面中可用
* previewModels:在博客编辑器中预览条目时使其可用
要使 Planet 模型仅在首页博客中可用:
* Rendering.SiteModels:使模型在站点范围内的博客中可用
现在让我们来讨论一下行星模型中可用的对象
==== $Planet Objects
Planet 模型返回两种我们以前没有看到过的对象:PlanetSubscription 对象表示 FeedSubscription PlanetEntry 对象表示 FeedSubscription 中的一个条目)。
PlanetSubscription 对象
|===
名称 | 类型 | 描述
|$Sub.author
| 字符串
| 作者来自 Feed Header
|$Sub.Feedurl
| 字符串
| 提要的 URL
|$Sub.InboundBlogs
| 整数
| 链接到此博客的博客数量如果没有可用的 Technorati 许可证则为 0)
|$Sub.Inboundlinks
| 整数
| 此博客的链接数量如果没有 Technorati 许可证则为 0)
|$sub.lastupdated
| 日期
| 上次更新时间来自 feed header
|$sub.name
| 字符串
| 提要名称
|$sub.title
| 字符串
| 提要标题
|$sub.url
| 字符串
| Feedurl 一样
|===
小行星对象
|===
名称 | 类型 | 描述
|$entry.author
| 字符串
| 条目作者姓名
|$entry.category
|Weblogcategory
条目类别
|$entry.creator
User
| 表示作者的用户对象
|$entry.guid
| 字符串
| 输入的唯一 ID
|$entry.permalink
| 字符串
| 永久链接到条目
|$entry.pubtime
| 日期
| 发布了时间条目
|$entry.summary
| 字符串
| 条目摘要文本
|$entry.text
| 字符串
| 条目内容文本
|$entry.title
| 字符串
| 参赛作品标题
|$entry.updateTime
| 日期
| 时间条目最近一次更新
|$entry.website
|PlanetSubscription
| 属于哪个条目的订阅
|===
==== $Planet Methods
* 寻呼机 getAggregationPager 从主聚合中获取返回 PlanetEntry 对象的寻呼机只会返回在最后一天内创建的条目的天数并且永远不会超过最大值.
* Pager getAggregationPager字符串 grouphandleint sincedaysintmax获取从 SpecifiedGroup 聚合返回 PlanetEntry 对象的 Pager只会返回在最近一天创建的条目并且不会超过最大项
* 寻呼机 getFeedPager 从指定的提要获取返回 sPlanetEntry 对象的寻呼机直到最大项
* 列出 GetRankedSubscributionsint sincedaysint max),获取根据 Technorati 排名排序的所有 PlanetSubscribtion 对象将只返回更新的订阅在最后一天的天数不超过最大项目.
* 列出 GetRankedSubscriptionsStringGroupHandleint sincedaysintLength Technorati Ranking 指定的组中获取 PlanetSubscription 对象将只返回更新的订阅日期从最后一天的天数从来没有超过最大的项目
= 用户指南
Apache Roller Weblogger
:TOC:
:部门:
:imagesdir: ./images
== 概述
本文是 ApacheRoller Weblogger 的用户指南,Apache Roller Weblogger 是由 Apache 软件基金会的 Apacheroller 项目制作的基于 Java 的开源 Weblog 服务器。
对于其他主题,也有单独的指南;对于那些希望自定义网页布局和设计的人,有一个模板指南;对于那些在 Web 服务器上安装滚筒软件的人,有一个安装指南。
=== 版权和商标信息
本文件的内容以 ApacheSoftware 许可证的条款为准。
本文档中的所有商标都属于合法所有者。
=== 反馈
请将对此文档的任何评论或建议发送至:dev@roller.apache.org。
== 导言
这个用户指南描述了如何使用 ApacheRoller Weblogger OrRoller 的简称,这是一个 Web 应用程序,可以支持单个用户网络日志、数千个 Weblog 和 / 或组 Weblog。
你将学习如何注册为新用户。你将学会如何为自己或一群朋友创建一个或多个博客。你将学会如何创建、编辑和发布博客条目。我们还将讨论更高级的话题,比如调整你的博客设置,如何定制你的博客,如何管理博客页面等等。
首先,让我们来介绍一些术语,因为在网络日志中有很多行话。下面是我们在这本手册中使用的一些术语的列表,这些术语没有太多的背景资料。
* 网络日志:一组网页和 RSS/Atom 提要,显示一个或多个作者编写的网络日志、上传的图片、书签和访问者发布的评论。Weblog 条目以反向的时间顺序显示在 Weblog 的主页面和 Weblog 的提要中。
* Weblog 条目。带有标题、公开时间戳、摘要、内容和一些设置的单个 Weblog 条目,这些设置表明是否以及何时允许评论。
* 评论。访问者在网络日志上发表的评论,以及对特定的网络日志的评论。一条评论有一个电子邮件地址,一个公开时间戳和一些内容。
* Trackback。由一个远程网络日志发布的关于一个特殊的网络日志帖子的评论。trackback 存储为 roller 的注释。
* 模板。每个 Roller Weblog 都由一组 HTML 和 CSStemplates 定义,这些 HTML 和 cSStemplates 为 Weblog 提供布局和样式。通常使用 Velocity 模板语言编写模板,但其他语言也可以通过插件(例如 Groovy Server Pages、JRuby 等)编写。
* 喂。提要是最新条目、注释或其他数据的 XML 表示形式。人们可以订阅你的提要,以获得新的网络日志条目和发布的评论的通知。Roller 支持两种 RSS 和 Datom 格式的提要。
* Feed Reader。易于订阅和阅读的软件,例如 Google Reader、Net News Wire、Feed Demon 等。
* 博客客户端。软件,使它很容易张贴到你的网络日志,例如,Ecto 和火星编辑。
有了这些,我们就开始用 Roller 写博客吧。
== 开始使用 Roller
开始使用 Roller 对不同的人来说意味着不同的事情。如果你正在使用现有的 Roller 服务器,那么开始使用 Roller 意味着注册一个新用户并创建或加入一个网络日志。如果这是你应该做的,那就跳到第 3.2 节吧。如果你刚刚在自己的 Web 服务器上完成了自己的滚筒安装,那么 GettingStarted 就意味着更多一点。你还有一些后期安装工作要做。
=== 开始安装新的压路机
一旦你安装了滚筒并开始运行,你会看到一个类似于下面的屏幕,它确切地解释了你要做什么才能开始使用滚筒。首先,创建一个新用户,这样你就可以登录了。其次,登录并为自己或一个服务器创建一个网络日志,作为该网站的首页,或两者兼而有之。第三,指定哪个博客是首页博客。
image::user-guide-1-welcome.png[]
创建第一个用户。你的第一步是创建一个新用户。请记住,你创建的第一个用户将获得管理权限。你可能需要使用用户名“admin”或类似的名称。稍后,当你需要更改整个设置时,你可以作为管理用户登录。如果你愿意,你可以授予其他用户管理特权,这样他们就可以帮助完成管理职责。让我们来看看用户注册页面。你可以在下一节中看到新的用户注册格式。
创建第一个 Weblog。接下来,你应该至少创建一个 Weblog。有关 CreateWeblog 页面的更多信息,请参见下面的第 3.2 节。如果你正在运行一个个人博客网站,那么你可能会把你的博客作为你网站的首页。在这种情况下,创建一个 Weblog,使用一个普通的 Weblog 主题(即不是 roller 主页主题),并将你的 Weblog 分配为站点的首页 Weblog。
如果你正在运行一个包含多个 Weblog 的社区 Weblog 站点,那么你可能希望创建一个 Weblog 作为该站点的首页。创建一个新的网络日志,将其命名为“主”或“社区”或合适的东西,因为它的名称将出现在 URL 中。我们建议你使用 Roller 主页主题,因为它的特殊设计是作为一个 Weblog 社区的首页,将该网站的所有博客聚合在一起,但没有自己的内容。
指定一个首页网站日志。一旦你创建了一个首页博客,无论是个人博客还是社区聚合器,你都需要告诉 Roller。因此,选择你的首页网页日志,如果你正在运行一个社区网站,那么在单击“保存”之前,设置“启用聚合网站-WideFrontPage”复选框。
如果你已经读了这么多,你可能已经创建了自己的用户和网络日志,如果是这样的话,你可以跳过下一节。
=== 创建新用户和网络日志
要创建新用户,请使用注册链接,该链接可以在滚筒登录页面的右上角找到。该链接将把你带到如下所示的新用户注册页面。
image::user-guide-2-registration.png[]
新的用户注册表单很容易解释,但请记住,你的用户名是不能更改的;它是你在系统中的唯一标识。但这没关系,因为你的网名就是你的网志和订阅中会显示的名字,如果你愿意,你可以稍后更改它。
Roller 管理员可以提供(或要求)OpenID(http://openid.net/[http://openid.net])身份验证,而不是用户名和密码。使用 OpenID,你将不提供密码(因为你将登录到另一个系统进行身份验证),而只提供你的 OpenidAccount 名称,其格式将根据 OpenID 提供程序的不同而有所不同。例如,使用 Google+ 作为你的 OpenID 提供程序将产生一个类似于 https://profiles.google.com/<numeric-id>的 AccountName,其中枚举标识符可以通过将你的名字与“Google Plus”一起搜索来确定。(注意,OpenID 字符串不使用此查询返回的 theplus.google.com 域。
选择你的语言和时区。你也可以设置你的语言选择和时区,但这些值在滚动中做不了什么。你的博客的地点和时区才是真正重要的。你在这里设置的值将在你创建 Weblog 时作为你的默认值使用。
创建一个网络日志。一旦你创建了一个用户,然后登录,你会看到滚轴主菜单页面和一个问候语,上面写着:
你有一个用户帐户,但没有网络日志。你想创造一个吗?
按照这个链接创建你的第一个博客。你会看到下面的表格。
image::user-guide-3-webblog.png[]
该表格的设计目的是不言自明。请注意,除了 Weblog 句柄(Weblog 的 UniqueIdentifier)之外,你可以在以后更改所有内容。
既然你已经有了一个用户和一个博客,让我们来讨论一下如何使用滚筒界面。
=== 在滚筒里四处走动
一旦你登录了 Roller 的编辑页面,你就可以使用 Roller 的选项卡菜单找到你的方法了。为了提供一些额外的帮助,Roller 在每个编辑器页面的顶部显示了一个状态栏。
例如,下面的状态栏表示你正在登录 ASUSER’ADMIN’,而不是在编辑一个 Weblog。你可以通过点击右边的第一个链接(在你的网站上它可能不会被标记为首页)直接进入网站的首页,通过第二个链接直接进入主菜单,你可以通过注销完全退出。
image::user-guide-4-statusbar.png[]
例如,下面的状态栏表示你正在登录 ASUSER’ADMIN’,并且你正在编辑一个具有“ADMINBLOG”句柄的 Weblog。
image::user-guide-5-statusbar-webblog.png[]
如果你没有登录到 Roller,那么你可以直接访问 LoginLink,也可以使用该站点上的一个 Weblog 中的一个登录链接。登录链接的形式如下:
_http://hostname/roller-ui/login-redirect.rol_
或者,如果 Roller 是在它自己的上下文中安装的,则使用此表单:
_http://hostname/roller/roller-ui/login-redirect.rol_
你可能不需要剪切和粘贴该链接,因为大多数网络日志都会显示这样的作者菜单:
image::user-guide-6-navigation.png[]
既然我们已经介绍了注册新用户、创建新的网络日志和找到解决方法的基本知识,那么让我们开始写博客吧。
== 创建和编辑你的博客
首先,你登录到 Roller。接下来会发生什么取决于你拥有的 Weblog 的数量。如果你有一个博客,你将被直接带到该博客的新条目页面。
如果你有一个以上的博客,或者根本没有,那么你会被带到主菜单页,如下所示,这样你就可以选择要编辑和 / 或创建新的博客。
image::user-guide-7-main-menu.png[]
主菜单页列出了你所有的博客,并为每一个,显示你到它的新条目,条目,评论,主题和设置页面的链接。你也可以创建一个新的网络日志,编辑你的用户配置文件。
如果你是以全局管理员的身份登录的,那么你还将在操作侧栏中看到 aserver 管理链接。如果你启用了 Roller’Splanet 聚合器,那么你还会看到 Planet Admin LinkThere。
=== 创建和编辑一个 Weblog 条目
使用 Create&Edit->New Entry 页面(也称为 WebLogEditor 页面)来创建、编辑和发布 Weblog 条目。使用此页面(如下图 7 所示),你可以设置条目标题、类别、内容和摘要。你还可以通过在页面底部扩展“应用”插件和“高级设置”控件来设置一些高级设置。让我们回顾一下这些字段、按钮和设置。
image::user-guide-8-editor.png[]
==== Weblog 编辑器字段
让我们讨论一下新条目页面上的每个字段,这样你就知道如何使用它们了。
* 标题-每个博客条目必须有一个标题。当你选择你的标题时要小心,它将被用于你的网络日志的永久链接(最多是博客标题的前五个单词,用连字符分隔)。为了获得最佳效果,一定要使用简短的标题.不要在标题中包含任何 HTML,而只是纯文本——如果你希望标题是粗体的,那么请自定义模板,而不是在标题中嵌入 HTML。
+
要生成与实际的博客标题不同的永久链接,首先输入所需的永久链接,然后按 Save as Draft 创建永久链接。然后在发布之前,将博客标题更改为 Blogentry 所需的任何内容——永久链接不会更改。
* 状态——这个只读字段告诉你正在编辑的 Weblog 条目的当前状态。有三种可能的状态设置:
* 未保存–条目从未保存过
* 草稿——条目被保存为草稿,YourWeblog 的读者还不能看到它
* 发布–该条目已经发布,YourWeblog 的读者可以看到
* Permalink–这个只读字段是指向 YourWeblog 条目的 Permalink 链接。它是根据你保存条目时的标题(请参见上面的标题一节)设置的第一次保存条目的时间,并且它不能在以后进行更改。作为获得新的永久链接的一种解决方法,可以使用 DesiredPermalink 将博客条目的文本复制到新的博客条目中,并将发布的日期设置为原始 Blogentry 的日期(高级设置)。新的博客条目发布后,只需删除带有不希望的 URL 的旧博客条目。然而,以这种方式更改永久链接是明智的,因为所有与原始博客条目的外部链接都将被破坏。
* 类别-你可以为你的 Weblog 条目选择一个类别。类别是为那些希望按主题组织他们的 Weblog 条目的人提供的。你可以通过“类别”页面添加和删除类别。
* 标记–(可选的)除了将每个 Weblogentry 分配到一个类别之外,你还可以对它们进行标记。你可以为每个条目分配一个标记列表。你可以使用任何你想要的标记名称。用空格分隔你的标签。目前,做多词标记的唯一方法是使用一个下标栏,例如,使用 Apache Roller 标记某物,你将使用 Apache_Roller 标记。当你打字时,Roller 可能会推荐你以前用过的标签。
* 内容——这是你的 Weblog 条目的主体,格式为 HTMLFormat。我们试图通过提供两种编辑方法来简化这一过程。通过设置页面,你可以选择以下两个选项之一:
* 富文本编辑器——一种富文本编辑器,它设计的 Tomake 编辑 HTML 就像使用 MS Word 或 Open Office 一样简单。
* 文本编辑器——一个纯文本编辑器,你可以使用它来编辑你的 Weblog 条目的 Rawhtml 标记。除非你懂 HTML,否则不要使用它。
* 摘要-(可选)如果你愿意,你可以输入一个简短的摘要你的博客帖子。如果你这样做,那么简短的摘要将发布在你的网站日志的主页上,你的读者将不得不点击 Aread 更多的链接,以获得完整的内容。有些博主喜欢在他们有很长的帖子时这样做,他们不想让长的帖子占据他们博客的主页面。
==== Weblog 编辑器按钮
下面是出现在 Weblog 编辑器页面上的按钮的指南。
* 发布到 Weblog-使用此按钮将发布你的 Weblog 入口,并使其对世界可见。在发布之前,要确保你对自己的帖子满意,因为一旦某件事在网上发布,并被博客聚合和搜索引擎抓住,就真的没有办法取消它的发布。
* 提交评论——如果你只是一个有限的博主,你不会看到“发到网络日志”按钮,因为你不能发到网上。相反,你会看到一个提交评论按钮,你可以用它将你的尝试发送给你正在工作的博客的作者 / 管理员。如果他们喜欢这篇文章,他们可以发表——也可以把它还给你,供你进一步编辑。
* 另存为草稿——这将保存你的博客文章供以后编辑,但不会将其发布到 Web 上。当你在处理一个新的博客条目时,经常使用 Save as Draft,这样你就不会在网络连接中断或会话暂停的情况下丢失你的帖子。
* 删除条目——用这个来删除当前的网络日志条目,你将被要求确认。
* 完整的预览——在你把你的试卷作为草稿保存好之前,你不会看到这个按钮。它允许你在一个单独的窗口中查看条目的预览,并使用博客的布局和样式显示。
==== Weblog 编辑器插件设置
如果你扩展插件来应用控制,你会看到一组复选框,每个可用的 Weblog 条目插件都有一个复选框。检查一下你想要应用到你当前的网络日志条目中的那些。如果你有一个最喜欢的插件,一个你想在每个条目上使用的插件,那么你可以在你的博客的设置页面上将它设置为默认设置。
image::user-guide-plugin.png[]
==== Weblog 编辑器高级设置
如果你展开“高级设置”控件,你会看到下面的内容。
image::user-guide-settings.png[]
所有这些都是可选设置。
* 发布时间——如果你想将网络日志的发布时间设置为一个特定的时间,可能是将来的某个时间,你可以在这里做。
* 允许评论–此设置允许你打开 / 关闭你的 Weblog 条目的评论,并限制允许评论的天数。
* 文本从左向右读取——此设置允许你为 Weblog 条目设置从左向右读取标志。目前,没有一个 StockRoller 模板尊重此设置。
* 固定在 Main 上——只有全球管理员才会看到这个设置,这是一种表示帖子是一种特殊的公告的方式,应该固定在网站首页的顶部。头版的主题尊重这一设置。
* 附文 URL:如果你想在你的博客 RSS 提要中包含一个音频、视频或图像文件作为 p__odcast__,那么在这里输入该文件的 URL。
=== 查找和编辑网络日志条目
你的所有 Weblog 条目都保存在数据库中。一旦你的 Entriesscrolftofrontpage 或者 weblogeditor 页面的最近条目列表被删除,它们仍然可以通过显示在你的 weblog 上的下一个和上一个链接以及包含在大多数 weblog 主题中的 weblog 日历获得。
你还可以通过编辑条目页面访问条目,该页面允许你通过关键字、类别、标记、日期和状态搜索条目。
image::user-guide-9-entries.png[]
=== 管理类别
每个 Weblog 都可以使用下面所示的类别页面,定义自己独特的类别列表,用于对 Weblog 条目进行分类。当你或你的博客的另一位作者创建一个新条目时,你必须选择你定义的类别之一。
image::user-guide-10-categories.png[]
你可以使用“类别”页面添加新的类别并编辑新的类别。如果你愿意,你可以更改类别名称。你还可以删除类别,如果某个类别正在使用中,你将被要求对该类别中的条目进行 tore-categorize。
你还可以为每个类别定义图标,但是对图标图像的支持在大多数滚筒主题中都没有编码,如果你希望显示它们,则需要进行模板自定义。
=== 管理你的博客的 blogroll
Roller 使维护 Blogroll 变得很容易,即你最喜欢的 Weblog 和 Web 站点的列表,这些列表显示在你的 Weblog 的边栏中。单个 blogroll 项目称为书签。使用 create&edit:blogroll 页面在 blogroll 中添加、编辑和删除书签和书签文件夹。
image::user-guide-11-blogroll.png[]
=== 将图像和其他文件上传到你的网络日志中
如果你想上传图片或其他文件在你的博客中使用,去你的博客的“创建和编辑-> 媒体文件”页面。从那里你可以上传文件,浏览和搜索文件。你还可以管理你的文件,将其组织到目录中,并将其发布到你的网络日志中。
image::user-guide-12-media.png[]
你可以看到上面的媒体文件视图页面。下面我们将通过媒体文件查看页面和我们添加到 Weblog 编辑器中的新媒体文件浏览器,讨论你可以对媒体文件做的所有事情。
==== 如何上传文件
要上载文件,请按照页面右上角的“添加媒体文件”链接进行操作。你将看到媒体文件添加页面,如下图所示。
image::user-guide-13-add-media.png[]
你可以一次上传多达五个文件,你可以输入有关图片的信息,包括标题,说明,版权声明和标签。你可以选择哪个目录应该接收上传的图像。
你也可以决定你是否希望你的图片被包含在图库中,这意味着它们将在你的博客的媒体文件提要中提供。
在你的文件上传完成后, Roller 将向你显示你上传的文件的 UploadComplete 页面(见下图),并将在新的 Weblog 帖子中为你提供这些文件。你可以选择任何或所有的图像,也可以跳过此步骤,返回到媒体文件视图。
image::user-guide-14-upload-complete.png[]
==== 如何编辑和更新文件
从媒体文件查看页面,你可以编辑任何媒体文件,只需点击它。当你单击你将显示的媒体文件编辑页(如下).从这个页面,你可以编辑你在上传文件时输入的相同信息。
你还可以上传该文件的新版本。该文件将维护与更新前相同的 URL,因此无需担心链接损坏。如果该文件是一个图像,将为你生成一个新的缩略图,并将更新图像大小信息。
image::user-guide-15-edit-media.png[]
==== 如何使用媒体文件目录
你可以使用目录来组织你的媒体文件。你可以移动文件,而不必担心破坏任何链接,因为目录和文件名不是 URL 的一部分。
要创建一个新的目录,请在 NewDirectory 控件中输入一个新的目录名,然后单击 Create 按钮。
image::user-guide-media-directory.png[]
要导航到媒体文件视图页面中的目录,只需单击该目录。
==== 如何删除媒体文件
要删除媒体文件,请转到“媒体文件查看”页面,选择要删除的文件的切割盒,然后单击“删除”按钮。在删除执行之前,你必须确认该删除。
==== 如何删除媒体文件目录
要删除媒体文件目录,你必须先清空它们。你只能删除空的目录。
==== 如何将媒体文件发布到你的网络日志中
我们在上面解释了如何在上传过程中发布图片。从博客条目编辑页面,点击“添加媒体文件”链接位于上面和内容字段的右边。 Roller 将在内容字段中的光标位置插入媒体文件。如果插入位置有问题,请按 Ctrl-Z 取消操作,然后再试一次。
==== 如何在你的博客上发布播客
在上传非图像媒体文件(例如播客)时,Roller 为你提供了一个选项,可以使用该媒体文件(播客)创建一个新的博客条目。如果选中, Roller 将在“博客编辑”条目页面的“高级设置”部分的“PostContent”和“Enclose URL”字段中包含媒体文件。附文 URL 字段仅用于你的博客的 RSS 和 Atom 提要,它将把 podcast 作为 feedenclosure(http://en.wikipedia.org/wiki/rss_enclose)包括在内,以使 podcast 读者更容易获取它。
或者,你可以从上一节中引用的添加媒体文件链接中选择一个播客,该播客将把它的 URL 添加到 PostContent 中,然后将该 URL 复制到 Advanced Settings 部分中的 Encluse URL 字段中,如果你希望将其添加到你的博客的 RSSand/ 或 Atom 提要中。
=== 播客与 Roller
Roller 包括对 Podcasting 的支持,这是一种通过 Weblog 的 Newsfeed 分发文件的方式。通常,人们使用播客来分发音频文件,但这种技术可以用于分发任何类型的文件。专门的 Podcast 客户端软件会下载新闻提要中引用的音频文件,并将其复制到音乐播放器(例如 MP3 播放器)上。
本节假设你希望将你的播客上传到另一个服务器,一个有大量空间和带宽的服务器,而不是 Roller 。如果你想将你的播客上传到 Roller ,那么请参阅第 4.5.7 节,了解如何将媒体文件作为播客发布到你的博客中。
==== 如何用 Roller 创建播客提要
在 Roller 中,播客就像是网络日志条目的附件。以下是使用 Roller 进行播客所涉及的步骤:
* 录制一段有趣的播客(顺便说一句,这是最难的部分),然后将你的播客保存为 MP3 格式或你喜欢的任何格式。
* 将你的播客上传到某个 Web 服务器上,并记下你的播客的 URL。例如,如果你将一个文件上传到 Roller ,那么 URL 可能看起来是这样的:
_http://hostname/roller/yourname/resource/mycast.mp3_
* 创建一个新的 Roller Weblog 条目,宣布你的新播客。你可能需要提供一个链接,以便那些没有 PodcastClient 的用户可以直接点击下载。例如:
嘿,现在!我刚刚创建了我的第一个播客,你可以在这里下载:<ahref="http://hostname/roller/yourname/resource/mycast.mp3">mycast.mp3</a>
* 最重要的一步是:在 Weblog EditorPage 的下半部分,你将看到一个标记为“高级设置”的可扩展控件,单击该控件可展开该控件,并将其粘贴到 YourPodcast 的 URL 中。
* 一旦你的博客文章准备好了,将其保存为草稿或发布。一旦你完成了这个操作,你就会看到高级设置控件已经获取了你的播客的内容类型和文件大小。如果没有,则由于网络问题或错误的 URL,注册者无法访问你的播客。确保 URL 是正确的,然后再保存一次。如果你的 Podcastis OK,你会看到这样的东西:
image::user-guide-podcast.png[]
* Roller 将把播客作为 <enclosure> 添加到你的 RSS 新闻提要中。你可以查看你的 RSS Newsfeed 来检查这一点,订阅到你的提要的任何 PodcastSoftware 都会自动获取它。
< 附文网址 =“http://example.com/roller/nina/resource/mycast.mp3”
type=“audio/x-mpeg”length=“3409127”/>
=== 使用带有 Roller 的 Weblog 客户端
使用一个很好的 Weblog 客户机,比如 Ecto 或 MarsEdit,可以使华阳集团更容易地发布到你的 Roller Weblog 上。你也可以通过 Flickr.com 和 del.icio.us 等服务发布到你的网站上。这是可能的,因为 Roller 支持标准的发布协议,例如 MetaWebLog API 和 Atom 发布协议。下面是如何设置要发布到 Roller 的 Weblog 客户端。
配置用于 Roller 的 Weblog 客户端
首先,请确保在你的 Weblog 的 Weblog 设置页面中启用 Weblog 客户端 API 支持。
image::user-guide-17-api.png[]
接下来,启动你的博客客户端,找到首选项或帐户设置对话框。你需要设置以下参数:
* 用户名:你的 Roller 用户名
* 密码:你的 Roller 密码
* Blogid:你的 Roller 博客的句柄
* URL: Roller 的 Web 服务端点的 URL
请注意,你可能不需要输入你的 BlogID,因为一些 BlogClients 将登录到 Roller ,然后向你提供用户可用的 Weblog 列表。
一个 blog.sun.com 的例子。例如,如果你在 blogs.sun.com 上有一个帐户,你的用户名是 Fred,你的博客的句柄是 Fredsblog(即你的博客的 URL 是 http://blogs.sun.com/fredsblog),那么你的参数将是:
* 用户名:Fred
* 密码:(你的密码)
* Blogid:FredsBlog
* 网址:http://blogs.sun.com/ Roller -services/xmlrpc
你可能不需要输入你的 Blogid,因为一些博客客户端将登录到 Roller ,然后向你提供用户可用的博客列表。
一个 jroller.com 的例子。如果你在 JRoller.com 上有一个帐户,那么你的用户名是 Fred,你的博客的句柄是 Fredsblog(即你的 Weblog’surl 是 http://jroller.com/fredsblog),那么你的参数将是:
* 用户名:Fred
* 密码:(你的密码)
* Blogid:FredsBlog
* 网址:http://jroller.com/ Roller -services/xmlrpc
== 处理注释和 trackback
Roller 支持 Weblog 评论和 trackback,这为其他博客作者远程向你的博客添加评论提供了一条途径。默认情况下,注释和 trackback 是启用的,但是你可以在你的博客的设置页面上关闭它们。请注意,关闭注释将禁用注释和 trackback。
=== 通过电子邮件发送评论通知
如果你打算留下评论,那就打开它,花时间阅读它们,在适当的地方做出回应,当你收到垃圾邮件或其他形式的攻击性评论时,从你的博客中删除它们。如果你不知道自己什么时候收到评论,你就不能再提了,所以一定要用电子邮件通知你的评论。你可以在 WebLogSettings 页面上执行此操作。
如果你打开了电子邮件,那么每当你收到新的评论时,你就会收到一封电子邮件,电子邮件中会包含电子邮件的文本,一个指向被评论条目的链接,以及一个指向电子邮件管理页面的链接,如下所示,你可以选择批准,标记为垃圾邮件,甚至删除新的评论。
=== 评论管理
你可以使用评论页面来管理你的博客评论。你可以将评论标记为垃圾邮件或将其完全删除。你可以搜索 commentsby 关键字、日期和状态。如果你打开了评论审核功能,你会使用评论页面来批准新的评论。
image::user-guide-18-comments.png[]
关于地位的一个词
你不能编辑评论,但你可以将它们标记为垃圾邮件或不认可它们。总有一天, Roller 可能会基于标记为垃圾邮件的评论收集的数据提供一些垃圾邮件过滤,但目前,标记为垃圾邮件和不批准评论也会做同样的事情-它们会阻止该内容显示在你的 Weblog 上。
如何进入评论页面
有几种方法可以进入评论页面。你可以使用用户列表的选项卡菜单,在你的整个网络日志中管理评论。如果你已经收到了新评论的电子邮件通知,你可能会通过一个链接到达评论页面,该链接在你的邮件中发送给你。
你也可以只为一个博客管理评论。当你在编辑一个带有注释的博客条目时,你会看到一个链接,就像下面这个链接一样,在 Weblog 编辑器页面的右上角,你可以使用它来访问条目的注释。
=== 评论审核
如果你想在评论发布到你的博客之前预览并批准它们,那么你需要打开评论审核 ViaWeblog 设置页面。当启用评论审核时,每个新的评论都将被标记为“待定”和“未批准”,并且不会出现在你的博客中。要检查新的注释,请转到注释页面进行检查,并批准或删除新的注释。如果你已经启用了评论通知功能,那么确保你也启用了评论通知功能,这样你就可以知道新的评论何时到达。要缓和评论,请使用下面描述的“公司管理”页面。
如何缓和评论
* 检查每个新的评论,并决定它是否被批准显示,标记为垃圾邮件,隐藏或完全删除。
* 只有被标记为已批准且不是垃圾邮件的评论才会显示在你的博客上。因此,为每个注释设置(或取消设置)相应的复选框,或者保持它们的原样。
* 当你完成的时候。点击页面底部的“保存更改”按钮。你将看到,挂起的注释将不再被修改,而那些你标记为删除的注释将被删除。
=== 全局评论管理
如果你的用户拥有全局管理权限,那么你就可以管理整个 Roller 站点上的内容,包括每个 Weblog。要做到这一点,请转到“服务器管理:评论”页面,你将看到与特定于 Weblog 的“评论管理”页面几乎相同的 apage。
全局评论管理的局限性
你可以使用此页面标记为垃圾邮件或删除系统中的任何评论,但是你不能通过此界面更改评论的批准状态。批准用于显示的评论是各个 Weblogger 的义务和责任,因此评论批准在 Weblog 的上下文中是唯一可用的。
=== 防止网络日志垃圾邮件
有两种形式的垃圾评论会影响你的博客:
** 评论垃圾邮件:通过你的博客上的评论表单发送的垃圾邮件。有时垃圾评论是由人工添加的,有时是由称为垃圾邮件机器人的计算机程序添加的。
** trackback 垃圾邮件:通过垃圾邮件机器人发送的 trackback 发送的垃圾邮件。
幸运的是,对于每种类型的垃圾邮件都有应对措施。以下是 Roller 内置的垃圾邮件预防措施:
* 可插入注释身份验证。默认情况下, Roller 向每个评论者问一个简单的数学问题,以确保他们是一个人,而不是一个垃圾邮件机器人。你的站点管理员可以关闭此功能,或者使用另一种形式的身份验证来替换它。
* 可插入注释验证。 Roller 包括以下五个注释验证器。你的站点管理员可以调整这些验证器的设置,并可以根据 OverridingRoller 的配置属性启用 / 禁用它们(有关更多信息,请参见安装指南)。
** 多余的链接验证器将用三个以上的垃圾链接标记评论(默认:打开)
** Excess Size Validator 将任何超过 1000 个字符的评论标记为垃圾邮件(默认:打开)
** BannedWordsList 验证器将包含你的站点指定的任何不良词汇的评论标记为垃圾邮件(默认:打开)
** trackback 验证验证器将检查传入的 trackback,以确保它们链接到你。
** Akismet 验证器允许你使用 Akismet.com 垃圾邮件预防服务。
* 评论节流。如果你的网站正被垃圾邮件机器人滥用,你的网站管理员可以设置节流,这将监视滥用者,并禁止 IP 地址张贴太多的评论迅速。
但最重要的是评论要适度。
即使你已经启用了所有这些措施,你仍然应该启用电子邮件通知评论,这样你就可以不断地知道你的博客上的新评论。这些措施都不是 100% 有效的。如果你真的想在短时间内在你的 WebLogeven 上显示攻击性内容,那么就在你的 Weblog 上启用评论审核。
Roller 使用 BannedWordsList,这是一组用于检查即将到来的评论、trackback 和垃圾 URL 请求者的单词的列表。如果评论或 trackback 的名称、URL 或内容包含 BannedWordSlistWords 中的一个或与其中一个表达式匹配,则该评论或 trackback 将被标记为垃圾邮件,并且不会显示在你的 Web 日志中,除非你使用评论管理页面取消标记。
实际上,BannedWordsList 有三个层次:
** 第 1 级 BannedWordsList:这是内置的 BannedWordsList,它与 Roller 一致。这只能由对 Roller 服务器本身具有 root 访问权限的人来更改。
** 第二级 BannedWordsList:这是网站范围内的 BannedWordsList,只能由全局管理员通过服务器管理页面进行编辑。
** 级别 3BannedWordsList:Weblog 特定的 BannedWordsList,你可以在 Weblog 的 Weblog 设置页面中控制它。
根据 BannedWordsList 的所有三个级别检查传入的注释和 trackback。但是,传入的 Web 页面请求仅在级别 2 和级别 3 的 BannedWordsList 上进行检查,如果找到,将收到 403(禁用)消息。
如果你的博客上有垃圾邮件问题,你想在 BannedWordsList 中添加单词,那么请管理员为你将单词添加到 2 级 BannedWordsList 中可能会更好。这样,网站上的每一个博主都将从这一增加中受益。如果你必须自己做,下面是你的做法:
** 转到 Weblog 设置页面并向下滚动到 BannedWordSlistFields
** 输入你的垃圾信息,每行一个。
** 以左括号开头的行将被视为 regularexpressions(参见 _javax 的 Java API文档)。regex.pattern_for a guide to regular expressions)。除非你真的知道你在做什么,否则不要尝试使用正则表达式。
=== 发送 trackbacks
如果你正在写一些你在另一个博客上读到的东西,你想让那个博客的作者和读者知道你正在这样做,并且其他的博客已经启用了 trackback,那么你应该给那个博客发送一个 trackback ping。下面这个故事说明了 TrackBackworks 是如何实现的:
* 你在奥托的博客上读到了一篇有趣的博客文章。你会注意到奥托的博客条目有一个 trackback URL,所以你决定在自己的博客中写一个博客条目,而不是留下一个评论奥托的博客。你复制了那个 trackback URL(使用 alt-c,或者右击-copy 等等),因为你以后会需要它。
* 你去你的博客,写一个新的博客条目,以回应奥托的哨兵。单击“发布到网络日志”按钮来发布你的新条目。在发布之后,向下滚动新的条目页面,直到看到以下文本字段和按钮:
* 在文本字段中输入 Otto 博客条目中的 trackback URL,然后单击“发送 trackback”按钮。 Roller 将通过打印从奥托的博客服务器收到的回复来做出回应。如果 Trackback 成功了,你应该看到这样的情况:
* 现在,你应该可以在 Otto 的博客条目的评论中看到你的回溯记录了。
== 选择你的博客主题
Weblog 主题是一组模板、样式表和图像,它们决定了如何显示你的 Weblog。一个主题可以同时定义你的博客的主题和配色方案。你可以从一堆预定的主题中选一个。一些主题将允许你通过使用样式表来控制设计。如果你想定制其他主题,则需要编辑定义主题的模板。
你可以访问 Roller 的主题和模板特性,用于你的 Weblog ViaTheDesignMenu,如下所示:
image::user-guide-20-design-menu.png[]
主题菜单将引导你到主题选择器页面,如下所示。使用这个页面,你可以为你的博客选择一个或多个不同的主题。如果没有一个主题对你有吸引力,那么就和你的网站管理员谈谈获得或开发一些额外的主题。 Roller 支持项目是一个你可以获得额外主题(_http:// Roller )的地方。dev.java.net_,而不是 Apache 站点)。
image::user-guide-design-theme.png[]
有关自定义 Roller 主题的更多信息,请参阅 TemplateGuide。
== 管理你的 Weblog 首选项
作为一个 Roller 用户,你可以自由地自定义你希望的网络日志的设置。当你建立你的 Roller 用户帐户时,你可以为你的网站选择十几个股票主题中的一个。稍后,你可以使用主题切换器切换到不同的主题。或者,如果你了解 HTML 和 CSS,你可以通过修改构成你的网站的页面模板并添加新的页面来自定义你的 Web 日志的外观和布局。最重要的是,你可以通过基于 Web 的 Roller 编辑器 UI 来完成所有这些工作。
=== 网络日志设置
Preferences:Settings 页面允许你为你的 Weblog 设置配置参数。
下面是对网络日志中每个设置的解释。
首选项:设置页面:
==== 一般设置
image::user-guide-settings.png[]
* 标题-你的网络日志的标题可能包括 HTML,但 HTML 将被剥离出你的 RSS 提要。你可以使用表达式 #showWebSitetitle()在页面模板中访问标题。
* 标语–简短的描述或副标题的你的博客。可能包括 HTML,但 HTML 将在你的 RSS 提要中被删除。你可以使用表达式 _#showWebSiteDescription()_ 在页面模板中加入我们的标语。
* 图标-图片文件名(例如:thumbnail.jpg)或图片 URL(例如:http://yoursite/thumbnail.com),显示在一些默认的主题上。你需要通过 create&edit:file uploads tabfirst 上传图片。
* 关于你的博客——对博客或博客作者的更详细的描述,显示在一些默认的主题上。
* 博客所有者的电子邮件地址:输入你希望人们用来联系你博客的负责人的电子邮件地址;通常是你。为了阻止垃圾邮件发送者,当你的电子邮件地址显示在你的博客上时,你的电子邮件地址就会变得模糊不清。请输入一个有效的地址,否则 Roller 的电子邮件功能将无法工作。
* 要使用的 Weblog 编辑器页面-选择一个 Weblog 编辑器页面,Someare rich -文本编辑器:
** 编辑器-text.jsp:简单的文本编辑器,必须输入 HTML
** 编辑器-rte.jsp: rich 文本编辑器(适用于 Firefox 和 IE,但不适用于 Safari)
* Weblog 处于活动状态:取消选中此复选框,以表明你的 Weblogis 不再处于活动状态,并且不应出现在网站上的热门博客和其他 Webloglisting 中。如果你休了很长时间的假,或者由于其他原因决定停止更新你的博客,你可能会想要这么做。
* 要在 Weblog 上显示的条目数量:输入要在 Weblog 上显示的条目的最大数量。
==== 国际化设置
image::user-guide-internationalization.png[]
* 我用多种语言发布我的 Weblog:如果你使用多种语言,并且希望为你的 Weblog 条目指定一种语言区域设置,请选中此复选框。
* 在我的主页上显示我所有语言的博客条目:如果你希望你的博客主页以所有语言显示你的帖子,请选中此框。如果你不检查它,那么读者将只会在你的默认语言环境中看到 Weblogentry。
* 区域设置你的 Weblog 的默认区域设置。
* 时区:在你的博客中使用的时区。
==== 注释和默认注释设置
image::user-guide-comments.png[]
* 允许对你的博客发表评论吗?-选中此框,允许访问者在你的博客上留下评论。
* 适度的评论–选中此框以启用评论审核(即,你必须在显示每个评论之前批准每个评论)。
请注意,只有在 Roller Administratorhas 为用户博客启用了电子邮件通知(参见第 9.2 节,RollerAdministration)时,下面的两个选项才是可见的:
* 电子邮件通知评论?-选中此框可接收每个新评论的电子邮件通知。
* 默认的 from 电子邮件地址用于评论——这将作为 Roller 发送的评论电子邮件中的 from 地址。
* 默认情况下,允许对新条目进行注释——选中此框可在你的博客上启用注释。你还可以控制每个单独的 Weblog 条目上的注释。
* 允许对新条目发表评论的默认时间——选择允许对新博客条目发表评论的默认时间。也可以使用新 entrypage 的“注释设置”部分重写此设置。
* 将注释默认值应用于所有现有条目?-如果你选中此框,当你单击“保存”按钮时,你已设置的默认注释将应用于所有现有的注释。
==== Weblog 客户端 API
image::user-guide-17-api.png[]
* 为你的博客启用 Blogger API-设置为 TRUE,以便通过 MetaweBlog API 启用网络日志。这将允许你使用像 Ecto 这样的 handyblogging 客户机发布到你的 Weblog。
* 通过 Blogger API 接收的帖子的类别-选择通过 Blogger API 接收的帖子的类别。这只适用于 youblog 客户端不支持类别的情况。
==== 格式化
image::user-guide-formatting.png[]
* 默认条目格式化程序:这是在新的 Weblog 条目上默认启用的插件列表。
==== 垃圾邮件预防
image::user-guide-spam.png[]
* 忽略包含任何这些单词的传入 URL-你可以使用它来筛选出接受哪些评论者、trackback 和 referrers(Web 页面请求者)。See section
[link:#5.5.Preventing%20weblog%20spam%20%7Coutline[5.5]]获取更多信息
有关防止垃圾邮件的信息。
==== 网络分析
如果你希望使用诸如 Google Analytics 之类的 Web 分析软件工具(这里提供了更完整的服务列表:http://en.wikipedia.org/wiki/list_of_web_analytics_software)来跟踪博客阅读器,你可以将你的跟踪代码(通常是一个 JavaScriptsNippet,包括包含它的 <script> 元素)放置在该字段中。然后,将“#showanalyticstrackingcode($model.weblog)”宏添加到博客模板中的一个适当区域(HTML<head/> 部分是一个好地方),该跟踪代码将在你的博客中处于活动状态。(大多数(如果不是全部的话)预先打包了 Roller 的博客模板都已经有了这个宏;如果没有提供跟踪代码,它将不会输出任何东西。
只有当 BlogServer 管理员激活了该选项时,该选项才可用;或者,如果管理员为博客所有者启用了模板定制,则可以将跟踪代码直接放置在博客模板中。博客服务器管理员可能会配置一个博客服务器级别的默认跟踪键,它将为所有博客或仅为尚未覆盖此默认键的博客保留。
=== Weblog 成员:管理一个组博客
要创建一个小组博客,可以创建一个新的博客,或者登录到你希望成员贡献的现有博客中。创建群组博客的 Weblog 与创建个人博客是一样的(有关说明,请参见 sectionhttp://www.rollerweblogger.org/wiki/wiki.jsp?page=userguide_2.x#ref-userguide_2.x-3[ Roller ])。导航到“成员”菜单项
首选项选项卡。Preferences:Members 页面允许 Weblog 管理员邀请成员到组博客并管理组博客的用户访问权限。
image::user-guide-21-member.png[]
你可以使用 Invite New Member 链接来邀请任何 roller 用户加入你的 Weblog,但是在这样做之前,你应该了解 Weblog 成员允许的三个不同的权限级别。它们是:
* 管理员:管理员可以创建 / 编辑 Weblog 条目并将它们发布到 Web 上。他们还可以通过更改主题、编辑定义博客外观的页面模板以及管理博客的用户来管理博客。Roller 将授予你在你创建的任何网络日志中的管理权限。管理员用户可以同时看到创建和编辑选项卡和首选项选项卡的 Roller。
* 作者:作者权限允许用户创建条目、编辑和上传文件。但作者不能更改博客设置、修改主题或管理用户。作者可以看到 Weblog Create&Edit 选项卡,但不能看到 Weblog Preferences 选项卡。
* 有限的:有限的博客作者可以创建和编辑博客条目,并将其保存为草稿,但不能将其发布到 Web 上。
从右边的导航中选择 Invite New Member,以邀请管理员、作者和有限的作者加入组博客。你需要知道用户的个人博客用户名,才能在用户列表中找到他们,你可以在列表中滚动,但是最好输入他们的用户名来定位他们。通过选择 admin、author 或 limited 来设置用户权限。点击发送邀请。如果 Roller 没有被配置为与邮件服务器对话,那么你可能会收到以下消息:
用户成功被邀请。
错误:由于滚筒配置或邮件服务器问题,未发送通知电子邮件.
只要第一条消息出现,邀请就成功了。当用户登录到博客网站时,他们会在下面的截图中看到邮件显示,要求他们接受或拒绝你的邀请。
一旦用户成为你的博客的成员,你就可以更改他们的权限。只需单击表格中相应的单选按钮并单击
保存按钮。你也可以将用户从网站中删除,但请注意,你不能减少自己的权限或将自己从网络日志中删除。
接受或拒绝团体博客邀请
如果你被邀请成为一个小组博客的成员,邀请将出现在主菜单页的顶部。示例:
image::user-guide-22-invite-member.png[]
点击“接受”成为群组博客的一员,或者点击“拒绝”来拒绝邀请。
为小组博客撰稿
一旦你是一个小组博客的成员,贡献就像创建博客条目内容一样容易。要访问群组博客,请从
主菜单导航到你想要贡献的群组博客,并选择以下任何一项:新建条目、编辑条目、设置(仅限 WebLogAdmins)。
对于参与多个 Weblogs 的用户来说,重要的是要注意,主菜单页是如何在可以编写的各种 Weblogs 之间切换的。主菜单将始终向你显示你正在参与哪些 Weblog,以及你在每个 Weblog 上拥有哪些特权。
从团体博客辞职
要从群组博客中辞职,请登录主菜单页,导航到你希望辞职的博客信息。选择“辞职”。
== 使用 Weblog ping
Weblog 更新消息为你提供了一种方法,可以通知聚合和索引站点(例如 weblog.com、technorati 和 javablog.com)你的 Weblog 已更改,以便他们从你的 RSS 提要中获取你的最新内容。
Roller 支持传统的 XML-RPC Weblog 更新 ping 机制,这是许多站点为此类通知所采用的机制。
=== 用聚合器注册
一般来说,聚合网站首先需要你在他们的网站上注册你的博客。在此注册过程中,你通常为你的 Weblog 提供 HTTP URL 和 RSS 提要 URL。这是非常重要的,因为 ping 消息仅传递你站点的普通 HTTP URL,并且站点将使用它来查找要从其中获取的注册的 RSS Feedurl。
接受 ping 通知的聚合网站通常会发布 ping URL,用于在其(人类可读的)网站上 ping 其网站。一旦你使用聚合器注册了你的网站,你就可以设置你的网络日志来向该网站发送 ping。
=== Ping 目标,常见的和自定义的
你可以设置滚筒服务器,以便在你将发布的更新发布到你的网络日志时,自动 ping 你所选择的站点。
Roller 使用术语 ping target 来引用接受 Weblog 更新 ping 通知的站点,例如 AnAggregator。一个 ping targetis 配置了一个(显示)名称和 ping 地址。在向站点发送 ping 之前,必须在 roller 中为站点配置 pingtarget。Roller 预装了多路复用目标,Roller 管理员可以根据需要配置额外的目标。
=== 设置自动 ping
一旦为你希望添加的站点配置了 ping 目标,你就可以使用 weblog:pings 页面(如下所示)来启用自动 ping 并发送手动 ping。
image::user-guide-23-ping.png[]
要启用对 ping 目标的自动 ping,请在页面上找到 ping 目标,并单击 automatic 列中的 enable 链接。Statusindicator 打开,链接更改为禁用(如上面屏幕截图中的某些站点所示)。要禁用自动 ping 到 aping target,请单击“自动”列中的“禁用”链接。StatusinDicator 将关闭,链接将更改为启用。
当你为 ping 目标启用了自动 ping 时,无论何时发布新的 WebLogentry 或更新已发布的 Weblog 条目,Roller 都会自动向该站点发送 ping。
注意:实际上,Roller 会在后台排队发送请求并处理这个请求,这样你就可以继续写博客了。ping 队列在站点管理员配置的间隔时间内进行处理;在 defaultConfiguration 中,此间隔时间为 5 分钟。在聚合器站点暂时无法访问的情况下,Roller 将重新请求 ping 请求,并在随后的队列中重试 ping;在默认配置中,ping 的请求最多为 3 次 ping 尝试。
=== 发送手动 ping
你还可以使用 Weblog:pings 页面上列出的目标的 Send PingNow 链接向 ping 目标发送手动 ping。当你手动 ping ping 时,ping 不会排队,它会立即被发送,并且只会被吸引一次。Roller 将显示 ping 产生的响应状态(成功或 aFailure 消息)。
你不需要启用自动 pinging 才能发送人工消息。你可以发送一个手动 ping,无论你是否支持该目标的自动 ping。
如果你很少对站点进行 ping,或者你感觉有点不耐烦,并且不想等待下一个队列处理间隔,那么可以使用手动 ping。
如果你没有找到你希望 ping 的站点的 ping 目标,那么你可以请求管理员为所有可用的博客添加一个新的 ping 目标。有关添加 pingtargets 的更多信息,请参见第 10 章。
=== 有关使用聚合器注册的更多信息
在使用聚合器注册时,通常需要提供两条信息作为注册的一部分,即博客的基本 URL 和 RSS 提要 URL。一定要阅读聚合器的文档和注册方面的帮助。
对于滚筒式网络日志,你可以通过查看你的网络日志并将该 URL 带到只跟随你的网络日志的 shandle 的点来获得你的网络日志的基本 URL。(换句话说,它应该以 page/_handlenamehere_ 结束)。
整个提要的 RSS 提要 URL 可以通过用 RSS 替换 weblog 的 URL 中的 _page_ 来获得。当你把鼠标放在你的网页页面上的 RSS 徽章(橙色的 XML 框)上时,大多数浏览器都会在状态栏中显示这个链接。
你还可以使用特定于类别的提要,这对于使用 java.blog 之类的局部聚合器进行注册非常有用。要获得一个特定类别的 feed URL,只需附加?catname=/categoryname 替换类别名称。“基本”主题在右侧竖条中的 RSS 徽章下方有一些类别的 RSS 提要。
一些聚合器还可以抓取(读取和解析 YourWeblog 的 HTML),以便在提供 HTML URL 时自动发现提要 URL。默认的滚筒主题模板页面包含标记形式的提示,许多站点可以使用这些提示来确定是否适合使用。
== 滚筒管理
Roller 用户指南的这一部分是为具有全局管理角色的用户提供的。你是如何获得行政职位的?在轮滑系统中创建的第一个用户获得该角色,然后可以通过
全局管理-> 用户管理页面,这恰好是我们将在本节中讨论的第一个主题。
我们还将介绍如何通过 GlobalAdmin->Configuration 页面配置 Roller,以及如何通过 Global Admin->Ping Targets 页面配置 Roller 的自定义 pingfacility。
=== 管理用户
如下所示的全局管理-> 用户管理页面允许你创建用户、编辑用户和创建新用户。
image::user-guide-24-user-admin.png[]
要查找用户,只需在“用户名”字段中的“用户名”中输入该用户的用户名,然后单击“编辑”按钮。如果你不知道用户的用户名,那么开始输入你认为可能是她的用户名或电子邮件地址的第一个字母,列表框将填充所有用户名或电子邮件地址匹配的用户。当你在列表框中看到你想要的用户时,单击她,然后单击 Edit 按钮来编辑她的用户信息。
你还可以通过单击“创建新用户”链接来创建新用户。
当用户被加载到全局管理-> 用户管理页面时,或者当你创建一个新用户时,你将看到如下所示的表单。你可以设置用户的全名、电子邮件地址、地区和时区。如果同时输入密码和密码确认字段,也可以重新设置用户的密码。
image::user-guide-25-user-admin.png[]
你还可以禁用用户,这将阻止用户登录到 Roller。
或者,你也可以选中 Administrator 复选框,以授予授予 UserGlobal 管理权限。
在页面的底部,有一个用户 Weblog 部分,你可以使用它来编辑用户的任何 Weblog。这个功能是为了方便全球管理员帮助用户使用 Roller 的任何功能,所以请仅出于这个原因使用它;不要使用它来侵犯用户的隐私。
注意:你可以禁用用户,但无法从 roller 中删除用户。
=== 配置滚筒
全局管理-> 配置页面允许你设置 Roller 的运行时配置属性。这是一个很大的页面,因此我们将在下面单独讨论一节。
image::user-guide-26-site-setting.png[]
* 网站名称:网站名称,将包括在网站范围的新闻提要(RSS 和 Atom)和滚筒的默认首页上。
* 短名称:站点的短名称,作为出现在 RolleEditor/Admin UI 中每个页面顶部的横幅中的链接包含。
* 网站描述:网站的描述,包括在网站-WideNewsfeeds(RSS 和 Atom)和网站的默认首页。
* 网站管理员的电子邮件配置滚筒地址:管理员的电子邮件地址,以包括在侧面新闻源(RSS 和 Atom)
* 将 weblog 作为 frontpage blog 的句柄:指定要显示为此滚动站点的 frontpage 的 weblog。
* 启用聚合的 frontpage feeds:如果你希望 frontpage 博客的 RSS 和 Atom feeds 是 Roller 站点上所有博客的聚合,请将此设置为真。
* 此站点的绝对 URL:用作创建绝对 URL 的基础。Roller 的行星聚合器功能所需。
* 暂停所有 ping 处理:允许你关闭系统中所有 weblog 的所有(传出的)weblog ping。
* 启用调试模式:当前未使用.
image::user-guide-27-comments.png[]
* 允许新用户:设置此项以使注册成为主页上的新用户链接。如果你关闭了用户创建,那么你将只能通过全局管理-> 用户管理页面来创建新用户。
* 外部注册 URL:控制 Roller 的“Registeras New Users”链接的 URL。如果你使用一个外部系统来创建轮滑用户和博客,请在此设置该系统的 URL。
* 编辑页面:这是将提供给 Touser 的 Weblog 编辑器的列表。
* 允许 Weblog 注释:通过取消此设置,你可以关闭系统中所有 Weblog 上的 Weblog 注释。
* 允许 trackback:通过取消此设置,你可以关闭系统中所有 Weblog 上的 incomingtrackback。
* 自动格式化注释:如果这是在,Roller 将自动格式化评论,在适当的地方添加换行符。
* Escape Comment HTML:通过设置此设置,你可以禁止 HTML incomments,从而保护你的站点免受恶意 JavaScript 和某些形式的跨站点脚本的攻击。
* 注释的电子邮件通知:将其设置为启用新注释的电子邮件通知。除非你按照 Roller 安装指南中的说明,正确配置用于发送电子邮件的 droller,否则将不会起作用。
* 启用 trackback 链接的验证:trackback 验证检查每个传入的 trackback,以验证发送 trackback 的站点是否确实链接到作为 trackback 目标的特定 Weblog 条目。
image::user-guide-28-feed.png[]
* 默认的条目数量:出现 Ineach NewsFeed 的默认条目数量(RSS 和 Atom)。
* 条目的最大数量:每个新闻提要(RSS 和 Atom)中要分配的条目的最大数量。
* 为浏览器显示样式的新闻源:设置为 True,以支持用户友好的 RSS 和 Atom Feed 显示,这样当用户在浏览器中加载该提要时,就不会看到原始的 XMLfeed。
image::user-guide-29-fileupload.png[]
* 启用文件上传:是否允许用户上传文件?
* 允许的扩展名:以逗号分隔的允许用户上传的文件扩展名列表。
* 禁止的扩展名:以逗号分隔的文件扩展名列表,用户不允许上传。
* 最大文件大小(MB):允许用户访问的最大文件大小。
* 最大目录大小(MB):每个用户上传的总目录大小。
如果你希望激活谷歌分析或其他跟踪服务,WE 分析部分允许你提供一个 JavaScript 片段。你在此放置的值将对所有博客都有效,除非你在本节中启用个人博客覆盖选项;在后一种情况下,默认键将仅用于未定义自己的博客。请注意,如果启用自定义主题(在配置页面的“主题设置”部分),即使个别重写被禁止,BloggerScan 仍然会在其博客模板中放置自己的跟踪代码。
== Weblog 更新 ping 管理
这一部分是为 Roller 管理员准备的,描述了 Theroller Weblog 更新 ping 功能的工作方式以及如何配置它和 DadMinister。
=== 创建和编辑公共 ping 目标
常见的 ping 目标是所有用户共享的 ping 目标。你可以使用全局管理->pingtargets 页面创建和编辑公共 ping 目标。
image::user-guide-30-ping.png[]
你可以以与常规用户创建和编辑自定义 ping 目标相同的方式创建和编辑公共 ping,但是请记住,公共 pingtarget 是在所有用户之间共享的,并且你的更改会影响使用 ping 目标的典型者。管理员应该确保在创建新的公共 ping 目标之后对它们进行测试。
在添加 ping 目标之前,管理员必须确定你希望 ping 的站点的属性 URL。这些信息可以从聚合器的网站或其他知识来源获得。
很难找到聚合器的文档,这些文档提供了用于通知其站点的特定 URL。通常,聚合器会在其网站上的一个主题(提供有关注册提要的帮助)下列出此内容,或者在一个主题(为开发人员提供信息)下列出此内容。请记住,有些聚合器只使用定期轮询,根本不接受 pingnotification。如果你在聚合器的网站上找不到任何关于 ping 的信息,该网站可能不支持 ping。
单击“添加新建”按钮以添加新的 ping 目标。这将带来一个具有名称字段和 PING URL 字段的表单。填入这两个字段,然后单击“保存”按钮。
image::user-guide-31-add-ping.png[]
一旦创建了新的 ping 目标,它将在其 weblog:pings 页面上的所有博客中列出,默认激活状态由管理员定义。在这个页面中,个人用户可以为自己的博客覆盖 ping 目标的启用状态,并向新的目标发送手动 ping。
=== Roller 如何处理 Weblog 更新 ping
Roller 在后台处理 Weblog 更新消息。当用户更新他或她的 Weblog 时,Roller 会自动在队列中对任何需要删除的 ping 进行排队。Roller 只保留一个用于 agiven 用户 Weblog 和 ping 目标的 ping 队列条目。在处理 ping 之前对 Weblogg 进行的后续更新不会导致额外的 pingsto 排队。
Roller 每隔一段时间就会在 ping 队列中进行一次完整的传递。(这个间隔的配置将在下面讨论)在每一次通过中,Roller 将尝试发送每一个排队的 ping 请求一次。如果任何发送失败(如果该失败似乎是瞬时的),则 PingRequest 将被重新排队,直到 Ping 成功或已配置了一定数量的尝试。请注意,当 ping 请求失败并重新排队时,只有在随后的 ping 通过时才会再次对其进行处理。如果试图达到给定的 ping 目标的次数达到最大值而没有成功,则会记录错误消息并删除 ping 请求。
目前还没有一种机制来提醒用户 PingTargets 失败(尽管我们计划在后续版本中进行一些改进,在 Weblog Preferences->Pings 页面上提供条件信息,并提供一种失效策略来停用持续失败的 PingTargets)。
=== 配置属性控制 ping 处理
这些属性控制 ping 队列的处理。它们在 roller.properties 文件中进行了配置。
QueueProcessingIntervalmins 在队列处理运行之间以分钟为单位的间隔。这个值必须在 0 到 120 的范围内。默认值是 5 分钟。我们认为默认值应该对大多数网站有效,对大多数用户也是可以接受的。在给定的时间间隔内,用户浏览或更新条目的数量决定了队列的长度,而 Roller 需要足够的时间在一个时间间隔内处理队列一次。我们认为,除了最大和最活跃的网站之外,如果需要,它可能会降低到 1 分钟。
重要的是:值 0(零)有特殊的含义。如果处理间隔设置为 0,则在服务器上禁用 ping 队列处理。这可以用来排除除一台主机以外的所有主机在多个滚筒服务器共享一个数据库模式的环境中发送 ping。确保在群集中保留一个处理 ping 队列的主机!如果集群中的多个主机处理 pingqueue,你可能会发送重复的 ping,失败的 ping 请求可能会比预期的最大值(由 ext 参数配置)更快地退出队列。如果集群中没有主机处理 ping 队列,则自动 ping 请求将在队列中累积,这将最终导致数据库空间用完,因此不要试图将其作为禁用 ping 功能的工具。你可以使用下面几节中描述的属性禁用 ping 特性。
在 ping 请求不再被重新请求并从队列中删除之前,ping 尝试的最大次数。默认值是 3。我们认为这个值对大多数网站来说都很好。
=== 暂停所有 ping 处理
管理员可以在运行时通过检查挂起的 ping 处理来挂起所有的 ping 处理吗?在全局 admin->configuration 页面上设置 sheading 并保存该表单的网站设置下的复选框。
设置此复选框后,所有 ping 处理都将被挂起。新的自动 ping 请求不会被添加到队列中,并且队列中现有的 Entrieson 也不会被处理。手动 ping 也不会被发送;它们会导致一条消息,告诉用户 ping 处理已经暂停。暂停 ping 处理适用于在遇到问题时暂时停止所有 ping 处理。
取消选中复选框并保存将允许恢复正常的 ping 处理。然而,请注意,在暂停处理期间更新的 Weblog 的自动分配将永远不会排队,因此也永远不会发送,但是在暂停之前排队的 ping 将在暂停解除后发送。
=== 控制和禁用 ping 的使用
由于使用 ping 目标会导致出站网络连接到 ping 站点,因此一些管理员可能不希望允许用户创建自己的自定义 ping 目标。可以在整个站点上启用或禁用自定义 ping 目标的使用,也可以禁用 Allping 使用。下面的两个属性用于控制这一点。
pings.disallowcustomtargets。此属性控制是否允许用户创建自定义 ping 目标。如果设置为 true,则删除所有存在的自定义 ping 目标,并禁用 weblog:customping targetspage 和相关操作,以防止配置自定义 ping 目标。注意:将此设置为 TrueThis 将导致 Roller 服务器删除用户在下一次启动 Roller 时创建的任何自定义 ping 目标。
管理员也可能希望完全禁用 ping 功能。下面的属性与上面的属性一起使用,可以用来实现这一点。
pings.禁用用法。此属性控制是否允许用户设置自动 ping 或发送手动 ping。如果设置为真,则删除所有现有的自动 ping 配置(即禁用),禁用 Weblog 首选项->pings 页面和相关操作,从而防止普通用户使用 ping 功能。注意:__ 将此设置为 true 将导致 Roller 服务器在下一次启动 Roller 时删除用户配置的所有自动取值。
如果上述两个属性都设置为 true,那么对于普通用户,所有 pingfunctionality 将被有效地禁用。全局 admin:pingTargets 页面仍然可以访问(对于管理员);如果你愿意,可以使用该页面清除任何公共目标。没有用户(包括管理员)将能够配置自动 ping 或发送 ping。ping 队列处理继续进行,但队列将始终为空;在这种情况下,你可以安全地禁用 ping 队列处理(通过将处理间隔设置为零)。
=== 公共 ping 目标的初始化
公共 ping 目标的初始集由以下配置属性确定。
第一个目标是共同目标。此值用于初始化 setof 公共 ping 目标。该值由逗号分隔的 ping 目标列表组成,其中每个 ping 目标在表单中指定
{{name}{url}}
每当 Roller 启动并找到公共 ping 目标的空列表时,都会使用该值。通常情况下,这只是 Roller 第一次在新的或升级的数据库上启动;但是请注意,如果你真的想维护一个包含公共 ping 目标的空列表,则需要注释掉这个值或将其设置为空字符串。
== Weblog 导出
Roller 包含一个可选的 Weblog 导出功能,允许你将你的 Weblog 条目和上传的媒体文件导出为与 WordPress 和 MovableType 兼容的格式。你可以使用 Create&Edit->Export 菜单来执行此操作。单击其中一个 ExportButton 时,将提示你下载结果文件。
启用 Weblog 导出
导出是默认禁用的可选功能。
如果你在 Roller 中没有看到它,请将 weblog.export.enabled 属性设置为 true,作为你的 Roller 管理员来启用它
roller-custom.properties 文件。
== 行星滚筒管理
Roller 包含一个名为 Planet Roller 的聚合器,它使你能够将来自 Roller 服务器的 Weblog 与托管在其他地方的 Weblog 聚合在一起。你可以创建多个聚合组,每个聚合组都有自己的一组提要,你可以在你的 Weblog 页面上显示聚合组,Roller 为你创建的每个组提供一个 RSS 提要。
Roller 的聚合器默认情况下不启用。如果你想使用它,你必须要求网站管理员为你启用和配置它。有关该主题的更多信息,请参阅滚筒安装指南。
=== 配置行星压路机
如果你已经启用了 Planet,当你以全球管理员的身份登录时,你会在滚筒主菜单页面上看到 Planet Administration 链接。单击该链接可查看 Planet Admin->Configuration 页面,如下图所示。
image::user-guide-32-planet-config.png[]
要配置 Planet Roller,你必须:
* 确保你的站点在站点设置部分的 GlobalAdmin->Configuration 页面中有一个绝对 URL。
* 如果你支持代理,则必须在
Planet Admin-> 配置页面。
=== 将外部 Weblog 添加到 Planet Roller
Planet Roller 允许你创建多个聚集组,每个聚集组包含一组不同的提要,但也有一个特殊的组,即由 Roller 管理的外部组。外部组包括你的滚筒服务器上的所有 Weblog 以及你选择添加的任何外部 HostedWeblog。外部组的 RSS 提要在 /planetrss 可用,因此在默认的滚筒安装中,其 URL 将为:
http://localhost:8080/roller/planetrss
本节描述如何使用 planetadmin-> 订阅页面添加和删除日志,如下所示。
image::user-guide-33-subscription.png[]
将外部网络日志添加到行星辊
要向 Planet 添加外部托管的 Weblog,请使用 PlanetAdmin-> 订阅页面。输入标题、NewsFeed URL 和 WebsiteURL,然后单击“保存”按钮。
注意:Planet Roller 只支持包含入门级别日期信息的 Atom 和 RSS 新闻源。如果你输入的订阅不包含日期,Planet Roller 将接受它,但你可能不会从提要中看到附件,因为 Roller 将假设其条目是 Leastone Day Old。
从行星滚筒上删除外部 Weblog
你可以选择一个现有的订阅并编辑它或删除它。在下一个调度刷新条目任务运行之前,首页上不会出现明显的变化。
=== 在 Planet Roller 中添加自定义组
你还可以添加自定义聚合组,Planet Roller 将为你添加的每个组提供一个 RSS 新闻源。例如,如果你添加了带有句柄音乐和政治的组,那么你将在这样的 URL 中获得两个提要:
http://localhost:8080/roller/planetrss?group=music
http://localhost:8080/roller/planetrss?group=politics
要添加新的自定义组,只需使用 Planet admin->CustomGroupSpage,如下所示。
要创建自定义组
进入 Planet Admin->Custom Group 页面,输入标题和该组的标题,该标题适合在该组的 RSS 提要中显示。输入一个句柄,一个组的单词名,你将使用它在页面模板中引用该组。当你重做的时候,点击保存按钮
你将看到新的组出现在现有的 CustomAggregationGroups 表中。单击新组的订阅图标,你将被带到 Planet Admin->Subscribts 页面,这样你就可以将订阅添加到该组。
输入你想要添加的提要的标题、新闻提要 URL 和网站 URL,然后单击“保存”按钮将其添加到提要列表中。对于你想要添加到群组中的每一项订阅,都要重复一遍。
# Apache Roller
[Apache Roller](http://roller.apache.org) is a Java-based, full-featured, multi-user and group-blog server suitable for blog sites large and small.
Roller is typically run with Apache Tomcat and MySQL.
Roller is made up of the following Maven projects:
* _roller-project_: Top level project
* _app_: Roller Weblogger webapp, JSP pages, Velocity templates
* _assembly-release_: Used to create official distributions of Roller
* _docs_: Roller documentation in ODT format
* _it-selenium_: Integrated browser tests for Roller using Selenium
## Documentation
The Roller Install, User and Template Guides are available in ODT format (for OpenOffice or LibraOffice):
* <https://github.com/apache/roller/tree/master/docs>
## For more information
Hit the Roller Confluence wiki:
* How to build and run Roller: <https://cwiki.apache.org/confluence/x/EM4>
* How to contribute to Roller: <https://cwiki.apache.org/confluence/x/2hsB>
* How to make a release of Roller: <https://cwiki.apache.org/confluence/x/gycB>
* Other developer resources: <https://cwiki.apache.org/confluence/x/D84>
## Installing Roller
If you want to run Roller in production, then you should down load the latest official release and install it by following the Installation Guide, which you can find at the documentation link: <https://github.com/apache/roller/tree/master/docs>.
## Quick start: Running via Maven
You probably should not run Roller in production using this technique, but it's a relatively easy way to try Roller for yourself.
Assuming you've got a UNIX shell, Java, Maven and Git:
Get the code:
$ git clone https://github.com/apache/roller.git
Compile and build Roller:
$ cd roller
$ mvn -DskipTests=true install
Run Roller in Jetty with an embedded Derby database (for testing only):
$ mvn jetty:run
Once Jetty is up and running browse to <http://localhost:8080/roller> to try to Roller.
## Quick start: running via Docker
Another way to try Roller is to use Docker.
This is actually easier than running via Maven because you do not need Maven or Java.
If you've got Docker, here's how you can run Roller for demo purposes.
Get the code:
$ git clone https://github.com/apache/roller.git
Run Docker Compose to build and launch Roller along with a PostgreSQL database:
$ cd roller
$ docker-compose up
It will take a while to build and start the Docker image.
Once it's done browse to <http://localhost:8080/roller> to try Roller.
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册