Adding alt router

Setting up example routing

Adding routing spike

Topology proof of concept

Add breadcrumb

Add sections menu

Add App wrapper

Rebase and remove menu placeholder

Sort out services routes

Add all exisiting routes

Linting

Tests

Remove bold font

Change services topology and list pathnames

Remove console.logs

Rebuild routing for clarity and flatter dom structure

Simplify strings and /create instead of /~create for new billing

Rebuild routing for clarity and flatter dom structure
This commit is contained in:
JUDIT GRESKOVITS 2017-03-29 13:45:18 +01:00 committed by Judit Greskovits
parent d7deb779cf
commit 51b0744bcc
85 changed files with 8275 additions and 1560 deletions

View File

@ -1,3 +1,4 @@
// TODO - I think this should go into @components/layout
import styled from 'styled-components'; import styled from 'styled-components';
// Main content Wrapper Styles // Main content Wrapper Styles

View File

@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import styled from 'styled-components'; import styled from 'styled-components';
import { LayoutContainer } from '@components/layout';
import Button from '@ui/components/button'; import Button from '@ui/components/button';
import Column from '@ui/components/column'; import Column from '@ui/components/column';
import Row from '@ui/components/row'; import Row from '@ui/components/row';
@ -18,7 +19,7 @@ const StyledBox = styled.div`
`; `;
export default () => ( export default () => (
<div> <LayoutContainer>
<Row name='empty-services'> <Row name='empty-services'>
<Column> <Column>
<H2> <H2>
@ -63,5 +64,5 @@ export default () => (
</Row> </Row>
</Column> </Column>
</Row> </Row>
</div> </LayoutContainer>
); );

View File

@ -57,8 +57,6 @@ const StyledH2 = styled(H2)`
`; `;
const Breadcrumb = ({ const Breadcrumb = ({
children,
links = [],
name = [] name = []
}) => ( }) => (
<Container> <Container>
@ -75,8 +73,6 @@ const Breadcrumb = ({
); );
Breadcrumb.propTypes = { Breadcrumb.propTypes = {
children: React.PropTypes.node,
links: React.PropTypes.arrayOf(PropTypes.link),
name: React.PropTypes.arrayOf(PropTypes.link) name: React.PropTypes.arrayOf(PropTypes.link)
}; };

View File

@ -1,4 +1,2 @@
import styled from 'styled-components'; export { default as Breadcrumb } from './breadcrumb';
export { default as Menu } from './menu';
export default styled.nav`
`;

View File

@ -8,7 +8,6 @@ import { breakpoints } from '@ui/shared/constants';
import { remcalc } from '@ui/shared/functions'; import { remcalc } from '@ui/shared/functions';
import PropTypes from '@root/prop-types'; import PropTypes from '@root/prop-types';
import Ul from '@ui/components/horizontal-list/ul'; import Ul from '@ui/components/horizontal-list/ul';
import Breadcrumb from '@components/breadcrumb';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
const StyledHorizontalList = styled(Ul)` const StyledHorizontalList = styled(Ul)`
@ -25,42 +24,32 @@ const StyledHorizontalListItem = styled(Li)`
} }
`; `;
const Section = (props) => { const Menu = ({
const { links
children, }) => {
links = []
} = props;
const navLinks = links.map((link) => { const navLinks = links.map((link) => {
const to = link.name === 'instances' ?
// eslint-disable-next-line max-len
'https://projects.invisionapp.com/share/YDAKI8CW4#/screens/224677771_instances' :
link.pathname;
return ( return (
<StyledHorizontalListItem key={link.name}> <StyledHorizontalListItem key={link.name}>
<NavLink activeClassName='active' to={to}> <NavLink activeClassName='active' to={link.pathname}>
<FormattedMessage id={link.name} /> <FormattedMessage id={link.name} />
</NavLink> </NavLink>
</StyledHorizontalListItem> </StyledHorizontalListItem>
); );
}); });
// TODO this could be any kind of nav, not just 'project-'...
return ( return (
<div>
<LayoutContainer> <LayoutContainer>
<Breadcrumb {...props} />
<StyledHorizontalList name='project-nav'> <StyledHorizontalList name='project-nav'>
{navLinks} {navLinks}
</StyledHorizontalList> </StyledHorizontalList>
</LayoutContainer> </LayoutContainer>
{children}
</div>
); );
}; };
Section.propTypes = { Menu.propTypes = {
children: React.PropTypes.node,
links: React.PropTypes.arrayOf(PropTypes.link) links: React.PropTypes.arrayOf(PropTypes.link)
}; };
export default Section; export default Menu;

View File

@ -1,3 +1,6 @@
// TODO this is a CONTAINER!!!
// TODO get rid of this file - moved to @containers/navigation
import React from 'react'; import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import styled from 'styled-components'; import styled from 'styled-components';
@ -99,6 +102,7 @@ const OrgNavigation = ({
orgs = [], orgs = [],
orgsUI orgsUI
}) => { }) => {
const navLinks = orgs.map(({ const navLinks = orgs.map(({
id, id,
name, name,

View File

@ -1,6 +0,0 @@
import React from 'react';
import { Redirect } from 'react-router-dom';
export default (to) => () => (
<Redirect to={to} />
);

View File

@ -1,93 +0,0 @@
import React from 'react';
import EmptyServices from '@components/empty/services';
import PropTypes from '@root/prop-types';
import Row from '@ui/components/row';
import Column from '@ui/components/column';
import { LayoutContainer } from '@components/layout';
import { H2 } from '@ui/components/base-elements';
import { FormGroup, Toggle, ToggleList, Legend } from '@ui/components/form';
import TopologyFilter from '@components/services/topology-filter';
import { unitcalc, remcalc } from '@ui/shared/functions';
import styled from 'styled-components';
const StyledLegend = styled(Legend)`
float: left;
padding-top: ${unitcalc(2)};
margin-right: ${unitcalc(1.5)};
`;
const PaddedRow = styled(Row)`
margin-bottom: ${remcalc(18)}
`;
const ServicesView = ({
children,
onToggle,
project,
services,
toggleValue
}) => {
const onToggleChange = (evt) => {
evt.preventDefault();
const value = evt.target.value;
if(value !== toggleValue) {
onToggle(value);
}
};
const filter = (
<Column xs={7}>
<TopologyFilter services={services} project={project} />
</Column>
);
const toggle = services ? (
<Column xs={5}>
<FormGroup name='service-view' value={toggleValue}>
<StyledLegend>View</StyledLegend>
<ToggleList>
<Toggle value='topology' onChange={onToggleChange}>Topology</Toggle>
<Toggle value='list' onChange={onToggleChange}>List</Toggle>
</ToggleList>
</FormGroup>
</Column>
) : null;
const controls = services ? (
<PaddedRow>
{ toggle }
{ filter }
</PaddedRow>
) : null;
const content = services.length ? children : (
<EmptyServices />
);
return (
<div>
<LayoutContainer>
<Row>
<Column xs={12}>
<H2>Services</H2>
{ controls }
</Column>
</Row>
</LayoutContainer>
{ content }
</div>
);
};
ServicesView.propTypes = {
children: React.PropTypes.node,
onToggle: React.PropTypes.func.isRequired,
project: React.PropTypes.arrayOf(PropTypes.project),
services: React.PropTypes.arrayOf(PropTypes.service),
toggleValue: React.PropTypes.string.isRequired
};
export default ServicesView;

View File

@ -1,71 +1,55 @@
import { connect } from 'react-redux';
import { Switch, Route } from 'react-router-dom';
import { injectGlobal } from 'styled-components'; import { injectGlobal } from 'styled-components';
import Article from '@components/article'; import Article from '@components/article';
import Base, { global } from '@ui/components/base'; import Base, { global } from '@ui/components/base';
import BaselineGrid from '@ui/components/baseline-grid'; import BaselineGrid from '@ui/components/baseline-grid';
import Footer from '@components/footer';
import Header from '@containers/header';
import Home from '@containers/home';
import NotFound from '@containers/not-found';
import Nav from '@components/navigation';
import OrgNavigation from '@components/navigation/org';
import { isProduction } from '@utils'; import { isProduction } from '@utils';
import PerfProfiler from '@perf-profiler'; import PerfProfiler from '@perf-profiler';
import React from 'react'; import React from 'react';
const App = connect()(React.createClass({ class App extends React.Component {
propTypes: {
children: React.PropTypes.node componentWillMount() {
},
componentWillMount: function() {
injectGlobal` injectGlobal`
${global} ${global}
`; `;
}, }
render: function() {
render() {
const { const {
children children
} = this.props; } = this.props;
let _children = children; const content =
!isProduction() && process.env.BASELINE_GRID ?
if (!Array.isArray(_children)) { (
return _children;
}
if ( !isProduction() && process.env.BASELINE_GRID) {
_children = (
<BaselineGrid> <BaselineGrid>
{_children} {children}
</BaselineGrid> </BaselineGrid>
); ) :
} (
return (
<Base> <Base>
{_children} <PerfProfiler />
{children}
</Base> </Base>
); );
}
}));
export default (props) => ( const profiler = !isProduction() ?
<PerfProfiler /> : null;
return (
<div> <div>
{ !isProduction() && <PerfProfiler /> } {profiler}
<App {...props}>
<Header />
<Nav name='application-org-navigation'>
<OrgNavigation />
</Nav>
<Article name='application-content'> <Article name='application-content'>
<Switch> {content}
<Route component={Home} path='/:org?/:section?' />
<Route component={NotFound} />
</Switch>
</Article> </Article>
<Footer name='application-footer' />
</App>
</div> </div>
); );
}
}
App.propTypes = {
children: React.PropTypes.node
};
export default App;

View File

@ -1,38 +0,0 @@
import React from 'react';
import { connect } from 'react-redux';
import { Route, Switch } from 'react-router-dom';
import Org from '@containers/org';
import PropTypes from '@root/prop-types';
import Redirect from '@components/redirect';
import { orgsSelector } from '@state/selectors';
import NotFound from '@containers/not-found';
const Home = ({
orgs = []
}) => {
const notFound = orgs.length ? Redirect(`/${orgs[0].id}`) : (
<NotFound />
);
return (
<div>
<Switch>
<Route component={Org} path='/:org/:section?' />
<Route component={notFound} />
</Switch>
</div>
);
};
Home.propTypes = {
orgs: React.PropTypes.arrayOf(PropTypes.org)
};
const mapStateToProps = (state) => ({
orgs: orgsSelector(state)
});
export default connect(
mapStateToProps
)(Home);

View File

@ -0,0 +1,72 @@
import React from 'react';
import { connect } from 'react-redux';
import {
orgByIdSelector,
projectByIdSelector,
serviceByIdSelector
} from '@root/state/selectors';
import { Breadcrumb as BreadcrumbComponent } from '@components/navigation';
const Breadcrumb = ({
location,
match,
org,
project,
service
}) => {
const path = location.pathname.split('/');
const links = [{
name: org.name,
pathname: path.slice(0, 2).join('/')
}];
if(project) {
links.push({
name: project.name,
pathname: path.slice(0, 4).join('/')
});
}
if(service) {
links.push({
name: service.name,
pathname: path.slice(0, 6).join('/')
});
}
// TODO add people etc
return (
<BreadcrumbComponent name={links} />
);
};
Breadcrumb.propTypes = {
location: React.PropTypes.object.isRequired,
match: React.PropTypes.object.isRequired,
org: React.PropTypes.object.isRequired,
project: React.PropTypes.object,
service: React.PropTypes.object
};
const mapStateToProps = (state, {
location,
match = {
params: {}
}
}) => ({
location,
match,
org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.project)(state),
service: serviceByIdSelector(match.params.service)(state)
});
const mapDispatchToProps = (dispatch) => ({});
export default connect(
mapStateToProps,
mapDispatchToProps
)(Breadcrumb);

View File

@ -0,0 +1,3 @@
export { default as Breadcrumb } from './breadcrumb';
export { default as Menu } from './menu';
export { default as Org } from './org';

View File

@ -0,0 +1,51 @@
import React from 'react';
import { connect } from 'react-redux';
import {
orgSectionsByIdSelector,
projectSectionsSelector,
serviceSectionsSelector
} from '@root/state/selectors';
import { Menu as MenuComponent } from '@components/navigation';
const Menu = (props) => {
const {
match,
sections
} = props;
const links = sections.map((section) => ({
name: section,
pathname: `${match.url}/${section}`
}));
return (
<MenuComponent links={links} />
);
};
Menu.propTypes = {
match: React.PropTypes.object.isRequired,
sections: React.PropTypes.array.isRequired
};
const mapStateToProps = (state, {
match = {
params: {}
}
}) => ({
location,
match,
sections: match.params.service ?
serviceSectionsSelector(state) :
match.params.project ?
projectSectionsSelector(state) :
orgSectionsByIdSelector(match.params.org)(state)
});
const mapDispatchToProps = (dispatch) => ({});
export default connect(
mapStateToProps,
mapDispatchToProps
)(Menu);

View File

@ -0,0 +1,175 @@
// TODO this is a CONTAINER!!!
import React from 'react';
import { connect } from 'react-redux';
import styled from 'styled-components';
import Avatar from '@ui/components/avatar';
import Container from '@ui/components/container';
import NavLink from '@ui/components/nav-link';
import { colors } from '@ui/shared/constants';
import PropTypes from '@root/prop-types';
import { orgsSelector, orgsUISelector } from '@state/selectors';
import { remcalc } from '@ui/shared/functions';
import { breakpoints } from '@ui/shared/constants';
import Tabs, { Tab } from '@ui/components/tabs';
const StyledNav = styled.div`
background-color: #f2f2f2;
& ul {
height: ${remcalc(60)};
margin: 0;
}
`;
const NavigationLinkContainer = styled.div`
position: relative;
color: ${colors.base.grey};
height: ${remcalc(24)};
padding: ${remcalc(14)};
border: ${remcalc(1)} solid ${colors.base.grey};
border-bottom-width: 0;
&.active {
background-color: ${colors.base.background};
}
`;
const OrgImage = styled.div`
float: left;
`;
const OrgAvatar = styled(Avatar)`
display: block;
`;
const OrgName = styled.span`
margin-left: ${props => props.hasAvatar ? remcalc(12) : 0};
margin-top: ${remcalc(3)};
color: ${colors.base.text}
`;
const NavLi = styled(NavLink)`
display: inline-block;
text-decoration: none;
font-size: 16px;
`;
const StyledTabs = styled(Tabs)`
padding-top: ${remcalc(12)};
${breakpoints.smallOnly`
display: inline-block;
white-space: nowrap;
`}
`;
const StyledContainer = styled(Container)`
${breakpoints.smallOnly`
overflow: scroll;
display: flex;
`}
`;
const ManageTab = styled(Tab)`
${breakpoints.medium`
float: right;
`}
`;
const DumbTab = ({
children
}) => (
<NavLi activeClassName='active' to='#'>{({
isActive
}) =>
<NavigationLinkContainer className={isActive ? 'active' : ''}>
<OrgName>
{children}
</OrgName>
</NavigationLinkContainer>
}</NavLi>
);
const OrgNavigation = ({
orgs = [],
orgsUI
}) => {
console.log('orgs = ', orgs);
const navLinks = orgs.map(({
id,
name,
image
}) => {
const to = `/${id}`;
const content = () => (
<NavLi activeClassName='active' to={to}>{({
isActive
}) =>
<NavigationLinkContainer className={isActive ? 'active' : ''}>
<OrgImage>
<OrgAvatar
height={remcalc(26)}
name={name}
src={image}
width={remcalc(26)}
/>
</OrgImage>
<OrgName hasAvatar>
{name}
</OrgName>
</NavigationLinkContainer>
}</NavLi>
);
return (
<Tab title={content()} key={to} />
);
});
const manageTabs = () => orgsUI.hide_add_and_manage ? null :
(
<DumbTab>Manage Tabs ({orgs.length})</DumbTab>
);
const addOrgTab = () => orgsUI.hide_add_and_manage ? null :
(
<DumbTab>+ &nbsp; Add organisation</DumbTab>
);
return (
<StyledNav>
<StyledContainer>
<StyledTabs name='organisation-navigation-group'>
{navLinks}
<Tab title={addOrgTab()} key='1' />
<ManageTab title={manageTabs()} key='2' />
</StyledTabs>
</StyledContainer>
</StyledNav>
);
};
OrgNavigation.propTypes = {
orgs: React.PropTypes.arrayOf(PropTypes.org),
orgsUI: React.PropTypes.object
};
DumbTab.propTypes = {
children: React.PropTypes.node
};
const mapStateToProps = (state) => ({
orgs: orgsSelector(state),
orgsUI: orgsUISelector(state)
});
export default connect(
mapStateToProps
)(OrgNavigation);

View File

@ -1,26 +0,0 @@
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import NewProject from '@containers/new-project/new-project';
import Billing from '@containers/new-project/billing';
import NewBilling from '@containers/new-project/new-billing';
export default () => (
<Switch>
<Route
component={NewProject}
exact
path='/:org/new-project'
/>
<Route
component={Billing}
exact
path='/:org/new-project/billing'
/>
<Route
component={NewBilling}
exact
path='/:org/new-project/new-billing'
/>
</Switch>
);

View File

@ -1,3 +1,5 @@
// TODO this is a component!!!
import React from 'react'; import React from 'react';
export default () => ( export default () => (

View File

@ -1,75 +1,2 @@
import isEmpty from 'lodash.isempty'; export { default as OrgPeople } from './people';
import { connect } from 'react-redux'; export { default as OrgSettings } from './settings';
import { Switch, Route } from 'react-router-dom';
import React from 'react';
import NotFound from '@containers/not-found';
import PropTypes from '@root/prop-types';
import Redirect from '@components/redirect';
import { orgByIdSelector, orgSectionsSelector } from '@state/selectors';
import NewProject from '@containers/new-project';
import PeopleSection from './people';
import SettingsSection from './settings';
import ProjectSection from './projects';
const SectionComponents = {
people: PeopleSection,
settings: SettingsSection,
projects: ProjectSection
};
const Org = ({
org = {},
sections = []
}) => {
if (isEmpty(org)) {
return (
<NotFound />
);
}
const missMatch = !sections.length ? null : (
<Route
component={Redirect(`/${org.id}/${sections[0]}`)}
exact
path={`/${org.id}`}
/>
);
const navMatches = sections.map((name) => (
<Route
component={SectionComponents[name]}
key={name}
path={`/:org/${name}`}
/>
));
navMatches.push(
<Route
component={NewProject}
key='new-project'
path={'/:org/new-project'}
/>
);
return (
<Switch>
{missMatch}
{navMatches}
</Switch>
);
};
Org.propTypes = {
org: PropTypes.org,
sections: PropTypes.sections
};
const mapStateToProps = (state, ownProps) => ({
org: orgByIdSelector(ownProps.match.params.org)(state),
sections: orgSectionsSelector(ownProps.match.params.org)(state)
});
export default connect(
mapStateToProps
)(Org);

View File

@ -2,7 +2,6 @@ import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
import PeopleSection from '@components/people-list'; import PeopleSection from '@components/people-list';
import Section from './section';
import { import {
peopleByOrgIdSelector, peopleByOrgIdSelector,
@ -21,11 +20,9 @@ import {
} from '@state/actions'; } from '@state/actions';
const People = (props) => ( const People = (props) => (
<Section {...props}>
<LayoutContainer> <LayoutContainer>
<PeopleSection {...props} /> <PeopleSection {...props} />
</LayoutContainer> </LayoutContainer>
</Section>
); );
const mapStateToProps = (state, { const mapStateToProps = (state, {

View File

@ -1,30 +0,0 @@
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Section from './section';
import { LayoutContainer } from '@components/layout';
import Projects from '@containers/projects';
import Project from '@containers/project';
export default () => {
const list = (props) => (
<Section {...props}>
<LayoutContainer>
<Projects {...props} />
</LayoutContainer>
</Section>
);
return (
<Switch>
<Route
component={list}
exact
path='/:org/projects'
/>
<Route
component={Project}
path='/:org/projects/:projectId/:section?'
/>
</Switch>
);
};

View File

@ -1,43 +0,0 @@
import React from 'react';
import { connect } from 'react-redux';
import PropTypes from '@root/prop-types';
import { orgByIdSelector, orgSectionsSelector } from '@state/selectors';
import Section from '@components/section';
const OrgSection = ({
children,
org = {},
sections = []
}) => {
const navLinks = sections.map((name) => ({
pathname: `/${org.id}/${name}`,
name
}));
const nameLinks = [{
pathname: `/${org.id}`,
name: org.name
}];
return (
<Section links={navLinks} name={nameLinks}>
{children}
</Section>
);
};
OrgSection.propTypes = {
children: React.PropTypes.node,
org: PropTypes.org,
sections: PropTypes.sections
};
const mapStateToProps = (state, ownProps) => ({
org: orgByIdSelector(ownProps.match.params.org)(state),
sections: orgSectionsSelector(ownProps.match.params.org)(state)
});
export default connect(
mapStateToProps
)(OrgSection);

View File

@ -1,14 +1,11 @@
import React from 'react'; import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import Section from './section';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
const Settings = (props) => ( const Settings = (props) => (
<Section {...props}>
<LayoutContainer> <LayoutContainer>
<p>settings</p> <p>Settings</p>
</LayoutContainer> </LayoutContainer>
</Section>
); );
Settings.propTypes = {}; Settings.propTypes = {};

View File

@ -1,11 +1,8 @@
import React from 'react'; import React from 'react';
import Section from './section';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
export default (props) => ( export default (props) => (
<Section {...props}>
<LayoutContainer> <LayoutContainer>
<p>Project Feed</p> <p>Project Feed</p>
</LayoutContainer> </LayoutContainer>
</Section>
); );

View File

@ -1,73 +1,6 @@
import React from 'react'; export { default as ProjectFeed } from './feed';
import { connect } from 'react-redux'; export { default as ProjectInstances } from './instances';
import { Switch, Route } from 'react-router-dom'; export { default as ProjectManifest } from './manifest';
import PropTypes from '@root/prop-types'; export { default as ProjectPeople } from './people';
import Redirect from '@components/redirect'; export { default as ProjectRollback } from './rollback';
import InstancesSection from './instances'; export { default as ProjectSettings } from './settings';
import ServicesSection from './services';
import PeopleSection from './people';
import SettingsSection from './settings';
import ManifestSection from './manifest';
import FeedSection from './feed';
import RollbackSection from './rollback';
import {
orgByIdSelector,
projectSectionsSelector,
projectByIdSelector
} from '@state/selectors';
const SectionComponents = {
'project-feed': FeedSection,
services: ServicesSection,
instances: InstancesSection,
people: PeopleSection,
settings: SettingsSection,
rollback: RollbackSection,
manifest: ManifestSection
};
const Project = ({
org = {},
project = {},
sections = []
}) => {
const navMatches = sections.map((name) => (
<Route
component={SectionComponents[name]}
key={name}
path={`/:org/projects/:projectId/${name}`}
/>
));
const missMatch = !sections.length ? null : (
<Route component={Redirect(`/${org.id}/projects/${project.id}/services`)} />
);
return (
<Switch>
{navMatches}
{missMatch}
</Switch>
);
};
Project.propTypes = {
org: PropTypes.org,
project: PropTypes.project,
sections: PropTypes.sections
};
const mapStateToProps = (state, {
match = {
params: {}
}
}) => ({
org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.projectId)(state),
sections: projectSectionsSelector(state)
});
export default connect(
mapStateToProps
)(Project);

View File

@ -4,7 +4,6 @@ import { toggleInstanceCollapsed } from '@state/actions';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
import EmptyInstances from '@components/empty/instances'; import EmptyInstances from '@components/empty/instances';
import PropTypes from '@root/prop-types'; import PropTypes from '@root/prop-types';
import Section from './section';
import InstanceList from '@components/instance-list'; import InstanceList from '@components/instance-list';
import { instancesByProjectIdSelector } from '@state/selectors'; import { instancesByProjectIdSelector } from '@state/selectors';
@ -19,7 +18,6 @@ const Instances = (props) => {
); );
return ( return (
<Section {...props}>
<LayoutContainer> <LayoutContainer>
{empty} {empty}
<InstanceList <InstanceList
@ -27,7 +25,6 @@ const Instances = (props) => {
toggleCollapsed={toggleCollapsed} toggleCollapsed={toggleCollapsed}
/> />
</LayoutContainer> </LayoutContainer>
</Section>
); );
}; };
@ -41,7 +38,7 @@ const mapStateToProps = (state, {
params: {} params: {}
} }
}) => ({ }) => ({
instances: instancesByProjectIdSelector(match.params.projectId)(state) instances: instancesByProjectIdSelector(match.params.project)(state)
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({

View File

@ -1,11 +1,8 @@
import React from 'react'; import React from 'react';
import Section from './section';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
export default (props) => ( export default (props) => (
<Section {...props}>
<LayoutContainer> <LayoutContainer>
<p>manifest</p> <p>manifest</p>
</LayoutContainer> </LayoutContainer>
</Section>
); );

View File

@ -2,7 +2,6 @@ import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
import PeopleSection from '@components/people-list'; import PeopleSection from '@components/people-list';
import Section from './section';
import { import {
peopleByProjectIdSelector, peopleByProjectIdSelector,
@ -21,11 +20,9 @@ import {
} from '@state/actions'; } from '@state/actions';
const People = (props) => ( const People = (props) => (
<Section {...props}>
<LayoutContainer> <LayoutContainer>
<PeopleSection {...props} /> <PeopleSection {...props} />
</LayoutContainer> </LayoutContainer>
</Section>
); );
const mapStateToProps = (state, { const mapStateToProps = (state, {
@ -33,9 +30,9 @@ const mapStateToProps = (state, {
params: {} params: {}
} }
}) => ({ }) => ({
people: peopleByProjectIdSelector(match.params.projectId)(state), people: peopleByProjectIdSelector(match.params.project)(state),
UI: projectUISelector(state), UI: projectUISelector(state),
parentIndex: projectIndexByIdSelect(match.params.projectId)(state), parentIndex: projectIndexByIdSelect(match.params.project)(state),
platformMembers: membersSelector(state) platformMembers: membersSelector(state)
}); });

View File

@ -1,11 +1,8 @@
import React from 'react'; import React from 'react';
import Section from './section';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
export default (props) => ( export default (props) => (
<Section {...props}>
<LayoutContainer> <LayoutContainer>
<p>Rollback</p> <p>Rollback</p>
</LayoutContainer> </LayoutContainer>
</Section>
); );

View File

@ -1,65 +0,0 @@
import React from 'react';
import { connect } from 'react-redux';
import PropTypes from '@root/prop-types';
import Section from '@components/section';
import {
orgByIdSelector,
projectByIdSelector,
projectSectionsSelector
} from '@state/selectors';
const ProjectSection = ({
children,
org = {},
project = {},
sections = []
}) => {
const pathname = (props) => (
`/${props.org}/projects/${props.project}/${props.section}`
);
const navLinks = sections.map((name) => ({
pathname: pathname({
org: org.id,
project: project.id,
section: name
}),
name
}));
const nameLinks = [{
pathname: `/${org.id}`,
name: org.name
}, {
pathname: `/${org.id}/projects/${project.id}`,
name: project.name
}];
return (
<Section links={navLinks} name={nameLinks}>
{children}
</Section>
);
};
ProjectSection.propTypes = {
children: React.PropTypes.node,
org: PropTypes.org,
project: PropTypes.project,
sections: PropTypes.sections
};
const mapStateToProps = (state, {
match = {
params: {}
}
}) => ({
org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.projectId)(state),
sections: projectSectionsSelector(state)
});
export default connect(
mapStateToProps
)(ProjectSection);

View File

@ -1,44 +0,0 @@
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Section from './section';
import ServicesTopology from '@containers/services/topology';
import ServicesList from '@containers/services/list';
import Services from '@containers/services';
import Service from '@containers/service';
export default () => {
const topology = (props) => (
<Section {...props}>
<Services {...props}>
<ServicesTopology {...props} />
</Services>
</Section>
);
const list = (props) => (
<Section {...props}>
<Services {...props}>
<ServicesList {...props} />
</Services>
</Section>
);
return (
<Switch>
<Route
component={topology}
exact
path='/:org/projects/:projectId/services'
/>
<Route
component={list}
exact
path='/:org/projects/:projectId/services/list'
/>
<Route
component={Service}
path='/:org/projects/:projectId/services/:serviceId/:section?'
/>
</Switch>
);
};

View File

@ -1,11 +1,8 @@
import React from 'react'; import React from 'react';
import Section from './section';
import { LayoutContainer } from '@components/layout'; import { LayoutContainer } from '@components/layout';
export default (props) => ( export default (props) => (
<Section {...props}>
<LayoutContainer> <LayoutContainer>
<p>settings</p> <p>settings</p>
</LayoutContainer> </LayoutContainer>
</Section>
); );

View File

@ -3,6 +3,7 @@ import { connect } from 'react-redux';
import { reduxForm } from 'redux-form'; import { reduxForm } from 'redux-form';
import { orgByIdSelector } from '@state/selectors'; import { orgByIdSelector } from '@state/selectors';
import { handleNewProject } from '@state/actions'; import { handleNewProject } from '@state/actions';
import { LayoutContainer } from '@components/layout';
import PropTypes from '@root/prop-types'; import PropTypes from '@root/prop-types';
import NewProjectBilling from '@components/new-project/billing'; import NewProjectBilling from '@components/new-project/billing';
@ -16,8 +17,9 @@ const NewProjectBillingForm = reduxForm({
const Billing = ({ const Billing = ({
cards, cards,
handleNewProject, handleNewProject,
router, org,
org match,
push
}) => { }) => {
const onSubmit = (values) => { const onSubmit = (values) => {
// TODO will need to save exisiting card to project // TODO will need to save exisiting card to project
@ -26,19 +28,21 @@ const Billing = ({
org org
}); });
router.push(`/${org.id}/projects`); push(`/${org.id}/projects`);
}; };
const onNewBilling = (evt) => const onNewBilling = (evt) =>
router.push(`/${org.id}/new-project/new-billing`); push(`${match.url}/create`);
return ( return (
<LayoutContainer>
<NewProjectBillingForm <NewProjectBillingForm
cards={cards} cards={cards}
onNewBilling={onNewBilling} onNewBilling={onNewBilling}
onSubmit={onSubmit} onSubmit={onSubmit}
org={org} org={org}
/> />
</LayoutContainer>
); );
}; };
@ -46,16 +50,20 @@ Billing.propTypes = {
cards: React.PropTypes.array, // TODO set up example card in thingie data cards: React.PropTypes.array, // TODO set up example card in thingie data
handleNewProject: React.PropTypes.func.isRequired, handleNewProject: React.PropTypes.func.isRequired,
org: PropTypes.org.isRequired, org: PropTypes.org.isRequired,
router: React.PropTypes.object match: React.PropTypes.object,
push: React.PropTypes.func
}; };
const mapStateToProps = (state, { const mapStateToProps = (state, {
match = { match = {
params: {} params: {}
} },
push
}) => ({ }) => ({
// TODO add cards - as above // TODO add cards - as above
org: orgByIdSelector(match.params.org)(state) org: orgByIdSelector(match.params.org)(state),
match,
push
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({

View File

@ -1,66 +1,4 @@
import React from 'react'; export { default as ProjectsList } from './list';
import { FormattedMessage } from 'react-intl'; export { default as ProjectsNewProject } from './new-project';
import { connect } from 'react-redux'; export { default as ProjectsNewProjectBilling } from './billing';
import Button from '@ui/components/button'; export { default as ProjectsNewProjectNewBilling } from './new-billing';
import Column from '@ui/components/column';
import NavLink from '@ui/components/nav-link';
import { orgByIdSelector, projectsByOrgIdSelector } from '@state/selectors';
import EmptyProjects from '@components/empty/projects';
import PropTypes from '@root/prop-types';
import Row from '@ui/components/row';
const Projects = ({
org = {},
projects = []
}) => {
const empty = projects.length ? null : (
<EmptyProjects />
);
const _projects = projects.map((project) => (
<li key={project.id}>
<NavLink
activeClassName='active'
to={`/${org.id}/projects/${project.id}`}
>
{project.name}
</NavLink>
</li>
));
return (
<div>
{empty}
<Row>
<Column xs={12}>
<Button to={`/${org.id}/new-project`}>
<FormattedMessage id='create-new' />
</Button>
</Column>
</Row>
<Row>
<ul name='projects'>
{_projects}
</ul>
</Row>
</div>
);
};
Projects.propTypes = {
org: PropTypes.org,
projects: React.PropTypes.arrayOf(PropTypes.project)
};
const mapStateToProps = (state, {
match = {
params: {}
}
}) => ({
org: orgByIdSelector(match.params.org)(state),
projects: projectsByOrgIdSelector(match.params.org)(state)
});
export default connect(
mapStateToProps
)(Projects);

View File

@ -0,0 +1,67 @@
import React from 'react';
import { FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';
import { LayoutContainer } from '@components/layout';
import Button from '@ui/components/button';
import Column from '@ui/components/column';
import NavLink from '@ui/components/nav-link';
import { orgByIdSelector, projectsByOrgIdSelector } from '@state/selectors';
import EmptyProjects from '@components/empty/projects';
import PropTypes from '@root/prop-types';
import Row from '@ui/components/row';
const Projects = ({
org = {},
projects = []
}) => {
const empty = projects.length ? null : (
<EmptyProjects />
);
const _projects = projects.map((project) => (
<li key={project.id}>
<NavLink
activeClassName='active'
to={`/${org.id}/projects/${project.id}`}
>
{project.name}
</NavLink>
</li>
));
return (
<LayoutContainer>
{empty}
<Row>
<Column xs={12}>
<Button to={`/${org.id}/projects/~create`}>
<FormattedMessage id='create-new' />
</Button>
</Column>
</Row>
<Row>
<ul name='projects'>
{_projects}
</ul>
</Row>
</LayoutContainer>
);
};
Projects.propTypes = {
org: PropTypes.org,
projects: React.PropTypes.arrayOf(PropTypes.project)
};
const mapStateToProps = (state, {
match = {
params: {}
}
}) => ({
org: orgByIdSelector(match.params.org)(state),
projects: projectsByOrgIdSelector(match.params.org)(state)
});
export default connect(
mapStateToProps
)(Projects);

View File

@ -3,6 +3,7 @@ import { connect } from 'react-redux';
import { reduxForm } from 'redux-form'; import { reduxForm } from 'redux-form';
import { orgByIdSelector } from '@state/selectors'; import { orgByIdSelector } from '@state/selectors';
import { handleNewProject } from '@state/actions'; import { handleNewProject } from '@state/actions';
import { LayoutContainer } from '@components/layout';
import PropTypes from '@root/prop-types'; import PropTypes from '@root/prop-types';
import CreateBilling from '@components/new-project/new-billing'; import CreateBilling from '@components/new-project/new-billing';
@ -13,11 +14,12 @@ const NewBillingForm = reduxForm({
const NewBilling = ({ const NewBilling = ({
handleNewProject, handleNewProject,
router, org,
org match,
push
}) => { }) => {
const onBack = (evt) => const onBack = (evt) =>
router.push(`/${org.id}/new-project/billing`); push(`/${org.id}/projects/~create/billing`);
const onSubmit = (values) => { const onSubmit = (values) => {
handleNewProject({ handleNewProject({
@ -25,30 +27,36 @@ const NewBilling = ({
org org
}); });
router.push(`/${org.id}/projects`); push(`/${org.id}/projects`);
}; };
return ( return (
<LayoutContainer>
<NewBillingForm <NewBillingForm
onBack={onBack} onBack={onBack}
onSubmit={onSubmit} onSubmit={onSubmit}
/> />
</LayoutContainer>
); );
}; };
NewBilling.propTypes = { NewBilling.propTypes = {
handleNewProject: React.PropTypes.func.isRequired, handleNewProject: React.PropTypes.func.isRequired,
org: PropTypes.org.isRequired, org: PropTypes.org.isRequired,
router: React.PropTypes.object match: React.PropTypes.object,
push: React.PropTypes.func
}; };
const mapStateToProps = (state, { const mapStateToProps = (state, {
match = { match = {
params: {} params: {}
} },
push
}) => ({ }) => ({
// TODO add cards - as above // TODO add cards - as above
org: orgByIdSelector(match.params.org)(state) org: orgByIdSelector(match.params.org)(state),
match,
push
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({

View File

@ -4,6 +4,7 @@ import { reduxForm } from 'redux-form';
import { orgByIdSelector } from '@state/selectors'; import { orgByIdSelector } from '@state/selectors';
import PropTypes from '@root/prop-types'; import PropTypes from '@root/prop-types';
import CreateProject from '@components/new-project'; import CreateProject from '@components/new-project';
import { LayoutContainer } from '@components/layout';
const NewProjectForm = reduxForm({ const NewProjectForm = reduxForm({
form: 'create-project', form: 'create-project',
@ -13,35 +14,42 @@ const NewProjectForm = reduxForm({
const NewProject = ({ const NewProject = ({
org, org,
router match,
push
}) => { }) => {
const onCancel = (values) => const onCancel = (values) =>
router.push(`/${org.id}/projects`); push(`/${match.params.org}/projects`);
const onSubmit = (values) => const onSubmit = (values) =>
router.push(`/${org.id}/new-project/billing`); push(`${match.url}/billing`);
return ( return (
<LayoutContainer>
<NewProjectForm <NewProjectForm
onCancel={onCancel} onCancel={onCancel}
onSubmit={onSubmit} onSubmit={onSubmit}
org={org} org={org}
/> />
</LayoutContainer>
); );
}; };
NewProject.propTypes = { NewProject.propTypes = {
org: PropTypes.org.isRequired, org: PropTypes.org.isRequired,
router: React.PropTypes.object match: React.PropTypes.object,
push: React.PropTypes.func
}; };
// TODO we'll need to know whether there any cards // TODO we'll need to know whether there any cards
// otherwise go to new billing straight away // otherwise go to new billing straight away
const mapStateToProps = (state, { const mapStateToProps = (state, {
match = { match = {
params: {} params: {}
} },
push
}) => ({ }) => ({
org: orgByIdSelector(match.params.org)(state) org: orgByIdSelector(match.params.org)(state),
match,
push
}); });
const mapDispatchToProps = (dispatch) => ({}); const mapDispatchToProps = (dispatch) => ({});

View File

@ -1,120 +1,8 @@
import React from 'react'; export { default as ServiceActivityFeed } from './activity-feed';
import { connect } from 'react-redux'; export { default as ServiceFirewall } from './firewall';
import { Switch, Route } from 'react-router-dom'; export { default as ServiceInstances } from './instances';
import PropTypes from '@root/prop-types'; export { default as ServiceMetrics } from './metrics';
import Redirect from '@components/redirect'; export { default as ServiceNetworks } from './networks';
import Section from '@components/section'; export { default as ServiceManifest } from './service-manifest';
import SummarySection from './summary'; export { default as ServiceSummary } from './summary';
import InstancesSection from './instances'; export { default as ServiceMetadata } from './tags-metadata';
import MetricsSection from './metrics';
import NetworksSection from './networks';
import TagsMetadataSection from './tags-metadata';
import ActivityFeedSection from './activity-feed';
import ServiceManifestSection from './service-manifest';
import FirewallSection from './firewall';
const SectionComponents = {
summary: SummarySection,
instances: InstancesSection,
metrics: MetricsSection,
networks: NetworksSection,
'tags-metadata': TagsMetadataSection,
'activity-feed': ActivityFeedSection,
'service-manifest': ServiceManifestSection,
firewall: FirewallSection
};
import {
orgByIdSelector,
serviceSectionsSelector,
projectByIdSelector,
serviceByIdSelector
} from '@state/selectors';
const Service = ({
org = {},
project = {},
sections = [],
service = {}
}) => {
const pathname = ({
org,
project,
service,
section
}) => (
`/${org}/projects/${project}/services/${service}/${section}`
);
const redirectHref = pathname({
org: org.id,
project: project.id,
service: service.id,
section: 'summary'
});
const navLinks = sections.map((name) => ({
pathname: pathname({
org: org.id,
project: project.id,
service: service.id,
section: name
}),
name
}));
const nameLinks = [{
pathname: `/${org.id}`,
name: org.name
}, {
pathname: `/${org.id}/projects/${project.id}`,
name: project.name
}, {
pathname: redirectHref,
name: service.name
}];
const navMatches = sections.map((name) => (
<Route
component={SectionComponents[name]}
key={name}
path={`/:org/projects/:projectId/services/:serviceId/${name}`}
/>
));
const missMatch = !sections.length ? null : (
<Route component={Redirect(redirectHref)} />
);
return (
<Section links={navLinks} name={nameLinks}>
<Switch>
{navMatches}
{missMatch}
</Switch>
</Section>
);
};
Service.propTypes = {
org: PropTypes.org,
project: PropTypes.project,
sections: PropTypes.sections,
service: PropTypes.service
};
const mapStateToProps = (state, {
match = {
params: {}
}
}) => ({
org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.projectId)(state),
sections: serviceSectionsSelector(state),
service: serviceByIdSelector(match.params.serviceId)(state)
});
export default connect(
mapStateToProps
)(Service);

View File

@ -36,7 +36,7 @@ const mapStateToProps = (state, {
params: {} params: {}
} }
}) => ({ }) => ({
instances: instancesByServiceIdSelector(match.params.serviceId)(state) instances: instancesByServiceIdSelector(match.params.service)(state)
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({

View File

@ -13,9 +13,9 @@ const mapStateToProps = (state, {
params: {} params: {}
} }
}) => ({ }) => ({
datasets: metricsByServiceIdSelector(match.params.serviceId)(state), datasets: metricsByServiceIdSelector(match.params.service)(state),
metricTypes: metricTypesSelector(state), metricTypes: metricTypesSelector(state),
service: serviceByIdSelector(match.params.serviceId)(state) service: serviceByIdSelector(match.params.service)(state)
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({

View File

@ -1,93 +1,3 @@
import React from 'react'; export { default as ServicesTopology } from './topology';
import Styled from 'styled-components'; export { default as ServicesList } from './list';
import { connect } from 'react-redux'; export { default as ServicesView } from './view';
import PropTypes from '@root/prop-types';
import ServicesView from '@components/services/view';
import Button from '@ui/components/button';
import {
orgByIdSelector,
projectByIdSelector,
servicesForTopologySelector
} from '@state/selectors';
const Services = (props) => {
const {
org = {},
project = {},
services = [],
children,
path,
push
} = props;
// TODO: Move into "components" and fix absolute
// positioning on responsive screens
const instances = (instances = 0) => {
const StyledButton = Styled(Button)`
position: absolute;
top: 340px;
right: 193px;
`;
if ( instances.length <= 0 || instances <= 0 ) return;
return (
<StyledButton tertiary>
You have 5 instances
</StyledButton>
);
};
const toggleValue = path === '/:org/projects/:projectId/services'
? 'topology'
: 'list';
const onToggle = (value) => {
const path = `/${org.id}/projects/${project.id}/services${
value === 'list' ? '/list' : ''
}`;
push(path);
};
return (
<ServicesView
onToggle={onToggle}
project={project}
toggleValue={toggleValue}
services={services}
>
{instances()}
{children}
</ServicesView>
);
};
Services.propTypes = {
children: React.PropTypes.node,
org: PropTypes.org,
path: React.PropTypes.string.isRequired,
project: PropTypes.project,
push: React.PropTypes.func.isRequired,
services: React.PropTypes.arrayOf(PropTypes.service)
};
const mapStateToProps = (state, {
match = {
params: {},
path: ''
},
push
}) => ({
org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.projectId)(state),
services: servicesForTopologySelector(match.params.projectId)(state),
path: match.path,
push: push
});
export default connect(
mapStateToProps
)(Services);

View File

@ -119,8 +119,8 @@ const mapStateToProps = (state, {
push push
}) => ({ }) => ({
org: orgByIdSelector(match.params.org)(state), org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.projectId)(state), project: projectByIdSelector(match.params.project)(state),
services: servicesByProjectIdSelector(match.params.projectId, { services: servicesByProjectIdSelector(match.params.project, {
duration, duration,
interval interval
})(state), })(state),

View File

@ -40,6 +40,10 @@ const Services = (props) => {
push push
} = props; } = props;
if(!services || !services.length) {
return null;
}
const getService = (uuid) => services.reduce((acc, service) => const getService = (uuid) => services.reduce((acc, service) =>
service.uuid === uuid ? service : acc service.uuid === uuid ? service : acc
, {}); , {});
@ -100,8 +104,8 @@ const mapStateToProps = (state, {
push push
}) => ({ }) => ({
org: orgByIdSelector(match.params.org)(state), org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.projectId)(state), project: projectByIdSelector(match.params.project)(state),
services: servicesForTopologySelector(match.params.projectId)(state), services: servicesForTopologySelector(match.params.project)(state),
uiTooltip: serviceUiTooltipSelector(state), uiTooltip: serviceUiTooltipSelector(state),
push: push push: push
}); });

View File

@ -0,0 +1,114 @@
import React from 'react';
import { connect } from 'react-redux';
import EmptyServices from '@components/empty/services';
import PropTypes from '@root/prop-types';
import Row from '@ui/components/row';
import Column from '@ui/components/column';
import { LayoutContainer } from '@components/layout';
import { H2 } from '@ui/components/base-elements';
import { FormGroup, Toggle, ToggleList, Legend } from '@ui/components/form';
import TopologyFilter from '@components/services/topology-filter';
import { unitcalc, remcalc } from '@ui/shared/functions';
import styled from 'styled-components';
import {
orgByIdSelector,
projectByIdSelector,
servicesForTopologySelector
} from '@state/selectors';
const StyledLegend = styled(Legend)`
float: left;
padding-top: ${unitcalc(2)};
margin-right: ${unitcalc(1.5)};
`;
const PaddedRow = styled(Row)`
margin-bottom: ${remcalc(18)}
`;
const ServicesView = ({
org = {},
project = {},
services = {},
location = {},
match = {},
push
}) => {
if(!services || !services.length) {
return (
<EmptyServices />
);
}
const toggleValue = location.pathname.split('-').pop();
const handleToggle = (evt) => {
const value = evt.target.value;
if(value !== toggleValue) {
const index = location.pathname.lastIndexOf('-');
const path = `${location.pathname.slice(0, index)}-${value}`;
push(path);
}
};
const filter = (
<Column xs={7}>
<TopologyFilter services={services} project={project} />
</Column>
);
const toggle = (
<Column xs={5}>
<FormGroup name='service-view' value={toggleValue}>
<StyledLegend>View</StyledLegend>
<ToggleList>
<Toggle value='topology' onChange={handleToggle}>Topology</Toggle>
<Toggle value='list' onChange={handleToggle}>List</Toggle>
</ToggleList>
</FormGroup>
</Column>
);
return (
<LayoutContainer>
<Row>
<Column xs={12}>
<H2>Services</H2>
<PaddedRow>
{ toggle }
{ filter }
</PaddedRow>
</Column>
</Row>
</LayoutContainer>
);
};
ServicesView.propTypes = {
org: PropTypes.org,
project: PropTypes.project,
services: React.PropTypes.arrayOf(PropTypes.service),
location: React.PropTypes.object,
match: React.PropTypes.object,
push: React.PropTypes.func.isRequired
};
const mapStateToProps = (state, {
location,
match,
push
}) => ({
org: orgByIdSelector(match.params.org)(state),
project: projectByIdSelector(match.params.project)(state),
services: servicesForTopologySelector(match.params.project)(state),
location: location,
match: match,
push: push
});
export default connect(
mapStateToProps
)(ServicesView);

View File

@ -1,5 +1,4 @@
import { IntlProvider } from 'react-intl-redux'; import { IntlProvider } from 'react-intl-redux';
import { BrowserRouter } from 'react-router-dom';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import qs from 'querystring'; import qs from 'querystring';
import a11y from 'react-a11y'; import a11y from 'react-a11y';
@ -7,13 +6,13 @@ import ReactDOM from 'react-dom';
import React from 'react'; import React from 'react';
import Perf from 'react-addons-perf'; import Perf from 'react-addons-perf';
import App from '@containers/app';
import MockStateTesting from '@mock-states/testing'; import MockStateTesting from '@mock-states/testing';
import MockState from '@mock-states'; import MockState from '@mock-states';
import LeakDatasets from './dataset-leak.json'; import LeakDatasets from './dataset-leak.json';
import NormalDatasets from './dataset-normal.json'; import NormalDatasets from './dataset-normal.json';
import Store from '@state/store'; import Store from '@state/store';
import { isProduction } from '@utils'; import { isProduction } from '@utils';
import Router from '@root/routing';
if ( !isProduction() ) { if ( !isProduction() ) {
a11y(React, { a11y(React, {
@ -29,7 +28,7 @@ const states = {
}; };
const query = qs.parse(window.location.search.replace(/^\?/, '')); const query = qs.parse(window.location.search.replace(/^\?/, ''));
const mockState = states[query.mock || 'testing']; const mockState = states[query.mock || 'all'];
// node_memory_rss_bytes // node_memory_rss_bytes
// node_memory_heap_total_bytes // node_memory_heap_total_bytes
@ -114,9 +113,7 @@ mockState.metrics.data.datasets = datasets;
ReactDOM.render( ReactDOM.render(
<Provider store={Store(mockState)}> <Provider store={Store(mockState)}>
<IntlProvider> <IntlProvider>
<BrowserRouter> {Router}
<App />
</BrowserRouter>
</IntlProvider> </IntlProvider>
</Provider>, </Provider>,
document.getElementById('root') document.getElementById('root')

View File

@ -9,6 +9,10 @@ export const orgs = {
"people", "people",
"settings" "settings"
], ],
"personal-sections": [
"projects",
"settings"
],
"members_status": [ "members_status": [
"Active", "Active",
"Inactive", "Inactive",
@ -28,7 +32,8 @@ export const orgs = {
"id": "nicola", "id": "nicola",
"name": "Your dashboard", "name": "Your dashboard",
"image": "https://pbs.twimg.com/profile_images/641289584580493312/VBfsPlff_400x400.jpg", "image": "https://pbs.twimg.com/profile_images/641289584580493312/VBfsPlff_400x400.jpg",
"members": [] "members": [],
"type": "personal"
}, { }, {
"owner": "b94033c1-3665-4c36-afab-d9c3d0b51c01", "owner": "b94033c1-3665-4c36-afab-d9c3d0b51c01",
"uuid": "e12ad7db-91b2-4154-83dd-40dcfc700dcc", "uuid": "e12ad7db-91b2-4154-83dd-40dcfc700dcc",

View File

@ -28,7 +28,8 @@ export default {
"id": "nicola", "id": "nicola",
"name": "Personal", "name": "Personal",
"image": "https://pbs.twimg.com/profile_images/641289584580493312/VBfsPlff_400x400.jpg", "image": "https://pbs.twimg.com/profile_images/641289584580493312/VBfsPlff_400x400.jpg",
"members": [] "members": [],
"type": "personal"
}] }]
}, },
account, account,

157
frontend/src/routing.js Normal file
View File

@ -0,0 +1,157 @@
import React from 'react';
import {
BrowserRouter,
Redirect,
Route,
Switch
} from 'react-router-dom';
import App from '@containers/app';
import Header from '@containers/header';
import {
Breadcrumb,
Menu,
Org
} from '@containers/navigation';
import {
OrgPeople,
OrgSettings
} from '@containers/org';
import {
ProjectsList,
ProjectsNewProject,
ProjectsNewProjectBilling,
ProjectsNewProjectNewBilling
} from '@containers/projects';
import {
ProjectFeed,
ProjectInstances,
ProjectManifest,
// ProjectPeople,
ProjectRollback,
ProjectSettings
} from '@containers/project';
import {
ServicesTopology,
ServicesList,
ServicesView
} from '@containers/services';
import {
ServiceActivityFeed,
ServiceFirewall,
ServiceInstances,
ServiceMetrics,
ServiceNetworks,
ServiceManifest,
ServiceSummary,
ServiceMetadata
} from '@containers/service';
const orgRedirect = (p) => (
<Redirect to={`${p.location.pathname}/projects`} />
);
const projectRedirect = (p) => (
<Redirect to={`${p.location.pathname}/services-topology`} />
);
const servicesRedirect = (p) => (
<Redirect to={`${p.location.pathname}-topology`} />
);
const serviceRedirect = (p) => (
<Redirect to={`${p.location.pathname}/summary`} />
);
const emptyRoute = (p) => {
return null;
};
const orgPath = '/:org';
const projectPath = `${orgPath}/projects/:project`;
const servicePath = `${projectPath}/services/:service`;
/* eslint-disable */
const Router = (
<BrowserRouter>
<App>
<Route path='/' component={Header} />
{/* Navigation */}
<Route path={orgPath} component={Org} />
<Switch>
<Route path={`${orgPath}/projects/~create`} render={emptyRoute} />
<Route path={servicePath} component={Breadcrumb} />
<Route path={projectPath} component={Breadcrumb} />
<Route path={orgPath} component={Breadcrumb} />
</Switch>
<Switch>
<Route path={`${orgPath}/projects/~create`} render={emptyRoute} />
<Route path={servicePath} component={Menu} />
<Route path={projectPath} component={Menu} />
<Route path={orgPath} component={Menu} />
</Switch>
{/* Projects */}
<Route path={orgPath} exact render={orgRedirect} />
<Route path={`${orgPath}/projects`} exact component={ProjectsList} />
<Switch>
{/* Redirect to services only for project root */}
{/* Projects - New Project */}
<Route path={`${orgPath}/projects/~create/billing/create`} component={ProjectsNewProjectNewBilling} />
<Route path={`${orgPath}/projects/~create/billing`} component={ProjectsNewProjectBilling} />
<Route path={`${orgPath}/projects/~create`} component={ProjectsNewProject} />
{/* Project */}
<Route path={projectPath} exact render={projectRedirect} />
</Switch>
{/* Project / Feed */}
<Route path={`${projectPath}/project-feed`} component={ProjectFeed} />
{/* Project / Services */}
<Route path={`${projectPath}/services`} render={servicesRedirect} />
<Route path={`${projectPath}/services-topology`} exact component={ServicesView} />
<Route path={`${projectPath}/services-topology`} exact component={ServicesTopology} />
<Route path={`${projectPath}/services-list`} exact component={ServicesView} />
<Route path={`${projectPath}/services-list`} exact component={ServicesList} />
{/* Project / Instances */}
<Route path={`${projectPath}/instances`} component={ProjectInstances} />
{/* Project / Rollback */}
<Route path={`${projectPath}/rollback`} component={ProjectRollback} />
{/* Project / Manifest */}
<Route path={`${projectPath}/manifest`} component={ProjectManifest} />
{/* Project / Settings */}
<Route path={`${projectPath}/settings`} component={ProjectSettings} />
{/* Service */}
{/* Redirect to services only for service root */}
<Route path={servicePath} render={serviceRedirect} />
<Route path={`${servicePath}/activity-feed`} component={ServiceActivityFeed} />
<Route path={`${servicePath}/firewall`} component={ServiceFirewall} />
{/* Instances */}
<Route path={`${servicePath}/instances`} component={ServiceInstances} />
{/* Metrics */}
<Route path={`${servicePath}/metrics`} component={ServiceMetrics} />
<Route path={`${servicePath}/networks`} component={ServiceNetworks} />
<Route path={`${servicePath}/service-manifest`} component={ServiceManifest} />
<Route path={`${servicePath}/summary`} component={ServiceSummary} />
<Route path={`${servicePath}/tags-metadata`} component={ServiceMetadata} />
{/* People - TODO This route is broken */}
<Route path={`${orgPath}/people`} exact component={OrgPeople} />
{/* Settings */}
<Route path={`${orgPath}/settings`} exact component={OrgSettings} />
</App>
</BrowserRouter>
);
/* eslint-enable */
export default Router;

View File

@ -11,6 +11,8 @@ const account = (state) => get(state, 'account.data', {});
const accountUi = (state) => get(state, 'account.ui', {}); const accountUi = (state) => get(state, 'account.ui', {});
const datacenters = (state) => get(state, 'datacenters.data', {}); const datacenters = (state) => get(state, 'datacenters.data', {});
const orgUiSections = (state) => get(state, 'orgs.ui.sections', []); const orgUiSections = (state) => get(state, 'orgs.ui.sections', []);
const orgUiPersonalSections = (state) =>
get(state, 'orgs.ui.personal-sections', []);
const projectUiSections = (state) => get(state, 'projects.ui.sections', []); const projectUiSections = (state) => get(state, 'projects.ui.sections', []);
const serviceUiTooltip = (state) => get(state, 'services.ui.tooltip', []); const serviceUiTooltip = (state) => get(state, 'services.ui.tooltip', []);
const serviceUiSections = (state) => get(state, 'services.ui.sections', []); const serviceUiSections = (state) => get(state, 'services.ui.sections', []);
@ -58,6 +60,12 @@ const projectsByOrgId = (orgId) => createSelector(
(projects, org) => projects.filter((p) => p.org === org.uuid) (projects, org) => projects.filter((p) => p.org === org.uuid)
); );
const orgSectionsById = (orgId) => createSelector(
[orgById(orgId), orgUiSections, orgUiPersonalSections],
(org, sections, personalSections) =>
org.type === 'personal' ? personalSections : sections
);
const orgSections = (orgId) => createSelector( const orgSections = (orgId) => createSelector(
[orgById(orgId), orgUiSections], [orgById(orgId), orgUiSections],
(org, sections) => sections.filter( (org, sections) => sections.filter(
@ -462,7 +470,8 @@ export {
orgIndexById as orgIndexSelector, orgIndexById as orgIndexSelector,
services as servicesSelector, services as servicesSelector,
serviceById as serviceByIdSelector, serviceById as serviceByIdSelector,
orgSections as orgSectionsSelector, orgSectionsById as orgSectionsByIdSelector,
orgSections as orgSectionsSelector, // TODO get rid of this
projectUiSections as projectSectionsSelector, projectUiSections as projectSectionsSelector,
serviceUiSections as serviceSectionsSelector, serviceUiSections as serviceSectionsSelector,
projectsByOrgId as projectsByOrgIdSelector, projectsByOrgId as projectsByOrgIdSelector,

View File

@ -12,12 +12,6 @@ test('renders <App> without exploding', (t) => {
t.deepEqual(wrapper.length, 1); t.deepEqual(wrapper.length, 1);
}); });
test('renders <Home> without exploding', (t) => {
const Home = require('@containers/home').default.WrappedComponent;
const wrapper = shallow(<Home />);
t.deepEqual(wrapper.length, 1);
});
test('renders <NotFound> without exploding', (t) => { test('renders <NotFound> without exploding', (t) => {
const NotFound = require('@containers/not-found').default; const NotFound = require('@containers/not-found').default;
const wrapper = shallow(<NotFound />); const wrapper = shallow(<NotFound />);

View File

@ -1,20 +0,0 @@
const test = require('ava');
const enzyme = require('enzyme');
const React = require('react');
const create = require('../helpers/create');
const {
render
} = enzyme;
const {
withIntl
} = create;
test('renders <ProjectSection> without exploding', (t) => {
// eslint-disable-next-line max-len
const Section = require('@containers/project/section').default.WrappedComponent;
const wrapper = render(withIntl(<Section />));
t.deepEqual(wrapper.length, 1);
});

View File

@ -14,13 +14,15 @@ const {
} = create; } = create;
test('renders <Projects> without exploding', (t) => { test('renders <Projects> without exploding', (t) => {
const Projects = require('@containers/projects').default.WrappedComponent; const Projects =
require('@containers/projects/list').default.WrappedComponent;
const wrapper = render(withRouter(withIntl(<Projects />))); const wrapper = render(withRouter(withIntl(<Projects />)));
t.deepEqual(wrapper.length, 1); t.deepEqual(wrapper.length, 1);
}); });
test('renders connected <Projects> without exploding', (t) => { test('renders connected <Projects> without exploding', (t) => {
const Projects = require('@containers/projects').default; const Projects =
require('@containers/projects/list').default;
const wrapper = render(create(<Projects />)); const wrapper = render(create(<Projects />));
t.deepEqual(wrapper.length, 1); t.deepEqual(wrapper.length, 1);
}); });
@ -40,7 +42,8 @@ test('renders <Projects>\'s list of projects ', (t) => {
plan: '100.17$ per day' plan: '100.17$ per day'
}]; }];
const Projects = require('@containers/projects').default.WrappedComponent; const Projects =
require('@containers/projects/list').default.WrappedComponent;
const wrapper = render(withRouter(withIntl( const wrapper = render(withRouter(withIntl(
<Projects projects={projects} /> <Projects projects={projects} />
))); )));
@ -55,7 +58,8 @@ test('renders <Projects>\'s list of projects ', (t) => {
}); });
test('renders <Projects>\'s empty <p> when no projects ', (t) => { test('renders <Projects>\'s empty <p> when no projects ', (t) => {
const Projects = require('@containers/projects').default.WrappedComponent; const Projects =
require('@containers/projects/list').default.WrappedComponent;
const wrapper = render(withRouter(withIntl(<Projects />))); const wrapper = render(withRouter(withIntl(<Projects />)));
const empty = wrapper.find('p[name=empty]'); const empty = wrapper.find('p[name=empty]');

View File

@ -13,14 +13,15 @@ const {
withRouter withRouter
} = create; } = create;
test('renders <Service> without exploding', (t) => { test.skip('renders <Service> without exploding', (t) => {
const Service = require('@containers/service').default.WrappedComponent; const Service =
require('@containers/service/summary').default.WrappedComponent;
const wrapper = render(withRouter(withIntl(<Service />))); const wrapper = render(withRouter(withIntl(<Service />)));
t.deepEqual(wrapper.length, 1); t.deepEqual(wrapper.length, 1);
}); });
test('renders connected <Service> without exploding', (t) => { test('renders connected <Service> without exploding', (t) => {
const Service = require('@containers/service').default; const Service = require('@containers/service/summary').default;
const wrapper = render(create(<Service />)); const wrapper = render(create(<Service />));
t.deepEqual(wrapper.length, 1); t.deepEqual(wrapper.length, 1);
}); });

View File

@ -9,17 +9,19 @@ const {
} = enzyme; } = enzyme;
const { const {
withIntl withIntl,
withRouter
} = create; } = create;
test('renders <Services> without exploding', (t) => { test('renders <Services> without exploding', (t) => {
const Services = require('@containers/services').default.WrappedComponent; const Services =
const wrapper = render(withIntl(<Services />)); require('@containers/services/view').default.WrappedComponent;
const wrapper = render(withRouter(withIntl(<Services />)));
t.deepEqual(wrapper.length, 1); t.deepEqual(wrapper.length, 1);
}); });
test('renders connected <Services> without exploding', (t) => { test.skip('renders connected <Services> without exploding', (t) => {
const Services = require('@containers/services').default; const Services = require('@containers/services/view').default;
const wrapper = render(create(<Services />)); const wrapper = render(create(<Services />));
t.deepEqual(wrapper.length, 1); t.deepEqual(wrapper.length, 1);
}); });

View File

@ -0,0 +1,18 @@
# See https://help.github.com/ignore-files/ for more about ignoring files.
# dependencies
/node_modules
# testing
/coverage
# production
/build
# misc
.DS_Store
.env
npm-debug.log*
yarn-debug.log*
yarn-error.log*

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,20 @@
{
"name": "routing-example",
"version": "0.1.0",
"private": true,
"dependencies": {
"react": "^15.4.2",
"react-dom": "^15.4.2",
"react-redux": "^5.0.3",
"react-router-dom": "^4.0.0"
},
"devDependencies": {
"react-scripts": "0.9.5"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,31 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
<!--
Notice the use of %PUBLIC_URL% in the tag above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head>
<body>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start`.
To create a production bundle, use `npm run build`.
-->
</body>
</html>

View File

@ -0,0 +1,24 @@
.App {
text-align: center;
}
.App-logo {
animation: App-logo-spin infinite 20s linear;
height: 80px;
}
.App-header {
background-color: #222;
height: 150px;
padding: 20px;
color: white;
}
.App-intro {
font-size: large;
}
@keyframes App-logo-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}

View File

@ -0,0 +1,41 @@
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import { BrowserRouter, Route } from 'react-router-dom';
import { default as TmpApp } from './components/app';
import { default as TmpAppHeader } from './components/app-header';
import { default as TmpAppRedirect } from './containers/app-redirect';
import { default as TmpOrgTabs } from './components/org-tabs';
import { default as TmpBreadcrumb } from './components/breadcrumb';
import { default as TmpMenu } from './components/menu';
import { default as TmpProjects } from './components/projects';
import { default as TmpServices } from './components/services';
import { default as TmpServicesList } from './components/services-list';
const router = (
<BrowserRouter>
<TmpApp>
<Route path="/" component={TmpAppHeader}/>
<Route path="/:org" component={TmpOrgTabs}/>
<Route path="/:org/projects/:project" component={TmpBreadcrumb}/>
<Route path="/:org" component={TmpMenu}/>
<Route path="/:org/projects" exact component={TmpProjects}/>
<Route path="/:org/projects/:project/services" exact component={TmpServices}/>
<Route path="/:org/projects/:project/services/list" component={TmpServicesList}/>
</TmpApp>
</BrowserRouter>
);
class App extends Component {
render() {
return (
<div className="App">
{router}
</div>
);
}
}
export default App;

View File

@ -0,0 +1,8 @@
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<App />, div);
});

View File

@ -0,0 +1,18 @@
import React, { Component, PropTypes} from 'react';
class AppHeader extends Component {
render() {
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>App Header - should contain logo and profile to the right, to be a connected comp, it will always be matched</p>
</div>
)
}
}
AppHeader.propTypes = {
children: PropTypes.node
}
export default AppHeader;

View File

@ -0,0 +1,20 @@
import React, { Component, PropTypes} from 'react';
class App extends Component {
render() {
console.log('App.render children');
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>App container - will just do layout shizzle and contain all</p>
{this.props.children}
</div>
)
}
}
App.propTypes = {
children: PropTypes.node
}
export default App;

View File

@ -0,0 +1,26 @@
import React, { Component, PropTypes} from 'react';
import { Link } from 'react-router-dom';
class Breadcrumb extends Component {
render() {
console.log('Breadcrumb this.props = ', this.props);
const {
match
} = this.props;
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>Breadcrumb - will match for any '/:org' path</p>
<p>Should contain the breadcrumb</p>
<p>Should be a connected component, getting as much of the data as needed (some trickery with selectors to return null if no id supplied)</p>
</div>
)
}
}
Breadcrumb.propTypes = {
match: PropTypes.object
}
export default Breadcrumb;

View File

@ -0,0 +1,34 @@
import React, { Component, PropTypes} from 'react';
import { Link } from 'react-router-dom';
class Menu extends Component {
render() {
console.log('Menu this.props = ', this.props);
const {
match
} = this.props;
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>Menu - will match for any '/:org' path</p>
<p>Should be an intelligent component, that will use the params from the path to get the sections data needed to display the links</p>
<p>Should be a connected component, see above</p>
<p>
<Link to={`${match.url}/projects`}>Projects</Link> |
<Link to={`${match.url}/people`}> People - should not show for personal org</Link> |
<Link to={`${match.url}/settings`}> Settings</Link>
</p>
<p>This component can also redirect to /:org/projects by default, and when /:org/people is hit on a personal org</p>
{this.props.children}
</div>
)
}
}
Menu.propTypes = {
children: PropTypes.node,
match: PropTypes.object
}
export default Menu;

View File

@ -0,0 +1,26 @@
import React, { Component, PropTypes} from 'react';
import { Link } from 'react-router-dom';
class OrgTabs extends Component {
render() {
console.log('this.props = ', this.props);
const {
match
} = this.props;
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>Org tabs - will match for any '/:org' path</p>
<p>Should display the org tabs</p>
<p>Should be a connected component, getting the list of orgs</p>
</div>
)
}
}
OrgTabs.propTypes = {
match: PropTypes.object
}
export default OrgTabs;

View File

@ -0,0 +1,20 @@
import React, { Component, PropTypes} from 'react';
class Project extends Component {
render() {
console.log('Project this.props = ', this.props);
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>Project</p>
{this.props.children}
</div>
)
}
}
Project.propTypes = {
children: PropTypes.node
}
export default Project;

View File

@ -0,0 +1,25 @@
import React, { Component, PropTypes} from 'react';
import { Link } from 'react-router-dom';
class Projects extends Component {
render() {
console.log('Projects this.props = ', this.props);
const {
match
} = this.props;
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>Projects</p>
<p><Link to={`${match.url}/project-judit/services`}>A project called Judit</Link></p>
</div>
)
}
}
Projects.propTypes = {
children: PropTypes.node
}
export default Projects;

View File

@ -0,0 +1,29 @@
import React, { Component, PropTypes} from 'react';
import { Link } from 'react-router-dom';
class ServicesList extends Component {
render() {
const {
match
} = this.props;
console.log('this.props = ', this.props);
const path = match.url.replace('/list', '');
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>Services List view</p>
<p>Obvs. connected, getting services data</p>
<p><Link to={path}>Topology view</Link></p>
</div>
)
}
}
ServicesList.propTypes = {
children: PropTypes.node
}
export default ServicesList;

View File

@ -0,0 +1,26 @@
import React, { Component, PropTypes} from 'react';
import { Link } from 'react-router-dom';
class Services extends Component {
render() {
const {
match
} = this.props;
return (
<div style={{border: '1px solid black', margin: '2px', padding: '2px'}}>
<p>Services Topology view</p>
<p>Obvs. connected, getting services topology data</p>
<p><Link to={`${match.url}/list`}>List view</Link></p>
</div>
)
}
}
Services.propTypes = {
children: PropTypes.node
}
export default Services;

View File

@ -0,0 +1,53 @@
import React, { Component, PropTypes} from 'react';
// import { connect } from 'react-redux';
// import { orgsSelector } from '@state/selectors';
class AppRedirect extends Component {
/*componentWillMount() {
console.log('this.props = ', this.props);
const {
match,
orgs,
push
} = this.props;
if(orgs && orgs.length){
const orgId = orgs[0].id;
const path = `${match.url}/${orgId}/projects`;
push(path);
}
}*/
render() {
return (
<div>
<p>AppRedirect</p>
</div>
)
}
}
AppRedirect.propTypes = {
match: PropTypes.object,
orgs: PropTypes.array,
push: PropTypes.func
};
export default AppRedirect;
/*const mapStateToProps = (state, {
match,
push
}) => ({
match,
orgs: orgsSelector(state),
push
});
const mapDispatchToProps = (dispatch) => ({});
export default connect(
mapStateToProps,
mapDispatchToProps
)(AppRedirect);*/

View File

@ -0,0 +1,5 @@
body {
margin: 0;
padding: 0;
font-family: sans-serif;
}

View File

@ -0,0 +1,9 @@
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';
ReactDOM.render(
<App />,
document.getElementById('root')
);

View File

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3">
<g fill="#61DAFB">
<path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/>
<circle cx="420.9" cy="296.5" r="45.7"/>
<path d="M520.5 78.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

File diff suppressed because it is too large Load Diff

View File

@ -4,8 +4,8 @@ import { libreFranklin } from '../fonts';
export default css` export default css`
${libreFranklin.normal} ${libreFranklin.normal}
${libreFranklin.medium}
${libreFranklin.semibold} ${libreFranklin.semibold}
${libreFranklin.bold}
html, body { html, body {
font-size: 15px; font-size: 15px;

View File

@ -5,22 +5,16 @@ import woffNormal from './libre-franklin/regular.woff';
import woff2Normal from './libre-franklin/regular.woff2'; import woff2Normal from './libre-franklin/regular.woff2';
import ttfNormal from './libre-franklin/regular.ttf'; import ttfNormal from './libre-franklin/regular.ttf';
import svgNormal from './libre-franklin/regular.svg'; import svgNormal from './libre-franklin/regular.svg';
import eotSemibold from './libre-franklin/semibold.eot';
import woffSemibold from './libre-franklin/semibold.woff';
import woff2Semibold from './libre-franklin/semibold.woff2';
import ttfSemibold from './libre-franklin/semibold.ttf';
import svgSemibold from './libre-franklin/semibold.svg';
import eotBold from './libre-franklin/bold.eot';
import woffBold from './libre-franklin/bold.woff';
import woff2Bold from './libre-franklin/bold.woff2';
import ttfBold from './libre-franklin/bold.ttf';
import svgBold from './libre-franklin/bold.svg';
import eotMedium from './libre-franklin/medium.eot'; import eotMedium from './libre-franklin/medium.eot';
import woffMedium from './libre-franklin/medium.woff'; import woffMedium from './libre-franklin/medium.woff';
import woff2Medium from './libre-franklin/medium.woff2'; import woff2Medium from './libre-franklin/medium.woff2';
import ttfMedium from './libre-franklin/medium.ttf'; import ttfMedium from './libre-franklin/medium.ttf';
import svgMedium from './libre-franklin/medium.svg'; import svgMedium from './libre-franklin/medium.svg';
import eotSemibold from './libre-franklin/semibold.eot';
import woffSemibold from './libre-franklin/semibold.woff';
import woff2Semibold from './libre-franklin/semibold.woff2';
import ttfSemibold from './libre-franklin/semibold.ttf';
import svgSemibold from './libre-franklin/semibold.svg';
const fontFaces = { const fontFaces = {
normal: { normal: {
@ -58,18 +52,6 @@ const fontFaces = {
ttf: ttfSemibold, ttf: ttfSemibold,
svg: svgSemibold svg: svgSemibold
} }
},
bold: {
family: 'Libre Franklin',
style: 'normal',
weight: 700,
filenames: {
eot: eotBold,
woff: woffBold,
woff2: woff2Bold,
ttf: ttfBold,
svg: svgBold
}
} }
}; };
@ -95,6 +77,5 @@ const generate = (name) => css`
export const libreFranklin = { export const libreFranklin = {
normal: generate('normal'), normal: generate('normal'),
medium: generate('medium'), medium: generate('medium'),
semibold: generate('semibold'), semibold: generate('semibold')
bold: generate('bold')
}; };

View File

@ -1,527 +0,0 @@
<?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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata></metadata>
<defs>
<font id="libre_franklinbold" horiz-adv-x="0" >
<font-face units-per-em="1000" ascent="800" descent="-200" />
<missing-glyph horiz-adv-x="206" />
<glyph unicode="&#xfb01;" horiz-adv-x="667" d="M377 525q5 -5 5 -12v-74q0 -15 -17 -15h-83q-10 0 -10 -11v-394q0 -19 -16 -19h-123q-15 0 -15 17v398q0 9 -8 9h-72q-18 0 -18 15v74q0 7 5 12t14 5h67q7 0 9.5 3.5t2.5 11.5v61q0 64 38 100t107 36h101q22 0 22 -21l1 -65q0 -17 -15 -17h-54q-22 0 -36 -16.5t-14 -42.5 v-39q0 -11 12 -11h83q9 0 14 -5zM613 619q0 -25 -27 -25h-108q-12 0 -17 5.5t-5 17.5v105q0 20 17 20h124q7 0 11.5 -5t4.5 -14v-104zM611 24q0 -13 -6 -18.5t-21 -5.5h-105q-12 0 -17 5t-5 16v490q0 19 17 19h122q15 0 15 -17v-489z" />
<glyph unicode="&#xfb02;" horiz-adv-x="668" d="M377 525q5 -5 5 -12v-74q0 -15 -17 -15h-83q-10 0 -10 -11v-394q0 -19 -16 -19h-123q-15 0 -15 17v398q0 9 -8 9h-72q-18 0 -18 15v74q0 7 5 12t14 5h67q7 0 9.5 3.5t2.5 11.5v61q0 64 38 100t107 36h101q22 0 22 -21l1 -65q0 -17 -15 -17h-54q-22 0 -36 -16.5t-14 -42.5 v-39q0 -11 12 -11h83q9 0 14 -5zM612 24q0 -13 -6 -18.5t-21 -5.5h-106q-12 0 -17 5t-5 16l3 702q0 19 16 19h121q15 0 15 -18v-700z" />
<glyph />
<glyph />
<glyph unicode="&#xd;" horiz-adv-x="211" />
<glyph unicode=" " horiz-adv-x="206" />
<glyph unicode="&#x09;" horiz-adv-x="206" />
<glyph unicode="&#xa0;" horiz-adv-x="206" />
<glyph unicode="!" horiz-adv-x="264" d="M182 254q-2 -12 -7.5 -17t-19.5 -5h-53q-11 0 -15 4.5t-6 15.5l-38 472v2q0 8 4.5 12t10.5 4h147q7 0 11 -5t3 -12zM214 24q0 -13 -6 -18.5t-21 -5.5h-118q-12 0 -17 5t-5 16v124q0 18 15 18h137q15 0 15 -16v-123z" />
<glyph unicode="&#x22;" horiz-adv-x="469" d="M390 474q-2 -13 -7.5 -18t-19.5 -5h-35q-12 0 -16 4.5t-5 15.5l-34 254v3q0 6 4.5 10t10.5 4h121q8 0 12 -4.5t3 -11.5zM168 474q-2 -13 -7.5 -18t-19.5 -5h-35q-12 0 -16 4.5t-5 15.5l-34 254v3q0 6 4.5 10t10.5 4h121q8 0 12 -4.5t3 -11.5z" />
<glyph unicode="#" horiz-adv-x="603" d="M583 514.5q4 -4.5 4 -11.5v-41q0 -12 -6.5 -17t-20.5 -5h-96l-20 -131h95q7 0 11 -4.5t4 -11.5v-41q0 -12 -6.5 -17t-20.5 -5h-94l-31 -206q-2 -15 -6.5 -20t-18.5 -4l-34 5q-14 2 -19 5.5t-4 13.5l31 206h-136l-31 -206q-2 -15 -6.5 -20t-18.5 -4l-34 5q-14 2 -18.5 5.5 t-3.5 13.5l31 206h-97q-12 0 -16 4.5t-4 15.5v41q0 18 14 18h114l20 131h-95q-12 0 -16 4.5t-4 15.5v41q0 18 14 18h113l30 204q3 20 15 19l51 -5q15 -2 14 -18l-30 -200h137l31 204q3 20 15 19l51 -5q15 -2 14 -18l-30 -200h97q7 0 11 -4.5zM382 440h-136l-20 -131h137z " />
<glyph unicode="$" horiz-adv-x="655" d="M559.5 65.5q-60.5 -59.5 -162.5 -69.5q-11 -1 -14 -4t-3 -12v-36q0 -12 -5.5 -17.5t-18.5 -5.5h-55q-21 0 -21 20v40q0 9 -3 12t-11 3q-72 4 -125.5 26.5t-100.5 65.5q-15 12 -15 21q0 6 5 11l60 65q9 9 16 9q6 0 13 -7q63 -68 148 -79l6 -1q8 0 8 11l1 171q0 8 -3 12.5 t-12 7.5q-118 26 -169.5 82t-51.5 137q0 80 57 136.5t160 74.5q19 5 19 17v38q0 6 3.5 10t8.5 4h68q18 0 18 -19v-40q0 -6 13 -9q101 -21 173 -75q8 -5 8 -13q0 -5 -5 -12l-53 -68q-6 -7 -12 -7q-8 0 -16 8q-17 17 -42.5 31.5t-53.5 21.5l-4 1q-9 0 -9 -9v-169 q0 -6 2.5 -8.5t9.5 -4.5l56 -15q79 -24 126 -78.5t47 -128.5q0 -89 -60.5 -148.5zM282 619q0 15 -13 12q-45 -8 -69 -31.5t-24 -55.5q0 -31 20 -51.5t66 -34.5q2 -1 6 -1q14 0 14 19v143zM392 107q45 5 71 28t26 56q0 35 -23 58t-74 37q-2 1 -6 1q-7 0 -7 -11v-162 q0 -9 13 -7z" />
<glyph unicode="%" horiz-adv-x="944" d="M324 724.5q43 -28.5 67.5 -77t24.5 -106.5t-24.5 -106t-67 -75.5t-95.5 -27.5t-96.5 27.5t-68 75.5t-24.5 106t25 106.5t68 77t96 28.5q52 0 95 -28.5zM274 7q-7 -11 -25 -11l-42 1q-16 0 -16 14q0 6 5 14l475 714q5 7 10 9t13 2h53q12 0 12 -8q0 -1 -4 -9zM284.5 444 q18.5 34 18.5 96q0 65 -18.5 100t-56.5 35q-37 0 -56 -35.5t-19 -99.5q0 -62 18.5 -96t56.5 -34t56.5 34zM812 382.5q43 -28.5 67.5 -77t24.5 -106.5t-24.5 -106t-67 -75.5t-95.5 -27.5t-96.5 27.5t-68 75.5t-24.5 106t25 106.5t68.5 77t95.5 28.5t95 -28.5zM772.5 102 q18.5 34 18.5 96q0 64 -19 99.5t-56 35.5t-55.5 -35.5t-18.5 -99.5q0 -61 18.5 -95.5t55.5 -34.5q38 0 56.5 34z" />
<glyph unicode="&#x26;" horiz-adv-x="838" d="M491 733q51 -20 80 -56t29 -83q0 -50 -41.5 -102t-110.5 -85q-8 -4 -8 -8t5 -9l106 -116q6 -6 10 -6q3 0 11 8q25 28 47.5 63t33.5 64q6 10 16 10q5 0 8 -1l77 -25q8 -2 12 -10t1 -16q-30 -72 -110 -169q-6 -7 -6 -11t8 -9q23 -17 56.5 -28.5t69.5 -12.5q11 -1 15.5 -5 t4.5 -14v-87q0 -25 -22 -25q-69 0 -130 18.5t-108 52.5q-8 5 -13 5t-14 -6q-50 -38 -107 -56.5t-127 -18.5q-116 0 -180.5 52t-64.5 146q0 60 39.5 109.5t127.5 98.5q10 6 10 11t-8 14q-30 33 -46.5 70t-16.5 73q0 52 30 94t82.5 66t117.5 24t116 -20zM321 637 q-23 -23 -23 -54q0 -30 28 -61l33 -39q4 -3 9 -3t11 2q86 42 86 105q0 34 -23 53.5t-60 19.5q-38 0 -61 -23zM292 323q-5 0 -12 -4q-35 -19 -55 -48t-20 -61q0 -42 32.5 -71.5t79.5 -29.5q28 0 59.5 11.5t52.5 29.5q8 8 8 14t-5 11l-125 140q-7 8 -15 8z" />
<glyph unicode="'" horiz-adv-x="248" d="M168 474q-2 -13 -7.5 -18t-19.5 -5h-35q-12 0 -16 4.5t-5 15.5l-34 254v3q0 6 4.5 10t10.5 4h121q8 0 12 -4.5t3 -11.5z" />
<glyph unicode="(" horiz-adv-x="314" d="M296 738q2 -4 -1 -9q-52 -103 -81 -216.5t-29 -228.5q0 -110 26.5 -214.5t80.5 -220.5l2 -5q0 -4 -3 -6.5t-8 -2.5h-81q-6 0 -9.5 2.5t-7.5 8.5q-69 118 -103 219t-34 220q0 120 37 233.5t102 211.5q9 12 23 12h77q7 0 9 -4z" />
<glyph unicode=")" horiz-adv-x="314" d="M104 742q14 0 23 -12q65 -98 102 -211.5t37 -233.5q0 -119 -34 -220t-103 -219q-4 -6 -7.5 -8.5t-9.5 -2.5h-81q-7 0 -9.5 4.5t0.5 9.5q54 116 80.5 220.5t26.5 214.5q0 115 -29 228.5t-81 216.5q-2 4 -2 6q0 7 10 7h77z" />
<glyph unicode="*" horiz-adv-x="465" d="M239 464q-1 3 -4 3t-5 -3l-74 -124q-3 -5 -11 -5q-7 0 -12 4l-54 38q-8 6 -8 11q0 4 5 9l90 108q2 4 2 5q0 5 -7 6l-126 35q-9 3 -9 12q0 3 2 9l21 59q3 7 7 9t10 -2l120 -52q2 -1 5 -1q6 0 6 7l-11 137v2q0 4 3.5 7.5t9.5 3.5h73q12 0 12 -13l-12 -137q0 -11 9 -7 l122 54q6 2 8 2q9 0 12 -12l18 -58q1 -2 1 -7q0 -9 -11 -12l-123 -36q-9 -3 -2 -12l86 -103q4 -6 4 -9q0 -7 -11 -15l-48 -34q-8 -5 -13 -5q-8 0 -12 6z" />
<glyph unicode="+" horiz-adv-x="583" d="M532 424.5q4 -4.5 4 -11.5v-73q0 -12 -6.5 -17t-20.5 -5h-161v-173q0 -7 -4.5 -11t-11.5 -4h-73q-12 0 -17 6t-5 20v161h-168q-11 0 -15.5 5t-4.5 15v73q0 19 15 19h173v167q0 12 4.5 16.5t15.5 4.5h73q18 0 18 -15v-173h173q7 0 11 -4.5z" />
<glyph unicode="," horiz-adv-x="253" d="M42.5 -149.5q-3.5 6.5 -0.5 14.5l48 109q4 8 4 15q0 11 -13 11h-18q-22 0 -22 20v126q0 9 4.5 13.5t11.5 4.5h137q15 0 15 -16v-121q0 -6 -3 -14l-98 -151q-6 -9 -16 -13.5t-20 -4.5h-18q-8 0 -11.5 6.5z" />
<glyph unicode="-" horiz-adv-x="380" d="M331 230q0 -22 -26 -22h-235q-12 0 -16.5 4.5t-4.5 15.5v73q0 18 15 18h252q7 0 11 -4t4 -11v-74z" />
<glyph unicode="." horiz-adv-x="251" d="M208 24q0 -13 -6.5 -18.5t-21.5 -5.5h-118q-22 0 -22 21v127q0 9 4.5 13.5t11.5 4.5h137q15 0 15 -17v-125z" />
<glyph unicode="/" horiz-adv-x="365" d="M6 -2l249 729q2 7 8 11t13 4h67q17 0 17 -13q0 -5 -3 -13l-243 -712q-8 -21 -28 -21h-68q-18 0 -12 15z" />
<glyph unicode="0" horiz-adv-x="708" d="M514 705q70 -48 110 -135t40 -201t-39.5 -199.5t-109.5 -132t-160 -46.5t-160.5 46.5t-110 132t-39.5 198.5q0 114 40 201.5t110.5 135.5t159.5 48t159 -48zM454 174q32 59 32 194q0 138 -32.5 200.5t-99.5 62.5q-66 0 -99 -63t-33 -200q0 -134 33 -193.5t100 -59.5 t99 59z" />
<glyph unicode="1" horiz-adv-x="509" d="M475 114v-97q0 -7 -5 -12t-15 -5h-395q-19 0 -19 17v97q0 15 17 15h104q11 0 11 7v420q0 8 -3 10.5t-11 0.5l-97 -29l-7 -1q-15 0 -15 20v66q0 10 3 14.5t12 9.5l167 83q14 7 22.5 9.5t19.5 2.5h69q7 0 11 -5t4 -13v-585q0 -10 9 -10h100q18 0 18 -15z" />
<glyph unicode="2" horiz-adv-x="644" d="M269 321q66 57 98 91t44.5 59.5t12.5 55.5q0 45 -31.5 71.5t-79.5 26.5q-42 0 -77.5 -24.5t-68.5 -80.5q-3 -8 -13 -8q-7 0 -14 4l-89 46q-12 8 -12 18q0 7 5 15q99 157 279 157q80 0 141.5 -27t95.5 -78t34 -120q0 -61 -32.5 -112t-111.5 -114l-185 -145q-6 -4 -6 -7 q0 -5 12 -5h311q19 0 19 -16v-110q0 -18 -20 -18h-521q-13 0 -18 4.5t-5 16.5v77q0 9 8 19.5t38 35.5z" />
<glyph unicode="3" horiz-adv-x="667" d="M61 636q0 5 4 12q40 48 110 76t149 28q86 0 149.5 -24.5t97 -68.5t33.5 -101q0 -50 -31 -92.5t-87 -59.5q-12 -4 -12 -10q0 -5 11 -8q64 -21 103 -67t39 -106q0 -109 -79.5 -167t-235.5 -58q-86 0 -160.5 33.5t-116.5 90.5q-5 7 -5 13q0 8 11 16l78 55q9 6 13 6q6 0 9 -5 q47 -48 86.5 -67t94.5 -19q62 0 97.5 27t35.5 71q0 49 -39.5 78t-99.5 30l-86 2q-17 0 -17 14v94q0 11 17 14l69 3q59 1 96.5 29.5t37.5 71.5q0 36 -31.5 60.5t-79.5 24.5q-46 0 -84 -17.5t-78 -56.5q-7 -7 -11 -7q-2 0 -11 7l-73 68q-4 4 -4 10z" />
<glyph unicode="4" horiz-adv-x="689" d="M380.5 738.5q7.5 3.5 23.5 3.5h125q16 0 16 -18v-419q0 -5 3 -8t7 -3h82q19 0 19 -15v-86q0 -18 -20 -18h-80q-11 0 -11 -12v-140q0 -12 -6 -17.5t-20 -5.5h-130q-21 0 -21 20v146q0 9 -12 9h-300q-21 0 -21 18v83q0 9 5.5 19t20.5 30l302 398q10 12 17.5 15.5zM360 294 q4 0 6.5 2t2.5 5v249q0 14 -3 14q-4 0 -11 -10l-179 -247q-4 -6 -4 -8q0 -5 11 -5h177z" />
<glyph unicode="5" horiz-adv-x="676" d="M562 742q16 0 20 -4t3 -19l-5 -99q-1 -10 -5.5 -14t-16.5 -4h-315q-17 0 -18 -15l-12 -127v-2q0 -7 4.5 -10t10.5 -1q48 17 76.5 24t66.5 7q76 0 136 -27t95 -80.5t35 -128.5q0 -78 -38 -135t-106 -87t-158 -30q-95 0 -173 32.5t-120 87.5q-8 10 -8 18q0 10 10 16l82 58 q5 4 11 4q9 0 15 -8q42 -44 76.5 -64.5t87.5 -20.5q70 0 109.5 34.5t39.5 89.5q0 53 -36.5 85t-98.5 32q-32 0 -59.5 -9.5t-68.5 -29.5q-8 -4 -13 -4q-4 0 -13 5l-91 50q-11 6 -11 17q0 9 1 15l28 320q1 14 8 19t28 5h423z" />
<glyph unicode="6" horiz-adv-x="685" d="M483.5 730q50.5 -21 82.5 -52.5t43 -62.5q1 -3 1 -8q0 -10 -10 -14l-109 -35q-2 -1 -5 -1q-9 0 -14 12q-22 30 -43.5 45t-56.5 15q-73 0 -113.5 -53t-40.5 -139q0 -14 1.5 -19t7.5 -5q1 0 13 4q45 19 76.5 28t74.5 9q76 0 134.5 -28t90.5 -78t32 -114q0 -70 -38.5 -125.5 t-104.5 -86.5t-147 -31q-96 0 -166.5 44.5t-108.5 126.5t-38 193q0 122 40.5 211.5t114.5 137t172 47.5q61 0 111.5 -21zM289.5 329q-35.5 -10 -55.5 -24q-9 -6 -11.5 -12.5t-2.5 -21.5q0 -68 36 -116.5t97 -48.5q52 0 87 35t35 87q0 50 -34 80.5t-86 30.5q-30 0 -65.5 -10z " />
<glyph unicode="7" horiz-adv-x="619" d="M558 742q14 0 21.5 -6.5t6.5 -15.5l-3 -54q-1 -9 -9 -26.5t-16 -29.5q-58 -87 -107 -197t-80.5 -213.5t-37.5 -171.5q-1 -28 -21 -28h-158q-18 0 -18 16q0 5 1 8q34 124 93.5 256t168.5 305q4 8 4 11q0 6 -12 6h-338q-22 0 -20 20l11 106q2 14 24 14h490z" />
<glyph unicode="8" horiz-adv-x="683" d="M477.5 725q62.5 -27 98 -74t35.5 -106q0 -82 -96 -138q-8 -5 -8 -9q0 -5 7 -9q71 -38 100.5 -80.5t29.5 -98.5q0 -68 -39 -118t-109.5 -76t-163.5 -26q-132 0 -211.5 51t-79.5 142q0 51 26 90t89 74q1 1 5.5 3.5t4.5 5.5q0 4 -8 9q-46 31 -71.5 67.5t-25.5 91.5 q0 62 34 114.5t96.5 83t145.5 30.5q78 0 140.5 -27zM258 611.5q-33 -25.5 -33 -66.5q0 -30 17.5 -50.5t51.5 -30.5l80 -23q3 -1 9 -1q18 0 37 15.5t31.5 39t12.5 46.5q0 41 -33.5 68.5t-90.5 27.5q-49 0 -82 -25.5zM436.5 130q34.5 25 34.5 67q0 32 -18.5 53t-62.5 34 l-95 28q-8 2 -13 2q-20 0 -41.5 -14t-36 -38.5t-14.5 -52.5q0 -50 37.5 -77t114.5 -27q60 0 94.5 25z" />
<glyph unicode="9" horiz-adv-x="684" d="M201 12q-51 21 -83.5 52.5t-43.5 62.5q-1 3 -1 9q0 9 9 13l109 35q2 1 5 1q7 0 10.5 -5t4.5 -6q20 -30 43 -45.5t60 -15.5q72 0 111.5 53t39.5 139q0 14 -1.5 19t-7.5 5q-1 0 -13 -4q-44 -19 -75 -28t-74 -9q-76 0 -134 28t-90 78t-32 114q0 70 38.5 125.5t104.5 86.5 t147 31q95 0 165.5 -44.5t108 -126.5t37.5 -193q0 -122 -40.5 -211.5t-114 -137t-170.5 -47.5q-62 0 -113 21zM395 413.5q35 10.5 55 25.5q9 6 11.5 12.5t2.5 21.5q0 67 -35.5 115t-96.5 48q-51 0 -86 -34.5t-35 -86.5q0 -51 33.5 -81.5t84.5 -30.5q31 0 66 10.5z" />
<glyph unicode=":" horiz-adv-x="251" d="M208 379q0 -13 -6.5 -18.5t-21.5 -5.5h-118q-22 0 -22 21v124q0 9 4.5 13.5t11.5 4.5h137q15 0 15 -17v-122zM208 27q0 -13 -6.5 -18.5t-21.5 -5.5h-118q-22 0 -22 21v124q0 18 16 18h137q15 0 15 -16v-123z" />
<glyph unicode=";" horiz-adv-x="259" d="M45 354.5q-5 4.5 -5 15.5v127q0 9 4.5 14t11.5 5h137q15 0 15 -17v-125q0 -13 -6.5 -18.5t-21.5 -5.5h-118q-12 0 -17 4.5zM42.5 -152.5q-3.5 6.5 -0.5 14.5l48 112q4 8 4 15q0 11 -13 11h-18q-22 0 -22 20v126q0 9 4.5 13.5t11.5 4.5h137q15 0 15 -16v-121q0 -6 -3 -14 l-98 -154q-6 -9 -16 -13.5t-20 -4.5h-18q-8 0 -11.5 6.5z" />
<glyph unicode="&#x3c;" horiz-adv-x="577" d="M518 137q0 -12 -5.5 -18t-14.5 -6q-6 0 -12 3l-422 163q-22 9 -22 28v89q0 11 5.5 17.5t16.5 10.5l423 165q8 2 10 2q9 0 15 -6.5t6 -16.5v-76q0 -12 -8.5 -20.5t-27.5 -16.5l-272 -104l272 -102q20 -8 28 -15.5t8 -21.5v-75z" />
<glyph unicode="=" horiz-adv-x="583" d="M536 437q0 -12 -6.5 -17t-20.5 -5h-440q-12 0 -16 4.5t-4 14.5v74q0 18 15 18h457q7 0 11 -4.5t4 -11.5v-73zM536 202q0 -12 -6.5 -17t-20.5 -5h-440q-12 0 -16 4.5t-4 14.5v74q0 18 15 18h457q7 0 11 -4.5t4 -11.5v-73z" />
<glyph unicode="&#x3e;" horiz-adv-x="577" d="M67.5 233.5q7.5 7.5 27.5 15.5l272 102l-272 104q-19 8 -27.5 16.5t-8.5 20.5v76q0 10 6 16.5t15 6.5q3 0 11 -2l422 -165q11 -4 16.5 -10.5t5.5 -17.5v-89q0 -20 -22 -28l-422 -163q-6 -3 -12 -3q-9 0 -14 6t-5 18v75q0 14 7.5 21.5z" />
<glyph unicode="?" horiz-adv-x="537" d="M8 591q0 6 1 9q32 74 98 113t157 39q72 0 128 -23.5t86.5 -63.5t30.5 -88q0 -37 -14 -66.5t-34 -50.5t-53 -50q-48 -42 -72 -75t-24 -81q0 -8 -6 -13.5t-14 -5.5h-82q-21 0 -21 23q0 46 14.5 83t35 62.5t52.5 57.5q35 36 50.5 58.5t15.5 49.5q0 35 -26.5 56.5t-67.5 21.5 q-40 0 -75 -22.5t-50 -60.5q-4 -8 -8 -9.5t-13 -0.5l-100 24q-9 3 -9 13zM333 24q0 -13 -6.5 -18.5t-20.5 -5.5h-119q-12 0 -16.5 5t-4.5 16v124q0 18 16 18h137q14 0 14 -16v-123z" />
<glyph unicode="@" horiz-adv-x="834" d="M564.5 -94q-61.5 -19 -133.5 -19q-120 0 -208.5 50t-136 135.5t-47.5 189.5q0 108 51 199.5t144.5 145.5t215.5 54q95 0 177.5 -34.5t133 -107t50.5 -180.5q0 -75 -25 -133.5t-70 -91.5t-102 -33q-41 0 -64 13.5t-33 33.5q-3 6 -6 6q-2 0 -7 -6q-24 -28 -57.5 -44.5 t-75.5 -16.5q-43 0 -77.5 21.5t-54.5 61.5t-20 92q0 62 25 115.5t71.5 85.5t106.5 32q38 0 63 -13.5t45 -37.5q2 -2 4.5 -1t3.5 5l4 15q2 6 10 6h70q9 0 8 -7l-36 -213q-2 -9 -2 -24q0 -38 32 -38q24 0 46 19t35.5 56.5t13.5 90.5q0 127 -77 185.5t-193 58.5 q-105 0 -176 -42t-105.5 -113t-34.5 -159q0 -92 37.5 -159.5t108.5 -103t167 -35.5q58 0 93 12.5t80 40.5q5 4 11 4t9 -5l32 -43q3 -5 3 -8q0 -7 -10 -12q-38 -29 -99.5 -48zM345 185.5q18 -26.5 53 -26.5q29 0 54 19t39 49t14 63q0 41 -21.5 67t-54.5 26q-42 0 -72 -37.5 t-30 -91.5q0 -42 18 -68.5z" />
<glyph unicode="A" horiz-adv-x="771" d="M33 17q0 8 2 12l249 693q4 11 9.5 15.5t16.5 4.5h150q11 0 19 -6t11 -16l247 -693q2 -6 2 -9q0 -8 -3.5 -13t-10.5 -5h-147q-15 0 -19 14l-52 146q-2 6 -4.5 8.5t-8.5 2.5h-244q-10 0 -13 -10l-53 -148q-6 -13 -21 -13h-115q-15 0 -15 17zM453 304q10 0 10 8q0 6 -1 9 l-84 234q-3 6 -7 6q-3 0 -6 -7l-85 -233q-2 -6 -2 -9q0 -8 11 -8h164z" />
<glyph unicode="B" horiz-adv-x="723" d="M75 5q-5 5 -5 13v703q0 10 5.5 15.5t14.5 5.5h271q147 0 224.5 -49.5t77.5 -145.5q0 -56 -30 -94.5t-101 -67.5q-3 -1 -3 -4t3 -4q78 -26 113.5 -67.5t35.5 -108.5q0 -102 -76.5 -151.5t-230.5 -49.5h-285q-9 0 -14 5zM376 436q49 0 81.5 23.5t32.5 67.5q0 46 -34 71.5 t-89 25.5h-103q-10 0 -14.5 -4t-4.5 -13v-153q0 -10 3 -14t11 -4h117zM369 118q64 0 97 26.5t33 72.5t-34 71.5t-89 25.5h-112q-11 0 -15 -3.5t-4 -13.5v-160q0 -10 3 -14.5t11 -4.5h110z" />
<glyph unicode="C" horiz-adv-x="725" d="M522 723q64 -29 105.5 -79t52.5 -112q2 -7 2 -16q0 -6 -3 -8t-9 -3l-135 -9q-9 0 -11.5 3t-4.5 12q-11 55 -44 87t-88 32q-160 0 -160 -256q0 -133 40 -194t122 -61q60 0 101.5 30t67.5 98q3 7 13 7q6 0 9 -1l98 -21q14 -5 11 -25q-10 -43 -46.5 -93t-102.5 -87t-158 -37 q-103 0 -179.5 48.5t-117.5 136t-41 202.5q0 114 41 199t117.5 130.5t179.5 45.5q76 0 140 -29z" />
<glyph unicode="D" horiz-adv-x="751" d="M315 741q198 -6 295 -101t97 -266q0 -176 -101 -275t-296 -99h-217q-12 0 -17.5 5.5t-5.5 18.5v698q0 11 5 15.5t17 4.5q165 0 223 -1zM245 604v-467q0 -8 2.5 -11t10.5 -3h19q126 0 186.5 58.5t60.5 193.5q0 125 -51 180t-158 61l-61 2q-9 0 -9 -14z" />
<glyph unicode="E" horiz-adv-x="654" d="M86 742h504q15 0 15 -17l-1 -90q0 -21 -21 -21h-319q-19 0 -19 -16v-145q0 -17 15 -17h212q17 0 17 -16v-96q0 -14 -16 -14h-214q-14 0 -14 -12v-157q0 -7 2.5 -10t8.5 -3h342q18 0 18 -15v-95q0 -18 -20 -18h-504q-12 0 -17 5t-5 16v702q0 19 16 19z" />
<glyph unicode="F" horiz-adv-x="631" d="M86 742h496q15 0 15 -17l-1 -90q0 -21 -20 -21h-312q-10 0 -14.5 -4t-4.5 -12v-155q0 -16 15 -16h217q16 0 16 -16v-95q0 -14 -15 -14h-219q-14 0 -14 -13v-266q0 -13 -6 -18t-20 -5h-127q-12 0 -17 5t-5 16v702q0 19 16 19z" />
<glyph unicode="G" horiz-adv-x="752" d="M201.5 37q-75.5 47 -116.5 132.5t-41 198.5q0 116 43 203t121 134t180 47q78 0 142.5 -30t105 -78.5t50.5 -103.5q2 -6 2 -15q0 -11 -13 -12l-132 -20q-8 0 -11 3.5t-5 12.5q-10 52 -47 86t-96 34q-77 0 -117 -61t-40 -194q0 -139 42 -200t121 -61q60 0 96 32.5t47 81.5 l2 29q1 2 1 6q0 9 -11 9h-121q-8 0 -12 4t-4 13v75q0 14 16 14l267 -1q14 0 21.5 -6.5t7.5 -17.5v-337q0 -7 -4 -11t-11 -4h-32q-17 0 -26 16l-29 72q-3 7 -10 -1q-35 -43 -83.5 -70t-126.5 -27q-101 0 -176.5 47z" />
<glyph unicode="H" horiz-adv-x="751" d="M258 317q-6 0 -9.5 -4t-3.5 -9v-281q0 -12 -6.5 -17.5t-20.5 -5.5h-126q-12 0 -17 5t-5 16v702q0 19 16 19h143q16 0 16 -18v-256q0 -17 15 -17h231q16 0 16 16v257q0 18 15 18h143q17 0 17 -19v-702q0 -21 -22 -21h-127q-14 0 -20 5t-6 18v281q0 6 -3.5 9.5t-10.5 3.5 h-235z" />
<glyph unicode="I" horiz-adv-x="315" d="M229 742q16 0 16 -18v-700q0 -13 -6 -18.5t-21 -5.5h-126q-12 0 -17 5t-5 16v702q0 19 16 19h143z" />
<glyph unicode="J" horiz-adv-x="447" d="M331.5 38q-50.5 -48 -156.5 -48q-29 0 -54.5 4t-64.5 12q-13 2 -18.5 10t-4.5 23l9 90q2 21 19 18q6 -2 24 -7.5t42 -5.5q41 0 60.5 23t19.5 78v488q0 9 4.5 14t12.5 5h143q15 0 15 -18v-532q0 -106 -50.5 -154z" />
<glyph unicode="K" horiz-adv-x="744" d="M713 12q0 -12 -14 -12h-150q-21 0 -29 16l-161 314q-3 6 -7 6t-12 -10l-89 -106q-6 -7 -6 -21v-176q0 -12 -6.5 -17.5t-20.5 -5.5h-126q-12 0 -17 4.5t-5 15.5v703q0 19 16 19h144q15 0 15 -17v-299q0 -10 4 -10q3 0 8 6l242 304q6 9 13 12.5t21 3.5h119q9 0 14.5 -4 t5.5 -9q0 -6 -4 -10l-192 -225q-5 -8 -5 -12t3 -12l236 -446q3 -6 3 -12z" />
<glyph unicode="L" horiz-adv-x="627" d="M86 742h143q16 0 16 -18v-583q0 -7 2.5 -10t8.5 -3h319q18 0 18 -15v-95q0 -8 -5 -13t-14 -5h-482q-12 0 -17 5t-5 16v702q0 19 16 19z" />
<glyph unicode="M" horiz-adv-x="949" d="M75.5 6q-5.5 6 -5.5 17v700q0 19 17 19h207q11 0 16 -3t8 -12l151 -419q3 -8 7 -8t7 8l144 411q6 23 22 23h215q15 0 15 -18v-700q0 -13 -6 -18.5t-19 -5.5h-129q-12 0 -16.5 4.5t-4.5 15.5v498q0 7 -3 7t-6 -8l-175 -501q-5 -16 -21 -16h-83q-18 0 -22 16l-173 494 q-3 8 -6 8q-4 0 -4 -9v-491q0 -11 -3.5 -14.5t-14.5 -3.5h-102q-10 0 -15.5 6z" />
<glyph unicode="N" horiz-adv-x="759" d="M676 742q13 0 13 -15v-711q0 -7 -5.5 -11.5t-13.5 -4.5h-101q-9 0 -14 2t-11 10l-319 448q-4 5 -7.5 4t-3.5 -6v-440v-3q0 -8 -4.5 -11.5t-15.5 -3.5h-104q-20 0 -20 17v706q0 19 18 19h121q12 0 17 -2.5t12 -12.5l294 -419q6 -8 10 -8q5 0 5 11v413q0 18 18 18h111z" />
<glyph unicode="O" horiz-adv-x="774" d="M205.5 35.5q-77.5 45.5 -119 130.5t-41.5 202q0 118 42 204.5t119.5 133t181.5 46.5q103 0 180 -46.5t119 -133t42 -203.5q0 -116 -41.5 -201.5t-118.5 -131.5t-181 -46q-105 0 -182.5 45.5zM508.5 173q37.5 60 37.5 194q0 137 -38.5 200t-119.5 63q-83 0 -121.5 -63 t-38.5 -200q0 -134 38 -194t122 -60q83 0 120.5 60z" />
<glyph unicode="P" horiz-adv-x="715" d="M602.5 343.5q-74.5 -59.5 -196.5 -59.5h-150q-11 0 -11 -11v-250q0 -23 -26 -23h-128q-12 0 -16.5 5t-4.5 15v703q0 19 16 19h300q83 0 148.5 -25.5t104 -77.5t38.5 -128q0 -108 -74.5 -167.5zM464 591q-33 26 -89 26h-111q-10 0 -14.5 -4t-4.5 -14v-171q0 -10 3 -14.5 t11 -4.5h123q53 0 84 28t31 77q0 51 -33 77z" />
<glyph unicode="Q" horiz-adv-x="775" d="M87 572.5q42 86.5 119.5 133t181.5 46.5q103 0 180.5 -46.5t119.5 -133t42 -203.5q0 -201 -119 -301q-3 -2 -3 -8q0 -15 33.5 -35.5t71.5 -26.5q14 -1 14 -14v-84q0 -15 -8 -20.5t-29 -5.5q-124 0 -214 117q-5 7 -15 4q-40 -5 -73 -5q-105 0 -182.5 45.5t-119 131 t-41.5 202.5t42 203.5zM266 173q38 -60 122 -60q82 0 120.5 60t38.5 195t-38.5 198.5t-120.5 63.5q-83 0 -121.5 -63.5t-38.5 -199.5q0 -134 38 -194z" />
<glyph unicode="R" horiz-adv-x="722" d="M674 18q0 -8 -5 -13t-12 -5h-147q-17 0 -22 18l-108 280q-3 8 -9 11t-19 3h-95q-6 0 -9 -3.5t-3 -7.5v-277q0 -13 -6.5 -18.5t-20.5 -5.5h-127q-12 0 -16.5 5t-4.5 15v703q0 19 16 19h312q135 0 209 -53t74 -151q0 -73 -39 -124.5t-98 -72.5q-8 -3 -4 -15l132 -299 q2 -6 2 -9zM470 454.5q30 24.5 30 71.5q0 48 -30.5 73.5t-82.5 25.5h-123q-11 0 -15 -3.5t-4 -12.5v-162q0 -9 3 -13t11 -4h123q58 0 88 24.5z" />
<glyph unicode="S" horiz-adv-x="677" d="M436.5 612.5q-33.5 16.5 -87.5 16.5q-61 0 -93 -22t-32 -58q0 -52 81 -76l158 -45q89 -25 132.5 -79t43.5 -130q0 -70 -36 -121.5t-103.5 -79.5t-158.5 -28q-102 0 -184 34.5t-120 94.5q-4 7 -4 13q0 8 10 17l77 53q10 6 18 6q9 0 15 -8q37 -48 75 -68t101 -20 q67 0 105 21t38 63q0 27 -19 46t-64 33l-151 43q-86 24 -133 80.5t-47 128.5q0 64 35.5 115t100.5 80.5t150 29.5q84 0 154 -28.5t107 -76.5q6 -8 6 -14t-6 -11l-84 -62q-6 -4 -9 -4q-5 0 -16 11q-26 29 -59.5 45.5z" />
<glyph unicode="T" horiz-adv-x="681" d="M33 724q0 8 5.5 13t14.5 5h574q20 0 20 -18v-93q0 -15 -18 -15h-187q-11 0 -11 -10v-587q0 -19 -17 -19h-143q-15 0 -15 17v586q0 7 -2.5 10t-8.5 3h-193q-19 0 -19 15v93z" />
<glyph unicode="U" horiz-adv-x="721" d="M582 56.5q-77 -66.5 -222 -66.5q-159 0 -229 75t-70 228v429q0 9 4.5 14.5t11.5 5.5h144q15 0 15 -18v-453q0 -81 34.5 -118.5t102.5 -37.5q142 0 142 159v449q0 19 15 19h114q15 0 15 -18v-449q0 -152 -77 -218.5z" />
<glyph unicode="V" horiz-adv-x="733" d="M699.5 735q4.5 -7 0.5 -16l-240 -698q-7 -21 -31 -21h-125q-24 0 -32 21l-238 697l-2 8q0 7 5 11.5t13 4.5h144q16 0 21 -17l164 -506q1 -7 5 -7t7 8l159 505q5 17 22 17h113q10 0 14.5 -7z" />
<glyph unicode="W" horiz-adv-x="1084" d="M1050 721q0 -7 -1 -10l-204 -690q-4 -11 -11 -16t-19 -5h-108q-25 0 -31 21l-126 437q-2 10 -5 10q-2 0 -7 -12l-127 -435q-3 -11 -10 -16t-20 -5h-111q-13 0 -20 5t-11 16l-204 690q-1 3 -1 10q0 21 25 21h125q12 0 18 -4t8 -13l129 -455q3 -12 6 -12t6 9l129 458 q3 17 26 17h107q13 0 18.5 -4t8.5 -13l131 -462q2 -7 6 -7.5t5 6.5l127 463q5 17 27 17h90q24 0 24 -21z" />
<glyph unicode="X" horiz-adv-x="729" d="M697 13q0 -13 -21 -13h-139q-23 0 -32 15l-141 227q-7 13 -13 13t-13 -13l-140 -227q-8 -15 -33 -15h-111q-21 0 -21 12q0 11 11 27l210 321q6 9 6 15q0 5 -7 17l-210 323q-4 5 -4 13q0 14 16 14h146q12 0 19 -4t12 -12l124 -203q5 -8 10 -8q6 0 11 8l124 203 q5 9 11.5 12.5t18.5 3.5h122q15 0 15 -11q0 -6 -5 -14l-202 -306q-5 -10 -5 -15t6 -16l225 -341q10 -16 10 -26z" />
<glyph unicode="Y" horiz-adv-x="735" d="M704 732q0 -4 -3 -10l-235 -385q-6 -9 -7 -17.5t-1 -35.5v-260q0 -24 -28 -24h-125q-12 0 -17 5t-5 16v269q0 12 -2.5 18.5t-9.5 18.5l-237 392q-4 8 -4 11q0 5 5 8.5t14 3.5h150q12 0 18 -3.5t11 -14.5l148 -260q6 -11 10 -11q5 0 9 9l146 262q6 11 11.5 14.5t17.5 3.5 h120q14 0 14 -10z" />
<glyph unicode="Z" horiz-adv-x="681" d="M38.5 4q-4.5 4 -4.5 16v36q0 12 2.5 18.5t14.5 22.5l341 503q3 5 3 7q0 6 -11 6h-306q-10 0 -13.5 4t-3.5 15v93q0 17 14 17h553q7 0 11 -4.5t4 -11.5v-41q0 -9 -3 -15.5t-11 -17.5l-349 -510q-2 -2 -2 -6q0 -6 11 -6h332q18 0 18 -15v-97q0 -8 -5 -13t-14 -5h-565 q-12 0 -16.5 4z" />
<glyph unicode="[" horiz-adv-x="316" d="M84 742h205q7 0 9.5 -2.5t2.5 -8.5v-64q0 -12 -12 -12h-80q-11 0 -15.5 -5t-4.5 -16v-695q0 -11 3.5 -14t13.5 -3h80q15 0 15 -14v-58q0 -8 -3.5 -11.5t-11.5 -3.5h-199q-23 0 -23 21l-1 869q0 17 21 17z" />
<glyph unicode="\" horiz-adv-x="365" d="M250 4l-243 712q-3 8 -3 13q0 13 17 13h67q7 0 13 -4t8 -11l249 -729q2 -6 2 -7q0 -8 -14 -8h-68q-20 0 -28 21z" />
<glyph unicode="]" horiz-adv-x="316" d="M252 -144q0 -21 -23 -21h-199q-8 0 -11.5 3.5t-3.5 11.5v58q0 14 15 14h80q10 0 13.5 3t3.5 14v695q0 11 -4.5 16t-15.5 5h-80q-12 0 -12 12v64q0 6 2.5 8.5t9.5 2.5h205q21 0 21 -17z" />
<glyph unicode="^" horiz-adv-x="475" d="M246 360q-3 9 -10 9q-5 0 -10 -9l-91 -226q-3 -6 -8 -7.5t-14 -1.5h-68q-11 0 -11 11l2 9l152 359q7 17 20.5 26.5t28.5 9.5t28 -9t20 -26l153 -363q2 -6 2 -7q0 -10 -15 -10h-65q-20 0 -22 9z" />
<glyph unicode="_" horiz-adv-x="544" d="M496 -121q0 -12 -6.5 -17t-20.5 -5h-400q-12 0 -16 4.5t-4 14.5v74q0 18 15 18h417q7 0 11 -4.5t4 -11.5v-73z" />
<glyph unicode="`" horiz-adv-x="306" d="M42 750.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="a" horiz-adv-x="563" d="M190 -10q-75 0 -119 40.5t-44 105.5q0 84 77 135t212 54l36 3q6 0 10.5 3.5t4.5 10.5v21q0 39 -22 60t-63 21q-70 0 -104 -60q-4 -10 -13 -10q-5 0 -9 1l-100 23q-9 2 -9 11q0 6 4 15q24 58 85.5 87t152.5 29q119 0 172 -43.5t53 -123.5v-351q0 -12 -4 -17t-15 -5h-103 q-10 0 -14.5 7t-6.5 21l-1 22q-1 9 -8 9q-4 0 -15 -8q-66 -61 -157 -61zM364 249q-3 4 -12 4l-28 -2q-58 -3 -102.5 -27.5t-44.5 -67.5q0 -30 21 -47.5t58 -17.5q46 0 78 27q33 26 33 53v65q0 9 -3 13z" />
<glyph unicode="b" horiz-adv-x="609" d="M78 0q-12 0 -17.5 5.5t-5.5 16.5v701q0 9 4.5 14t12.5 5h122q15 0 15 -18v-233q0 -12 7 -12q4 0 11 5q60 56 140 56q100 0 154.5 -74t54.5 -198q0 -129 -60 -203.5t-168 -74.5q-51 0 -91.5 23t-66.5 58q-5 5 -7 5q-3 0 -5 -8l-12 -48q-3 -11 -8 -15.5t-15 -4.5h-65z M209 183q0 -43 29.5 -71t70.5 -28q110 0 110 182q0 91 -26.5 133.5t-79.5 42.5q-60 0 -104 -53v-206z" />
<glyph unicode="c" horiz-adv-x="551" d="M444.5 495.5q58.5 -44.5 78.5 -107.5q2 -8 2 -10q0 -9 -14 -11l-105 -10h-3q-9 0 -12 11q-18 36 -36.5 53.5t-52.5 17.5q-54 0 -84.5 -44t-30.5 -130q0 -88 32.5 -132t90.5 -44q41 0 67 21t51 64q3 5 6.5 5.5t10.5 -0.5l74 -17q9 -1 9 -10l-2 -9q-20 -58 -77.5 -105.5 t-151.5 -47.5q-77 0 -137.5 34.5t-94.5 96.5t-34 142q0 81 34.5 144t95 98t136.5 35q89 0 147.5 -44.5z" />
<glyph unicode="d" horiz-adv-x="609" d="M402 20v28q0 8 -5 8q-3 0 -9 -4q-29 -28 -63.5 -45t-82.5 -17q-94 0 -151.5 70t-57.5 201q0 82 29.5 145.5t79.5 98.5t110 35q39 0 70.5 -13t60.5 -40q7 -5 10 -5q7 0 7 13v229q0 18 16 18h122q7 0 11.5 -5t4.5 -14v-702q0 -11 -5 -16t-18 -5h-108q-21 0 -21 20z M354.5 429q-22.5 12 -50.5 12q-53 0 -84 -43.5t-31 -134.5q0 -92 30 -134.5t83 -42.5q40 0 69 26.5t29 61.5v218q-23 25 -45.5 37z" />
<glyph unicode="e" horiz-adv-x="586" d="M227.5 129.5q37.5 -34.5 93.5 -34.5q36 0 66.5 15.5t61.5 51.5q4 4 8 4q3 0 10 -3l72 -30q7 -3 7 -10q0 -5 -4 -10q-48 -68 -103 -95.5t-137 -27.5q-77 0 -139 34t-97 94.5t-35 138.5q0 84 36 148.5t97.5 99.5t134.5 35q76 0 135 -33.5t92 -96.5t33 -150q0 -13 -2.5 -18 t-14.5 -6h-340q-12 0 -12 -16q0 -56 37.5 -90.5zM391 320q11 0 14 2.5t3 11.5q0 26 -12 52t-35 43t-56 17q-50 0 -82 -35t-31 -90z" />
<glyph unicode="f" horiz-adv-x="402" d="M377 525q5 -5 5 -12v-74q0 -15 -17 -15h-83q-10 0 -10 -11v-394q0 -19 -16 -19h-123q-15 0 -15 17v398q0 9 -8 9h-72q-18 0 -18 15v74q0 7 5 12t14 5h67q7 0 9.5 3.5t2.5 11.5v61q0 64 38 100t107 36h101q22 0 22 -21l1 -65q0 -17 -15 -17h-54q-22 0 -36 -16.5t-14 -42.5 v-39q0 -11 12 -11h83q9 0 14 -5z" />
<glyph unicode="g" horiz-adv-x="633" d="M611 531v-68q0 -28 -23 -23q-15 3 -29 3q-8 0 -18 -2q-26 -4 -20 -23q9 -27 9 -45q0 -46 -27.5 -83t-82 -59t-131.5 -22q-56 0 -82.5 -9t-26.5 -24q0 -13 14.5 -18.5t48.5 -7.5l143 -8q99 -6 147.5 -44t48.5 -101q0 -78 -74 -125t-210 -47q-291 0 -291 129q0 32 25 54.5 t71 39.5q6 2 6 5t-6 6q-58 28 -58 74q0 27 26.5 50.5t70.5 40.5q12 6 2 12q-97 45 -97 136q0 76 65.5 121t187.5 45q103 0 160 -45q7 -5 13 -5q8 0 14 7q19 23 50 40.5t54 17.5q20 0 20 -22zM364.5 308.5q25.5 23.5 25.5 61.5q0 42 -25.5 66.5t-76.5 24.5q-48 0 -75.5 -25 t-27.5 -66q0 -38 27.5 -61.5t75.5 -23.5q51 0 76.5 23.5zM214 30q-31 2 -55.5 -14.5t-24.5 -41.5q0 -37 41 -56t133 -19q67 0 103 18.5t36 52.5q0 23 -20 37t-59 16z" />
<glyph unicode="h" horiz-adv-x="597" d="M61 4.5q-5 4.5 -5 15.5v703q0 19 16 19h120q15 0 15 -17v-256q0 -8 5 -8q3 0 7 4q46 41 85.5 58t83.5 17q76 0 117 -42t41 -118v-356q0 -24 -24 -24h-111q-11 0 -15 4.5t-4 15.5v338q0 34 -18.5 52.5t-53.5 18.5q-31 0 -56 -15t-54 -47v-344q0 -12 -6 -17.5t-20 -5.5 h-107q-11 0 -16 4.5z" />
<glyph unicode="i" horiz-adv-x="265" d="M211 619q0 -25 -27 -25h-108q-12 0 -17 5.5t-5 17.5v105q0 20 17 20h124q7 0 11.5 -5t4.5 -14v-104zM209 24q0 -13 -6 -18.5t-21 -5.5h-105q-12 0 -17 5t-5 16v490q0 19 17 19h122q15 0 15 -17v-489z" />
<glyph unicode="j" horiz-adv-x="265" d="M212 619q0 -13 -6 -19t-21 -6h-108q-12 0 -17 5.5t-5 17.5v105q0 10 4.5 15t12.5 5h123q17 0 17 -19v-104zM166 -126.5q-44 -43.5 -138 -43.5q-43 0 -55 3.5t-12 16.5l-1 79q0 7 4.5 13.5t11.5 7.5l42 5q19 2 28.5 14.5t9.5 42.5v499q0 9 4.5 14t12.5 5h122q15 0 15 -17 v-507q0 -89 -44 -132.5z" />
<glyph unicode="k" horiz-adv-x="604" d="M585 14q0 -6 -4.5 -10t-12.5 -4h-131q-17 0 -27 21l-103 206q-4 9 -9 9q-3 0 -8 -5l-71 -70q-9 -7 -9 -25v-112q0 -13 -6 -18.5t-20 -5.5h-106q-12 0 -17 5t-5 16v702q0 19 16 19h123q15 0 15 -18v-410q0 -8 4 -8t8 5l188 204q15 15 27 15h107q17 0 17 -11q0 -7 -7 -14 l-140 -142q-6 -7 -6 -13q0 -7 4 -15l171 -312q2 -3 2 -9z" />
<glyph unicode="l" horiz-adv-x="266" d="M210 24q0 -13 -6 -18.5t-21 -5.5h-106q-12 0 -17 5t-5 16l3 702q0 19 16 19h121q15 0 15 -18v-700z" />
<glyph unicode="m" horiz-adv-x="919" d="M60 4.5q-5 4.5 -5 15.5v491q0 9 4.5 14t11.5 5h120q15 0 15 -17v-49q0 -8 5 -8q3 0 7 4q42 39 82 60t85 21q53 0 90 -25t52 -68q1 -4 4 -4q4 0 9 5q37 41 83.5 66t92.5 25q70 0 111.5 -43t41.5 -118v-355q0 -24 -24 -24h-111q-11 0 -15 4.5t-4 15.5v338q0 33 -18 52 t-51 19q-27 0 -52.5 -15t-43.5 -36q-6 -7 -8.5 -13t-2.5 -15v-326q0 -24 -24 -24h-110q-10 0 -14.5 4.5t-4.5 15.5v338q0 33 -18 52t-52 19q-29 0 -54 -15t-53 -47v-344q0 -12 -6 -17.5t-20 -5.5h-107q-11 0 -16 4.5z" />
<glyph unicode="n" horiz-adv-x="596" d="M60 4.5q-5 4.5 -5 15.5v491q0 19 16 19h121q15 0 15 -17v-49q0 -8 5 -8q3 0 7 4q41 39 82 59.5t87 20.5q73 0 115.5 -43t42.5 -115v-358q0 -24 -24 -24h-111q-11 0 -15 4.5t-4 15.5v338q0 34 -18.5 52.5t-54.5 18.5q-30 0 -55.5 -15t-54.5 -47v-344q0 -12 -6 -17.5 t-20 -5.5h-107q-11 0 -16 4.5z" />
<glyph unicode="o" horiz-adv-x="599" d="M159.5 24.5q-60.5 34.5 -94.5 96.5t-34 141q0 82 34.5 145t96 98t138.5 35q79 0 140 -35.5t94.5 -98.5t33.5 -143q0 -79 -34 -141t-95 -97t-140 -35t-139.5 34.5zM383.5 135.5q28.5 43.5 28.5 129.5q0 87 -28.5 131.5t-83.5 44.5t-84 -44.5t-29 -131.5q0 -85 29 -129 t84 -44t83.5 43.5z" />
<glyph unicode="p" horiz-adv-x="609" d="M205 525.5q5 -4.5 5 -15.5v-30q0 -7 4 -7q3 0 10 5q31 29 63.5 45.5t82.5 16.5q91 0 148 -69t57 -202q0 -138 -58.5 -208.5t-154.5 -70.5q-79 0 -134 51q-10 8 -14 8q-5 0 -5 -14v-183q0 -17 -15 -17h-123q-7 0 -11.5 4.5t-4.5 13.5v655q0 12 5.5 17t17.5 5h110 q12 0 17 -4.5zM254 100q23 -13 51 -13q114 0 114 185q0 92 -29 131.5t-82 39.5q-41 0 -70 -24.5t-29 -55.5v-226q22 -24 45 -37z" />
<glyph unicode="q" horiz-adv-x="609" d="M532 530q12 0 17 -5t5 -17v-654q0 -9 -4.5 -14t-11.5 -5h-123q-15 0 -15 17v178q0 15 -6 15q-3 0 -11 -5q-64 -50 -133 -50q-101 0 -159 72.5t-58 202.5q0 83 27 145.5t78 96.5t120 34q100 0 165 -79q5 -5 7 -5q3 0 6 8l12 44q6 21 22 21h62zM400 347q0 43 -27.5 72 t-70.5 29q-52 0 -82.5 -45t-30.5 -137t29.5 -136t81.5 -44q59 0 100 46v215z" />
<glyph unicode="r" horiz-adv-x="426" d="M55 20v491q0 19 16 19h117q16 0 16 -17v-59q0 -4 2 -6t4 -2q3 0 8 5q30 40 71 64.5t78 24.5q36 0 36 -17v-116q0 -7 -4 -11t-11 -2q-32 8 -70 8q-25 0 -50.5 -12.5t-42 -33t-16.5 -41.5v-292q0 -23 -26 -23h-107q-21 0 -21 20z" />
<glyph unicode="s" horiz-adv-x="530" d="M265 446q-38 0 -63 -14.5t-25 -39.5q0 -14 11.5 -25.5t44.5 -19.5l115 -28q79 -19 116 -60.5t37 -97.5q0 -79 -66 -125t-173 -46q-86 0 -149 30.5t-89 79.5q-5 7 -5 13q0 7 7 10l68 35q8 4 14 4t11 -5q22 -31 53.5 -49.5t83.5 -18.5q47 0 76.5 14t29.5 41q0 18 -15 30 t-51 21l-103 22q-152 33 -152 151q0 50 27.5 89t78.5 61t120 22q73 0 129.5 -27t81.5 -68q6 -8 6 -14t-7 -10l-72 -35q-3 -2 -8 -2q-9 0 -15 8q-41 54 -117 54z" />
<glyph unicode="t" horiz-adv-x="432" d="M278 424q-11 0 -11 -12v-241q0 -34 16 -48.5t51 -14.5h54q7 0 11 -4.5t4 -12.5l-1 -61q0 -20 -22 -24q-42 -6 -119 -6q-70 0 -109 33t-39 96v280q0 15 -13 15h-61q-19 0 -19 17v74q0 15 18 15h69q8 0 10 11l14 152q2 17 15 17h109q7 0 11.5 -5t4.5 -14v-150q0 -10 10 -10 h105q18 0 18 -16v-74q0 -17 -20 -17h-106z" />
<glyph unicode="u" horiz-adv-x="592" d="M383 160v347q0 23 26 23h108q12 0 16.5 -5t4.5 -16l-2 -491q0 -8 -4.5 -13t-11.5 -5h-119q-15 0 -15 17v49q0 6 -3 7t-8 -3q-42 -43 -83 -61.5t-89 -18.5q-67 0 -110 43.5t-43 117.5v355q0 24 24 24h111q19 0 19 -21v-336q0 -33 19 -52.5t51 -19.5q55 0 109 59z" />
<glyph unicode="v" horiz-adv-x="573" d="M551 523q4 -7 1 -16l-198 -486q-9 -21 -32 -21h-71q-23 0 -32 21l-197 485q-2 6 -2 8q0 7 5 11.5t12 4.5h127q17 0 22 -17l115 -295q5 -9 8 -9q4 0 8 10l113 295q7 16 22 16h86q9 0 13 -7z" />
<glyph unicode="w" horiz-adv-x="818" d="M792.5 525.5q4.5 -4.5 4.5 -10.5q0 -2 -2 -8l-163 -491q-3 -9 -7.5 -12.5t-13.5 -3.5h-82q-11 0 -17 4.5t-9 14.5l-86 275q-3 9 -8 9q-3 0 -6 -9l-88 -278q-2 -9 -6.5 -12.5t-14.5 -3.5h-85q-11 0 -16.5 4.5t-8.5 14.5l-161 487q-1 2 -1 7q0 7 4.5 12t12.5 5h117 q7 0 13.5 -4.5t8.5 -12.5l89 -283q3 -9 7 -9t7 10l86 283q2 7 8.5 11.5t13.5 4.5h84q8 0 14 -5t7 -12l87 -283q3 -9 7 -9q5 0 8 10l86 283q7 16 23 16h76q7 0 11.5 -4.5z" />
<glyph unicode="x" horiz-adv-x="591" d="M573 10q0 -10 -19 -10h-128q-24 0 -34 16l-103 145q-8 13 -12 13t-12 -12l-105 -146q-10 -16 -33 -16h-82q-24 0 -24 14q0 11 12 26l164 211q6 9 6 14q0 7 -7 17l-162 220q-4 5 -4 12q0 6 5 11t14 5h122q13 0 19.5 -3.5t12.5 -12.5l93 -131q5 -8 9 -8q3 0 8 8l88 131 q6 9 12.5 12.5t20.5 3.5h90q17 0 17 -10q0 -5 -6 -13l-149 -202q-6 -7 -6 -14q0 -5 7 -16l174 -241q12 -16 12 -24z" />
<glyph unicode="y" horiz-adv-x="566" d="M58 -161.5q-13 3.5 -13 15.5v77q0 16 29 16h68q30 0 52 22.5t22 47.5q0 9 -3 16l-192 473q-2 6 -2 8q0 7 5 11.5t13 4.5h126q7 0 13.5 -4.5t8.5 -12.5l111 -298q3 -10 8 -10q4 0 9 11l110 298q7 16 22 16h86q7 0 11.5 -4.5t4.5 -10.5q0 -2 -2 -8l-205 -507 q-28 -69 -59 -104t-71.5 -48t-105.5 -13q-33 0 -46 3.5z" />
<glyph unicode="z" horiz-adv-x="519" d="M28 4q-4 4 -4 16v39q0 12 3 19t14 23l244 318q1 2 2.5 4t1.5 4q0 6 -12 6h-213q-10 0 -14 4t-4 14v63q0 16 14 16h414q7 0 11 -4t4 -11v-44q0 -9 -3.5 -17t-11.5 -19l-247 -321q-5 -7 -5 -10q0 -6 11 -6h240q18 0 18 -15v-65q0 -18 -20 -18h-427q-12 0 -16 4z" />
<glyph unicode="{" horiz-adv-x="366" d="M139 685.5q23 27.5 59.5 42t76.5 14.5h63q7 0 10 -2.5t3 -8.5v-64q0 -12 -13 -12h-32q-40 0 -52 -13.5t-12 -39.5v-202q-1 -49 -33 -74.5t-75 -29.5q-6 -1 -6.5 -3.5t6.5 -3.5q44 -4 75.5 -28t32.5 -81v-205q0 -29 13.5 -41t50.5 -12h30q15 0 15 -14v-58q0 -8 -3.5 -11.5 t-11.5 -3.5h-58q-66 0 -114 32.5t-48 90.5v208q0 39 -26.5 63.5t-79.5 24.5q-10 0 -10 16v46q0 16 10 16q55 0 80.5 22.5t25.5 68.5v196q0 39 23 66.5z" />
<glyph unicode="|" horiz-adv-x="251" d="M92 -165q-12 0 -17 6t-5 19v966q0 12 4.5 16.5t14.5 4.5h74q19 0 19 -16v-981q0 -7 -4.5 -11t-12.5 -4h-73z" />
<glyph unicode="}" horiz-adv-x="366" d="M250 423q0 -46 25.5 -68.5t80.5 -22.5q10 0 10 -16v-46q0 -16 -10 -16q-53 0 -79.5 -24.5t-26.5 -63.5v-208q0 -58 -48 -90.5t-114 -32.5h-58q-8 0 -11.5 3.5t-3.5 11.5v58q0 14 15 14h30q37 0 50.5 12t13.5 41v205q1 57 32.5 81t75.5 28q7 1 6.5 3.5t-6.5 3.5 q-43 4 -75 29.5t-33 74.5v202q0 26 -12 39.5t-52 13.5h-32q-13 0 -13 12v64q0 6 3 8.5t10 2.5h63q40 0 76.5 -14.5t59.5 -42t23 -66.5v-196z" />
<glyph unicode="~" horiz-adv-x="609" d="M487 314q-38 -21 -80 -21q-29 0 -51 8.5t-56 25.5q-26 15 -45.5 22.5t-41.5 7.5q-32 0 -55.5 -16t-52.5 -47q-4 -4 -9 -4t-8 5l-32 54q-2 6 -2 7q0 7 9 16q42 41 75.5 61t75.5 20q30 0 53 -8.5t55 -26.5q26 -14 44 -21t38 -7q57 0 98 56q6 7 11 7q7 0 13 -10l26 -44 q2 -4 2 -11q0 -9 -5 -15q-24 -38 -62 -59z" />
<glyph unicode="&#xa1;" horiz-adv-x="264" d="M201 367h-137q-15 0 -15 18v124q0 11 5 16t17 5h118q15 0 21 -5.5t6 -18.5v-123q0 -16 -15 -16zM221 -151q0 -7 -4 -10.5t-10 -3.5h-147q-7 0 -11.5 4.5t-3.5 13.5l39 425q2 12 5.5 16t14.5 4h54q13 0 19 -5t7 -17l37 -424v-3z" />
<glyph unicode="&#xa2;" horiz-adv-x="558" d="M528 263l-2 -9q-17 -48 -61 -91t-114 -57v-82q0 -24 -26 -24h-53q-22 0 -22 22v83q-65 10 -114.5 46.5t-77 94t-27.5 128.5q0 72 27.5 130.5t77.5 95.5t114 47v72q0 12 5.5 17.5t18.5 5.5h55q22 0 22 -21v-75q67 -13 111.5 -54t60.5 -93q2 -8 2 -10q0 -9 -14 -11 l-105 -10h-3q-9 0 -12 11q-18 36 -36.5 53.5t-52.5 17.5q-54 0 -84.5 -44t-30.5 -130q0 -88 32.5 -132t90.5 -44q41 0 67 21t51 64q3 5 6.5 5.5t10.5 -0.5l74 -17q9 -1 9 -10z" />
<glyph unicode="&#xa3;" horiz-adv-x="645" d="M12 17v98q0 12 13 12h22q40 0 63.5 25t23.5 78q0 36 -9 108q-1 9 -10 9h-85q-11 0 -11 12v62q0 11 11 11h66q11 0 10 11l-9 82q-2 22 -2 32q0 61 32 105t86 67t117 23q75 0 141.5 -36t95.5 -103l1 -4q0 -8 -12 -11l-104 -31q-2 -1 -7 -1q-9 0 -12 6q-13 27 -31.5 42.5 t-49.5 15.5q-35 0 -57.5 -22.5t-22.5 -62.5q0 -33 14 -103q2 -10 12 -10h129q10 0 10 -9v-65q0 -10 -10 -10h-116q-10 0 -10 -10q1 -12 1 -34q0 -31 -5 -64q-8 -61 -46 -99q-5 -5 -5 -8q0 -5 9 -5h118q44 0 70 16t40 53q4 13 20 9l94 -20q20 -3 15 -20q-22 -80 -82 -123 t-146 -43h-357q-15 0 -15 17z" />
<glyph unicode="&#xa4;" horiz-adv-x="575" d="M173 181q-3 2 -8 2t-9 -4l-51 -52q-6 -4 -9 -4q-5 0 -11 6l-45 45q-4 4 -4 9t4 9l52 52q4 4 4 9t-3 9q-30 51 -30 110q0 64 31 114l2 8q0 4 -4 8l-51 52q-4 4 -4 9q0 6 4 10l45 46q4 5 10 5q5 0 9 -5l52 -52q4 -4 8 -4q3 0 8 3q54 31 113 31q66 0 118 -33q8 -3 12 1 l52 52q5 5 11 0l51 -54q6 -6 0 -12l-51 -51q-4 -4 -1 -11q33 -55 33 -116q0 -68 -34 -117q-2 -6 0 -8l53 -53q6 -6 1 -12l-52 -52q-6 -6 -11 0l-52 51q-4 4 -11 1q-58 -35 -116 -35q-65 0 -116 33zM350 266.5q28 17.5 44.5 46t16.5 60.5t-16.5 60.5t-44.5 46t-62 17.5 q-35 0 -63 -17.5t-44.5 -46t-16.5 -60.5t16.5 -60.5t44.5 -46t63 -17.5q34 0 62 17.5z" />
<glyph unicode="&#xa5;" horiz-adv-x="658" d="M669 731q0 -4 -3 -9l-224 -364h119q7 0 10.5 -4.5t3.5 -11.5v-45q0 -12 -6 -17t-20 -5h-126v-79h138q14 0 14 -16v-44q0 -23 -26 -23h-126v-89q0 -24 -28 -24h-125q-12 0 -17 5t-5 16v92h-132q-12 0 -16.5 4.5t-4.5 15.5v45q0 18 15 18h138v78h-132q-12 0 -16.5 5 t-4.5 15v45q0 18 15 18h108l-218 362q-4 8 -4 11q0 5 5 8.5t14 3.5h151q12 0 17.5 -3.5t11.5 -14.5l148 -261q5 -10 8 -10q5 0 9 9l147 262q5 11 11 14.5t18 3.5h118q15 0 15 -11z" />
<glyph unicode="&#xa6;" horiz-adv-x="251" d="M92 429q-12 0 -17 5.5t-5 19.5v372q0 12 4.5 16.5t14.5 4.5h74q19 0 19 -16v-387q0 -15 -17 -15h-73zM92 -165q-12 0 -17 6t-5 19v373q0 11 4.5 15.5t14.5 4.5h74q19 0 19 -16v-387q0 -7 -4.5 -11t-12.5 -4h-73z" />
<glyph unicode="&#xa7;" horiz-adv-x="506" d="M460 161q21 -31 21 -73q0 -75 -59 -121.5t-165 -46.5q-82 0 -142 28.5t-85 71.5q-5 9 -5 16q0 6 5 8l72 36q3 2 8 2q6 0 16 -8q23 -28 53 -44.5t75 -16.5q41 0 66 14t25 41q0 21 -17.5 38t-61.5 33l-78 29q-84 32 -120.5 69.5t-36.5 95.5q0 46 24 80.5t66 53.5 q-46 27 -64.5 57t-18.5 68q0 45 25.5 81.5t72.5 57.5t110 21q71 0 126.5 -27.5t79.5 -67.5q5 -9 5 -15t-5 -9l-71 -35q-3 -2 -9 -2t-16 8q-49 55 -105 55q-35 0 -55.5 -14t-20.5 -37q0 -17 13 -30t46 -27l76 -29q87 -33 125.5 -72.5t38.5 -98.5q0 -86 -82 -133 q47 -26 68 -57zM331.5 280.5q17.5 16.5 17.5 42.5q0 24 -15.5 42.5t-62.5 36.5l-45 18q-32 -3 -51.5 -22t-19.5 -43q0 -22 15.5 -36.5t63.5 -33.5l50 -20q30 -1 47.5 15.5z" />
<glyph unicode="&#xa8;" horiz-adv-x="359" d="M146 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM349 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xa9;" horiz-adv-x="830" d="M223.5 41q-87.5 51 -138.5 138.5t-51 191.5q0 103 51 190.5t138.5 139t191.5 51.5q103 0 190.5 -51.5t139 -139t51.5 -190.5q0 -104 -51.5 -191.5t-139 -138.5t-190.5 -51q-104 0 -191.5 51zM563.5 111.5q65.5 36.5 102.5 103.5t37 156q0 88 -37 155.5t-102.5 104.5 t-148.5 37q-84 0 -149.5 -37t-102 -104.5t-36.5 -155.5q0 -89 36.5 -156t101.5 -103.5t150 -36.5q83 0 148.5 36.5zM531 550.5q45 -35.5 62 -84.5q1 -2 1 -6q0 -8 -11 -10l-83 -8h-3q-5 0 -8 9q-11 25 -26 39.5t-41 14.5q-40 0 -63 -33.5t-23 -97.5q0 -67 24.5 -100.5 t67.5 -33.5q31 0 51.5 17t38.5 49q3 6 14 3l57 -14q5 -1 6 -4t-1 -10q-16 -45 -60 -83t-116 -38q-59 0 -105.5 27t-73 75t-26.5 110t26.5 111t73 76t105.5 27q68 0 113 -35.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="392" d="M300.5 723.5q33.5 -26.5 33.5 -78.5v-171q0 -23 8 -46l1 -4q0 -11 -25 -11h-60q-8 0 -10.5 3t-3.5 10l-3 14q-2 5 -4 5q-3 0 -11 -5q-25 -18 -45 -25.5t-46 -7.5q-51 0 -79.5 26t-28.5 69q0 50 44 79.5t130 34.5l27 3q12 0 12 10v11q0 48 -53 48q-42 0 -63 -35 q-1 -5 -4 -6.5t-10 0.5l-65 15q-3 1 -4 6.5t1 9.5q19 37 52.5 55t95.5 18q77 -1 110.5 -27.5zM137.5 480q13.5 -11 36.5 -11q29 0 50 18q16 13 16 29v39q0 12 -12 11l-24 -2q-34 -3 -57 -18t-23 -38q0 -17 13.5 -28z" />
<glyph unicode="&#xab;" horiz-adv-x="487" d="M239 76l1 -4q0 -7 -14 -7h-56q-9 0 -13 8l-105 166q-6 9 -6 18t5 17l106 176q5 8 14 8h58q6 0 9 -4t1 -10l-74 -176q-2 -8 -2 -12q0 -2 2 -10zM436 76l1 -4q0 -7 -15 -7h-55q-4 0 -8 2.5t-6 5.5l-105 166q-6 9 -6 18t5 17l106 176q4 5 6.5 6.5t7.5 1.5h58q6 0 9.5 -4 t0.5 -10l-74 -176q-2 -8 -2 -12q0 -2 2 -10z" />
<glyph unicode="&#xac;" horiz-adv-x="583" d="M532 424.5q4 -4.5 4 -11.5v-230q0 -11 -5.5 -16t-18.5 -5h-82q-19 0 -19 18v138l-342 -1q-11 0 -15.5 5t-4.5 15v73q0 19 15 19h457q7 0 11 -4.5z" />
<glyph unicode="&#xad;" horiz-adv-x="380" d="M331 230q0 -22 -26 -22h-235q-12 0 -16.5 4.5t-4.5 15.5v73q0 18 15 18h252q7 0 11 -4t4 -11v-74z" />
<glyph unicode="&#xae;" horiz-adv-x="545" d="M153 307q-55 32 -87 86.5t-32 119.5t32 120t87 87t120 32q64 0 119 -32t87 -87t32 -120t-32 -119.5t-86.5 -86.5t-119.5 -32t-120 32zM398 384q47 48 47 129q0 80 -47.5 129t-124.5 49q-79 0 -126 -49t-47 -129q0 -81 47 -129t126 -48q78 0 125 48zM373.5 396.5 q-1.5 -2.5 -4.5 -2.5h-51q-6 0 -8 6l-32 92q-3 4 -9 4h-29q-4 0 -4 -4v-91q0 -7 -9 -7h-44q-7 0 -7 6v224q0 6 5 6h106q43 0 67 -16.5t24 -47.5q0 -23 -12.5 -38.5t-31.5 -22.5q-2 -2 -1 -5l41 -98q1 -3 -0.5 -5.5zM307 544.5q9 6.5 9 18.5q0 11 -9 18t-25 7h-40h-3 t-2.5 -1.5t-0.5 -3.5v-39q0 -6 4 -6h43q15 0 24 6.5z" />
<glyph unicode="&#xaf;" horiz-adv-x="385" d="M375 657q0 -19 -23 -19h-324q-10 0 -14 4.5t-4 13.5v64q0 16 13 16h339q6 0 9.5 -4t3.5 -10v-65z" />
<glyph unicode="&#xb0;" horiz-adv-x="464" d="M382.5 595q-22.5 -39 -62 -61t-88.5 -22t-88.5 22t-62 61t-22.5 89t22.5 89.5t62 61.5t88.5 22t88.5 -22t62 -61.5t22.5 -89.5t-22.5 -89zM290.5 744.5q-22.5 23.5 -60.5 23.5q-37 0 -59.5 -23t-22.5 -60q0 -39 22.5 -63t60.5 -24q37 0 59.5 23.5t22.5 61.5t-22.5 61.5z " />
<glyph unicode="&#xb1;" horiz-adv-x="583" d="M532 512.5q4 -4.5 4 -11.5v-73q0 -12 -6.5 -17.5t-20.5 -5.5h-161v-172q0 -7 -4.5 -11t-11.5 -4h-73q-12 0 -17 6t-5 20v161h-168q-12 0 -16 4.5t-4 15.5v73q0 19 15 19h173v167q0 12 4.5 16.5t15.5 4.5h73q18 0 18 -15v-173h173q7 0 11 -4.5zM532 141.5q4 -4.5 4 -11.5 v-73q0 -12 -6.5 -17t-20.5 -5h-440q-12 0 -16 4.5t-4 14.5v74q0 18 15 18h457q7 0 11 -4.5z" />
<glyph unicode="&#xb2;" horiz-adv-x="452" d="M187 586q60 52 79 77t19 52q0 28 -20 45t-50 17q-27 0 -49.5 -15.5t-42.5 -50.5q-2 -5 -8 -5q-4 0 -9 3l-56 28q-7 4 -7 12q0 5 3 9q61 99 175 99q77 0 124 -38t47 -104q0 -38 -20.5 -70.5t-70.5 -71.5l-116 -91q-11 -7 3 -7h196q12 0 12 -10v-70q0 -11 -13 -11h-327 q-8 0 -11.5 3t-3.5 10v49q0 5 5.5 12t23.5 22z" />
<glyph unicode="&#xb3;" horiz-adv-x="467" d="M66 784q0 4 3 8q25 30 69 47.5t94 17.5q81 0 128.5 -33.5t47.5 -88.5q0 -31 -19.5 -58t-54.5 -38q-8 -3 -8 -6t7 -5q40 -13 64.5 -42t24.5 -67q0 -68 -49.5 -104.5t-148.5 -36.5q-54 0 -101 21t-73 57q-3 5 -3 8q0 6 7 10l49 35q9 7 14 0q29 -30 54 -42t60 -12 q39 0 61 17t22 45q0 31 -25 49t-62 19l-54 1q-11 0 -11 9v59q0 6 11 9l43 2q37 1 60.5 18.5t23.5 44.5q0 23 -19.5 38.5t-49.5 15.5q-29 0 -53 -11.5t-49 -35.5q-4 -4 -7 -4t-7 4l-46 43q-3 3 -3 6z" />
<glyph unicode="&#xb4;" horiz-adv-x="306" d="M294 675q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xb6;" horiz-adv-x="603" d="M499 655q-10 0 -10 -11v-715q0 -14 -12 -14h-67q-7 0 -11 4t-4 10v716q0 10 -11 10h-38q-10 0 -10 -11v-715q0 -6 -3.5 -10t-9.5 -4h-69q-13 0 -13 14v371q0 7 -8 8q-57 4 -103 30.5t-72.5 73.5t-26.5 110q0 61 28 111t82 79.5t129 29.5h271q6 0 9 -2t3 -8v-67 q0 -6 -3 -8t-9 -2h-42z" />
<glyph unicode="&#xb7;" horiz-adv-x="248" d="M200 320q0 -12 -5.5 -17t-18.5 -5h-112q-11 0 -15.5 4.5t-4.5 14.5v115q0 17 14 17h129q13 0 13 -15v-114z" />
<glyph unicode="&#xb8;" horiz-adv-x="261" d="M215 -196q-36 -23 -88 -23q-68 0 -111 24q-9 5 -5 13l14 35q3 7 11 4q37 -22 72 -22q24 0 37.5 8.5t13.5 23.5q0 20 -20.5 30.5t-66.5 10.5q-13 0 -8 10l37 87h68l-21 -52q-3 -7 5 -7q50 -1 74 -25t24 -56q0 -38 -36 -61z" />
<glyph unicode="&#xb9;" horiz-adv-x="367" d="M305 452v-61q0 -11 -13 -11h-248q-12 0 -12 11v61q0 9 10 9h66q7 0 7 5v264q0 10 -9 7l-61 -19h-3q-11 0 -11 12v42q0 7 2 9.5t8 5.5l105 52q15 8 26 8h43q4 0 7 -3.5t3 -8.5v-368q0 -6 6 -6h62q12 0 12 -9z" />
<glyph unicode="&#xba;" horiz-adv-x="399" d="M321.5 703.5q46.5 -48.5 46.5 -125.5q0 -75 -46.5 -122.5t-122.5 -47.5t-122 47.5t-46 122.5q0 51 21.5 90.5t60 61.5t86.5 22q76 0 122.5 -48.5zM133 581q0 -107 66 -107q67 0 67 107q0 105 -67 105q-66 0 -66 -105z" />
<glyph unicode="&#xbb;" horiz-adv-x="486" d="M127 257q0 7 -2 11l-74 176l-1 4q0 10 11 10h58q9 0 14 -8l107 -176q4 -7 4 -17t-5 -18l-106 -166q-4 -8 -13 -8h-56q-17 0 -13 11l74 170q2 4 2 11zM323 257q0 7 -2 11l-73 176q-1 2 -1 5q0 9 11 9h57q6 0 8.5 -1.5t5.5 -6.5l107 -176q5 -8 5 -17t-6 -18l-105 -166 q-6 -8 -14 -8h-56q-17 0 -13 11l74 170q2 4 2 11z" />
<glyph unicode="&#xbc;" horiz-adv-x="941" d="M271 348v-61q0 -11 -13 -11h-248q-12 0 -12 11v61q0 9 10 9h66q7 0 7 5v264q0 10 -9 7l-61 -19h-3q-11 0 -11 12v42q0 7 2 9.5t8 5.5l105 52q15 8 26 8h43q4 0 7 -3.5t3 -8.5v-368q0 -6 6 -6h62q12 0 12 -9zM221 7q-7 -11 -25 -11l-42 1q-16 0 -16 14q0 6 5 14l475 714 q5 7 9.5 9t13.5 2h53q12 0 12 -8q0 -1 -4 -9zM739.5 465q4.5 2 14.5 2h79q10 0 10 -12v-263q0 -7 6 -7h52q12 0 12 -10v-54q0 -11 -13 -11h-50q-7 0 -7 -7v-89q0 -14 -17 -14h-81q-14 0 -14 13v91q0 6 -7 6h-189q-13 0 -13 11v53q0 6 4.5 13t11.5 17l190 251q7 8 11.5 10z M726 185q6 0 6 4v157q0 9 -2 9t-7 -7l-112 -155q-6 -8 4 -8h111z" />
<glyph unicode="&#xbd;" horiz-adv-x="992" d="M271 348v-61q0 -11 -13 -11h-248q-12 0 -12 11v61q0 9 10 9h66q7 0 7 5v264q0 10 -9 7l-61 -19h-3q-11 0 -11 12v42q0 7 2 9.5t8 5.5l105 52q15 8 26 8h43q4 0 7 -3.5t3 -8.5v-368q0 -6 6 -6h62q12 0 12 -9zM287 7q-7 -11 -25 -11l-42 1q-16 0 -16 14q0 6 5 14l475 714 q5 7 9.5 9t13.5 2h53q12 0 12 -8q0 -1 -4 -9zM737 202q60 52 79 77t19 52q0 28 -20 45t-50 17q-27 0 -49.5 -15.5t-42.5 -50.5q-2 -5 -8 -5q-4 0 -9 3l-56 28q-7 4 -7 12q0 5 3 9q61 99 175 99q77 0 124 -38t47 -104q0 -38 -20.5 -70.5t-70.5 -71.5l-116 -91q-10 -7 3 -7 h196q12 0 12 -10v-70q0 -11 -13 -11h-327q-8 0 -11.5 3t-3.5 10v49q0 5 5.5 12t23.5 22z" />
<glyph unicode="&#xbe;" horiz-adv-x="1011" d="M32 679q0 4 3 8q25 30 69 47.5t94 17.5q81 0 128.5 -33.5t47.5 -88.5q0 -31 -19.5 -58t-54.5 -38q-8 -3 -8 -6t7 -5q40 -13 64.5 -42t24.5 -67q0 -68 -49.5 -104.5t-148.5 -36.5q-54 0 -101 21t-73 57q-3 5 -3 8q0 6 7 10l49 35q9 7 14 0q29 -30 54 -42t60 -12 q39 0 61 17t22 45q0 31 -25 49t-62 19l-54 1q-11 0 -11 9v59q0 6 11 9l43 2q37 1 60.5 18.5t23.5 44.5q0 23 -19.5 38.5t-49.5 15.5q-29 0 -53 -11.5t-49 -35.5q-4 -4 -7 -4t-7 4l-46 43q-3 3 -3 6zM321 7q-7 -11 -25 -11l-42 1q-16 0 -16 14q0 6 5 14l475 714q5 7 9.5 9 t13.5 2h53q12 0 12 -8q0 -1 -4 -9zM802.5 465q4.5 2 14.5 2h79q10 0 10 -12v-263q0 -7 6 -7h52q12 0 12 -10v-54q0 -11 -13 -11h-50q-7 0 -7 -7v-89q0 -14 -17 -14h-81q-14 0 -14 13v91q0 6 -7 6h-189q-13 0 -13 11v53q0 6 4.5 13t11.5 17l190 251q7 8 11.5 10zM789 185 q6 0 6 4v157q0 9 -2 9t-7 -7l-112 -155q-6 -8 4 -8h111z" />
<glyph unicode="&#xbf;" horiz-adv-x="533" d="M200 506q0 13 6.5 18.5t20.5 5.5h119q12 0 16.5 -5t4.5 -16v-124q0 -18 -15 -18h-138q-14 0 -14 16v123zM526 -14q0 -3 -2 -9q-32 -74 -97.5 -113t-157.5 -39q-78 0 -133.5 23t-83.5 63t-28 89q0 38 14.5 65.5t35 46.5t55.5 44q47 34 69.5 60t22.5 67q0 8 6 13.5t14 5.5 h82q21 0 21 -23q0 -41 -14 -72t-34 -52.5t-52 -47.5q-35 -30 -51.5 -51t-16.5 -48q0 -33 27 -54t67 -21q39 0 74.5 22.5t51.5 57.5q4 10 12 10q5 0 8 -1l100 -23q10 -3 10 -13z" />
<glyph unicode="&#xc0;" horiz-adv-x="771" d="M33 17q0 8 2 12l249 693q4 11 9.5 15.5t16.5 4.5h150q11 0 19 -6t11 -16l247 -693q2 -6 2 -9q0 -8 -3.5 -13t-10.5 -5h-147q-15 0 -19 14l-52 146q-2 6 -4.5 8.5t-8.5 2.5h-244q-10 0 -13 -10l-53 -148q-6 -13 -21 -13h-115q-15 0 -15 17zM453 304q10 0 10 8q0 6 -1 9 l-84 234q-3 6 -7 6q-3 0 -6 -7l-85 -233q-2 -6 -2 -9q0 -8 11 -8h164zM266 962.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xc1;" horiz-adv-x="771" d="M33 17q0 8 2 12l249 693q4 11 9.5 15.5t16.5 4.5h150q11 0 19 -6t11 -16l247 -693q2 -6 2 -9q0 -8 -3.5 -13t-10.5 -5h-147q-15 0 -19 14l-52 146q-2 6 -4.5 8.5t-8.5 2.5h-244q-10 0 -13 -10l-53 -148q-6 -13 -21 -13h-115q-15 0 -15 17zM453 304q10 0 10 8q0 6 -1 9 l-84 234q-3 6 -7 6q-3 0 -6 -7l-85 -233q-2 -6 -2 -9q0 -8 11 -8h164zM523 887q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xc2;" horiz-adv-x="771" d="M33 17q0 8 2 12l249 693q4 11 9.5 15.5t16.5 4.5h150q11 0 19 -6t11 -16l247 -693q2 -6 2 -9q0 -8 -3.5 -13t-10.5 -5h-147q-15 0 -19 14l-52 146q-2 6 -4.5 8.5t-8.5 2.5h-244q-10 0 -13 -10l-53 -148q-6 -13 -21 -13h-115q-15 0 -15 17zM453 304q10 0 10 8q0 6 -1 9 l-84 234q-3 6 -7 6q-3 0 -6 -7l-85 -233q-2 -6 -2 -9q0 -8 11 -8h164zM395 882q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xc3;" horiz-adv-x="771" d="M33 17q0 8 2 12l249 693q4 11 9.5 15.5t16.5 4.5h150q11 0 19 -6t11 -16l247 -693q2 -6 2 -9q0 -8 -3.5 -13t-10.5 -5h-147q-15 0 -19 14l-52 146q-2 6 -4.5 8.5t-8.5 2.5h-244q-10 0 -13 -10l-53 -148q-6 -13 -21 -13h-115q-15 0 -15 17zM453 304q10 0 10 8q0 6 -1 9 l-84 234q-3 6 -7 6q-3 0 -6 -7l-85 -233q-2 -6 -2 -9q0 -8 11 -8h164zM458 839q-19 0 -35.5 3.5t-41.5 11.5q-23 7 -38.5 10.5t-32.5 3.5q-20 0 -34 -5t-33 -18q-7 -5 -10 -5q-6 0 -9 12l-14 43q-2 6 -2 10q0 6 8 14q21 18 40.5 27.5t48.5 9.5q20 0 38.5 -4t46.5 -13 q45 -15 68 -15q19 0 35.5 6.5t33.5 18.5q6 4 10 4q8 0 11 -11l12 -52q1 -2 1 -6q0 -9 -12 -18q-39 -27 -91 -27z" />
<glyph unicode="&#xc4;" horiz-adv-x="771" d="M33 17q0 8 2 12l249 693q4 11 9.5 15.5t16.5 4.5h150q11 0 19 -6t11 -16l247 -693q2 -6 2 -9q0 -8 -3.5 -13t-10.5 -5h-147q-15 0 -19 14l-52 146q-2 6 -4.5 8.5t-8.5 2.5h-244q-10 0 -13 -10l-53 -148q-6 -13 -21 -13h-115q-15 0 -15 17zM453 304q10 0 10 8q0 6 -1 9 l-84 234q-3 6 -7 6q-3 0 -6 -7l-85 -233q-2 -6 -2 -9q0 -8 11 -8h164zM348 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM551 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108 q14 0 14 -16v-94z" />
<glyph unicode="&#xc5;" horiz-adv-x="771" d="M739 18q0 -8 -3.5 -13t-10.5 -5h-147q-15 0 -19 14l-52 146q-2 6 -4.5 8.5t-8.5 2.5h-244q-10 0 -13 -10l-53 -148q-6 -13 -21 -13h-115q-15 0 -15 17q0 8 2 12l249 693q4 11 9.5 15.5t16.5 4.5h38q-35 11 -57 40.5t-22 68.5q0 45 33 76.5t79 31.5q47 0 79.5 -32 t32.5 -78q0 -38 -21.5 -67t-56.5 -40h45q11 0 19 -6t11 -16l247 -693q2 -6 2 -9zM344 812q16 -16 36 -16q21 0 36 15.5t15 36.5q0 22 -14.5 36.5t-36.5 14.5q-21 0 -36.5 -14.5t-15.5 -36.5q0 -20 16 -36zM463 312q0 6 -1 9l-84 234q-3 6 -7 6q-3 0 -6 -7l-85 -233 q-2 -6 -2 -9q0 -8 11 -8h164q10 0 10 8z" />
<glyph unicode="&#xc6;" horiz-adv-x="1080" d="M1042 113v-95q0 -8 -5 -13t-14 -5h-497q-12 0 -16.5 5t-4.5 16v139q0 11 -11 11h-216q-12 0 -16 -10l-79 -148q-7 -13 -22 -13h-116q-12 0 -12 13q0 9 5 16l371 693q9 20 28 20h579q15 0 15 -17l-1 -90q0 -21 -21 -21h-311q-18 0 -18 -16v-145q0 -17 15 -17h206 q16 0 16 -16v-96q0 -14 -15 -14h-208q-14 0 -14 -12v-157q0 -8 2 -10.5t9 -2.5h333q18 0 18 -15zM505 320v256q-2 20 -13 20t-20 -19l-138 -256q-4 -7 -4 -11q0 -6 9 -6h150q16 0 16 16z" />
<glyph unicode="&#xc7;" horiz-adv-x="725" d="M689 207q-10 -40 -42.5 -87t-92 -84.5t-141.5 -44.5l-15 -38q-3 -7 5 -7q50 -1 74 -25t24 -56q0 -38 -36 -61t-88 -23q-68 0 -111 24q-9 5 -5 13l14 35q3 7 11 4q37 -22 72 -22q24 0 37.5 8.5t13.5 23.5q0 20 -20.5 30.5t-66.5 10.5q-13 0 -8 10l31 74q-92 8 -160 58.5 t-104.5 135t-36.5 191.5q0 114 41 199t117.5 130.5t179.5 45.5q76 0 140 -29t105.5 -79t52.5 -112q2 -7 2 -16q0 -6 -3 -8t-9 -3l-135 -9q-9 0 -11.5 3t-4.5 12q-11 55 -44 87t-88 32q-160 0 -160 -256q0 -133 40 -194t122 -61q60 0 101.5 30t67.5 98q3 7 13 7q6 0 9 -1 l98 -21q14 -5 11 -25z" />
<glyph unicode="&#xc8;" horiz-adv-x="654" d="M86 742h504q15 0 15 -17l-1 -90q0 -21 -21 -21h-319q-19 0 -19 -16v-145q0 -17 15 -17h212q17 0 17 -16v-96q0 -14 -16 -14h-214q-14 0 -14 -12v-157q0 -7 2.5 -10t8.5 -3h342q18 0 18 -15v-95q0 -18 -20 -18h-504q-12 0 -17 5t-5 16v702q0 19 16 19zM223 962.5 q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xc9;" horiz-adv-x="654" d="M86 742h504q15 0 15 -17l-1 -90q0 -21 -21 -21h-319q-19 0 -19 -16v-145q0 -17 15 -17h212q17 0 17 -16v-96q0 -14 -16 -14h-214q-14 0 -14 -12v-157q0 -7 2.5 -10t8.5 -3h342q18 0 18 -15v-95q0 -18 -20 -18h-504q-12 0 -17 5t-5 16v702q0 19 16 19zM480 887q2 -6 2 -10 q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xca;" horiz-adv-x="654" d="M86 742h504q15 0 15 -17l-1 -90q0 -21 -21 -21h-319q-19 0 -19 -16v-145q0 -17 15 -17h212q17 0 17 -16v-96q0 -14 -16 -14h-214q-14 0 -14 -12v-157q0 -7 2.5 -10t8.5 -3h342q18 0 18 -15v-95q0 -18 -20 -18h-504q-12 0 -17 5t-5 16v702q0 19 16 19zM352 882 q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xcb;" horiz-adv-x="654" d="M86 742h504q15 0 15 -17l-1 -90q0 -21 -21 -21h-319q-19 0 -19 -16v-145q0 -17 15 -17h212q17 0 17 -16v-96q0 -14 -16 -14h-214q-14 0 -14 -12v-157q0 -7 2.5 -10t8.5 -3h342q18 0 18 -15v-95q0 -18 -20 -18h-504q-12 0 -17 5t-5 16v702q0 19 16 19zM305 844 q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM508 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xcc;" horiz-adv-x="315" d="M229 742q16 0 16 -18v-700q0 -13 -6 -18.5t-21 -5.5h-126q-12 0 -17 5t-5 16v702q0 19 16 19h143zM43 962.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xcd;" horiz-adv-x="315" d="M229 742q16 0 16 -18v-700q0 -13 -6 -18.5t-21 -5.5h-126q-12 0 -17 5t-5 16v702q0 19 16 19h143zM300 887q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xce;" horiz-adv-x="315" d="M229 742q16 0 16 -18v-700q0 -13 -6 -18.5t-21 -5.5h-126q-12 0 -17 5t-5 16v702q0 19 16 19h143zM172 882q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12 t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xcf;" horiz-adv-x="315" d="M229 742q16 0 16 -18v-700q0 -13 -6 -18.5t-21 -5.5h-126q-12 0 -17 5t-5 16v702q0 19 16 19h143zM125 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM328 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5 v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xd0;" horiz-adv-x="766" d="M624 640q97 -95 97 -266q0 -176 -101 -275t-296 -99h-217q-12 0 -17.5 5.5t-5.5 18.5v286h-35q-12 0 -17 5t-5 16v73q0 19 16 19h41v299q0 11 5 15.5t17 4.5q165 0 223 -1q198 -6 295 -101zM477.5 181.5q60.5 58.5 60.5 193.5q0 125 -51 180t-158 61l-61 2q-9 0 -9 -14 v-181h132q15 0 15 -17v-73q0 -12 -6.5 -17.5t-20.5 -5.5h-120v-173q0 -8 2.5 -11t10.5 -3h19q126 0 186.5 58.5z" />
<glyph unicode="&#xd1;" horiz-adv-x="759" d="M676 742q13 0 13 -15v-711q0 -7 -5.5 -11.5t-13.5 -4.5h-101q-9 0 -14 2t-11 10l-319 448q-4 5 -7.5 4t-3.5 -6v-440v-3q0 -8 -4.5 -11.5t-15.5 -3.5h-104q-20 0 -20 17v706q0 19 18 19h121q12 0 17 -2.5t12 -12.5l294 -419q6 -8 10 -8q5 0 5 11v413q0 18 18 18h111z M461 839q-19 0 -35.5 3.5t-41.5 11.5q-23 7 -38.5 10.5t-32.5 3.5q-20 0 -34 -5t-33 -18q-7 -5 -10 -5q-6 0 -9 12l-14 43q-2 6 -2 10q0 6 8 14q21 18 40.5 27.5t48.5 9.5q20 0 38.5 -4t46.5 -13q45 -15 68 -15q19 0 35.5 6.5t33.5 18.5q6 4 10 4q8 0 11 -11l12 -52 q1 -2 1 -6q0 -9 -12 -18q-39 -27 -91 -27z" />
<glyph unicode="&#xd2;" horiz-adv-x="774" d="M205.5 35.5q-77.5 45.5 -119 130.5t-41.5 202q0 118 42 204.5t119.5 133t181.5 46.5q103 0 180 -46.5t119 -133t42 -203.5q0 -116 -41.5 -201.5t-118.5 -131.5t-181 -46q-105 0 -182.5 45.5zM508.5 173q37.5 60 37.5 194q0 137 -38.5 200t-119.5 63q-83 0 -121.5 -63 t-38.5 -200q0 -134 38 -194t122 -60q83 0 120.5 60zM271 962.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xd3;" horiz-adv-x="774" d="M205.5 35.5q-77.5 45.5 -119 130.5t-41.5 202q0 118 42 204.5t119.5 133t181.5 46.5q103 0 180 -46.5t119 -133t42 -203.5q0 -116 -41.5 -201.5t-118.5 -131.5t-181 -46q-105 0 -182.5 45.5zM508.5 173q37.5 60 37.5 194q0 137 -38.5 200t-119.5 63q-83 0 -121.5 -63 t-38.5 -200q0 -134 38 -194t122 -60q83 0 120.5 60zM528 887q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xd4;" horiz-adv-x="774" d="M205.5 35.5q-77.5 45.5 -119 130.5t-41.5 202q0 118 42 204.5t119.5 133t181.5 46.5q103 0 180 -46.5t119 -133t42 -203.5q0 -116 -41.5 -201.5t-118.5 -131.5t-181 -46q-105 0 -182.5 45.5zM508.5 173q37.5 60 37.5 194q0 137 -38.5 200t-119.5 63q-83 0 -121.5 -63 t-38.5 -200q0 -134 38 -194t122 -60q83 0 120.5 60zM400 882q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xd5;" horiz-adv-x="774" d="M205.5 35.5q-77.5 45.5 -119 130.5t-41.5 202q0 118 42 204.5t119.5 133t181.5 46.5q103 0 180 -46.5t119 -133t42 -203.5q0 -116 -41.5 -201.5t-118.5 -131.5t-181 -46q-105 0 -182.5 45.5zM508.5 173q37.5 60 37.5 194q0 137 -38.5 200t-119.5 63q-83 0 -121.5 -63 t-38.5 -200q0 -134 38 -194t122 -60q83 0 120.5 60zM463 839q-19 0 -35.5 3.5t-41.5 11.5q-23 7 -38.5 10.5t-32.5 3.5q-20 0 -34 -5t-33 -18q-7 -5 -10 -5q-6 0 -9 12l-14 43q-2 6 -2 10q0 6 8 14q21 18 40.5 27.5t48.5 9.5q20 0 38.5 -4t46.5 -13q45 -15 68 -15 q19 0 35.5 6.5t33.5 18.5q6 4 10 4q8 0 11 -11l12 -52q1 -2 1 -6q0 -9 -12 -18q-39 -27 -91 -27z" />
<glyph unicode="&#xd6;" horiz-adv-x="774" d="M205.5 35.5q-77.5 45.5 -119 130.5t-41.5 202q0 118 42 204.5t119.5 133t181.5 46.5q103 0 180 -46.5t119 -133t42 -203.5q0 -116 -41.5 -201.5t-118.5 -131.5t-181 -46q-105 0 -182.5 45.5zM508.5 173q37.5 60 37.5 194q0 137 -38.5 200t-119.5 63q-83 0 -121.5 -63 t-38.5 -200q0 -134 38 -194t122 -60q83 0 120.5 60zM353 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM556 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xd7;" horiz-adv-x="576" d="M519 216q0 -7 -5 -12l-52 -52q-8 -8 -15 -8q-8 0 -19 11l-139 139l-148 -147q-4 -4 -10 -4t-11 5l-52 51q-8 8 -8 15q0 9 11 20l139 139l-144 143q-8 10 -8 15q0 6 8 14l51 52q7 7 14 7q6 0 10 -4l148 -148l143 144q10 8 15 8q6 0 14 -8l52 -51q7 -7 7 -14q0 -6 -4 -10 l-149 -148l148 -148q4 -3 4 -9z" />
<glyph unicode="&#xd8;" horiz-adv-x="764" d="M755 687q0 -6 -6 -12l-78 -81q53 -94 53 -225q0 -116 -41.5 -201.5t-118.5 -131.5t-181 -46q-140 0 -227 78l-61 -64q-10 -10 -18 -10q-9 0 -18 10l-33 33q-11 11 -11 17t7 13l72 75q-55 94 -55 226q0 118 42.5 204.5t120 133t181.5 46.5q138 0 227 -83l68 71q8 8 16 8 q6 0 10 -4l46 -46q5 -5 5 -11zM235 281l268 283q-37 66 -120 66t-121 -63t-38 -200q0 -53 11 -86zM529 454l-267 -281q37 -59 121 -59q83 0 120 59.5t37 193.5q0 49 -11 87z" />
<glyph unicode="&#xd9;" horiz-adv-x="721" d="M582 56.5q-77 -66.5 -222 -66.5q-159 0 -229 75t-70 228v429q0 9 4.5 14.5t11.5 5.5h144q15 0 15 -18v-453q0 -81 34.5 -118.5t102.5 -37.5q142 0 142 159v449q0 19 15 19h114q15 0 15 -18v-449q0 -152 -77 -218.5zM258 962.5q5 2.5 11 0.5l235 -99q8 -3 8 -12 q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xda;" horiz-adv-x="721" d="M582 56.5q-77 -66.5 -222 -66.5q-159 0 -229 75t-70 228v429q0 9 4.5 14.5t11.5 5.5h144q15 0 15 -18v-453q0 -81 34.5 -118.5t102.5 -37.5q142 0 142 159v449q0 19 15 19h114q15 0 15 -18v-449q0 -152 -77 -218.5zM515 887q2 -6 2 -10q0 -11 -17 -17l-231 -62 q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xdb;" horiz-adv-x="721" d="M582 56.5q-77 -66.5 -222 -66.5q-159 0 -229 75t-70 228v429q0 9 4.5 14.5t11.5 5.5h144q15 0 15 -18v-453q0 -81 34.5 -118.5t102.5 -37.5q142 0 142 159v449q0 19 15 19h114q15 0 15 -18v-449q0 -152 -77 -218.5zM387 882q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53 q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xdc;" horiz-adv-x="721" d="M582 56.5q-77 -66.5 -222 -66.5q-159 0 -229 75t-70 228v429q0 9 4.5 14.5t11.5 5.5h144q15 0 15 -18v-453q0 -81 34.5 -118.5t102.5 -37.5q142 0 142 159v449q0 19 15 19h114q15 0 15 -18v-449q0 -152 -77 -218.5zM340 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93 q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM543 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xdd;" horiz-adv-x="735" d="M704 732q0 -4 -3 -10l-235 -385q-6 -9 -7 -17.5t-1 -35.5v-260q0 -24 -28 -24h-125q-12 0 -17 5t-5 16v269q0 12 -2.5 18.5t-9.5 18.5l-237 392q-4 8 -4 11q0 5 5 8.5t14 3.5h150q12 0 18 -3.5t11 -14.5l148 -260q6 -11 10 -11q5 0 9 9l146 262q6 11 11.5 14.5t17.5 3.5 h120q14 0 14 -10zM518 887q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xde;" horiz-adv-x="724" d="M611.5 212.5q-74.5 -58.5 -196.5 -58.5h-159q-11 0 -11 -11v-120q0 -23 -26 -23h-128q-12 0 -16.5 5t-4.5 15v703q0 19 16 19h143q16 0 16 -18v-114q0 -10 9 -10h141q128 0 209.5 -57t81.5 -166q0 -106 -74.5 -164.5zM473.5 449.5q-33.5 24.5 -88.5 24.5h-121 q-10 0 -14.5 -4t-4.5 -13v-159q0 -10 3 -14.5t11 -4.5h132q54 0 85 26.5t31 73.5q0 46 -33.5 70.5z" />
<glyph unicode="&#xdf;" horiz-adv-x="649" d="M493 701q55 -41 55 -112q0 -53 -32 -86t-103 -63q-15 -8 -21 -13.5t-6 -14.5t5.5 -13t22.5 -10q68 -28 108 -51t69 -63.5t29 -101.5q0 -88 -59.5 -135.5t-158.5 -47.5q-77 0 -125 28q-6 3 -7.5 8t1.5 10l33 71q3 6 10 6q5 0 8 -2q36 -22 75 -22q38 0 61.5 17.5t23.5 50.5 q0 32 -22.5 48.5t-75.5 37.5q-51 21 -81 52t-30 81q0 36 17 62.5t50 51.5q7 6 27.5 22.5t30.5 33t10 35.5q0 27 -21 44t-58 17q-48 0 -74.5 -28.5t-26.5 -78.5v-516q1 -2 1 -7q0 -12 -14 -12h-123q-15 0 -15 17v373q0 10 -8 10h-37q-17 0 -17 15v73q0 8 5 13t14 5h31 q7 0 9.5 4t2.5 11q2 96 65 158.5t194 62.5q102 0 157 -41z" />
<glyph unicode="&#xe0;" horiz-adv-x="563" d="M190 -10q-75 0 -119 40.5t-44 105.5q0 84 77 135t212 54l36 3q6 0 10.5 3.5t4.5 10.5v21q0 39 -22 60t-63 21q-70 0 -104 -60q-4 -10 -13 -10q-5 0 -9 1l-100 23q-9 2 -9 11q0 6 4 15q24 58 85.5 87t152.5 29q119 0 172 -43.5t53 -123.5v-351q0 -12 -4 -17t-15 -5h-103 q-10 0 -14.5 7t-6.5 21l-1 22q-1 9 -8 9q-4 0 -15 -8q-66 -61 -157 -61zM364 249q-3 4 -12 4l-28 -2q-58 -3 -102.5 -27.5t-44.5 -67.5q0 -30 21 -47.5t58 -17.5q46 0 78 27q33 26 33 53v65q0 9 -3 13zM172 750.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35 q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xe1;" horiz-adv-x="563" d="M190 -10q-75 0 -119 40.5t-44 105.5q0 84 77 135t212 54l36 3q6 0 10.5 3.5t4.5 10.5v21q0 39 -22 60t-63 21q-70 0 -104 -60q-4 -10 -13 -10q-5 0 -9 1l-100 23q-9 2 -9 11q0 6 4 15q24 58 85.5 87t152.5 29q119 0 172 -43.5t53 -123.5v-351q0 -12 -4 -17t-15 -5h-103 q-10 0 -14.5 7t-6.5 21l-1 22q-1 9 -8 9q-4 0 -15 -8q-66 -61 -157 -61zM364 249q-3 4 -12 4l-28 -2q-58 -3 -102.5 -27.5t-44.5 -67.5q0 -30 21 -47.5t58 -17.5q46 0 78 27q33 26 33 53v65q0 9 -3 13zM429 675q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5 t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xe2;" horiz-adv-x="563" d="M190 -10q-75 0 -119 40.5t-44 105.5q0 84 77 135t212 54l36 3q6 0 10.5 3.5t4.5 10.5v21q0 39 -22 60t-63 21q-70 0 -104 -60q-4 -10 -13 -10q-5 0 -9 1l-100 23q-9 2 -9 11q0 6 4 15q24 58 85.5 87t152.5 29q119 0 172 -43.5t53 -123.5v-351q0 -12 -4 -17t-15 -5h-103 q-10 0 -14.5 7t-6.5 21l-1 22q-1 9 -8 9q-4 0 -15 -8q-66 -61 -157 -61zM364 249q-3 4 -12 4l-28 -2q-58 -3 -102.5 -27.5t-44.5 -67.5q0 -30 21 -47.5t58 -17.5q46 0 78 27q33 26 33 53v65q0 9 -3 13zM301 670q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7 t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xe3;" horiz-adv-x="563" d="M190 -10q-75 0 -119 40.5t-44 105.5q0 84 77 135t212 54l36 3q6 0 10.5 3.5t4.5 10.5v21q0 39 -22 60t-63 21q-70 0 -104 -60q-4 -10 -13 -10q-5 0 -9 1l-100 23q-9 2 -9 11q0 6 4 15q24 58 85.5 87t152.5 29q119 0 172 -43.5t53 -123.5v-351q0 -12 -4 -17t-15 -5h-103 q-10 0 -14.5 7t-6.5 21l-1 22q-1 9 -8 9q-4 0 -15 -8q-66 -61 -157 -61zM364 249q-3 4 -12 4l-28 -2q-58 -3 -102.5 -27.5t-44.5 -67.5q0 -30 21 -47.5t58 -17.5q46 0 78 27q33 26 33 53v65q0 9 -3 13zM364 627q-19 0 -35.5 3.5t-41.5 11.5q-23 7 -38.5 10.5t-32.5 3.5 q-20 0 -34 -5t-33 -18q-7 -5 -10 -5q-6 0 -9 12l-14 43q-2 6 -2 10q0 6 8 14q21 18 40.5 27.5t48.5 9.5q20 0 38.5 -4t46.5 -13q45 -15 68 -15q19 0 35.5 6.5t33.5 18.5q6 4 10 4q8 0 11 -11l12 -52q1 -2 1 -6q0 -9 -12 -18q-39 -27 -91 -27z" />
<glyph unicode="&#xe4;" horiz-adv-x="563" d="M190 -10q-75 0 -119 40.5t-44 105.5q0 84 77 135t212 54l36 3q6 0 10.5 3.5t4.5 10.5v21q0 39 -22 60t-63 21q-70 0 -104 -60q-4 -10 -13 -10q-5 0 -9 1l-100 23q-9 2 -9 11q0 6 4 15q24 58 85.5 87t152.5 29q119 0 172 -43.5t53 -123.5v-351q0 -12 -4 -17t-15 -5h-103 q-10 0 -14.5 7t-6.5 21l-1 22q-1 9 -8 9q-4 0 -15 -8q-66 -61 -157 -61zM364 249q-3 4 -12 4l-28 -2q-58 -3 -102.5 -27.5t-44.5 -67.5q0 -30 21 -47.5t58 -17.5q46 0 78 27q33 26 33 53v65q0 9 -3 13zM254 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95 q0 17 14 17h108q14 0 14 -16v-94zM457 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xe5;" horiz-adv-x="563" d="M190 -10q-75 0 -119 40.5t-44 105.5q0 84 77 135t212 54l36 3q6 0 10.5 3.5t4.5 10.5v21q0 39 -22 60t-63 21q-70 0 -104 -60q-4 -10 -13 -10q-5 0 -9 1l-100 23q-9 2 -9 11q0 6 4 15q24 58 85.5 87t152.5 29q119 0 172 -43.5t53 -123.5v-351q0 -12 -4 -17t-15 -5h-103 q-10 0 -14.5 7t-6.5 21l-1 22q-1 9 -8 9q-4 0 -15 -8q-66 -61 -157 -61zM364 249q-3 4 -12 4l-28 -2q-58 -3 -102.5 -27.5t-44.5 -67.5q0 -30 21 -47.5t58 -17.5q46 0 78 27q33 26 33 53v65q0 9 -3 13zM367.5 613.5q-32.5 -32.5 -79.5 -32.5t-79.5 33t-32.5 81q0 45 33 76.5 t79 31.5q47 0 79.5 -32t32.5 -78q0 -47 -32.5 -79.5zM323.5 728.5q-14.5 14.5 -36.5 14.5q-21 0 -36.5 -14.5t-15.5 -36.5q0 -20 16 -36t36 -16q21 0 36 15.5t15 36.5q0 22 -14.5 36.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="919" d="M526.5 232q-3.5 -4 -3.5 -15q0 -53 37.5 -87.5t93.5 -34.5q38 0 67 16t61 51q4 4 8 4q3 0 10 -3l71 -30q8 -3 8 -10q0 -6 -4 -10q-46 -67 -102.5 -95t-138.5 -28q-66 0 -118 25.5t-89 66.5q-5 4 -9 0q-44 -45 -95.5 -68.5t-124.5 -23.5q-82 0 -126.5 40.5t-44.5 110.5 q0 80 69.5 128t204.5 55l48 4q18 0 18 14v21q0 39 -22 60t-64 21q-32 0 -58.5 -14.5t-44.5 -45.5q-2 -6 -4.5 -8t-7.5 -2q-6 0 -10 1l-100 23q-7 1 -7 15q0 5 2 11q31 59 85 87.5t151 28.5q133 -1 183 -63q63 63 162 63q76 0 135 -33t92 -96.5t33 -150.5q0 -13 -3.5 -18 t-14.5 -6h-335q-9 0 -12.5 -4zM557.5 412.5q-32.5 -33.5 -31.5 -91.5l198 -1q10 0 13.5 3t3.5 12q0 26 -12 51.5t-35.5 42.5t-55.5 17q-48 0 -80.5 -33.5zM350 247l-37 -3q-57 -4 -96.5 -28.5t-39.5 -64.5q0 -30 20.5 -48t57.5 -18q45 0 78.5 23t33.5 57v65q0 17 -17 17z " />
<glyph unicode="&#xe7;" horiz-adv-x="551" d="M528 152l-2 -9q-18 -52 -67.5 -97.5t-129.5 -53.5l-16 -39q-3 -7 5 -7q50 -1 74 -25t24 -56q0 -38 -36 -61t-88 -23q-68 0 -111 24q-9 5 -5 13l14 35q3 7 11 4q37 -22 72 -22q24 0 37.5 8.5t13.5 23.5q0 20 -20.5 30.5t-66.5 10.5q-13 0 -8 10l32 74q-68 8 -120 44 t-81 95t-29 132q0 81 34.5 144t95 98t136.5 35q89 0 147.5 -44.5t78.5 -107.5q2 -8 2 -10q0 -9 -14 -11l-105 -10h-3q-9 0 -12 11q-18 36 -36.5 53.5t-52.5 17.5q-54 0 -84.5 -44t-30.5 -130q0 -88 32.5 -132t90.5 -44q41 0 67 21t51 64q3 5 6.5 5.5t10.5 -0.5l74 -17 q9 -1 9 -10z" />
<glyph unicode="&#xe8;" horiz-adv-x="586" d="M227.5 129.5q37.5 -34.5 93.5 -34.5q36 0 66.5 15.5t61.5 51.5q4 4 8 4q3 0 10 -3l72 -30q7 -3 7 -10q0 -5 -4 -10q-48 -68 -103 -95.5t-137 -27.5q-77 0 -139 34t-97 94.5t-35 138.5q0 84 36 148.5t97.5 99.5t134.5 35q76 0 135 -33.5t92 -96.5t33 -150q0 -13 -2.5 -18 t-14.5 -6h-340q-12 0 -12 -16q0 -56 37.5 -90.5zM391 320q11 0 14 2.5t3 11.5q0 26 -12 52t-35 43t-56 17q-50 0 -82 -35t-31 -90zM184 750.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5 z" />
<glyph unicode="&#xe9;" horiz-adv-x="586" d="M227.5 129.5q37.5 -34.5 93.5 -34.5q36 0 66.5 15.5t61.5 51.5q4 4 8 4q3 0 10 -3l72 -30q7 -3 7 -10q0 -5 -4 -10q-48 -68 -103 -95.5t-137 -27.5q-77 0 -139 34t-97 94.5t-35 138.5q0 84 36 148.5t97.5 99.5t134.5 35q76 0 135 -33.5t92 -96.5t33 -150q0 -13 -2.5 -18 t-14.5 -6h-340q-12 0 -12 -16q0 -56 37.5 -90.5zM391 320q11 0 14 2.5t3 11.5q0 26 -12 52t-35 43t-56 17q-50 0 -82 -35t-31 -90zM441 675q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xea;" horiz-adv-x="586" d="M227.5 129.5q37.5 -34.5 93.5 -34.5q36 0 66.5 15.5t61.5 51.5q4 4 8 4q3 0 10 -3l72 -30q7 -3 7 -10q0 -5 -4 -10q-48 -68 -103 -95.5t-137 -27.5q-77 0 -139 34t-97 94.5t-35 138.5q0 84 36 148.5t97.5 99.5t134.5 35q76 0 135 -33.5t92 -96.5t33 -150q0 -13 -2.5 -18 t-14.5 -6h-340q-12 0 -12 -16q0 -56 37.5 -90.5zM391 320q11 0 14 2.5t3 11.5q0 26 -12 52t-35 43t-56 17q-50 0 -82 -35t-31 -90zM313 670q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3 t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xeb;" horiz-adv-x="586" d="M227.5 129.5q37.5 -34.5 93.5 -34.5q36 0 66.5 15.5t61.5 51.5q4 4 8 4q3 0 10 -3l72 -30q7 -3 7 -10q0 -5 -4 -10q-48 -68 -103 -95.5t-137 -27.5q-77 0 -139 34t-97 94.5t-35 138.5q0 84 36 148.5t97.5 99.5t134.5 35q76 0 135 -33.5t92 -96.5t33 -150q0 -13 -2.5 -18 t-14.5 -6h-340q-12 0 -12 -16q0 -56 37.5 -90.5zM391 320q11 0 14 2.5t3 11.5q0 26 -12 52t-35 43t-56 17q-50 0 -82 -35t-31 -90zM266 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM469 632q0 -11 -5.5 -15.5 t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xec;" horiz-adv-x="265" d="M209 24q0 -13 -6 -18.5t-21 -5.5h-105q-12 0 -17 5t-5 16v490q0 19 17 19h122q15 0 15 -17v-489zM19 750.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xed;" horiz-adv-x="265" d="M209 24q0 -13 -6 -18.5t-21 -5.5h-105q-12 0 -17 5t-5 16v490q0 19 17 19h122q15 0 15 -17v-489zM276 675q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xee;" horiz-adv-x="265" d="M209 24q0 -13 -6 -18.5t-21 -5.5h-105q-12 0 -17 5t-5 16v490q0 19 17 19h122q15 0 15 -17v-489zM148 670q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4 h-86q-16 0 -24 8z" />
<glyph unicode="&#xef;" horiz-adv-x="265" d="M209 24q0 -13 -6 -18.5t-21 -5.5h-105q-12 0 -17 5t-5 16v490q0 19 17 19h122q15 0 15 -17v-489zM101 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM304 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5 v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xf0;" horiz-adv-x="599" d="M534.5 124.5q-33.5 -64.5 -94.5 -99.5t-142 -35q-78 0 -138.5 34t-94.5 94t-34 134q0 77 34.5 138t95.5 95.5t136 34.5q33 0 51 -16q-33 58 -96 103l-116 -66q-6 -3 -9 -3q-6 0 -12 9l-13 21q-4 5 -4 11t5 8l95 53q-43 24 -90 41q-5 2 -6 5.5t4 7.5l65 52q6 6 11 6l9 -2 q69 -21 120 -47l83 46q4 3 8 3q3 0 7 -4l19 -34q1 -2 1 -5q0 -4 -4 -7l-59 -33q99 -68 150.5 -170.5t51.5 -224.5q0 -85 -33.5 -149.5zM383 135q29 43 29 120q0 79 -29.5 122.5t-82.5 43.5t-83 -44t-30 -122q0 -77 30 -120t83 -43q54 0 83 43z" />
<glyph unicode="&#xf1;" horiz-adv-x="596" d="M60 4.5q-5 4.5 -5 15.5v491q0 19 16 19h121q15 0 15 -17v-49q0 -8 5 -8q3 0 7 4q41 39 82 59.5t87 20.5q73 0 115.5 -43t42.5 -115v-358q0 -24 -24 -24h-111q-11 0 -15 4.5t-4 15.5v338q0 34 -18.5 52.5t-54.5 18.5q-30 0 -55.5 -15t-54.5 -47v-344q0 -12 -6 -17.5 t-20 -5.5h-107q-11 0 -16 4.5zM380 627q-19 0 -35.5 3.5t-41.5 11.5q-23 7 -38.5 10.5t-32.5 3.5q-20 0 -34 -5t-33 -18q-7 -5 -10 -5q-6 0 -9 12l-14 43q-2 6 -2 10q0 6 8 14q21 18 40.5 27.5t48.5 9.5q20 0 38.5 -4t46.5 -13q45 -15 68 -15q19 0 35.5 6.5t33.5 18.5 q6 4 10 4q8 0 11 -11l12 -52q1 -2 1 -6q0 -9 -12 -18q-39 -27 -91 -27z" />
<glyph unicode="&#xf2;" horiz-adv-x="599" d="M159.5 24.5q-60.5 34.5 -94.5 96.5t-34 141q0 82 34.5 145t96 98t138.5 35q79 0 140 -35.5t94.5 -98.5t33.5 -143q0 -79 -34 -141t-95 -97t-140 -35t-139.5 34.5zM383.5 135.5q28.5 43.5 28.5 129.5q0 87 -28.5 131.5t-83.5 44.5t-84 -44.5t-29 -131.5q0 -85 29 -129 t84 -44t83.5 43.5zM184 750.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xf3;" horiz-adv-x="599" d="M159.5 24.5q-60.5 34.5 -94.5 96.5t-34 141q0 82 34.5 145t96 98t138.5 35q79 0 140 -35.5t94.5 -98.5t33.5 -143q0 -79 -34 -141t-95 -97t-140 -35t-139.5 34.5zM383.5 135.5q28.5 43.5 28.5 129.5q0 87 -28.5 131.5t-83.5 44.5t-84 -44.5t-29 -131.5q0 -85 29 -129 t84 -44t83.5 43.5zM441 675q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xf4;" horiz-adv-x="599" d="M159.5 24.5q-60.5 34.5 -94.5 96.5t-34 141q0 82 34.5 145t96 98t138.5 35q79 0 140 -35.5t94.5 -98.5t33.5 -143q0 -79 -34 -141t-95 -97t-140 -35t-139.5 34.5zM383.5 135.5q28.5 43.5 28.5 129.5q0 87 -28.5 131.5t-83.5 44.5t-84 -44.5t-29 -131.5q0 -85 29 -129 t84 -44t83.5 43.5zM313 670q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xf5;" horiz-adv-x="599" d="M159.5 24.5q-60.5 34.5 -94.5 96.5t-34 141q0 82 34.5 145t96 98t138.5 35q79 0 140 -35.5t94.5 -98.5t33.5 -143q0 -79 -34 -141t-95 -97t-140 -35t-139.5 34.5zM383.5 135.5q28.5 43.5 28.5 129.5q0 87 -28.5 131.5t-83.5 44.5t-84 -44.5t-29 -131.5q0 -85 29 -129 t84 -44t83.5 43.5zM376 627q-19 0 -35.5 3.5t-41.5 11.5q-23 7 -38.5 10.5t-32.5 3.5q-20 0 -34 -5t-33 -18q-7 -5 -10 -5q-6 0 -9 12l-14 43q-2 6 -2 10q0 6 8 14q21 18 40.5 27.5t48.5 9.5q20 0 38.5 -4t46.5 -13q45 -15 68 -15q19 0 35.5 6.5t33.5 18.5q6 4 10 4 q8 0 11 -11l12 -52q1 -2 1 -6q0 -9 -12 -18q-39 -27 -91 -27z" />
<glyph unicode="&#xf6;" horiz-adv-x="599" d="M159.5 24.5q-60.5 34.5 -94.5 96.5t-34 141q0 82 34.5 145t96 98t138.5 35q79 0 140 -35.5t94.5 -98.5t33.5 -143q0 -79 -34 -141t-95 -97t-140 -35t-139.5 34.5zM383.5 135.5q28.5 43.5 28.5 129.5q0 87 -28.5 131.5t-83.5 44.5t-84 -44.5t-29 -131.5q0 -85 29 -129 t84 -44t83.5 43.5zM266 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM469 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xf7;" horiz-adv-x="584" d="M373 522q0 -12 -6 -16.5t-20 -4.5h-113q-12 0 -16 4t-4 15v116q0 17 14 17h131q14 0 14 -15v-116zM536 340q0 -12 -6.5 -17t-20.5 -5l-440 -1q-11 0 -15.5 5t-4.5 15v73q0 19 15 19h457q7 0 11 -4.5t4 -11.5v-73zM373 115q0 -12 -6 -17t-20 -5h-113q-12 0 -16 4.5 t-4 14.5v117q0 17 14 17h131q14 0 14 -15v-116z" />
<glyph unicode="&#xf8;" horiz-adv-x="596" d="M576 484q0 -6 -6 -12l-48 -46q45 -70 45 -163q0 -79 -34 -141t-95 -97t-140 -35q-104 0 -175 59l-41 -39q-10 -9 -19 -9q-8 0 -17 9l-16 17q-10 10 -10 19q0 6 7 13l47 45q-44 68 -44 158q0 82 34.5 145t96 98t138.5 35q102 0 174 -59l43 40q9 9 16 9q6 0 11 -5l28 -30 q5 -5 5 -11zM189 212l194 184q-27 45 -84 45q-55 0 -84 -44.5t-29 -131.5q0 -29 3 -53zM408 318l-193 -182q29 -44 84 -44t83.5 43.5t28.5 129.5q0 29 -3 53z" />
<glyph unicode="&#xf9;" horiz-adv-x="592" d="M383 160v347q0 23 26 23h108q12 0 16.5 -5t4.5 -16l-2 -491q0 -8 -4.5 -13t-11.5 -5h-119q-15 0 -15 17v49q0 6 -3 7t-8 -3q-42 -43 -83 -61.5t-89 -18.5q-67 0 -110 43.5t-43 117.5v355q0 24 24 24h111q19 0 19 -21v-336q0 -33 19 -52.5t51 -19.5q55 0 109 59z M174 750.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#xfa;" horiz-adv-x="592" d="M383 160v347q0 23 26 23h108q12 0 16.5 -5t4.5 -16l-2 -491q0 -8 -4.5 -13t-11.5 -5h-119q-15 0 -15 17v49q0 6 -3 7t-8 -3q-42 -43 -83 -61.5t-89 -18.5q-67 0 -110 43.5t-43 117.5v355q0 24 24 24h111q19 0 19 -21v-336q0 -33 19 -52.5t51 -19.5q55 0 109 59zM431 675 q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xfb;" horiz-adv-x="592" d="M383 160v347q0 23 26 23h108q12 0 16.5 -5t4.5 -16l-2 -491q0 -8 -4.5 -13t-11.5 -5h-119q-15 0 -15 17v49q0 6 -3 7t-8 -3q-42 -43 -83 -61.5t-89 -18.5q-67 0 -110 43.5t-43 117.5v355q0 24 24 24h111q19 0 19 -21v-336q0 -33 19 -52.5t51 -19.5q55 0 109 59zM303 670 q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#xfc;" horiz-adv-x="592" d="M383 160v347q0 23 26 23h108q12 0 16.5 -5t4.5 -16l-2 -491q0 -8 -4.5 -13t-11.5 -5h-119q-15 0 -15 17v49q0 6 -3 7t-8 -3q-42 -43 -83 -61.5t-89 -18.5q-67 0 -110 43.5t-43 117.5v355q0 24 24 24h111q19 0 19 -21v-336q0 -33 19 -52.5t51 -19.5q55 0 109 59zM256 632 q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM459 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#xfd;" horiz-adv-x="566" d="M58 -161.5q-13 3.5 -13 15.5v77q0 16 29 16h68q30 0 52 22.5t22 47.5q0 9 -3 16l-192 473q-2 6 -2 8q0 7 5 11.5t13 4.5h126q7 0 13.5 -4.5t8.5 -12.5l111 -298q3 -10 8 -10q4 0 9 11l110 298q7 16 22 16h86q7 0 11.5 -4.5t4.5 -10.5q0 -2 -2 -8l-205 -507 q-28 -69 -59 -104t-71.5 -48t-105.5 -13q-33 0 -46 3.5zM447 675q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#xfe;" horiz-adv-x="607" d="M205 737.5q5 -4.5 5 -15.5v-242q0 -7 4 -7q3 0 10 5q31 29 63.5 45.5t82.5 16.5q91 0 148 -69t57 -202q0 -138 -58.5 -208.5t-154.5 -70.5q-79 0 -134 51q-10 8 -14 8q-5 0 -5 -14v-183q0 -17 -15 -17h-123q-7 0 -11.5 4.5t-4.5 13.5v867q0 12 5.5 17t17.5 5h110 q12 0 17 -4.5zM254 100q23 -13 51 -13q114 0 114 185q0 92 -29 131.5t-82 39.5q-41 0 -70 -24.5t-29 -55.5v-226q22 -24 45 -37z" />
<glyph unicode="&#xff;" horiz-adv-x="566" d="M58 -161.5q-13 3.5 -13 15.5v77q0 16 29 16h68q30 0 52 22.5t22 47.5q0 9 -3 16l-192 473q-2 6 -2 8q0 7 5 11.5t13 4.5h126q7 0 13.5 -4.5t8.5 -12.5l111 -298q3 -10 8 -10q4 0 9 11l110 298q7 16 22 16h86q7 0 11.5 -4.5t4.5 -10.5q0 -2 -2 -8l-205 -507 q-28 -69 -59 -104t-71.5 -48t-105.5 -13q-33 0 -46 3.5zM272 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM475 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#x131;" horiz-adv-x="265" d="M209 24q0 -13 -6 -18.5t-21 -5.5h-105q-12 0 -17 5t-5 16v490q0 19 17 19h122q15 0 15 -17v-489z" />
<glyph unicode="&#x13f;" horiz-adv-x="616" d="M86 742h143q16 0 16 -18v-583q0 -7 2.5 -10t8.5 -3h319q18 0 18 -15v-95q0 -8 -5 -13t-14 -5h-482q-12 0 -17 5t-5 16v702q0 19 16 19zM550 357q0 -12 -5.5 -17t-18.5 -5h-112q-11 0 -15.5 4.5t-4.5 14.5v115q0 17 14 17h129q13 0 13 -15v-114z" />
<glyph unicode="&#x140;" horiz-adv-x="399" d="M210 24q0 -13 -6 -18.5t-21 -5.5h-106q-12 0 -17 5t-5 16l3 702q0 19 16 19h121q15 0 15 -18v-700zM409 237q0 -12 -5.5 -17t-18.5 -5h-112q-11 0 -15.5 4.5t-4.5 14.5v115q0 17 14 17h129q13 0 13 -15v-114z" />
<glyph unicode="&#x152;" horiz-adv-x="1128" d="M1085 125q4 -3 4 -12v-95q0 -18 -19 -18h-447q-11 0 -17 3l-36 37q-64 -50 -174 -50q-109 0 -188 45.5t-121 130.5t-42 202q0 118 43 204.5t124 133t193 46.5q107 0 165 -51l29 38q8 3 18 3h447q15 0 15 -17l-1 -90q0 -21 -21 -21h-317q-19 0 -19 -16v-145 q0 -8 4.5 -12.5t11.5 -4.5h208q17 0 17 -16v-96q0 -14 -15 -14h-212q-14 0 -14 -12v-157q0 -7 2.5 -10t8.5 -3h339q10 0 14 -3zM508 173q37 60 37 194q0 137 -38 200t-119 63q-83 0 -121.5 -63t-38.5 -200q0 -134 38 -194t122 -60q83 0 120 60z" />
<glyph unicode="&#x153;" horiz-adv-x="963" d="M159.5 24.5q-60.5 34.5 -94.5 96.5t-34 141q0 82 34.5 145t96 98t138.5 35q55 0 101.5 -19.5t79.5 -55.5q7 -5 11 -5q3 0 10 5q32 36 76.5 55.5t96.5 19.5q77 0 136 -33.5t91.5 -97t32.5 -150.5q0 -12 -3.5 -17t-14.5 -6h-335q-15 0 -15 -17q0 -56 37.5 -90t93.5 -34 q36 0 66.5 15.5t61.5 51.5q3 4 7 4t11 -3l71 -30q8 -3 8 -10q0 -3 -5 -10q-47 -68 -102.5 -95.5t-137.5 -27.5q-55 0 -101.5 19t-79.5 54q-4 4 -8 4t-10 -6q-33 -34 -79 -52.5t-101 -18.5q-79 0 -139.5 34.5zM601.5 411.5q-32.5 -33.5 -31.5 -90.5l198 -1q10 0 13.5 2.5 t3.5 11.5q0 26 -12 52t-35.5 42.5t-55.5 16.5q-48 0 -80.5 -33.5zM383.5 135.5q28.5 43.5 28.5 129.5q0 87 -28.5 131t-83.5 44t-84 -44.5t-29 -130.5q0 -85 29 -129t84 -44t83.5 43.5z" />
<glyph unicode="&#x178;" horiz-adv-x="735" d="M704 732q0 -4 -3 -10l-235 -385q-6 -9 -7 -17.5t-1 -35.5v-260q0 -24 -28 -24h-125q-12 0 -17 5t-5 16v269q0 12 -2.5 18.5t-9.5 18.5l-237 392q-4 8 -4 11q0 5 5 8.5t14 3.5h150q12 0 18 -3.5t11 -14.5l148 -260q6 -11 10 -11q5 0 9 9l146 262q6 11 11.5 14.5t17.5 3.5 h120q14 0 14 -10zM343 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM546 844q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#x237;" horiz-adv-x="265" d="M166 -126.5q-44 -43.5 -138 -43.5q-43 0 -55 3.5t-12 16.5l-1 79q0 7 4.5 13.5t11.5 7.5l42 5q19 2 28.5 14.5t9.5 42.5v499q0 9 4.5 14t12.5 5h122q15 0 15 -17v-507q0 -89 -44 -132.5z" />
<glyph unicode="&#x2c6;" horiz-adv-x="380" d="M203 670q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#x2dc;" horiz-adv-x="409" d="M280 627q-19 0 -35.5 3.5t-41.5 11.5q-23 7 -38.5 10.5t-32.5 3.5q-20 0 -34 -5t-33 -18q-7 -5 -10 -5q-6 0 -9 12l-14 43q-2 6 -2 10q0 6 8 14q21 18 40.5 27.5t48.5 9.5q20 0 38.5 -4t46.5 -13q45 -15 68 -15q19 0 35.5 6.5t33.5 18.5q6 4 10 4q8 0 11 -11l12 -52 q1 -2 1 -6q0 -9 -12 -18q-39 -27 -91 -27z" />
<glyph unicode="&#x300;" d="M-264 750.5q5 2.5 11 0.5l235 -99q8 -3 8 -12q0 -5 -2 -8l-12 -35q-4 -12 -14 -12q-6 0 -9 1l-232 62q-17 6 -17 17q0 4 2 10l23 67q2 6 7 8.5z" />
<glyph unicode="&#x301;" d="M-12 675q2 -6 2 -10q0 -11 -17 -17l-231 -62q-4 -1 -9 -1q-6 0 -9 2.5t-6 9.5l-12 35l-2 8q0 9 8 12l236 99q2 1 5 1q9 0 12 -10z" />
<glyph unicode="&#x302;" d="M-177 670q-4 5 -8 8.5t-7 3.5q-5 0 -15 -12l-50 -53q-6 -6 -10 -7t-13 -1h-81q-9 0 -9 5t6 11l108 112q8 7 14.5 10t18.5 3h72q9 0 14 -3t11 -9l107 -113q8 -8 8 -12t-10 -4h-86q-16 0 -24 8z" />
<glyph unicode="&#x303;" d="M-129 627q-19 0 -35.5 3.5t-41.5 11.5q-23 7 -38.5 10.5t-32.5 3.5q-20 0 -34 -5t-33 -18q-7 -5 -10 -5q-6 0 -9 12l-14 43q-2 6 -2 10q0 6 8 14q21 18 40.5 27.5t48.5 9.5q20 0 38.5 -4t46.5 -13q45 -15 68 -15q19 0 35.5 6.5t33.5 18.5q6 4 10 4q8 0 11 -11l12 -52 q1 -2 1 -6q0 -9 -12 -18q-39 -27 -91 -27z" />
<glyph unicode="&#x304;" d="M-10 657q0 -19 -23 -19h-324q-10 0 -14 4.5t-4 13.5v64q0 16 13 16h339q6 0 9.5 -4t3.5 -10v-65z" />
<glyph unicode="&#x308;" d="M-213 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94zM-10 632q0 -11 -5.5 -15.5t-18.5 -4.5h-93q-11 0 -15 4.5t-4 13.5v95q0 17 14 17h108q14 0 14 -16v-94z" />
<glyph unicode="&#x30a;" d="M-42.5 605.5q-32.5 -32.5 -79.5 -32.5t-79.5 33t-32.5 81q0 45 33 76.5t79 31.5q47 0 79.5 -32t32.5 -78q0 -47 -32.5 -79.5zM-86.5 720.5q-14.5 14.5 -36.5 14.5q-21 0 -36.5 -14.5t-15.5 -36.5q0 -20 16 -36t36 -16q21 0 36 15.5t15 36.5q0 22 -14.5 36.5z" />
<glyph unicode="&#x327;" d="M-46 -196q-36 -23 -88 -23q-68 0 -111 24q-9 5 -5 13l14 35q3 7 11 4q37 -22 72 -22q24 0 37.5 8.5t13.5 23.5q0 20 -20.5 30.5t-66.5 10.5q-13 0 -8 10l37 87h68l-21 -52q-3 -7 5 -7q50 -1 74 -25t24 -56q0 -38 -36 -61z" />
<glyph unicode="&#x2000;" horiz-adv-x="482" />
<glyph unicode="&#x2001;" horiz-adv-x="964" />
<glyph unicode="&#x2002;" horiz-adv-x="482" />
<glyph unicode="&#x2003;" horiz-adv-x="964" />
<glyph unicode="&#x2004;" horiz-adv-x="321" />
<glyph unicode="&#x2005;" horiz-adv-x="241" />
<glyph unicode="&#x2006;" horiz-adv-x="160" />
<glyph unicode="&#x2007;" horiz-adv-x="160" />
<glyph unicode="&#x2008;" horiz-adv-x="120" />
<glyph unicode="&#x2009;" horiz-adv-x="192" />
<glyph unicode="&#x200a;" horiz-adv-x="53" />
<glyph unicode="&#x2010;" horiz-adv-x="380" d="M331 230q0 -22 -26 -22h-235q-12 0 -16.5 4.5t-4.5 15.5v73q0 18 15 18h252q7 0 11 -4t4 -11v-74z" />
<glyph unicode="&#x2011;" horiz-adv-x="380" d="M331 230q0 -22 -26 -22h-235q-12 0 -16.5 4.5t-4.5 15.5v73q0 18 15 18h252q7 0 11 -4t4 -11v-74z" />
<glyph unicode="&#x2012;" horiz-adv-x="380" d="M331 230q0 -22 -26 -22h-235q-12 0 -16.5 4.5t-4.5 15.5v73q0 18 15 18h252q7 0 11 -4t4 -11v-74z" />
<glyph unicode="&#x2013;" horiz-adv-x="584" d="M536 222q0 -12 -6.5 -17.5t-20.5 -5.5h-440q-12 0 -16 4.5t-4 15.5v73q0 18 15 18l457 1q7 0 11 -4.5t4 -11.5v-73z" />
<glyph unicode="&#x2014;" horiz-adv-x="909" d="M860 222q0 -23 -26 -23h-765q-12 0 -16 4.5t-4 15.5v73q0 18 15 18l782 1q7 0 10.5 -4.5t3.5 -11.5v-73z" />
<glyph unicode="&#x2018;" horiz-adv-x="241" d="M193 736q3 -6 1 -12l-43 -99q-4 -12 -4 -14q0 -8 12 -11l16 -1q11 -1 15.5 -5t4.5 -13v-114q0 -17 -15 -17h-126q-14 0 -14 15v108q0 6 4 12l90 141q5 8 14 12t18 4h17q7 0 10 -6z" />
<glyph unicode="&#x2019;" horiz-adv-x="241" d="M48 456q-3 6 -1 12l43 99q4 12 4 14q0 8 -12 11l-16 1q-11 1 -15.5 5t-4.5 13v114q0 17 15 17h126q14 0 14 -15v-108q0 -6 -4 -12l-90 -141q-5 -8 -14 -12t-18 -4h-17q-7 0 -10 6z" />
<glyph unicode="&#x201a;" horiz-adv-x="241" d="M48 -137.5q-3 5.5 -1 11.5l43 100q4 12 4 14q0 8 -12 11l-16 1q-11 1 -15.5 5t-4.5 13v114q0 17 15 17h126q14 0 14 -15v-108q0 -6 -4 -12l-90 -141q-5 -8 -14 -12t-18 -4h-17q-7 0 -10 5.5z" />
<glyph unicode="&#x201c;" horiz-adv-x="465" d="M40 464v109q0 5 3 11l91 142q10 16 32 16h16q7 0 10.5 -6t1.5 -12l-43 -99q-4 -12 -4 -15q0 -8 11 -10l17 -1q11 -2 15 -5.5t4 -13.5v-113q0 -17 -14 -17h-126q-14 0 -14 14zM264 464v109q0 7 4 11l90 142q5 8 14 12t18 4h17q7 0 10 -6t1 -12l-43 -99q-4 -12 -4 -14 q0 -9 12 -11l16 -1q11 -2 15.5 -5.5t4.5 -13.5v-113q0 -17 -15 -17h-126q-14 0 -14 14z" />
<glyph unicode="&#x201d;" horiz-adv-x="469" d="M48 456q-3 6 -1 12l43 99q4 12 4 14q0 8 -12 11l-16 1q-11 1 -15.5 5t-4.5 13v114q0 17 15 17h126q14 0 14 -15v-108q0 -6 -4 -12l-90 -141q-5 -8 -14 -12t-18 -4h-17q-7 0 -10 6zM272.5 456q-3.5 6 -1.5 12l43 99q4 12 4 14q0 8 -11 11l-17 1q-10 1 -14.5 5t-4.5 13v114 q0 17 14 17h126q14 0 14 -15v-108q0 -3 -3 -12l-91 -141q-10 -16 -32 -16h-16q-7 0 -10.5 6z" />
<glyph unicode="&#x201e;" horiz-adv-x="469" d="M272 -137.5q-3 5.5 -1 11.5l43 100q4 12 4 14q0 8 -12 11l-16 1q-11 1 -15.5 5t-4.5 13v114q0 17 15 17h126q14 0 14 -15v-108q0 -6 -4 -12l-90 -141q-5 -8 -14 -12t-18 -4h-17q-7 0 -10 5.5zM48 -137.5q-3 5.5 -1 11.5l43 100q4 12 4 14q0 8 -12 11l-16 1q-11 1 -15.5 5 t-4.5 13v114q0 17 15 17h126q14 0 14 -15v-108q0 -6 -4 -12l-90 -141q-5 -8 -14 -12t-18 -4h-17q-7 0 -10 5.5z" />
<glyph unicode="&#x2022;" horiz-adv-x="339" d="M102.5 264.5q-30.5 17.5 -48 47.5t-17.5 65t17.5 65t48 47.5t65.5 17.5t65 -17.5t47.5 -47.5t17.5 -65t-17.5 -65t-47.5 -47.5t-65 -17.5t-65.5 17.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="888" d="M839 24q0 -13 -6.5 -18.5t-21.5 -5.5h-118q-22 0 -22 21v127q0 9 4.5 13.5t11.5 4.5h137q15 0 15 -17v-125zM208 24q0 -13 -6.5 -18.5t-21.5 -5.5h-118q-22 0 -22 21v127q0 9 4.5 13.5t11.5 4.5h137q15 0 15 -17v-125zM524 24q0 -13 -6.5 -18.5t-21.5 -5.5h-118 q-22 0 -22 21v127q0 9 4.5 13.5t11.5 4.5h137q15 0 15 -17v-125z" />
<glyph unicode="&#x202f;" horiz-adv-x="192" />
<glyph unicode="&#x2039;" horiz-adv-x="290" d="M239 76l1 -4q0 -7 -14 -7h-56q-9 0 -13 8l-105 166q-6 9 -6 18t5 17l106 176q5 8 14 8h58q6 0 9 -4t1 -10l-74 -176q-2 -8 -2 -12q0 -2 2 -10z" />
<glyph unicode="&#x203a;" horiz-adv-x="290" d="M127 257q0 7 -2 11l-73 176q-1 2 -1 5q0 9 11 9h57q6 0 8.5 -1.5t5.5 -6.5l107 -176q4 -7 4 -16q0 -11 -5 -19l-105 -166q-6 -8 -14 -8h-56q-17 0 -13 11l74 170q2 4 2 11z" />
<glyph unicode="&#x2044;" horiz-adv-x="245" d="M-78 7q-7 -11 -25 -11l-42 1q-16 0 -16 14q0 6 5 14l475 714q5 7 9.5 9t13.5 2h53q12 0 12 -8q0 -1 -4 -9z" />
<glyph unicode="&#x205f;" horiz-adv-x="241" />
<glyph unicode="&#x2070;" horiz-adv-x="484" d="M336.5 827q44.5 -30 69.5 -85t25 -127q0 -71 -25 -125t-69 -83.5t-101 -29.5t-101 29.5t-69 83t-25 124.5q0 72 25 127.5t69.5 85.5t100.5 30t100.5 -30zM299 492q20 37 20 122q0 87 -20.5 126.5t-62.5 39.5q-41 0 -62 -39.5t-21 -126.5q0 -84 20.5 -121.5t62.5 -37.5 q43 0 63 37z" />
<glyph unicode="&#x2074;" horiz-adv-x="483" d="M260.5 845q4.5 2 14.5 2h79q10 0 10 -12v-263q0 -7 6 -7h52q12 0 12 -10v-54q0 -11 -13 -11h-50q-7 0 -7 -7v-89q0 -14 -17 -14h-81q-14 0 -14 13v91q0 6 -7 6h-189q-13 0 -13 11v53q0 6 4.5 13t11.5 17l190 251q7 8 11.5 10zM247 565q6 0 6 4v157q0 9 -2 9t-7 -7 l-112 -155q-6 -8 4 -8h111z" />
<glyph unicode="&#x2075;" horiz-adv-x="470" d="M378 847q10 0 13 -3t2 -12l-3 -62q-1 -7 -3.5 -9t-10.5 -2h-198q-11 0 -11 -10l-8 -80v-2q0 -4 2.5 -5.5t6.5 -0.5q33 11 50 15.5t40 4.5q74 0 121 -39t47 -110q0 -74 -52 -116t-138 -42q-60 0 -109 20.5t-76 54.5q-5 7 -5 12q0 6 7 10l51 36q3 2 8 2t9 -4q26 -28 48 -41 t55 -13q44 0 68.5 21.5t24.5 56.5q0 33 -22.5 53.5t-61.5 20.5q-21 0 -38.5 -6t-42.5 -19q-6 -3 -8 -3q-3 0 -8 4l-58 31q-7 4 -7 11l1 9l18 202q0 9 4.5 12t17.5 3h266z" />
<glyph unicode="&#x2076;" horiz-adv-x="473" d="M344 830q41 -27 52 -58l1 -5q0 -6 -7 -9l-68 -22q-1 -1 -3 -1q-4 0 -9 8q-14 19 -27.5 28.5t-35.5 9.5q-46 0 -71.5 -33.5t-25.5 -87.5q0 -9 1 -12t5 -3l8 2q29 12 48.5 18t46.5 6q72 0 117 -39t45 -100q0 -44 -24 -79t-66 -54.5t-93 -19.5q-91 0 -144 62t-53 167 q0 116 56 182.5t150 66.5q56 0 97 -27zM195.5 591.5q-22.5 -6.5 -35.5 -14.5q-5 -4 -7 -8t-2 -14q0 -43 23 -73t61 -30q33 0 55 21.5t22 54.5q0 32 -21.5 51t-54.5 19q-18 0 -40.5 -6.5z" />
<glyph unicode="&#x2077;" horiz-adv-x="432" d="M385 847q9 0 13.5 -4t4.5 -10l-2 -34q-1 -6 -6 -16.5t-10 -18.5q-54 -83 -95 -191t-47 -175q0 -18 -13 -18h-99q-14 0 -11 15q22 78 59.5 161t105.5 192q3 3 3 6q0 5 -8 5h-213q-13 0 -12 12l7 67q0 9 15 9h308z" />
<glyph unicode="&#x2078;" horiz-adv-x="469" d="M319 840q39 -17 61.5 -46.5t22.5 -66.5q0 -52 -60 -87q-5 -3 -5.5 -5.5t4.5 -5.5q45 -24 63.5 -50.5t18.5 -62.5q0 -64 -54 -101t-142 -37q-83 0 -133 32t-50 89q0 33 16.5 57t55.5 46q6 4 6.5 6t-5.5 6q-29 20 -45 42.5t-16 57.5q0 39 21 72t61 52t92 19q49 0 88 -17z M181.5 768.5q-20.5 -16.5 -20.5 -41.5q0 -39 43 -51l50 -15q12 -3 25.5 6t22.5 25t9 32q0 26 -21 43.5t-57 17.5q-31 0 -51.5 -16.5zM293.5 465.5q21.5 15.5 21.5 42.5q0 20 -11.5 33t-39.5 22l-59 17q-3 1 -9 1q-20 0 -38.5 -19.5t-18.5 -46.5q0 -65 95 -65q38 0 59.5 15.5 z" />
<glyph unicode="&#x2079;" horiz-adv-x="473" d="M117 406q-41 27 -52 59q-1 2 -1 5q0 7 6 9l68 22h3q4 0 6.5 -3t3.5 -4q13 -19 27.5 -28.5t37.5 -9.5q45 0 69.5 33t24.5 88q0 6 -1 10t-4 4q-4 0 -8 -2q-28 -12 -47.5 -17.5t-46.5 -5.5q-72 0 -116.5 39t-44.5 100q0 44 24 78.5t65.5 54t92.5 19.5q91 0 143.5 -61.5 t52.5 -167.5q0 -76 -25.5 -132.5t-71.5 -86.5t-107 -30q-58 0 -99 27zM267 645q22 7 34 16q5 4 7 8t2 14q0 42 -22.5 72t-60.5 30q-32 0 -54 -21.5t-22 -54.5q0 -32 21 -51.5t53 -19.5q20 0 42 7z" />
<glyph unicode="&#x20ac;" horiz-adv-x="652" d="M620 100q2 -4 -1 -8q-40 -46 -99 -74t-126 -28q-112 0 -193 69t-110 187h-75q-12 0 -16.5 4.5t-4.5 15.5v45q0 18 15 18h67q-2 32 -2 48q0 24 1 36h-60q-12 0 -16.5 5t-4.5 15v45q0 18 15 18h78q28 120 109 188t196 68q68 0 126 -25t98 -70q3 -3 3 -7q0 -6 -9 -13 l-74 -56q-9 -7 -19 -7q-6 0 -9 4q-23 24 -47 38t-55 14q-111 0 -142 -133h153q7 0 11 -4.5t4 -11.5v-45q0 -12 -6.5 -17t-20.5 -5h-152q-1 -13 -1 -40q0 -17 2 -45h163q7 0 11 -4.5t4 -11.5v-44q0 -12 -6.5 -17t-20.5 -5h-138q17 -65 55 -96.5t91 -31.5q33 0 64.5 16 t52.5 38q5 7 12 7q4 0 8 -4l61 -65q6 -7 8 -11z" />
<glyph unicode="&#x2116;" horiz-adv-x="1136" d="M676 742q13 0 13 -15v-711q0 -7 -5.5 -11.5t-13.5 -4.5h-101q-9 0 -14 2t-11 10l-319 448q-4 5 -7.5 4t-3.5 -6v-440v-3q0 -8 -4.5 -11.5t-15.5 -3.5h-104q-20 0 -20 17v706q0 19 18 19h121q12 0 17 -2.5t12 -12.5l294 -419q6 -8 10 -8q5 0 5 11v413q0 18 18 18h111z M1058.5 703.5q46.5 -48.5 46.5 -125.5q0 -75 -46.5 -122.5t-122.5 -47.5t-122 47.5t-46 122.5q0 51 21.5 90.5t60 61.5t86.5 22q76 0 122.5 -48.5zM870 581q0 -107 66 -107q67 0 67 107q0 105 -67 105q-66 0 -66 -105z" />
<glyph unicode="&#x2122;" horiz-adv-x="1008" d="M21 731q0 11 12 11h359q12 0 12 -11v-59q0 -9 -11 -9h-117q-7 0 -7 -6v-367q0 -12 -10 -12h-90q-9 0 -9 11v366q0 8 -7 8h-120q-12 0 -12 9v59zM468.5 282q-3.5 4 -3.5 10v438q0 12 10 12h130q7 0 10 -2t5 -8l94 -261q4 -11 9 0l90 256q3 15 14 15h134q9 0 9 -11v-438 q0 -8 -3.5 -11.5t-11.5 -3.5h-81q-7 0 -10 3t-3 10v311q0 4 -2.5 3.5t-3.5 -4.5l-109 -313q-3 -10 -13 -10h-52q-11 0 -14 10l-108 309q-1 5 -3.5 4.5t-2.5 -5.5v-307q0 -6 -2 -8.5t-9 -2.5h-64q-6 0 -9.5 4z" />
<glyph unicode="&#x25fc;" horiz-adv-x="530" d="M0 530h530v-530h-530v530z" />
<glyph horiz-adv-x="265" d="M214 618q0 -13 -6.5 -18.5t-20.5 -5.5h-108q-12 0 -17 5t-5 17v107q0 19 16 19h125q16 0 16 -18v-106zM209 24q0 -13 -6 -18.5t-21 -5.5h-105q-12 0 -17 5t-5 16v490q0 19 17 19h122q15 0 15 -17v-489z" />
<glyph horiz-adv-x="484" d="M336.5 274q44.5 -30 69.5 -85t25 -127q0 -71 -25 -125t-69 -83.5t-101 -29.5t-101 29.5t-69 83t-25 124.5q0 72 25 127.5t69.5 85.5t100.5 30t100.5 -30zM299 -61q20 37 20 122q0 87 -20.5 126.5t-62.5 39.5q-41 0 -62 -39.5t-21 -126.5q0 -84 20.5 -121.5t62.5 -37.5 q43 0 63 37z" />
<glyph horiz-adv-x="367" d="M305 -93v-61q0 -11 -13 -11h-248q-12 0 -12 11v61q0 9 10 9h66q7 0 7 5v264q0 10 -9 7l-61 -19h-3q-11 0 -11 12v42q0 7 2 9.5t8 5.5l105 52q15 8 26 8h43q4 0 7 -3.5t3 -8.5v-368q0 -6 6 -6h62q12 0 12 -9z" />
<glyph horiz-adv-x="452" d="M187 37q60 52 79 77t19 52q0 28 -20 45t-50 17q-27 0 -49.5 -15.5t-42.5 -50.5q-2 -5 -8 -5q-4 0 -9 3l-56 28q-7 4 -7 12q0 5 3 9q61 99 175 99q77 0 124 -38t47 -104q0 -38 -20.5 -70.5t-70.5 -71.5l-116 -91q-10 -7 3 -7h196q12 0 12 -10v-70q0 -11 -13 -11h-327 q-8 0 -11.5 3t-3.5 10v49q0 5 5.5 12t23.5 22z" />
<glyph horiz-adv-x="467" d="M66 232q0 4 3 8q25 30 69 47.5t94 17.5q81 0 128.5 -33.5t47.5 -88.5q0 -31 -19.5 -58t-54.5 -38q-8 -3 -8 -6t7 -5q40 -13 64.5 -42t24.5 -67q0 -68 -49.5 -104.5t-148.5 -36.5q-54 0 -101 21t-73 57q-3 5 -3 8q0 6 7 10l49 35q9 7 14 0q29 -30 54 -42t60 -12 q39 0 61 17t22 45q0 31 -25 49t-62 19l-54 1q-11 0 -11 9v59q0 6 11 9l43 2q37 1 60.5 18.5t23.5 44.5q0 23 -19.5 38.5t-49.5 15.5q-29 0 -53 -11.5t-49 -35.5q-4 -4 -7 -4t-7 4l-46 43q-3 3 -3 6z" />
<glyph horiz-adv-x="483" d="M260.5 300q4.5 2 14.5 2h79q10 0 10 -12v-263q0 -7 6 -7h52q12 0 12 -10v-54q0 -11 -13 -11h-50q-7 0 -7 -7v-89q0 -14 -17 -14h-81q-14 0 -14 13v91q0 6 -7 6h-189q-13 0 -13 11v53q0 6 4.5 13t11.5 17l190 251q7 8 11.5 10zM247 20q6 0 6 4v157q0 9 -2 9t-7 -7 l-112 -155q-6 -8 4 -8h111z" />
<glyph horiz-adv-x="470" d="M378 299q10 0 13 -3t2 -12l-3 -62q-1 -7 -3.5 -9t-10.5 -2h-198q-11 0 -11 -10l-8 -80v-2q0 -4 2.5 -5.5t6.5 -0.5q33 11 50 15.5t40 4.5q74 0 121 -39t47 -110q0 -74 -52 -116t-138 -42q-60 0 -109 20.5t-76 54.5q-5 7 -5 12q0 6 7 10l51 36q3 2 8 2t9 -4q26 -28 48 -41 t55 -13q44 0 68.5 21.5t24.5 56.5q0 33 -22.5 53.5t-61.5 20.5q-21 0 -38.5 -6t-42.5 -19q-6 -3 -8 -3q-3 0 -8 4l-58 31q-7 4 -7 11l1 9l18 202q0 9 4.5 12t17.5 3h266z" />
<glyph horiz-adv-x="473" d="M344 275q41 -27 52 -58l1 -5q0 -6 -7 -9l-68 -22q-1 -1 -3 -1q-4 0 -9 8q-14 19 -27.5 28.5t-35.5 9.5q-46 0 -71.5 -33.5t-25.5 -87.5q0 -9 1 -12t5 -3l8 2q29 12 48.5 18t46.5 6q72 0 117 -39t45 -100q0 -44 -24 -79t-66 -54.5t-93 -19.5q-91 0 -144 62t-53 167 q0 116 56 182.5t150 66.5q56 0 97 -27zM195.5 36.5q-22.5 -6.5 -35.5 -14.5q-5 -4 -7 -8t-2 -14q0 -43 23 -73t61 -30q33 0 55 21.5t22 54.5q0 32 -21.5 51t-54.5 19q-18 0 -40.5 -6.5z" />
<glyph horiz-adv-x="432" d="M385 302q9 0 13.5 -4t4.5 -10l-2 -34q-1 -6 -6 -16.5t-10 -18.5q-54 -83 -95 -191t-47 -175q0 -18 -13 -18h-99q-14 0 -11 15q22 78 59.5 161t105.5 192q3 3 3 6q0 5 -8 5h-213q-13 0 -12 12l7 67q0 9 15 9h308z" />
<glyph horiz-adv-x="469" d="M319 288q39 -17 61.5 -46.5t22.5 -66.5q0 -52 -60 -87q-5 -3 -5.5 -5.5t4.5 -5.5q45 -24 63.5 -50.5t18.5 -62.5q0 -64 -54 -101t-142 -37q-83 0 -133 32t-50 89q0 33 16.5 57t55.5 46q6 4 6.5 6t-5.5 6q-29 20 -45 42.5t-16 57.5q0 39 21 72t61 52t92 19q49 0 88 -17z M181.5 216.5q-20.5 -16.5 -20.5 -41.5q0 -39 43 -51l50 -15q12 -3 25.5 6t22.5 25t9 32q0 26 -21 43.5t-57 17.5q-31 0 -51.5 -16.5zM293.5 -86.5q21.5 15.5 21.5 42.5q0 20 -11.5 33t-39.5 22l-59 17q-3 1 -9 1q-20 0 -38.5 -19.5t-18.5 -46.5q0 -65 95 -65q38 0 59.5 15.5 z" />
<glyph horiz-adv-x="473" d="M117 -149q-41 27 -52 59q-1 2 -1 5q0 7 6 9l68 22h3q4 0 6.5 -3t3.5 -4q13 -19 27.5 -28.5t37.5 -9.5q45 0 69.5 33t24.5 88q0 6 -1 10t-4 4q-4 0 -8 -2q-28 -12 -47.5 -17.5t-46.5 -5.5q-72 0 -116.5 39t-44.5 100q0 44 24 78.5t65.5 54t92.5 19.5q91 0 143.5 -61.5 t52.5 -167.5q0 -76 -25.5 -132.5t-71.5 -86.5t-107 -30q-58 0 -99 27zM267 90q22 7 34 16q5 4 7 8t2 14q0 42 -22.5 72t-60.5 30q-32 0 -54 -21.5t-22 -54.5q0 -32 21 -51.5t53 -19.5q20 0 42 7z" />
<glyph horiz-adv-x="416" d="M302.5 439q44.5 -30 69.5 -85t25 -127q0 -71 -25 -125t-69 -83.5t-101 -29.5t-101 29.5t-69 83t-25 124.5q0 72 25 127.5t69.5 85.5t100.5 30t100.5 -30zM265 104q20 37 20 122q0 87 -20.5 126.5t-62.5 39.5q-41 0 -62 -39.5t-21 -126.5q0 -84 20.5 -121.5t62.5 -37.5 q43 0 63 37z" />
<glyph horiz-adv-x="299" d="M271 72v-61q0 -11 -13 -11h-248q-12 0 -12 11v61q0 9 10 9h66q7 0 7 5v264q0 10 -9 7l-61 -19h-3q-11 0 -11 12v42q0 7 2 9.5t8 5.5l105 52q15 8 26 8h43q4 0 7 -3.5t3 -8.5v-368q0 -6 6 -6h62q12 0 12 -9z" />
<glyph horiz-adv-x="384" d="M153 202q60 52 79 77t19 52q0 28 -20 45t-50 17q-27 0 -49.5 -15.5t-42.5 -50.5q-2 -5 -8 -5q-4 0 -9 3l-56 28q-7 4 -7 12q0 5 3 9q61 99 175 99q77 0 124 -38t47 -104q0 -38 -20.5 -70.5t-70.5 -71.5l-116 -91q-10 -7 3 -7h196q12 0 12 -10v-70q0 -11 -13 -11h-327 q-8 0 -11.5 3t-3.5 10v49q0 5 5.5 12t23.5 22z" />
<glyph horiz-adv-x="399" d="M32 397q0 4 3 8q25 30 69 47.5t94 17.5q81 0 128.5 -33.5t47.5 -88.5q0 -31 -19.5 -58t-54.5 -38q-8 -3 -8 -6t7 -5q40 -13 64.5 -42t24.5 -67q0 -68 -49.5 -104.5t-148.5 -36.5q-54 0 -101 21t-73 57q-3 5 -3 8q0 6 7 10l49 35q9 7 14 0q29 -30 54 -42t60 -12 q39 0 61 17t22 45q0 31 -25 49t-62 19l-54 1q-11 0 -11 9v59q0 6 11 9l43 2q37 1 60.5 18.5t23.5 44.5q0 23 -19.5 38.5t-49.5 15.5q-29 0 -53 -11.5t-49 -35.5q-4 -4 -7 -4t-7 4l-46 43q-3 3 -3 6z" />
<glyph horiz-adv-x="416" d="M227.5 465q4.5 2 14.5 2h79q10 0 10 -12v-263q0 -7 6 -7h52q12 0 12 -10v-54q0 -11 -13 -11h-50q-7 0 -7 -7v-89q0 -14 -17 -14h-81q-14 0 -14 13v91q0 6 -7 6h-189q-13 0 -13 11v53q0 6 4.5 13t11.5 17l190 251q7 8 11.5 10zM214 185q6 0 6 4v157q0 9 -2 9t-7 -7 l-112 -155q-6 -8 4 -8h111z" />
<glyph horiz-adv-x="401" d="M343 464q10 0 13 -3t2 -12l-3 -62q-1 -7 -3.5 -9t-10.5 -2h-198q-11 0 -11 -10l-8 -80v-2q0 -4 2.5 -5.5t6.5 -0.5q33 11 50 15.5t40 4.5q74 0 121 -39t47 -110q0 -74 -52 -116t-138 -42q-60 0 -109 20.5t-76 54.5q-5 7 -5 12q0 6 7 10l51 36q3 2 8 2t9 -4q26 -28 48 -41 t55 -13q44 0 68.5 21.5t24.5 56.5q0 33 -22.5 53.5t-61.5 20.5q-21 0 -38.5 -6t-42.5 -19q-6 -3 -8 -3q-3 0 -8 4l-58 31q-7 4 -7 11l1 9l18 202q0 9 4.5 12t17.5 3h266z" />
<glyph horiz-adv-x="404" d="M309 440q41 -27 52 -58l1 -5q0 -6 -7 -9l-68 -22q-1 -1 -3 -1q-4 0 -9 8q-14 19 -27.5 28.5t-35.5 9.5q-46 0 -71.5 -33.5t-25.5 -87.5q0 -9 1 -12t5 -3l8 2q29 12 48.5 18t46.5 6q72 0 117 -39t45 -100q0 -44 -24 -79t-66 -54.5t-93 -19.5q-91 0 -144 62t-53 167 q0 116 56 182.5t150 66.5q56 0 97 -27zM160.5 201.5q-22.5 -6.5 -35.5 -14.5q-5 -4 -7 -8t-2 -14q0 -43 23 -73t61 -30q33 0 55 21.5t22 54.5q0 32 -21.5 51t-54.5 19q-18 0 -40.5 -6.5z" />
<glyph horiz-adv-x="365" d="M352 467q9 0 13.5 -4t4.5 -10l-2 -34q-1 -6 -6 -16.5t-10 -18.5q-54 -83 -95 -191t-47 -175q0 -18 -13 -18h-99q-14 0 -11 15q22 78 59.5 161t105.5 192q3 3 3 6q0 5 -8 5h-213q-13 0 -12 12l7 67q0 9 15 9h308z" />
<glyph horiz-adv-x="401" d="M285 452q39 -17 61.5 -46.5t22.5 -66.5q0 -52 -60 -87q-5 -3 -5.5 -5.5t4.5 -5.5q45 -24 63.5 -50.5t18.5 -62.5q0 -64 -54 -101t-142 -37q-83 0 -133 32t-50 89q0 33 16.5 57t55.5 46q6 4 6.5 6t-5.5 6q-29 20 -45 42.5t-16 57.5q0 39 21 72t61 52t92 19q49 0 88 -17z M147.5 380.5q-20.5 -16.5 -20.5 -41.5q0 -39 43 -51l50 -15q12 -3 25.5 6t22.5 25t9 32q0 26 -21 43.5t-57 17.5q-31 0 -51.5 -16.5zM259.5 77.5q21.5 15.5 21.5 42.5q0 20 -11.5 33t-39.5 22l-59 17q-3 1 -9 1q-20 0 -38.5 -19.5t-18.5 -46.5q0 -65 95 -65q38 0 59.5 15.5z " />
<glyph horiz-adv-x="404" d="M82 16q-41 27 -52 59q-1 2 -1 5q0 7 6 9l68 22h3q4 0 6.5 -3t3.5 -4q13 -19 27.5 -28.5t37.5 -9.5q45 0 69.5 33t24.5 88q0 6 -1 10t-4 4q-4 0 -8 -2q-28 -12 -47.5 -17.5t-46.5 -5.5q-72 0 -116.5 39t-44.5 100q0 44 24 78.5t65.5 54t92.5 19.5q91 0 143.5 -61.5 t52.5 -167.5q0 -76 -25.5 -132.5t-71.5 -86.5t-107 -30q-58 0 -99 27zM232 255q22 7 34 16q5 4 7 8t2 14q0 42 -22.5 72t-60.5 30q-32 0 -54 -21.5t-22 -54.5q0 -32 21 -51.5t53 -19.5q20 0 42 7z" />
<glyph horiz-adv-x="416" d="M302.5 723q44.5 -30 69.5 -85t25 -127q0 -71 -25 -125t-69 -83.5t-101 -29.5t-101 29.5t-69 83t-25 124.5q0 72 25 127.5t69.5 85.5t100.5 30t100.5 -30zM265 388q20 37 20 122q0 87 -20.5 126.5t-62.5 39.5q-41 0 -62 -39.5t-21 -126.5q0 -84 20.5 -121.5t62.5 -37.5 q43 0 63 37z" />
<glyph horiz-adv-x="299" d="M271 348v-61q0 -11 -13 -11h-248q-12 0 -12 11v61q0 9 10 9h66q7 0 7 5v264q0 10 -9 7l-61 -19h-3q-11 0 -11 12v42q0 7 2 9.5t8 5.5l105 52q15 8 26 8h43q4 0 7 -3.5t3 -8.5v-368q0 -6 6 -6h62q12 0 12 -9z" />
<glyph horiz-adv-x="384" d="M153 481q60 52 79 77t19 52q0 28 -20 45t-50 17q-27 0 -49.5 -15.5t-42.5 -50.5q-2 -5 -8 -5q-4 0 -9 3l-56 28q-7 4 -7 12q0 5 3 9q61 99 175 99q77 0 124 -38t47 -104q0 -38 -20.5 -70.5t-70.5 -71.5l-116 -91q-11 -7 3 -7h196q12 0 12 -10v-70q0 -11 -13 -11h-327 q-8 0 -11.5 3t-3.5 10v49q0 5 5.5 12t23.5 22z" />
<glyph horiz-adv-x="399" d="M32 679q0 4 3 8q25 30 69 47.5t94 17.5q81 0 128.5 -33.5t47.5 -88.5q0 -31 -19.5 -58t-54.5 -38q-8 -3 -8 -6t7 -5q40 -13 64.5 -42t24.5 -67q0 -68 -49.5 -104.5t-148.5 -36.5q-54 0 -101 21t-73 57q-3 5 -3 8q0 6 7 10l49 35q9 7 14 0q29 -30 54 -42t60 -12 q39 0 61 17t22 45q0 31 -25 49t-62 19l-54 1q-11 0 -11 9v59q0 6 11 9l43 2q37 1 60.5 18.5t23.5 44.5q0 23 -19.5 38.5t-49.5 15.5q-29 0 -53 -11.5t-49 -35.5q-4 -4 -7 -4t-7 4l-46 43q-3 3 -3 6z" />
<glyph horiz-adv-x="416" d="M227.5 741q4.5 2 14.5 2h79q10 0 10 -12v-263q0 -7 6 -7h52q12 0 12 -10v-54q0 -11 -13 -11h-50q-7 0 -7 -7v-89q0 -14 -17 -14h-81q-14 0 -14 13v91q0 6 -7 6h-189q-13 0 -13 11v53q0 6 4.5 13t11.5 17l190 251q7 8 11.5 10zM214 461q6 0 6 4v157q0 9 -2 9t-7 -7 l-112 -155q-6 -8 4 -8h111z" />
<glyph horiz-adv-x="401" d="M343 743q10 0 13 -3t2 -12l-3 -62q-1 -7 -3.5 -9t-10.5 -2h-198q-11 0 -11 -10l-8 -80v-2q0 -4 2.5 -5.5t6.5 -0.5q33 11 50 15.5t40 4.5q74 0 121 -39t47 -110q0 -74 -52 -116t-138 -42q-60 0 -109 20.5t-76 54.5q-5 7 -5 12q0 6 7 10l51 36q3 2 8 2t9 -4q26 -28 48 -41 t55 -13q44 0 68.5 21.5t24.5 56.5q0 33 -22.5 53.5t-61.5 20.5q-21 0 -38.5 -6t-42.5 -19q-6 -3 -8 -3q-3 0 -8 4l-58 31q-7 4 -7 11l1 9l18 202q0 9 4.5 12t17.5 3h266z" />
<glyph horiz-adv-x="404" d="M309 725q41 -27 52 -58l1 -5q0 -6 -7 -9l-68 -22q-1 -1 -3 -1q-4 0 -9 8q-14 19 -27.5 28.5t-35.5 9.5q-46 0 -71.5 -33.5t-25.5 -87.5q0 -9 1 -12t5 -3l8 2q29 12 48.5 18t46.5 6q72 0 117 -39t45 -100q0 -44 -24 -79t-66 -54.5t-93 -19.5q-91 0 -144 62t-53 167 q0 116 56 182.5t150 66.5q56 0 97 -27zM160.5 486.5q-22.5 -6.5 -35.5 -14.5q-5 -4 -7 -8t-2 -14q0 -43 23 -73t61 -30q33 0 55 21.5t22 54.5q0 32 -21.5 51t-54.5 19q-18 0 -40.5 -6.5z" />
<glyph horiz-adv-x="365" d="M352 742q9 0 13.5 -4t4.5 -10l-2 -34q-1 -6 -6 -16.5t-10 -18.5q-54 -83 -95 -191t-47 -175q0 -18 -13 -18h-99q-14 0 -11 15q22 78 59.5 161t105.5 192q3 3 3 6q0 5 -8 5h-213q-13 0 -12 12l7 67q0 9 15 9h308z" />
<glyph horiz-adv-x="401" d="M285 735q39 -17 61.5 -46.5t22.5 -66.5q0 -52 -60 -87q-5 -3 -5.5 -5.5t4.5 -5.5q45 -24 63.5 -50.5t18.5 -62.5q0 -64 -54 -101t-142 -37q-83 0 -133 32t-50 89q0 33 16.5 57t55.5 46q6 4 6.5 6t-5.5 6q-29 20 -45 42.5t-16 57.5q0 39 21 72t61 52t92 19q49 0 88 -17z M147.5 663.5q-20.5 -16.5 -20.5 -41.5q0 -39 43 -51l50 -15q12 -3 25.5 6t22.5 25t9 32q0 26 -21 43.5t-57 17.5q-31 0 -51.5 -16.5zM259.5 360.5q21.5 15.5 21.5 42.5q0 20 -11.5 33t-39.5 22l-59 17q-3 1 -9 1q-20 0 -38.5 -19.5t-18.5 -46.5q0 -65 95 -65q38 0 59.5 15.5 z" />
<glyph horiz-adv-x="404" d="M82 301q-41 27 -52 59q-1 2 -1 5q0 7 6 9l68 22h3q4 0 6.5 -3t3.5 -4q13 -19 27.5 -28.5t37.5 -9.5q45 0 69.5 33t24.5 88q0 6 -1 10t-4 4q-4 0 -8 -2q-28 -12 -47.5 -17.5t-46.5 -5.5q-72 0 -116.5 39t-44.5 100q0 44 24 78.5t65.5 54t92.5 19.5q91 0 143.5 -61.5 t52.5 -167.5q0 -76 -25.5 -132.5t-71.5 -86.5t-107 -30q-58 0 -99 27zM232 540q22 7 34 16q5 4 7 8t2 14q0 42 -22.5 72t-60.5 30q-32 0 -54 -21.5t-22 -54.5q0 -32 21 -51.5t53 -19.5q20 0 42 7z" />
<hkern u1="&#x28;" u2="j" k="-83" />
<hkern u1="[" u2="j" k="-84" />
<hkern u1="t" u2="q" k="14" />
<hkern u1="&#x7b;" u2="j" k="-82" />
<hkern u1="&#xbf;" u2="j" k="-76" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="48" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="T" k="115" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="48" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="V" k="98" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="W" k="112" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="Y,Yacute,Ydieresis" k="119" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="quoteright,quotedblright" k="74" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="quotedbl,quotesingle" k="100" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="t" k="27" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="v" k="55" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="w" k="45" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="y,yacute,ydieresis" k="38" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="S" k="7" />
<hkern g1="B" g2="T" k="23" />
<hkern g1="B" g2="V" k="20" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="38" />
<hkern g1="F" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="56" />
<hkern g1="F" g2="t" k="48" />
<hkern g1="F" g2="v" k="57" />
<hkern g1="F" g2="w" k="56" />
<hkern g1="F" g2="y,yacute,ydieresis" k="80" />
<hkern g1="F" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="103" />
<hkern g1="F" g2="AE" k="157" />
<hkern g1="F" g2="J" k="71" />
<hkern g1="F" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="94" />
<hkern g1="F" g2="f,uniFB01,uniFB02" k="60" />
<hkern g1="F" g2="g" k="85" />
<hkern g1="F" g2="m,n,ntilde" k="74" />
<hkern g1="F" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="91" />
<hkern g1="F" g2="comma,period" k="130" />
<hkern g1="F" g2="r" k="64" />
<hkern g1="F" g2="s" k="76" />
<hkern g1="F" g2="u,ugrave,uacute,ucircumflex,udieresis" k="45" />
<hkern g1="F" g2="x" k="85" />
<hkern g1="F" g2="z" k="85" />
<hkern g1="F" g2="p" k="81" />
<hkern g1="F" g2="q" k="77" />
<hkern g1="G" g2="Y,Yacute,Ydieresis" k="48" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="50" />
<hkern g1="K" g2="v" k="87" />
<hkern g1="K" g2="w" k="57" />
<hkern g1="K" g2="y,yacute,ydieresis" k="57" />
<hkern g1="K" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="23" />
<hkern g1="K" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="50" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="30" />
<hkern g1="K" g2="hyphen,endash,emdash" k="50" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="63" />
<hkern g1="L" g2="T" k="93" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="35" />
<hkern g1="L" g2="V" k="79" />
<hkern g1="L" g2="W" k="80" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="128" />
<hkern g1="L" g2="quoteright,quotedblright" k="157" />
<hkern g1="L" g2="quotedbl,quotesingle" k="170" />
<hkern g1="L" g2="v" k="56" />
<hkern g1="L" g2="w" k="35" />
<hkern g1="L" g2="y,yacute,ydieresis" k="38" />
<hkern g1="L" g2="hyphen,endash,emdash" k="49" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="46" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="48" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="W" k="48" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="74" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="48" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="AE" k="80" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period" k="49" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="71" />
<hkern g1="D,O,Q,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="20" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="87" />
<hkern g1="P" g2="AE" k="123" />
<hkern g1="P" g2="J" k="87" />
<hkern g1="P" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="38" />
<hkern g1="P" g2="comma,period" k="146" />
<hkern g1="P" g2="X" k="38" />
<hkern g1="R" g2="T" k="17" />
<hkern g1="R" g2="V" k="17" />
<hkern g1="R" g2="W" k="17" />
<hkern g1="R" g2="Y,Yacute,Ydieresis" k="32" />
<hkern g1="S" g2="Y,Yacute,Ydieresis" k="24" />
<hkern g1="S" g2="t" k="23" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="46" />
<hkern g1="T" g2="v" k="91" />
<hkern g1="T" g2="w" k="84" />
<hkern g1="T" g2="y,yacute,ydieresis" k="91" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="115" />
<hkern g1="T" g2="AE" k="143" />
<hkern g1="T" g2="J" k="80" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="106" />
<hkern g1="T" g2="m,n,ntilde" k="91" />
<hkern g1="T" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="115" />
<hkern g1="T" g2="comma,period" k="133" />
<hkern g1="T" g2="r" k="87" />
<hkern g1="T" g2="s" k="112" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="94" />
<hkern g1="T" g2="x" k="81" />
<hkern g1="T" g2="z" k="84" />
<hkern g1="T" g2="hyphen,endash,emdash" k="121" />
<hkern g1="T" g2="colon,semicolon" k="83" />
<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="48" />
<hkern g1="U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="AE" k="73" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="48" />
<hkern g1="V" g2="y,yacute,ydieresis" k="45" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="98" />
<hkern g1="V" g2="AE" k="153" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="64" />
<hkern g1="V" g2="g" k="74" />
<hkern g1="V" g2="m,n,ntilde" k="53" />
<hkern g1="V" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="78" />
<hkern g1="V" g2="comma,period" k="123" />
<hkern g1="V" g2="r" k="57" />
<hkern g1="V" g2="s" k="62" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="53" />
<hkern g1="V" g2="hyphen,endash,emdash" k="73" />
<hkern g1="V" g2="colon,semicolon" k="43" />
<hkern g1="W" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="48" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="112" />
<hkern g1="W" g2="AE" k="149" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="57" />
<hkern g1="W" g2="m,n,ntilde" k="43" />
<hkern g1="W" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="81" />
<hkern g1="W" g2="comma,period" k="106" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="50" />
<hkern g1="W" g2="hyphen,endash,emdash" k="56" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="71" />
<hkern g1="X" g2="y,yacute,ydieresis" k="71" />
<hkern g1="X" g2="hyphen,endash,emdash" k="59" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="74" />
<hkern g1="Y,Yacute,Ydieresis" g2="t" k="53" />
<hkern g1="Y,Yacute,Ydieresis" g2="v" k="69" />
<hkern g1="Y,Yacute,Ydieresis" g2="w" k="55" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="42" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="119" />
<hkern g1="Y,Yacute,Ydieresis" g2="AE" k="151" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="109" />
<hkern g1="Y,Yacute,Ydieresis" g2="g" k="119" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,ntilde" k="67" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="115" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period" k="147" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="103" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="81" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="71" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="76" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,endash,emdash" k="106" />
<hkern g1="Y,Yacute,Ydieresis" g2="colon,semicolon" k="60" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="27" />
<hkern g1="Z" g2="hyphen,endash,emdash" k="46" />
<hkern g1="C" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="27" />
<hkern g1="E" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="54" />
<hkern g1="E" g2="v" k="67" />
<hkern g1="E" g2="w" k="50" />
<hkern g1="E" g2="y,yacute,ydieresis" k="40" />
<hkern g1="E" g2="x" k="9" />
<hkern g1="f" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="20" />
<hkern g1="f" g2="parenright,question,bracketright,braceright" k="-59" />
<hkern g1="f" g2="comma,period" k="35" />
<hkern g1="f" g2="quoteright,quotedblright" k="-56" />
<hkern g1="f" g2="asterisk" k="-3" />
<hkern g1="f" g2="q" k="17" />
<hkern g1="k" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="42" />
<hkern g1="k" g2="q" k="41" />
<hkern g1="k" g2="hyphen,endash,emdash" k="53" />
<hkern g1="k" g2="s" k="17" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash" g2="comma,period" k="23" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash" g2="f,uniFB01,uniFB02" k="17" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash" g2="quotedbl,quotesingle" k="26" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash" g2="t" k="14" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash" g2="v" k="27" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash" g2="x" k="39" />
<hkern g1="r" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="17" />
<hkern g1="r" g2="comma,period" k="87" />
<hkern g1="r" g2="q" k="17" />
<hkern g1="r" g2="hyphen,endash,emdash" k="46" />
<hkern g1="r" g2="quotedbl,quotesingle" k="-10" />
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="7" />
<hkern g1="v" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="30" />
<hkern g1="v" g2="comma,period" k="70" />
<hkern g1="v" g2="q" k="30" />
<hkern g1="w" g2="comma,period" k="70" />
<hkern g1="x" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="42" />
<hkern g1="x" g2="q" k="39" />
<hkern g1="x" g2="hyphen,endash,emdash" k="53" />
<hkern g1="x" g2="f,uniFB01,uniFB02" k="7" />
<hkern g1="x" g2="t" k="36" />
<hkern g1="x" g2="y,yacute,ydieresis" k="29" />
<hkern g1="y,yacute,ydieresis" g2="comma,period" k="74" />
<hkern g1="y,yacute,ydieresis" g2="g" k="14" />
<hkern g1="b" g2="f,uniFB01,uniFB02" k="17" />
<hkern g1="b" g2="t" k="14" />
<hkern g1="b" g2="v" k="30" />
<hkern g1="b" g2="x" k="39" />
<hkern g1="e" g2="quotedbl,quotesingle" k="20" />
<hkern g1="e" g2="t" k="11" />
<hkern g1="e" g2="x" k="31" />
<hkern g1="j" g2="parenright,question,bracketright,braceright" k="-30" />
<hkern g1="p" g2="f,uniFB01,uniFB02" k="17" />
<hkern g1="p" g2="t" k="7" />
<hkern g1="p" g2="v" k="30" />
<hkern g1="p" g2="x" k="39" />
<hkern g1="t" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="17" />
<hkern g1="t" g2="quoteright,quotedblright" k="-23" />
<hkern g1="t" g2="quotedbl,quotesingle" k="-3" />
<hkern g1="g" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="21" />
<hkern g1="hyphen,endash,emdash" g2="T" k="121" />
<hkern g1="hyphen,endash,emdash" g2="V" k="73" />
<hkern g1="hyphen,endash,emdash" g2="W" k="56" />
<hkern g1="hyphen,endash,emdash" g2="X" k="59" />
<hkern g1="hyphen,endash,emdash" g2="Y,Yacute,Ydieresis" k="106" />
<hkern g1="hyphen,endash,emdash" g2="Z" k="46" />
<hkern g1="hyphen,endash,emdash" g2="x" k="53" />
<hkern g1="comma,period" g2="T" k="133" />
<hkern g1="comma,period" g2="V" k="123" />
<hkern g1="comma,period" g2="W" k="106" />
<hkern g1="comma,period" g2="Y,Yacute,Ydieresis" k="147" />
<hkern g1="comma,period" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,OE" k="49" />
<hkern g1="comma,period" g2="f,uniFB01,uniFB02" k="35" />
<hkern g1="comma,period" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="23" />
<hkern g1="comma,period" g2="v" k="70" />
<hkern g1="comma,period" g2="w" k="63" />
<hkern g1="comma,period" g2="y,yacute,ydieresis" k="46" />
<hkern g1="quoteleft,quotedblleft" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="87" />
<hkern g1="quoteright,quotedblright" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="63" />
<hkern g1="quoteright,quotedblright" g2="v" k="3" />
<hkern g1="quoteright,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="116" />
<hkern g1="quoteright,quotedblright" g2="r" k="9" />
<hkern g1="quoteright,quotedblright" g2="s" k="49" />
<hkern g1="quotedbl,quotesingle" g2="c,d,e,o,ccedilla,egrave,eacute,ecircumflex,edieresis,ograve,oacute,ocircumflex,otilde,odieresis,oslash,oe" k="28" />
<hkern g1="quotedbl,quotesingle" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="100" />
<hkern g1="quotedbl,quotesingle" g2="r" k="3" />
<hkern g1="quotedbl,quotesingle" g2="s" k="35" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 115 KiB

View File

@ -11,7 +11,7 @@ const Container = styled.div`
line-height: 1.5; line-height: 1.5;
color: ${colors.base.secondary}; color: ${colors.base.secondary};
${typography.bold} ${typography.medium}
display: flex; display: flex;
flex-direction: row; flex-direction: row;

View File

@ -1,6 +1,9 @@
import styled from 'styled-components'; import styled from 'styled-components';
import { Baseline } from '../../shared/composers'; import { Baseline } from '../../shared/composers';
import { createSimulation, updateSimulation } from './graph-simulation'; import {
createSimulation//,
//updateSimulation
} from './graph-simulation';
import Constants from './constants'; import Constants from './constants';
import GraphNode from './graph-node'; import GraphNode from './graph-node';
import GraphLink from './graph-link'; import GraphLink from './graph-link';
@ -50,7 +53,7 @@ class TopologyGraph extends React.Component {
this.setState(simulationData); this.setState(simulationData);
} }
componentWillReceiveProps(nextProps) { /*componentWillReceiveProps(nextProps) {
// either, we'll have more services // either, we'll have more services
// or, we'll have less services // or, we'll have less services
// or, data of services had changed => // or, data of services had changed =>
@ -100,7 +103,7 @@ class TopologyGraph extends React.Component {
this.setState(nextSimulationData); this.setState(nextSimulationData);
} }
} }*/
getSvgSize() { getSvgSize() {
return document.getElementById('topology-svg') ? return document.getElementById('topology-svg') ?

View File

@ -6,7 +6,6 @@ import { unitcalc, remcalc } from '../functions';
import { import {
libreFranklin, libreFranklin,
bold,
semibold, semibold,
medium, medium,
normal normal
@ -128,7 +127,6 @@ export const paperEffect = css`
export const typography = { export const typography = {
libreFranklin, libreFranklin,
bold,
semibold, semibold,
medium, medium,
normal normal

View File

@ -13,10 +13,6 @@ export const libreFranklin = `
sans-serif; sans-serif;
`; `;
export const bold = css`
font-weight: 700;
`;
export const semibold = css` export const semibold = css`
font-weight: 600; font-weight: 600;
`; `;