mirror of
https://github.com/BookStackApp/BookStack.git
synced 2026-02-09 03:09:38 +03:00
Compare commits
113 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e86901ca20 | ||
|
|
bdfa61c8b2 | ||
|
|
4e8722661f | ||
|
|
9dc1b35e82 | ||
|
|
2dc1180a41 | ||
|
|
8b36ca95a3 | ||
|
|
2cc36787f5 | ||
|
|
448ac61b48 | ||
|
|
8933179017 | ||
|
|
792e786880 | ||
|
|
753f6394f7 | ||
|
|
0a8030306e | ||
|
|
b1faf65934 | ||
|
|
09f478bd74 | ||
|
|
d6bad01130 | ||
|
|
a33deed26b | ||
|
|
2e7345f4f0 | ||
|
|
1a7de4c2d6 | ||
|
|
66ba773367 | ||
|
|
afc3583be8 | ||
|
|
cbff2c6035 | ||
|
|
8e614ecb6e | ||
|
|
d099885fd1 | ||
|
|
2bb8c3d914 | ||
|
|
4caa61fe96 | ||
|
|
c5960f9b6a | ||
|
|
412eed19c3 | ||
|
|
e9b596d3bc | ||
|
|
a0497feddd | ||
|
|
789693bde9 | ||
|
|
8b109bac13 | ||
|
|
097d9c9f3c | ||
|
|
e7d8a041a8 | ||
|
|
dc2978824e | ||
|
|
e1994ef2cf | ||
|
|
efb49019d4 | ||
|
|
ef874712bb | ||
|
|
26965fa08f | ||
|
|
1fe933e4ea | ||
|
|
491f73e0cd | ||
|
|
724b4b5a70 | ||
|
|
1778a56146 | ||
|
|
4656c12f6d | ||
|
|
a06321675a | ||
|
|
dbe11c1360 | ||
|
|
75ecf1c44d | ||
|
|
5283919d24 | ||
|
|
ced8c8e497 | ||
|
|
bf7852ce85 | ||
|
|
30214fde74 | ||
|
|
e9c213f803 | ||
|
|
9f11e045a5 | ||
|
|
93ebdf724b | ||
|
|
59ce228c2e | ||
|
|
744865fcb2 | ||
|
|
7f8c8b448d | ||
|
|
1d6137f7e2 | ||
|
|
66c56e9d02 | ||
|
|
e744d4c82c | ||
|
|
0774ecc89c | ||
|
|
5e7a4c7fb5 | ||
|
|
76eaf64f94 | ||
|
|
80865b30a5 | ||
|
|
8e6248f57f | ||
|
|
268db6b1d0 | ||
|
|
479dd80a8c | ||
|
|
069431db72 | ||
|
|
bc2b310638 | ||
|
|
33bf20cfc8 | ||
|
|
e3bdc391cd | ||
|
|
5681f4dd69 | ||
|
|
38d822e04c | ||
|
|
8e274a5a84 | ||
|
|
985d2f1c2c | ||
|
|
7f5872372d | ||
|
|
201f788806 | ||
|
|
a14b5c33fd | ||
|
|
473261be35 | ||
|
|
a54be85185 | ||
|
|
a67c53826d | ||
|
|
14b131e850 | ||
|
|
54e3122540 | ||
|
|
d339ab1125 | ||
|
|
3ab09ef708 | ||
|
|
c86a122d80 | ||
|
|
3a58e37838 | ||
|
|
6bd49bcd4b | ||
|
|
61577cf6bf | ||
|
|
b4dec2a99c | ||
|
|
fe0b122aca | ||
|
|
8eb2960950 | ||
|
|
c2369a740d | ||
|
|
bab6fd1f2f | ||
|
|
86fbc9a936 | ||
|
|
4d9726dbdd | ||
|
|
4442a2e6d1 | ||
|
|
293be7093c | ||
|
|
9b55a52b85 | ||
|
|
db1d10e80f | ||
|
|
354912a1df | ||
|
|
eacff3a9f0 | ||
|
|
990acbb9ac | ||
|
|
17d4533e45 | ||
|
|
d6c00a85ad | ||
|
|
1be576966f | ||
|
|
b97e792c5f | ||
|
|
e0279f93f9 | ||
|
|
9b83c57316 | ||
|
|
5d73d17c74 | ||
|
|
d32460070f | ||
|
|
105500e506 | ||
|
|
8296782149 | ||
|
|
8e8d582bc6 |
11
.env.example
11
.env.example
@@ -12,8 +12,17 @@ DB_PASSWORD=database_user_password
|
||||
# Cache and session
|
||||
CACHE_DRIVER=file
|
||||
SESSION_DRIVER=file
|
||||
# If using Memcached, comment the above and uncomment these
|
||||
#CACHE_DRIVER=memcached
|
||||
#SESSION_DRIVER=memcached
|
||||
QUEUE_DRIVER=sync
|
||||
|
||||
# Memcached settings
|
||||
# If using a UNIX socket path for the host, set the port to 0
|
||||
# This follows the following format: HOST:PORT:WEIGHT
|
||||
# For multiple servers separate with a comma
|
||||
MEMCACHED_SERVERS=127.0.0.1:11211:100
|
||||
|
||||
# Storage
|
||||
STORAGE_TYPE=local
|
||||
# Amazon S3 Config
|
||||
@@ -53,4 +62,4 @@ MAIL_HOST=localhost
|
||||
MAIL_PORT=1025
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
MAIL_ENCRYPTION=null
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,7 +7,6 @@ Homestead.yaml
|
||||
/public/plugins
|
||||
/public/css/*.map
|
||||
/public/js/*.map
|
||||
/public/uploads
|
||||
/public/bower
|
||||
/storage/images
|
||||
_ide_helper.php
|
||||
|
||||
@@ -15,15 +15,11 @@ class Activity extends Model
|
||||
|
||||
/**
|
||||
* Get the entity for this activity.
|
||||
* @return bool
|
||||
*/
|
||||
public function entity()
|
||||
{
|
||||
if ($this->entity_id) {
|
||||
return $this->morphTo('entity')->first();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
if ($this->entity_type === '') $this->entity_type = null;
|
||||
return $this->morphTo('entity');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
<?php
|
||||
<?php namespace BookStack;
|
||||
|
||||
namespace BookStack;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
abstract class Entity extends Model
|
||||
abstract class Entity extends Ownable
|
||||
{
|
||||
|
||||
use Ownable;
|
||||
|
||||
/**
|
||||
* Compares this entity to another given entity.
|
||||
* Matches by comparing class and id.
|
||||
@@ -53,13 +48,31 @@ abstract class Entity extends Model
|
||||
|
||||
/**
|
||||
* Get View objects for this entity.
|
||||
* @return mixed
|
||||
*/
|
||||
public function views()
|
||||
{
|
||||
return $this->morphMany('BookStack\View', 'viewable');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get this entities restrictions.
|
||||
*/
|
||||
public function restrictions()
|
||||
{
|
||||
return $this->morphMany('BookStack\Restriction', 'restrictable');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this entity has a specific restriction set against it.
|
||||
* @param $role_id
|
||||
* @param $action
|
||||
* @return bool
|
||||
*/
|
||||
public function hasRestriction($role_id, $action)
|
||||
{
|
||||
return $this->restrictions->where('role_id', $role_id)->where('action', $action)->count() > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows checking of the exact class, Used to check entity type.
|
||||
* Cleaner method for is_a.
|
||||
@@ -72,23 +85,14 @@ abstract class Entity extends Model
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the class name.
|
||||
* @return string
|
||||
*/
|
||||
public static function getClassName()
|
||||
{
|
||||
return strtolower(array_slice(explode('\\', static::class), -1, 1)[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
*Gets a limited-length version of the entities name.
|
||||
* Gets a limited-length version of the entities name.
|
||||
* @param int $length
|
||||
* @return string
|
||||
*/
|
||||
public function getShortName($length = 25)
|
||||
{
|
||||
if(strlen($this->name) <= $length) return $this->name;
|
||||
return substr($this->name, 0, $length-3) . '...';
|
||||
if (strlen($this->name) <= $length) return $this->name;
|
||||
return substr($this->name, 0, $length - 3) . '...';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -98,27 +102,48 @@ abstract class Entity extends Model
|
||||
* @param string[] array $wheres
|
||||
* @return mixed
|
||||
*/
|
||||
public static function fullTextSearch($fieldsToSearch, $terms, $wheres = [])
|
||||
public static function fullTextSearchQuery($fieldsToSearch, $terms, $wheres = [])
|
||||
{
|
||||
$termString = '';
|
||||
foreach ($terms as $term) {
|
||||
$termString .= htmlentities($term) . '* ';
|
||||
$exactTerms = [];
|
||||
foreach ($terms as $key => $term) {
|
||||
$term = htmlentities($term, ENT_QUOTES);
|
||||
$term = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $term);
|
||||
if (preg_match('/\s/', $term)) {
|
||||
$exactTerms[] = '%' . $term . '%';
|
||||
$term = '"' . $term . '"';
|
||||
} else {
|
||||
$term = '' . $term . '*';
|
||||
}
|
||||
if ($term !== '*') $terms[$key] = $term;
|
||||
}
|
||||
$termString = implode(' ', $terms);
|
||||
$fields = implode(',', $fieldsToSearch);
|
||||
$termStringEscaped = \DB::connection()->getPdo()->quote($termString);
|
||||
$search = static::addSelect(\DB::raw('*, MATCH(name) AGAINST('.$termStringEscaped.' IN BOOLEAN MODE) AS title_relevance'));
|
||||
$search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termStringEscaped]);
|
||||
$search = static::selectRaw('*, MATCH(name) AGAINST(? IN BOOLEAN MODE) AS title_relevance', [$termString]);
|
||||
$search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termString]);
|
||||
|
||||
// Ensure at least one exact term matches if in search
|
||||
if (count($exactTerms) > 0) {
|
||||
$search = $search->where(function ($query) use ($exactTerms, $fieldsToSearch) {
|
||||
foreach ($exactTerms as $exactTerm) {
|
||||
foreach ($fieldsToSearch as $field) {
|
||||
$query->orWhere($field, 'like', $exactTerm);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add additional where terms
|
||||
foreach ($wheres as $whereTerm) {
|
||||
$search->where($whereTerm[0], $whereTerm[1], $whereTerm[2]);
|
||||
}
|
||||
|
||||
// Load in relations
|
||||
if (!static::isA('book')) $search = $search->with('book');
|
||||
if (static::isA('page')) $search = $search->with('chapter');
|
||||
if (static::isA('page')) {
|
||||
$search = $search->with('book', 'chapter', 'createdBy', 'updatedBy');
|
||||
} else if (static::isA('chapter')) {
|
||||
$search = $search->with('book');
|
||||
}
|
||||
|
||||
return $search->orderBy('title_relevance', 'desc')->get();
|
||||
return $search->orderBy('title_relevance', 'desc');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
4
app/Exceptions/AuthException.php
Normal file
4
app/Exceptions/AuthException.php
Normal file
@@ -0,0 +1,4 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
class AuthException extends PrettyException {}
|
||||
@@ -1,7 +1,4 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
class ConfirmationEmailException extends NotifyException
|
||||
{
|
||||
|
||||
}
|
||||
class ConfirmationEmailException extends NotifyException {}
|
||||
@@ -5,6 +5,7 @@ namespace BookStack\Exceptions;
|
||||
use Exception;
|
||||
use Illuminate\Contracts\Validation\ValidationException;
|
||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||
use PhpSpec\Exception\Example\ErrorException;
|
||||
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
@@ -38,17 +39,27 @@ class Handler extends ExceptionHandler
|
||||
/**
|
||||
* Render an exception into an HTTP response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Exception $e
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Exception $e
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function render($request, Exception $e)
|
||||
{
|
||||
if($e instanceof NotifyException) {
|
||||
// Handle notify exceptions which will redirect to the
|
||||
// specified location then show a notification message.
|
||||
if ($e instanceof NotifyException) {
|
||||
\Session::flash('error', $e->message);
|
||||
return response()->redirectTo($e->redirectLocation);
|
||||
}
|
||||
|
||||
// Handle pretty exceptions which will show a friendly application-fitting page
|
||||
// Which will include the basic message to point the user roughly to the cause.
|
||||
if (($e instanceof PrettyException || $e->getPrevious() instanceof PrettyException) && !config('app.debug')) {
|
||||
$message = ($e instanceof PrettyException) ? $e->getMessage() : $e->getPrevious()->getMessage();
|
||||
$code = ($e->getCode() === 0) ? 500 : $e->getCode();
|
||||
return response()->view('errors/' . $code, ['message' => $message], $code);
|
||||
}
|
||||
|
||||
return parent::render($request, $e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
use Exception;
|
||||
|
||||
class ImageUploadException extends Exception {}
|
||||
class ImageUploadException extends PrettyException {}
|
||||
@@ -1,9 +1,3 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
use Exception;
|
||||
|
||||
class LdapException extends Exception
|
||||
{
|
||||
|
||||
}
|
||||
class LdapException extends PrettyException {}
|
||||
14
app/Exceptions/NotFoundException.php
Normal file
14
app/Exceptions/NotFoundException.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
class NotFoundException extends PrettyException {
|
||||
|
||||
/**
|
||||
* NotFoundException constructor.
|
||||
* @param string $message
|
||||
*/
|
||||
public function __construct($message = 'Item not found')
|
||||
{
|
||||
parent::__construct($message, 404);
|
||||
}
|
||||
}
|
||||
6
app/Exceptions/PermissionsException.php
Normal file
6
app/Exceptions/PermissionsException.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
use Exception;
|
||||
|
||||
class PermissionsException extends Exception {}
|
||||
5
app/Exceptions/PrettyException.php
Normal file
5
app/Exceptions/PrettyException.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
class PrettyException extends Exception {}
|
||||
@@ -1,6 +1,4 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
class SocialDriverNotConfigured extends \Exception
|
||||
{
|
||||
}
|
||||
class SocialDriverNotConfigured extends PrettyException {}
|
||||
@@ -1,7 +1,4 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
class SocialSignInException extends NotifyException
|
||||
{
|
||||
|
||||
}
|
||||
class SocialSignInException extends NotifyException {}
|
||||
@@ -1,7 +1,4 @@
|
||||
<?php namespace BookStack\Exceptions;
|
||||
|
||||
|
||||
class UserRegistrationException extends NotifyException
|
||||
{
|
||||
|
||||
}
|
||||
class UserRegistrationException extends NotifyException {}
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace BookStack\Http\Controllers\Auth;
|
||||
|
||||
use BookStack\Exceptions\AuthException;
|
||||
use BookStack\Exceptions\PrettyException;
|
||||
use Illuminate\Contracts\Auth\Authenticatable;
|
||||
use Illuminate\Http\Request;
|
||||
use BookStack\Exceptions\SocialSignInException;
|
||||
@@ -41,9 +43,9 @@ class AuthController extends Controller
|
||||
|
||||
/**
|
||||
* Create a new authentication controller instance.
|
||||
* @param SocialAuthService $socialAuthService
|
||||
* @param SocialAuthService $socialAuthService
|
||||
* @param EmailConfirmationService $emailConfirmationService
|
||||
* @param UserRepo $userRepo
|
||||
* @param UserRepo $userRepo
|
||||
*/
|
||||
public function __construct(SocialAuthService $socialAuthService, EmailConfirmationService $emailConfirmationService, UserRepo $userRepo)
|
||||
{
|
||||
@@ -63,15 +65,15 @@ class AuthController extends Controller
|
||||
protected function validator(array $data)
|
||||
{
|
||||
return Validator::make($data, [
|
||||
'name' => 'required|max:255',
|
||||
'email' => 'required|email|max:255|unique:users',
|
||||
'name' => 'required|max:255',
|
||||
'email' => 'required|email|max:255|unique:users',
|
||||
'password' => 'required|min:6',
|
||||
]);
|
||||
}
|
||||
|
||||
protected function checkRegistrationAllowed()
|
||||
{
|
||||
if (!\Setting::get('registration-enabled')) {
|
||||
if (!setting('registration-enabled')) {
|
||||
throw new UserRegistrationException('Registrations are currently disabled.', '/login');
|
||||
}
|
||||
}
|
||||
@@ -112,9 +114,10 @@ class AuthController extends Controller
|
||||
/**
|
||||
* Overrides the action when a user is authenticated.
|
||||
* If the user authenticated but does not exist in the user table we create them.
|
||||
* @param Request $request
|
||||
* @param Request $request
|
||||
* @param Authenticatable $user
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
* @throws AuthException
|
||||
*/
|
||||
protected function authenticated(Request $request, Authenticatable $user)
|
||||
{
|
||||
@@ -132,6 +135,13 @@ class AuthController extends Controller
|
||||
}
|
||||
|
||||
if (!$user->exists) {
|
||||
|
||||
// Check for users with same email already
|
||||
$alreadyUser = $user->newQuery()->where('email', '=', $user->email)->count() > 0;
|
||||
if ($alreadyUser) {
|
||||
throw new AuthException('A user with the email ' . $user->email . ' already exists but with different credentials.');
|
||||
}
|
||||
|
||||
$user->save();
|
||||
$this->userRepo->attachDefaultRole($user);
|
||||
auth()->login($user);
|
||||
@@ -153,8 +163,8 @@ class AuthController extends Controller
|
||||
|
||||
// Create an array of the user data to create a new user instance
|
||||
$userData = [
|
||||
'name' => $socialUser->getName(),
|
||||
'email' => $socialUser->getEmail(),
|
||||
'name' => $socialUser->getName(),
|
||||
'email' => $socialUser->getEmail(),
|
||||
'password' => str_random(30)
|
||||
];
|
||||
return $this->registerUser($userData, $socialAccount);
|
||||
@@ -162,7 +172,7 @@ class AuthController extends Controller
|
||||
|
||||
/**
|
||||
* The registrations flow for all users.
|
||||
* @param array $userData
|
||||
* @param array $userData
|
||||
* @param bool|false|SocialAccount $socialAccount
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
* @throws UserRegistrationException
|
||||
@@ -170,8 +180,8 @@ class AuthController extends Controller
|
||||
*/
|
||||
protected function registerUser(array $userData, $socialAccount = false)
|
||||
{
|
||||
if (\Setting::get('registration-restrict')) {
|
||||
$restrictedEmailDomains = explode(',', str_replace(' ', '', \Setting::get('registration-restrict')));
|
||||
if (setting('registration-restrict')) {
|
||||
$restrictedEmailDomains = explode(',', str_replace(' ', '', setting('registration-restrict')));
|
||||
$userEmailDomain = $domain = substr(strrchr($userData['email'], "@"), 1);
|
||||
if (!in_array($userEmailDomain, $restrictedEmailDomains)) {
|
||||
throw new UserRegistrationException('That email domain does not have access to this application', '/register');
|
||||
@@ -183,15 +193,12 @@ class AuthController extends Controller
|
||||
$newUser->socialAccounts()->save($socialAccount);
|
||||
}
|
||||
|
||||
if (\Setting::get('registration-confirmation') || \Setting::get('registration-restrict')) {
|
||||
$newUser->email_confirmed = false;
|
||||
if (setting('registration-confirmation') || setting('registration-restrict')) {
|
||||
$newUser->save();
|
||||
$this->emailConfirmationService->sendConfirmation($newUser);
|
||||
return redirect('/register/confirm');
|
||||
}
|
||||
|
||||
$newUser->email_confirmed = true;
|
||||
|
||||
auth()->login($newUser);
|
||||
session()->flash('success', 'Thanks for signing up! You are now registered and signed in.');
|
||||
return redirect($this->redirectPath());
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace BookStack\Http\Controllers;
|
||||
<?php namespace BookStack\Http\Controllers;
|
||||
|
||||
use Activity;
|
||||
use BookStack\Repos\UserRepo;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Str;
|
||||
use BookStack\Http\Requests;
|
||||
use BookStack\Repos\BookRepo;
|
||||
use BookStack\Repos\ChapterRepo;
|
||||
@@ -19,24 +16,26 @@ class BookController extends Controller
|
||||
protected $bookRepo;
|
||||
protected $pageRepo;
|
||||
protected $chapterRepo;
|
||||
protected $userRepo;
|
||||
|
||||
/**
|
||||
* BookController constructor.
|
||||
* @param BookRepo $bookRepo
|
||||
* @param PageRepo $pageRepo
|
||||
* @param BookRepo $bookRepo
|
||||
* @param PageRepo $pageRepo
|
||||
* @param ChapterRepo $chapterRepo
|
||||
* @param UserRepo $userRepo
|
||||
*/
|
||||
public function __construct(BookRepo $bookRepo, PageRepo $pageRepo, ChapterRepo $chapterRepo)
|
||||
public function __construct(BookRepo $bookRepo, PageRepo $pageRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
|
||||
{
|
||||
$this->bookRepo = $bookRepo;
|
||||
$this->pageRepo = $pageRepo;
|
||||
$this->chapterRepo = $chapterRepo;
|
||||
$this->userRepo = $userRepo;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the book.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function index()
|
||||
@@ -50,12 +49,11 @@ class BookController extends Controller
|
||||
|
||||
/**
|
||||
* Show the form for creating a new book.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$this->checkPermission('book-create');
|
||||
$this->checkPermission('book-create-all');
|
||||
$this->setPageTitle('Create New Book');
|
||||
return view('books/create');
|
||||
}
|
||||
@@ -68,9 +66,9 @@ class BookController extends Controller
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$this->checkPermission('book-create');
|
||||
$this->checkPermission('book-create-all');
|
||||
$this->validate($request, [
|
||||
'name' => 'required|string|max:255',
|
||||
'name' => 'required|string|max:255',
|
||||
'description' => 'string|max:1000'
|
||||
]);
|
||||
$book = $this->bookRepo->newFromInput($request->all());
|
||||
@@ -84,7 +82,6 @@ class BookController extends Controller
|
||||
|
||||
/**
|
||||
* Display the specified book.
|
||||
*
|
||||
* @param $slug
|
||||
* @return Response
|
||||
*/
|
||||
@@ -99,31 +96,29 @@ class BookController extends Controller
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified book.
|
||||
*
|
||||
* @param $slug
|
||||
* @return Response
|
||||
*/
|
||||
public function edit($slug)
|
||||
{
|
||||
$this->checkPermission('book-update');
|
||||
$book = $this->bookRepo->getBySlug($slug);
|
||||
$this->checkOwnablePermission('book-update', $book);
|
||||
$this->setPageTitle('Edit Book ' . $book->getShortName());
|
||||
return view('books/edit', ['book' => $book, 'current' => $book]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified book in storage.
|
||||
*
|
||||
* @param Request $request
|
||||
* @param $slug
|
||||
* @return Response
|
||||
*/
|
||||
public function update(Request $request, $slug)
|
||||
{
|
||||
$this->checkPermission('book-update');
|
||||
$book = $this->bookRepo->getBySlug($slug);
|
||||
$this->checkOwnablePermission('book-update', $book);
|
||||
$this->validate($request, [
|
||||
'name' => 'required|string|max:255',
|
||||
'name' => 'required|string|max:255',
|
||||
'description' => 'string|max:1000'
|
||||
]);
|
||||
$book->fill($request->all());
|
||||
@@ -141,8 +136,8 @@ class BookController extends Controller
|
||||
*/
|
||||
public function showDelete($bookSlug)
|
||||
{
|
||||
$this->checkPermission('book-delete');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$this->checkOwnablePermission('book-delete', $book);
|
||||
$this->setPageTitle('Delete Book ' . $book->getShortName());
|
||||
return view('books/delete', ['book' => $book, 'current' => $book]);
|
||||
}
|
||||
@@ -154,10 +149,10 @@ class BookController extends Controller
|
||||
*/
|
||||
public function sort($bookSlug)
|
||||
{
|
||||
$this->checkPermission('book-update');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$bookChildren = $this->bookRepo->getChildren($book);
|
||||
$books = $this->bookRepo->getAll();
|
||||
$this->checkOwnablePermission('book-update', $book);
|
||||
$bookChildren = $this->bookRepo->getChildren($book, true);
|
||||
$books = $this->bookRepo->getAll(false);
|
||||
$this->setPageTitle('Sort Book ' . $book->getShortName());
|
||||
return view('books/sort', ['book' => $book, 'current' => $book, 'books' => $books, 'bookChildren' => $bookChildren]);
|
||||
}
|
||||
@@ -177,15 +172,14 @@ class BookController extends Controller
|
||||
|
||||
/**
|
||||
* Saves an array of sort mapping to pages and chapters.
|
||||
*
|
||||
* @param string $bookSlug
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
*/
|
||||
public function saveSort($bookSlug, Request $request)
|
||||
{
|
||||
$this->checkPermission('book-update');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$this->checkOwnablePermission('book-update', $book);
|
||||
|
||||
// Return if no map sent
|
||||
if (!$request->has('sort-tree')) {
|
||||
@@ -223,17 +217,48 @@ class BookController extends Controller
|
||||
|
||||
/**
|
||||
* Remove the specified book from storage.
|
||||
*
|
||||
* @param $bookSlug
|
||||
* @return Response
|
||||
*/
|
||||
public function destroy($bookSlug)
|
||||
{
|
||||
$this->checkPermission('book-delete');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$this->checkOwnablePermission('book-delete', $book);
|
||||
Activity::addMessage('book_delete', 0, $book->name);
|
||||
Activity::removeEntity($book);
|
||||
$this->bookRepo->destroyBySlug($bookSlug);
|
||||
return redirect('/books');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the Restrictions view.
|
||||
* @param $bookSlug
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function showRestrict($bookSlug)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$this->checkOwnablePermission('restrictions-manage', $book);
|
||||
$roles = $this->userRepo->getRestrictableRoles();
|
||||
return view('books/restrictions', [
|
||||
'book' => $book,
|
||||
'roles' => $roles
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the restrictions for this book.
|
||||
* @param $bookSlug
|
||||
* @param $bookSlug
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
*/
|
||||
public function restrict($bookSlug, Request $request)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$this->checkOwnablePermission('restrictions-manage', $book);
|
||||
$this->bookRepo->updateRestrictionsFromRequest($request, $book);
|
||||
session()->flash('success', 'Book Restrictions Updated');
|
||||
return redirect($book->getUrl());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace BookStack\Http\Controllers;
|
||||
<?php namespace BookStack\Http\Controllers;
|
||||
|
||||
use Activity;
|
||||
use BookStack\Repos\UserRepo;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use BookStack\Http\Requests;
|
||||
use BookStack\Http\Controllers\Controller;
|
||||
use BookStack\Repos\BookRepo;
|
||||
use BookStack\Repos\ChapterRepo;
|
||||
use Views;
|
||||
@@ -17,20 +13,22 @@ class ChapterController extends Controller
|
||||
|
||||
protected $bookRepo;
|
||||
protected $chapterRepo;
|
||||
protected $userRepo;
|
||||
|
||||
/**
|
||||
* ChapterController constructor.
|
||||
* @param $bookRepo
|
||||
* @param $chapterRepo
|
||||
* @param BookRepo $bookRepo
|
||||
* @param ChapterRepo $chapterRepo
|
||||
* @param UserRepo $userRepo
|
||||
*/
|
||||
public function __construct(BookRepo $bookRepo, ChapterRepo $chapterRepo)
|
||||
public function __construct(BookRepo $bookRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
|
||||
{
|
||||
$this->bookRepo = $bookRepo;
|
||||
$this->chapterRepo = $chapterRepo;
|
||||
$this->userRepo = $userRepo;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the form for creating a new chapter.
|
||||
* @param $bookSlug
|
||||
@@ -38,8 +36,8 @@ class ChapterController extends Controller
|
||||
*/
|
||||
public function create($bookSlug)
|
||||
{
|
||||
$this->checkPermission('chapter-create');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$this->checkOwnablePermission('chapter-create', $book);
|
||||
$this->setPageTitle('Create New Chapter');
|
||||
return view('chapters/create', ['book' => $book, 'current' => $book]);
|
||||
}
|
||||
@@ -52,12 +50,13 @@ class ChapterController extends Controller
|
||||
*/
|
||||
public function store($bookSlug, Request $request)
|
||||
{
|
||||
$this->checkPermission('chapter-create');
|
||||
$this->validate($request, [
|
||||
'name' => 'required|string|max:255'
|
||||
]);
|
||||
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$this->checkOwnablePermission('chapter-create', $book);
|
||||
|
||||
$chapter = $this->chapterRepo->newFromInput($request->all());
|
||||
$chapter->slug = $this->chapterRepo->findSuitableSlug($chapter->name, $book->id);
|
||||
$chapter->priority = $this->bookRepo->getNewPriority($book);
|
||||
@@ -81,7 +80,14 @@ class ChapterController extends Controller
|
||||
$sidebarTree = $this->bookRepo->getChildren($book);
|
||||
Views::add($chapter);
|
||||
$this->setPageTitle($chapter->getShortName());
|
||||
return view('chapters/show', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter, 'sidebarTree' => $sidebarTree]);
|
||||
$pages = $this->chapterRepo->getChildren($chapter);
|
||||
return view('chapters/show', [
|
||||
'book' => $book,
|
||||
'chapter' => $chapter,
|
||||
'current' => $chapter,
|
||||
'sidebarTree' => $sidebarTree,
|
||||
'pages' => $pages
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -92,9 +98,9 @@ class ChapterController extends Controller
|
||||
*/
|
||||
public function edit($bookSlug, $chapterSlug)
|
||||
{
|
||||
$this->checkPermission('chapter-update');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
||||
$this->checkOwnablePermission('chapter-update', $chapter);
|
||||
$this->setPageTitle('Edit Chapter' . $chapter->getShortName());
|
||||
return view('chapters/edit', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
|
||||
}
|
||||
@@ -108,9 +114,9 @@ class ChapterController extends Controller
|
||||
*/
|
||||
public function update(Request $request, $bookSlug, $chapterSlug)
|
||||
{
|
||||
$this->checkPermission('chapter-update');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
||||
$this->checkOwnablePermission('chapter-update', $chapter);
|
||||
$chapter->fill($request->all());
|
||||
$chapter->slug = $this->chapterRepo->findSuitableSlug($chapter->name, $book->id, $chapter->id);
|
||||
$chapter->updated_by = auth()->user()->id;
|
||||
@@ -127,9 +133,9 @@ class ChapterController extends Controller
|
||||
*/
|
||||
public function showDelete($bookSlug, $chapterSlug)
|
||||
{
|
||||
$this->checkPermission('chapter-delete');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
||||
$this->checkOwnablePermission('chapter-delete', $chapter);
|
||||
$this->setPageTitle('Delete Chapter' . $chapter->getShortName());
|
||||
return view('chapters/delete', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
|
||||
}
|
||||
@@ -142,11 +148,46 @@ class ChapterController extends Controller
|
||||
*/
|
||||
public function destroy($bookSlug, $chapterSlug)
|
||||
{
|
||||
$this->checkPermission('chapter-delete');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
||||
$this->checkOwnablePermission('chapter-delete', $chapter);
|
||||
Activity::addMessage('chapter_delete', $book->id, $chapter->name);
|
||||
$this->chapterRepo->destroy($chapter);
|
||||
return redirect($book->getUrl());
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the Restrictions view.
|
||||
* @param $bookSlug
|
||||
* @param $chapterSlug
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function showRestrict($bookSlug, $chapterSlug)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
||||
$this->checkOwnablePermission('restrictions-manage', $chapter);
|
||||
$roles = $this->userRepo->getRestrictableRoles();
|
||||
return view('chapters/restrictions', [
|
||||
'chapter' => $chapter,
|
||||
'roles' => $roles
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the restrictions for this chapter.
|
||||
* @param $bookSlug
|
||||
* @param $chapterSlug
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
*/
|
||||
public function restrict($bookSlug, $chapterSlug, Request $request)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
||||
$this->checkOwnablePermission('restrictions-manage', $chapter);
|
||||
$this->chapterRepo->updateRestrictionsFromRequest($request, $chapter);
|
||||
session()->flash('success', 'Chapter Restrictions Updated');
|
||||
return redirect($chapter->getUrl());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace BookStack\Http\Controllers;
|
||||
|
||||
use BookStack\Ownable;
|
||||
use HttpRequestException;
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Http\Exception\HttpResponseException;
|
||||
@@ -61,21 +62,19 @@ abstract class Controller extends BaseController
|
||||
}
|
||||
|
||||
/**
|
||||
* On a permission error redirect to home and display
|
||||
* On a permission error redirect to home and display.
|
||||
* the error as a notification.
|
||||
*/
|
||||
protected function showPermissionError()
|
||||
{
|
||||
Session::flash('error', trans('errors.permission'));
|
||||
throw new HttpResponseException(
|
||||
redirect('/')
|
||||
);
|
||||
$response = request()->wantsJson() ? response()->json(['error' => trans('errors.permissionJson')], 403) : redirect('/');
|
||||
throw new HttpResponseException($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for a permission.
|
||||
*
|
||||
* @param $permissionName
|
||||
* @param string $permissionName
|
||||
* @return bool|\Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
protected function checkPermission($permissionName)
|
||||
@@ -83,10 +82,21 @@ abstract class Controller extends BaseController
|
||||
if (!$this->currentUser || !$this->currentUser->can($permissionName)) {
|
||||
$this->showPermissionError();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the current user's permissions against an ownable item.
|
||||
* @param $permission
|
||||
* @param Ownable $ownable
|
||||
* @return bool
|
||||
*/
|
||||
protected function checkOwnablePermission($permission, Ownable $ownable)
|
||||
{
|
||||
if (userCan($permission, $ownable)) return true;
|
||||
return $this->showPermissionError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a user has a permission or bypass if the callback is true.
|
||||
* @param $permissionName
|
||||
|
||||
@@ -3,39 +3,44 @@
|
||||
namespace BookStack\Http\Controllers;
|
||||
|
||||
use Activity;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use BookStack\Repos\EntityRepo;
|
||||
use BookStack\Http\Requests;
|
||||
use BookStack\Repos\BookRepo;
|
||||
use Views;
|
||||
|
||||
class HomeController extends Controller
|
||||
{
|
||||
|
||||
protected $activityService;
|
||||
protected $bookRepo;
|
||||
protected $entityRepo;
|
||||
|
||||
/**
|
||||
* HomeController constructor.
|
||||
* @param BookRepo $bookRepo
|
||||
* @param EntityRepo $entityRepo
|
||||
*/
|
||||
public function __construct(BookRepo $bookRepo)
|
||||
public function __construct(EntityRepo $entityRepo)
|
||||
{
|
||||
$this->bookRepo = $bookRepo;
|
||||
$this->entityRepo = $entityRepo;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Display the homepage.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$activity = Activity::latest();
|
||||
$recents = $this->signedIn ? Views::getUserRecentlyViewed(10, 0) : $this->bookRepo->getLatest(10);
|
||||
return view('home', ['activity' => $activity, 'recents' => $recents]);
|
||||
$activity = Activity::latest(10);
|
||||
$draftPages = $this->signedIn ? $this->entityRepo->getUserDraftPages(6) : [];
|
||||
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
|
||||
$recents = $this->signedIn ? Views::getUserRecentlyViewed(12*$recentFactor, 0) : $this->entityRepo->getRecentlyCreatedBooks(10*$recentFactor);
|
||||
$recentlyCreatedPages = $this->entityRepo->getRecentlyCreatedPages(5);
|
||||
$recentlyUpdatedPages = $this->entityRepo->getRecentlyUpdatedPages(5);
|
||||
return view('home', [
|
||||
'activity' => $activity,
|
||||
'recents' => $recents,
|
||||
'recentlyCreatedPages' => $recentlyCreatedPages,
|
||||
'recentlyUpdatedPages' => $recentlyUpdatedPages,
|
||||
'draftPages' => $draftPages
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace BookStack\Http\Controllers;
|
||||
<?php namespace BookStack\Http\Controllers;
|
||||
|
||||
use BookStack\Exceptions\ImageUploadException;
|
||||
use BookStack\Repos\ImageRepo;
|
||||
use Illuminate\Filesystem\Filesystem as File;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Intervention\Image\Facades\Image as ImageTool;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use BookStack\Image;
|
||||
use BookStack\Repos\PageRepo;
|
||||
|
||||
@@ -20,8 +15,8 @@ class ImageController extends Controller
|
||||
|
||||
/**
|
||||
* ImageController constructor.
|
||||
* @param Image $image
|
||||
* @param File $file
|
||||
* @param Image $image
|
||||
* @param File $file
|
||||
* @param ImageRepo $imageRepo
|
||||
*/
|
||||
public function __construct(Image $image, File $file, ImageRepo $imageRepo)
|
||||
@@ -32,9 +27,9 @@ class ImageController extends Controller
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get all images for a specific type, Paginated
|
||||
* @param string $type
|
||||
* @param int $page
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
@@ -44,6 +39,24 @@ class ImageController extends Controller
|
||||
return response()->json($imgData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search through images within a particular type.
|
||||
* @param $type
|
||||
* @param int $page
|
||||
* @param Request $request
|
||||
* @return mixed
|
||||
*/
|
||||
public function searchByType($type, $page = 0, Request $request)
|
||||
{
|
||||
$this->validate($request, [
|
||||
'term' => 'required|string'
|
||||
]);
|
||||
|
||||
$searchTerm = $request->get('term');
|
||||
$imgData = $this->imageRepo->searchPaginatedByType($type, $page,24, $searchTerm);
|
||||
return response()->json($imgData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all images for a user.
|
||||
* @param int $page
|
||||
@@ -55,16 +68,36 @@ class ImageController extends Controller
|
||||
return response()->json($imgData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get gallery images with a specific filter such as book or page
|
||||
* @param $filter
|
||||
* @param int $page
|
||||
* @param Request $request
|
||||
*/
|
||||
public function getGalleryFiltered($filter, $page = 0, Request $request)
|
||||
{
|
||||
$this->validate($request, [
|
||||
'page_id' => 'required|integer'
|
||||
]);
|
||||
|
||||
$validFilters = collect(['page', 'book']);
|
||||
if (!$validFilters->contains($filter)) return response('Invalid filter', 500);
|
||||
|
||||
$pageId = $request->get('page_id');
|
||||
$imgData = $this->imageRepo->getGalleryFiltered($page, 24, strtolower($filter), $pageId);
|
||||
|
||||
return response()->json($imgData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles image uploads for use on pages.
|
||||
* @param string $type
|
||||
* @param string $type
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function uploadByType($type, Request $request)
|
||||
{
|
||||
$this->checkPermission('image-create');
|
||||
$this->checkPermission('image-create-all');
|
||||
$this->validate($request, [
|
||||
'file' => 'image|mimes:jpeg,gif,png'
|
||||
]);
|
||||
@@ -72,7 +105,8 @@ class ImageController extends Controller
|
||||
$imageUpload = $request->file('file');
|
||||
|
||||
try {
|
||||
$image = $this->imageRepo->saveNew($imageUpload, $type);
|
||||
$uploadedTo = $request->has('uploaded_to') ? $request->get('uploaded_to') : 0;
|
||||
$image = $this->imageRepo->saveNew($imageUpload, $type, $uploadedTo);
|
||||
} catch (ImageUploadException $e) {
|
||||
return response($e->getMessage(), 500);
|
||||
}
|
||||
@@ -90,7 +124,7 @@ class ImageController extends Controller
|
||||
*/
|
||||
public function getThumbnail($id, $width, $height, $crop)
|
||||
{
|
||||
$this->checkPermission('image-create');
|
||||
$this->checkPermission('image-create-all');
|
||||
$image = $this->imageRepo->getById($id);
|
||||
$thumbnailUrl = $this->imageRepo->getThumbnail($image, $width, $height, $crop == 'false');
|
||||
return response()->json(['url' => $thumbnailUrl]);
|
||||
@@ -98,33 +132,32 @@ class ImageController extends Controller
|
||||
|
||||
/**
|
||||
* Update image details
|
||||
* @param $imageId
|
||||
* @param integer $imageId
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function update($imageId, Request $request)
|
||||
{
|
||||
$this->checkPermission('image-update');
|
||||
$this->validate($request, [
|
||||
'name' => 'required|min:2|string'
|
||||
]);
|
||||
$image = $this->imageRepo->getById($imageId);
|
||||
$this->checkOwnablePermission('image-update', $image);
|
||||
$image = $this->imageRepo->updateImageDetails($image, $request->all());
|
||||
return response()->json($image);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Deletes an image and all thumbnail/image files
|
||||
* @param PageRepo $pageRepo
|
||||
* @param Request $request
|
||||
* @param int $id
|
||||
* @param Request $request
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function destroy(PageRepo $pageRepo, Request $request, $id)
|
||||
{
|
||||
$this->checkPermission('image-delete');
|
||||
$image = $this->imageRepo->getById($id);
|
||||
$this->checkOwnablePermission('image-delete', $image);
|
||||
|
||||
// Check if this image is used on any pages
|
||||
$isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true);
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace BookStack\Http\Controllers;
|
||||
<?php namespace BookStack\Http\Controllers;
|
||||
|
||||
use Activity;
|
||||
use BookStack\Exceptions\NotFoundException;
|
||||
use BookStack\Repos\UserRepo;
|
||||
use BookStack\Services\ExportService;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use BookStack\Http\Requests;
|
||||
use BookStack\Repos\BookRepo;
|
||||
use BookStack\Repos\ChapterRepo;
|
||||
use BookStack\Repos\PageRepo;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Views;
|
||||
|
||||
class PageController extends Controller
|
||||
@@ -20,26 +20,28 @@ class PageController extends Controller
|
||||
protected $bookRepo;
|
||||
protected $chapterRepo;
|
||||
protected $exportService;
|
||||
protected $userRepo;
|
||||
|
||||
/**
|
||||
* PageController constructor.
|
||||
* @param PageRepo $pageRepo
|
||||
* @param BookRepo $bookRepo
|
||||
* @param ChapterRepo $chapterRepo
|
||||
* @param PageRepo $pageRepo
|
||||
* @param BookRepo $bookRepo
|
||||
* @param ChapterRepo $chapterRepo
|
||||
* @param ExportService $exportService
|
||||
* @param UserRepo $userRepo
|
||||
*/
|
||||
public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService)
|
||||
public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService, UserRepo $userRepo)
|
||||
{
|
||||
$this->pageRepo = $pageRepo;
|
||||
$this->bookRepo = $bookRepo;
|
||||
$this->chapterRepo = $chapterRepo;
|
||||
$this->exportService = $exportService;
|
||||
$this->userRepo = $userRepo;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new page.
|
||||
*
|
||||
* @param $bookSlug
|
||||
* @param bool $chapterSlug
|
||||
* @return Response
|
||||
@@ -47,33 +49,60 @@ class PageController extends Controller
|
||||
*/
|
||||
public function create($bookSlug, $chapterSlug = false)
|
||||
{
|
||||
$this->checkPermission('page-create');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : false;
|
||||
$chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : null;
|
||||
$parent = $chapter ? $chapter : $book;
|
||||
$this->checkOwnablePermission('page-create', $parent);
|
||||
$this->setPageTitle('Create New Page');
|
||||
return view('pages/create', ['book' => $book, 'chapter' => $chapter]);
|
||||
|
||||
$draft = $this->pageRepo->getDraftPage($book, $chapter);
|
||||
return redirect($draft->getUrl());
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created page in storage.
|
||||
*
|
||||
* Show form to continue editing a draft page.
|
||||
* @param $bookSlug
|
||||
* @param $pageId
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function editDraft($bookSlug, $pageId)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$draft = $this->pageRepo->getById($pageId, true);
|
||||
$this->checkOwnablePermission('page-create', $draft);
|
||||
$this->setPageTitle('Edit Page Draft');
|
||||
|
||||
return view('pages/create', ['draft' => $draft, 'book' => $book]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a new page by changing a draft into a page.
|
||||
* @param Request $request
|
||||
* @param $bookSlug
|
||||
* @param string $bookSlug
|
||||
* @return Response
|
||||
*/
|
||||
public function store(Request $request, $bookSlug)
|
||||
public function store(Request $request, $bookSlug, $pageId)
|
||||
{
|
||||
$this->checkPermission('page-create');
|
||||
$this->validate($request, [
|
||||
'name' => 'required|string|max:255'
|
||||
'name' => 'required|string|max:255'
|
||||
]);
|
||||
|
||||
$input = $request->all();
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapterId = ($request->has('chapter') && $this->chapterRepo->idExists($request->get('chapter'))) ? $request->get('chapter') : null;
|
||||
$input['priority'] = $this->bookRepo->getNewPriority($book);
|
||||
|
||||
$page = $this->pageRepo->saveNew($input, $book, $chapterId);
|
||||
$draftPage = $this->pageRepo->getById($pageId, true);
|
||||
|
||||
$chapterId = $draftPage->chapter_id;
|
||||
$parent = $chapterId !== 0 ? $this->chapterRepo->getById($chapterId) : $book;
|
||||
$this->checkOwnablePermission('page-create', $parent);
|
||||
|
||||
if ($parent->isA('chapter')) {
|
||||
$input['priority'] = $this->chapterRepo->getNewPriority($parent);
|
||||
} else {
|
||||
$input['priority'] = $this->bookRepo->getNewPriority($parent);
|
||||
}
|
||||
|
||||
$page = $this->pageRepo->publishDraft($draftPage, $input);
|
||||
|
||||
Activity::add($page, 'page_create', $book->id);
|
||||
return redirect($page->getUrl());
|
||||
@@ -81,7 +110,8 @@ class PageController extends Controller
|
||||
|
||||
/**
|
||||
* Display the specified page.
|
||||
*
|
||||
* If the page is not found via the slug the
|
||||
* revisions are searched for a match.
|
||||
* @param $bookSlug
|
||||
* @param $pageSlug
|
||||
* @return Response
|
||||
@@ -89,32 +119,69 @@ class PageController extends Controller
|
||||
public function show($bookSlug, $pageSlug)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
|
||||
try {
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
} catch (NotFoundException $e) {
|
||||
$page = $this->pageRepo->findPageUsingOldSlug($pageSlug, $bookSlug);
|
||||
if ($page === null) abort(404);
|
||||
return redirect($page->getUrl());
|
||||
}
|
||||
|
||||
$sidebarTree = $this->bookRepo->getChildren($book);
|
||||
Views::add($page);
|
||||
$this->setPageTitle($page->getShortName());
|
||||
return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page, 'sidebarTree' => $sidebarTree]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get page from an ajax request.
|
||||
* @param $pageId
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function getPageAjax($pageId)
|
||||
{
|
||||
$page = $this->pageRepo->getById($pageId);
|
||||
return response()->json($page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified page.
|
||||
*
|
||||
* @param $bookSlug
|
||||
* @param $pageSlug
|
||||
* @return Response
|
||||
*/
|
||||
public function edit($bookSlug, $pageSlug)
|
||||
{
|
||||
$this->checkPermission('page-update');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$this->checkOwnablePermission('page-update', $page);
|
||||
$this->setPageTitle('Editing Page ' . $page->getShortName());
|
||||
$page->isDraft = false;
|
||||
|
||||
// Check for active editing
|
||||
$warnings = [];
|
||||
if ($this->pageRepo->isPageEditingActive($page, 60)) {
|
||||
$warnings[] = $this->pageRepo->getPageEditingActiveMessage($page, 60);
|
||||
}
|
||||
|
||||
// Check for a current draft version for this user
|
||||
if ($this->pageRepo->hasUserGotPageDraft($page, $this->currentUser->id)) {
|
||||
$draft = $this->pageRepo->getUserPageDraft($page, $this->currentUser->id);
|
||||
$page->name = $draft->name;
|
||||
$page->html = $draft->html;
|
||||
$page->markdown = $draft->markdown;
|
||||
$page->isDraft = true;
|
||||
$warnings [] = $this->pageRepo->getUserPageDraftMessage($draft);
|
||||
}
|
||||
|
||||
if (count($warnings) > 0) session()->flash('warning', implode("\n", $warnings));
|
||||
|
||||
return view('pages/edit', ['page' => $page, 'book' => $book, 'current' => $page]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified page in storage.
|
||||
*
|
||||
* @param Request $request
|
||||
* @param $bookSlug
|
||||
* @param $pageSlug
|
||||
@@ -122,17 +189,42 @@ class PageController extends Controller
|
||||
*/
|
||||
public function update(Request $request, $bookSlug, $pageSlug)
|
||||
{
|
||||
$this->checkPermission('page-update');
|
||||
$this->validate($request, [
|
||||
'name' => 'required|string|max:255'
|
||||
'name' => 'required|string|max:255'
|
||||
]);
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$this->checkOwnablePermission('page-update', $page);
|
||||
$this->pageRepo->updatePage($page, $book->id, $request->all());
|
||||
Activity::add($page, 'page_update', $book->id);
|
||||
return redirect($page->getUrl());
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a draft update as a revision.
|
||||
* @param Request $request
|
||||
* @param $pageId
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function saveDraft(Request $request, $pageId)
|
||||
{
|
||||
$page = $this->pageRepo->getById($pageId, true);
|
||||
$this->checkOwnablePermission('page-update', $page);
|
||||
if ($page->draft) {
|
||||
$draft = $this->pageRepo->updateDraftPage($page, $request->only(['name', 'html', 'markdown']));
|
||||
} else {
|
||||
$draft = $this->pageRepo->saveUpdateDraft($page, $request->only(['name', 'html', 'markdown']));
|
||||
}
|
||||
|
||||
$updateTime = $draft->updated_at->timestamp;
|
||||
$utcUpdateTimestamp = $updateTime + Carbon::createFromTimestamp(0)->offset;
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Draft saved at ',
|
||||
'timestamp' => $utcUpdateTimestamp
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Redirect from a special link url which
|
||||
* uses the page id rather than the name.
|
||||
@@ -153,16 +245,32 @@ class PageController extends Controller
|
||||
*/
|
||||
public function showDelete($bookSlug, $pageSlug)
|
||||
{
|
||||
$this->checkPermission('page-delete');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$this->checkOwnablePermission('page-delete', $page);
|
||||
$this->setPageTitle('Delete Page ' . $page->getShortName());
|
||||
return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the deletion page for the specified page.
|
||||
* @param $bookSlug
|
||||
* @param $pageId
|
||||
* @return \Illuminate\View\View
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
public function showDeleteDraft($bookSlug, $pageId)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getById($pageId, true);
|
||||
$this->checkOwnablePermission('page-update', $page);
|
||||
$this->setPageTitle('Delete Draft Page ' . $page->getShortName());
|
||||
return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified page from storage.
|
||||
*
|
||||
* @param $bookSlug
|
||||
* @param $pageSlug
|
||||
* @return Response
|
||||
@@ -170,10 +278,28 @@ class PageController extends Controller
|
||||
*/
|
||||
public function destroy($bookSlug, $pageSlug)
|
||||
{
|
||||
$this->checkPermission('page-delete');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$this->checkOwnablePermission('page-delete', $page);
|
||||
Activity::addMessage('page_delete', $book->id, $page->name);
|
||||
session()->flash('success', 'Page deleted');
|
||||
$this->pageRepo->destroy($page);
|
||||
return redirect($book->getUrl());
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified draft page from storage.
|
||||
* @param $bookSlug
|
||||
* @param $pageId
|
||||
* @return Response
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
public function destroyDraft($bookSlug, $pageId)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getById($pageId, true);
|
||||
$this->checkOwnablePermission('page-update', $page);
|
||||
session()->flash('success', 'Draft deleted');
|
||||
$this->pageRepo->destroy($page);
|
||||
return redirect($book->getUrl());
|
||||
}
|
||||
@@ -218,9 +344,9 @@ class PageController extends Controller
|
||||
*/
|
||||
public function restoreRevision($bookSlug, $pageSlug, $revisionId)
|
||||
{
|
||||
$this->checkPermission('page-update');
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$this->checkOwnablePermission('page-update', $page);
|
||||
$page = $this->pageRepo->restoreRevision($page, $book, $revisionId);
|
||||
Activity::add($page, 'page_restore', $book->id);
|
||||
return redirect($page->getUrl());
|
||||
@@ -239,8 +365,8 @@ class PageController extends Controller
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$pdfContent = $this->exportService->pageToPdf($page);
|
||||
return response()->make($pdfContent, 200, [
|
||||
'Content-Type' => 'application/octet-stream',
|
||||
'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.pdf'
|
||||
'Content-Type' => 'application/octet-stream',
|
||||
'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.pdf'
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -256,8 +382,8 @@ class PageController extends Controller
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$containedHtml = $this->exportService->pageToContainedHtml($page);
|
||||
return response()->make($containedHtml, 200, [
|
||||
'Content-Type' => 'application/octet-stream',
|
||||
'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.html'
|
||||
'Content-Type' => 'application/octet-stream',
|
||||
'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.html'
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -273,9 +399,70 @@ class PageController extends Controller
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$containedHtml = $this->exportService->pageToPlainText($page);
|
||||
return response()->make($containedHtml, 200, [
|
||||
'Content-Type' => 'application/octet-stream',
|
||||
'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.txt'
|
||||
'Content-Type' => 'application/octet-stream',
|
||||
'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.txt'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a listing of recently created pages
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function showRecentlyCreated()
|
||||
{
|
||||
$pages = $this->pageRepo->getRecentlyCreatedPaginated(20);
|
||||
return view('pages/detailed-listing', [
|
||||
'title' => 'Recently Created Pages',
|
||||
'pages' => $pages
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a listing of recently created pages
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function showRecentlyUpdated()
|
||||
{
|
||||
$pages = $this->pageRepo->getRecentlyUpdatedPaginated(20);
|
||||
return view('pages/detailed-listing', [
|
||||
'title' => 'Recently Updated Pages',
|
||||
'pages' => $pages
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the Restrictions view.
|
||||
* @param $bookSlug
|
||||
* @param $pageSlug
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function showRestrict($bookSlug, $pageSlug)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$this->checkOwnablePermission('restrictions-manage', $page);
|
||||
$roles = $this->userRepo->getRestrictableRoles();
|
||||
return view('pages/restrictions', [
|
||||
'page' => $page,
|
||||
'roles' => $roles
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the restrictions for this page.
|
||||
* @param $bookSlug
|
||||
* @param $pageSlug
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
*/
|
||||
public function restrict($bookSlug, $pageSlug, Request $request)
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$this->checkOwnablePermission('restrictions-manage', $page);
|
||||
$this->pageRepo->updateRestrictionsFromRequest($request, $page);
|
||||
session()->flash('success', 'Page Restrictions Updated');
|
||||
return redirect($page->getUrl());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
129
app/Http/Controllers/PermissionController.php
Normal file
129
app/Http/Controllers/PermissionController.php
Normal file
@@ -0,0 +1,129 @@
|
||||
<?php namespace BookStack\Http\Controllers;
|
||||
|
||||
use BookStack\Exceptions\PermissionsException;
|
||||
use BookStack\Repos\PermissionsRepo;
|
||||
use Illuminate\Http\Request;
|
||||
use BookStack\Http\Requests;
|
||||
|
||||
class PermissionController extends Controller
|
||||
{
|
||||
|
||||
protected $permissionsRepo;
|
||||
|
||||
/**
|
||||
* PermissionController constructor.
|
||||
* @param PermissionsRepo $permissionsRepo
|
||||
*/
|
||||
public function __construct(PermissionsRepo $permissionsRepo)
|
||||
{
|
||||
$this->permissionsRepo = $permissionsRepo;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a listing of the roles in the system.
|
||||
*/
|
||||
public function listRoles()
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
$roles = $this->permissionsRepo->getAllRoles();
|
||||
return view('settings/roles/index', ['roles' => $roles]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form to create a new role
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function createRole()
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
return view('settings/roles/create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a new role in the system.
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
*/
|
||||
public function storeRole(Request $request)
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
$this->validate($request, [
|
||||
'display_name' => 'required|min:3|max:200',
|
||||
'description' => 'max:250'
|
||||
]);
|
||||
|
||||
$this->permissionsRepo->saveNewRole($request->all());
|
||||
session()->flash('success', 'Role successfully created');
|
||||
return redirect('/settings/roles');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing a user role.
|
||||
* @param $id
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function editRole($id)
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
$role = $this->permissionsRepo->getRoleById($id);
|
||||
return view('settings/roles/edit', ['role' => $role]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a user role.
|
||||
* @param $id
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
*/
|
||||
public function updateRole($id, Request $request)
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
$this->validate($request, [
|
||||
'display_name' => 'required|min:3|max:200',
|
||||
'description' => 'max:250'
|
||||
]);
|
||||
|
||||
$this->permissionsRepo->updateRole($id, $request->all());
|
||||
session()->flash('success', 'Role successfully updated');
|
||||
return redirect('/settings/roles');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the view to delete a role.
|
||||
* Offers the chance to migrate users.
|
||||
* @param $id
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function showDeleteRole($id)
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
$role = $this->permissionsRepo->getRoleById($id);
|
||||
$roles = $this->permissionsRepo->getAllRolesExcept($role);
|
||||
$blankRole = $role->newInstance(['display_name' => 'Don\'t migrate users']);
|
||||
$roles->prepend($blankRole);
|
||||
return view('settings/roles/delete', ['role' => $role, 'roles' => $roles]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a role from the system,
|
||||
* Migrate from a previous role if set.
|
||||
* @param $id
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
*/
|
||||
public function deleteRole($id, Request $request)
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
|
||||
try {
|
||||
$this->permissionsRepo->deleteRole($id, $request->get('migrate_role_id'));
|
||||
} catch (PermissionsException $e) {
|
||||
session()->flash('error', $e->getMessage());
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
session()->flash('success', 'Role successfully deleted');
|
||||
return redirect('/settings/roles');
|
||||
}
|
||||
}
|
||||
@@ -42,11 +42,77 @@ class SearchController extends Controller
|
||||
return redirect()->back();
|
||||
}
|
||||
$searchTerm = $request->get('term');
|
||||
$pages = $this->pageRepo->getBySearch($searchTerm);
|
||||
$books = $this->bookRepo->getBySearch($searchTerm);
|
||||
$chapters = $this->chapterRepo->getBySearch($searchTerm);
|
||||
$paginationAppends = $request->only('term');
|
||||
$pages = $this->pageRepo->getBySearch($searchTerm, [], 20, $paginationAppends);
|
||||
$books = $this->bookRepo->getBySearch($searchTerm, 10, $paginationAppends);
|
||||
$chapters = $this->chapterRepo->getBySearch($searchTerm, [], 10, $paginationAppends);
|
||||
$this->setPageTitle('Search For ' . $searchTerm);
|
||||
return view('search/all', ['pages' => $pages, 'books' => $books, 'chapters' => $chapters, 'searchTerm' => $searchTerm]);
|
||||
return view('search/all', [
|
||||
'pages' => $pages,
|
||||
'books' => $books,
|
||||
'chapters' => $chapters,
|
||||
'searchTerm' => $searchTerm
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search only the pages in the system.
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
|
||||
*/
|
||||
public function searchPages(Request $request)
|
||||
{
|
||||
if (!$request->has('term')) return redirect()->back();
|
||||
|
||||
$searchTerm = $request->get('term');
|
||||
$paginationAppends = $request->only('term');
|
||||
$pages = $this->pageRepo->getBySearch($searchTerm, [], 20, $paginationAppends);
|
||||
$this->setPageTitle('Page Search For ' . $searchTerm);
|
||||
return view('search/entity-search-list', [
|
||||
'entities' => $pages,
|
||||
'title' => 'Page Search Results',
|
||||
'searchTerm' => $searchTerm
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search only the chapters in the system.
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
|
||||
*/
|
||||
public function searchChapters(Request $request)
|
||||
{
|
||||
if (!$request->has('term')) return redirect()->back();
|
||||
|
||||
$searchTerm = $request->get('term');
|
||||
$paginationAppends = $request->only('term');
|
||||
$chapters = $this->chapterRepo->getBySearch($searchTerm, [], 20, $paginationAppends);
|
||||
$this->setPageTitle('Chapter Search For ' . $searchTerm);
|
||||
return view('search/entity-search-list', [
|
||||
'entities' => $chapters,
|
||||
'title' => 'Chapter Search Results',
|
||||
'searchTerm' => $searchTerm
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search only the books in the system.
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
|
||||
*/
|
||||
public function searchBooks(Request $request)
|
||||
{
|
||||
if (!$request->has('term')) return redirect()->back();
|
||||
|
||||
$searchTerm = $request->get('term');
|
||||
$paginationAppends = $request->only('term');
|
||||
$books = $this->bookRepo->getBySearch($searchTerm, 20, $paginationAppends);
|
||||
$this->setPageTitle('Book Search For ' . $searchTerm);
|
||||
return view('search/entity-search-list', [
|
||||
'entities' => $books,
|
||||
'title' => 'Book Search Results',
|
||||
'searchTerm' => $searchTerm
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,42 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace BookStack\Http\Controllers;
|
||||
<?php namespace BookStack\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use BookStack\Http\Requests;
|
||||
use BookStack\Http\Controllers\Controller;
|
||||
use Setting;
|
||||
|
||||
class SettingController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the settings.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->checkPermission('settings-update');
|
||||
$this->checkPermission('settings-manage');
|
||||
$this->setPageTitle('Settings');
|
||||
return view('settings/index');
|
||||
}
|
||||
|
||||
// Get application version
|
||||
$version = false;
|
||||
if (function_exists('exec')) {
|
||||
$version = exec('git describe --always --tags ');
|
||||
}
|
||||
|
||||
return view('settings/index', ['version' => $version]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified settings in storage.
|
||||
*
|
||||
* @param Request $request
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
public function update(Request $request)
|
||||
{
|
||||
$this->preventAccessForDemoUsers();
|
||||
$this->checkPermission('settings-update');
|
||||
$this->checkPermission('settings-manage');
|
||||
|
||||
// Cycles through posted settings and update them
|
||||
foreach($request->all() as $name => $value) {
|
||||
if(strpos($name, 'setting-') !== 0) continue;
|
||||
foreach ($request->all() as $name => $value) {
|
||||
if (strpos($name, 'setting-') !== 0) continue;
|
||||
$key = str_replace('setting-', '', trim($name));
|
||||
Setting::put($key, $value);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace BookStack\Http\Controllers;
|
||||
|
||||
use BookStack\Activity;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use Illuminate\Http\Response;
|
||||
@@ -34,7 +35,8 @@ class UserController extends Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$users = $this->user->all();
|
||||
$this->checkPermission('users-manage');
|
||||
$users = $this->userRepo->getAllUsers();
|
||||
$this->setPageTitle('Users');
|
||||
return view('users/index', ['users' => $users]);
|
||||
}
|
||||
@@ -45,7 +47,7 @@ class UserController extends Controller
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$this->checkPermission('user-create');
|
||||
$this->checkPermission('users-manage');
|
||||
$authMethod = config('auth.method');
|
||||
return view('users/create', ['authMethod' => $authMethod]);
|
||||
}
|
||||
@@ -57,11 +59,10 @@ class UserController extends Controller
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$this->checkPermission('user-create');
|
||||
$this->checkPermission('users-manage');
|
||||
$validationRules = [
|
||||
'name' => 'required',
|
||||
'email' => 'required|email|unique:users,email',
|
||||
'role' => 'required|exists:roles,id'
|
||||
'email' => 'required|email|unique:users,email'
|
||||
];
|
||||
|
||||
$authMethod = config('auth.method');
|
||||
@@ -83,7 +84,11 @@ class UserController extends Controller
|
||||
}
|
||||
|
||||
$user->save();
|
||||
$user->attachRoleId($request->get('role'));
|
||||
|
||||
if ($request->has('roles')) {
|
||||
$roles = $request->get('roles');
|
||||
$user->roles()->sync($roles);
|
||||
}
|
||||
|
||||
// Get avatar from gravatar and save
|
||||
if (!config('services.disable_services')) {
|
||||
@@ -92,10 +97,9 @@ class UserController extends Controller
|
||||
$user->save();
|
||||
}
|
||||
|
||||
return redirect('/users');
|
||||
return redirect('/settings/users');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified user.
|
||||
* @param int $id
|
||||
@@ -104,7 +108,7 @@ class UserController extends Controller
|
||||
*/
|
||||
public function edit($id, SocialAuthService $socialAuthService)
|
||||
{
|
||||
$this->checkPermissionOr('user-update', function () use ($id) {
|
||||
$this->checkPermissionOr('users-manage', function () use ($id) {
|
||||
return $this->currentUser->id == $id;
|
||||
});
|
||||
|
||||
@@ -125,16 +129,15 @@ class UserController extends Controller
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$this->preventAccessForDemoUsers();
|
||||
$this->checkPermissionOr('user-update', function () use ($id) {
|
||||
$this->checkPermissionOr('users-manage', function () use ($id) {
|
||||
return $this->currentUser->id == $id;
|
||||
});
|
||||
|
||||
$this->validate($request, [
|
||||
'name' => 'required',
|
||||
'email' => 'required|email|unique:users,email,' . $id,
|
||||
'name' => 'min:2',
|
||||
'email' => 'min:2|email|unique:users,email,' . $id,
|
||||
'password' => 'min:5|required_with:password_confirm',
|
||||
'password-confirm' => 'same:password|required_with:password',
|
||||
'role' => 'exists:roles,id'
|
||||
'password-confirm' => 'same:password|required_with:password'
|
||||
], [
|
||||
'password-confirm.required_with' => 'Password confirmation required'
|
||||
]);
|
||||
@@ -143,8 +146,9 @@ class UserController extends Controller
|
||||
$user->fill($request->all());
|
||||
|
||||
// Role updates
|
||||
if ($this->currentUser->can('user-update') && $request->has('role')) {
|
||||
$user->attachRoleId($request->get('role'));
|
||||
if (userCan('users-manage') && $request->has('roles')) {
|
||||
$roles = $request->get('roles');
|
||||
$user->roles()->sync($roles);
|
||||
}
|
||||
|
||||
// Password updates
|
||||
@@ -154,12 +158,15 @@ class UserController extends Controller
|
||||
}
|
||||
|
||||
// External auth id updates
|
||||
if ($this->currentUser->can('user-update') && $request->has('external_auth_id')) {
|
||||
if ($this->currentUser->can('users-manage') && $request->has('external_auth_id')) {
|
||||
$user->external_auth_id = $request->get('external_auth_id');
|
||||
}
|
||||
|
||||
$user->save();
|
||||
return redirect('/users');
|
||||
session()->flash('success', 'User successfully updated');
|
||||
|
||||
$redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id;
|
||||
return redirect($redirectUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -169,7 +176,7 @@ class UserController extends Controller
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
$this->checkPermissionOr('user-delete', function () use ($id) {
|
||||
$this->checkPermissionOr('users-manage', function () use ($id) {
|
||||
return $this->currentUser->id == $id;
|
||||
});
|
||||
|
||||
@@ -186,7 +193,7 @@ class UserController extends Controller
|
||||
public function destroy($id)
|
||||
{
|
||||
$this->preventAccessForDemoUsers();
|
||||
$this->checkPermissionOr('user-delete', function () use ($id) {
|
||||
$this->checkPermissionOr('users-manage', function () use ($id) {
|
||||
return $this->currentUser->id == $id;
|
||||
});
|
||||
|
||||
@@ -197,6 +204,25 @@ class UserController extends Controller
|
||||
}
|
||||
$this->userRepo->destroy($user);
|
||||
|
||||
return redirect('/users');
|
||||
return redirect('/settings/users');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the user profile page
|
||||
* @param $id
|
||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||
*/
|
||||
public function showProfilePage($id)
|
||||
{
|
||||
$user = $this->userRepo->getById($id);
|
||||
$userActivity = $this->userRepo->getActivity($user);
|
||||
$recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5, 0);
|
||||
$assetCounts = $this->userRepo->getAssetCounts($user);
|
||||
return view('users/profile', [
|
||||
'user' => $user,
|
||||
'activity' => $userActivity,
|
||||
'recentlyCreated' => $recentlyCreated,
|
||||
'assetCounts' => $assetCounts
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,14 +11,12 @@ class Authenticate
|
||||
{
|
||||
/**
|
||||
* The Guard implementation.
|
||||
*
|
||||
* @var Guard
|
||||
*/
|
||||
protected $auth;
|
||||
|
||||
/**
|
||||
* Create a new filter instance.
|
||||
*
|
||||
* @param Guard $auth
|
||||
*/
|
||||
public function __construct(Guard $auth)
|
||||
@@ -28,18 +26,17 @@ class Authenticate
|
||||
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if(auth()->check() && auth()->user()->email_confirmed == false) {
|
||||
if ($this->auth->check() && setting('registration-confirmation') && !$this->auth->user()->email_confirmed) {
|
||||
return redirect()->guest('/register/confirm/awaiting');
|
||||
}
|
||||
|
||||
if ($this->auth->guest() && !Setting::get('app-public')) {
|
||||
if ($this->auth->guest() && !setting('app-public')) {
|
||||
if ($request->ajax()) {
|
||||
return response('Unauthorized.', 401);
|
||||
} else {
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
// Authenticated routes...
|
||||
Route::group(['middleware' => 'auth'], function () {
|
||||
|
||||
Route::group(['prefix' => 'pages'], function() {
|
||||
Route::get('/recently-created', 'PageController@showRecentlyCreated');
|
||||
Route::get('/recently-updated', 'PageController@showRecentlyUpdated');
|
||||
});
|
||||
|
||||
Route::group(['prefix' => 'books'], function () {
|
||||
|
||||
// Books
|
||||
@@ -14,21 +19,28 @@ Route::group(['middleware' => 'auth'], function () {
|
||||
Route::delete('/{id}', 'BookController@destroy');
|
||||
Route::get('/{slug}/sort-item', 'BookController@getSortItem');
|
||||
Route::get('/{slug}', 'BookController@show');
|
||||
Route::get('/{bookSlug}/permissions', 'BookController@showRestrict');
|
||||
Route::put('/{bookSlug}/permissions', 'BookController@restrict');
|
||||
Route::get('/{slug}/delete', 'BookController@showDelete');
|
||||
Route::get('/{bookSlug}/sort', 'BookController@sort');
|
||||
Route::put('/{bookSlug}/sort', 'BookController@saveSort');
|
||||
|
||||
// Pages
|
||||
Route::get('/{bookSlug}/page/create', 'PageController@create');
|
||||
Route::post('/{bookSlug}/page', 'PageController@store');
|
||||
Route::get('/{bookSlug}/draft/{pageId}', 'PageController@editDraft');
|
||||
Route::post('/{bookSlug}/page/{pageId}', 'PageController@store');
|
||||
Route::get('/{bookSlug}/page/{pageSlug}', 'PageController@show');
|
||||
Route::get('/{bookSlug}/page/{pageSlug}/export/pdf', 'PageController@exportPdf');
|
||||
Route::get('/{bookSlug}/page/{pageSlug}/export/html', 'PageController@exportHtml');
|
||||
Route::get('/{bookSlug}/page/{pageSlug}/export/plaintext', 'PageController@exportPlainText');
|
||||
Route::get('/{bookSlug}/page/{pageSlug}/edit', 'PageController@edit');
|
||||
Route::get('/{bookSlug}/page/{pageSlug}/delete', 'PageController@showDelete');
|
||||
Route::get('/{bookSlug}/draft/{pageId}/delete', 'PageController@showDeleteDraft');
|
||||
Route::get('/{bookSlug}/page/{pageSlug}/permissions', 'PageController@showRestrict');
|
||||
Route::put('/{bookSlug}/page/{pageSlug}/permissions', 'PageController@restrict');
|
||||
Route::put('/{bookSlug}/page/{pageSlug}', 'PageController@update');
|
||||
Route::delete('/{bookSlug}/page/{pageSlug}', 'PageController@destroy');
|
||||
Route::delete('/{bookSlug}/draft/{pageId}', 'PageController@destroyDraft');
|
||||
|
||||
// Revisions
|
||||
Route::get('/{bookSlug}/page/{pageSlug}/revisions', 'PageController@showRevisions');
|
||||
@@ -42,19 +54,15 @@ Route::group(['middleware' => 'auth'], function () {
|
||||
Route::get('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@show');
|
||||
Route::put('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@update');
|
||||
Route::get('/{bookSlug}/chapter/{chapterSlug}/edit', 'ChapterController@edit');
|
||||
Route::get('/{bookSlug}/chapter/{chapterSlug}/permissions', 'ChapterController@showRestrict');
|
||||
Route::put('/{bookSlug}/chapter/{chapterSlug}/permissions', 'ChapterController@restrict');
|
||||
Route::get('/{bookSlug}/chapter/{chapterSlug}/delete', 'ChapterController@showDelete');
|
||||
Route::delete('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@destroy');
|
||||
|
||||
});
|
||||
|
||||
// Users
|
||||
Route::get('/users', 'UserController@index');
|
||||
Route::get('/users/create', 'UserController@create');
|
||||
Route::get('/users/{id}/delete', 'UserController@delete');
|
||||
Route::post('/users/create', 'UserController@store');
|
||||
Route::get('/users/{id}', 'UserController@edit');
|
||||
Route::put('/users/{id}', 'UserController@update');
|
||||
Route::delete('/users/{id}', 'UserController@destroy');
|
||||
// User Profile routes
|
||||
Route::get('/user/{userId}', 'UserController@showProfilePage');
|
||||
|
||||
// Image routes
|
||||
Route::group(['prefix' => 'images'], function() {
|
||||
@@ -67,14 +75,24 @@ Route::group(['middleware' => 'auth'], function () {
|
||||
Route::post('/{type}/upload', 'ImageController@uploadByType');
|
||||
Route::get('/{type}/all', 'ImageController@getAllByType');
|
||||
Route::get('/{type}/all/{page}', 'ImageController@getAllByType');
|
||||
Route::get('/{type}/search/{page}', 'ImageController@searchByType');
|
||||
Route::get('/gallery/{filter}/{page}', 'ImageController@getGalleryFiltered');
|
||||
Route::delete('/{imageId}', 'ImageController@destroy');
|
||||
});
|
||||
|
||||
// Ajax routes
|
||||
Route::put('/ajax/page/{id}/save-draft', 'PageController@saveDraft');
|
||||
Route::get('/ajax/page/{id}', 'PageController@getPageAjax');
|
||||
Route::delete('/ajax/page/{id}', 'PageController@ajaxDestroy');
|
||||
|
||||
// Links
|
||||
Route::get('/link/{id}', 'PageController@redirectFromLink');
|
||||
|
||||
// Search
|
||||
Route::get('/search/all', 'SearchController@searchAll');
|
||||
Route::get('/search/pages', 'SearchController@searchPages');
|
||||
Route::get('/search/books', 'SearchController@searchBooks');
|
||||
Route::get('/search/chapters', 'SearchController@searchChapters');
|
||||
Route::get('/search/book/{bookId}', 'SearchController@searchBook');
|
||||
|
||||
// Other Pages
|
||||
@@ -82,8 +100,28 @@ Route::group(['middleware' => 'auth'], function () {
|
||||
Route::get('/home', 'HomeController@index');
|
||||
|
||||
// Settings
|
||||
Route::get('/settings', 'SettingController@index');
|
||||
Route::post('/settings', 'SettingController@update');
|
||||
Route::group(['prefix' => 'settings'], function() {
|
||||
Route::get('/', 'SettingController@index');
|
||||
Route::post('/', 'SettingController@update');
|
||||
|
||||
// Users
|
||||
Route::get('/users', 'UserController@index');
|
||||
Route::get('/users/create', 'UserController@create');
|
||||
Route::get('/users/{id}/delete', 'UserController@delete');
|
||||
Route::post('/users/create', 'UserController@store');
|
||||
Route::get('/users/{id}', 'UserController@edit');
|
||||
Route::put('/users/{id}', 'UserController@update');
|
||||
Route::delete('/users/{id}', 'UserController@destroy');
|
||||
|
||||
// Roles
|
||||
Route::get('/roles', 'PermissionController@listRoles');
|
||||
Route::get('/roles/new', 'PermissionController@createRole');
|
||||
Route::post('/roles/new', 'PermissionController@storeRole');
|
||||
Route::get('/roles/delete/{id}', 'PermissionController@showDeleteRole');
|
||||
Route::delete('/roles/delete/{id}', 'PermissionController@deleteRole');
|
||||
Route::get('/roles/{id}', 'PermissionController@editRole');
|
||||
Route::put('/roles/{id}', 'PermissionController@updateRole');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
<?php
|
||||
<?php namespace BookStack;
|
||||
|
||||
namespace BookStack;
|
||||
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Images;
|
||||
|
||||
class Image extends Model
|
||||
class Image extends Ownable
|
||||
{
|
||||
use Ownable;
|
||||
|
||||
protected $fillable = ['name'];
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<?php namespace BookStack;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
trait Ownable
|
||||
abstract class Ownable extends Model
|
||||
{
|
||||
/**
|
||||
* Relation for the user that created this entity.
|
||||
@@ -20,4 +21,14 @@ trait Ownable
|
||||
{
|
||||
return $this->belongsTo('BookStack\User', 'updated_by');
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the class name.
|
||||
* @return string
|
||||
*/
|
||||
public static function getClassName()
|
||||
{
|
||||
return strtolower(array_slice(explode('\\', static::class), -1, 1)[0]);
|
||||
}
|
||||
|
||||
}
|
||||
11
app/Page.php
11
app/Page.php
@@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Page extends Entity
|
||||
{
|
||||
protected $fillable = ['name', 'html', 'priority'];
|
||||
protected $fillable = ['name', 'html', 'priority', 'markdown'];
|
||||
|
||||
protected $simpleAttributes = ['name', 'id', 'slug'];
|
||||
|
||||
@@ -34,18 +34,21 @@ class Page extends Entity
|
||||
|
||||
public function revisions()
|
||||
{
|
||||
return $this->hasMany('BookStack\PageRevision')->orderBy('created_at', 'desc');
|
||||
return $this->hasMany('BookStack\PageRevision')->where('type', '=', 'version')->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
public function getUrl()
|
||||
{
|
||||
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
|
||||
return '/books/' . $bookSlug . '/page/' . $this->slug;
|
||||
$midText = $this->draft ? '/draft/' : '/page/';
|
||||
$idComponent = $this->draft ? $this->id : $this->slug;
|
||||
return '/books/' . $bookSlug . $midText . $idComponent;
|
||||
}
|
||||
|
||||
public function getExcerpt($length = 100)
|
||||
{
|
||||
return strlen($this->text) > $length ? substr($this->text, 0, $length-3) . '...' : $this->text;
|
||||
$text = strlen($this->text) > $length ? substr($this->text, 0, $length-3) . '...' : $this->text;
|
||||
return mb_convert_encoding($text, 'UTF-8');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,23 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace BookStack;
|
||||
<?php namespace BookStack;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class PageRevision extends Model
|
||||
{
|
||||
protected $fillable = ['name', 'html', 'text'];
|
||||
protected $fillable = ['name', 'html', 'text', 'markdown'];
|
||||
|
||||
/**
|
||||
* Get the user that created the page revision
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
*/
|
||||
public function createdBy()
|
||||
{
|
||||
return $this->belongsTo('BookStack\User', 'created_by');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the page this revision originates from.
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
*/
|
||||
public function page()
|
||||
{
|
||||
return $this->belongsTo('BookStack\Page');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the url for this revision.
|
||||
* @return string
|
||||
*/
|
||||
public function getUrl()
|
||||
{
|
||||
return $this->page->getUrl() . '/revisions/' . $this->id;
|
||||
|
||||
@@ -11,6 +11,16 @@ class Permission extends Model
|
||||
*/
|
||||
public function roles()
|
||||
{
|
||||
return $this->belongsToMany('BookStack\Permissions');
|
||||
return $this->belongsToMany('BookStack\Role');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the permission object by name.
|
||||
* @param $roleName
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getByName($name)
|
||||
{
|
||||
return static::where('name', '=', $name)->first();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,11 +28,17 @@ class CustomFacadeProvider extends ServiceProvider
|
||||
public function register()
|
||||
{
|
||||
$this->app->bind('activity', function() {
|
||||
return new ActivityService($this->app->make('BookStack\Activity'));
|
||||
return new ActivityService(
|
||||
$this->app->make('BookStack\Activity'),
|
||||
$this->app->make('BookStack\Services\RestrictionService')
|
||||
);
|
||||
});
|
||||
|
||||
$this->app->bind('views', function() {
|
||||
return new ViewService($this->app->make('BookStack\View'));
|
||||
return new ViewService(
|
||||
$this->app->make('BookStack\View'),
|
||||
$this->app->make('BookStack\Services\RestrictionService')
|
||||
);
|
||||
});
|
||||
|
||||
$this->app->bind('setting', function() {
|
||||
@@ -41,6 +47,7 @@ class CustomFacadeProvider extends ServiceProvider
|
||||
$this->app->make('Illuminate\Contracts\Cache\Repository')
|
||||
);
|
||||
});
|
||||
|
||||
$this->app->bind('images', function() {
|
||||
return new ImageService(
|
||||
$this->app->make('Intervention\Image\ImageManager'),
|
||||
|
||||
@@ -115,7 +115,7 @@ class LdapUserProvider implements UserProvider
|
||||
$model->name = $userDetails['name'];
|
||||
$model->external_auth_id = $userDetails['uid'];
|
||||
$model->email = $userDetails['email'];
|
||||
$model->email_confirmed = true;
|
||||
$model->email_confirmed = false;
|
||||
return $model;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,28 +1,35 @@
|
||||
<?php namespace BookStack\Repos;
|
||||
|
||||
use Activity;
|
||||
use BookStack\Exceptions\NotFoundException;
|
||||
use Illuminate\Support\Str;
|
||||
use BookStack\Book;
|
||||
use Views;
|
||||
|
||||
class BookRepo
|
||||
class BookRepo extends EntityRepo
|
||||
{
|
||||
|
||||
protected $book;
|
||||
protected $pageRepo;
|
||||
protected $chapterRepo;
|
||||
|
||||
/**
|
||||
* BookRepo constructor.
|
||||
* @param Book $book
|
||||
* @param PageRepo $pageRepo
|
||||
* @param PageRepo $pageRepo
|
||||
* @param ChapterRepo $chapterRepo
|
||||
*/
|
||||
public function __construct(Book $book, PageRepo $pageRepo, ChapterRepo $chapterRepo)
|
||||
public function __construct(PageRepo $pageRepo, ChapterRepo $chapterRepo)
|
||||
{
|
||||
$this->book = $book;
|
||||
$this->pageRepo = $pageRepo;
|
||||
$this->chapterRepo = $chapterRepo;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Base query for getting books.
|
||||
* Takes into account any restrictions.
|
||||
* @return mixed
|
||||
*/
|
||||
private function bookQuery()
|
||||
{
|
||||
return $this->restrictionService->enforceBookRestrictions($this->book, 'view');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -32,7 +39,7 @@ class BookRepo
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
return $this->book->findOrFail($id);
|
||||
return $this->bookQuery()->findOrFail($id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,7 +49,9 @@ class BookRepo
|
||||
*/
|
||||
public function getAll($count = 10)
|
||||
{
|
||||
return $this->book->orderBy('name', 'asc')->take($count)->get();
|
||||
$bookQuery = $this->bookQuery()->orderBy('name', 'asc');
|
||||
if (!$count) return $bookQuery->get();
|
||||
return $bookQuery->take($count)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -52,7 +61,8 @@ class BookRepo
|
||||
*/
|
||||
public function getAllPaginated($count = 10)
|
||||
{
|
||||
return $this->book->orderBy('name', 'asc')->paginate($count);
|
||||
return $this->bookQuery()
|
||||
->orderBy('name', 'asc')->paginate($count);
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +73,7 @@ class BookRepo
|
||||
*/
|
||||
public function getLatest($count = 10)
|
||||
{
|
||||
return $this->book->orderBy('created_at', 'desc')->take($count)->get();
|
||||
return $this->bookQuery()->orderBy('created_at', 'desc')->take($count)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -92,11 +102,12 @@ class BookRepo
|
||||
* Get a book by slug
|
||||
* @param $slug
|
||||
* @return mixed
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
public function getBySlug($slug)
|
||||
{
|
||||
$book = $this->book->where('slug', '=', $slug)->first();
|
||||
if ($book === null) abort(404);
|
||||
$book = $this->bookQuery()->where('slug', '=', $slug)->first();
|
||||
if ($book === null) throw new NotFoundException('Book not found');
|
||||
return $book;
|
||||
}
|
||||
|
||||
@@ -107,7 +118,7 @@ class BookRepo
|
||||
*/
|
||||
public function exists($id)
|
||||
{
|
||||
return $this->book->where('id', '=', $id)->exists();
|
||||
return $this->bookQuery()->where('id', '=', $id)->exists();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -117,17 +128,7 @@ class BookRepo
|
||||
*/
|
||||
public function newFromInput($input)
|
||||
{
|
||||
return $this->book->fill($input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the amount of books that have a specific slug.
|
||||
* @param $slug
|
||||
* @return mixed
|
||||
*/
|
||||
public function countBySlug($slug)
|
||||
{
|
||||
return $this->book->where('slug', '=', $slug)->count();
|
||||
return $this->book->newInstance($input);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -144,6 +145,7 @@ class BookRepo
|
||||
$this->chapterRepo->destroy($chapter);
|
||||
}
|
||||
$book->views()->delete();
|
||||
$book->restrictions()->delete();
|
||||
$book->delete();
|
||||
}
|
||||
|
||||
@@ -159,7 +161,7 @@ class BookRepo
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $slug
|
||||
* @param string $slug
|
||||
* @param bool|false $currentId
|
||||
* @return bool
|
||||
*/
|
||||
@@ -175,7 +177,7 @@ class BookRepo
|
||||
/**
|
||||
* Provides a suitable slug for the given book name.
|
||||
* Ensures the returned slug is unique in the system.
|
||||
* @param string $name
|
||||
* @param string $name
|
||||
* @param bool|false $currentId
|
||||
* @return string
|
||||
*/
|
||||
@@ -196,34 +198,63 @@ class BookRepo
|
||||
* Returns a sorted collection of Pages and Chapters.
|
||||
* Loads the bookslug onto child elements to prevent access database access for getting the slug.
|
||||
* @param Book $book
|
||||
* @param bool $filterDrafts
|
||||
* @return mixed
|
||||
*/
|
||||
public function getChildren(Book $book)
|
||||
public function getChildren(Book $book, $filterDrafts = false)
|
||||
{
|
||||
$pages = $book->pages()->where('chapter_id', '=', 0)->get();
|
||||
$chapters = $book->chapters()->with('pages')->get();
|
||||
$pageQuery = $book->pages()->where('chapter_id', '=', 0);
|
||||
$pageQuery = $this->restrictionService->enforcePageRestrictions($pageQuery, 'view');
|
||||
|
||||
if ($filterDrafts) {
|
||||
$pageQuery = $pageQuery->where('draft', '=', false);
|
||||
}
|
||||
|
||||
$pages = $pageQuery->get();
|
||||
|
||||
$chapterQuery = $book->chapters()->with(['pages' => function($query) use ($filterDrafts) {
|
||||
$this->restrictionService->enforcePageRestrictions($query, 'view');
|
||||
if ($filterDrafts) $query->where('draft', '=', false);
|
||||
}]);
|
||||
$chapterQuery = $this->restrictionService->enforceChapterRestrictions($chapterQuery, 'view');
|
||||
$chapters = $chapterQuery->get();
|
||||
$children = $pages->merge($chapters);
|
||||
$bookSlug = $book->slug;
|
||||
|
||||
$children->each(function ($child) use ($bookSlug) {
|
||||
$child->setAttribute('bookSlug', $bookSlug);
|
||||
if ($child->isA('chapter')) {
|
||||
$child->pages->each(function ($page) use ($bookSlug) {
|
||||
$page->setAttribute('bookSlug', $bookSlug);
|
||||
});
|
||||
$child->pages = $child->pages->sortBy(function($child, $key) {
|
||||
$score = $child->priority;
|
||||
if ($child->draft) $score -= 100;
|
||||
return $score;
|
||||
});
|
||||
}
|
||||
});
|
||||
return $children->sortBy('priority');
|
||||
|
||||
// Sort items with drafts first then by priority.
|
||||
return $children->sortBy(function($child, $key) {
|
||||
$score = $child->priority;
|
||||
if ($child->isA('page') && $child->draft) $score -= 100;
|
||||
return $score;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get books by search term.
|
||||
* @param $term
|
||||
* @param int $count
|
||||
* @param array $paginationAppends
|
||||
* @return mixed
|
||||
*/
|
||||
public function getBySearch($term)
|
||||
public function getBySearch($term, $count = 20, $paginationAppends = [])
|
||||
{
|
||||
$terms = explode(' ', $term);
|
||||
$books = $this->book->fullTextSearch(['name', 'description'], $terms);
|
||||
$terms = $this->prepareSearchTerms($term);
|
||||
$books = $this->restrictionService->enforceBookRestrictions($this->book->fullTextSearchQuery(['name', 'description'], $terms))
|
||||
->paginate($count)->appends($paginationAppends);
|
||||
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
|
||||
foreach ($books as $book) {
|
||||
//highlight
|
||||
|
||||
@@ -2,21 +2,19 @@
|
||||
|
||||
|
||||
use Activity;
|
||||
use BookStack\Exceptions\NotFoundException;
|
||||
use Illuminate\Support\Str;
|
||||
use BookStack\Chapter;
|
||||
|
||||
class ChapterRepo
|
||||
class ChapterRepo extends EntityRepo
|
||||
{
|
||||
|
||||
protected $chapter;
|
||||
|
||||
/**
|
||||
* ChapterRepo constructor.
|
||||
* @param $chapter
|
||||
* Base query for getting chapters, Takes restrictions into account.
|
||||
* @return mixed
|
||||
*/
|
||||
public function __construct(Chapter $chapter)
|
||||
private function chapterQuery()
|
||||
{
|
||||
$this->chapter = $chapter;
|
||||
return $this->restrictionService->enforceChapterRestrictions($this->chapter, 'view');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -26,7 +24,7 @@ class ChapterRepo
|
||||
*/
|
||||
public function idExists($id)
|
||||
{
|
||||
return $this->chapter->where('id', '=', $id)->count() > 0;
|
||||
return $this->chapterQuery()->where('id', '=', $id)->count() > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -36,7 +34,7 @@ class ChapterRepo
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
return $this->chapter->findOrFail($id);
|
||||
return $this->chapterQuery()->findOrFail($id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -45,7 +43,7 @@ class ChapterRepo
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
return $this->chapter->all();
|
||||
return $this->chapterQuery()->all();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -53,14 +51,30 @@ class ChapterRepo
|
||||
* @param $slug
|
||||
* @param $bookId
|
||||
* @return mixed
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
public function getBySlug($slug, $bookId)
|
||||
{
|
||||
$chapter = $this->chapter->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
|
||||
if ($chapter === null) abort(404);
|
||||
$chapter = $this->chapterQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
|
||||
if ($chapter === null) throw new NotFoundException('Chapter not found');
|
||||
return $chapter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the child items for a chapter
|
||||
* @param Chapter $chapter
|
||||
*/
|
||||
public function getChildren(Chapter $chapter)
|
||||
{
|
||||
$pages = $this->restrictionService->enforcePageRestrictions($chapter->pages())->get();
|
||||
// Sort items with drafts first then by priority.
|
||||
return $pages->sortBy(function($child, $key) {
|
||||
$score = $child->priority;
|
||||
if ($child->draft) $score -= 100;
|
||||
return $score;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new chapter from request input.
|
||||
* @param $input
|
||||
@@ -85,6 +99,7 @@ class ChapterRepo
|
||||
}
|
||||
Activity::removeEntity($chapter);
|
||||
$chapter->views()->delete();
|
||||
$chapter->restrictions()->delete();
|
||||
$chapter->delete();
|
||||
}
|
||||
|
||||
@@ -121,16 +136,31 @@ class ChapterRepo
|
||||
return $slug;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a new priority value for a new page to be added
|
||||
* to the given chapter.
|
||||
* @param Chapter $chapter
|
||||
* @return int
|
||||
*/
|
||||
public function getNewPriority(Chapter $chapter)
|
||||
{
|
||||
$lastPage = $chapter->pages->last();
|
||||
return $lastPage !== null ? $lastPage->priority + 1 : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get chapters by the given search term.
|
||||
* @param $term
|
||||
* @param string $term
|
||||
* @param array $whereTerms
|
||||
* @param int $count
|
||||
* @param array $paginationAppends
|
||||
* @return mixed
|
||||
*/
|
||||
public function getBySearch($term, $whereTerms = [])
|
||||
public function getBySearch($term, $whereTerms = [], $count = 20, $paginationAppends = [])
|
||||
{
|
||||
$terms = explode(' ', $term);
|
||||
$chapters = $this->chapter->fullTextSearch(['name', 'description'], $terms, $whereTerms);
|
||||
$terms = $this->prepareSearchTerms($term);
|
||||
$chapters = $this->restrictionService->enforceChapterRestrictions($this->chapter->fullTextSearchQuery(['name', 'description'], $terms, $whereTerms))
|
||||
->paginate($count)->appends($paginationAppends);
|
||||
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
|
||||
foreach ($chapters as $chapter) {
|
||||
//highlight
|
||||
|
||||
177
app/Repos/EntityRepo.php
Normal file
177
app/Repos/EntityRepo.php
Normal file
@@ -0,0 +1,177 @@
|
||||
<?php namespace BookStack\Repos;
|
||||
|
||||
use BookStack\Book;
|
||||
use BookStack\Chapter;
|
||||
use BookStack\Entity;
|
||||
use BookStack\Page;
|
||||
use BookStack\Services\RestrictionService;
|
||||
use BookStack\User;
|
||||
|
||||
class EntityRepo
|
||||
{
|
||||
|
||||
/**
|
||||
* @var Book $book
|
||||
*/
|
||||
public $book;
|
||||
|
||||
/**
|
||||
* @var Chapter
|
||||
*/
|
||||
public $chapter;
|
||||
|
||||
/**
|
||||
* @var Page
|
||||
*/
|
||||
public $page;
|
||||
|
||||
/**
|
||||
* @var RestrictionService
|
||||
*/
|
||||
protected $restrictionService;
|
||||
|
||||
/**
|
||||
* EntityService constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->book = app(Book::class);
|
||||
$this->chapter = app(Chapter::class);
|
||||
$this->page = app(Page::class);
|
||||
$this->restrictionService = app(RestrictionService::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest books added to the system.
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @param bool $additionalQuery
|
||||
* @return
|
||||
*/
|
||||
public function getRecentlyCreatedBooks($count = 20, $page = 0, $additionalQuery = false)
|
||||
{
|
||||
$query = $this->restrictionService->enforceBookRestrictions($this->book)
|
||||
->orderBy('created_at', 'desc');
|
||||
if ($additionalQuery !== false && is_callable($additionalQuery)) {
|
||||
$additionalQuery($query);
|
||||
}
|
||||
return $query->skip($page * $count)->take($count)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most recently updated books.
|
||||
* @param $count
|
||||
* @param int $page
|
||||
* @return mixed
|
||||
*/
|
||||
public function getRecentlyUpdatedBooks($count = 20, $page = 0)
|
||||
{
|
||||
return $this->restrictionService->enforceBookRestrictions($this->book)
|
||||
->orderBy('updated_at', 'desc')->skip($page * $count)->take($count)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest pages added to the system.
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @param bool $additionalQuery
|
||||
* @return
|
||||
*/
|
||||
public function getRecentlyCreatedPages($count = 20, $page = 0, $additionalQuery = false)
|
||||
{
|
||||
$query = $this->restrictionService->enforcePageRestrictions($this->page)
|
||||
->orderBy('created_at', 'desc')->where('draft', '=', false);
|
||||
if ($additionalQuery !== false && is_callable($additionalQuery)) {
|
||||
$additionalQuery($query);
|
||||
}
|
||||
return $query->with('book')->skip($page * $count)->take($count)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest chapters added to the system.
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @param bool $additionalQuery
|
||||
* @return
|
||||
*/
|
||||
public function getRecentlyCreatedChapters($count = 20, $page = 0, $additionalQuery = false)
|
||||
{
|
||||
$query = $this->restrictionService->enforceChapterRestrictions($this->chapter)
|
||||
->orderBy('created_at', 'desc');
|
||||
if ($additionalQuery !== false && is_callable($additionalQuery)) {
|
||||
$additionalQuery($query);
|
||||
}
|
||||
return $query->skip($page * $count)->take($count)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most recently updated pages.
|
||||
* @param $count
|
||||
* @param int $page
|
||||
* @return mixed
|
||||
*/
|
||||
public function getRecentlyUpdatedPages($count = 20, $page = 0)
|
||||
{
|
||||
return $this->restrictionService->enforcePageRestrictions($this->page)
|
||||
->where('draft', '=', false)
|
||||
->orderBy('updated_at', 'desc')->with('book')->skip($page * $count)->take($count)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get draft pages owned by the current user.
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
*/
|
||||
public function getUserDraftPages($count = 20, $page = 0)
|
||||
{
|
||||
$user = auth()->user();
|
||||
return $this->page->where('draft', '=', true)
|
||||
->where('created_by', '=', $user->id)
|
||||
->orderBy('updated_at', 'desc')
|
||||
->skip($count * $page)->take($count)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates entity restrictions from a request
|
||||
* @param $request
|
||||
* @param Entity $entity
|
||||
*/
|
||||
public function updateRestrictionsFromRequest($request, Entity $entity)
|
||||
{
|
||||
$entity->restricted = $request->has('restricted') && $request->get('restricted') === 'true';
|
||||
$entity->restrictions()->delete();
|
||||
if ($request->has('restrictions')) {
|
||||
foreach ($request->get('restrictions') as $roleId => $restrictions) {
|
||||
foreach ($restrictions as $action => $value) {
|
||||
$entity->restrictions()->create([
|
||||
'role_id' => $roleId,
|
||||
'action' => strtolower($action)
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
$entity->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare a string of search terms by turning
|
||||
* it into an array of terms.
|
||||
* Keeps quoted terms together.
|
||||
* @param $termString
|
||||
* @return array
|
||||
*/
|
||||
protected function prepareSearchTerms($termString)
|
||||
{
|
||||
preg_match_all('/"(.*?)"/', $termString, $matches);
|
||||
if (count($matches[1]) > 0) {
|
||||
$terms = $matches[1];
|
||||
$termString = trim(preg_replace('/"(.*?)"/', '', $termString));
|
||||
} else {
|
||||
$terms = [];
|
||||
}
|
||||
if (!empty($termString)) $terms = array_merge($terms, explode(' ', $termString));
|
||||
return $terms;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
|
||||
use BookStack\Image;
|
||||
use BookStack\Page;
|
||||
use BookStack\Services\ImageService;
|
||||
use BookStack\Services\RestrictionService;
|
||||
use Setting;
|
||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||
|
||||
@@ -11,16 +13,22 @@ class ImageRepo
|
||||
|
||||
protected $image;
|
||||
protected $imageService;
|
||||
protected $restictionService;
|
||||
protected $page;
|
||||
|
||||
/**
|
||||
* ImageRepo constructor.
|
||||
* @param Image $image
|
||||
* @param Image $image
|
||||
* @param ImageService $imageService
|
||||
* @param RestrictionService $restrictionService
|
||||
* @param Page $page
|
||||
*/
|
||||
public function __construct(Image $image, ImageService $imageService)
|
||||
public function __construct(Image $image, ImageService $imageService, RestrictionService $restrictionService, Page $page)
|
||||
{
|
||||
$this->image = $image;
|
||||
$this->imageService = $imageService;
|
||||
$this->restictionService = $restrictionService;
|
||||
$this->page = $page;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,23 +42,17 @@ class ImageRepo
|
||||
return $this->image->findOrFail($id);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets a load images paginated, filtered by image type.
|
||||
* @param string $type
|
||||
* @param int $page
|
||||
* @param int $pageSize
|
||||
* @param bool|int $userFilter
|
||||
* Execute a paginated query, returning in a standard format.
|
||||
* Also runs the query through the restriction system.
|
||||
* @param $query
|
||||
* @param int $page
|
||||
* @param int $pageSize
|
||||
* @return array
|
||||
*/
|
||||
public function getPaginatedByType($type, $page = 0, $pageSize = 24, $userFilter = false)
|
||||
private function returnPaginated($query, $page = 0, $pageSize = 24)
|
||||
{
|
||||
$images = $this->image->where('type', '=', strtolower($type));
|
||||
|
||||
if ($userFilter !== false) {
|
||||
$images = $images->where('created_by', '=', $userFilter);
|
||||
}
|
||||
|
||||
$images = $this->restictionService->filterRelatedPages($query, 'images', 'uploaded_to');
|
||||
$images = $images->orderBy('created_at', 'desc')->skip($pageSize * $page)->take($pageSize + 1)->get();
|
||||
$hasMore = count($images) > $pageSize;
|
||||
|
||||
@@ -65,15 +67,74 @@ class ImageRepo
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a load images paginated, filtered by image type.
|
||||
* @param string $type
|
||||
* @param int $page
|
||||
* @param int $pageSize
|
||||
* @param bool|int $userFilter
|
||||
* @return array
|
||||
*/
|
||||
public function getPaginatedByType($type, $page = 0, $pageSize = 24, $userFilter = false)
|
||||
{
|
||||
$images = $this->image->where('type', '=', strtolower($type));
|
||||
|
||||
if ($userFilter !== false) {
|
||||
$images = $images->where('created_by', '=', $userFilter);
|
||||
}
|
||||
|
||||
return $this->returnPaginated($images, $page, $pageSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for images by query, of a particular type.
|
||||
* @param string $type
|
||||
* @param int $page
|
||||
* @param int $pageSize
|
||||
* @param string $searchTerm
|
||||
* @return array
|
||||
*/
|
||||
public function searchPaginatedByType($type, $page = 0, $pageSize = 24, $searchTerm)
|
||||
{
|
||||
$images = $this->image->where('type', '=', strtolower($type))->where('name', 'LIKE', '%' . $searchTerm . '%');
|
||||
return $this->returnPaginated($images, $page, $pageSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get gallery images with a particular filter criteria such as
|
||||
* being within the current book or page.
|
||||
* @param int $pagination
|
||||
* @param int $pageSize
|
||||
* @param $filter
|
||||
* @param $pageId
|
||||
* @return array
|
||||
*/
|
||||
public function getGalleryFiltered($pagination = 0, $pageSize = 24, $filter, $pageId)
|
||||
{
|
||||
$images = $this->image->where('type', '=', 'gallery');
|
||||
|
||||
$page = $this->page->findOrFail($pageId);
|
||||
|
||||
if ($filter === 'page') {
|
||||
$images = $images->where('uploaded_to', '=', $page->id);
|
||||
} elseif ($filter === 'book') {
|
||||
$validPageIds = $page->book->pages->pluck('id')->toArray();
|
||||
$images = $images->whereIn('uploaded_to', $validPageIds);
|
||||
}
|
||||
|
||||
return $this->returnPaginated($images, $pagination, $pageSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a new image into storage and return the new image.
|
||||
* @param UploadedFile $uploadFile
|
||||
* @param string $type
|
||||
* @param string $type
|
||||
* @param int $uploadedTo
|
||||
* @return Image
|
||||
*/
|
||||
public function saveNew(UploadedFile $uploadFile, $type)
|
||||
public function saveNew(UploadedFile $uploadFile, $type, $uploadedTo = 0)
|
||||
{
|
||||
$image = $this->imageService->saveNewFromUpload($uploadFile, $type);
|
||||
$image = $this->imageService->saveNewFromUpload($uploadFile, $type, $uploadedTo);
|
||||
$this->loadThumbs($image);
|
||||
return $image;
|
||||
}
|
||||
@@ -123,9 +184,9 @@ class ImageRepo
|
||||
* Checks the cache then storage to avoid creating / accessing the filesystem on every check.
|
||||
*
|
||||
* @param Image $image
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
* @param bool $keepRatio
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
* @param bool $keepRatio
|
||||
* @return string
|
||||
*/
|
||||
public function getThumbnail(Image $image, $width = 220, $height = 220, $keepRatio = false)
|
||||
|
||||
@@ -1,59 +1,53 @@
|
||||
<?php namespace BookStack\Repos;
|
||||
|
||||
|
||||
use Activity;
|
||||
use BookStack\Book;
|
||||
use BookStack\Chapter;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use BookStack\Exceptions\NotFoundException;
|
||||
use Carbon\Carbon;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Str;
|
||||
use BookStack\Page;
|
||||
use BookStack\PageRevision;
|
||||
|
||||
class PageRepo
|
||||
class PageRepo extends EntityRepo
|
||||
{
|
||||
protected $page;
|
||||
|
||||
protected $pageRevision;
|
||||
|
||||
/**
|
||||
* PageRepo constructor.
|
||||
* @param Page $page
|
||||
* @param PageRevision $pageRevision
|
||||
*/
|
||||
public function __construct(Page $page, PageRevision $pageRevision)
|
||||
public function __construct(PageRevision $pageRevision)
|
||||
{
|
||||
$this->page = $page;
|
||||
$this->pageRevision = $pageRevision;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a page id exists.
|
||||
* @param $id
|
||||
* @return bool
|
||||
* Base query for getting pages, Takes restrictions into account.
|
||||
* @param bool $allowDrafts
|
||||
* @return mixed
|
||||
*/
|
||||
public function idExists($id)
|
||||
private function pageQuery($allowDrafts = false)
|
||||
{
|
||||
return $this->page->where('page_id', '=', $id)->count() > 0;
|
||||
$query = $this->restrictionService->enforcePageRestrictions($this->page, 'view');
|
||||
if (!$allowDrafts) {
|
||||
$query = $query->where('draft', '=', false);
|
||||
}
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a page via a specific ID.
|
||||
* @param $id
|
||||
* @param bool $allowDrafts
|
||||
* @return mixed
|
||||
*/
|
||||
public function getById($id)
|
||||
public function getById($id, $allowDrafts = false)
|
||||
{
|
||||
return $this->page->findOrFail($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all pages.
|
||||
* @return \Illuminate\Database\Eloquent\Collection|static[]
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
return $this->page->all();
|
||||
return $this->pageQuery($allowDrafts)->findOrFail($id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -61,15 +55,37 @@ class PageRepo
|
||||
* @param $slug
|
||||
* @param $bookId
|
||||
* @return mixed
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
public function getBySlug($slug, $bookId)
|
||||
{
|
||||
$page = $this->page->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
|
||||
if ($page === null) abort(404);
|
||||
$page = $this->pageQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
|
||||
if ($page === null) throw new NotFoundException('Page not found');
|
||||
return $page;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search through page revisions and retrieve
|
||||
* the last page in the current book that
|
||||
* has a slug equal to the one given.
|
||||
* @param $pageSlug
|
||||
* @param $bookSlug
|
||||
* @return null | Page
|
||||
*/
|
||||
public function findPageUsingOldSlug($pageSlug, $bookSlug)
|
||||
{
|
||||
$revision = $this->pageRevision->where('slug', '=', $pageSlug)
|
||||
->whereHas('page', function ($query) {
|
||||
$this->restrictionService->enforcePageRestrictions($query);
|
||||
})
|
||||
->where('type', '=', 'version')
|
||||
->where('book_slug', '=', $bookSlug)->orderBy('created_at', 'desc')
|
||||
->with('page')->first();
|
||||
return $revision !== null ? $revision->page : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a new Page instance from the given input.
|
||||
* @param $input
|
||||
* @return Page
|
||||
*/
|
||||
@@ -94,8 +110,8 @@ class PageRepo
|
||||
* Save a new page into the system.
|
||||
* Input validation must be done beforehand.
|
||||
* @param array $input
|
||||
* @param Book $book
|
||||
* @param int $chapterId
|
||||
* @param Book $book
|
||||
* @param int $chapterId
|
||||
* @return Page
|
||||
*/
|
||||
public function saveNew(array $input, Book $book, $chapterId = null)
|
||||
@@ -114,6 +130,47 @@ class PageRepo
|
||||
return $page;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Publish a draft page to make it a normal page.
|
||||
* Sets the slug and updates the content.
|
||||
* @param Page $draftPage
|
||||
* @param array $input
|
||||
* @return Page
|
||||
*/
|
||||
public function publishDraft(Page $draftPage, array $input)
|
||||
{
|
||||
$draftPage->fill($input);
|
||||
|
||||
$draftPage->slug = $this->findSuitableSlug($draftPage->name, $draftPage->book->id);
|
||||
$draftPage->html = $this->formatHtml($input['html']);
|
||||
$draftPage->text = strip_tags($draftPage->html);
|
||||
$draftPage->draft = false;
|
||||
|
||||
$draftPage->save();
|
||||
return $draftPage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a new draft page instance.
|
||||
* @param Book $book
|
||||
* @param Chapter|bool $chapter
|
||||
* @return static
|
||||
*/
|
||||
public function getDraftPage(Book $book, $chapter = false)
|
||||
{
|
||||
$page = $this->page->newInstance();
|
||||
$page->name = 'New Page';
|
||||
$page->created_by = auth()->user()->id;
|
||||
$page->updated_by = auth()->user()->id;
|
||||
$page->draft = true;
|
||||
|
||||
if ($chapter) $page->chapter_id = $chapter->id;
|
||||
|
||||
$book->pages()->save($page);
|
||||
return $page;
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a page's html to be tagged correctly
|
||||
* within the system.
|
||||
@@ -122,24 +179,23 @@ class PageRepo
|
||||
*/
|
||||
protected function formatHtml($htmlText)
|
||||
{
|
||||
if($htmlText == '') return $htmlText;
|
||||
if ($htmlText == '') return $htmlText;
|
||||
libxml_use_internal_errors(true);
|
||||
$doc = new \DOMDocument();
|
||||
$doc->loadHTML($htmlText);
|
||||
$doc = new DOMDocument();
|
||||
$doc->loadHTML(mb_convert_encoding($htmlText, 'HTML-ENTITIES', 'UTF-8'));
|
||||
|
||||
$container = $doc->documentElement;
|
||||
$body = $container->childNodes->item(0);
|
||||
$childNodes = $body->childNodes;
|
||||
|
||||
// Ensure no duplicate ids are used
|
||||
$lastId = false;
|
||||
$idArray = [];
|
||||
|
||||
foreach ($childNodes as $index => $childNode) {
|
||||
/** @var \DOMElement $childNode */
|
||||
if (get_class($childNode) !== 'DOMElement') continue;
|
||||
|
||||
// Overwrite id if not a bookstack custom id
|
||||
// Overwrite id if not a BookStack custom id
|
||||
if ($childNode->hasAttribute('id')) {
|
||||
$id = $childNode->getAttribute('id');
|
||||
if (strpos($id, 'bkmrk') === 0 && array_search($id, $idArray) === false) {
|
||||
@@ -149,13 +205,18 @@ class PageRepo
|
||||
}
|
||||
|
||||
// Create an unique id for the element
|
||||
do {
|
||||
$id = 'bkmrk-' . substr(uniqid(), -5);
|
||||
} while ($id == $lastId);
|
||||
$lastId = $id;
|
||||
// Uses the content as a basis to ensure output is the same every time
|
||||
// the same content is passed through.
|
||||
$contentId = 'bkmrk-' . substr(strtolower(preg_replace('/\s+/', '-', trim($childNode->nodeValue))), 0, 20);
|
||||
$newId = urlencode($contentId);
|
||||
$loopIndex = 0;
|
||||
while (in_array($newId, $idArray)) {
|
||||
$newId = urlencode($contentId . '-' . $loopIndex);
|
||||
$loopIndex++;
|
||||
}
|
||||
|
||||
$childNode->setAttribute('id', $id);
|
||||
$idArray[] = $id;
|
||||
$childNode->setAttribute('id', $newId);
|
||||
$idArray[] = $newId;
|
||||
}
|
||||
|
||||
// Generate inner html as a string
|
||||
@@ -171,14 +232,17 @@ class PageRepo
|
||||
/**
|
||||
* Gets pages by a search term.
|
||||
* Highlights page content for showing in results.
|
||||
* @param string $term
|
||||
* @param string $term
|
||||
* @param array $whereTerms
|
||||
* @param int $count
|
||||
* @param array $paginationAppends
|
||||
* @return mixed
|
||||
*/
|
||||
public function getBySearch($term, $whereTerms = [])
|
||||
public function getBySearch($term, $whereTerms = [], $count = 20, $paginationAppends = [])
|
||||
{
|
||||
$terms = explode(' ', $term);
|
||||
$pages = $this->page->fullTextSearch(['name', 'text'], $terms, $whereTerms);
|
||||
$terms = $this->prepareSearchTerms($term);
|
||||
$pages = $this->restrictionService->enforcePageRestrictions($this->page->fullTextSearchQuery(['name', 'text'], $terms, $whereTerms))
|
||||
->paginate($count)->appends($paginationAppends);
|
||||
|
||||
// Add highlights to page text.
|
||||
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
|
||||
@@ -215,7 +279,7 @@ class PageRepo
|
||||
*/
|
||||
public function searchForImage($imageString)
|
||||
{
|
||||
$pages = $this->page->where('html', 'like', '%' . $imageString . '%')->get();
|
||||
$pages = $this->pageQuery()->where('html', 'like', '%' . $imageString . '%')->get();
|
||||
foreach ($pages as $page) {
|
||||
$page->url = $page->getUrl();
|
||||
$page->html = '';
|
||||
@@ -226,8 +290,8 @@ class PageRepo
|
||||
|
||||
/**
|
||||
* Updates a page with any fillable data and saves it into the database.
|
||||
* @param Page $page
|
||||
* @param int $book_id
|
||||
* @param Page $page
|
||||
* @param int $book_id
|
||||
* @param string $input
|
||||
* @return Page
|
||||
*/
|
||||
@@ -238,13 +302,23 @@ class PageRepo
|
||||
$this->saveRevision($page);
|
||||
}
|
||||
|
||||
// Prevent slug being updated if no name change
|
||||
if ($page->name !== $input['name']) {
|
||||
$page->slug = $this->findSuitableSlug($input['name'], $book_id, $page->id);
|
||||
}
|
||||
|
||||
// Update with new details
|
||||
$userId = auth()->user()->id;
|
||||
$page->fill($input);
|
||||
$page->slug = $this->findSuitableSlug($page->name, $book_id, $page->id);
|
||||
$page->html = $this->formatHtml($input['html']);
|
||||
$page->text = strip_tags($page->html);
|
||||
$page->updated_by = auth()->user()->id;
|
||||
if (setting('app-editor') !== 'markdown') $page->markdown = '';
|
||||
$page->updated_by = $userId;
|
||||
$page->save();
|
||||
|
||||
// Remove all update drafts for this user & page.
|
||||
$this->userUpdateDraftsQuery($page, $userId)->delete();
|
||||
|
||||
return $page;
|
||||
}
|
||||
|
||||
@@ -275,9 +349,13 @@ class PageRepo
|
||||
public function saveRevision(Page $page)
|
||||
{
|
||||
$revision = $this->pageRevision->fill($page->toArray());
|
||||
if (setting('app-editor') !== 'markdown') $revision->markdown = '';
|
||||
$revision->page_id = $page->id;
|
||||
$revision->slug = $page->slug;
|
||||
$revision->book_slug = $page->book->slug;
|
||||
$revision->created_by = auth()->user()->id;
|
||||
$revision->created_at = $page->updated_at;
|
||||
$revision->type = 'version';
|
||||
$revision->save();
|
||||
// Clear old revisions
|
||||
if ($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) {
|
||||
@@ -287,6 +365,155 @@ class PageRepo
|
||||
return $revision;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a page update draft.
|
||||
* @param Page $page
|
||||
* @param array $data
|
||||
* @return PageRevision
|
||||
*/
|
||||
public function saveUpdateDraft(Page $page, $data = [])
|
||||
{
|
||||
$userId = auth()->user()->id;
|
||||
$drafts = $this->userUpdateDraftsQuery($page, $userId)->get();
|
||||
|
||||
if ($drafts->count() > 0) {
|
||||
$draft = $drafts->first();
|
||||
} else {
|
||||
$draft = $this->pageRevision->newInstance();
|
||||
$draft->page_id = $page->id;
|
||||
$draft->slug = $page->slug;
|
||||
$draft->book_slug = $page->book->slug;
|
||||
$draft->created_by = $userId;
|
||||
$draft->type = 'update_draft';
|
||||
}
|
||||
|
||||
$draft->fill($data);
|
||||
if (setting('app-editor') !== 'markdown') $draft->markdown = '';
|
||||
|
||||
$draft->save();
|
||||
return $draft;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a draft page.
|
||||
* @param Page $page
|
||||
* @param array $data
|
||||
* @return Page
|
||||
*/
|
||||
public function updateDraftPage(Page $page, $data = [])
|
||||
{
|
||||
$page->fill($data);
|
||||
|
||||
if (isset($data['html'])) {
|
||||
$page->text = strip_tags($data['html']);
|
||||
}
|
||||
|
||||
$page->save();
|
||||
return $page;
|
||||
}
|
||||
|
||||
/**
|
||||
* The base query for getting user update drafts.
|
||||
* @param Page $page
|
||||
* @param $userId
|
||||
* @return mixed
|
||||
*/
|
||||
private function userUpdateDraftsQuery(Page $page, $userId)
|
||||
{
|
||||
return $this->pageRevision->where('created_by', '=', $userId)
|
||||
->where('type', 'update_draft')
|
||||
->where('page_id', '=', $page->id)
|
||||
->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a user has a draft version of a particular page or not.
|
||||
* @param Page $page
|
||||
* @param $userId
|
||||
* @return bool
|
||||
*/
|
||||
public function hasUserGotPageDraft(Page $page, $userId)
|
||||
{
|
||||
return $this->userUpdateDraftsQuery($page, $userId)->count() > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest updated draft revision for a particular page and user.
|
||||
* @param Page $page
|
||||
* @param $userId
|
||||
* @return mixed
|
||||
*/
|
||||
public function getUserPageDraft(Page $page, $userId)
|
||||
{
|
||||
return $this->userUpdateDraftsQuery($page, $userId)->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the notification message that informs the user that they are editing a draft page.
|
||||
* @param PageRevision $draft
|
||||
* @return string
|
||||
*/
|
||||
public function getUserPageDraftMessage(PageRevision $draft)
|
||||
{
|
||||
$message = 'You are currently editing a draft that was last saved ' . $draft->updated_at->diffForHumans() . '.';
|
||||
if ($draft->page->updated_at->timestamp > $draft->updated_at->timestamp) {
|
||||
$message .= "\n This page has been updated by since that time. It is recommended that you discard this draft.";
|
||||
}
|
||||
return $message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a page is being actively editing.
|
||||
* Checks for edits since last page updated.
|
||||
* Passing in a minuted range will check for edits
|
||||
* within the last x minutes.
|
||||
* @param Page $page
|
||||
* @param null $minRange
|
||||
* @return bool
|
||||
*/
|
||||
public function isPageEditingActive(Page $page, $minRange = null)
|
||||
{
|
||||
$draftSearch = $this->activePageEditingQuery($page, $minRange);
|
||||
return $draftSearch->count() > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a notification message concerning the editing activity on
|
||||
* a particular page.
|
||||
* @param Page $page
|
||||
* @param null $minRange
|
||||
* @return string
|
||||
*/
|
||||
public function getPageEditingActiveMessage(Page $page, $minRange = null)
|
||||
{
|
||||
$pageDraftEdits = $this->activePageEditingQuery($page, $minRange)->get();
|
||||
$userMessage = $pageDraftEdits->count() > 1 ? $pageDraftEdits->count() . ' users have' : $pageDraftEdits->first()->createdBy->name . ' has';
|
||||
$timeMessage = $minRange === null ? 'since the page was last updated' : 'in the last ' . $minRange . ' minutes';
|
||||
$message = '%s started editing this page %s. Take care not to overwrite each other\'s updates!';
|
||||
return sprintf($message, $userMessage, $timeMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* A query to check for active update drafts on a particular page.
|
||||
* @param Page $page
|
||||
* @param null $minRange
|
||||
* @return mixed
|
||||
*/
|
||||
private function activePageEditingQuery(Page $page, $minRange = null)
|
||||
{
|
||||
$query = $this->pageRevision->where('type', '=', 'update_draft')
|
||||
->where('page_id', '=', $page->id)
|
||||
->where('updated_at', '>', $page->updated_at)
|
||||
->where('created_by', '!=', auth()->user()->id)
|
||||
->with('createdBy');
|
||||
|
||||
if ($minRange !== null) {
|
||||
$query = $query->where('updated_at', '>=', Carbon::now()->subMinutes($minRange));
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a single revision via it's id.
|
||||
* @param $id
|
||||
@@ -314,7 +541,7 @@ class PageRepo
|
||||
/**
|
||||
* Changes the related book for the specified page.
|
||||
* Changes the book id of any relations to the page that store the book id.
|
||||
* @param int $bookId
|
||||
* @param int $bookId
|
||||
* @param Page $page
|
||||
* @return Page
|
||||
*/
|
||||
@@ -355,8 +582,26 @@ class PageRepo
|
||||
Activity::removeEntity($page);
|
||||
$page->views()->delete();
|
||||
$page->revisions()->delete();
|
||||
$page->restrictions()->delete();
|
||||
$page->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest pages added to the system.
|
||||
* @param $count
|
||||
*/
|
||||
public function getRecentlyCreatedPaginated($count = 20)
|
||||
{
|
||||
return $this->pageQuery()->orderBy('created_at', 'desc')->paginate($count);
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Get the latest pages added to the system.
|
||||
* @param $count
|
||||
*/
|
||||
public function getRecentlyUpdatedPaginated($count = 20)
|
||||
{
|
||||
return $this->pageQuery()->orderBy('updated_at', 'desc')->paginate($count);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
142
app/Repos/PermissionsRepo.php
Normal file
142
app/Repos/PermissionsRepo.php
Normal file
@@ -0,0 +1,142 @@
|
||||
<?php namespace BookStack\Repos;
|
||||
|
||||
|
||||
use BookStack\Exceptions\PermissionsException;
|
||||
use BookStack\Permission;
|
||||
use BookStack\Role;
|
||||
use Setting;
|
||||
|
||||
class PermissionsRepo
|
||||
{
|
||||
|
||||
protected $permission;
|
||||
protected $role;
|
||||
|
||||
/**
|
||||
* PermissionsRepo constructor.
|
||||
* @param $permission
|
||||
* @param $role
|
||||
*/
|
||||
public function __construct(Permission $permission, Role $role)
|
||||
{
|
||||
$this->permission = $permission;
|
||||
$this->role = $role;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the user roles from the system.
|
||||
* @return \Illuminate\Database\Eloquent\Collection|static[]
|
||||
*/
|
||||
public function getAllRoles()
|
||||
{
|
||||
return $this->role->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the roles except for the provided one.
|
||||
* @param Role $role
|
||||
* @return mixed
|
||||
*/
|
||||
public function getAllRolesExcept(Role $role)
|
||||
{
|
||||
return $this->role->where('id', '!=', $role->id)->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a role via its ID.
|
||||
* @param $id
|
||||
* @return mixed
|
||||
*/
|
||||
public function getRoleById($id)
|
||||
{
|
||||
return $this->role->findOrFail($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a new role into the system.
|
||||
* @param array $roleData
|
||||
* @return Role
|
||||
*/
|
||||
public function saveNewRole($roleData)
|
||||
{
|
||||
$role = $this->role->newInstance($roleData);
|
||||
$role->name = str_replace(' ', '-', strtolower($roleData['display_name']));
|
||||
// Prevent duplicate names
|
||||
while ($this->role->where('name', '=', $role->name)->count() > 0) {
|
||||
$role->name .= strtolower(str_random(2));
|
||||
}
|
||||
$role->save();
|
||||
|
||||
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
|
||||
$this->assignRolePermissions($role, $permissions);
|
||||
return $role;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an existing role.
|
||||
* Ensure Admin role always has all permissions.
|
||||
* @param $roleId
|
||||
* @param $roleData
|
||||
*/
|
||||
public function updateRole($roleId, $roleData)
|
||||
{
|
||||
$role = $this->role->findOrFail($roleId);
|
||||
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
|
||||
$this->assignRolePermissions($role, $permissions);
|
||||
|
||||
if ($role->name === 'admin') {
|
||||
$permissions = $this->permission->all()->pluck('id')->toArray();
|
||||
$role->permissions()->sync($permissions);
|
||||
}
|
||||
|
||||
$role->fill($roleData);
|
||||
$role->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign an list of permission names to an role.
|
||||
* @param Role $role
|
||||
* @param array $permissionNameArray
|
||||
*/
|
||||
public function assignRolePermissions(Role $role, $permissionNameArray = [])
|
||||
{
|
||||
$permissions = [];
|
||||
$permissionNameArray = array_values($permissionNameArray);
|
||||
if ($permissionNameArray && count($permissionNameArray) > 0) {
|
||||
$permissions = $this->permission->whereIn('name', $permissionNameArray)->pluck('id')->toArray();
|
||||
}
|
||||
$role->permissions()->sync($permissions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a role from the system.
|
||||
* Check it's not an admin role or set as default before deleting.
|
||||
* If an migration Role ID is specified the users assign to the current role
|
||||
* will be added to the role of the specified id.
|
||||
* @param $roleId
|
||||
* @param $migrateRoleId
|
||||
* @throws PermissionsException
|
||||
*/
|
||||
public function deleteRole($roleId, $migrateRoleId)
|
||||
{
|
||||
$role = $this->role->findOrFail($roleId);
|
||||
|
||||
// Prevent deleting admin role or default registration role.
|
||||
if ($role->name === 'admin') {
|
||||
throw new PermissionsException('The admin role cannot be deleted');
|
||||
} else if ($role->id == setting('registration-role')) {
|
||||
throw new PermissionsException('This role cannot be deleted while set as the default registration role.');
|
||||
}
|
||||
|
||||
if ($migrateRoleId) {
|
||||
$newRole = $this->role->find($migrateRoleId);
|
||||
if ($newRole) {
|
||||
$users = $role->users->pluck('id')->toArray();
|
||||
$newRole->users()->sync($users);
|
||||
}
|
||||
}
|
||||
|
||||
$role->delete();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
<?php namespace BookStack\Repos;
|
||||
|
||||
|
||||
use BookStack\Role;
|
||||
use BookStack\User;
|
||||
use Setting;
|
||||
@@ -10,15 +9,19 @@ class UserRepo
|
||||
|
||||
protected $user;
|
||||
protected $role;
|
||||
protected $entityRepo;
|
||||
|
||||
/**
|
||||
* UserRepo constructor.
|
||||
* @param $user
|
||||
* @param User $user
|
||||
* @param Role $role
|
||||
* @param EntityRepo $entityRepo
|
||||
*/
|
||||
public function __construct(User $user, Role $role)
|
||||
public function __construct(User $user, Role $role, EntityRepo $entityRepo)
|
||||
{
|
||||
$this->user = $user;
|
||||
$this->role = $role;
|
||||
$this->entityRepo = $entityRepo;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -39,6 +42,15 @@ class UserRepo
|
||||
return $this->user->findOrFail($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the users with their permissions.
|
||||
* @return \Illuminate\Database\Eloquent\Builder|static
|
||||
*/
|
||||
public function getAllUsers()
|
||||
{
|
||||
return $this->user->with('roles', 'avatar')->orderBy('name', 'asc')->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new user and attaches a role to them.
|
||||
* @param array $data
|
||||
@@ -65,8 +77,8 @@ class UserRepo
|
||||
*/
|
||||
public function attachDefaultRole($user)
|
||||
{
|
||||
$roleId = Setting::get('registration-role');
|
||||
if ($roleId === false) $roleId = $this->role->getDefault()->id;
|
||||
$roleId = setting('registration-role');
|
||||
if ($roleId === false) $roleId = $this->role->first()->id;
|
||||
$user->attachRoleId($roleId);
|
||||
}
|
||||
|
||||
@@ -77,15 +89,10 @@ class UserRepo
|
||||
*/
|
||||
public function isOnlyAdmin(User $user)
|
||||
{
|
||||
if ($user->role->name != 'admin') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$adminRole = $this->role->where('name', '=', 'admin')->first();
|
||||
if (count($adminRole->users) > 1) {
|
||||
return false;
|
||||
}
|
||||
if (!$user->roles->pluck('name')->contains('admin')) return false;
|
||||
|
||||
$adminRole = $this->role->getRole('admin');
|
||||
if ($adminRole->users->count() > 1) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -99,7 +106,8 @@ class UserRepo
|
||||
return $this->user->forceCreate([
|
||||
'name' => $data['name'],
|
||||
'email' => $data['email'],
|
||||
'password' => bcrypt($data['password'])
|
||||
'password' => bcrypt($data['password']),
|
||||
'email_confirmed' => false
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -112,4 +120,62 @@ class UserRepo
|
||||
$user->socialAccounts()->delete();
|
||||
$user->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest activity for a user.
|
||||
* @param User $user
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @return array
|
||||
*/
|
||||
public function getActivity(User $user, $count = 20, $page = 0)
|
||||
{
|
||||
return \Activity::userActivity($user, $count, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the recently created content for this given user.
|
||||
* @param User $user
|
||||
* @param int $count
|
||||
* @return mixed
|
||||
*/
|
||||
public function getRecentlyCreated(User $user, $count = 20)
|
||||
{
|
||||
return [
|
||||
'pages' => $this->entityRepo->getRecentlyCreatedPages($count, 0, function ($query) use ($user) {
|
||||
$query->where('created_by', '=', $user->id);
|
||||
}),
|
||||
'chapters' => $this->entityRepo->getRecentlyCreatedChapters($count, 0, function ($query) use ($user) {
|
||||
$query->where('created_by', '=', $user->id);
|
||||
}),
|
||||
'books' => $this->entityRepo->getRecentlyCreatedBooks($count, 0, function ($query) use ($user) {
|
||||
$query->where('created_by', '=', $user->id);
|
||||
})
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get asset created counts for the give user.
|
||||
* @param User $user
|
||||
* @return array
|
||||
*/
|
||||
public function getAssetCounts(User $user)
|
||||
{
|
||||
return [
|
||||
'pages' => $this->entityRepo->page->where('created_by', '=', $user->id)->count(),
|
||||
'chapters' => $this->entityRepo->chapter->where('created_by', '=', $user->id)->count(),
|
||||
'books' => $this->entityRepo->book->where('created_by', '=', $user->id)->count(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the roles which can be given restricted access to
|
||||
* other entities in the system.
|
||||
* @return mixed
|
||||
*/
|
||||
public function getRestrictableRoles()
|
||||
{
|
||||
return $this->role->where('name', '!=', 'admin')->get();
|
||||
}
|
||||
|
||||
}
|
||||
21
app/Restriction.php
Normal file
21
app/Restriction.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace BookStack;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Restriction extends Model
|
||||
{
|
||||
|
||||
protected $fillable = ['role_id', 'action'];
|
||||
public $timestamps = false;
|
||||
|
||||
/**
|
||||
* Get all this restriction's attached entity.
|
||||
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
|
||||
*/
|
||||
public function restrictable()
|
||||
{
|
||||
return $this->morphTo();
|
||||
}
|
||||
}
|
||||
24
app/Role.php
24
app/Role.php
@@ -6,11 +6,8 @@ use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Role extends Model
|
||||
{
|
||||
/**
|
||||
* Sets the default role name for newly registered users.
|
||||
* @var string
|
||||
*/
|
||||
protected static $default = 'viewer';
|
||||
|
||||
protected $fillable = ['display_name', 'description'];
|
||||
|
||||
/**
|
||||
* The roles that belong to the role.
|
||||
@@ -28,6 +25,15 @@ class Role extends Model
|
||||
return $this->belongsToMany('BookStack\Permission');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this role has a permission.
|
||||
* @param $permission
|
||||
*/
|
||||
public function hasPermission($permission)
|
||||
{
|
||||
return $this->permissions->pluck('name')->contains($permission);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a permission to this role.
|
||||
* @param Permission $permission
|
||||
@@ -38,12 +44,12 @@ class Role extends Model
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an instance of the default role.
|
||||
* @return Role
|
||||
* Detach a single permission from this role.
|
||||
* @param Permission $permission
|
||||
*/
|
||||
public static function getDefault()
|
||||
public function detachPermission(Permission $permission)
|
||||
{
|
||||
return static::getRole(static::$default);
|
||||
$this->permissions()->detach($permission->id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?php namespace BookStack\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use BookStack\Activity;
|
||||
use BookStack\Entity;
|
||||
use Session;
|
||||
@@ -9,14 +8,17 @@ class ActivityService
|
||||
{
|
||||
protected $activity;
|
||||
protected $user;
|
||||
protected $restrictionService;
|
||||
|
||||
/**
|
||||
* ActivityService constructor.
|
||||
* @param $activity
|
||||
* @param Activity $activity
|
||||
* @param RestrictionService $restrictionService
|
||||
*/
|
||||
public function __construct(Activity $activity)
|
||||
public function __construct(Activity $activity, RestrictionService $restrictionService)
|
||||
{
|
||||
$this->activity = $activity;
|
||||
$this->restrictionService = $restrictionService;
|
||||
$this->user = auth()->user();
|
||||
}
|
||||
|
||||
@@ -24,25 +26,26 @@ class ActivityService
|
||||
* Add activity data to database.
|
||||
* @param Entity $entity
|
||||
* @param $activityKey
|
||||
* @param int $bookId
|
||||
* @param bool $extra
|
||||
* @param int $bookId
|
||||
* @param bool $extra
|
||||
*/
|
||||
public function add(Entity $entity, $activityKey, $bookId = 0, $extra = false)
|
||||
{
|
||||
$this->activity->user_id = $this->user->id;
|
||||
$this->activity->book_id = $bookId;
|
||||
$this->activity->key = strtolower($activityKey);
|
||||
$activity = $this->activity->newInstance();
|
||||
$activity->user_id = $this->user->id;
|
||||
$activity->book_id = $bookId;
|
||||
$activity->key = strtolower($activityKey);
|
||||
if ($extra !== false) {
|
||||
$this->activity->extra = $extra;
|
||||
$activity->extra = $extra;
|
||||
}
|
||||
$entity->activity()->save($this->activity);
|
||||
$entity->activity()->save($activity);
|
||||
$this->setNotification($activityKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a activity history with a message & without binding to a entitiy.
|
||||
* Adds a activity history with a message & without binding to a entity.
|
||||
* @param $activityKey
|
||||
* @param int $bookId
|
||||
* @param int $bookId
|
||||
* @param bool|false $extra
|
||||
*/
|
||||
public function addMessage($activityKey, $bookId = 0, $extra = false)
|
||||
@@ -85,20 +88,22 @@ class ActivityService
|
||||
*/
|
||||
public function latest($count = 20, $page = 0)
|
||||
{
|
||||
$activityList = $this->activity->orderBy('created_at', 'desc')
|
||||
->skip($count * $page)->take($count)->get();
|
||||
$activityList = $this->restrictionService
|
||||
->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
|
||||
->orderBy('created_at', 'desc')->skip($count * $page)->take($count)->get();
|
||||
|
||||
return $this->filterSimilar($activityList);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the latest activity for an entitiy, Filtering out similar
|
||||
* Gets the latest activity for an entity, Filtering out similar
|
||||
* items to prevent a message activity list.
|
||||
* @param Entity $entity
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @return array
|
||||
*/
|
||||
function entityActivity($entity, $count = 20, $page = 0)
|
||||
public function entityActivity($entity, $count = 20, $page = 0)
|
||||
{
|
||||
$activity = $entity->hasMany('BookStack\Activity')->orderBy('created_at', 'desc')
|
||||
->skip($count * $page)->take($count)->get();
|
||||
@@ -107,15 +112,31 @@ class ActivityService
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters out similar activity.
|
||||
* @param Activity[] $activity
|
||||
* Get latest activity for a user, Filtering out similar
|
||||
* items.
|
||||
* @param $user
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @return array
|
||||
*/
|
||||
protected function filterSimilar($activity)
|
||||
public function userActivity($user, $count = 20, $page = 0)
|
||||
{
|
||||
$activityList = $this->restrictionService
|
||||
->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
|
||||
->orderBy('created_at', 'desc')->where('user_id', '=', $user->id)->skip($count * $page)->take($count)->get();
|
||||
return $this->filterSimilar($activityList);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters out similar activity.
|
||||
* @param Activity[] $activities
|
||||
* @return array
|
||||
*/
|
||||
protected function filterSimilar($activities)
|
||||
{
|
||||
$newActivity = [];
|
||||
$previousItem = false;
|
||||
foreach ($activity as $activityItem) {
|
||||
foreach ($activities as $activityItem) {
|
||||
if ($previousItem === false) {
|
||||
$previousItem = $activityItem;
|
||||
$newActivity[] = $activityItem;
|
||||
|
||||
@@ -45,7 +45,7 @@ class EmailConfirmationService
|
||||
'token' => $token,
|
||||
]);
|
||||
$this->mailer->send('emails/email-confirmation', ['token' => $token], function (Message $message) use ($user) {
|
||||
$appName = \Setting::get('app-name', 'BookStack');
|
||||
$appName = setting('app-name', 'BookStack');
|
||||
$message->to($user->email, $user->name)->subject('Confirm your email on ' . $appName . '.');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ use BookStack\Exceptions\ImageUploadException;
|
||||
use BookStack\Image;
|
||||
use BookStack\User;
|
||||
use Exception;
|
||||
use Intervention\Image\Exception\NotSupportedException;
|
||||
use Intervention\Image\ImageManager;
|
||||
use Illuminate\Contracts\Filesystem\Factory as FileSystem;
|
||||
use Illuminate\Contracts\Filesystem\Filesystem as FileSystemInstance;
|
||||
@@ -40,14 +41,16 @@ class ImageService
|
||||
/**
|
||||
* Saves a new image from an upload.
|
||||
* @param UploadedFile $uploadedFile
|
||||
* @param string $type
|
||||
* @param string $type
|
||||
* @param int $uploadedTo
|
||||
* @return mixed
|
||||
* @throws ImageUploadException
|
||||
*/
|
||||
public function saveNewFromUpload(UploadedFile $uploadedFile, $type)
|
||||
public function saveNewFromUpload(UploadedFile $uploadedFile, $type, $uploadedTo = 0)
|
||||
{
|
||||
$imageName = $uploadedFile->getClientOriginalName();
|
||||
$imageData = file_get_contents($uploadedFile->getRealPath());
|
||||
return $this->saveNew($imageName, $imageData, $type);
|
||||
return $this->saveNew($imageName, $imageData, $type, $uploadedTo);
|
||||
}
|
||||
|
||||
|
||||
@@ -72,13 +75,14 @@ class ImageService
|
||||
* @param string $imageName
|
||||
* @param string $imageData
|
||||
* @param string $type
|
||||
* @param int $uploadedTo
|
||||
* @return Image
|
||||
* @throws ImageUploadException
|
||||
*/
|
||||
private function saveNew($imageName, $imageData, $type)
|
||||
private function saveNew($imageName, $imageData, $type, $uploadedTo = 0)
|
||||
{
|
||||
$storage = $this->getStorage();
|
||||
$secureUploads = Setting::get('app-secure-images');
|
||||
$secureUploads = setting('app-secure-images');
|
||||
$imageName = str_replace(' ', '-', $imageName);
|
||||
|
||||
if ($secureUploads) $imageName = str_random(16) . '-' . $imageName;
|
||||
@@ -99,7 +103,8 @@ class ImageService
|
||||
'name' => $imageName,
|
||||
'path' => $fullPath,
|
||||
'url' => $this->getPublicUrl($fullPath),
|
||||
'type' => $type
|
||||
'type' => $type,
|
||||
'uploaded_to' => $uploadedTo
|
||||
];
|
||||
|
||||
if (auth()->user() && auth()->user()->id !== 0) {
|
||||
@@ -119,10 +124,12 @@ class ImageService
|
||||
* Checks the cache then storage to avoid creating / accessing the filesystem on every check.
|
||||
*
|
||||
* @param Image $image
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
* @param bool $keepRatio
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
* @param bool $keepRatio
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws ImageUploadException
|
||||
*/
|
||||
public function getThumbnail(Image $image, $width = 220, $height = 220, $keepRatio = false)
|
||||
{
|
||||
@@ -139,8 +146,16 @@ class ImageService
|
||||
return $this->getPublicUrl($thumbFilePath);
|
||||
}
|
||||
|
||||
// Otherwise create the thumbnail
|
||||
$thumb = $this->imageTool->make($storage->get($image->path));
|
||||
try {
|
||||
$thumb = $this->imageTool->make($storage->get($image->path));
|
||||
} catch (Exception $e) {
|
||||
if ($e instanceof \ErrorException || $e instanceof NotSupportedException) {
|
||||
throw new ImageUploadException('The server cannot create thumbnails. Please check you have the GD PHP extension installed.');
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
if ($keepRatio) {
|
||||
$thumb->resize($width, null, function ($constraint) {
|
||||
$constraint->aspectRatio();
|
||||
|
||||
@@ -46,7 +46,7 @@ class LdapService
|
||||
|
||||
$user = $users[0];
|
||||
return [
|
||||
'uid' => $user['uid'][0],
|
||||
'uid' => (isset($user['uid'])) ? $user['uid'][0] : $user['dn'],
|
||||
'name' => $user['cn'][0],
|
||||
'dn' => $user['dn'],
|
||||
'email' => (isset($user['mail'])) ? $user['mail'][0] : null
|
||||
|
||||
326
app/Services/RestrictionService.php
Normal file
326
app/Services/RestrictionService.php
Normal file
@@ -0,0 +1,326 @@
|
||||
<?php namespace BookStack\Services;
|
||||
|
||||
use BookStack\Entity;
|
||||
|
||||
class RestrictionService
|
||||
{
|
||||
|
||||
protected $userRoles;
|
||||
protected $isAdmin;
|
||||
protected $currentAction;
|
||||
protected $currentUser;
|
||||
|
||||
/**
|
||||
* RestrictionService constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->currentUser = auth()->user();
|
||||
$this->userRoles = $this->currentUser ? $this->currentUser->roles->pluck('id') : [];
|
||||
$this->isAdmin = $this->currentUser ? $this->currentUser->hasRole('admin') : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an entity has a restriction set upon it.
|
||||
* @param Entity $entity
|
||||
* @param $action
|
||||
* @return bool
|
||||
*/
|
||||
public function checkIfEntityRestricted(Entity $entity, $action)
|
||||
{
|
||||
if ($this->isAdmin) return true;
|
||||
$this->currentAction = $action;
|
||||
$baseQuery = $entity->where('id', '=', $entity->id);
|
||||
if ($entity->isA('page')) {
|
||||
return $this->pageRestrictionQuery($baseQuery)->count() > 0;
|
||||
} elseif ($entity->isA('chapter')) {
|
||||
return $this->chapterRestrictionQuery($baseQuery)->count() > 0;
|
||||
} elseif ($entity->isA('book')) {
|
||||
return $this->bookRestrictionQuery($baseQuery)->count() > 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an entity has restrictions set on itself or its
|
||||
* parent tree.
|
||||
* @param Entity $entity
|
||||
* @param $action
|
||||
* @return bool|mixed
|
||||
*/
|
||||
public function checkIfRestrictionsSet(Entity $entity, $action)
|
||||
{
|
||||
$this->currentAction = $action;
|
||||
if ($entity->isA('page')) {
|
||||
return $entity->restricted || ($entity->chapter && $entity->chapter->restricted) || $entity->book->restricted;
|
||||
} elseif ($entity->isA('chapter')) {
|
||||
return $entity->restricted || $entity->book->restricted;
|
||||
} elseif ($entity->isA('book')) {
|
||||
return $entity->restricted;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add restrictions for a page query
|
||||
* @param $query
|
||||
* @param string $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function enforcePageRestrictions($query, $action = 'view')
|
||||
{
|
||||
// Prevent drafts being visible to others.
|
||||
$query = $query->where(function ($query) {
|
||||
$query->where('draft', '=', false);
|
||||
if ($this->currentUser) {
|
||||
$query->orWhere(function ($query) {
|
||||
$query->where('draft', '=', true)->where('created_by', '=', $this->currentUser->id);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if ($this->isAdmin) return $query;
|
||||
$this->currentAction = $action;
|
||||
return $this->pageRestrictionQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* The base query for restricting pages.
|
||||
* @param $query
|
||||
* @return mixed
|
||||
*/
|
||||
private function pageRestrictionQuery($query)
|
||||
{
|
||||
return $query->where(function ($parentWhereQuery) {
|
||||
|
||||
$parentWhereQuery
|
||||
// (Book & chapter & page) or (Book & page & NO CHAPTER) unrestricted
|
||||
->where(function ($query) {
|
||||
$query->where(function ($query) {
|
||||
$query->whereExists(function ($query) {
|
||||
$query->select('*')->from('chapters')
|
||||
->whereRaw('chapters.id=pages.chapter_id')
|
||||
->where('restricted', '=', false);
|
||||
})->whereExists(function ($query) {
|
||||
$query->select('*')->from('books')
|
||||
->whereRaw('books.id=pages.book_id')
|
||||
->where('restricted', '=', false);
|
||||
})->where('restricted', '=', false);
|
||||
})->orWhere(function ($query) {
|
||||
$query->where('restricted', '=', false)->where('chapter_id', '=', 0)
|
||||
->whereExists(function ($query) {
|
||||
$query->select('*')->from('books')
|
||||
->whereRaw('books.id=pages.book_id')
|
||||
->where('restricted', '=', false);
|
||||
});
|
||||
});
|
||||
})
|
||||
// Page unrestricted, Has no chapter & book has accepted restrictions
|
||||
->orWhere(function ($query) {
|
||||
$query->where('restricted', '=', false)
|
||||
->whereExists(function ($query) {
|
||||
$query->select('*')->from('chapters')
|
||||
->whereRaw('chapters.id=pages.chapter_id');
|
||||
}, 'and', true)
|
||||
->whereExists(function ($query) {
|
||||
$query->select('*')->from('books')
|
||||
->whereRaw('books.id=pages.book_id')
|
||||
->whereExists(function ($query) {
|
||||
$this->checkRestrictionsQuery($query, 'books', 'Book');
|
||||
});
|
||||
});
|
||||
})
|
||||
// Page unrestricted, Has an unrestricted chapter & book has accepted restrictions
|
||||
->orWhere(function ($query) {
|
||||
$query->where('restricted', '=', false)
|
||||
->whereExists(function ($query) {
|
||||
$query->select('*')->from('chapters')
|
||||
->whereRaw('chapters.id=pages.chapter_id')->where('restricted', '=', false);
|
||||
})
|
||||
->whereExists(function ($query) {
|
||||
$query->select('*')->from('books')
|
||||
->whereRaw('books.id=pages.book_id')
|
||||
->whereExists(function ($query) {
|
||||
$this->checkRestrictionsQuery($query, 'books', 'Book');
|
||||
});
|
||||
});
|
||||
})
|
||||
// Page unrestricted, Has a chapter with accepted permissions
|
||||
->orWhere(function ($query) {
|
||||
$query->where('restricted', '=', false)
|
||||
->whereExists(function ($query) {
|
||||
$query->select('*')->from('chapters')
|
||||
->whereRaw('chapters.id=pages.chapter_id')
|
||||
->where('restricted', '=', true)
|
||||
->whereExists(function ($query) {
|
||||
$this->checkRestrictionsQuery($query, 'chapters', 'Chapter');
|
||||
});
|
||||
});
|
||||
})
|
||||
// Page has accepted permissions
|
||||
->orWhereExists(function ($query) {
|
||||
$this->checkRestrictionsQuery($query, 'pages', 'Page');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Add on permission restrictions to a chapter query.
|
||||
* @param $query
|
||||
* @param string $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function enforceChapterRestrictions($query, $action = 'view')
|
||||
{
|
||||
if ($this->isAdmin) return $query;
|
||||
$this->currentAction = $action;
|
||||
return $this->chapterRestrictionQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* The base query for restricting chapters.
|
||||
* @param $query
|
||||
* @return mixed
|
||||
*/
|
||||
private function chapterRestrictionQuery($query)
|
||||
{
|
||||
return $query->where(function ($parentWhereQuery) {
|
||||
|
||||
$parentWhereQuery
|
||||
// Book & chapter unrestricted
|
||||
->where(function ($query) {
|
||||
$query->where('restricted', '=', false)->whereExists(function ($query) {
|
||||
$query->select('*')->from('books')
|
||||
->whereRaw('books.id=chapters.book_id')
|
||||
->where('restricted', '=', false);
|
||||
});
|
||||
})
|
||||
// Chapter unrestricted & book has accepted restrictions
|
||||
->orWhere(function ($query) {
|
||||
$query->where('restricted', '=', false)
|
||||
->whereExists(function ($query) {
|
||||
$query->select('*')->from('books')
|
||||
->whereRaw('books.id=chapters.book_id')
|
||||
->whereExists(function ($query) {
|
||||
$this->checkRestrictionsQuery($query, 'books', 'Book');
|
||||
});
|
||||
});
|
||||
})
|
||||
// Chapter has accepted permissions
|
||||
->orWhereExists(function ($query) {
|
||||
$this->checkRestrictionsQuery($query, 'chapters', 'Chapter');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Add restrictions to a book query.
|
||||
* @param $query
|
||||
* @param string $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function enforceBookRestrictions($query, $action = 'view')
|
||||
{
|
||||
if ($this->isAdmin) return $query;
|
||||
$this->currentAction = $action;
|
||||
return $this->bookRestrictionQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* The base query for restricting books.
|
||||
* @param $query
|
||||
* @return mixed
|
||||
*/
|
||||
private function bookRestrictionQuery($query)
|
||||
{
|
||||
return $query->where(function ($parentWhereQuery) {
|
||||
$parentWhereQuery
|
||||
->where('restricted', '=', false)
|
||||
->orWhere(function ($query) {
|
||||
$query->where('restricted', '=', true)->whereExists(function ($query) {
|
||||
$this->checkRestrictionsQuery($query, 'books', 'Book');
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter items that have entities set a a polymorphic relation.
|
||||
* @param $query
|
||||
* @param string $tableName
|
||||
* @param string $entityIdColumn
|
||||
* @param string $entityTypeColumn
|
||||
* @return mixed
|
||||
*/
|
||||
public function filterRestrictedEntityRelations($query, $tableName, $entityIdColumn, $entityTypeColumn)
|
||||
{
|
||||
if ($this->isAdmin) return $query;
|
||||
$this->currentAction = 'view';
|
||||
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn, 'entityTypeColumn' => $entityTypeColumn];
|
||||
return $query->where(function ($query) use ($tableDetails) {
|
||||
$query->where(function ($query) use (&$tableDetails) {
|
||||
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Page')
|
||||
->whereExists(function ($query) use (&$tableDetails) {
|
||||
$query->select('*')->from('pages')->whereRaw('pages.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
|
||||
->where(function ($query) {
|
||||
$this->pageRestrictionQuery($query);
|
||||
});
|
||||
});
|
||||
})->orWhere(function ($query) use (&$tableDetails) {
|
||||
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Book')->whereExists(function ($query) use (&$tableDetails) {
|
||||
$query->select('*')->from('books')->whereRaw('books.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
|
||||
->where(function ($query) {
|
||||
$this->bookRestrictionQuery($query);
|
||||
});
|
||||
});
|
||||
})->orWhere(function ($query) use (&$tableDetails) {
|
||||
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Chapter')->whereExists(function ($query) use (&$tableDetails) {
|
||||
$query->select('*')->from('chapters')->whereRaw('chapters.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
|
||||
->where(function ($query) {
|
||||
$this->chapterRestrictionQuery($query);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters pages that are a direct relation to another item.
|
||||
* @param $query
|
||||
* @param $tableName
|
||||
* @param $entityIdColumn
|
||||
* @return mixed
|
||||
*/
|
||||
public function filterRelatedPages($query, $tableName, $entityIdColumn)
|
||||
{
|
||||
if ($this->isAdmin) return $query;
|
||||
$this->currentAction = 'view';
|
||||
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn];
|
||||
return $query->where(function ($query) use (&$tableDetails) {
|
||||
$query->where(function ($query) use (&$tableDetails) {
|
||||
$query->whereExists(function ($query) use (&$tableDetails) {
|
||||
$query->select('*')->from('pages')->whereRaw('pages.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
|
||||
->where(function ($query) {
|
||||
$this->pageRestrictionQuery($query);
|
||||
});
|
||||
})->orWhere($tableDetails['entityIdColumn'], '=', 0);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* The query to check the restrictions on an entity.
|
||||
* @param $query
|
||||
* @param $tableName
|
||||
* @param $modelName
|
||||
*/
|
||||
private function checkRestrictionsQuery($query, $tableName, $modelName)
|
||||
{
|
||||
$query->select('*')->from('restrictions')
|
||||
->whereRaw('restrictions.restrictable_id=' . $tableName . '.id')
|
||||
->where('restrictions.restrictable_type', '=', 'BookStack\\' . $modelName)
|
||||
->where('restrictions.action', '=', $this->currentAction)
|
||||
->whereIn('restrictions.role_id', $this->userRoles);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -44,28 +44,39 @@ class SettingService
|
||||
|
||||
/**
|
||||
* Gets a setting value from the cache or database.
|
||||
* Looks at the system defaults if not cached or in database.
|
||||
* @param $key
|
||||
* @param $default
|
||||
* @return mixed
|
||||
*/
|
||||
protected function getValueFromStore($key, $default)
|
||||
{
|
||||
// Check for an overriding value
|
||||
$overrideValue = $this->getOverrideValue($key);
|
||||
if ($overrideValue !== null) return $overrideValue;
|
||||
|
||||
// Check the cache
|
||||
$cacheKey = $this->cachePrefix . $key;
|
||||
if ($this->cache->has($cacheKey)) {
|
||||
return $this->cache->get($cacheKey);
|
||||
}
|
||||
|
||||
// Check the database
|
||||
$settingObject = $this->getSettingObjectByKey($key);
|
||||
|
||||
if ($settingObject !== null) {
|
||||
$value = $settingObject->value;
|
||||
$this->cache->forever($cacheKey, $value);
|
||||
return $value;
|
||||
}
|
||||
|
||||
// Check the defaults set in the app config.
|
||||
$configPrefix = 'setting-defaults.' . $key;
|
||||
if (config()->has($configPrefix)) {
|
||||
$value = config($configPrefix);
|
||||
$this->cache->forever($cacheKey, $value);
|
||||
return $value;
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ class SocialAuthService
|
||||
|
||||
// Otherwise let the user know this social account is not used by anyone.
|
||||
$message = 'This ' . $socialDriver . ' account is not linked to any users. Please attach it in your profile settings';
|
||||
if (\Setting::get('registration-enabled')) {
|
||||
if (setting('registration-enabled')) {
|
||||
$message .= ' or, If you do not yet have an account, You can register an account using the ' . $socialDriver . ' option';
|
||||
}
|
||||
throw new SocialSignInException($message . '.', '/login');
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?php namespace BookStack\Services;
|
||||
|
||||
|
||||
use BookStack\Entity;
|
||||
use BookStack\View;
|
||||
|
||||
@@ -9,15 +8,18 @@ class ViewService
|
||||
|
||||
protected $view;
|
||||
protected $user;
|
||||
protected $restrictionService;
|
||||
|
||||
/**
|
||||
* ViewService constructor.
|
||||
* @param $view
|
||||
* @param View $view
|
||||
* @param RestrictionService $restrictionService
|
||||
*/
|
||||
public function __construct(View $view)
|
||||
public function __construct(View $view, RestrictionService $restrictionService)
|
||||
{
|
||||
$this->view = $view;
|
||||
$this->user = auth()->user();
|
||||
$this->restrictionService = $restrictionService;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -27,7 +29,7 @@ class ViewService
|
||||
*/
|
||||
public function add(Entity $entity)
|
||||
{
|
||||
if($this->user === null) return 0;
|
||||
if ($this->user === null) return 0;
|
||||
$view = $entity->views()->where('user_id', '=', $this->user->id)->first();
|
||||
// Add view if model exists
|
||||
if ($view) {
|
||||
@@ -44,52 +46,47 @@ class ViewService
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the entities with the most views.
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @param bool|false $filterModel
|
||||
*/
|
||||
public function getPopular($count = 10, $page = 0, $filterModel = false)
|
||||
{
|
||||
$skipCount = $count * $page;
|
||||
$query = $this->view->select('id', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
|
||||
$query = $this->restrictionService->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type')
|
||||
->select('*', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
|
||||
->groupBy('viewable_id', 'viewable_type')
|
||||
->orderBy('view_count', 'desc');
|
||||
|
||||
if($filterModel) $query->where('viewable_type', '=', get_class($filterModel));
|
||||
if ($filterModel) $query->where('viewable_type', '=', get_class($filterModel));
|
||||
|
||||
$views = $query->with('viewable')->skip($skipCount)->take($count)->get();
|
||||
$viewedEntities = $views->map(function ($item) {
|
||||
return $item->viewable()->getResults();
|
||||
});
|
||||
return $viewedEntities;
|
||||
return $query->with('viewable')->skip($skipCount)->take($count)->get()->pluck('viewable');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all recently viewed entities for the current user.
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @param int $count
|
||||
* @param int $page
|
||||
* @param Entity|bool $filterModel
|
||||
* @return mixed
|
||||
*/
|
||||
public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false)
|
||||
{
|
||||
if($this->user === null) return collect();
|
||||
$skipCount = $count * $page;
|
||||
$query = $this->view->where('user_id', '=', auth()->user()->id);
|
||||
if ($this->user === null) return collect();
|
||||
|
||||
if ($filterModel) $query->where('viewable_type', '=', get_class($filterModel));
|
||||
$query = $this->restrictionService
|
||||
->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type');
|
||||
|
||||
$views = $query->with('viewable')->orderBy('updated_at', 'desc')->skip($skipCount)->take($count)->get();
|
||||
$viewedEntities = $views->map(function ($item) {
|
||||
return $item->viewable()->getResults();
|
||||
});
|
||||
return $viewedEntities;
|
||||
if ($filterModel) $query = $query->where('viewable_type', '=', get_class($filterModel));
|
||||
$query = $query->where('user_id', '=', auth()->user()->id);
|
||||
|
||||
$viewables = $query->with('viewable')->orderBy('updated_at', 'desc')
|
||||
->skip($count * $page)->take($count)->get()->pluck('viewable');
|
||||
return $viewables;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reset all view counts by deleting all views.
|
||||
*/
|
||||
@@ -98,5 +95,4 @@ class ViewService
|
||||
$this->view->truncate();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
61
app/User.php
61
app/User.php
@@ -14,21 +14,18 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
|
||||
/**
|
||||
* The database table used by the model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'users';
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $fillable = ['name', 'email', 'image_id'];
|
||||
|
||||
/**
|
||||
* The attributes excluded from the model's JSON form.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $hidden = ['password', 'remember_token'];
|
||||
@@ -50,10 +47,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Permissions and roles
|
||||
*/
|
||||
|
||||
/**
|
||||
* The roles that belong to the user.
|
||||
*/
|
||||
@@ -62,21 +55,30 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
return $this->belongsToMany('BookStack\Role');
|
||||
}
|
||||
|
||||
public function getRoleAttribute()
|
||||
/**
|
||||
* Check if the user has a role.
|
||||
* @param $role
|
||||
* @return mixed
|
||||
*/
|
||||
public function hasRole($role)
|
||||
{
|
||||
return $this->roles()->with('permissions')->first();
|
||||
return $this->roles->pluck('name')->contains($role);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the user's permissions from their role.
|
||||
* Get all permissions belonging to a the current user.
|
||||
* @param bool $cache
|
||||
* @return \Illuminate\Database\Eloquent\Relations\HasManyThrough
|
||||
*/
|
||||
private function loadPermissions()
|
||||
public function permissions($cache = true)
|
||||
{
|
||||
if (isset($this->permissions)) return;
|
||||
if(isset($this->permissions) && $cache) return $this->permissions;
|
||||
$this->load('roles.permissions');
|
||||
$permissions = $this->roles[0]->permissions;
|
||||
$permissionsArray = $permissions->pluck('name')->all();
|
||||
$this->permissions = $permissionsArray;
|
||||
$permissions = $this->roles->map(function($role) {
|
||||
return $role->permissions;
|
||||
})->flatten()->unique();
|
||||
$this->permissions = $permissions;
|
||||
return $permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -86,11 +88,8 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
*/
|
||||
public function can($permissionName)
|
||||
{
|
||||
if ($this->email == 'guest') {
|
||||
return false;
|
||||
}
|
||||
$this->loadPermissions();
|
||||
return array_search($permissionName, $this->permissions) !== false;
|
||||
if ($this->email === 'guest') return false;
|
||||
return $this->permissions()->pluck('name')->contains($permissionName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -108,12 +107,11 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
*/
|
||||
public function attachRoleId($id)
|
||||
{
|
||||
$this->roles()->sync([$id]);
|
||||
$this->roles()->attach($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the social account associated with this user.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
||||
*/
|
||||
public function socialAccounts()
|
||||
@@ -138,8 +136,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
|
||||
/**
|
||||
* Returns the user's avatar,
|
||||
* Uses Gravatar as the avatar service.
|
||||
*
|
||||
* @param int $size
|
||||
* @return string
|
||||
*/
|
||||
@@ -164,6 +160,21 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
*/
|
||||
public function getEditUrl()
|
||||
{
|
||||
return '/users/' . $this->id;
|
||||
return '/settings/users/' . $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a shortened version of the user's name.
|
||||
* @param int $chars
|
||||
* @return string
|
||||
*/
|
||||
public function getShortName($chars = 8)
|
||||
{
|
||||
if (strlen($this->name) <= $chars) return $this->name;
|
||||
|
||||
$splitName = explode(' ', $this->name);
|
||||
if (strlen($splitName[0]) <= $chars) return $splitName[0];
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
|
||||
if (! function_exists('versioned_asset')) {
|
||||
if (!function_exists('versioned_asset')) {
|
||||
/**
|
||||
* Get the path to a versioned file.
|
||||
*
|
||||
* @param string $file
|
||||
* @param string $file
|
||||
* @return string
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
@@ -27,4 +27,48 @@ if (! function_exists('versioned_asset')) {
|
||||
|
||||
throw new InvalidArgumentException("File {$file} not defined in asset manifest.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the current user has a permission.
|
||||
* If an ownable element is passed in the permissions are checked against
|
||||
* that particular item.
|
||||
* @param $permission
|
||||
* @param \BookStack\Ownable $ownable
|
||||
* @return mixed
|
||||
*/
|
||||
function userCan($permission, \BookStack\Ownable $ownable = null)
|
||||
{
|
||||
if (!auth()->check()) return false;
|
||||
if ($ownable === null) {
|
||||
return auth()->user() && auth()->user()->can($permission);
|
||||
}
|
||||
|
||||
// Check permission on ownable item
|
||||
$permissionBaseName = strtolower($permission) . '-';
|
||||
$hasPermission = false;
|
||||
if (auth()->user()->can($permissionBaseName . 'all')) $hasPermission = true;
|
||||
if (auth()->user()->can($permissionBaseName . 'own') && $ownable->createdBy && $ownable->createdBy->id === auth()->user()->id) $hasPermission = true;
|
||||
|
||||
if (!$ownable instanceof \BookStack\Entity) return $hasPermission;
|
||||
|
||||
// Check restrictions on the entity
|
||||
$restrictionService = app('BookStack\Services\RestrictionService');
|
||||
$explodedPermission = explode('-', $permission);
|
||||
$action = end($explodedPermission);
|
||||
$hasAccess = $restrictionService->checkIfEntityRestricted($ownable, $action);
|
||||
$restrictionsSet = $restrictionService->checkIfRestrictionsSet($ownable, $action);
|
||||
return ($hasAccess && $restrictionsSet) || (!$restrictionsSet && $hasPermission);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to access system settings.
|
||||
* @param $key
|
||||
* @param bool $default
|
||||
* @return mixed
|
||||
*/
|
||||
function setting($key, $default = false)
|
||||
{
|
||||
$settingService = app('BookStack\Services\SettingService');
|
||||
return $settingService->get($key, $default);
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
"barryvdh/laravel-ide-helper": "^2.1",
|
||||
"barryvdh/laravel-debugbar": "^2.0",
|
||||
"league/flysystem-aws-s3-v3": "^1.0",
|
||||
"barryvdh/laravel-dompdf": "0.6.*"
|
||||
"barryvdh/laravel-dompdf": "0.6.*",
|
||||
"predis/predis": "^1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"fzaninotto/faker": "~1.4",
|
||||
|
||||
445
composer.lock
generated
445
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,8 @@ return [
|
||||
|
||||
'env' => env('APP_ENV', 'production'),
|
||||
|
||||
'editor' => env('APP_EDITOR', 'html'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Debug Mode
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
<?php
|
||||
|
||||
// MEMCACHED - Split out configuration into an array
|
||||
if (env('CACHE_DRIVER') === 'memcached') {
|
||||
$memcachedServerKeys = ['host', 'port', 'weight'];
|
||||
$memcachedServers = explode(',', trim(env('MEMCACHED_SERVERS', '127.0.0.1:11211:100'), ','));
|
||||
foreach ($memcachedServers as $index => $memcachedServer) {
|
||||
$memcachedServerDetails = explode(':', $memcachedServer);
|
||||
if (count($memcachedServerDetails) < 2) $memcachedServerDetails[] = '11211';
|
||||
if (count($memcachedServerDetails) < 3) $memcachedServerDetails[] = '100';
|
||||
$memcachedServers[$index] = array_combine($memcachedServerKeys, $memcachedServerDetails);
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
@@ -49,11 +61,7 @@ return [
|
||||
|
||||
'memcached' => [
|
||||
'driver' => 'memcached',
|
||||
'servers' => [
|
||||
[
|
||||
'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100,
|
||||
],
|
||||
],
|
||||
'servers' => env('CACHE_DRIVER') === 'memcached' ? $memcachedServers : [],
|
||||
],
|
||||
|
||||
'redis' => [
|
||||
@@ -74,6 +82,6 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'prefix' => 'laravel',
|
||||
'prefix' => env('CACHE_PREFIX', 'bookstack'),
|
||||
|
||||
];
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
<?php
|
||||
|
||||
// REDIS - Split out configuration into an array
|
||||
if (env('REDIS_SERVERS', false)) {
|
||||
$redisServerKeys = ['host', 'port', 'database'];
|
||||
$redisServers = explode(',', trim(env('REDIS_SERVERS', '127.0.0.1:6379:0'), ','));
|
||||
$redisConfig = [
|
||||
'cluster' => env('REDIS_CLUSTER', false)
|
||||
];
|
||||
foreach ($redisServers as $index => $redisServer) {
|
||||
$redisServerName = ($index === 0) ? 'default' : 'redis-server-' . $index;
|
||||
$redisServerDetails = explode(':', $redisServer);
|
||||
if (count($redisServerDetails) < 2) $redisServerDetails[] = '6379';
|
||||
if (count($redisServerDetails) < 3) $redisServerDetails[] = '0';
|
||||
$redisConfig[$redisServerName] = array_combine($redisServerKeys, $redisServerDetails);
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
@@ -123,16 +139,6 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'redis' => [
|
||||
|
||||
'cluster' => false,
|
||||
|
||||
'default' => [
|
||||
'host' => '127.0.0.1',
|
||||
'port' => 6379,
|
||||
'database' => 0,
|
||||
],
|
||||
|
||||
],
|
||||
'redis' => env('REDIS_SERVERS', false) ? $redisConfig : [],
|
||||
|
||||
];
|
||||
|
||||
10
config/setting-defaults.php
Normal file
10
config/setting-defaults.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* The defaults for the system settings that are saved in the database.
|
||||
*/
|
||||
return [
|
||||
|
||||
'app-editor' => 'wysiwyg'
|
||||
|
||||
];
|
||||
@@ -17,6 +17,7 @@ $factory->define(BookStack\User::class, function ($faker) {
|
||||
'email' => $faker->email,
|
||||
'password' => str_random(10),
|
||||
'remember_token' => str_random(10),
|
||||
'email_confirmed' => 1
|
||||
];
|
||||
});
|
||||
|
||||
@@ -45,3 +46,10 @@ $factory->define(BookStack\Page::class, function ($faker) {
|
||||
'text' => strip_tags($html)
|
||||
];
|
||||
});
|
||||
|
||||
$factory->define(BookStack\Role::class, function ($faker) {
|
||||
return [
|
||||
'display_name' => $faker->sentence(3),
|
||||
'description' => $faker->sentence(10)
|
||||
];
|
||||
});
|
||||
@@ -18,7 +18,7 @@ class CreateUsersTable extends Migration
|
||||
$table->string('email')->unique();
|
||||
$table->string('password', 60);
|
||||
$table->rememberToken();
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
|
||||
\BookStack\User::forceCreate([
|
||||
|
||||
@@ -17,7 +17,7 @@ class CreateBooksTable extends Migration
|
||||
$table->string('name');
|
||||
$table->string('slug')->indexed();
|
||||
$table->text('description');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ class CreatePagesTable extends Migration
|
||||
$table->longText('html');
|
||||
$table->longText('text');
|
||||
$table->integer('priority');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ class CreateImagesTable extends Migration
|
||||
$table->increments('id');
|
||||
$table->string('name');
|
||||
$table->string('url');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ class CreateChaptersTable extends Migration
|
||||
$table->text('name');
|
||||
$table->text('description');
|
||||
$table->integer('priority');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ class CreatePageRevisionsTable extends Migration
|
||||
$table->longText('html');
|
||||
$table->longText('text');
|
||||
$table->integer('created_by');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ class CreateActivitiesTable extends Migration
|
||||
$table->integer('user_id');
|
||||
$table->integer('entity_id');
|
||||
$table->string('entity_type');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ class AddRolesAndPermissions extends Migration
|
||||
$table->string('name')->unique();
|
||||
$table->string('display_name')->nullable();
|
||||
$table->string('description')->nullable();
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
|
||||
// Create table for associating roles to users (Many-to-Many)
|
||||
@@ -50,7 +50,7 @@ class AddRolesAndPermissions extends Migration
|
||||
$table->string('name')->unique();
|
||||
$table->string('display_name')->nullable();
|
||||
$table->string('description')->nullable();
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
|
||||
// Create table for associating permissions to roles (Many-to-Many)
|
||||
|
||||
@@ -15,7 +15,7 @@ class CreateSettingsTable extends Migration
|
||||
Schema::create('settings', function (Blueprint $table) {
|
||||
$table->string('setting_key')->primary()->indexed();
|
||||
$table->text('value');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class CreateSocialAccountsTable extends Migration
|
||||
$table->string('driver')->index();
|
||||
$table->string('driver_id');
|
||||
$table->string('avatar');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ class AddEmailConfirmationTable extends Migration
|
||||
$table->increments('id');
|
||||
$table->integer('user_id')->index();
|
||||
$table->string('token')->index();
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class CreateViewsTable extends Migration
|
||||
$table->integer('viewable_id');
|
||||
$table->string('viewable_type');
|
||||
$table->integer('views');
|
||||
$table->timestamps();
|
||||
$table->nullableTimestamps();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -28,4 +28,4 @@ class AddExternalAuthToUsers extends Migration
|
||||
$table->dropColumn('external_auth_id');
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddSlugToRevisions extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('page_revisions', function (Blueprint $table) {
|
||||
$table->string('slug');
|
||||
$table->index('slug');
|
||||
$table->string('book_slug');
|
||||
$table->index('book_slug');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('page_revisions', function (Blueprint $table) {
|
||||
$table->dropColumn('slug');
|
||||
$table->dropColumn('book_slug');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class UpdatePermissionsAndRoles extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
// Get roles with permissions we need to change
|
||||
$adminRole = \BookStack\Role::getRole('admin');
|
||||
$editorRole = \BookStack\Role::getRole('editor');
|
||||
|
||||
// Delete old permissions
|
||||
$permissions = \BookStack\Permission::all();
|
||||
$permissions->each(function ($permission) {
|
||||
$permission->delete();
|
||||
});
|
||||
|
||||
// Create & attach new admin permissions
|
||||
$permissionsToCreate = [
|
||||
'settings-manage' => 'Manage Settings',
|
||||
'users-manage' => 'Manage Users',
|
||||
'user-roles-manage' => 'Manage Roles & Permissions',
|
||||
'restrictions-manage-all' => 'Manage All Entity Restrictions',
|
||||
'restrictions-manage-own' => 'Manage Entity Restrictions On Own Content'
|
||||
];
|
||||
foreach ($permissionsToCreate as $name => $displayName) {
|
||||
$newPermission = new \BookStack\Permission();
|
||||
$newPermission->name = $name;
|
||||
$newPermission->display_name = $displayName;
|
||||
$newPermission->save();
|
||||
$adminRole->attachPermission($newPermission);
|
||||
}
|
||||
|
||||
// Create & attach new entity permissions
|
||||
$entities = ['Book', 'Page', 'Chapter', 'Image'];
|
||||
$ops = ['Create All', 'Create Own', 'Update All', 'Update Own', 'Delete All', 'Delete Own'];
|
||||
foreach ($entities as $entity) {
|
||||
foreach ($ops as $op) {
|
||||
$newPermission = new \BookStack\Permission();
|
||||
$newPermission->name = strtolower($entity) . '-' . strtolower(str_replace(' ', '-', $op));
|
||||
$newPermission->display_name = $op . ' ' . $entity . 's';
|
||||
$newPermission->save();
|
||||
$adminRole->attachPermission($newPermission);
|
||||
if ($editorRole !== null) $editorRole->attachPermission($newPermission);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
// Get roles with permissions we need to change
|
||||
$adminRole = \BookStack\Role::getRole('admin');
|
||||
|
||||
// Delete old permissions
|
||||
$permissions = \BookStack\Permission::all();
|
||||
$permissions->each(function ($permission) {
|
||||
$permission->delete();
|
||||
});
|
||||
|
||||
// Create default CRUD permissions and allocate to admins and editors
|
||||
$entities = ['Book', 'Page', 'Chapter', 'Image'];
|
||||
$ops = ['Create', 'Update', 'Delete'];
|
||||
foreach ($entities as $entity) {
|
||||
foreach ($ops as $op) {
|
||||
$newPermission = new \BookStack\Permission();
|
||||
$newPermission->name = strtolower($entity) . '-' . strtolower($op);
|
||||
$newPermission->display_name = $op . ' ' . $entity . 's';
|
||||
$newPermission->save();
|
||||
$adminRole->attachPermission($newPermission);
|
||||
}
|
||||
}
|
||||
|
||||
// Create admin permissions
|
||||
$entities = ['Settings', 'User'];
|
||||
$ops = ['Create', 'Update', 'Delete'];
|
||||
foreach ($entities as $entity) {
|
||||
foreach ($ops as $op) {
|
||||
$newPermission = new \BookStack\Permission();
|
||||
$newPermission->name = strtolower($entity) . '-' . strtolower($op);
|
||||
$newPermission->display_name = $op . ' ' . $entity;
|
||||
$newPermission->save();
|
||||
$adminRole->attachPermission($newPermission);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddEntityAccessControls extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('images', function (Blueprint $table) {
|
||||
$table->integer('uploaded_to')->default(0);
|
||||
$table->index('uploaded_to');
|
||||
});
|
||||
|
||||
Schema::table('books', function (Blueprint $table) {
|
||||
$table->boolean('restricted')->default(false);
|
||||
$table->index('restricted');
|
||||
});
|
||||
|
||||
Schema::table('chapters', function (Blueprint $table) {
|
||||
$table->boolean('restricted')->default(false);
|
||||
$table->index('restricted');
|
||||
});
|
||||
|
||||
Schema::table('pages', function (Blueprint $table) {
|
||||
$table->boolean('restricted')->default(false);
|
||||
$table->index('restricted');
|
||||
});
|
||||
|
||||
Schema::create('restrictions', function(Blueprint $table) {
|
||||
$table->increments('id');
|
||||
$table->integer('restrictable_id');
|
||||
$table->string('restrictable_type');
|
||||
$table->integer('role_id');
|
||||
$table->string('action');
|
||||
$table->index('role_id');
|
||||
$table->index('action');
|
||||
$table->index(['restrictable_id', 'restrictable_type']);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('images', function (Blueprint $table) {
|
||||
$table->dropColumn('uploaded_to');
|
||||
});
|
||||
|
||||
Schema::table('books', function (Blueprint $table) {
|
||||
$table->dropColumn('restricted');
|
||||
});
|
||||
|
||||
Schema::table('chapters', function (Blueprint $table) {
|
||||
$table->dropColumn('restricted');
|
||||
});
|
||||
|
||||
|
||||
Schema::table('pages', function (Blueprint $table) {
|
||||
$table->dropColumn('restricted');
|
||||
});
|
||||
|
||||
Schema::drop('restrictions');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddPageRevisionTypes extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('page_revisions', function (Blueprint $table) {
|
||||
$table->string('type')->default('version');
|
||||
$table->index('type');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('page_revisions', function (Blueprint $table) {
|
||||
$table->dropColumn('type');
|
||||
});
|
||||
}
|
||||
}
|
||||
32
database/migrations/2016_03_13_082138_add_page_drafts.php
Normal file
32
database/migrations/2016_03_13_082138_add_page_drafts.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddPageDrafts extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('pages', function(Blueprint $table) {
|
||||
$table->boolean('draft')->default(false);
|
||||
$table->index('draft');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('pages', function (Blueprint $table) {
|
||||
$table->dropColumn('draft');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddMarkdownSupport extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('pages', function (Blueprint $table) {
|
||||
$table->longText('markdown')->default('');
|
||||
});
|
||||
|
||||
Schema::table('page_revisions', function (Blueprint $table) {
|
||||
$table->longText('markdown')->default('');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('pages', function (Blueprint $table) {
|
||||
$table->dropColumn('markdown');
|
||||
});
|
||||
|
||||
Schema::table('page_revisions', function (Blueprint $table) {
|
||||
$table->dropColumn('markdown');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ class DummyContentSeeder extends Seeder
|
||||
public function run()
|
||||
{
|
||||
$user = factory(BookStack\User::class, 1)->create();
|
||||
$role = \BookStack\Role::getDefault();
|
||||
$role = \BookStack\Role::getRole('editor');
|
||||
$user->attachRole($role);
|
||||
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
"bootstrap-sass": "^3.0.0",
|
||||
"dropzone": "^4.0.1",
|
||||
"laravel-elixir": "^3.4.0",
|
||||
"marked": "^0.3.5",
|
||||
"moment": "^2.12.0",
|
||||
"zeroclipboard": "^2.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,12 +21,18 @@
|
||||
</filter>
|
||||
<php>
|
||||
<env name="APP_ENV" value="testing"/>
|
||||
<env name="APP_DEBUG" value="false"/>
|
||||
<env name="CACHE_DRIVER" value="array"/>
|
||||
<env name="SESSION_DRIVER" value="array"/>
|
||||
<env name="QUEUE_DRIVER" value="sync"/>
|
||||
<env name="DB_CONNECTION" value="mysql_testing"/>
|
||||
<env name="MAIL_PRETEND" value="true"/>
|
||||
<env name="MAIL_DRIVER" value="log"/>
|
||||
<env name="AUTH_METHOD" value="standard"/>
|
||||
<env name="DISABLE_EXTERNAL_SERVICES" value="false"/>
|
||||
<env name="LDAP_VERSION" value="3"/>
|
||||
<env name="GITHUB_APP_ID" value="aaaaaaaaaaaaaa"/>
|
||||
<env name="GITHUB_APP_SECRET" value="aaaaaaaaaaaaaa"/>
|
||||
<env name="GOOGLE_APP_ID" value="aaaaaaaaaaaaaa"/>
|
||||
<env name="GOOGLE_APP_SECRET" value="aaaaaaaaaaaaaa"/>
|
||||
</php>
|
||||
</phpunit>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"css/styles.css": "css/styles.css?version=8d91c6c",
|
||||
"css/print-styles.css": "css/print-styles.css?version=8d91c6c",
|
||||
"js/common.js": "js/common.js?version=8d91c6c"
|
||||
"css/styles.css": "css/styles.css?version=83f4ada",
|
||||
"css/print-styles.css": "css/print-styles.css?version=83f4ada",
|
||||
"js/common.js": "js/common.js?version=83f4ada"
|
||||
}
|
||||
2
public/css/export-styles.css
vendored
2
public/css/export-styles.css
vendored
File diff suppressed because one or more lines are too long
2
public/css/styles.css
vendored
2
public/css/styles.css
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1,675 +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">
|
||||
<metadata></metadata>
|
||||
<defs>
|
||||
<font id="robotobold" horiz-adv-x="1175" >
|
||||
<font-face units-per-em="2048" ascent="1536" descent="-512" />
|
||||
<missing-glyph horiz-adv-x="510" />
|
||||
<glyph unicode="fi" horiz-adv-x="1246" d="M20 870v212h161v50q2 204 125.5 314.5t348.5 110.5q135 0 328 -59l-42 -239q-98 29 -152 37.5t-116 8.5q-202 0 -202 -179v-44h213v-212h-213v-870h-290v870h-161zM828 0v1082h290v-1082h-290z" />
|
||||
<glyph unicode="fl" horiz-adv-x="1255" d="M29 870v212h161v84q2 188 118 289.5t328 101.5q151 0 490 -32v-1525h-290v1312q-86 10 -160 10q-196 0 -196 -167v-73h215v-212h-215v-870h-290v870h-161z" />
|
||||
<glyph horiz-adv-x="0" />
|
||||
<glyph horiz-adv-x="0" />
|
||||
<glyph unicode="
" horiz-adv-x="510" />
|
||||
<glyph horiz-adv-x="0" />
|
||||
<glyph unicode=" " horiz-adv-x="510" />
|
||||
<glyph unicode="	" horiz-adv-x="510" />
|
||||
<glyph unicode=" " horiz-adv-x="510" />
|
||||
<glyph unicode="!" horiz-adv-x="557" d="M124 136q0 66 44.5 109.5t116.5 43.5q73 0 117.5 -43t44.5 -110q0 -66 -44.5 -109t-117.5 -43q-72 0 -116.5 43t-44.5 109zM131 1456h308l-34 -1009h-240z" />
|
||||
<glyph unicode=""" horiz-adv-x="657" d="M64 987v549h202v-138l-40 -411h-162zM390 987v549h201v-138l-39 -411h-162z" />
|
||||
<glyph unicode="#" horiz-adv-x="1220" d="M64 410v172h257l50 284h-232v174h263l73 416h182l-73 -416h194l73 416h183l-73 -416h219v-174h-250l-50 -284h224v-172h-254l-72 -410h-183l72 410h-193l-72 -410h-183l72 410h-227zM504 582h193l50 284h-194z" />
|
||||
<glyph unicode="$" d="M92 457h289q0 -119 56.5 -182.5t162.5 -63.5q88 0 139 46.5t51 125.5q0 82 -45.5 130.5t-154.5 89.5t-188 81.5t-135.5 93t-88 123.5t-31.5 169q0 169 108 277t287 126v214h160v-217q177 -25 277 -147.5t100 -317.5h-289q0 120 -49.5 179.5t-132.5 59.5q-82 0 -127 -46.5 t-45 -128.5q0 -76 44 -122t163.5 -94t196.5 -90.5t130 -96t81 -122t28 -159.5q0 -170 -106 -276t-292 -125v-199h-159v198q-205 22 -317.5 145.5t-112.5 328.5z" />
|
||||
<glyph unicode="%" horiz-adv-x="1512" d="M95 1105v71q0 134 87 217.5t228 83.5q143 0 230 -82.5t87 -223.5v-72q0 -135 -87 -217t-228 -82q-142 0 -229.5 82.5t-87.5 222.5zM287 1099q0 -60 34.5 -96.5t90.5 -36.5t89 37t33 99v74q0 60 -33 97t-91 37q-55 0 -89 -36.5t-34 -101.5v-73zM328 185l711 1138l141 -76 l-711 -1138zM791 283v74q0 135 88 217.5t228 82.5q142 0 229.5 -81.5t87.5 -224.5v-72q0 -134 -86 -216.5t-229 -82.5q-144 0 -231 83t-87 220zM983 279q0 -55 36 -94t90 -39q122 0 122 135v76q0 60 -34 96.5t-90 36.5t-90 -36.5t-34 -99.5v-75z" />
|
||||
<glyph unicode="&" horiz-adv-x="1344" d="M71 392q0 101 56.5 187t207.5 191q-65 87 -102 163.5t-37 159.5q0 170 107.5 276.5t289.5 106.5q163 0 267.5 -97t104.5 -242q0 -174 -176 -307l-112 -81l251 -292q59 116 59 256h246q0 -284 -131 -460l218 -253h-328l-75 86q-161 -106 -370 -106q-216 0 -346 113.5 t-130 298.5zM361 408q0 -87 55.5 -141.5t144.5 -54.5q104 0 197 58l-287 332l-21 -15q-89 -76 -89 -179zM455 1097q0 -75 88 -189l77 51q59 38 81.5 74t22.5 86t-37 87t-95 37q-62 0 -99.5 -40t-37.5 -106z" />
|
||||
<glyph unicode="'" horiz-adv-x="331" d="M63 985v551h212v-147l-29 -404h-183z" />
|
||||
<glyph unicode="(" horiz-adv-x="719" d="M124 539v53q0 229 61 436t180 366.5t258 221.5l56 -156q-146 -108 -228 -334t-82 -528v-31q0 -303 81 -530t229 -339l-56 -153q-136 61 -253.5 215.5t-179.5 356.5t-66 422z" />
|
||||
<glyph unicode=")" horiz-adv-x="722" d="M40 -302q142 107 224 330t85 513v53q0 299 -81.5 527t-227.5 342l56 153q136 -59 256.5 -214t187 -361t69.5 -427v-45q0 -226 -65 -435t-187 -369t-261 -220z" />
|
||||
<glyph unicode="*" horiz-adv-x="928" d="M27 1051l59 181l311 -125l-20 349h196l-20 -356l303 123l59 -183l-320 -89l210 -266l-159 -113l-182 292l-180 -282l-159 108l216 272z" />
|
||||
<glyph unicode="+" horiz-adv-x="1118" d="M57 554v261h362v391h275v-391h361v-261h-361v-408h-275v408h-362z" />
|
||||
<glyph unicode="," horiz-adv-x="500" d="M35 -286l36 65q67 122 69 243v224h244l-1 -200q-1 -111 -56 -224t-141 -187z" />
|
||||
<glyph unicode="-" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
|
||||
<glyph unicode="." horiz-adv-x="595" d="M126 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
|
||||
<glyph unicode="/" horiz-adv-x="765" d="M-13 -125l536 1581h215l-536 -1581h-215z" />
|
||||
<glyph unicode="0" d="M95 587v268q0 305 126.5 463t364.5 158t364 -156.5t129 -449.5v-268q0 -302 -125 -462t-366 -160q-238 0 -364 157t-129 450zM384 564q0 -178 48.5 -264.5t155.5 -86.5q106 0 153 83t49 254v346q0 181 -49.5 263.5t-154.5 82.5q-102 0 -150.5 -78.5t-51.5 -245.5v-354z " />
|
||||
<glyph unicode="1" d="M167 1007v235l603 216h31v-1458h-289v1114z" />
|
||||
<glyph unicode="2" d="M70 998q0 133 63.5 243t179.5 172.5t263 62.5q225 0 349.5 -108t124.5 -305q0 -108 -56 -220t-192 -261l-331 -349h626v-233h-998v198l471 502q97 106 143.5 185t46.5 150q0 97 -49 152.5t-140 55.5q-98 0 -154.5 -67.5t-56.5 -177.5h-290z" />
|
||||
<glyph unicode="3" d="M64 399h289q0 -82 61.5 -134t151.5 -52q103 0 161.5 54.5t58.5 144.5q0 218 -240 218h-153v226h154q110 0 163 55t53 146q0 88 -52.5 137t-144.5 49q-83 0 -139 -45.5t-56 -118.5h-289q0 114 61.5 204.5t172 141.5t243.5 51q231 0 362 -110.5t131 -304.5q0 -100 -61 -184 t-160 -129q123 -44 183.5 -132t60.5 -208q0 -194 -141.5 -311t-374.5 -117q-218 0 -356.5 115t-138.5 304z" />
|
||||
<glyph unicode="4" d="M55 497l607 959h292v-908h165v-233h-165v-315h-289v315h-597zM343 548h322v514l-19 -33z" />
|
||||
<glyph unicode="5" d="M105 405h286q9 -91 63.5 -141.5t142.5 -50.5q98 0 151 70.5t53 199.5q0 124 -61 190t-173 66q-103 0 -167 -54l-28 -26l-230 57l84 740h816v-241h-579l-36 -313q103 55 219 55q208 0 326 -129t118 -361q0 -141 -59.5 -252.5t-170.5 -173t-262 -61.5q-132 0 -245 53.5 t-178.5 150.5t-69.5 221z" />
|
||||
<glyph unicode="6" d="M100 567v104q0 237 89.5 418.5t257 281t388.5 100.5h48v-238h-28q-196 -3 -315.5 -102t-143.5 -275q116 118 293 118q190 0 302 -136t112 -358q0 -142 -61.5 -257t-174 -179t-254.5 -64q-230 0 -371.5 160t-141.5 427zM390 521q0 -145 57 -226.5t160 -81.5 q93 0 150.5 73.5t57.5 190.5q0 119 -58 192t-156 73q-70 0 -127 -36.5t-84 -96.5v-88z" />
|
||||
<glyph unicode="7" d="M61 1222v234h1028v-162l-563 -1294h-305l564 1222h-724z" />
|
||||
<glyph unicode="8" d="M95 399q0 121 62 211t167 140q-93 49 -145.5 131t-52.5 188q0 186 124 296.5t337 110.5q212 0 336.5 -109.5t124.5 -297.5q0 -106 -53 -188t-146 -131q106 -51 168 -140.5t62 -210.5q0 -194 -132 -306.5t-359 -112.5t-360 113t-133 306zM384 420q0 -93 54 -150t150 -57 q94 0 147.5 55t53.5 152q0 95 -55 152t-148 57q-92 0 -147 -56.5t-55 -152.5zM416 1055q0 -87 45 -140t127 -53t126.5 53t44.5 140q0 85 -45 136.5t-127 51.5q-81 0 -126 -50t-45 -138z" />
|
||||
<glyph unicode="9" d="M86 961q0 143 62.5 262.5t174.5 186t252 66.5q144 0 256 -72t174 -207t63 -309v-107q0 -364 -181 -572t-513 -222l-71 -1v241l64 1q377 17 408 354q-113 -111 -264 -111q-193 0 -309 132.5t-116 357.5zM374 964q0 -119 54.5 -195.5t153.5 -76.5q70 0 120.5 36t76.5 87 v119q0 147 -56 228t-150 81q-87 0 -143 -79.5t-56 -199.5z" />
|
||||
<glyph unicode=":" horiz-adv-x="578" d="M125 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM125 961q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
|
||||
<glyph unicode=";" horiz-adv-x="537" d="M57 -286l36 65q67 122 69 243v224h244l-1 -200q-1 -111 -56 -224t-141 -187zM108 961q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
|
||||
<glyph unicode="<" horiz-adv-x="1042" d="M54 502v236l861 365v-280l-570 -205l570 -201v-280z" />
|
||||
<glyph unicode="=" horiz-adv-x="1172" d="M136 313v236h894v-236h-894zM136 746v236h894v-236h-894z" />
|
||||
<glyph unicode=">" horiz-adv-x="1058" d="M120 136v279l581 206l-581 203v278l871 -365v-235z" />
|
||||
<glyph unicode="?" horiz-adv-x="1019" d="M45 1069q2 191 123.5 299t331.5 108q212 0 329 -102.5t117 -289.5q0 -85 -38 -160.5t-133 -167.5l-81 -77q-76 -73 -87 -171l-4 -61h-256q0 140 34 223t124.5 163.5t120.5 131t30 106.5q0 169 -156 169q-74 0 -118.5 -45.5t-46.5 -125.5h-290zM318 140q0 67 45.5 110.5 t116.5 43.5t116.5 -43.5t45.5 -110.5q0 -66 -44.5 -109t-117.5 -43t-117.5 43t-44.5 109z" />
|
||||
<glyph unicode="@" horiz-adv-x="1833" d="M87 463q12 276 126 495t310.5 338.5t443.5 119.5q251 0 432 -107.5t271 -307.5t79 -465q-11 -256 -126.5 -406.5t-310.5 -150.5q-86 0 -148.5 37t-94.5 106q-100 -140 -261 -140q-146 0 -226 123t-60 325q18 165 83.5 293.5t165.5 197.5t216 69q143 0 244 -66l63 -43 l-51 -578q-10 -79 17.5 -121t87.5 -42q92 0 154 107.5t68 281.5q17 349 -140.5 536.5t-466.5 187.5q-193 0 -344 -98t-238 -278.5t-98 -413.5q-16 -354 142 -547.5t473 -193.5q83 0 174 18.5t157 49.5l38 -154q-61 -40 -164.5 -64.5t-208.5 -24.5q-264 0 -450 106.5 t-277.5 314t-79.5 495.5zM744 430q-11 -132 23 -200.5t110 -68.5q49 0 93 43t73 124l42 473q-39 13 -80 13q-115 0 -178.5 -98t-82.5 -286z" />
|
||||
<glyph unicode="A" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM507 543h364l-183 545z" />
|
||||
<glyph unicode="B" horiz-adv-x="1307" d="M130 0v1456h510q265 0 402 -101.5t137 -297.5q0 -107 -55 -188.5t-153 -119.5q112 -28 176.5 -113t64.5 -208q0 -210 -134 -318t-382 -110h-566zM430 241h257q106 0 165.5 50.5t59.5 139.5q0 200 -207 203h-275v-393zM430 846h222q227 4 227 181q0 99 -57.5 142.5 t-181.5 43.5h-210v-367z" />
|
||||
<glyph unicode="C" horiz-adv-x="1340" d="M86 686v89q0 210 74 370t211.5 245.5t319.5 85.5q252 0 406 -135t178 -379h-300q-11 141 -78.5 204.5t-205.5 63.5q-150 0 -224.5 -107.5t-76.5 -333.5v-110q0 -236 71.5 -345t225.5 -109q139 0 207.5 63.5t78.5 196.5h300q-17 -235 -173.5 -370t-412.5 -135 q-280 0 -440.5 188.5t-160.5 517.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1331" d="M130 0v1456h448q192 0 343.5 -86.5t236.5 -246t85 -362.5v-67q0 -203 -83.5 -361t-235.5 -245t-343 -88h-451zM430 241h145q176 0 269 115t95 329v77q0 222 -92 336.5t-269 114.5h-148v-972z" />
|
||||
<glyph unicode="E" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976z" />
|
||||
<glyph unicode="F" horiz-adv-x="1122" d="M130 0v1456h948v-243h-648v-376h576v-242h-576v-595h-300z" />
|
||||
<glyph unicode="G" horiz-adv-x="1395" d="M94 671v99q0 218 73.5 377.5t212 244t324.5 84.5q259 0 405 -123.5t173 -359.5h-292q-20 125 -88.5 183t-188.5 58q-153 0 -233 -115t-81 -342v-93q0 -229 87 -346t255 -117q169 0 241 72v251h-273v221h573v-581q-81 -97 -229 -150.5t-328 -53.5q-189 0 -331.5 82.5 t-220 239.5t-79.5 369z" />
|
||||
<glyph unicode="H" horiz-adv-x="1447" d="M130 0v1456h300v-590h585v590h300v-1456h-300v624h-585v-624h-300z" />
|
||||
<glyph unicode="I" horiz-adv-x="597" d="M149 0v1456h300v-1456h-300z" />
|
||||
<glyph unicode="J" horiz-adv-x="1144" d="M40 430h302q0 -107 45 -158t142 -51q86 0 137 59t51 168v1008h300v-1008q0 -139 -61.5 -245.5t-173.5 -164.5t-253 -58q-231 0 -360 117.5t-129 332.5z" />
|
||||
<glyph unicode="K" horiz-adv-x="1300" d="M130 0v1456h300v-660l132 181l371 479h369l-517 -647l532 -809h-357l-374 584l-156 -168v-416h-300z" />
|
||||
<glyph unicode="L" horiz-adv-x="1109" d="M130 0v1456h300v-1215h637v-241h-937z" />
|
||||
<glyph unicode="M" horiz-adv-x="1794" d="M130 0v1456h392l374 -1056l372 1056h394v-1456h-301v398l30 687l-393 -1085h-206l-392 1084l30 -686v-398h-300z" />
|
||||
<glyph unicode="N" horiz-adv-x="1446" d="M130 0v1456h300l585 -960v960h299v-1456h-300l-584 958v-958h-300z" />
|
||||
<glyph unicode="O" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119 q-151 0 -233 -117.5t-83 -344.5v-71z" />
|
||||
<glyph unicode="P" horiz-adv-x="1321" d="M130 0v1456h568q164 0 288.5 -60t191.5 -170.5t67 -251.5q0 -214 -146.5 -337.5t-405.5 -123.5h-263v-513h-300zM430 756h268q119 0 181.5 56t62.5 160q0 107 -63 173t-174 68h-275v-457z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1414" d="M84 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -204 -66 -354.5t-183 -241.5l242 -190l-191 -169l-310 249q-53 -9 -110 -9q-181 0 -323 87t-220 248.5t-79 371.5zM388 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5 v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
|
||||
<glyph unicode="R" horiz-adv-x="1307" d="M130 0v1456h541q258 0 398 -115t140 -325q0 -149 -64.5 -248.5t-195.5 -158.5l315 -595v-14h-322l-273 533h-239v-533h-300zM430 776h242q113 0 175 57.5t62 158.5q0 103 -58.5 162t-179.5 59h-241v-437z" />
|
||||
<glyph unicode="S" horiz-adv-x="1259" d="M69 458h301q0 -241 288 -241q107 0 167 43.5t60 121.5q0 85 -60 130.5t-216 96t-247 99.5q-248 134 -248 361q0 118 66.5 210.5t191 144.5t279.5 52q156 0 278 -56.5t189.5 -159.5t67.5 -234h-300q0 100 -63 155.5t-177 55.5q-110 0 -171 -46.5t-61 -122.5 q0 -71 71.5 -119t210.5 -90q256 -77 373 -191t117 -284q0 -189 -143 -296.5t-385 -107.5q-168 0 -306 61.5t-210.5 168.5t-72.5 248z" />
|
||||
<glyph unicode="T" horiz-adv-x="1267" d="M40 1213v243h1186v-243h-446v-1213h-300v1213h-440z" />
|
||||
<glyph unicode="U" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371z" />
|
||||
<glyph unicode="V" horiz-adv-x="1339" d="M7 1456h333l328 -1095l330 1095h334l-507 -1456h-313z" />
|
||||
<glyph unicode="W" horiz-adv-x="1791" d="M35 1456h299l197 -1034l240 1034h254l239 -1036l196 1036h299l-323 -1456h-302l-237 974l-237 -974h-302z" />
|
||||
<glyph unicode="X" horiz-adv-x="1301" d="M22 0l435 734l-424 722h345l273 -502l273 502h345l-424 -722l435 -734h-349l-280 510l-280 -510h-349z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1241" d="M73 0v176l720 1037h-719v243h1092v-172l-718 -1043h734v-241h-1109z" />
|
||||
<glyph unicode="[" horiz-adv-x="569" d="M120 -339v2033h432v-223h-142v-1587h142v-223h-432z" />
|
||||
<glyph unicode="\" horiz-adv-x="864" d="M0 1456h295l608 -1581h-296z" />
|
||||
<glyph unicode="]" horiz-adv-x="569" d="M13 -116h143v1587h-143v223h432v-2033h-432v223z" />
|
||||
<glyph unicode="^" horiz-adv-x="895" d="M44 729l299 727h210l299 -727h-229l-175 457l-174 -457h-230z" />
|
||||
<glyph unicode="_" horiz-adv-x="914" d="M1 0h911v-226h-911v226z" />
|
||||
<glyph unicode="`" horiz-adv-x="677" d="M52 1536h315l198 -310h-237z" />
|
||||
<glyph unicode="a" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
|
||||
<glyph unicode="b" horiz-adv-x="1153" d="M111 0v1536h289v-551q100 117 263 117q198 0 310.5 -145.5t112.5 -409.5v-16q0 -260 -111 -405.5t-310 -145.5q-176 0 -281 135l-13 -115h-260zM400 327q53 -114 192 -114q140 0 184 138q21 66 21 201q0 164 -52 239.5t-155 75.5q-138 0 -190 -113v-427z" />
|
||||
<glyph unicode="c" horiz-adv-x="1068" d="M66 535v19q0 250 133 399t365 149q203 0 325.5 -115.5t124.5 -307.5h-271q-2 84 -52 136.5t-132 52.5q-101 0 -152.5 -73.5t-51.5 -238.5v-30q0 -167 51 -240t155 -73q80 0 130 44t52 117h271q-1 -110 -60 -201.5t-161.5 -142t-226.5 -50.5q-232 0 -366 147.5t-134 407.5 z" />
|
||||
<glyph unicode="d" horiz-adv-x="1154" d="M66 549q0 253 113.5 403t310.5 150q158 0 261 -118v552h290v-1536h-261l-14 115q-108 -135 -278 -135q-191 0 -306.5 150.5t-115.5 418.5zM355 528q0 -152 53 -233t154 -81q134 0 189 113v427q-54 113 -187 113q-209 0 -209 -339z" />
|
||||
<glyph unicode="e" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM368 644h402v23q-2 96 -52 148.5t-142 52.5 q-86 0 -139.5 -58t-68.5 -166z" />
|
||||
<glyph unicode="f" horiz-adv-x="734" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h215v-212h-215v-870h-290v870h-161z" />
|
||||
<glyph unicode="g" horiz-adv-x="1169" d="M69 537v12q0 249 118.5 401t319.5 152q178 0 277 -122l12 102h262v-1046q0 -142 -64.5 -247t-181.5 -160t-274 -55q-119 0 -232 47.5t-171 122.5l128 176q108 -121 262 -121q115 0 179 61.5t64 174.5v58q-100 -113 -263 -113q-195 0 -315.5 152.5t-120.5 404.5zM358 528 q0 -147 59 -230.5t162 -83.5q132 0 189 99v455q-58 99 -187 99q-104 0 -163.5 -85t-59.5 -254z" />
|
||||
<glyph unicode="h" horiz-adv-x="1146" d="M104 0v1536h289v-572q115 138 289 138q352 0 357 -409v-693h-289v685q0 93 -40 137.5t-133 44.5q-127 0 -184 -98v-769h-289z" />
|
||||
<glyph unicode="i" horiz-adv-x="543" d="M109 1362q0 65 43.5 107t118.5 42q74 0 118 -42t44 -107q0 -66 -44.5 -108t-117.5 -42t-117.5 42t-44.5 108zM126 0v1082h290v-1082h-290z" />
|
||||
<glyph unicode="j" horiz-adv-x="532" d="M-95 -191q52 -9 91 -9q131 0 131 139v1143h290v-1141q0 -179 -95 -278.5t-274 -99.5q-75 0 -143 17v229zM104 1362q0 65 43.5 107t118.5 42t118.5 -42t43.5 -107q0 -66 -44.5 -108t-117.5 -42t-117.5 42t-44.5 108z" />
|
||||
<glyph unicode="k" horiz-adv-x="1094" d="M111 0v1536h289v-851l56 72l277 325h347l-391 -451l425 -631h-332l-278 434l-104 -104v-330h-289z" />
|
||||
<glyph unicode="l" horiz-adv-x="543" d="M126 0v1536h290v-1536h-290z" />
|
||||
<glyph unicode="m" horiz-adv-x="1773" d="M111 0v1082h271l9 -121q115 141 311 141q209 0 287 -165q114 165 325 165q176 0 262 -102.5t86 -308.5v-691h-290v690q0 92 -36 134.5t-127 42.5q-130 0 -180 -124l1 -743h-289v689q0 94 -37 136t-126 42q-123 0 -178 -102v-765h-289z" />
|
||||
<glyph unicode="n" horiz-adv-x="1147" d="M105 0v1082h272l9 -125q116 145 311 145q172 0 256 -101t86 -302v-699h-289v692q0 92 -40 133.5t-133 41.5q-122 0 -183 -104v-763h-289z" />
|
||||
<glyph unicode="o" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
|
||||
<glyph unicode="p" horiz-adv-x="1153" d="M111 -416v1498h268l10 -106q105 126 274 126q200 0 311 -148t111 -408v-15q0 -250 -113.5 -400.5t-306.5 -150.5q-164 0 -265 114v-510h-289zM400 320q53 -107 189 -107q207 0 207 339q0 151 -53.5 233t-155.5 82q-136 0 -187 -104v-443z" />
|
||||
<glyph unicode="q" horiz-adv-x="1157" d="M66 551q0 255 113.5 403t311.5 148q174 0 277 -133l19 113h254v-1498h-290v509q-100 -113 -262 -113q-193 0 -308 150t-115 421zM355 530q0 -155 54.5 -236t153.5 -81q133 0 188 106v447q-54 102 -186 102q-100 0 -155 -81t-55 -257z" />
|
||||
<glyph unicode="r" horiz-adv-x="747" d="M111 0v1082h273l8 -129q87 149 241 149q48 0 90 -13l-4 -278q-59 8 -104 8q-164 0 -215 -111v-708h-289z" />
|
||||
<glyph unicode="s" horiz-adv-x="1053" d="M56 344h274q4 -77 57 -118t142 -41q83 0 125.5 31.5t42.5 82.5q0 53 -52.5 83.5t-168.5 54.5q-386 81 -386 328q0 144 119.5 240.5t312.5 96.5q206 0 329.5 -97t123.5 -252h-289q0 62 -40 102.5t-125 40.5q-73 0 -113 -33t-40 -84q0 -48 45.5 -77.5t153.5 -51t182 -48.5 q229 -84 229 -291q0 -148 -127 -239.5t-328 -91.5q-136 0 -241.5 48.5t-165.5 133t-60 182.5z" />
|
||||
<glyph unicode="t" horiz-adv-x="692" d="M10 870v212h158v266h289v-266h185v-212h-185v-540q0 -60 23 -86t88 -26q48 0 85 7v-219q-85 -26 -175 -26q-304 0 -310 307v583h-158z" />
|
||||
<glyph unicode="u" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293z" />
|
||||
<glyph unicode="v" horiz-adv-x="1035" d="M13 1082h302l201 -729l201 729h302l-365 -1082h-276z" />
|
||||
<glyph unicode="w" horiz-adv-x="1505" d="M28 1082h279l141 -688l198 688h209l197 -689l142 689h279l-276 -1082h-242l-205 681l-205 -681h-241z" />
|
||||
<glyph unicode="x" horiz-adv-x="1042" d="M21 0l321 552l-307 530h310l178 -323l182 323h309l-308 -530l321 -552h-310l-193 340l-192 -340h-311z" />
|
||||
<glyph unicode="y" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89z" />
|
||||
<glyph unicode="z" horiz-adv-x="1042" d="M74 0v176l509 672h-494v234h867v-171l-513 -678h529v-233h-898z" />
|
||||
<glyph unicode="{" horiz-adv-x="676" d="M48 515v207q174 0 178 199v212q0 185 90 299t270 165l56 -161q-76 -28 -115 -97.5t-41 -192.5v-210q0 -226 -179 -317q179 -92 179 -319v-212q5 -234 156 -286l-56 -162q-360 101 -360 465v199q0 211 -178 211z" />
|
||||
<glyph unicode="|" horiz-adv-x="518" d="M173 -270v1726h175v-1726h-175z" />
|
||||
<glyph unicode="}" horiz-adv-x="676" d="M34 -198q152 54 156 290v212q0 226 183 314q-183 88 -183 319v209q-4 233 -156 290l56 161q179 -50 269 -163.5t91 -297.5v-215q4 -199 178 -199v-207q-178 0 -178 -209v-217q-8 -350 -360 -449z" />
|
||||
<glyph unicode="~" horiz-adv-x="1328" d="M106 415q0 186 90.5 299t240.5 113q78 0 142 -30t145.5 -107.5t148.5 -77.5q59 0 96.5 53t37.5 129l214 -1q0 -186 -93 -302t-240 -116q-74 0 -137.5 28.5t-146.5 108t-153 79.5q-58 0 -94 -50t-36 -128z" />
|
||||
<glyph unicode="¡" horiz-adv-x="578" d="M128 948q0 67 44.5 110t117.5 43t117.5 -43t44.5 -110t-46 -110t-116 -43t-116 43t-46 110zM137 -369l33 1008h241l33 -1008h-307z" />
|
||||
<glyph unicode="¢" horiz-adv-x="1178" d="M99 532v22q0 218 105 363t294 177v224h200v-225q163 -29 255.5 -140t94.5 -274h-272q-2 86 -52 137.5t-131 51.5q-102 0 -153 -74.5t-52 -234.5v-33q0 -168 51.5 -240.5t154.5 -72.5q80 0 130 44t52 117h272q-2 -145 -98.5 -250.5t-251.5 -134.5v-234h-200v233 q-187 30 -293 174t-106 370z" />
|
||||
<glyph unicode="£" horiz-adv-x="1217" d="M99 576v236h154l-7 227q0 202 123.5 319t330.5 117q212 0 333 -112.5t121 -304.5h-287q0 85 -43.5 130t-124.5 45q-66 0 -109.5 -49t-43.5 -145l9 -227h309v-236h-300l6 -139q0 -123 -62 -196h653v-241h-1059v241h92q72 18 72 179l-5 156h-162z" />
|
||||
<glyph unicode="¤" horiz-adv-x="1418" d="M81 118l135 137q-100 156 -100 353q0 204 109 365l-144 147l141 144l142 -145q155 115 348 115q194 0 349 -117l144 148l142 -145l-148 -151q107 -159 107 -361q0 -193 -98 -349l139 -141l-142 -145l-132 134q-159 -127 -361 -127q-203 0 -361 126l-129 -132zM302 608 q0 -118 54 -219.5t149.5 -160t206.5 -58.5q110 0 205.5 58.5t149.5 160t54 219.5q0 119 -54 219.5t-149 158.5t-206 58q-112 0 -207 -58t-149 -158.5t-54 -219.5z" />
|
||||
<glyph unicode="¥" horiz-adv-x="1254" d="M20 1456h330l276 -606l277 606h329l-375 -714h234v-175h-319v-115h319v-174h-319v-278h-300v278h-336v174h336v115h-336v175h260z" />
|
||||
<glyph unicode="¦" horiz-adv-x="516" d="M128 -270v795h260v-795h-260zM128 698v758h260v-758h-260z" />
|
||||
<glyph unicode="§" horiz-adv-x="1287" d="M92 -35l289 1q0 -89 64 -136.5t191 -47.5q112 0 170 37.5t58 100.5q0 65 -64.5 106t-247 91.5t-275 105.5t-138 130t-45.5 181q0 180 162 273q-136 103 -136 288q0 171 140.5 276t379.5 105q247 0 383 -113t136 -314h-289q0 87 -61.5 140.5t-168.5 53.5q-110 0 -170 -39 t-60 -107q0 -73 55.5 -110t240.5 -86t282.5 -104t144.5 -131.5t47 -184.5q0 -182 -162 -271q135 -102 135 -288q0 -175 -137.5 -274.5t-379.5 -99.5q-257 0 -400.5 107t-143.5 310zM383 563q0 -69 41.5 -106.5t165.5 -77.5l222 -67q82 47 82 140q0 62 -45.5 101.5 t-163.5 79.5l-227 71q-75 -42 -75 -141z" />
|
||||
<glyph unicode="¨" horiz-adv-x="956" d="M93 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM580 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="©" horiz-adv-x="1606" d="M86 729q0 202 93.5 375t259 272.5t357.5 99.5t357.5 -99.5t259 -272.5t93.5 -375q0 -204 -95 -377.5t-259.5 -272.5t-355.5 -99q-193 0 -357.5 100t-258.5 273t-94 376zM208 729q0 -170 77.5 -314t214 -227.5t296.5 -83.5t297.5 85t213.5 229t76 311q0 166 -75 308.5 t-212 228t-300 85.5q-159 0 -295.5 -82t-214.5 -226t-78 -314zM433 675v113q0 174 95.5 280.5t253.5 106.5q163 0 249.5 -82.5t86.5 -231.5h-156q0 96 -46 137.5t-134 41.5q-92 0 -142.5 -67.5t-51.5 -180.5v-123q0 -117 51 -184.5t143 -67.5q89 0 134 40.5t45 138.5h156 q0 -152 -87.5 -233t-247.5 -81t-254.5 106.5t-94.5 286.5z" />
|
||||
<glyph unicode="ª" horiz-adv-x="909" d="M137 919q0 110 84 170.5t257 60.5h102v51q0 127 -116 127q-65 0 -101.5 -25.5t-36.5 -73.5l-173 14q0 104 87.5 168.5t223.5 64.5q135 0 213 -72t78 -205v-316q0 -97 26 -178h-177q-10 27 -17 68q-77 -82 -201 -82q-118 0 -183.5 61.5t-65.5 166.5zM312 923 q0 -88 117 -88q40 0 82 18.5t69 43.5v136h-106q-76 -1 -119 -31t-43 -79z" />
|
||||
<glyph unicode="«" horiz-adv-x="1023" d="M77 515v19l280 390h186l-240 -400l240 -399h-186zM462 515v19l280 390h186l-240 -400l240 -399h-186z" />
|
||||
<glyph unicode="¬" horiz-adv-x="1129" d="M126 634v171h835v-431h-200v260h-635z" />
|
||||
<glyph unicode="­" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
|
||||
<glyph unicode="®" horiz-adv-x="1606" d="M86 729q0 202 93.5 375t259 272.5t357.5 99.5t357.5 -99.5t259 -272.5t93.5 -375q0 -204 -95 -377.5t-259.5 -272.5t-355.5 -99q-193 0 -357.5 100t-258.5 273t-94 376zM208 729q0 -170 77.5 -314t214 -227.5t296.5 -83.5t297.5 85t213.5 229t76 311q0 166 -75 308.5 t-212 228t-300 85.5q-159 0 -295.5 -82t-214.5 -226t-78 -314zM501 316v850h281q151 0 238 -68.5t87 -194.5q0 -112 -113 -174q61 -31 85.5 -86.5t24.5 -137.5t3.5 -116t13.5 -57v-16h-155q-13 34 -13 194q0 76 -33 109.5t-110 33.5h-158v-337h-151zM652 787h136 q74 0 121.5 32t47.5 84q0 70 -35.5 99.5t-128.5 30.5h-141v-246z" />
|
||||
<glyph unicode="¯" horiz-adv-x="1026" d="M148 1290v167h730v-167h-730z" />
|
||||
<glyph unicode="°" horiz-adv-x="795" d="M126 1200q0 114 81 195t191 81q109 0 188.5 -80.5t79.5 -195.5t-79.5 -193.5t-188.5 -78.5q-108 0 -190 78.5t-82 193.5zM273 1200q0 -52 36.5 -88t88.5 -36q53 0 87.5 35.5t34.5 88.5q0 52 -34.5 90t-87.5 38t-89 -38t-36 -90z" />
|
||||
<glyph unicode="±" horiz-adv-x="1100" d="M89 701v241h335v343h253v-343h328v-241h-328v-364h-253v364h-335zM113 1v235h864v-235h-864z" />
|
||||
<glyph unicode="²" horiz-adv-x="763" d="M55 1193q0 116 85.5 195t220.5 79q148 0 228.5 -64.5t80.5 -183.5q0 -70 -36 -128t-144 -145l-148 -115h351v-164h-620v138l287 257q56 49 80.5 91t24.5 65q0 84 -95 84q-50 0 -79.5 -31t-29.5 -78h-206z" />
|
||||
<glyph unicode="³" horiz-adv-x="763" d="M48 902h206q0 -34 34 -58.5t86 -24.5q60 0 86.5 26.5t26.5 61.5q0 92 -122 93h-92v136h82q119 0 119 88q0 35 -28.5 56t-77.5 21q-42 0 -71.5 -15.5t-29.5 -44.5h-205q0 102 84.5 163.5t215.5 61.5q145 0 230.5 -59.5t85.5 -166.5q0 -119 -135 -169q150 -41 150 -184 q0 -105 -91.5 -168.5t-239.5 -63.5q-142 0 -228 66.5t-86 180.5z" />
|
||||
<glyph unicode="´" horiz-adv-x="679" d="M101 1226l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="µ" horiz-adv-x="1261" d="M139 -416v1498h289v-623q0 -126 40.5 -185.5t139.5 -59.5q149 0 205 105v763h289v-1082h-269l-6 68q-89 -89 -225 -89q-102 0 -174 45v-440h-289z" />
|
||||
<glyph unicode="¶" horiz-adv-x="1003" d="M75 988q0 213 133 340.5t363 127.5h298v-1456h-219v520h-80q-230 0 -362.5 127t-132.5 341z" />
|
||||
<glyph unicode="·" horiz-adv-x="617" d="M140 697q0 69 46 112t117 43t117.5 -43t46.5 -112t-47 -111.5t-117 -42.5q-72 0 -117.5 43.5t-45.5 110.5z" />
|
||||
<glyph unicode="¸" horiz-adv-x="548" d="M98 -136l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
|
||||
<glyph unicode="¹" horiz-adv-x="763" d="M135 1176v158l374 121h19v-786h-204v548z" />
|
||||
<glyph unicode="º" horiz-adv-x="936" d="M118 1049v72q0 160 95.5 257.5t250.5 97.5t251 -97t96 -263v-72q0 -159 -94 -256.5t-251 -97.5q-158 0 -253 98t-95 261zM293 1044q0 -98 46.5 -153t126.5 -55q78 0 123.5 54t46.5 151v80q0 97 -46.5 152t-125.5 55q-78 0 -124.5 -54.5t-46.5 -156.5v-73z" />
|
||||
<glyph unicode="»" horiz-adv-x="1023" d="M85 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187zM478 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187z" />
|
||||
<glyph unicode="¼" horiz-adv-x="1470" d="M101 1171v158l374 121h19v-786h-204v548zM317 193l711 1138l141 -76l-711 -1138zM739 294l357 495h206v-463h88v-167h-88v-159h-205v159h-346zM935 326h162v212l-14 -22z" />
|
||||
<glyph unicode="½" horiz-adv-x="1559" d="M84 1177v158l374 121h19v-786h-204v548zM275 193l711 1138l141 -76l-711 -1138zM839 526q0 116 85.5 195t220.5 79q148 0 228.5 -64.5t80.5 -183.5q0 -70 -36 -128t-144 -145l-148 -115h351v-164h-620v138l287 257q56 49 80.5 91t24.5 65q0 84 -95 84q-50 0 -79.5 -31 t-29.5 -78h-206z" />
|
||||
<glyph unicode="¾" horiz-adv-x="1655" d="M94 903h206q0 -34 34 -58.5t86 -24.5q60 0 86.5 26.5t26.5 61.5q0 92 -122 93h-92v136h82q119 0 119 88q0 35 -28.5 56t-77.5 21q-42 0 -71.5 -15.5t-29.5 -44.5h-205q0 102 84.5 163.5t215.5 61.5q145 0 230.5 -59.5t85.5 -166.5q0 -119 -135 -169q150 -41 150 -184 q0 -105 -91.5 -168.5t-239.5 -63.5q-142 0 -228 66.5t-86 180.5zM478 193l711 1138l141 -76l-711 -1138zM897 294l357 495h206v-463h88v-167h-88v-159h-205v159h-346zM1093 326h162v212l-14 -22z" />
|
||||
<glyph unicode="¿" horiz-adv-x="1019" d="M69 6q0 159 153 312l97 93q50 45 69.5 94t21.5 138h256q0 -133 -31 -215t-110.5 -156t-108 -110t-43 -73t-14.5 -81q0 -157 154 -157q77 0 122.5 45t47.5 126h289q-2 -192 -123 -299.5t-331 -107.5q-213 0 -331 101.5t-118 289.5zM378 949q0 67 44.5 110t117.5 43 t117.5 -43t44.5 -110t-46 -110t-116 -43t-116 43t-46 110z" />
|
||||
<glyph unicode="À" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM323 1846h315l198 -310h-237zM507 543h364l-183 545z" />
|
||||
<glyph unicode="Á" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM507 543h364l-183 545zM553 1536l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="Â" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM312 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM507 543h364l-183 545z" />
|
||||
<glyph unicode="Ã" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM315 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5 q-35 0 -59.5 -25t-24.5 -71zM507 543h364l-183 545z" />
|
||||
<glyph unicode="Ä" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM309 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM507 543h364l-183 545zM796 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5 q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="Å" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM470 1730q0 86 65 145.5t158 59.5q92 0 157.5 -58.5t65.5 -146.5q0 -85 -64 -143t-159 -58q-97 0 -160 59t-63 142zM507 543h364l-183 545zM585 1730q0 -44 29 -75.5t79 -31.5t79 31.5t29 75.5 q0 46 -29.5 77.5t-78.5 31.5t-78.5 -31.5t-29.5 -77.5z" />
|
||||
<glyph unicode="Æ" horiz-adv-x="1925" d="M2 0l786 1456h1016v-236h-598l15 -355h502v-236h-492l16 -394h618v-235h-897l-14 333h-446l-167 -333h-339zM633 580h311l-24 570z" />
|
||||
<glyph unicode="Ç" horiz-adv-x="1340" d="M86 686v89q0 210 74 370t211.5 245.5t319.5 85.5q252 0 406 -135t178 -379h-300q-11 141 -78.5 204.5t-205.5 63.5q-150 0 -224.5 -107.5t-76.5 -333.5v-110q0 -236 71.5 -345t225.5 -109q139 0 207.5 63.5t78.5 196.5h300q-17 -235 -173.5 -370t-412.5 -135 q-280 0 -440.5 188.5t-160.5 517.5zM550 -137l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
|
||||
<glyph unicode="È" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM266 1849h315l198 -310h-237z" />
|
||||
<glyph unicode="É" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM496 1539l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="Ê" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM255 1557v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
|
||||
<glyph unicode="Ë" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM252 1678q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM739 1678q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5 t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="Ì" horiz-adv-x="597" d="M-70 1849h315l198 -310h-237zM149 0v1456h300v-1456h-300z" />
|
||||
<glyph unicode="Í" horiz-adv-x="597" d="M149 0v1456h300v-1456h-300zM159 1539l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="Î" horiz-adv-x="597" d="M-81 1557v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM149 0v1456h300v-1456h-300z" />
|
||||
<glyph unicode="Ï" horiz-adv-x="597" d="M-84 1678q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM149 0v1456h300v-1456h-300zM403 1678q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="Ð" horiz-adv-x="1361" d="M-20 642v183h180v631h448q192 0 343.5 -86.5t236.5 -246t85 -362.5v-67q0 -203 -83.5 -361t-235.5 -245t-343 -88h-451v642h-180zM460 241h145q178 0 271 117.5t93 335.5v68q0 222 -92 336.5t-269 114.5h-148v-388h219v-183h-219v-401z" />
|
||||
<glyph unicode="Ñ" horiz-adv-x="1446" d="M130 0v1456h300l585 -960v960h299v-1456h-300l-584 958v-958h-300zM349 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5 q-35 0 -59.5 -25t-24.5 -71z" />
|
||||
<glyph unicode="Ò" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM337 1846h315l198 -310h-237zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71 q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
|
||||
<glyph unicode="Ó" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119 q-151 0 -233 -117.5t-83 -344.5v-71zM567 1536l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="Ô" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM326 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM390 695q0 -223 82 -346 t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
|
||||
<glyph unicode="Õ" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM329 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5 t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
|
||||
<glyph unicode="Ö" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM323 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5 t-39.5 90.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71zM810 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="×" horiz-adv-x="1088" d="M65 373l307 313l-307 313l170 168l304 -311l305 311l170 -168l-307 -313l307 -313l-170 -168l-305 310l-304 -310z" />
|
||||
<glyph unicode="Ø" horiz-adv-x="1411" d="M93 702v57q0 215 77.5 378.5t219 251t323.5 87.5q175 0 314 -82l74 124h187l-134 -227q179 -198 179 -537v-59q0 -215 -76 -377t-217.5 -250t-324.5 -88q-164 0 -295 70l-85 -145h-188l143 242q-197 195 -197 555zM397 695q0 -172 49 -285l447 757q-73 61 -180 61 q-151 0 -233 -117.5t-83 -344.5v-71zM552 273q70 -47 163 -47q151 0 232.5 118.5t82.5 345.5v71q0 151 -38 256z" />
|
||||
<glyph unicode="Ù" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM301 1846h315l198 -310h-237z" />
|
||||
<glyph unicode="Ú" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM531 1536l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="Û" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM290 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
|
||||
<glyph unicode="Ü" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM287 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM774 1675 q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="Ý" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528zM496 1536l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="Þ" horiz-adv-x="1246" d="M133 0v1456h289v-267h230q162 -1 281.5 -56.5t183.5 -158t64 -236.5q0 -202 -138.5 -324t-378.5 -127h-242v-287h-289zM422 520h223q117 0 182 59t65 157t-63.5 158t-175.5 62h-231v-436z" />
|
||||
<glyph unicode="ß" horiz-adv-x="1292" d="M135 0v1101q0 220 124 339t350 119q191 0 306.5 -99.5t115.5 -270.5q0 -108 -53.5 -195t-53.5 -164q0 -37 30.5 -76.5t118.5 -117.5q151 -134 151 -282q0 -177 -115 -275.5t-330 -98.5q-81 0 -160 16t-119 40l54 229q98 -52 219 -52q79 0 121 36.5t42 99.5 q0 46 -34.5 89.5t-116.5 109.5q-150 120 -150 270q0 96 55 186.5t55 169.5q0 70 -44.5 111.5t-112.5 41.5q-159 0 -164 -213v-1114h-289z" />
|
||||
<glyph unicode="à" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M182 1536h315l198 -310h-237zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
|
||||
<glyph unicode="á" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM412 1226l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="â" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M171 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
|
||||
<glyph unicode="ã" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M174 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5 t80 76.5v186h-108q-217 0 -231 -150z" />
|
||||
<glyph unicode="ä" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M168 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM655 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5 q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="å" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M329 1420q0 86 65 145.5t158 59.5q92 0 157.5 -58.5t65.5 -146.5q0 -85 -64 -143t-159 -58q-97 0 -160 59t-63 142zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM444 1420q0 -44 29 -75.5t79 -31.5t79 31.5t29 75.5q0 46 -29.5 77.5 t-78.5 31.5t-78.5 -31.5t-29.5 -77.5z" />
|
||||
<glyph unicode="æ" horiz-adv-x="1729" d="M66 319q0 157 124 243t367 87h168v57q0 76 -40.5 119t-117.5 43q-82 0 -129.5 -35.5t-47.5 -87.5l-289 19q0 149 130.5 243.5t338.5 94.5q211 0 327 -110q126 112 326 110q212 0 333 -131.5t121 -363.5v-157h-668q11 -116 80.5 -177t186.5 -61q77 0 142.5 16t152.5 61 l77 -189q-73 -56 -180.5 -88t-221.5 -32q-247 0 -386 147q-64 -69 -166.5 -108t-227.5 -39q-186 0 -293 89t-107 250zM355 315q0 -56 40.5 -89.5t125.5 -33.5q49 0 107 22.5t97 57.5v189h-164q-95 -1 -150.5 -43t-55.5 -103zM1011 644h382v28q0 94 -43.5 145t-126.5 51 q-90 0 -144.5 -57.5t-67.5 -166.5z" />
|
||||
<glyph unicode="ç" horiz-adv-x="1068" d="M66 535v19q0 250 133 399t365 149q203 0 325.5 -115.5t124.5 -307.5h-271q-2 84 -52 136.5t-132 52.5q-101 0 -152.5 -73.5t-51.5 -238.5v-30q0 -167 51 -240t155 -73q80 0 130 44t52 117h271q-1 -110 -60 -201.5t-161.5 -142t-226.5 -50.5q-232 0 -366 147.5t-134 407.5 zM419 -137l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
|
||||
<glyph unicode="è" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM175 1536h315l198 -310h-237zM368 644h402v23 q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166z" />
|
||||
<glyph unicode="é" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM368 644h402v23q-2 96 -52 148.5t-142 52.5 q-86 0 -139.5 -58t-68.5 -166zM405 1226l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="ê" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM164 1244v16l296 276h168l300 -280v-12h-230l-154 145 l-154 -145h-226zM368 644h402v23q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166z" />
|
||||
<glyph unicode="ë" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM161 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5 t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM368 644h402v23q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166zM648 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="ì" horiz-adv-x="561" d="M-88 1521h315l198 -310h-237zM134 0v1082h289v-1082h-289z" />
|
||||
<glyph unicode="í" horiz-adv-x="561" d="M134 0v1082h289v-1082h-289zM141 1211l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="î" horiz-adv-x="561" d="M-99 1229v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM134 0v1082h289v-1082h-289z" />
|
||||
<glyph unicode="ï" horiz-adv-x="561" d="M-102 1350q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM134 0v1082h289v-1082h-289zM385 1350q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="ð" horiz-adv-x="1178" d="M84 468q0 231 123 364.5t329 133.5q136 0 244 -76q-49 152 -166 265l-191 -122l-78 114l152 97q-116 72 -264 111l91 224q238 -48 416 -180l171 109l77 -114l-139 -89q255 -262 256 -654v-74q0 -172 -66.5 -309t-185.5 -212.5t-266 -75.5q-144 0 -259 63.5t-179.5 176 t-64.5 248.5zM373 468q0 -112 60 -183.5t158 -71.5q103 0 164 90.5t61 248.5v111q-68 83 -215 83q-113 0 -170.5 -74.5t-57.5 -203.5z" />
|
||||
<glyph unicode="ñ" horiz-adv-x="1147" d="M105 0v1082h272l9 -125q116 145 311 145q172 0 256 -101t86 -302v-699h-289v692q0 92 -40 133.5t-133 41.5q-122 0 -183 -104v-763h-289zM198 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5 t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71z" />
|
||||
<glyph unicode="ò" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM207 1536h315l198 -310h-237zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83 q-106 0 -164 -82.5t-58 -255.5z" />
|
||||
<glyph unicode="ó" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5zM437 1226 l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="ô" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM196 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5 t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
|
||||
<glyph unicode="õ" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM199 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11 q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
|
||||
<glyph unicode="ö" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM193 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM355 530 q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5zM680 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="÷" horiz-adv-x="1168" d="M63 571v230h1028v-230h-1028zM415 277q0 68 45.5 110t117.5 42q71 0 117.5 -41.5t46.5 -110.5q0 -67 -45 -108.5t-119 -41.5q-75 0 -119 42t-44 108zM415 1089q0 68 45.5 110t117.5 42q71 0 117.5 -41.5t46.5 -110.5q0 -67 -45 -108.5t-119 -41.5q-75 0 -119 42t-44 108z " />
|
||||
<glyph unicode="ø" horiz-adv-x="1156" d="M66 551q0 161 62 287t178.5 195t270.5 69q101 0 186 -29l70 143h161l-103 -211q200 -149 200 -475q0 -249 -139 -399.5t-373 -150.5q-95 0 -176 26l-72 -148h-161l103 212q-207 146 -207 481zM355 530q0 -130 41 -208l260 532q-36 14 -79 14q-106 0 -164 -82.5 t-58 -255.5zM509 223q30 -10 70 -10q105 0 164 80.5t59 257.5q0 114 -37 196z" />
|
||||
<glyph unicode="ù" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM203 1536h315l198 -310h-237z" />
|
||||
<glyph unicode="ú" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM433 1226l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="û" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM192 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
|
||||
<glyph unicode="ü" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM189 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM676 1365 q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="ý" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89zM381 1226l197 310h315l-277 -310h-235z" />
|
||||
<glyph unicode="þ" horiz-adv-x="1162" d="M113 -416v1952h290v-547q100 113 262 113q198 0 310 -147t112 -410v-14q0 -250 -113.5 -400.5t-306.5 -150.5q-164 0 -264 113v-509h-290zM403 318q54 -105 188 -105q207 0 207 339q0 151 -53.5 233t-155.5 82q-132 0 -186 -102v-447z" />
|
||||
<glyph unicode="ÿ" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89zM137 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM624 1365q0 53 39.5 90 t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="Œ" horiz-adv-x="1983" d="M96 563v317q0 173 75.5 309.5t214 211.5t314.5 75q123 0 290 -20h884v-243h-673v-347h575v-235h-575v-390h675v-241h-886q-167 -20 -288 -20q-174 0 -312 73.5t-214.5 207t-79.5 302.5zM385 576q0 -176 83.5 -270t233.5 -94q94 0 198 13v1004q-112 14 -200 14 q-150 0 -232 -92.5t-83 -265.5v-309z" />
|
||||
<glyph unicode="œ" horiz-adv-x="1847" d="M83 538v13q0 161 61 286.5t177 195t270 69.5q231 0 371 -149q134 151 349 149q214 0 337 -129t123 -365v-158h-654q16 -113 81.5 -175.5t168.5 -62.5q85 0 152 16.5t149 61.5l79 -187q-73 -58 -182 -90.5t-228 -32.5q-233 0 -373 149q-138 -149 -371 -149t-371.5 149.5 t-138.5 408.5zM372 530q0 -155 56.5 -236.5t164.5 -81.5q106 0 163 80.5t57 258.5q0 153 -58 235t-164 82q-105 0 -162 -82t-57 -256zM1120 647h367v26q0 97 -46.5 146t-129.5 49q-77 0 -126 -57t-65 -164z" />
|
||||
<glyph unicode="Ÿ" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528zM252 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM739 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5 t-100 37.5t-38 89.5z" />
|
||||
<glyph unicode="ˆ" horiz-adv-x="1015" d="M123 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
|
||||
<glyph unicode="˜" horiz-adv-x="985" d="M117 1258q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71z" />
|
||||
<glyph unicode=" " horiz-adv-x="967" />
|
||||
<glyph unicode=" " horiz-adv-x="1935" />
|
||||
<glyph unicode=" " horiz-adv-x="967" />
|
||||
<glyph unicode=" " horiz-adv-x="1935" />
|
||||
<glyph unicode=" " horiz-adv-x="645" />
|
||||
<glyph unicode=" " horiz-adv-x="483" />
|
||||
<glyph unicode=" " horiz-adv-x="322" />
|
||||
<glyph unicode=" " horiz-adv-x="322" />
|
||||
<glyph unicode=" " horiz-adv-x="241" />
|
||||
<glyph unicode=" " horiz-adv-x="387" />
|
||||
<glyph unicode=" " horiz-adv-x="107" />
|
||||
<glyph unicode="‐" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
|
||||
<glyph unicode="‑" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
|
||||
<glyph unicode="‒" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
|
||||
<glyph unicode="–" horiz-adv-x="1294" d="M147 596v236h1036v-236h-1036z" />
|
||||
<glyph unicode="—" horiz-adv-x="1563" d="M33 596v236h1381v-236h-1381z" />
|
||||
<glyph unicode="‘" horiz-adv-x="479" d="M104 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229z" />
|
||||
<glyph unicode="’" horiz-adv-x="470" d="M58 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177z" />
|
||||
<glyph unicode="‚" horiz-adv-x="508" d="M66 -226q78 126 81 274v181h238l-1 -166q-1 -89 -50.5 -192t-131.5 -176z" />
|
||||
<glyph unicode="“" horiz-adv-x="831" d="M112 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229zM455 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229z" />
|
||||
<glyph unicode="”" horiz-adv-x="837" d="M72 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177zM419 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177z" />
|
||||
<glyph unicode="„" horiz-adv-x="825" d="M66 -246q78 134 81 293v216h238l-1 -199q-1 -97 -48 -206.5t-127 -182.5zM402 -246q86 148 89 294v215h238l-1 -203q-2 -96 -52.5 -205t-130.5 -180z" />
|
||||
<glyph unicode="•" horiz-adv-x="736" d="M135 731v35q0 104 66 167t170 63q108 0 172.5 -62t66.5 -163v-43q0 -103 -65.5 -165.5t-171.5 -62.5q-105 0 -171.5 62t-66.5 169z" />
|
||||
<glyph unicode="…" horiz-adv-x="1515" d="M133 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM606 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM1070 142q0 69 46.5 112 t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
|
||||
<glyph unicode=" " horiz-adv-x="387" />
|
||||
<glyph unicode="‹" horiz-adv-x="638" d="M108 515v19l280 390h186l-240 -400l240 -399h-186z" />
|
||||
<glyph unicode="›" horiz-adv-x="618" d="M80 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187z" />
|
||||
<glyph unicode=" " horiz-adv-x="483" />
|
||||
<glyph unicode="€" d="M89 516v152h169v124h-169v152h171q17 252 175.5 391.5t420.5 139.5q105 0 236 -31l-36 -243q-94 32 -185 32q-283 0 -310 -289h333v-152h-335v-124h335v-152h-335q5 -147 78.5 -221t228.5 -74q105 0 190 31l36 -242q-124 -29 -256 -29q-263 0 -416.5 141.5t-161.5 393.5 h-169z" />
|
||||
<glyph unicode="™" horiz-adv-x="1293" d="M116 1348v108h407v-108h-129v-431h-142v431h-136zM594 914v542h158l117 -368l126 368h149v-542h-128v352l-111 -352h-72l-111 353v-353h-128z" />
|
||||
<glyph unicode="◼" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
|
||||
<glyph unicode="ffi" horiz-adv-x="1901" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h356v50q2 204 125.5 314.5t348.5 110.5q134 0 329 -59l-42 -239q-98 29 -152.5 37.5t-116.5 8.5q-202 0 -202 -179v-44h213v-212h-213v-870h-290v870h-356v-870 h-290v870h-161zM1483 0v1082h290v-1082h-290z" />
|
||||
<glyph unicode="ffl" horiz-adv-x="1901" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h356v81q1 191 118.5 292.5t328.5 101.5q144 0 490 -32v-1525h-290v1312q-86 10 -161 10q-196 0 -196 -167v-73h215v-212h-215v-870h-290v870h-356v-870h-290 v870h-161z" />
|
||||
<hkern u1=" " u2="T" k="60" />
|
||||
<hkern u1=""" u2="w" k="-11" />
|
||||
<hkern u1="'" u2="w" k="-11" />
|
||||
<hkern u1="(" u2="Ÿ" k="-22" />
|
||||
<hkern u1="(" u2="Ý" k="-22" />
|
||||
<hkern u1="(" u2="Y" k="-22" />
|
||||
<hkern u1="(" u2="W" k="-38" />
|
||||
<hkern u1="(" u2="V" k="-20" />
|
||||
<hkern u1="/" u2="/" k="248" />
|
||||
<hkern u1="A" u2="w" k="33" />
|
||||
<hkern u1="A" u2="t" k="17" />
|
||||
<hkern u1="A" u2="?" k="81" />
|
||||
<hkern u1="C" u2="}" k="17" />
|
||||
<hkern u1="C" u2="]" k="12" />
|
||||
<hkern u1="C" u2=")" k="26" />
|
||||
<hkern u1="D" u2="Æ" k="33" />
|
||||
<hkern u1="E" u2="w" k="22" />
|
||||
<hkern u1="E" u2="f" k="18" />
|
||||
<hkern u1="F" u2="…" k="274" />
|
||||
<hkern u1="F" u2="„" k="274" />
|
||||
<hkern u1="F" u2="‚" k="274" />
|
||||
<hkern u1="F" u2="œ" k="21" />
|
||||
<hkern u1="F" u2="ÿ" k="24" />
|
||||
<hkern u1="F" u2="ý" k="24" />
|
||||
<hkern u1="F" u2="ü" k="22" />
|
||||
<hkern u1="F" u2="û" k="22" />
|
||||
<hkern u1="F" u2="ú" k="22" />
|
||||
<hkern u1="F" u2="ù" k="22" />
|
||||
<hkern u1="F" u2="ö" k="21" />
|
||||
<hkern u1="F" u2="õ" k="21" />
|
||||
<hkern u1="F" u2="ô" k="21" />
|
||||
<hkern u1="F" u2="ó" k="21" />
|
||||
<hkern u1="F" u2="ò" k="21" />
|
||||
<hkern u1="F" u2="ë" k="21" />
|
||||
<hkern u1="F" u2="ê" k="21" />
|
||||
<hkern u1="F" u2="é" k="21" />
|
||||
<hkern u1="F" u2="è" k="21" />
|
||||
<hkern u1="F" u2="ç" k="21" />
|
||||
<hkern u1="F" u2="å" k="34" />
|
||||
<hkern u1="F" u2="ä" k="34" />
|
||||
<hkern u1="F" u2="ã" k="34" />
|
||||
<hkern u1="F" u2="â" k="34" />
|
||||
<hkern u1="F" u2="á" k="34" />
|
||||
<hkern u1="F" u2="à" k="34" />
|
||||
<hkern u1="F" u2="Å" k="192" />
|
||||
<hkern u1="F" u2="Ä" k="192" />
|
||||
<hkern u1="F" u2="Ã" k="192" />
|
||||
<hkern u1="F" u2="Â" k="192" />
|
||||
<hkern u1="F" u2="Á" k="192" />
|
||||
<hkern u1="F" u2="À" k="192" />
|
||||
<hkern u1="F" u2="y" k="24" />
|
||||
<hkern u1="F" u2="v" k="24" />
|
||||
<hkern u1="F" u2="u" k="22" />
|
||||
<hkern u1="F" u2="r" k="26" />
|
||||
<hkern u1="F" u2="q" k="21" />
|
||||
<hkern u1="F" u2="o" k="21" />
|
||||
<hkern u1="F" u2="g" k="21" />
|
||||
<hkern u1="F" u2="e" k="21" />
|
||||
<hkern u1="F" u2="d" k="21" />
|
||||
<hkern u1="F" u2="c" k="21" />
|
||||
<hkern u1="F" u2="a" k="34" />
|
||||
<hkern u1="F" u2="T" k="-20" />
|
||||
<hkern u1="F" u2="J" k="208" />
|
||||
<hkern u1="F" u2="A" k="192" />
|
||||
<hkern u1="F" u2="." k="274" />
|
||||
<hkern u1="F" u2="," k="274" />
|
||||
<hkern u1="K" u2="w" k="63" />
|
||||
<hkern u1="L" u2="w" k="52" />
|
||||
<hkern u1="O" u2="Æ" k="33" />
|
||||
<hkern u1="P" u2="Æ" k="297" />
|
||||
<hkern u1="P" u2="t" k="-14" />
|
||||
<hkern u1="Q" u2="Ÿ" k="35" />
|
||||
<hkern u1="Q" u2="Ý" k="35" />
|
||||
<hkern u1="Q" u2="Y" k="35" />
|
||||
<hkern u1="Q" u2="W" k="20" />
|
||||
<hkern u1="Q" u2="V" k="28" />
|
||||
<hkern u1="Q" u2="T" k="33" />
|
||||
<hkern u1="R" u2="Ÿ" k="48" />
|
||||
<hkern u1="R" u2="Ý" k="48" />
|
||||
<hkern u1="R" u2="Y" k="48" />
|
||||
<hkern u1="R" u2="V" k="19" />
|
||||
<hkern u1="R" u2="T" k="50" />
|
||||
<hkern u1="T" u2="ø" k="95" />
|
||||
<hkern u1="T" u2="æ" k="84" />
|
||||
<hkern u1="T" u2="Æ" k="189" />
|
||||
<hkern u1="T" u2="»" k="146" />
|
||||
<hkern u1="T" u2="«" k="148" />
|
||||
<hkern u1="T" u2="w" k="47" />
|
||||
<hkern u1="T" u2="r" k="65" />
|
||||
<hkern u1="T" u2=" " k="60" />
|
||||
<hkern u1="V" u2="}" k="-19" />
|
||||
<hkern u1="V" u2="r" k="30" />
|
||||
<hkern u1="V" u2="]" k="-17" />
|
||||
<hkern u1="V" u2=")" k="-20" />
|
||||
<hkern u1="W" u2="}" k="-14" />
|
||||
<hkern u1="W" u2="r" k="21" />
|
||||
<hkern u1="W" u2="]" k="-12" />
|
||||
<hkern u1="W" u2=")" k="-15" />
|
||||
<hkern u1="Y" u2="•" k="45" />
|
||||
<hkern u1="Y" u2="ø" k="64" />
|
||||
<hkern u1="Y" u2="æ" k="63" />
|
||||
<hkern u1="Y" u2="Æ" k="96" />
|
||||
<hkern u1="Y" u2="»" k="51" />
|
||||
<hkern u1="Y" u2="«" k="82" />
|
||||
<hkern u1="Y" u2="}" k="-19" />
|
||||
<hkern u1="Y" u2="t" k="22" />
|
||||
<hkern u1="Y" u2="r" k="40" />
|
||||
<hkern u1="Y" u2="f" k="22" />
|
||||
<hkern u1="Y" u2="]" k="-18" />
|
||||
<hkern u1="Y" u2="*" k="49" />
|
||||
<hkern u1="Y" u2=")" k="-20" />
|
||||
<hkern u1="Y" u2="&" k="30" />
|
||||
<hkern u1="Z" u2="w" k="27" />
|
||||
<hkern u1="[" u2="Ü" k="18" />
|
||||
<hkern u1="[" u2="Û" k="18" />
|
||||
<hkern u1="[" u2="Ú" k="18" />
|
||||
<hkern u1="[" u2="Ù" k="18" />
|
||||
<hkern u1="[" u2="U" k="18" />
|
||||
<hkern u1="[" u2="J" k="18" />
|
||||
<hkern u1="e" u2="’" k="64" />
|
||||
<hkern u1="f" u2="”" k="-16" />
|
||||
<hkern u1="f" u2="“" k="-16" />
|
||||
<hkern u1="f" u2="’" k="-16" />
|
||||
<hkern u1="f" u2="‘" k="-16" />
|
||||
<hkern u1="f" u2="œ" k="24" />
|
||||
<hkern u1="f" u2="ë" k="24" />
|
||||
<hkern u1="f" u2="ê" k="24" />
|
||||
<hkern u1="f" u2="é" k="24" />
|
||||
<hkern u1="f" u2="è" k="24" />
|
||||
<hkern u1="f" u2="ç" k="24" />
|
||||
<hkern u1="f" u2="}" k="-19" />
|
||||
<hkern u1="f" u2="q" k="24" />
|
||||
<hkern u1="f" u2="g" k="24" />
|
||||
<hkern u1="f" u2="e" k="24" />
|
||||
<hkern u1="f" u2="d" k="24" />
|
||||
<hkern u1="f" u2="c" k="24" />
|
||||
<hkern u1="f" u2="]" k="-18" />
|
||||
<hkern u1="f" u2=")" k="-20" />
|
||||
<hkern u1="f" u2="'" k="-16" />
|
||||
<hkern u1="f" u2=""" k="-16" />
|
||||
<hkern u1="h" u2="’" k="104" />
|
||||
<hkern u1="k" u2="œ" k="20" />
|
||||
<hkern u1="k" u2="ë" k="20" />
|
||||
<hkern u1="k" u2="ê" k="20" />
|
||||
<hkern u1="k" u2="é" k="20" />
|
||||
<hkern u1="k" u2="è" k="20" />
|
||||
<hkern u1="k" u2="ç" k="20" />
|
||||
<hkern u1="k" u2="q" k="20" />
|
||||
<hkern u1="k" u2="g" k="20" />
|
||||
<hkern u1="k" u2="e" k="20" />
|
||||
<hkern u1="k" u2="d" k="20" />
|
||||
<hkern u1="k" u2="c" k="20" />
|
||||
<hkern u1="m" u2="’" k="120" />
|
||||
<hkern u1="n" u2="’" k="120" />
|
||||
<hkern u1="o" u2="’" k="112" />
|
||||
<hkern u1="r" u2="’" k="-16" />
|
||||
<hkern u1="r" u2="w" k="-17" />
|
||||
<hkern u1="r" u2="t" k="-50" />
|
||||
<hkern u1="r" u2="f" k="-20" />
|
||||
<hkern u1="t" u2="’" k="-24" />
|
||||
<hkern u1="t" u2="ö" k="30" />
|
||||
<hkern u1="t" u2="õ" k="30" />
|
||||
<hkern u1="t" u2="ô" k="30" />
|
||||
<hkern u1="t" u2="ó" k="30" />
|
||||
<hkern u1="t" u2="ò" k="30" />
|
||||
<hkern u1="t" u2="o" k="30" />
|
||||
<hkern u1="v" u2="f" k="-13" />
|
||||
<hkern u1="w" u2="…" k="124" />
|
||||
<hkern u1="w" u2="„" k="124" />
|
||||
<hkern u1="w" u2="‚" k="124" />
|
||||
<hkern u1="w" u2="." k="124" />
|
||||
<hkern u1="w" u2="," k="124" />
|
||||
<hkern u1="y" u2="f" k="-13" />
|
||||
<hkern u1="{" u2="Ü" k="20" />
|
||||
<hkern u1="{" u2="Û" k="20" />
|
||||
<hkern u1="{" u2="Ú" k="20" />
|
||||
<hkern u1="{" u2="Ù" k="20" />
|
||||
<hkern u1="{" u2="U" k="20" />
|
||||
<hkern u1="{" u2="J" k="20" />
|
||||
<hkern u1="À" u2="w" k="33" />
|
||||
<hkern u1="À" u2="t" k="17" />
|
||||
<hkern u1="À" u2="?" k="81" />
|
||||
<hkern u1="Á" u2="w" k="33" />
|
||||
<hkern u1="Á" u2="t" k="17" />
|
||||
<hkern u1="Á" u2="?" k="81" />
|
||||
<hkern u1="Â" u2="w" k="33" />
|
||||
<hkern u1="Â" u2="t" k="17" />
|
||||
<hkern u1="Â" u2="?" k="81" />
|
||||
<hkern u1="Ã" u2="w" k="33" />
|
||||
<hkern u1="Ã" u2="t" k="17" />
|
||||
<hkern u1="Ã" u2="?" k="81" />
|
||||
<hkern u1="Ä" u2="w" k="33" />
|
||||
<hkern u1="Ä" u2="t" k="17" />
|
||||
<hkern u1="Ä" u2="?" k="81" />
|
||||
<hkern u1="Å" u2="w" k="33" />
|
||||
<hkern u1="Å" u2="t" k="17" />
|
||||
<hkern u1="Å" u2="?" k="81" />
|
||||
<hkern u1="Ç" u2="}" k="17" />
|
||||
<hkern u1="Ç" u2="]" k="12" />
|
||||
<hkern u1="Ç" u2=")" k="26" />
|
||||
<hkern u1="È" u2="w" k="22" />
|
||||
<hkern u1="È" u2="f" k="18" />
|
||||
<hkern u1="É" u2="w" k="22" />
|
||||
<hkern u1="É" u2="f" k="18" />
|
||||
<hkern u1="Ê" u2="w" k="22" />
|
||||
<hkern u1="Ê" u2="f" k="18" />
|
||||
<hkern u1="Ë" u2="w" k="22" />
|
||||
<hkern u1="Ë" u2="f" k="18" />
|
||||
<hkern u1="Ð" u2="Æ" k="33" />
|
||||
<hkern u1="Ò" u2="Æ" k="33" />
|
||||
<hkern u1="Ó" u2="Æ" k="33" />
|
||||
<hkern u1="Ô" u2="Æ" k="33" />
|
||||
<hkern u1="Õ" u2="Æ" k="33" />
|
||||
<hkern u1="Ö" u2="Æ" k="33" />
|
||||
<hkern u1="Ý" u2="•" k="45" />
|
||||
<hkern u1="Ý" u2="ø" k="64" />
|
||||
<hkern u1="Ý" u2="æ" k="63" />
|
||||
<hkern u1="Ý" u2="Æ" k="96" />
|
||||
<hkern u1="Ý" u2="»" k="51" />
|
||||
<hkern u1="Ý" u2="«" k="82" />
|
||||
<hkern u1="Ý" u2="}" k="-19" />
|
||||
<hkern u1="Ý" u2="t" k="22" />
|
||||
<hkern u1="Ý" u2="r" k="40" />
|
||||
<hkern u1="Ý" u2="f" k="22" />
|
||||
<hkern u1="Ý" u2="]" k="-18" />
|
||||
<hkern u1="Ý" u2="*" k="49" />
|
||||
<hkern u1="Ý" u2=")" k="-20" />
|
||||
<hkern u1="Ý" u2="&" k="30" />
|
||||
<hkern u1="è" u2="’" k="64" />
|
||||
<hkern u1="é" u2="’" k="64" />
|
||||
<hkern u1="ê" u2="’" k="64" />
|
||||
<hkern u1="ë" u2="’" k="64" />
|
||||
<hkern u1="ñ" u2="’" k="120" />
|
||||
<hkern u1="ò" u2="’" k="112" />
|
||||
<hkern u1="ó" u2="’" k="112" />
|
||||
<hkern u1="ô" u2="’" k="112" />
|
||||
<hkern u1="õ" u2="’" k="112" />
|
||||
<hkern u1="ö" u2="’" k="112" />
|
||||
<hkern u1="ý" u2="f" k="-13" />
|
||||
<hkern u1="ÿ" u2="f" k="-13" />
|
||||
<hkern u1="Ÿ" u2="•" k="45" />
|
||||
<hkern u1="Ÿ" u2="ø" k="64" />
|
||||
<hkern u1="Ÿ" u2="æ" k="63" />
|
||||
<hkern u1="Ÿ" u2="Æ" k="96" />
|
||||
<hkern u1="Ÿ" u2="»" k="51" />
|
||||
<hkern u1="Ÿ" u2="«" k="82" />
|
||||
<hkern u1="Ÿ" u2="}" k="-19" />
|
||||
<hkern u1="Ÿ" u2="t" k="22" />
|
||||
<hkern u1="Ÿ" u2="r" k="40" />
|
||||
<hkern u1="Ÿ" u2="f" k="22" />
|
||||
<hkern u1="Ÿ" u2="]" k="-18" />
|
||||
<hkern u1="Ÿ" u2="*" k="49" />
|
||||
<hkern u1="Ÿ" u2=")" k="-20" />
|
||||
<hkern u1="Ÿ" u2="&" k="30" />
|
||||
<hkern u1="‘" u2="w" k="-11" />
|
||||
<hkern u1="’" u2="œ" k="104" />
|
||||
<hkern u1="’" u2="ö" k="144" />
|
||||
<hkern u1="’" u2="õ" k="144" />
|
||||
<hkern u1="’" u2="ô" k="144" />
|
||||
<hkern u1="’" u2="ó" k="144" />
|
||||
<hkern u1="’" u2="ò" k="144" />
|
||||
<hkern u1="’" u2="ë" k="104" />
|
||||
<hkern u1="’" u2="ê" k="104" />
|
||||
<hkern u1="’" u2="é" k="104" />
|
||||
<hkern u1="’" u2="è" k="104" />
|
||||
<hkern u1="’" u2="ç" k="104" />
|
||||
<hkern u1="’" u2="w" k="-11" />
|
||||
<hkern u1="’" u2="s" k="232" />
|
||||
<hkern u1="’" u2="q" k="104" />
|
||||
<hkern u1="’" u2="o" k="144" />
|
||||
<hkern u1="’" u2="g" k="104" />
|
||||
<hkern u1="’" u2="e" k="104" />
|
||||
<hkern u1="’" u2="d" k="104" />
|
||||
<hkern u1="’" u2="c" k="104" />
|
||||
<hkern u1="“" u2="w" k="-11" />
|
||||
<hkern u1="”" u2="w" k="-11" />
|
||||
<hkern g1="B" g2="V" k="24" />
|
||||
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
|
||||
<hkern g1="B" g2="T" k="27" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="85" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="122" />
|
||||
<hkern g1="C,Ccedilla" g2="T" k="29" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
|
||||
<hkern g1="T" g2="z" k="60" />
|
||||
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="208" />
|
||||
<hkern g1="T" g2="v,y,yacute,ydieresis" k="82" />
|
||||
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
|
||||
<hkern g1="T" g2="V" k="-16" />
|
||||
<hkern g1="T" g2="m,n,p,ntilde" k="89" />
|
||||
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
|
||||
<hkern g1="T" g2="T" k="-16" />
|
||||
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="65" />
|
||||
<hkern g1="T" g2="W" k="-15" />
|
||||
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
|
||||
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="258" />
|
||||
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="89" />
|
||||
<hkern g1="T" g2="x" k="77" />
|
||||
<hkern g1="T" g2="s" k="76" />
|
||||
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="272" />
|
||||
<hkern g1="T" g2="S" k="16" />
|
||||
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="168" />
|
||||
<hkern g1="T" g2="J" k="216" />
|
||||
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
|
||||
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
|
||||
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
|
||||
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
|
||||
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
|
||||
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="164" />
|
||||
<hkern g1="L" g2="v,y,yacute,ydieresis" k="123" />
|
||||
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="64" />
|
||||
<hkern g1="L" g2="V" k="206" />
|
||||
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="24" />
|
||||
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="279" />
|
||||
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="288" />
|
||||
<hkern g1="L" g2="T" k="205" />
|
||||
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="14" />
|
||||
<hkern g1="L" g2="W" k="93" />
|
||||
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
|
||||
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
|
||||
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
|
||||
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="178" />
|
||||
<hkern g1="P" g2="X" k="51" />
|
||||
<hkern g1="P" g2="Z" k="36" />
|
||||
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="404" />
|
||||
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
|
||||
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
|
||||
<hkern g1="P" g2="J" k="184" />
|
||||
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
|
||||
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
|
||||
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
|
||||
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
|
||||
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
|
||||
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
|
||||
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="215" />
|
||||
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
|
||||
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="157" />
|
||||
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
|
||||
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
|
||||
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
|
||||
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
|
||||
<hkern g1="X" g2="V" k="-14" />
|
||||
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
|
||||
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
|
||||
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="156" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="150" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="231" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="152" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="63" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
|
||||
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
|
||||
<hkern g1="W" g2="T" k="-14" />
|
||||
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
|
||||
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
|
||||
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="143" />
|
||||
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
|
||||
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
|
||||
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
|
||||
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
|
||||
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
|
||||
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
|
||||
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
|
||||
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
|
||||
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
|
||||
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
|
||||
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="17" />
|
||||
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
|
||||
<hkern g1="b,p,thorn" g2="z" k="15" />
|
||||
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
|
||||
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
|
||||
<hkern g1="b,p,thorn" g2="x" k="15" />
|
||||
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
|
||||
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
|
||||
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="80" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="88" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="167" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
|
||||
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="36" />
|
||||
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
|
||||
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
|
||||
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="173" />
|
||||
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
|
||||
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="30" />
|
||||
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="40" />
|
||||
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
|
||||
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
|
||||
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="91" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="37" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="92" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
|
||||
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="285" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
Before Width: | Height: | Size: 75 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,675 +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">
|
||||
<metadata></metadata>
|
||||
<defs>
|
||||
<font id="robotobold_italic" horiz-adv-x="1150" >
|
||||
<font-face units-per-em="2048" ascent="1536" descent="-512" />
|
||||
<missing-glyph horiz-adv-x="505" />
|
||||
<glyph unicode="fi" horiz-adv-x="1219" d="M65 870l38 212h146l9 52q37 204 173 315.5t349 109.5q83 -2 162.5 -19.5t158.5 -39.5l-61 -241q-138 48 -255 50q-99 0 -163 -47.5t-83 -133.5l-9 -46h219l-38 -212h-206l-151 -870h-283l151 870h-157zM698 0l188 1082h283l-187 -1082h-284z" />
|
||||
<glyph unicode="fl" horiz-adv-x="1227" d="M74 870l37 212l156 1l12 93q26 176 148 278.5t318 105.5h17l173 -7l311 -27l-257 -1526h-283l231 1314q-86 12 -147 12q-93 0 -152.5 -43t-74.5 -122l-13 -79h209l-37 -212h-208l-151 -870h-284l151 870h-156z" />
|
||||
<glyph horiz-adv-x="10" />
|
||||
<glyph horiz-adv-x="10" />
|
||||
<glyph unicode="
" horiz-adv-x="505" />
|
||||
<glyph horiz-adv-x="10" />
|
||||
<glyph unicode=" " horiz-adv-x="505" />
|
||||
<glyph unicode="	" horiz-adv-x="505" />
|
||||
<glyph unicode=" " horiz-adv-x="505" />
|
||||
<glyph unicode="!" horiz-adv-x="550" d="M41 131q-2 66 42 111.5t112 47.5q64 2 111 -39.5t49 -108.5q2 -66 -42 -112t-113 -48q-70 0 -114.5 44t-44.5 105zM134 447l142 1009h301l-208 -1009h-235z" />
|
||||
<glyph unicode=""" horiz-adv-x="647" d="M121 987l87 549h198l-25 -154l-99 -395h-161zM438 987l86 549h197l-24 -154l-99 -395h-160z" />
|
||||
<glyph unicode="#" horiz-adv-x="1193" d="M28 410l30 172h247l97 284h-222l31 174h251l144 416h184l-143 -416h180l143 416h186l-143 -416h209l-30 -174h-239l-98 -284h214l-30 -172h-243l-141 -410h-186l142 410h-179l-142 -410h-186l142 410h-218zM490 582h179l98 284h-180z" />
|
||||
<glyph unicode="$" d="M65 458l282 -1q-5 -121 39.5 -182t133.5 -63q85 -2 145 47.5t72 130.5q10 70 -23 121t-135.5 97t-169.5 91q-205 138 -190 363q11 172 129 281.5t309 129.5l41 214h157l-42 -220q152 -32 231.5 -152t74.5 -311l-283 1q12 236 -139 239q-79 2 -133 -48.5t-65 -132.5 q-9 -64 22.5 -113t121 -92t150.5 -80q239 -144 223 -386q-11 -174 -128.5 -281t-311.5 -127l-39 -199h-156l39 200q-176 26 -268.5 151.5t-86.5 321.5z" />
|
||||
<glyph unicode="%" horiz-adv-x="1477" d="M184 1099l5 67q11 142 103.5 228t232.5 84q134 -4 211.5 -89t69.5 -213l-6 -77q-14 -137 -108 -220t-227 -79q-130 2 -208.5 85t-72.5 214zM247 196l878 1124l137 -83l-876 -1126zM373 1095q-5 -56 18.5 -92t74.5 -38t90.5 34.5t51.5 99.5l10 78q7 59 -17.5 95.5 t-74.5 38.5q-55 2 -94.5 -37t-48.5 -98zM718 279l5 78q12 136 106 219.5t230 81.5q133 -4 211 -88t70 -213l-5 -67q-11 -145 -105.5 -230t-230.5 -81q-128 2 -208.5 85.5t-72.5 214.5zM904 277q-5 -55 21 -92.5t74 -39.5q58 -2 95 34t48 100l10 80q7 59 -18 94.5t-74 37.5 q-54 2 -93.5 -34.5t-51.5 -99.5z" />
|
||||
<glyph unicode="&" horiz-adv-x="1314" d="M41 385q10 183 217 325l98 63l-40 90q-52 126 -45 223q8 115 65 205.5t152 139t207 45.5q147 -4 241 -97.5t88 -233.5q-10 -189 -227 -332l-114 -75l188 -282q84 120 101 258h239q-19 -282 -193 -465l168 -249h-302l-55 84q-180 -107 -371 -103q-190 2 -309 114.5 t-108 289.5zM330 399q-11 -83 32 -133.5t118 -52.5q87 -3 209 59l-214 330l-24 -16q-106 -79 -121 -187zM517 1043q7 -53 49 -134l82 50q124 75 133 169q6 50 -22.5 83t-77.5 33q-62 2 -108 -43t-55 -111q-4 -24 -1 -47z" />
|
||||
<glyph unicode="'" horiz-adv-x="331" d="M120 985l87 551h207l-25 -163l-88 -388h-181z" />
|
||||
<glyph unicode="(" horiz-adv-x="707" d="M105 384q2 95 13 180l4 24q48 357 213.5 638.5t415.5 392.5l48 -161q-342 -261 -433 -839q-31 -196 -33 -352q-5 -411 188 -571l-63 -151q-216 120 -302 415q-57 198 -51 424z" />
|
||||
<glyph unicode=")" horiz-adv-x="710" d="M-104 -300q343 265 433 848q29 187 31 345q5 411 -186 572l63 151q118 -64 202.5 -186.5t125 -295.5t38.5 -356q-6 -278 -96 -540.5t-235.5 -440.5t-327.5 -255z" />
|
||||
<glyph unicode="*" horiz-adv-x="910" d="M100 1058l85 170l287 -128l43 356h192l-80 -347l307 118l26 -193l-328 -89l161 -272l-161 -104l-126 293l-222 -278l-149 119l257 263z" />
|
||||
<glyph unicode="+" horiz-adv-x="1094" d="M46 554l46 261h351l68 391h269l-68 -391h350l-46 -261h-349l-71 -408h-269l71 408h-352z" />
|
||||
<glyph unicode="," horiz-adv-x="495" d="M-118 -284l73 117q64 107 82 201l37 212h238l-29 -184q-41 -259 -252 -427z" />
|
||||
<glyph unicode="-" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
|
||||
<glyph unicode="." horiz-adv-x="587" d="M44 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
|
||||
<glyph unicode="/" horiz-adv-x="752" d="M-145 -125l794 1581h223l-795 -1581h-222z" />
|
||||
<glyph unicode="0" d="M87 454q-1 74 8 148l41 273q49 298 193 452t369 149q189 -4 292.5 -127.5t106.5 -344.5q1 -75 -8 -149l-42 -271q-50 -300 -192.5 -454.5t-369.5 -149.5q-189 4 -292 128t-106 346zM361 422q-5 -203 139 -210q203 -13 258 317l53 356q13 87 13 153q0 199 -140 206 q-202 9 -257 -308l-50 -338q-16 -106 -16 -176z" />
|
||||
<glyph unicode="1" d="M230 1001l44 247l608 210l37 1l-245 -1459h-282l192 1108z" />
|
||||
<glyph unicode="2" d="M1 0l33 210l517 485q159 149 211 242t39 182q-21 124 -143 127q-96 2 -160.5 -67t-78.5 -181l-282 -1q8 136 81 247t194.5 172.5t262.5 60.5q203 -4 316 -114t100 -293q-16 -206 -243 -430l-144 -137l-298 -268l602 -2l-37 -233h-970z" />
|
||||
<glyph unicode="3" d="M27 400h280q-2 -81 45.5 -132.5t132.5 -53.5q98 -2 168 55.5t82 150.5q13 100 -35.5 153t-147.5 56l-166 1l36 226l135 -1q103 0 172.5 57t80.5 153q10 81 -31 129.5t-123 50.5t-140.5 -44.5t-71.5 -120.5l-282 -2q9 176 151.5 288.5t346.5 110.5q206 -4 326 -115 t109 -294q-14 -208 -265 -326q98 -47 143.5 -133.5t39.5 -192.5q-7 -132 -81 -232t-198 -153.5t-268 -50.5q-195 2 -318 117t-121 303z" />
|
||||
<glyph unicode="4" d="M17 315l20 197l743 944h295l-157 -908h160l-41 -233h-160l-55 -315h-282l55 315h-578zM330 550l306 -2l99 518l-26 -36z" />
|
||||
<glyph unicode="5" d="M67 406h277q4 -89 49 -139.5t122 -52.5q100 -3 164.5 73t77.5 204q12 114 -34.5 180t-141.5 68q-106 2 -196 -78l-231 59l196 736h796l-38 -241h-559l-96 -315q89 56 210 56q187 0 289.5 -132.5t86.5 -349.5q-12 -144 -84.5 -259t-190.5 -177t-260 -59 q-123 1 -223.5 56.5t-156.5 153t-57 217.5z" />
|
||||
<glyph unicode="6" d="M97 559l11 90q47 376 275.5 599.5t569.5 223.5h38l-22 -239l-55 -1q-343 -18 -495 -378q125 123 293 119q118 -2 199.5 -66t119.5 -175t27 -245q-12 -143 -85.5 -261.5t-192.5 -184t-257 -62.5q-143 4 -245.5 80.5t-149.5 209.5t-31 290zM372 422q2 -94 43 -151t116 -58 q74 -3 135 48t90 137t19 175q-9 78 -50.5 123.5t-108.5 46.5q-73 2 -131 -36t-96 -97l-13 -90q-5 -45 -4 -98z" />
|
||||
<glyph unicode="7" d="M113 0l738 1222h-696l37 234h999l-27 -177l-740 -1279h-311z" />
|
||||
<glyph unicode="8" d="M62 390q14 242 285 366q-147 117 -137 305q7 124 73 220t177.5 147t243.5 48q189 -4 300 -112.5t100 -286.5q-14 -213 -250 -333q85 -59 127 -146t35 -190q-11 -196 -159 -314t-366 -114q-199 2 -319.5 114t-109.5 296zM348 411q-11 -86 30.5 -141.5t125.5 -57.5 q92 -2 156.5 58t77.5 158q11 86 -31 143t-124 59q-91 2 -156.5 -59t-78.5 -160zM489 1047q-9 -81 24.5 -132.5t104.5 -53.5q78 -2 134 54.5t67 147.5q9 82 -26 130.5t-104 50.5q-79 2 -134 -52.5t-66 -144.5z" />
|
||||
<glyph unicode="9" d="M143 954q14 161 102 291t229 192q93 41 204 39q180 -4 287 -126t121 -327q4 -71 -3 -141l-11 -86q-49 -381 -271.5 -596t-570.5 -215h-21l22 242h15q197 -3 324 85.5t193 270.5q-123 -114 -263 -112q-120 1 -204 64t-124.5 175.5t-28.5 243.5zM424 868q7 -80 47.5 -128 t106.5 -49q120 -4 212 123l17 121q5 42 5 95q-2 96 -40 154t-110 60q-72 1 -129.5 -51.5t-87 -143.5t-21.5 -181z" />
|
||||
<glyph unicode=":" horiz-adv-x="571" d="M43 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM184 956q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
|
||||
<glyph unicode=";" horiz-adv-x="531" d="M-97 -284l73 117q64 107 82 201l37 212h238l-29 -184q-41 -259 -252 -427zM167 956q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
|
||||
<glyph unicode="<" horiz-adv-x="1021" d="M36 509l41 236l901 365l-52 -293l-589 -205l519 -201l-46 -267z" />
|
||||
<glyph unicode="=" horiz-adv-x="1147" d="M81 313l42 236h869l-42 -236h-869zM156 746l42 236h869l-42 -236h-869z" />
|
||||
<glyph unicode=">" horiz-adv-x="1036" d="M33 129l52 292l600 206l-530 203l47 265l783 -365l-41 -235z" />
|
||||
<glyph unicode="?" horiz-adv-x="998" d="M132 1068q13 190 146.5 301.5t335.5 107.5q189 -4 295 -108t93 -277q-12 -170 -194 -323l-128 -106q-92 -85 -112 -216l-247 -1q9 130 53.5 219.5t138 165t125.5 110.5q86 95 75 202q-10 97 -113 100q-71 2 -120 -45t-65 -128zM228 134q-2 67 43 113t113 48 q64 2 111 -40.5t49 -109.5q2 -63 -42 -110t-114 -49q-67 0 -112.5 41t-47.5 107z" />
|
||||
<glyph unicode="@" horiz-adv-x="1788" d="M54 111q-30 225 36.5 471t215 441t345 295.5t414.5 97.5q293 -5 462.5 -178.5t182.5 -472.5q6 -169 -40 -336t-136 -282q-136 -173 -340 -168q-172 5 -218 143q-126 -144 -268 -141q-120 2 -182.5 97.5t-54.5 251.5q6 155 83 318t194.5 254t259.5 89q73 -2 137.5 -25 t155.5 -83l-134 -582l-7 -53q-11 -105 74 -110q126 -5 204 148t95 377l3 51q5 161 -45 284t-158 187.5t-265 67.5q-164 3 -311.5 -69.5t-263.5 -213.5t-182.5 -323.5t-73.5 -369.5q-9 -211 74 -353q117 -198 397 -201q161 -2 338 68l28 -158q-129 -86 -365 -86 q-201 2 -338.5 76t-216.5 199t-100 289zM690 320q-11 -160 90 -163q54 -3 109 49t80 120l127 478q-31 11 -69 13q-126 5 -210 -108t-121 -331z" />
|
||||
<glyph unicode="A" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542z" />
|
||||
<glyph unicode="B" horiz-adv-x="1278" d="M21 0l253 1456l454 -1q253 -1 380 -103q116 -93 116 -256q0 -15 -1 -31q-14 -221 -255 -323q87 -30 135 -112q42 -72 42 -167q0 -14 -1 -28q-14 -206 -161.5 -320.5t-402.5 -114.5h-559zM356 241l231 -1q108 0 181 53.5t87 144.5q4 24 4 45q-1 57 -29 95q-38 50 -129 55 l-276 1zM461 846l199 -2q111 2 181.5 52t84.5 139q3 19 3 35q0 141 -188 142l-216 1z" />
|
||||
<glyph unicode="C" horiz-adv-x="1310" d="M94 508q-1 22 -1 45q1 110 27 261q32 183 115.5 325t198.5 225q157 112 356 112h14q226 -4 358.5 -139.5t145.5 -376.5l-292 1q0 138 -55 202t-171 68h-13q-141 0 -233 -107q-96 -112 -130 -327q-28 -186 -28 -289v-24q5 -132 59 -194.5t151 -65.5h18q120 0 196 64 q80 68 107 196l291 2q-17 -151 -103 -267.5t-224 -178.5q-132 -60 -283 -60h-15q-144 3 -251 66.5t-168.5 184t-69.5 277.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1301" d="M21 0l253 1456l418 -1q147 -3 264.5 -66.5t190.5 -182.5t88 -268q4 -39 3 -78q0 -49 -5 -100l-7 -53q-44 -320 -251.5 -513.5t-503.5 -193.5h-450zM356 241l122 -1q202 0 324.5 148t140.5 447l2 32v14q0 155 -63 239q-66 88 -197 92l-160 1z" />
|
||||
<glyph unicode="E" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949z" />
|
||||
<glyph unicode="F" horiz-adv-x="1098" d="M21 0l253 1456h922l-43 -243h-628l-66 -376h560l-43 -242h-558l-104 -595h-293z" />
|
||||
<glyph unicode="G" horiz-adv-x="1363" d="M106 508q-2 29 -2 59q0 124 32 279q41 195 139.5 341.5t236.5 218.5q133 70 293 70h13q228 -4 357 -128.5t147 -356.5l-282 1q-11 122 -65 180t-161 62h-13q-176 0 -279 -162q-106 -169 -121 -489q-1 -24 -1 -46q0 -138 54 -219q62 -94 190 -96h15q139 0 239 71l49 251 h-266l39 221h556l-88 -581q-78 -99 -228 -152q-143 -51 -320 -51h-20q-149 1 -262 65.5t-178 185.5t-74 276z" />
|
||||
<glyph unicode="H" horiz-adv-x="1414" d="M21 0l253 1456h293l-103 -590h566l102 590h293l-252 -1456h-293l108 624h-565l-109 -624h-293z" />
|
||||
<glyph unicode="I" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293z" />
|
||||
<glyph unicode="J" horiz-adv-x="1120" d="M7 431l295 -1q-1 -18 -1 -34q0 -172 146 -175h8q82 0 140 58q61 61 79 169l172 1008h293l-171 -1008q-18 -138 -92 -247t-190 -167q-110 -55 -241 -55h-14q-206 4 -318 122q-106 112 -106 309v21z" />
|
||||
<glyph unicode="K" horiz-adv-x="1271" d="M21 0l253 1456h293l-112 -642l149 168l438 474h382l-629 -662l375 -794h-334l-260 581l-192 -178l-70 -403h-293z" />
|
||||
<glyph unicode="L" horiz-adv-x="1086" d="M21 0l253 1456h293l-211 -1215h618l-42 -241h-911z" />
|
||||
<glyph unicode="M" horiz-adv-x="1750" d="M21 0l253 1456h376l179 -1053l543 1053h390l-253 -1456h-294l72 415l142 648l-558 -1063h-201l-195 1100l-94 -717l-67 -383h-293z" />
|
||||
<glyph unicode="N" horiz-adv-x="1413" d="M21 0l253 1456h283l406 -973l169 973h292l-252 -1456h-284l-405 971l-169 -971h-293z" />
|
||||
<glyph unicode="O" horiz-adv-x="1382" d="M101 521q-2 32 -2 64q0 136 37 286q46 186 148 327t240 211q132 67 284 67h13q147 -3 257 -69.5t173 -191t72 -282.5q2 -30 2 -61q0 -147 -40 -301q-48 -186 -149 -322q-100 -136 -236 -204q-130 -65 -281 -65h-13q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597 q-1 -26 -1 -51q0 -140 48 -222q57 -96 177 -99h16q146 1 244 123q103 130 135 366l7 54l8 95q1 26 1 51q0 141 -48 219q-58 92 -175 96h-13q-174 0 -278 -162q-108 -168 -121 -470z" />
|
||||
<glyph unicode="P" horiz-adv-x="1291" d="M21 0l253 1456l510 -1q236 0 371 -131q120 -116 120 -296q0 -23 -2 -46q-16 -214 -178.5 -342t-414.5 -128l-276 1l-90 -513h-293zM445 756l244 -2q118 0 196 61t93 165q4 25 4 47q0 72 -38 119q-48 62 -143 66l-276 1z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1382" d="M98 522q-2 31 -2 63q0 98 20 211q27 152 90 279t154.5 218t208.5 139q110 44 232 44h16q146 -3 256 -69t174 -190t73 -284q2 -29 2 -58q0 -58 -7 -116l-17 -115q-67 -372 -340 -549l202 -198l-200 -157l-255 248q-47 -7 -88 -7h-18q-218 2 -352 148t-149 393zM391 597 q-1 -26 -1 -51q0 -140 48 -222q57 -95 177 -99h16q146 0 244 123q103 129 135 366q13 96 16 149q1 20 1 39q0 156 -51 234q-58 89 -173 93h-13q-174 0 -278 -162q-107 -168 -121 -470z" />
|
||||
<glyph unicode="R" horiz-adv-x="1278" d="M21 0l253 1456l482 -1q242 0 372 -114q117 -102 117 -276q0 -20 -1 -41q-21 -300 -320 -417l205 -591v-16h-312l-172 533h-238l-93 -533h-293zM449 776l218 -2q116 2 191.5 62.5t90.5 164.5q3 23 3 44q0 66 -34 108q-45 55 -143 59l-250 1z" />
|
||||
<glyph unicode="S" horiz-adv-x="1231" d="M38 459l293 -1q-1 -13 0 -25q0 -212 233 -216q107 0 176 47t82 125q3 16 3 30q0 97 -120 152l-193 77q-320 143 -320 388q0 12 1 25q7 122 80 216q73 93 205 147q127 52 274 52h11q211 -4 341 -126q128 -120 128 -319v-6h-292v18q0 86 -44 136q-48 55 -150 57h-8 q-95 0 -166 -46q-74 -48 -88 -130q-2 -11 -2 -22q0 -94 148 -151l132 -50l76 -35q277 -137 277 -378q0 -16 -1 -32q-9 -129 -82.5 -222.5t-199.5 -143.5q-119 -47 -262 -47h-17q-155 3 -276 65t-184 175q-55 98 -55 223v17z" />
|
||||
<glyph unicode="T" horiz-adv-x="1239" d="M144 1213l43 243h1152l-43 -243h-432l-210 -1213h-293l210 1213h-427z" />
|
||||
<glyph unicode="U" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-4 -30 -4 -58q0 -24 3 -47q20 -162 193 -168h13q115 0 190 68q79 72 102 206l164 961h294l-164 -960q-34 -241 -200 -381q-161 -136 -398 -136h-14q-154 3 -267 67q-114 64 -168 182q-41 89 -41 197q0 34 4 70z" />
|
||||
<glyph unicode="V" horiz-adv-x="1309" d="M145 1456h315l146 -1092l490 1092h336l-719 -1456h-306z" />
|
||||
<glyph unicode="W" horiz-adv-x="1747" d="M170 1456h286l29 -1028l392 1028h249l69 -1033l351 1033h299l-541 -1456h-295l-77 970l-381 -970h-295z" />
|
||||
<glyph unicode="X" horiz-adv-x="1272" d="M-81 0l547 748l-293 708h320l186 -500l343 500h352l-535 -736l302 -720h-324l-191 508l-351 -508h-356z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1214" d="M-34 0l33 191l871 1020l-693 2l43 243h1061l-33 -187l-870 -1026l708 -2l-42 -241h-1078z" />
|
||||
<glyph unicode="[" horiz-adv-x="562" d="M-31 -339l318 2033h421l-35 -223h-138l-248 -1587h138l-35 -223h-421z" />
|
||||
<glyph unicode="\" horiz-adv-x="848" d="M154 1456h275l316 -1581h-276z" />
|
||||
<glyph unicode="]" horiz-adv-x="562" d="M-135 -339l35 223h139l248 1587h-139l35 223h421l-318 -2033h-421z" />
|
||||
<glyph unicode="^" horiz-adv-x="878" d="M57 729l417 727h205l164 -727h-211l-89 454l-247 -454h-239z" />
|
||||
<glyph unicode="_" horiz-adv-x="897" d="M-143 -226l40 226h885l-39 -226h-886z" />
|
||||
<glyph unicode="`" horiz-adv-x="667" d="M204 1534l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="a" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5h-7q-61 -1 -105 -33q-46 -34 -59 -99l-283 -1q6 156 142 252q133 95 327 94h8q184 -4 288 -110q89 -91 89 -226q0 -22 -2 -45l-83 -518l-5 -64v-13q0 -62 17 -107l-1 -19h-277 q-11 36 -11 83v15q-118 -118 -266 -118h-10q-142 2 -236 92q-88 85 -87 208v16zM306 317q-2 -11 -1 -21q-1 -38 23 -64q30 -32 84 -33h9q117 0 204 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
|
||||
<glyph unicode="b" horiz-adv-x="1128" d="M3 0l266 1536h283l-109 -553q110 119 255 119h9q157 -2 246.5 -112.5t95.5 -305.5q0 -12 1 -26q0 -53 -7 -120q-30 -256 -156 -410q-122 -149 -313 -149h-13q-171 4 -260 138l-41 -117h-257zM340 325q38 -108 162 -112h8q201 0 247 302l6 44q7 64 7 106q0 14 -1 26 q-11 174 -144 177h-8q-119 0 -199 -113z" />
|
||||
<glyph unicode="c" horiz-adv-x="1046" d="M47 469l3 55l1 11q27 265 178 419q145 149 357 148h16q182 -4 290 -120q106 -113 106 -297v-7h-263q0 87 -38 137t-114 54h-8q-195 0 -237 -295q-12 -86 -12 -151q0 -17 1 -33q10 -175 150 -178h7q74 0 123 42q52 44 68 119l265 1q-7 -114 -71.5 -205t-172.5 -142 q-102 -48 -213 -48h-13q-197 3 -312 136q-111 129 -111 339v15z" />
|
||||
<glyph unicode="d" horiz-adv-x="1129" d="M49 399q-1 21 -1 42q0 41 4 80l6 45q24 166 92 292t168 187q95 58 211 58h11q151 -4 244 -121l106 554h283l-266 -1536h-252l16 116q-118 -137 -273 -137h-9q-101 1 -177 53t-117.5 149.5t-45.5 217.5zM330 393q10 -176 142 -179h10q113 0 197 112l77 430 q-39 107 -156 112h-7q-99 0 -165 -80q-68 -82 -93 -267q-6 -55 -6 -98q0 -16 1 -30z" />
|
||||
<glyph unicode="e" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290q77 131 198 203q115 68 252 68h16q209 -4 317 -154q87 -120 86 -292q0 -42 -5 -86l-16 -123h-663v-14q0 -95 51 -154q55 -63 150 -65h10q148 0 260 119l129 -160q-61 -91 -176 -143q-111 -50 -237 -50h-10q-142 1 -251.5 69.5t-163.5 188.5 q-44 98 -44 211q0 26 2 52zM360 643h388l6 26q3 22 3 42q0 17 -2 34q-10 58 -49 90.5t-99 33.5h-6q-75 0 -133 -49q-60 -51 -108 -177z" />
|
||||
<glyph unicode="f" horiz-adv-x="722" d="M74 870l37 212l156 1l14 108q26 173 141 271q113 97 286 97h7q61 -2 153 -21l-25 -225q-48 12 -83 12h-4q-72 0 -124 -38q-54 -39 -67 -117l-15 -88h209l-37 -212h-208l-151 -870h-284l151 870h-156z" />
|
||||
<glyph unicode="g" horiz-adv-x="1144" d="M-16 -251l140 172q94 -119 236 -123h13q102 0 175 58q78 61 106 173l16 65q-114 -114 -255 -114h-10q-158 2 -251 117.5t-102 300.5q-1 17 -1 35q0 49 6 109q30 251 163 408q131 153 329 153h8q173 -4 258 -125l37 105l259 -1l-177 -1045q-29 -216 -184 -342 q-150 -122 -370 -122h-14q-112 2 -214 48.5t-168 127.5zM334 424q0 -94 39.5 -150.5t114.5 -59.5h9q109 0 195 98l84 458q-43 94 -159 98h-7q-103 0 -176 -87q-75 -90 -94 -239q-6 -64 -6 -106v-12z" />
|
||||
<glyph unicode="h" horiz-adv-x="1122" d="M-4 0l266 1536h283l-112 -574q125 140 288 140h5q160 -4 236 -116q60 -89 61 -230q0 -36 -4 -74l-114 -682h-282l115 685q3 24 3 46q0 13 -1 26q-10 108 -126 111h-9q-109 0 -191 -98l-136 -770h-282z" />
|
||||
<glyph unicode="i" horiz-adv-x="537" d="M17 0l188 1082h284l-188 -1082h-284zM238 1357v6q0 63 44 105q46 44 111 44h6q60 0 105 -39q47 -41 49 -106v-5q1 -59 -41 -103q-44 -46 -114 -48h-6q-58 0 -104 38q-48 40 -50 108z" />
|
||||
<glyph unicode="j" horiz-adv-x="526" d="M-262 -421l23 230q50 -11 87 -13h4q129 0 158 144l196 1142h284l-194 -1141q-23 -181 -130 -282q-106 -99 -271 -99h-7q-68 2 -150 19zM233 1357v6q0 62 42 103q44 44 113 46q69 0 113.5 -41t46.5 -104v-6q0 -63 -42 -105q-44 -43 -113 -45h-6q-59 0 -105 38 q-47 40 -49 108z" />
|
||||
<glyph unicode="k" horiz-adv-x="1071" d="M3 0l266 1536h283l-146 -834l55 59l321 321h362l-473 -465l301 -617h-309l-192 431l-131 -114l-55 -317h-282z" />
|
||||
<glyph unicode="l" horiz-adv-x="537" d="M17 0l267 1536h283l-266 -1536h-284z" />
|
||||
<glyph unicode="m" horiz-adv-x="1730" d="M3 0l187 1082l263 1l-23 -123q128 142 307 142h10q100 -2 166 -46t89 -119q140 165 327 165h9q148 -3 224 -102q65 -85 65 -236q0 -24 -1 -50l-2 -25l-115 -689h-283l115 691q3 30 3 56v13q-7 105 -120 108q-116 0 -199 -124l-3 -23l-126 -721h-282l115 689q3 30 3 56v13 q-7 106 -119 109h-6q-103 0 -187 -101l-135 -766h-282z" />
|
||||
<glyph unicode="n" horiz-adv-x="1123" d="M-3 0l188 1082l264 1l-24 -128q127 147 305 147h10q153 -3 226 -112q57 -86 57 -223q0 -38 -4 -79l-114 -688h-282l116 691q3 24 3 46q0 13 -1 25q-13 102 -128 105h-8q-106 0 -191 -103l-135 -764h-282z" />
|
||||
<glyph unicode="o" horiz-adv-x="1133" d="M58 524q26 268 182 426q150 152 366 152h16q143 -2 246 -74q104 -70 152 -196q38 -97 38 -212q0 -33 -3 -67q-23 -257 -179 -417q-153 -156 -376 -156h-11q-141 2 -244 72.5t-152 195.5q-38 97 -38 210q0 32 3 66zM337 421q2 -96 45 -151.5t121 -57.5h8q124 0 196 120 q69 116 69 299v25q-4 96 -46.5 153.5t-121.5 59.5h-8q-120 -1 -194 -119q-70 -113 -69 -299v-30z" />
|
||||
<glyph unicode="p" horiz-adv-x="1128" d="M-69 -416l259 1498l260 1l-19 -109q114 128 267 128h9q159 -4 247 -115.5t94 -302.5v-26q0 -53 -6 -120q-21 -170 -89 -302t-169 -196q-96 -61 -213 -61h-11q-157 4 -248 117l-99 -512h-282zM339 318q37 -101 159 -105h7q97 0 163 79q68 82 94 267l6 96v10q0 90 -36 144 q-37 57 -109 59h-9q-117 0 -194 -104z" />
|
||||
<glyph unicode="q" horiz-adv-x="1132" d="M49 400q-1 21 -1 42q0 41 4 81l6 44q24 168 92.5 294t167.5 185q95 57 210 57h12q168 -4 257 -136l46 116l252 -1l-260 -1498h-284l101 511q-109 -115 -253 -115h-10q-101 1 -177 53t-117.5 150.5t-45.5 216.5zM331 394q10 -178 142 -181h8q114 0 196 105l82 450 q-39 97 -157 101h-7q-101 0 -168 -83q-69 -87 -89 -242q-8 -79 -8 -125q0 -14 1 -25z" />
|
||||
<glyph unicode="r" horiz-adv-x="735" d="M3 0l188 1082l265 1l-26 -132q102 153 252 153q42 0 98 -14l-36 -279q-58 10 -95 10h-10q-144 0 -229 -113l-125 -708h-282z" />
|
||||
<glyph unicode="s" horiz-adv-x="1031" d="M9 346l266 -2q4 -155 166 -157q78 0 128.5 32t60.5 86q2 9 2 17q0 67 -113 99l-91 23q-314 87 -314 302v12q6 154 136 250q128 95 307 94h7q183 -2 296 -97t115 -253l-280 1q2 139 -138 141q-66 0 -114.5 -33t-59.5 -89q-1 -8 -1 -15q0 -68 122 -98l40 -9 q138 -33 211 -75.5t113 -105.5q37 -59 36 -139v-12q-3 -103 -66.5 -180t-173.5 -119q-103 -39 -217 -39h-16q-180 2 -300 103.5t-122 262.5z" />
|
||||
<glyph unicode="t" horiz-adv-x="681" d="M56 870l37 212h153l46 266h283l-47 -266h180l-37 -212h-180l-92 -542q-2 -15 -2 -28q0 -31 10 -50q14 -27 68 -29h6q20 0 80 5l-20 -221q-69 -23 -149 -23h-13q-139 2 -207 87q-58 72 -58 188q0 20 2 42l93 571h-153z" />
|
||||
<glyph unicode="u" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103h10q125 0 207 101l135 767h284l-188 -1082h-263l21 112q-117 -132 -290 -132h-8q-156 2 -236 112q-65 90 -65 226q0 31 3 64z" />
|
||||
<glyph unicode="v" horiz-adv-x="1014" d="M92 1082h286l80 -725l308 725h304l-523 -1082h-270z" />
|
||||
<glyph unicode="w" horiz-adv-x="1470" d="M115 1082h264l17 -681l309 681h204l71 -688l257 688h281l-455 -1082h-236l-80 677l-316 -677h-236z" />
|
||||
<glyph unicode="x" horiz-adv-x="1021" d="M-82 0l408 566l-209 516h286l121 -321l227 321h317l-392 -544l219 -538h-286l-133 338l-239 -338h-319z" />
|
||||
<glyph unicode="y" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2h10q130 0 192 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21z" />
|
||||
<glyph unicode="z" horiz-adv-x="1021" d="M-33 0l33 191l603 655l-475 2l41 234h843l-32 -185l-609 -662l510 -2l-41 -233h-873z" />
|
||||
<glyph unicode="{" horiz-adv-x="666" d="M39 513l19 207q185 8 215 222l32 230q59 325 404 429l47 -166q-168 -65 -201 -304l-32 -229q-34 -193 -223 -289q69 -51 101 -128.5t23 -175.5l-31 -236l-4 -57q-7 -162 110 -215l-61 -161q-158 53 -235 173q-77 121 -59 293l28 205q5 42 2 78q-10 113 -135 124z" />
|
||||
<glyph unicode="|" horiz-adv-x="512" d="M31 -270l270 1726h172l-270 -1726h-172z" />
|
||||
<glyph unicode="}" horiz-adv-x="666" d="M-94 -197q168 65 201 304l32 230q34 193 226 287q-72 49 -104 128t-23 177l31 236l4 57q7 161 -109 215l64 158q161 -54 234.5 -174.5t55.5 -288.5l-28 -204q-5 -43 -2 -78q10 -115 135 -126l-19 -207q-186 -10 -215 -221l-27 -199q-51 -353 -409 -461z" />
|
||||
<glyph unicode="~" horiz-adv-x="1298" d="M80 415q12 186 109.5 301t248.5 112q77 -2 138.5 -35.5t133.5 -108t131 -74.5q62 0 104.5 50t55.5 134l202 1q-6 -118 -52 -216.5t-124 -152.5t-179 -52q-77 2 -137.5 35t-117.5 92t-86 75t-64 17q-59 0 -99.5 -47.5t-54.5 -132.5z" />
|
||||
<glyph unicode="¡" horiz-adv-x="571" d="M-37 -369l208 1008h235l-143 -1008h-300zM184 943q-2 65 42 111t113 48q64 2 111 -39.5t49 -109.5q2 -69 -44 -114t-111 -45q-63 -2 -110.5 40t-49.5 109z" />
|
||||
<glyph unicode="¢" horiz-adv-x="1153" d="M96 523q25 246 150 392.5t326 178.5l47 224h196l-47 -228q133 -32 207.5 -139.5t72.5 -272.5h-264l-1 34q-13 151 -147 157q-101 5 -167.5 -74t-87.5 -243q-12 -110 -9 -161q5 -176 146 -179q78 -2 131 42.5t68 118.5l266 2q-11 -151 -117.5 -254.5t-273.5 -131.5 l-49 -234h-196l50 236q-164 38 -243 182t-58 350z" />
|
||||
<glyph unicode="£" horiz-adv-x="1190" d="M-6 0l43 240l75 -2q48 19 75 59.5t41 123.5l21 155h-158l41 236h150l27 221q26 208 162 327t336 115q191 -4 296.5 -116t101.5 -302l-280 1q5 174 -136 177q-70 2 -120.5 -51t-65.5 -144l-27 -228h300l-41 -236h-291l-17 -147q-16 -109 -101 -192l640 4l-43 -241h-1029z " />
|
||||
<glyph unicode="¤" horiz-adv-x="1385" d="M-3 132l154 125q-57 185 -37 345q26 215 171 375l-115 157l148 130l109 -143q177 116 354 112q185 -2 321 -116l170 148l123 -159l-169 -139q62 -186 42 -352q-24 -203 -157 -360l111 -151l-149 -131l-101 132q-182 -129 -369 -125q-200 4 -331 126l-153 -132zM295 599 q-15 -110 19 -209.5t110 -158.5t181 -63q114 -4 219 56t175.5 166t88.5 227q15 110 -19 209t-110 157t-180 62q-115 4 -221.5 -56.5t-175.5 -164.5t-87 -225z" />
|
||||
<glyph unicode="¥" horiz-adv-x="1226" d="M75 278l31 174h325l21 115h-327l31 175h261l-245 713l310 1l161 -604l373 604h337l-492 -712l225 -2l-33 -175h-308l-21 -115h310l-31 -174h-308l-49 -278h-293l49 278h-327z" />
|
||||
<glyph unicode="¦" horiz-adv-x="511" d="M-28 -270l139 795h254l-138 -795h-255zM140 698l132 758h254l-132 -758h-254z" />
|
||||
<glyph unicode="§" horiz-adv-x="1258" d="M-24 -34h281q-4 -91 51 -137t160 -46q109 0 175 38t80 106q20 98 -136 155l-97 31q-228 70 -322 167.5t-85 245.5q10 177 205 286q-96 113 -86 275q12 166 143 269t341 118l67 2q218 -4 339.5 -116.5t117.5 -311.5h-280q3 91 -46 141.5t-141 52.5q-103 3 -172.5 -38.5 t-84.5 -113.5q-22 -117 153 -165.5t267.5 -95t143.5 -104.5q85 -96 76 -236q-7 -102 -62.5 -170t-142.5 -114q95 -111 84 -275q-8 -117 -75.5 -203t-191.5 -134t-280 -45q-230 2 -358 112t-124 306zM372 555q-24 -121 144 -176l79 -25l130 -43q95 56 115 149 q21 110 -140 170l-221 75q-90 -55 -107 -150z" />
|
||||
<glyph unicode="¨" horiz-adv-x="937" d="M210 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM683 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="©" horiz-adv-x="1568" d="M114 722q17 152 86 292.5t180.5 247.5t245 162t276.5 52q183 -4 325 -102.5t214.5 -272t51.5 -366.5q-21 -189 -120.5 -356t-254.5 -272q-194 -131 -413 -127q-185 4 -326.5 103.5t-213.5 273.5t-51 365zM235 722q-22 -159 29.5 -302.5t165 -228.5t262.5 -87 q161 -4 306.5 78.5t246.5 230.5t126 323q22 159 -29.5 301.5t-163.5 226t-264 87.5q-162 4 -311.5 -81t-247.5 -234.5t-120 -313.5zM444 669l11 110q19 184 122.5 291.5t258.5 105.5q145 -4 225 -87t78 -230l-152 2q13 177 -146 181q-93 2 -155.5 -69.5t-77 -196t-15 -145 t1.5 -47.5q3 -73 40 -118.5t102 -48.5q169 -7 200 179l152 1q-10 -150 -101 -234.5t-244 -80.5q-148 4 -230.5 113.5t-69.5 273.5z" />
|
||||
<glyph unicode="ª" horiz-adv-x="892" d="M187 911q2 115 94.5 177.5t260.5 62.5l106 -2l12 55l4 46q-3 75 -81 78q-120 4 -147 -99l-173 13q7 110 94.5 173.5t219.5 61.5q121 -2 193 -77t62 -200l-53 -347l-4 -59q-1 -44 8 -92h-164l-3 72q-89 -83 -201 -83q-105 0 -166.5 60t-61.5 160zM362 915q-7 -38 15.5 -60 t70.5 -22q69 0 161 63l28 137h-80q-84 -3 -135 -34.5t-60 -83.5z" />
|
||||
<glyph unicode="«" horiz-adv-x="1002" d="M60 513l1 21l330 390h203l-316 -416l162 -382l-167 -1zM433 513l1 21l330 390h203l-316 -416l162 -382l-167 -1z" />
|
||||
<glyph unicode="¬" horiz-adv-x="1105" d="M127 634l30 171h812l-75 -431h-196l46 260h-617z" />
|
||||
<glyph unicode="­" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
|
||||
<glyph unicode="®" horiz-adv-x="1568" d="M114 722q17 152 86 292.5t180.5 247.5t245 162t276.5 52q183 -4 325 -102.5t214.5 -272t51.5 -366.5q-21 -189 -120.5 -356t-254.5 -272q-194 -131 -413 -127q-185 4 -326.5 103.5t-213.5 273.5t-51 365zM235 722q-22 -160 30 -304t164 -227t263 -87q157 -4 304.5 78 t248.5 230.5t126 323.5q22 159 -29.5 301.5t-163.5 226t-264 87.5q-162 4 -311.5 -81t-247.5 -234.5t-120 -313.5zM452 316l133 850l256 -1q142 -5 218.5 -73t71.5 -182q-3 -58 -36 -103t-101 -84q68 -49 74 -149q1 -29 -5.5 -89.5t-4.5 -88.5l4 -63l-1 -19l-148 1 q-6 37 -4 73q1 43 12 128q7 63 -14 97t-87 38l-167 2l-53 -337h-148zM674 787l116 -1q82 3 134 35.5t63 87.5q11 58 -17 89t-117 34l-141 1z" />
|
||||
<glyph unicode="¯" horiz-adv-x="1005" d="M250 1290l27 167h710l-27 -167h-710z" />
|
||||
<glyph unicode="°" horiz-adv-x="781" d="M228 1191q2 117 86.5 202.5t195.5 83.5q104 -2 173.5 -82t67.5 -186q-2 -116 -84.5 -200t-193.5 -82q-105 2 -176 79.5t-69 184.5zM371 1193q-6 -45 20 -81t74 -36q51 0 93 37t51 94q6 49 -19 85.5t-72 36.5q-51 0 -94.5 -40t-52.5 -96z" />
|
||||
<glyph unicode="±" horiz-adv-x="1077" d="M15 1l37 235h840l-37 -235h-840zM101 701l38 241h325l54 343h247l-54 -343h319l-38 -241h-318l-57 -364h-248l57 364h-325z" />
|
||||
<glyph unicode="²" horiz-adv-x="750" d="M81 667l26 150l335 270q95 79 107 141q8 36 -10 57t-54 21q-97 0 -121 -112l-204 -2q8 126 96.5 202.5t216.5 74.5q131 -2 207.5 -66.5t74.5 -175.5q-5 -138 -169 -255l-78 -55l-130 -84l336 -2l-30 -164h-603z" />
|
||||
<glyph unicode="³" horiz-adv-x="750" d="M96 904l195 -1q7 -82 102 -82q52 0 89 25t46 68q16 80 -94 85h-94l10 137h81q54 2 90.5 26.5t45.5 68.5q5 34 -18 52.5t-59 18.5q-80 0 -108 -60l-208 -1q7 106 89.5 167t212.5 59q136 -3 214.5 -61.5t75.5 -157.5q-3 -118 -158 -183q58 -20 87 -65.5t28 -105.5 q-2 -111 -97.5 -176.5t-239.5 -62.5q-129 2 -208.5 69t-81.5 180z" />
|
||||
<glyph unicode="´" horiz-adv-x="669" d="M186 1226l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="µ" horiz-adv-x="1233" d="M-42 -416l260 1498h282l-103 -622l-6 -83q-7 -160 125 -163q133 -4 221 104l135 764h282l-188 -1082h-248l8 69q-106 -93 -230 -91q-93 0 -169 48l-87 -442h-282z" />
|
||||
<glyph unicode="¶" horiz-adv-x="983" d="M149 980q19 214 168 345.5t372 131.5l313 -1l-253 -1456h-214l90 520l-52 1q-211 3 -326.5 130t-97.5 329z" />
|
||||
<glyph unicode="·" horiz-adv-x="608" d="M154 692q-2 67 43 113t113 48q65 2 112.5 -41t49.5 -110q2 -65 -43.5 -112.5t-114.5 -47.5q-64 -2 -111 39.5t-49 110.5z" />
|
||||
<glyph unicode="¸" horiz-adv-x="542" d="M-45 -465l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
|
||||
<glyph unicode="¹" horiz-adv-x="750" d="M229 1172l30 168l369 115l25 1l-128 -787h-200l95 543z" />
|
||||
<glyph unicode="º" horiz-adv-x="918" d="M200 1044l5 63q13 167 117.5 270.5t258.5 99.5q148 -4 229 -105.5t71 -250.5l-6 -66q-16 -171 -120.5 -270.5t-253.5 -95.5q-144 4 -228 103.5t-73 251.5zM372 969q5 -61 38.5 -97.5t89.5 -37.5q76 -3 131 53.5t70 156.5l11 101l-1 49q-15 132 -128 135q-77 3 -132 -52.5 t-70 -155.5l-9 -80q-3 -36 0 -72z" />
|
||||
<glyph unicode="»" horiz-adv-x="1002" d="M-10 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203zM371 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203z" />
|
||||
<glyph unicode="¼" horiz-adv-x="1436" d="M194 1167l30 168l369 115l25 1l-128 -787h-200l95 543zM235 204l878 1124l137 -83l-876 -1126zM652 159l14 150l419 479l203 2l-80 -466l96 1l-31 -166h-85l-29 -159h-200l28 159h-335zM866 328l152 -3l44 216l-18 -25z" />
|
||||
<glyph unicode="½" horiz-adv-x="1522" d="M178 1173l30 168l369 115l25 1l-128 -787h-200l95 543zM194 204l878 1124l137 -83l-876 -1126zM726 0l26 150l335 270q95 79 107 141q8 36 -10 57t-54 21q-97 0 -121 -112l-204 -2q8 126 96.5 202.5t216.5 74.5q131 -2 207.5 -66.5t74.5 -175.5q-5 -138 -169 -255 l-78 -55l-130 -84l336 -2l-30 -164h-603z" />
|
||||
<glyph unicode="¾" horiz-adv-x="1615" d="M141 905l195 -1q7 -82 102 -82q52 0 89 25t46 68q16 80 -94 85h-94l10 137h81q54 2 90.5 26.5t45.5 68.5q5 34 -18 52.5t-59 18.5q-80 0 -108 -60l-208 -1q7 106 89.5 167t212.5 59q136 -3 214.5 -61.5t75.5 -157.5q-3 -118 -158 -183q58 -20 87 -65.5t28 -105.5 q-2 -111 -97.5 -176.5t-239.5 -62.5q-129 2 -208.5 69t-81.5 180zM391 204l878 1124l137 -83l-876 -1126zM806 159l14 150l419 479l203 2l-80 -466l96 1l-31 -166h-85l-29 -159h-200l28 159h-335zM1020 328l152 -3l44 216l-18 -25z" />
|
||||
<glyph unicode="¿" horiz-adv-x="998" d="M-31 -2q11 161 179 311l145 121q86 79 109 213l246 1q-8 -122 -50 -211t-128 -162l-68 -57q-127 -106 -144 -216q-9 -64 17 -106t95 -44q71 -2 120.5 42t68.5 131l282 2q-13 -191 -145.5 -301.5t-335.5 -106.5q-186 2 -294 104t-97 279zM432 944q-2 69 44 114t111 45 q64 2 111 -39.5t49 -109.5q2 -69 -44 -114t-111 -45q-64 -2 -111 39.5t-49 109.5z" />
|
||||
<glyph unicode="À" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM532 1844l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="Á" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM690 1536l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="Â" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM471 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM489 543h351l-82 542z" />
|
||||
<glyph unicode="Ã" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM477 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z M489 543h351l-82 542z" />
|
||||
<glyph unicode="Ä" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM485 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM489 543h351l-82 542zM958 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33 t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="Å" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM651 1723q0 90 66 151.5t157 61.5q87 0 148.5 -58.5t61.5 -140.5q2 -86 -63.5 -147.5t-159.5 -61.5q-86 0 -147 56t-63 139zM764 1723q-7 -40 15 -70t65 -30q47 0 83 32.5 t45 81.5q6 43 -17 72.5t-63 29.5q-47 0 -84.5 -34t-43.5 -82z" />
|
||||
<glyph unicode="Æ" horiz-adv-x="1877" d="M-111 0l1015 1456h996l-42 -236h-580l-47 -355h488l-42 -236h-477l-53 -394h600l-41 -235h-871l44 333h-423l-220 -333h-347zM615 582l298 -2l73 552z" />
|
||||
<glyph unicode="Ç" horiz-adv-x="1310" d="M94 508q-7 123 25.5 306t116 325t198.5 225q162 116 370 112q226 -4 358.5 -139.5t145.5 -376.5l-292 1q0 138 -55 202t-171 68q-150 5 -246.5 -107t-129.5 -327q-32 -209 -28 -313q5 -132 59 -194.5t151 -65.5q134 -5 214.5 63.5t106.5 196.5l291 2 q-17 -151 -103 -267.5t-224 -179t-298 -59.5q-144 3 -251 66.5t-168.5 184t-69.5 277.5zM393 -466l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
|
||||
<glyph unicode="È" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM477 1847l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="É" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM635 1539l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="Ê" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM416 1554v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
|
||||
<glyph unicode="Ë" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM430 1675q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM903 1675q-2 54 36 91.5t94 39.5q53 2 95.5 -33 t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="Ì" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM151 1847l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="Í" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM308 1539l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="Î" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM90 1554v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
|
||||
<glyph unicode="Ï" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM104 1675q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM577 1675q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z " />
|
||||
<glyph unicode="Ð" horiz-adv-x="1331" d="M-13 642l33 183h174l110 631l416 -1q147 -2 265.5 -66t191.5 -183t88 -268q8 -87 -2 -178l-7 -53q-44 -320 -251.5 -513.5t-503.5 -193.5h-450l111 642h-175zM386 241l122 -1q202 0 324.5 148t140.5 447l2 32q3 165 -63 253t-197 92l-160 1l-68 -388h213l-33 -183h-212z " />
|
||||
<glyph unicode="Ñ" horiz-adv-x="1413" d="M21 0l253 1456h283l406 -973l169 973h292l-252 -1456h-284l-405 971l-169 -971h-293zM510 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8 q-76 -3 -101 -98z" />
|
||||
<glyph unicode="Ò" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM546 1844l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="Ó" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM704 1536l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="Ô" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM485 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
|
||||
<glyph unicode="Õ" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM491 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
|
||||
<glyph unicode="Ö" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM499 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM972 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5 t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="×" horiz-adv-x="1065" d="M25 386l353 313l-244 313l180 155l242 -310l348 311l148 -182l-353 -314l244 -312l-179 -156l-243 310l-348 -309z" />
|
||||
<glyph unicode="Ø" horiz-adv-x="1379" d="M12 -94l194 244q-138 232 -99 545l8 58q30 214 129.5 382t249 256t330.5 86q169 -4 294 -84l99 125l202 -1l-183 -229q120 -232 84 -529l-5 -40q-42 -333 -234.5 -538t-474.5 -202q-155 2 -279 72l-112 -146zM387 552q-5 -72 3 -144l575 764q-51 54 -152 59 q-158 5 -262.5 -122t-139.5 -360q-19 -128 -24 -197zM479 268q51 -40 139 -45q147 -5 249 108t143 329.5t34 359.5z" />
|
||||
<glyph unicode="Ù" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM511 1844l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="Ú" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM669 1536l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="Û" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM450 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
|
||||
<glyph unicode="Ü" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM464 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5 t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM937 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="Ý" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545zM635 1536l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="Þ" horiz-adv-x="1219" d="M24 0l253 1456h282l-47 -267l177 -1q234 -1 365 -122t116 -320q-11 -141 -88 -245t-206 -159.5t-286 -55.5l-233 1l-51 -287h-282zM397 520l198 -1q113 0 194.5 59.5t98.5 165.5q14 95 -36 151t-147 60l-232 1z" />
|
||||
<glyph unicode="ß" horiz-adv-x="1263" d="M26 0l188 1101q29 218 168 341t352 117q174 -4 275 -104.5t90 -257.5q-3 -46 -19 -86.5t-61 -115.5t-58 -106t-20 -68q-8 -46 12.5 -94.5t80.5 -123t86.5 -131t24.5 -109.5q-9 -179 -139.5 -282.5t-335.5 -101.5q-166 2 -279 59l76 227q89 -55 205 -53q72 0 127 38 t68 107q8 48 -13.5 96t-87.5 123.5t-92 135.5q-20 46 -17 96q3 45 19 84.5t58.5 110t57.5 106.5t20 75q8 62 -22.5 103t-93.5 44q-82 3 -133 -56t-68 -177l-187 -1098h-282z" />
|
||||
<glyph unicode="à" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM342 1534l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="á" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM500 1226l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="â" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM281 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
|
||||
<glyph unicode="ã" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM287 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98zM306 317 q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
|
||||
<glyph unicode="ä" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM295 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95 q-25 -33 -31 -81zM768 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="å" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM461 1413q0 90 66 151.5t157 61.5q87 0 148.5 -58.5t61.5 -140.5q2 -86 -63.5 -147.5t-159.5 -61.5 q-86 0 -147 56t-63 139zM574 1413q-7 -40 15 -70t65 -30q47 0 83 32.5t45 81.5q6 43 -17 72.5t-63 29.5q-47 0 -84.5 -34t-43.5 -82z" />
|
||||
<glyph unicode="æ" horiz-adv-x="1687" d="M15 311q7 164 144.5 251.5t377.5 87.5l167 -2l13 60q5 33 2 62q-14 96 -115 99q-70 2 -123 -30.5t-66 -93.5l-281 18q8 160 148 252t338 88q204 -5 302 -110q151 112 331 108q192 -4 295.5 -139.5t79.5 -349.5l-25 -162h-642q-10 -108 42 -171t156 -65q81 -2 154 20 t145 56l61 -193q-135 -117 -396 -117q-243 5 -352 146q-170 -150 -404 -146q-106 1 -189.5 42.5t-125.5 115t-37 173.5zM299 307q-10 -53 25 -84.5t102 -31.5q96 0 216 80l38 190l-139 1q-99 -3 -165 -45t-77 -110zM981 643h369l7 31q6 36 4 71q-7 118 -124 124 q-171 6 -256 -226z" />
|
||||
<glyph unicode="ç" horiz-adv-x="1046" d="M47 469l3 55l1 11q27 264 178 418.5t373 148.5q183 -4 290.5 -119.5t105.5 -304.5h-263q0 87 -38 137t-114 54q-202 6 -245 -295q-15 -109 -11 -184q10 -175 150 -178q78 -2 130 42.5t68 118.5l265 1q-7 -114 -71.5 -205t-172 -142t-226.5 -48q-197 3 -312 136t-111 354z M277 -466l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
|
||||
<glyph unicode="è" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM323 1534l291 2l143 -310l-211 1zM360 643 h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177z" />
|
||||
<glyph unicode="é" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM360 643h388l6 26q6 40 1 76 q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177zM481 1226l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="ê" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM262 1241v23l321 272l161 1l261 -277v-21 l-216 5l-123 144l-175 -143zM360 643h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177z" />
|
||||
<glyph unicode="ë" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM276 1362q-2 54 36 91.5t95 39.5 q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM360 643h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177zM749 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5 t-41 90.5z" />
|
||||
<glyph unicode="ì" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM77 1519l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="í" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM234 1211l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="î" horiz-adv-x="554" d="M16 1226v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM25 0l188 1082h282l-188 -1082h-282z" />
|
||||
<glyph unicode="ï" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM30 1347q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM503 1347q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="ð" horiz-adv-x="1153" d="M64 460q13 148 80 266t175.5 180.5t245.5 60.5q129 -4 237 -78q-6 140 -92 265l-211 -123l-62 128l161 89q-81 67 -235 109l108 222q223 -53 371 -180l192 112l60 -129l-146 -80q87 -155 121 -313t13 -336l-6 -52q-34 -281 -197.5 -454t-390.5 -168q-129 3 -230.5 65.5 t-153.5 174t-40 241.5zM346 460q-12 -109 31.5 -177.5t128.5 -71.5q101 -3 173.5 78.5t103.5 236.5l23 126l3 13q-27 41 -77 62t-111 21q-112 2 -186.5 -78.5t-88.5 -209.5z" />
|
||||
<glyph unicode="ñ" horiz-adv-x="1123" d="M-3 0l188 1082l264 1l-24 -128q130 151 315 147q153 -3 226 -112t53 -302l-114 -688h-282l116 691q5 39 2 71q-13 102 -128 105q-111 4 -199 -103l-135 -764h-282zM310 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10 q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
|
||||
<glyph unicode="ò" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5 q-126 4 -201.5 -118.5t-69.5 -329.5zM354 1534l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="ó" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5 q-126 4 -201.5 -118.5t-69.5 -329.5zM512 1226l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="ô" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM293 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM337 421q2 -96 45 -151.5t121 -57.5 q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5z" />
|
||||
<glyph unicode="õ" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM299 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10 q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5z" />
|
||||
<glyph unicode="ö" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM307 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5 t-43.5 90.5zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5zM780 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="÷" horiz-adv-x="1143" d="M55 571l40 230h1000l-41 -230h-999zM346 272q-2 66 43 112t114 46q67 2 113 -40t48 -108t-43.5 -111t-112.5 -45q-68 -2 -114 39.5t-48 106.5zM487 1084q-2 66 43 112t114 46q67 2 113 -40t48 -108t-43.5 -111t-112.5 -45q-68 -2 -114 39.5t-48 106.5z" />
|
||||
<glyph unicode="ø" horiz-adv-x="1131" d="M27 -141l150 215q-119 131 -127 328q-3 57 5 143q20 162 98 292.5t200.5 199.5t273.5 67q91 -1 180 -32l100 144l174 -1l-150 -214q114 -134 123 -328q2 -58 -6 -141q-20 -162 -97 -289t-201 -197t-275 -68q-87 1 -171 29l-103 -149zM320 423q-4 -52 6 -103l356 540 q-32 12 -66 12q-127 2 -204 -111t-92 -338zM425 218q30 -8 59 -9q108 -2 182 80.5t102 242.5q11 76 14 119q3 48 -4 98z" />
|
||||
<glyph unicode="ù" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM362 1534l291 2l143 -310l-211 1z" />
|
||||
<glyph unicode="ú" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM520 1226l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="û" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM301 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
|
||||
<glyph unicode="ü" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM315 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5 q-53 -2 -94.5 33.5t-43.5 90.5zM788 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="ý" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2q138 -4 202 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21zM470 1226l240 310h327l-318 -310h-249z" />
|
||||
<glyph unicode="þ" horiz-adv-x="1137" d="M-67 -416l338 1952h284l-108 -549q113 119 262 115q156 -2 245.5 -112.5t95.5 -305.5q2 -62 -6 -146q-21 -173 -89.5 -304t-169 -194.5t-223.5 -60.5q-154 4 -248 116l-98 -511h-283zM341 316q37 -101 159 -103q98 -3 165.5 74.5t92.5 229.5l6 42l6 96q2 97 -35.5 154 t-109.5 59q-120 4 -202 -102z" />
|
||||
<glyph unicode="ÿ" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2q138 -4 202 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21zM265 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5z M738 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="Œ" horiz-adv-x="1934" d="M96 576l46 299q43 276 227.5 439t445.5 163l73 -2l208 -19h877l-43 -243h-652l-61 -347h558l-41 -235h-557l-68 -390h655l-42 -241h-842l-196 -17l-87 -1q-162 4 -284 81.5t-180 214.5t-37 298zM375 445q8 -106 68 -166.5t163 -64.5q78 -3 199 9l187 1008q-90 14 -183 16 q-153 0 -254 -97.5t-129 -273.5l-48 -301q-9 -67 -3 -130z" />
|
||||
<glyph unicode="œ" horiz-adv-x="1802" d="M74 523l3 22q26 227 158 378q161 184 409 180q107 -2 196 -41t142 -108q162 152 360 148q132 -4 224 -66.5t133 -173.5t24 -249l-25 -163h-628q-7 -105 40.5 -168t140.5 -67q137 -7 305 76l64 -190q-68 -60 -174.5 -91t-230.5 -29q-106 0 -195.5 38.5t-143.5 108.5 q-166 -152 -382 -148q-141 2 -241.5 72t-147.5 195t-31 276zM351 422q0 -98 41 -154t118 -58q108 -3 180 83t91 239l2 21l5 67q7 241 -161 249q-103 3 -173 -77t-93 -235l-5 -34zM1091 646h355q13 66 10 102q-5 57 -39 89t-92 33q-128 3 -206 -159z" />
|
||||
<glyph unicode="Ÿ" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545zM430 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM903 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92 q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
|
||||
<glyph unicode="ˆ" horiz-adv-x="995" d="M234 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
|
||||
<glyph unicode="˜" horiz-adv-x="965" d="M220 1258q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
|
||||
<glyph unicode=" " horiz-adv-x="968" />
|
||||
<glyph unicode=" " horiz-adv-x="1936" />
|
||||
<glyph unicode=" " horiz-adv-x="968" />
|
||||
<glyph unicode=" " horiz-adv-x="1936" />
|
||||
<glyph unicode=" " horiz-adv-x="645" />
|
||||
<glyph unicode=" " horiz-adv-x="484" />
|
||||
<glyph unicode=" " horiz-adv-x="322" />
|
||||
<glyph unicode=" " horiz-adv-x="322" />
|
||||
<glyph unicode=" " horiz-adv-x="242" />
|
||||
<glyph unicode=" " horiz-adv-x="387" />
|
||||
<glyph unicode=" " horiz-adv-x="107" />
|
||||
<glyph unicode="‐" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
|
||||
<glyph unicode="‑" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
|
||||
<glyph unicode="‒" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
|
||||
<glyph unicode="–" horiz-adv-x="1265" d="M146 596l49 236h1008l-50 -236h-1007z" />
|
||||
<glyph unicode="—" horiz-adv-x="1526" d="M104 596l65 236h1344l-67 -236h-1342z" />
|
||||
<glyph unicode="‘" horiz-adv-x="475" d="M178 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224z" />
|
||||
<glyph unicode="’" horiz-adv-x="466" d="M142 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381z" />
|
||||
<glyph unicode="‚" horiz-adv-x="503" d="M-77 -223q96 144 121 261l34 191h232l-22 -143q-36 -232 -231 -391z" />
|
||||
<glyph unicode="“" horiz-adv-x="816" d="M186 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224zM518 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224z" />
|
||||
<glyph unicode="”" horiz-adv-x="822" d="M156 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381zM492 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381z" />
|
||||
<glyph unicode="„" horiz-adv-x="810" d="M-80 -244q96 148 124 282l40 225h232l-31 -191q-39 -238 -225 -397zM245 -244q105 161 132 279l40 228h232l-27 -177q-38 -244 -236 -411z" />
|
||||
<glyph unicode="•" horiz-adv-x="724" d="M156 720l1 34q3 108 69 175.5t173 67.5q99 -2 158.5 -64t59.5 -164l-1 -40q-6 -105 -73.5 -169t-168.5 -62q-99 2 -158.5 65t-59.5 157z" />
|
||||
<glyph unicode="…" horiz-adv-x="1480" d="M51 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM510 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM960 137q-2 67 43 113t113 48 q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
|
||||
<glyph unicode=" " horiz-adv-x="387" />
|
||||
<glyph unicode="‹" horiz-adv-x="629" d="M90 513l1 21l330 390h203l-316 -416l162 -382l-167 -1z" />
|
||||
<glyph unicode="›" horiz-adv-x="609" d="M-15 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203z" />
|
||||
<glyph unicode=" " horiz-adv-x="484" />
|
||||
<glyph unicode="€" d="M70 516l27 152h164l22 124h-164l27 152l154 -1q73 263 243.5 399t418.5 134q100 -2 238 -32l-59 -243q-87 33 -173 35q-276 4 -373 -293l333 1l-27 -152h-324l-22 -124h326l-27 -152h-319q-9 -66 -1 -119q12 -83 71 -128t156 -46q84 -2 193 30l12 -245q-132 -29 -243 -25 q-155 1 -273.5 71t-172.5 191.5t-32 272.5z" />
|
||||
<glyph unicode="™" horiz-adv-x="1264" d="M241 1348l19 108h397l-19 -108h-125l-75 -431h-140l75 431h-132zM629 914l95 542h150l48 -364l185 364h153l-95 -542h-126l58 328l-155 -327l-71 -2l-51 365l-64 -364h-127z" />
|
||||
<glyph unicode="◼" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
|
||||
<glyph unicode="ffi" horiz-adv-x="1854" d="M74 870l37 212l156 1l11 85q24 189 140.5 291.5t296.5 100.5q55 -1 153 -22l-25 -225q-48 12 -83 12q-74 1 -126.5 -37t-67.5 -112l-16 -94h334l6 36q36 211 169 325t347 115h10q84 -1 164 -19.5t161 -41.5l-65 -238q-142 47 -256 49q-92 0 -158 -44t-87 -137l-9 -46 l218 1l-37 -212h-207l-151 -870h-283l151 870h-343l-151 -870h-284l151 870h-156zM1334 0l187 1082h284l-188 -1082h-283z" />
|
||||
<glyph unicode="ffl" horiz-adv-x="1854" d="M74 870l37 212l156 1l14 107q26 173 141.5 272t293.5 97q59 -2 152 -21l-25 -225q-48 12 -83 12q-77 0 -129.5 -40t-65.5 -114l-15 -89l343 1l10 78q28 212 179 315q125 85 307 83l153 -5l331 -28l-256 -1526h-283l233 1314q-84 11 -150 11q-94 0 -154 -43.5t-74 -120.5 l-12 -79h209l-37 -212h-209l-151 -870h-283l151 870h-343l-151 -870h-284l151 870h-156z" />
|
||||
<hkern u1=" " u2="T" k="60" />
|
||||
<hkern u1=""" u2="w" k="-11" />
|
||||
<hkern u1="'" u2="w" k="-11" />
|
||||
<hkern u1="(" u2="Ÿ" k="-22" />
|
||||
<hkern u1="(" u2="Ý" k="-22" />
|
||||
<hkern u1="(" u2="Y" k="-22" />
|
||||
<hkern u1="(" u2="W" k="-38" />
|
||||
<hkern u1="(" u2="V" k="-20" />
|
||||
<hkern u1="/" u2="/" k="248" />
|
||||
<hkern u1="A" u2="w" k="33" />
|
||||
<hkern u1="A" u2="t" k="17" />
|
||||
<hkern u1="A" u2="?" k="81" />
|
||||
<hkern u1="C" u2="}" k="17" />
|
||||
<hkern u1="C" u2="]" k="12" />
|
||||
<hkern u1="C" u2=")" k="26" />
|
||||
<hkern u1="D" u2="Æ" k="33" />
|
||||
<hkern u1="E" u2="w" k="22" />
|
||||
<hkern u1="E" u2="f" k="18" />
|
||||
<hkern u1="F" u2="…" k="274" />
|
||||
<hkern u1="F" u2="„" k="274" />
|
||||
<hkern u1="F" u2="‚" k="274" />
|
||||
<hkern u1="F" u2="œ" k="21" />
|
||||
<hkern u1="F" u2="ÿ" k="24" />
|
||||
<hkern u1="F" u2="ý" k="24" />
|
||||
<hkern u1="F" u2="ü" k="22" />
|
||||
<hkern u1="F" u2="û" k="22" />
|
||||
<hkern u1="F" u2="ú" k="22" />
|
||||
<hkern u1="F" u2="ù" k="22" />
|
||||
<hkern u1="F" u2="ö" k="21" />
|
||||
<hkern u1="F" u2="õ" k="21" />
|
||||
<hkern u1="F" u2="ô" k="21" />
|
||||
<hkern u1="F" u2="ó" k="21" />
|
||||
<hkern u1="F" u2="ò" k="21" />
|
||||
<hkern u1="F" u2="ë" k="21" />
|
||||
<hkern u1="F" u2="ê" k="21" />
|
||||
<hkern u1="F" u2="é" k="21" />
|
||||
<hkern u1="F" u2="è" k="21" />
|
||||
<hkern u1="F" u2="ç" k="21" />
|
||||
<hkern u1="F" u2="å" k="34" />
|
||||
<hkern u1="F" u2="ä" k="34" />
|
||||
<hkern u1="F" u2="ã" k="34" />
|
||||
<hkern u1="F" u2="â" k="34" />
|
||||
<hkern u1="F" u2="á" k="34" />
|
||||
<hkern u1="F" u2="à" k="34" />
|
||||
<hkern u1="F" u2="Å" k="192" />
|
||||
<hkern u1="F" u2="Ä" k="192" />
|
||||
<hkern u1="F" u2="Ã" k="192" />
|
||||
<hkern u1="F" u2="Â" k="192" />
|
||||
<hkern u1="F" u2="Á" k="192" />
|
||||
<hkern u1="F" u2="À" k="192" />
|
||||
<hkern u1="F" u2="y" k="24" />
|
||||
<hkern u1="F" u2="v" k="24" />
|
||||
<hkern u1="F" u2="u" k="22" />
|
||||
<hkern u1="F" u2="r" k="26" />
|
||||
<hkern u1="F" u2="q" k="21" />
|
||||
<hkern u1="F" u2="o" k="21" />
|
||||
<hkern u1="F" u2="g" k="21" />
|
||||
<hkern u1="F" u2="e" k="21" />
|
||||
<hkern u1="F" u2="d" k="21" />
|
||||
<hkern u1="F" u2="c" k="21" />
|
||||
<hkern u1="F" u2="a" k="34" />
|
||||
<hkern u1="F" u2="T" k="-20" />
|
||||
<hkern u1="F" u2="J" k="208" />
|
||||
<hkern u1="F" u2="A" k="192" />
|
||||
<hkern u1="F" u2="." k="274" />
|
||||
<hkern u1="F" u2="," k="274" />
|
||||
<hkern u1="K" u2="w" k="63" />
|
||||
<hkern u1="L" u2="w" k="52" />
|
||||
<hkern u1="O" u2="Æ" k="33" />
|
||||
<hkern u1="P" u2="Æ" k="297" />
|
||||
<hkern u1="P" u2="t" k="-14" />
|
||||
<hkern u1="Q" u2="Ÿ" k="35" />
|
||||
<hkern u1="Q" u2="Ý" k="35" />
|
||||
<hkern u1="Q" u2="Y" k="35" />
|
||||
<hkern u1="Q" u2="W" k="20" />
|
||||
<hkern u1="Q" u2="V" k="28" />
|
||||
<hkern u1="Q" u2="T" k="33" />
|
||||
<hkern u1="R" u2="Ÿ" k="48" />
|
||||
<hkern u1="R" u2="Ý" k="48" />
|
||||
<hkern u1="R" u2="Y" k="48" />
|
||||
<hkern u1="R" u2="V" k="19" />
|
||||
<hkern u1="R" u2="T" k="50" />
|
||||
<hkern u1="T" u2="ø" k="95" />
|
||||
<hkern u1="T" u2="æ" k="84" />
|
||||
<hkern u1="T" u2="Æ" k="189" />
|
||||
<hkern u1="T" u2="»" k="146" />
|
||||
<hkern u1="T" u2="«" k="148" />
|
||||
<hkern u1="T" u2="w" k="47" />
|
||||
<hkern u1="T" u2="r" k="65" />
|
||||
<hkern u1="T" u2=" " k="60" />
|
||||
<hkern u1="V" u2="}" k="-19" />
|
||||
<hkern u1="V" u2="r" k="30" />
|
||||
<hkern u1="V" u2="]" k="-17" />
|
||||
<hkern u1="V" u2=")" k="-20" />
|
||||
<hkern u1="W" u2="}" k="-14" />
|
||||
<hkern u1="W" u2="r" k="21" />
|
||||
<hkern u1="W" u2="]" k="-12" />
|
||||
<hkern u1="W" u2=")" k="-15" />
|
||||
<hkern u1="Y" u2="•" k="45" />
|
||||
<hkern u1="Y" u2="ø" k="64" />
|
||||
<hkern u1="Y" u2="æ" k="63" />
|
||||
<hkern u1="Y" u2="Æ" k="96" />
|
||||
<hkern u1="Y" u2="»" k="51" />
|
||||
<hkern u1="Y" u2="«" k="82" />
|
||||
<hkern u1="Y" u2="}" k="-19" />
|
||||
<hkern u1="Y" u2="t" k="22" />
|
||||
<hkern u1="Y" u2="r" k="40" />
|
||||
<hkern u1="Y" u2="f" k="22" />
|
||||
<hkern u1="Y" u2="]" k="-18" />
|
||||
<hkern u1="Y" u2="*" k="49" />
|
||||
<hkern u1="Y" u2=")" k="-20" />
|
||||
<hkern u1="Y" u2="&" k="30" />
|
||||
<hkern u1="Z" u2="w" k="27" />
|
||||
<hkern u1="[" u2="Ü" k="18" />
|
||||
<hkern u1="[" u2="Û" k="18" />
|
||||
<hkern u1="[" u2="Ú" k="18" />
|
||||
<hkern u1="[" u2="Ù" k="18" />
|
||||
<hkern u1="[" u2="U" k="18" />
|
||||
<hkern u1="[" u2="J" k="18" />
|
||||
<hkern u1="e" u2="’" k="64" />
|
||||
<hkern u1="f" u2="”" k="-16" />
|
||||
<hkern u1="f" u2="“" k="-16" />
|
||||
<hkern u1="f" u2="’" k="-16" />
|
||||
<hkern u1="f" u2="‘" k="-16" />
|
||||
<hkern u1="f" u2="œ" k="24" />
|
||||
<hkern u1="f" u2="ë" k="24" />
|
||||
<hkern u1="f" u2="ê" k="24" />
|
||||
<hkern u1="f" u2="é" k="24" />
|
||||
<hkern u1="f" u2="è" k="24" />
|
||||
<hkern u1="f" u2="ç" k="24" />
|
||||
<hkern u1="f" u2="}" k="-19" />
|
||||
<hkern u1="f" u2="q" k="24" />
|
||||
<hkern u1="f" u2="g" k="24" />
|
||||
<hkern u1="f" u2="e" k="24" />
|
||||
<hkern u1="f" u2="d" k="24" />
|
||||
<hkern u1="f" u2="c" k="24" />
|
||||
<hkern u1="f" u2="]" k="-18" />
|
||||
<hkern u1="f" u2=")" k="-20" />
|
||||
<hkern u1="f" u2="'" k="-16" />
|
||||
<hkern u1="f" u2=""" k="-16" />
|
||||
<hkern u1="h" u2="’" k="104" />
|
||||
<hkern u1="k" u2="œ" k="20" />
|
||||
<hkern u1="k" u2="ë" k="20" />
|
||||
<hkern u1="k" u2="ê" k="20" />
|
||||
<hkern u1="k" u2="é" k="20" />
|
||||
<hkern u1="k" u2="è" k="20" />
|
||||
<hkern u1="k" u2="ç" k="20" />
|
||||
<hkern u1="k" u2="q" k="20" />
|
||||
<hkern u1="k" u2="g" k="20" />
|
||||
<hkern u1="k" u2="e" k="20" />
|
||||
<hkern u1="k" u2="d" k="20" />
|
||||
<hkern u1="k" u2="c" k="20" />
|
||||
<hkern u1="m" u2="’" k="120" />
|
||||
<hkern u1="n" u2="’" k="120" />
|
||||
<hkern u1="o" u2="’" k="112" />
|
||||
<hkern u1="r" u2="’" k="-16" />
|
||||
<hkern u1="r" u2="w" k="-17" />
|
||||
<hkern u1="r" u2="t" k="-50" />
|
||||
<hkern u1="r" u2="f" k="-20" />
|
||||
<hkern u1="t" u2="’" k="-24" />
|
||||
<hkern u1="t" u2="ö" k="30" />
|
||||
<hkern u1="t" u2="õ" k="30" />
|
||||
<hkern u1="t" u2="ô" k="30" />
|
||||
<hkern u1="t" u2="ó" k="30" />
|
||||
<hkern u1="t" u2="ò" k="30" />
|
||||
<hkern u1="t" u2="o" k="30" />
|
||||
<hkern u1="v" u2="f" k="-13" />
|
||||
<hkern u1="w" u2="…" k="124" />
|
||||
<hkern u1="w" u2="„" k="124" />
|
||||
<hkern u1="w" u2="‚" k="124" />
|
||||
<hkern u1="w" u2="." k="124" />
|
||||
<hkern u1="w" u2="," k="124" />
|
||||
<hkern u1="y" u2="f" k="-13" />
|
||||
<hkern u1="{" u2="Ü" k="20" />
|
||||
<hkern u1="{" u2="Û" k="20" />
|
||||
<hkern u1="{" u2="Ú" k="20" />
|
||||
<hkern u1="{" u2="Ù" k="20" />
|
||||
<hkern u1="{" u2="U" k="20" />
|
||||
<hkern u1="{" u2="J" k="20" />
|
||||
<hkern u1="À" u2="w" k="33" />
|
||||
<hkern u1="À" u2="t" k="17" />
|
||||
<hkern u1="À" u2="?" k="81" />
|
||||
<hkern u1="Á" u2="w" k="33" />
|
||||
<hkern u1="Á" u2="t" k="17" />
|
||||
<hkern u1="Á" u2="?" k="81" />
|
||||
<hkern u1="Â" u2="w" k="33" />
|
||||
<hkern u1="Â" u2="t" k="17" />
|
||||
<hkern u1="Â" u2="?" k="81" />
|
||||
<hkern u1="Ã" u2="w" k="33" />
|
||||
<hkern u1="Ã" u2="t" k="17" />
|
||||
<hkern u1="Ã" u2="?" k="81" />
|
||||
<hkern u1="Ä" u2="w" k="33" />
|
||||
<hkern u1="Ä" u2="t" k="17" />
|
||||
<hkern u1="Ä" u2="?" k="81" />
|
||||
<hkern u1="Å" u2="w" k="33" />
|
||||
<hkern u1="Å" u2="t" k="17" />
|
||||
<hkern u1="Å" u2="?" k="81" />
|
||||
<hkern u1="Ç" u2="}" k="17" />
|
||||
<hkern u1="Ç" u2="]" k="12" />
|
||||
<hkern u1="Ç" u2=")" k="26" />
|
||||
<hkern u1="È" u2="w" k="22" />
|
||||
<hkern u1="È" u2="f" k="18" />
|
||||
<hkern u1="É" u2="w" k="22" />
|
||||
<hkern u1="É" u2="f" k="18" />
|
||||
<hkern u1="Ê" u2="w" k="22" />
|
||||
<hkern u1="Ê" u2="f" k="18" />
|
||||
<hkern u1="Ë" u2="w" k="22" />
|
||||
<hkern u1="Ë" u2="f" k="18" />
|
||||
<hkern u1="Ð" u2="Æ" k="33" />
|
||||
<hkern u1="Ò" u2="Æ" k="33" />
|
||||
<hkern u1="Ó" u2="Æ" k="33" />
|
||||
<hkern u1="Ô" u2="Æ" k="33" />
|
||||
<hkern u1="Õ" u2="Æ" k="33" />
|
||||
<hkern u1="Ö" u2="Æ" k="33" />
|
||||
<hkern u1="Ý" u2="•" k="45" />
|
||||
<hkern u1="Ý" u2="ø" k="64" />
|
||||
<hkern u1="Ý" u2="æ" k="63" />
|
||||
<hkern u1="Ý" u2="Æ" k="96" />
|
||||
<hkern u1="Ý" u2="»" k="51" />
|
||||
<hkern u1="Ý" u2="«" k="82" />
|
||||
<hkern u1="Ý" u2="}" k="-19" />
|
||||
<hkern u1="Ý" u2="t" k="22" />
|
||||
<hkern u1="Ý" u2="r" k="40" />
|
||||
<hkern u1="Ý" u2="f" k="22" />
|
||||
<hkern u1="Ý" u2="]" k="-18" />
|
||||
<hkern u1="Ý" u2="*" k="49" />
|
||||
<hkern u1="Ý" u2=")" k="-20" />
|
||||
<hkern u1="Ý" u2="&" k="30" />
|
||||
<hkern u1="è" u2="’" k="64" />
|
||||
<hkern u1="é" u2="’" k="64" />
|
||||
<hkern u1="ê" u2="’" k="64" />
|
||||
<hkern u1="ë" u2="’" k="64" />
|
||||
<hkern u1="ñ" u2="’" k="120" />
|
||||
<hkern u1="ò" u2="’" k="112" />
|
||||
<hkern u1="ó" u2="’" k="112" />
|
||||
<hkern u1="ô" u2="’" k="112" />
|
||||
<hkern u1="õ" u2="’" k="112" />
|
||||
<hkern u1="ö" u2="’" k="112" />
|
||||
<hkern u1="ý" u2="f" k="-13" />
|
||||
<hkern u1="ÿ" u2="f" k="-13" />
|
||||
<hkern u1="Ÿ" u2="•" k="45" />
|
||||
<hkern u1="Ÿ" u2="ø" k="64" />
|
||||
<hkern u1="Ÿ" u2="æ" k="63" />
|
||||
<hkern u1="Ÿ" u2="Æ" k="96" />
|
||||
<hkern u1="Ÿ" u2="»" k="51" />
|
||||
<hkern u1="Ÿ" u2="«" k="82" />
|
||||
<hkern u1="Ÿ" u2="}" k="-19" />
|
||||
<hkern u1="Ÿ" u2="t" k="22" />
|
||||
<hkern u1="Ÿ" u2="r" k="40" />
|
||||
<hkern u1="Ÿ" u2="f" k="22" />
|
||||
<hkern u1="Ÿ" u2="]" k="-18" />
|
||||
<hkern u1="Ÿ" u2="*" k="49" />
|
||||
<hkern u1="Ÿ" u2=")" k="-20" />
|
||||
<hkern u1="Ÿ" u2="&" k="30" />
|
||||
<hkern u1="‘" u2="w" k="-11" />
|
||||
<hkern u1="’" u2="œ" k="104" />
|
||||
<hkern u1="’" u2="ö" k="144" />
|
||||
<hkern u1="’" u2="õ" k="144" />
|
||||
<hkern u1="’" u2="ô" k="144" />
|
||||
<hkern u1="’" u2="ó" k="144" />
|
||||
<hkern u1="’" u2="ò" k="144" />
|
||||
<hkern u1="’" u2="ë" k="104" />
|
||||
<hkern u1="’" u2="ê" k="104" />
|
||||
<hkern u1="’" u2="é" k="104" />
|
||||
<hkern u1="’" u2="è" k="104" />
|
||||
<hkern u1="’" u2="ç" k="104" />
|
||||
<hkern u1="’" u2="w" k="-11" />
|
||||
<hkern u1="’" u2="s" k="232" />
|
||||
<hkern u1="’" u2="q" k="104" />
|
||||
<hkern u1="’" u2="o" k="144" />
|
||||
<hkern u1="’" u2="g" k="104" />
|
||||
<hkern u1="’" u2="e" k="104" />
|
||||
<hkern u1="’" u2="d" k="104" />
|
||||
<hkern u1="’" u2="c" k="104" />
|
||||
<hkern u1="“" u2="w" k="-11" />
|
||||
<hkern u1="”" u2="w" k="-11" />
|
||||
<hkern g1="B" g2="V" k="24" />
|
||||
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
|
||||
<hkern g1="B" g2="T" k="27" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="85" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="122" />
|
||||
<hkern g1="C,Ccedilla" g2="T" k="29" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
|
||||
<hkern g1="T" g2="z" k="60" />
|
||||
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="208" />
|
||||
<hkern g1="T" g2="v,y,yacute,ydieresis" k="82" />
|
||||
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
|
||||
<hkern g1="T" g2="V" k="-16" />
|
||||
<hkern g1="T" g2="m,n,p,ntilde" k="89" />
|
||||
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
|
||||
<hkern g1="T" g2="T" k="-16" />
|
||||
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="65" />
|
||||
<hkern g1="T" g2="W" k="-15" />
|
||||
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
|
||||
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="258" />
|
||||
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="89" />
|
||||
<hkern g1="T" g2="x" k="77" />
|
||||
<hkern g1="T" g2="s" k="76" />
|
||||
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="272" />
|
||||
<hkern g1="T" g2="S" k="16" />
|
||||
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="168" />
|
||||
<hkern g1="T" g2="J" k="216" />
|
||||
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
|
||||
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
|
||||
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
|
||||
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
|
||||
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
|
||||
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="164" />
|
||||
<hkern g1="L" g2="v,y,yacute,ydieresis" k="123" />
|
||||
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="64" />
|
||||
<hkern g1="L" g2="V" k="206" />
|
||||
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="24" />
|
||||
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="279" />
|
||||
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="288" />
|
||||
<hkern g1="L" g2="T" k="205" />
|
||||
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="14" />
|
||||
<hkern g1="L" g2="W" k="93" />
|
||||
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
|
||||
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
|
||||
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
|
||||
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="178" />
|
||||
<hkern g1="P" g2="X" k="51" />
|
||||
<hkern g1="P" g2="Z" k="36" />
|
||||
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="404" />
|
||||
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
|
||||
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
|
||||
<hkern g1="P" g2="J" k="184" />
|
||||
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
|
||||
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
|
||||
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
|
||||
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
|
||||
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
|
||||
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
|
||||
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="215" />
|
||||
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
|
||||
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="157" />
|
||||
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
|
||||
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
|
||||
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
|
||||
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
|
||||
<hkern g1="X" g2="V" k="-14" />
|
||||
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
|
||||
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
|
||||
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="156" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="150" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="231" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="152" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="63" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
|
||||
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
|
||||
<hkern g1="W" g2="T" k="-14" />
|
||||
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
|
||||
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
|
||||
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="143" />
|
||||
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
|
||||
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
|
||||
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
|
||||
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
|
||||
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
|
||||
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
|
||||
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
|
||||
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
|
||||
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
|
||||
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
|
||||
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="17" />
|
||||
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
|
||||
<hkern g1="b,p,thorn" g2="z" k="15" />
|
||||
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
|
||||
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
|
||||
<hkern g1="b,p,thorn" g2="x" k="15" />
|
||||
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
|
||||
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
|
||||
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="80" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="88" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="167" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
|
||||
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="36" />
|
||||
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
|
||||
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
|
||||
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="173" />
|
||||
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
|
||||
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="30" />
|
||||
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="40" />
|
||||
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
|
||||
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
|
||||
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="91" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="37" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="92" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
|
||||
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="285" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
Before Width: | Height: | Size: 80 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,666 +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">
|
||||
<metadata></metadata>
|
||||
<defs>
|
||||
<font id="robotoitalic" horiz-adv-x="1126" >
|
||||
<font-face units-per-em="2048" ascent="1536" descent="-512" />
|
||||
<missing-glyph horiz-adv-x="502" />
|
||||
<glyph unicode="fi" horiz-adv-x="1110" d="M88 939l25 143l166 1l14 100q27 183 147 283q115 95 290 93q71 -2 137.5 -19.5t136.5 -41.5l-44 -158q-113 51 -224 53q-229 4 -263 -224l-13 -87h215l-25 -143h-214l-163 -939h-182l163 939h-166zM659 0l188 1082h182l-188 -1082h-182z" />
|
||||
<glyph unicode="fl" horiz-adv-x="1138" d="M116 939l25 143h166l18 127q26 167 134 260t274 91q109 -2 293 -44l96 -20l-254 -1496h-181l240 1381q-129 22 -188 22q-99 0 -159 -55.5t-75 -150.5l-18 -115h225l-25 -143h-224l-163 -939h-181l164 939h-167z" />
|
||||
<glyph horiz-adv-x="10" />
|
||||
<glyph horiz-adv-x="10" />
|
||||
<glyph unicode="
" horiz-adv-x="502" />
|
||||
<glyph horiz-adv-x="10" />
|
||||
<glyph unicode=" " horiz-adv-x="502" />
|
||||
<glyph unicode="	" horiz-adv-x="502" />
|
||||
<glyph unicode=" " horiz-adv-x="502" />
|
||||
<glyph unicode="!" horiz-adv-x="521" d="M67 90q1 47 30 77.5t77 32.5q46 2 76 -28t30 -76q0 -47 -30 -76.5t-77 -31.5t-76.5 27t-29.5 75zM141 411l169 1045h190l-195 -1045h-164z" />
|
||||
<glyph unicode=""" horiz-adv-x="645" d="M200 1041l80 503l136 -9l-23 -145l-83 -348zM462 1042l80 502l136 -9l-23 -145l-83 -348h-110z" />
|
||||
<glyph unicode="#" horiz-adv-x="1233" d="M82 410l24 137h255l128 354h-248l24 139h274l152 416h145l-153 -416h251l152 416h146l-153 -416h196l-24 -139h-222l-128 -354h216l-24 -137h-241l-149 -410h-146l150 410h-250l-150 -410h-144l149 410h-230zM505 547h250l129 354h-250z" />
|
||||
<glyph unicode="$" d="M85 429h181q-11 -131 47.5 -209t176.5 -80q127 -2 212.5 64.5t98.5 177.5q10 86 -43 150t-179.5 112.5t-201.5 109.5q-148 121 -134 317q11 164 118.5 271.5t284.5 130.5l39 219h146l-40 -222q148 -29 220.5 -149.5t57.5 -312.5h-179q8 147 -43.5 225.5t-151.5 81.5 q-113 2 -186.5 -63.5t-85.5 -176.5q-9 -86 37.5 -148t183.5 -116.5t208 -114t103.5 -136.5t25.5 -176q-13 -171 -127.5 -276t-303.5 -125l-34 -191h-145l35 193q-164 24 -248 141t-73 303z" />
|
||||
<glyph unicode="%" horiz-adv-x="1465" d="M195 1099l6 64q13 144 104.5 230.5t219.5 84.5q121 -4 192.5 -88.5t63.5 -213.5l-6 -77q-15 -134 -105.5 -219t-215.5 -81q-121 2 -194 88t-65 212zM261 184l881 1128l99 -71l-881 -1129zM330 1097q-5 -81 29.5 -128.5t98.5 -49.5q68 -2 118.5 48.5t61.5 131.5l9 78 q7 76 -26 127t-100 53q-69 2 -120 -49t-62 -132zM741 279l6 68q13 139 102 226t221 85q124 -4 195 -89.5t63 -211.5l-6 -67q-13 -141 -103.5 -228.5t-218.5 -83.5q-120 2 -193.5 87t-65.5 214zM876 277q-5 -80 28.5 -128.5t99.5 -50.5q70 -2 119.5 49t60.5 132l9 79 q7 75 -26 126t-100 53q-71 2 -121 -49t-61 -131z" />
|
||||
<glyph unicode="&" horiz-adv-x="1245" d="M71 384q15 186 222 332l114 76l-43 77q-72 132 -64 245q12 165 120 265.5t272 96.5q135 -2 223 -87.5t80 -212.5q-9 -172 -213 -315l-147 -98l249 -381q91 135 114 290h161q-27 -255 -181 -427l157 -245h-202l-73 113q-174 -136 -383 -132q-189 2 -304 114.5t-102 288.5z M255 383q-15 -108 48 -179t180 -73q134 -3 284 113l-271 424l-43 -30q-179 -124 -198 -255zM478 1121q-8 -84 49 -185l27 -47l153 103q107 80 118 185q6 64 -35 106t-109 42q-83 0 -139 -60.5t-64 -143.5z" />
|
||||
<glyph unicode="'" horiz-adv-x="356" d="M170 1057l77 479h146l-19 -118l-76 -361h-128z" />
|
||||
<glyph unicode="(" horiz-adv-x="689" d="M117 393q2 96 14 183l2 11q33 231 122.5 450t219.5 373.5t290 233.5l27 -124q-157 -117 -269.5 -305.5t-173.5 -448t-59 -511.5q0 -207 53.5 -364.5t154.5 -248.5l-45 -112q-167 116 -255.5 343t-80.5 520z" />
|
||||
<glyph unicode=")" horiz-adv-x="701" d="M-113 -356q343 258 458 829q46 230 44 443q-5 429 -208 615l47 112q112 -78 189.5 -207.5t114 -301t32.5 -355.5q-3 -97 -15 -183l-2 -11q-35 -244 -127 -461.5t-220.5 -367t-284.5 -227.5z" />
|
||||
<glyph unicode="*" horiz-adv-x="866" d="M107 1077l68 144l278 -113l51 348h150l-70 -344l303 108l19 -159l-315 -91l147 -275l-128 -88l-131 290l-222 -280l-114 98l241 272z" />
|
||||
<glyph unicode="+" horiz-adv-x="1136" d="M76 606l31 175h393l74 425h182l-74 -425h394l-31 -175h-393l-80 -460h-182l80 460h-394z" />
|
||||
<glyph unicode="," horiz-adv-x="400" d="M-113 -216q116 143 144 284l26 151h177l-21 -135q-36 -228 -222 -375z" />
|
||||
<glyph unicode="-" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
|
||||
<glyph unicode="." horiz-adv-x="533" d="M53 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
|
||||
<glyph unicode="/" horiz-adv-x="829" d="M-113 -125l864 1581h163l-863 -1581h-164z" />
|
||||
<glyph unicode="0" d="M112 475q2 74 11 146l36 243q48 311 183 464t356 148q186 -4 277.5 -127.5t84.5 -358.5q-3 -75 -12 -147l-35 -235q-53 -329 -187 -481t-354 -147q-184 4 -276 130.5t-84 364.5zM286 402q5 -265 196 -272q133 -6 219.5 98t123.5 330l48 318q14 121 13 188 q-5 254 -197 261q-140 5 -226.5 -103.5t-120.5 -340.5l-43 -290q-14 -116 -13 -189z" />
|
||||
<glyph unicode="1" d="M249 1092l31 176l540 195h32l-248 -1463h-182l214 1228z" />
|
||||
<glyph unicode="2" d="M23 0l22 141l537 522l98 97q169 169 187 312q13 110 -43 179.5t-158 73.5q-131 4 -219 -76.5t-107 -220.5l-179 -1q13 134 82.5 237.5t183 159t246.5 52.5q181 -4 287.5 -109.5t91.5 -273.5q-17 -192 -221 -404l-92 -93l-468 -445h703l-24 -151h-927z" />
|
||||
<glyph unicode="3" d="M60 385l181 -1q-6 -112 54 -180.5t174 -72.5q128 -4 213 73t97 206q11 119 -54 185.5t-194 70.5l-139 1l24 151l120 -1q132 0 222.5 69.5t103.5 188.5q13 116 -43 182.5t-163 68.5q-114 2 -193.5 -66.5t-97.5 -184.5l-179 -1q17 180 153.5 292.5t325.5 110.5 q183 -4 287.5 -114.5t90.5 -291.5q-9 -103 -79 -188t-194 -141q99 -40 148 -126.5t41 -202.5q-16 -197 -156.5 -317t-341.5 -116q-187 4 -298 116t-103 289z" />
|
||||
<glyph unicode="4" d="M5 338l21 119l800 999h198l-167 -967h196l-27 -151h-195l-59 -338h-182l59 338h-644zM243 489h432l130 716l-29 -42z" />
|
||||
<glyph unicode="5" d="M114 384h169q7 -120 68 -186t165 -68q128 -4 215.5 91t103.5 249q14 135 -47 222.5t-179 91.5q-73 2 -129.5 -22t-112.5 -69l-148 40l185 723h726l-27 -171h-570l-112 -398q110 65 238 63q181 -2 278 -136.5t79 -342.5q-19 -224 -159 -360t-349 -132q-174 2 -281 112 t-113 293z" />
|
||||
<glyph unicode="6" d="M120 407q-8 105 25 284q69 373 272.5 570t517.5 197h20l-16 -157h-35q-200 -4 -342 -124t-220 -354q136 136 318 132q115 -2 197 -63.5t120.5 -170t26.5 -239.5q-20 -221 -158.5 -364.5t-340.5 -137.5q-162 4 -266 119t-119 308zM299 450q0 -82 25 -159t74 -117t115 -41 q121 -5 207.5 90t103.5 250q10 90 -11 165t-69.5 118.5t-122.5 45.5q-97 2 -182 -56t-131 -148l-7 -67z" />
|
||||
<glyph unicode="7" d="M157 0l787 1304h-760l24 152h956l-18 -114l-791 -1342h-198z" />
|
||||
<glyph unicode="8" d="M80 385q11 125 88 218.5t210 151.5q-78 54 -115.5 136t-29.5 176q14 185 145 299t322 110q174 -4 276 -113t88 -278q-9 -109 -77.5 -196.5t-186.5 -144.5q94 -54 139.5 -144.5t37.5 -197.5q-15 -193 -158 -309.5t-345 -112.5q-189 4 -299 117t-95 288zM262 388 q-12 -116 48.5 -186t171.5 -72q126 -4 214 73.5t102 202.5q12 113 -48 188.5t-174 79.5q-124 2 -212 -78.5t-102 -207.5zM412 1064q-11 -104 42.5 -171t150.5 -69q109 -2 186.5 70.5t90.5 187.5q11 101 -41.5 170t-149.5 73q-112 2 -189 -71.5t-90 -189.5z" />
|
||||
<glyph unicode="9" d="M160 965q13 144 81 264t177.5 185.5t241.5 61.5q174 -4 273 -126t107 -327q3 -107 -25 -266q-66 -374 -260.5 -563.5t-499.5 -195.5h-45l16 156h37q215 4 352.5 120.5t207.5 365.5q-74 -78 -157 -116.5t-165 -36.5q-115 2 -196.5 65t-119 173t-25.5 240zM339 975 q-7 -61 2 -124t36 -111q54 -97 162 -100q91 -4 175 51.5t138 149.5l8 73l3 81q-4 155 -57.5 239t-153.5 88q-124 5 -211.5 -95.5t-101.5 -251.5z" />
|
||||
<glyph unicode=":" horiz-adv-x="491" d="M43 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM196 977q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
|
||||
<glyph unicode=";" horiz-adv-x="430" d="M-101 -216q116 143 144 284l26 151h177l-21 -135q-36 -228 -222 -375zM173 977q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
|
||||
<glyph unicode="<" horiz-adv-x="1020" d="M65 579l26 146l861 378l-36 -205l-653 -258l565 -253l-33 -187z" />
|
||||
<glyph unicode="=" horiz-adv-x="1100" d="M112 399l28 160h811l-29 -160h-810zM184 814l28 161h811l-29 -161h-810z" />
|
||||
<glyph unicode=">" horiz-adv-x="1048" d="M58 191l36 201l687 262l-598 259l33 182l764 -379l-26 -145z" />
|
||||
<glyph unicode="?" horiz-adv-x="948" d="M165 1115q19 165 141.5 264.5t299.5 97.5q168 -4 260.5 -106t78.5 -267q-17 -182 -204 -350l-122 -104q-98 -89 -121 -240l-177 -1q13 115 61 203t156 184l81 71q125 111 141 233q12 94 -31 153t-134 63q-102 2 -167.5 -54.5t-82.5 -145.5zM250 90q1 47 30 77.5t77 32.5 q46 1 76.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -31q-47 -2 -76.5 27t-29.5 75z" />
|
||||
<glyph unicode="@" horiz-adv-x="1794" d="M70 246q-2 217 77.5 442.5t221 397t322 260t380.5 85.5q194 -3 333.5 -87t213 -245t73.5 -365q0 -225 -65.5 -401t-176 -266.5t-250.5 -86.5q-89 2 -143.5 46.5t-67.5 121.5q-136 -172 -279 -169q-116 2 -172 93t-44 247q10 161 86 328.5t186 256t240 86.5 q139 -3 272 -105l-133 -558q-10 -66 -10 -93q-5 -135 92 -138q147 -6 238 165t102 441q7 180 -46 317t-168.5 207t-284.5 73q-221 4 -410 -123t-311.5 -370t-134.5 -522q-8 -181 47 -323t167 -214.5t274 -73.5q169 -4 339 78l27 -117q-139 -87 -368 -87q-191 1 -332 84.5 t-218 244t-77 370.5zM649 294q-5 -171 112 -174q107 -5 200 144l32 53l1 11l133 506q-52 28 -107 29q-139 5 -235.5 -135t-130.5 -377z" />
|
||||
<glyph unicode="A" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679z" />
|
||||
<glyph unicode="B" horiz-adv-x="1247" d="M59 0l253 1456l427 -1q223 0 334 -100q99 -89 99 -240q0 -19 -2 -39q-18 -209 -263 -315q99 -38 147 -130q41 -78 41 -169q0 -17 -2 -34q-15 -197 -158 -312.5t-370 -115.5h-506zM274 157l297 -1q136 0 228 73t107 197q3 24 3 46q0 86 -44 138q-55 66 -173 70l-327 1z M392 835l271 -1q127 0 214.5 65t102.5 179q3 20 3 39q-1 77 -45 121q-54 54 -180 59l-286 1z" />
|
||||
<glyph unicode="C" horiz-adv-x="1303" d="M120 494q-1 22 -1 43q0 59 8 117l17 120q46 328 230 518q179 185 434 184h13q205 -4 325 -132.5t127 -356.5h-187q-13 306 -240 330l-33 2h-12q-181 -1 -303 -141q-126 -146 -164 -397l-22 -151l-6 -88v-28q0 -164 66 -264q72 -108 212 -113h18q140 0 234 73 q100 78 151 251l182 3q-43 -226 -205 -358q-155 -126 -369 -126h-20q-135 3 -236 66.5t-157 183t-62 264.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1313" d="M59 0l253 1456l378 -1q178 0 306 -89q129 -90 185 -246q40 -111 40 -240q0 -53 -7 -110l-10 -73q-44 -318 -247 -507.5t-510 -189.5h-388zM274 157l185 -1q212 0 359.5 132t191.5 362q27 140 27 248q0 34 -3 65q-15 155 -103 242.5t-236 91.5l-223 1z" />
|
||||
<glyph unicode="E" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899z" />
|
||||
<glyph unicode="F" horiz-adv-x="1108" d="M59 0l253 1456h876l-28 -158h-688l-86 -498h593l-28 -157h-592l-112 -643h-188z" />
|
||||
<glyph unicode="G" horiz-adv-x="1363" d="M128 502q-1 19 -1 40q0 112 31 282q36 203 127 351t227 226q132 75 300 75h13q203 -4 323.5 -120.5t137.5 -327.5h-186q-11 138 -83 212t-199 78h-18q-176 0 -296 -135q-127 -142 -167 -415l-19 -140l-3 -76q0 -197 81 -304.5t227 -109.5h18q198 0 317 104l60 327h-328 l28 156h512l-83 -533q-73 -103 -213 -158q-134 -54 -306 -54h-12q-143 3 -250 67t-168 183.5t-70 271.5z" />
|
||||
<glyph unicode="H" horiz-adv-x="1426" d="M59 0l253 1456h188l-109 -626h710l109 626h189l-253 -1456h-188l117 673h-711l-117 -673h-188z" />
|
||||
<glyph unicode="I" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187z" />
|
||||
<glyph unicode="J" horiz-adv-x="1106" d="M22 402h187q-2 -20 -2 -38q0 -94 47 -154q56 -71 168 -73h11q116 0 197 77q85 81 104 210l176 1032h188l-175 -1031q-29 -206 -167 -329q-134 -118 -331 -118h-13q-192 4 -297 116q-94 101 -94 269q0 19 1 39z" />
|
||||
<glyph unicode="K" horiz-adv-x="1255" d="M59 0l253 1456h188l-124 -709l742 709h242l-677 -652l453 -804h-209l-383 675l-213 -191l-84 -484h-188z" />
|
||||
<glyph unicode="L" horiz-adv-x="1079" d="M59 0l253 1456h189l-226 -1299h670l-28 -157h-858z" />
|
||||
<glyph unicode="M" horiz-adv-x="1744" d="M59 0l253 1456h237l255 -1186l668 1186h247l-253 -1456h-187l100 576l119 586l-660 -1162h-144l-260 1185l-90 -628l-97 -557h-188z" />
|
||||
<glyph unicode="N" horiz-adv-x="1426" d="M59 0l253 1456h182l521 -1135l197 1135h187l-253 -1456h-182l-520 1130l-196 -1130h-189z" />
|
||||
<glyph unicode="O" horiz-adv-x="1376" d="M125 515q-1 19 -1 39q0 110 28 260q33 178 114 321t197 229q152 112 345 112h13q213 -4 336 -147.5t132 -388.5q1 -14 0 -30q1 -97 -21 -237q-26 -162 -91.5 -301t-166.5 -233q-171 -159 -403 -159h-14q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q0 -14 -1 -28 q0 -176 71 -279q76 -111 221 -115h13q181 0 301 136q124 142 165 398q20 126 23 218v29q0 177 -69 277q-75 108 -223 112h-13q-127 0 -227 -72q-106 -76 -173 -227.5t-85 -383.5z" />
|
||||
<glyph unicode="P" horiz-adv-x="1263" d="M59 0l253 1456l486 -1q225 1 347 -119q107 -105 107 -271q0 -23 -2 -47q-18 -209 -166.5 -329t-391.5 -120l-346 1l-99 -570h-188zM373 727l324 -1q153 0 251 77t115 214q3 24 3 46q0 91 -54 153q-67 76 -195 81l-345 1z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1376" d="M117 516q-1 20 -1 40q0 113 28 260q32 175 111 315.5t191 226.5q155 118 353 118h13q141 -3 245 -68t161 -188.5t63 -279.5q1 -19 1 -39q0 -64 -8 -128l-12 -85q-62 -431 -355 -612l217 -209l-139 -113l-254 243q-74 -16 -148 -16q-137 1 -241 66.5t-161.5 189 t-63.5 279.5zM303 564v-26q0 -100 27 -189q31 -100 98.5 -152t165.5 -55h17q173 0 293 133q125 140 167 395q21 127 24 224q1 17 1 33q0 176 -70 274q-76 107 -222 111h-13q-126 0 -227 -72q-105 -76 -172.5 -227.5t-85.5 -383.5z" />
|
||||
<glyph unicode="R" horiz-adv-x="1233" d="M58 0l253 1456l438 -1q229 -1 349 -116q104 -99 104 -260q0 -26 -3 -53q-11 -137 -99.5 -241t-235.5 -157l226 -615l-1 -13h-200l-204 589h-336l-102 -589h-189zM376 746l276 -1q144 0 243 76.5t116 204.5q3 23 3 45q0 93 -53 151q-65 71 -198 75l-291 1z" />
|
||||
<glyph unicode="S" horiz-adv-x="1189" d="M46 423l188 -1q-1 -13 -1 -26q-1 -112 71 -180q80 -76 225 -79h9q139 0 230 63q94 65 109 175q2 17 2 33q0 135 -168 201l-173 63l-58 25q-274 125 -274 345q0 14 1 29q10 121 83 214q74 93 194 143q114 48 241 48h15q132 -3 236 -59q103 -57 157 -157q49 -90 48 -201 v-25l-189 1q1 17 1 33q0 110 -61 174q-70 74 -200 76h-8q-132 0 -221 -64q-92 -66 -106 -180q-2 -13 -2 -26q0 -130 185 -200l149 -53l75 -32q262 -121 262 -351q0 -17 -1 -35q-11 -123 -83 -212.5t-196 -138.5q-116 -46 -249 -46h-16q-137 1 -250.5 58.5t-172.5 157.5 q-53 89 -53 200q0 14 1 27z" />
|
||||
<glyph unicode="T" horiz-adv-x="1195" d="M168 1298l28 158h1093l-28 -158h-453l-225 -1298h-187l225 1298h-453z" />
|
||||
<glyph unicode="U" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-3 -30 -3 -58q0 -113 55 -183q69 -88 209 -91h19q140 1 238 83q104 88 131 248l168 988h189l-168 -985q-34 -227 -196 -361q-157 -131 -378 -131h-13q-143 3 -249 65q-105 60 -155 172q-37 83 -37 184q0 34 4 70z" />
|
||||
<glyph unicode="V" horiz-adv-x="1274" d="M164 1456h197l213 -1199l591 1199h212l-752 -1456h-166z" />
|
||||
<glyph unicode="W" horiz-adv-x="1772" d="M195 1456h183l68 -1007l-4 -176l68 172l435 1011h159l115 -1024l10 -166l63 201l372 989h193l-570 -1456h-171l-126 1069l-4 100l-42 -116l-464 -1053h-171z" />
|
||||
<glyph unicode="X" horiz-adv-x="1255" d="M-44 0l579 743l-330 713h208l253 -557l425 557h232l-567 -731l339 -725h-211l-258 567l-438 -567h-232z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1199" d="M-21 0l27 154l966 1144h-756l28 158h986l-26 -151l-970 -1148h802l-28 -157h-1029z" />
|
||||
<glyph unicode="[" horiz-adv-x="537" d="M-1 -312l308 1976h368l-25 -152h-185l-261 -1672h186l-24 -152h-367z" />
|
||||
<glyph unicode="\" horiz-adv-x="825" d="M191 1456h164l315 -1581h-163z" />
|
||||
<glyph unicode="]" horiz-adv-x="537" d="M-134 -312l24 152h187l261 1672h-188l25 152h368l-309 -1976h-368z" />
|
||||
<glyph unicode="^" horiz-adv-x="840" d="M79 729l417 727h124l163 -727h-158l-101 480l-268 -480h-177z" />
|
||||
<glyph unicode="_" horiz-adv-x="906" d="M-127 -151l27 151h890l-27 -151h-890z" />
|
||||
<glyph unicode="`" horiz-adv-x="624" d="M207 1534h205l143 -294h-143z" />
|
||||
<glyph unicode="a" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q2 17 2 33q0 75 -40 121q-48 56 -142 58h-7q-87 0 -157 -46q-72 -48 -88 -125l-182 -1q9 95 74 168.5t167 113.5q97 39 201 39h10q169 -5 263 -103q81 -85 81 -217q0 -21 -2 -44l-88 -536l-5 -77v-14q0 -48 12 -95 l-2 -17h-184q-7 29 -7 57l3 57q-145 -134 -307 -134h-9q-143 2 -233 90q-82 81 -82 200q0 11 1 22zM244 319q-2 -13 -2 -25q0 -60 38 -102q44 -50 129 -52h8q83 0 157 42q78 44 133 120l39 223l-137 1q-171 0 -262 -54t-103 -153z" />
|
||||
<glyph unicode="b" horiz-adv-x="1125" d="M31 0l267 1536h181l-109 -574q126 140 306 140h10q156 -4 243 -115t92 -306v-16q0 -56 -6 -108l-2 -21q-20 -166 -91 -299t-172 -197q-96 -61 -213 -61h-11q-196 4 -291 147l-37 -126h-167zM266 305q60 -165 225 -169h12q99 0 173 63q80 67 121 187.5t44 254.5v16 q0 135 -49 207q-52 78 -159 82h-8q-164 0 -278 -170z" />
|
||||
<glyph unicode="c" horiz-adv-x="1050" d="M84 517l5 50q19 156 91 279q72 124 188 192q110 65 241 64h15q170 -4 272 -114t102 -279l-169 1q-2 106 -59 171.5t-154 69.5h-8q-136 0 -226 -105q-94 -108 -117 -302l-3 -26q-4 -38 -3 -78q0 -27 1 -54q7 -117 66 -185t162 -71h6q93 0 169 56q78 58 102 154l171 1 q-15 -102 -81.5 -186t-167.5 -131q-95 -44 -194 -44h-13q-135 2 -228 70q-94 70 -138 192q-33 93 -33 203q0 35 3 72z" />
|
||||
<glyph unicode="d" horiz-adv-x="1130" d="M78 402q-1 16 -1 34q0 47 6 107q20 165 91 298t175 199q99 63 218 63h11q181 -4 278 -132l104 565h181l-266 -1536h-165l19 116q-124 -136 -306 -136h-10q-150 4 -239 117.5t-96 304.5zM257 439v-15q0 -132 51 -207q54 -79 158 -81h13q149 0 266 158l86 500 q-60 148 -218 152h-9q-102 0 -180 -64q-82 -68 -124 -189.5t-43 -253.5z" />
|
||||
<glyph unicode="e" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 201q108 65 233 64h11q167 -4 262 -111t104 -290q1 -20 1 -39q0 -46 -5 -91l-11 -83h-707q-4 -31 -3 -61q0 -108 52 -189q66 -103 198 -107h8q155 0 288 144l104 -88q-68 -97 -176 -153q-104 -54 -230 -54h-9q-202 4 -316 149 q-98 125 -98 311q0 29 2 60zM286 640l526 -1l4 16q4 28 4 54q0 91 -44 155q-56 84 -162 87h-8q-108 0 -188 -76q-84 -79 -132 -235z" />
|
||||
<glyph unicode="f" horiz-adv-x="700" d="M116 939l25 143h166l18 128q26 163 126 255q103 94 261 94h7q51 0 129 -17l-22 -151q-48 10 -97 12q-94 0 -152.5 -58.5t-72.5 -155.5l-16 -107h224l-25 -143h-224l-163 -939h-181l164 939h-167z" />
|
||||
<glyph unicode="g" horiz-adv-x="1125" d="M4 -238l103 111q98 -145 259 -149h13q120 0 205 72q90 76 119 216l20 96q-128 -128 -299 -128h-10q-101 3 -175.5 54.5t-115.5 149t-45 217.5v25q0 51 6 117q24 177 95.5 307.5t174.5 193.5q97 59 213 59h11q188 -4 284 -142l36 121h166l-180 -1059q-29 -207 -168 -331 q-133 -119 -324 -119h-19q-110 2 -210.5 52t-158.5 137zM259 440v-15q0 -132 49 -207q53 -78 159 -82h8q157 0 271 159l85 497q-60 148 -217 154h-9q-141 0 -233 -120q-94 -124 -111 -335z" />
|
||||
<glyph unicode="h" horiz-adv-x="1104" d="M31 0l267 1536h181l-110 -586q138 151 318 151h9q152 -3 226 -105q58 -81 58 -214q0 -35 -4 -73l-118 -709h-181l119 712q3 27 3 51q0 21 -2 40q-17 140 -165 143h-7q-161 0 -279 -174l-134 -772h-181z" />
|
||||
<glyph unicode="i" horiz-adv-x="492" d="M47 0l188 1082h180l-188 -1082h-180zM300 1444q29 31 76 33h6q42 1 70 -27q30 -30 31 -78q-1 -47 -30.5 -77t-76.5 -32h-6q-43 0 -71 27q-29 28 -29 73q0 49 30 81z" />
|
||||
<glyph unicode="j" horiz-adv-x="484" d="M-236 -420l16 148q37 -9 83 -11q129 0 155 154l207 1211h181l-205 -1211q-20 -153 -103 -233q-80 -78 -209 -78h-6q-53 2 -119 20zM256 1366q1 47 29.5 78t76.5 33h6q42 0 70 -29q31 -30 31 -76q-1 -47 -31 -77t-77 -32h-6q-41 0 -69 28q-30 30 -30 75z" />
|
||||
<glyph unicode="k" horiz-adv-x="1017" d="M32 0l267 1536h181l-160 -918l111 112l384 352h235l-497 -461l342 -621h-198l-278 499l-142 -127l-64 -372h-181z" />
|
||||
<glyph unicode="l" horiz-adv-x="492" d="M47 0l266 1536h181l-267 -1536h-180z" />
|
||||
<glyph unicode="m" horiz-adv-x="1751" d="M30 0l188 1082l170 1l-23 -121q132 140 319 140h10q103 -2 174.5 -47t98.5 -127q149 174 350 174h9q162 -4 239 -109q61 -83 61 -212q0 -33 -4 -70l-119 -711h-180l118 713q3 26 3 49.5t-3 45.5q-19 136 -178 139h-6q-95 1 -173 -61q-80 -64 -104 -167l-123 -719h-182 l120 712q3 24 3 46q0 78 -36 125q-46 60 -145 62h-8q-163 0 -261 -154l-137 -791h-181z" />
|
||||
<glyph unicode="n" horiz-adv-x="1106" d="M31 0l188 1082l171 1l-26 -137q142 156 323 156h9q153 -4 226 -106q58 -81 58 -214q0 -35 -4 -73l-118 -709h-181l119 712q3 27 3 51q0 21 -2 40q-17 140 -165 143h-5q-160 0 -281 -174l-134 -772h-181z" />
|
||||
<glyph unicode="o" horiz-adv-x="1143" d="M82 523q15 168 91 302q75 133 195 207q113 70 249 70h15q136 -2 233 -74t143 -198q35 -96 36 -205q0 -35 -4 -72l-2 -22q-19 -158 -94 -285.5t-194 -198.5q-113 -67 -246 -67h-15q-135 2 -232.5 74t-142.5 196q-35 96 -35 207q0 33 3 66zM264 391q10 -118 70.5 -188 t161.5 -73h11q84 0 155 44q76 48 128 144t67 213q5 57 5 102q0 29 -2 53q-12 121 -73 191t-162 74h-7q-135 0 -231 -110q-98 -113 -121 -296l-2 -23q-4 -32 -4 -64.5t4 -66.5z" />
|
||||
<glyph unicode="p" horiz-adv-x="1125" d="M-41 -416l260 1498l164 1l-20 -121q130 140 311 140h10q156 -4 243 -115t92 -306v-18q0 -55 -5 -106l-3 -21q-20 -165 -89 -297t-171 -197q-98 -63 -215 -63h-11q-188 4 -288 127l-97 -522h-181zM260 278q61 -144 219 -148h7q131 0 222 106q95 108 125 321l5 84 q0 146 -55.5 223.5t-160.5 81.5h-8q-152 0 -263 -149z" />
|
||||
<glyph unicode="q" horiz-adv-x="1139" d="M79 400q-1 18 -1 37q0 107 30 225q35 137 104.5 239.5t164.5 153.5q90 48 195 48h13q183 -4 279 -131l33 110h167l-260 -1498h-180l98 516q-126 -120 -291 -120h-11q-152 2 -243 115t-98 305zM260 438v-15q0 -134 52 -211q56 -80 160 -82h8q148 0 263 146l94 532 q-66 139 -216 143h-7q-133 0 -224 -105q-94 -108 -125 -324z" />
|
||||
<glyph unicode="r" horiz-adv-x="682" d="M31 0l188 1082l175 1l-27 -126q112 147 263 147h8q33 0 86 -15l-20 -172l-85 9q-174 0 -274 -157l-133 -769h-181z" />
|
||||
<glyph unicode="s" horiz-adv-x="1034" d="M50 334l181 -1q0 -91 58 -146t159 -55h9q94 0 162 42q72 44 82 119q1 11 1 21q0 95 -124 137l-188 55q-230 79 -230 260v12q6 142 130 234q121 90 284 90h7q165 -2 267 -96q99 -90 98 -232v-11l-180 1v6q0 77 -51 126q-53 51 -141 53h-7q-89 0 -155 -46q-63 -45 -73 -118 q-1 -9 -1 -17q0 -81 116 -120l91 -25q186 -48 264 -125q72 -72 72 -175v-16q-6 -101 -66 -176t-160 -115q-93 -37 -197 -36h-16q-172 2 -284 100q-108 95 -108 243v11z" />
|
||||
<glyph unicode="t" horiz-adv-x="659" d="M67 939l25 143h191l46 262h180l-46 -262h197l-25 -143h-196l-113 -673q-3 -26 -1 -48q7 -78 85 -78q33 0 88 10l-14 -151q-65 -18 -132 -18q-108 1 -162 79q-44 63 -44 163q0 22 2 46l110 670h-191z" />
|
||||
<glyph unicode="u" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-3 -28 -3 -54q0 -16 1 -32q5 -72 43 -113t106 -44h14q184 0 286 157l136 788h181l-188 -1082h-171l23 107q-123 -127 -311 -127h-12q-155 4 -229 111q-59 85 -60 220q0 34 4 72z" />
|
||||
<glyph unicode="v" horiz-adv-x="972" d="M110 1082h178l136 -829l390 829h191l-545 -1082h-138z" />
|
||||
<glyph unicode="w" horiz-adv-x="1503" d="M128 1082h173l66 -806l384 806h146l105 -826l345 826h187l-493 -1082h-147l-112 818l-390 -818h-147z" />
|
||||
<glyph unicode="x" horiz-adv-x="995" d="M-60 0l447 556l-256 526h198l167 -394l294 394h222l-434 -544l264 -538h-197l-179 404l-305 -404h-221z" />
|
||||
<glyph unicode="y" horiz-adv-x="950" d="M-91 -422l16 150l47 -5h15q76 0 133 39q63 42 111 137l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-132 -260 -339 -260h-5q-37 1 -109 18z" />
|
||||
<glyph unicode="z" horiz-adv-x="995" d="M-19 0l25 145l709 784h-565l28 153h796l-24 -140l-716 -791h608l-27 -151h-834z" />
|
||||
<glyph unicode="{" horiz-adv-x="682" d="M56 541l16 145q217 10 249 245l31 228q59 339 410 440l27 -117q-212 -70 -257 -337l-34 -240q-33 -200 -211 -294q103 -77 113 -219q3 -44 -1 -87l-31 -243l-2 -71l2 -31q17 -159 151 -212l-41 -113q-158 53 -232 172.5t-55 291.5l28 207q6 49 1 91q-17 136 -164 144z " />
|
||||
<glyph unicode="|" horiz-adv-x="494" d="M33 -270l270 1726h146l-270 -1726h-146z" />
|
||||
<glyph unicode="}" horiz-adv-x="682" d="M-116 -251q217 71 260 344l31 226q31 208 226 301q-113 69 -126 216q-4 42 1 87l31 246l2 71q-3 184 -152 242l45 113q156 -53 228 -172.5t53 -290.5l-27 -208q-6 -50 -1 -91q16 -135 163 -143l-15 -145q-218 -10 -250 -248l-28 -207q-51 -354 -413 -458z" />
|
||||
<glyph unicode="~" horiz-adv-x="1361" d="M105 436q16 162 113.5 266.5t238.5 100.5q119 -3 227 -96l89 -83q68 -61 131 -61q75 0 127.5 55t70.5 157l143 3q-14 -163 -111.5 -271.5t-237.5 -106.5q-126 3 -249 115l-60 58q-72 67 -138 67q-136 3 -180 -164l-8 -37z" />
|
||||
<glyph unicode="¡" horiz-adv-x="494" d="M-15 -360l194 1044h165l-169 -1044h-190zM203 993q1 48 30.5 77.5t76.5 31.5q46 1 76.5 -28t29.5 -75q0 -47 -29 -78t-77 -33t-77.5 29t-29.5 76z" />
|
||||
<glyph unicode="¢" horiz-adv-x="1096" d="M94 350q-12 111 10 244.5t82.5 238.5t153.5 171.5t212 87.5l45 226h181l-45 -225q131 -32 204.5 -133.5t73.5 -250.5h-170q0 106 -56 172t-153 70q-152 6 -251 -122t-113 -356l-1 -42q-3 -142 55 -220.5t167 -80.5q97 -2 175.5 55.5t105.5 154.5l172 1 q-21 -134 -125.5 -228.5t-264.5 -124.5l-46 -233h-181l47 236q-119 30 -191.5 124t-86.5 235z" />
|
||||
<glyph unicode="£" horiz-adv-x="1164" d="M-13 0l29 156l67 -2q113 41 142 262l27 206h-160l27 157h156l31 253q25 204 164 327t331 117q168 -4 264 -108.5t88 -281.5l-187 1q7 106 -42 167t-150 65q-110 4 -187 -78t-93 -211l-32 -251h310l-27 -157h-305l-28 -212q-20 -153 -108 -256l715 3l-29 -157h-1003z" />
|
||||
<glyph unicode="¤" horiz-adv-x="1426" d="M18 118l159 134q-30 85 -40 172q-19 150 25.5 294.5t148.5 261.5l-117 157l141 127l114 -148q179 122 361 118q188 -2 325 -121l175 152l111 -146l-173 -147q32 -87 44 -176q18 -144 -22.5 -285t-139.5 -261l115 -150l-143 -127l-106 137q-187 -134 -377 -130 q-199 4 -335 130l-157 -136zM304 599q-15 -114 22 -218t116.5 -165.5t187.5 -65.5q117 -4 224.5 59t180 174t88.5 234q14 115 -22.5 218t-115.5 163.5t-187 64.5q-118 4 -226 -59t-180 -173t-88 -232z" />
|
||||
<glyph unicode="¥" horiz-adv-x="1213" d="M83 322l22 124h366l29 165h-367l22 125h310l-281 720h203l235 -673l469 673h225l-530 -720h297l-22 -125h-372l-29 -165h373l-22 -124h-372l-57 -322h-188l56 322h-367z" />
|
||||
<glyph unicode="¦" horiz-adv-x="486" d="M-9 -270l138 791h182l-138 -791h-182zM159 698l132 758h182l-132 -758h-182z" />
|
||||
<glyph unicode="§" horiz-adv-x="1228" d="M-24 -63l181 1q-6 -85 25.5 -148t96.5 -97.5t153 -35.5q83 -2 157 25t120 76.5t55 118.5q12 77 -41.5 132.5t-192 100t-218.5 82.5q-242 115 -222 351q14 184 224 287q-99 106 -86 272q8 108 75 194.5t186 133.5q123 48 264 46q207 -4 319.5 -118.5t100.5 -312.5h-180 q8 126 -58 201t-190 79q-135 2 -226.5 -56.5t-106.5 -163.5q-11 -81 37 -135.5t183.5 -96.5t206.5 -73q269 -116 248 -361q-18 -191 -229 -287q103 -103 90 -272q-14 -174 -158 -276t-366 -100q-217 4 -338 119t-110 314zM273 545q-14 -100 61 -161q50 -41 179 -81.5 t194 -65.5q174 52 196 199q11 73 -36.5 129t-166.5 98l-84 28l-154 52q-167 -47 -189 -198z" />
|
||||
<glyph unicode="¨" horiz-adv-x="840" d="M219 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM636 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="©" horiz-adv-x="1571" d="M119 722q22 199 136 377t289 279.5t369 97.5q178 -2 320 -100t213 -271.5t50 -369.5q-23 -203 -137 -380t-286 -277t-360 -99h-10q-183 4 -323 102t-211 271.5t-50 369.5zM230 570q22 -207 152 -338.5t320 -133.5q187 -4 353.5 107.5t258 302t71.5 380.5 q-22 205 -150 334t-321 134q-189 4 -355.5 -108t-257.5 -300t-71 -378zM453 670l10 98q20 189 123.5 298.5t260.5 107.5q142 -4 219.5 -85.5t71.5 -229.5l-143 1q6 85 -28.5 134t-124.5 51q-95 2 -158.5 -70.5t-78 -200t-13.5 -157.5l2 -35q7 -77 46.5 -122t107.5 -48 q170 -7 205 184l140 1q-14 -151 -107 -234.5t-242 -79.5q-145 4 -225 112t-66 275z" />
|
||||
<glyph unicode="ª" horiz-adv-x="898" d="M199 911q5 115 98 177t260 62l111 -1l9 54q3 27 1 51q-7 79 -92 82q-56 1 -99.5 -23.5t-58.5 -80.5l-156 11q11 109 99 172.5t219 61.5q123 -4 189.5 -78.5t56.5 -198.5l-54 -347l-4 -58q-1 -45 7 -91l-155 -1l-4 74q-92 -86 -206 -86q-105 0 -165 61.5t-56 158.5z M361 915q-5 -43 22 -66t77 -23q75 0 166 68l28 143h-93q-88 -3 -140 -35t-60 -87z" />
|
||||
<glyph unicode="«" horiz-adv-x="942" d="M89 538l2 20l347 389h152l-329 -409l178 -387h-125zM409 538l2 20l347 389h152l-329 -409l178 -387h-125z" />
|
||||
<glyph unicode="¬" horiz-adv-x="1110" d="M129 639l29 161h807l-74 -425h-182l47 264h-627z" />
|
||||
<glyph unicode="­" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
|
||||
<glyph unicode="®" horiz-adv-x="1572" d="M118 722q22 199 136 377t289 279.5t369 97.5q175 -2 316.5 -97.5t215 -269t51.5 -374.5q-23 -204 -138 -381.5t-288.5 -278.5t-365.5 -97q-179 4 -319 99.5t-213.5 270.5t-52.5 374zM229 569q12 -131 76.5 -241t167 -169t228.5 -62q187 -4 352 106t258 300t74 385 q-14 133 -78.5 241t-166 166t-227.5 61q-185 4 -350 -103t-259.5 -297.5t-74.5 -386.5zM463 316l133 849l257 -1q139 -5 213.5 -69.5t67.5 -178.5q-3 -58 -37 -106t-115 -94q77 -44 86 -141l-1 -61q-11 -87 -9 -118l3 -64l-2 -17h-138q-6 37 -4 73l7 72l6 54q7 66 -17 100.5 t-92 38.5l-167 1l-53 -338h-138zM673 782l143 -1q72 2 122.5 36.5t59.5 92.5q10 63 -22.5 94t-121.5 34h-140z" />
|
||||
<glyph unicode="¯" horiz-adv-x="920" d="M227 1313l23 143h694l-23 -143h-694z" />
|
||||
<glyph unicode="°" horiz-adv-x="752" d="M236 1207q4 111 84.5 191.5t183.5 78.5q97 -2 160.5 -76.5t61.5 -175.5q-4 -112 -83.5 -190t-181.5 -76q-98 2 -163.5 74.5t-61.5 173.5zM357 1209q-6 -49 24.5 -85.5t79.5 -36.5q54 0 96.5 40t48.5 96q6 48 -22 87.5t-80 39.5q-54 0 -97.5 -42.5t-49.5 -98.5z" />
|
||||
<glyph unicode="±" horiz-adv-x="1071" d="M37 0l24 152h811l-24 -152h-811zM109 703l25 151h373l65 413h163l-65 -413h353l-24 -151h-352l-65 -414h-164l65 414h-374z" />
|
||||
<glyph unicode="²" horiz-adv-x="738" d="M92 667l20 116l355 298q99 84 111 158q7 48 -19.5 75t-74.5 28q-66 1 -106 -36.5t-54 -99.5l-154 -1q11 117 98 191.5t215 72.5q120 -2 189.5 -65t64.5 -165q-8 -123 -159 -248l-64 -51l-196 -145h379l-23 -128h-582z" />
|
||||
<glyph unicode="³" horiz-adv-x="738" d="M110 889h151q0 -50 33 -77.5t91 -27.5q64 0 109.5 32t52.5 85q13 102 -128 107l-87 1l11 116l78 -1q66 2 112.5 32.5t53.5 84.5q6 49 -25 73.5t-81 24.5q-112 0 -141 -93h-156q11 101 90.5 161.5t204.5 60.5q126 -3 197 -62t66 -156q-7 -119 -159 -185q118 -43 114 -172 q-5 -111 -95.5 -175.5t-223.5 -62.5q-119 2 -193.5 64t-74.5 170z" />
|
||||
<glyph unicode="´" horiz-adv-x="633" d="M213 1240l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="µ" horiz-adv-x="1135" d="M-27 -416l260 1498h181l-103 -624q-10 -84 -7 -142q10 -183 156 -186q183 -6 280 151l139 801h182l-188 -1082h-162l19 115q-111 -138 -273 -136q-135 0 -215 75l-89 -470h-180z" />
|
||||
<glyph unicode="¶" horiz-adv-x="981" d="M143 980q14 142 88 251t194 167.5t264 58.5l277 -1l-252 -1456h-182l91 520l-64 1q-211 3 -323.5 130.5t-92.5 328.5z" />
|
||||
<glyph unicode="·" horiz-adv-x="528" d="M165 726q1 49 31.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -33 -80.5t-81 -33.5q-45 -2 -77.5 27.5t-32.5 80.5z" />
|
||||
<glyph unicode="¸" horiz-adv-x="502" d="M-56 -437l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
|
||||
<glyph unicode="¹" horiz-adv-x="738" d="M223 1215l24 135l356 113h21l-131 -789h-154l104 597z" />
|
||||
<glyph unicode="º" horiz-adv-x="913" d="M205 1043l7 70q17 168 122.5 268t254.5 96q141 -4 221.5 -102.5t67.5 -251.5l-7 -71q-17 -166 -121.5 -266.5t-254.5 -96.5q-142 4 -222.5 104t-67.5 250zM365 1041q-10 -96 26 -153.5t113 -59.5q79 -3 135 54t71 161l9 81q8 102 -29 156.5t-109 56.5q-82 2 -138 -56 t-70 -158z" />
|
||||
<glyph unicode="»" horiz-adv-x="941" d="M15 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152zM353 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152z" />
|
||||
<glyph unicode="¼" horiz-adv-x="1465" d="M185 1205l24 135l356 113h21l-131 -789h-154l104 597zM256 192l881 1128l98 -72l-881 -1128zM688 169l13 112l447 508h164l-85 -490h104l-23 -130h-103l-30 -169h-154l30 169h-363zM865 299h208l58 291l-22 -30z" />
|
||||
<glyph unicode="½" horiz-adv-x="1551" d="M180 1205l24 135l356 113h21l-131 -789h-154l104 597zM213 192l881 1128l98 -72l-881 -1128zM751 0l20 116l355 298q99 84 111 158q7 48 -19.5 75t-74.5 28q-66 1 -106 -36.5t-54 -99.5l-154 -1q11 117 98 191.5t215 72.5q120 -2 189.5 -65t64.5 -165q-8 -123 -159 -248 l-64 -51l-196 -145h379l-23 -128h-582z" />
|
||||
<glyph unicode="¾" horiz-adv-x="1555" d="M158 890h151q0 -50 33 -77.5t91 -27.5q64 0 109.5 32t52.5 85q13 102 -128 107l-87 1l11 116l78 -1q66 2 112.5 32.5t53.5 84.5q6 49 -25 73.5t-81 24.5q-112 0 -141 -93h-156q11 101 90.5 161.5t204.5 60.5q126 -3 197 -62t66 -156q-7 -119 -159 -185q118 -43 114 -172 q-5 -111 -95.5 -175.5t-223.5 -62.5q-119 2 -193.5 64t-74.5 170zM379 192l881 1128l98 -72l-881 -1128zM777 169l13 112l447 508h164l-85 -490h104l-23 -130h-103l-30 -169h-154l30 169h-363zM954 299h208l58 291l-22 -30z" />
|
||||
<glyph unicode="¿" horiz-adv-x="950" d="M-30 -14q15 183 206 358l116 102q91 85 116 234l176 1q-12 -109 -53.5 -189.5t-146.5 -180.5l-97 -91q-119 -115 -132 -230q-13 -98 34 -156t140 -60q98 -2 164.5 54.5t84.5 150.5l180 1q-19 -167 -141 -268.5t-299 -97.5q-173 4 -268 105t-80 267zM441 994q1 47 31 76.5 t76 31.5q46 1 76.5 -27.5t29.5 -74.5q0 -47 -29.5 -78t-76.5 -33q-48 -2 -77.5 29t-29.5 76z" />
|
||||
<glyph unicode="À" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM568 1844h205l143 -294h-143z" />
|
||||
<glyph unicode="Á" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM712 1550l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="Â" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM528 1560v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="Ã" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM478 1563q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34 t-67 14q-85 -3 -116 -112z" />
|
||||
<glyph unicode="Ä" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM526 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM943 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="Å" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM641 1721q2 91 66.5 154t153.5 63q82 0 139.5 -58t57.5 -143q-2 -89 -66.5 -151t-153.5 -62q-84 0 -141.5 57t-55.5 140zM737 1723q-4 -46 23 -77.5t70 -31.5q46 0 85.5 35.5 t45.5 85.5q6 46 -22 79t-70 33q-46 0 -86 -36.5t-46 -87.5z" />
|
||||
<glyph unicode="Æ" horiz-adv-x="1867" d="M-124 0l1106 1456h930l-27 -152h-670l-63 -471h574l-27 -151h-567l-71 -531h685l-27 -151h-857l47 353h-540l-261 -353h-232zM496 527h436l96 722z" />
|
||||
<glyph unicode="Ç" horiz-adv-x="1303" d="M120 494q-4 82 7 160l17 120q47 328 230.5 517.5t446.5 184.5q205 -4 325 -132.5t127 -356.5h-187q-13 306 -240 330l-33 2q-189 5 -315.5 -140.5t-163.5 -397.5l-22 -151l-6 -88q-6 -184 65.5 -292.5t212.5 -112.5q152 -5 251.5 73t151.5 251l182 3 q-42 -226 -204.5 -358t-389.5 -126q-135 3 -236 66.5t-157 183t-62 264.5zM394 -446l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
|
||||
<glyph unicode="È" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM518 1856h205l143 -294h-143z" />
|
||||
<glyph unicode="É" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM662 1562l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="Ê" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM478 1572v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="Ë" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM476 1691q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM893 1689q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="Ì" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM189 1856h205l143 -294h-143z" />
|
||||
<glyph unicode="Í" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM332 1562l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="Î" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM149 1572v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="Ï" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM147 1691q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM564 1689q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="Ð" horiz-adv-x="1343" d="M47 666l27 151h157l111 639l378 -1q178 0 306.5 -89t184.5 -245.5t33 -350.5l-10 -73q-44 -318 -247 -507.5t-510 -189.5h-388l115 666h-157zM304 157l185 -1q212 0 359.5 132t191.5 362q35 184 24 313q-15 155 -103 242.5t-236 91.5l-223 1l-84 -481h274l-27 -151h-273z " />
|
||||
<glyph unicode="Ñ" horiz-adv-x="1426" d="M59 0l253 1456h182l521 -1135l197 1135h187l-253 -1456h-182l-520 1130l-196 -1130h-189zM530 1563q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
|
||||
<glyph unicode="Ò" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM601 1846h205l143 -294h-143z" />
|
||||
<glyph unicode="Ó" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM745 1552l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="Ô" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM561 1562v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="Õ" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM511 1565q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
|
||||
<glyph unicode="Ö" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM559 1681q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM976 1679q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="×" horiz-adv-x="1069" d="M40 338l379 335l-261 336l128 114l262 -334l377 334l101 -131l-376 -336l262 -336l-128 -114l-263 336l-379 -336z" />
|
||||
<glyph unicode="Ø" horiz-adv-x="1376" d="M32 -92l189 232q-106 171 -101 401q1 97 25.5 247t84 279.5t148.5 222t202 141t240 45.5q206 -4 335 -126l131 165h150l-208 -256q49 -116 59 -238q14 -169 -29 -391t-156 -381.5t-272 -225.5q-112 -47 -240 -44q-166 4 -283 84l-124 -155h-151zM302 487q2 -108 33 -191 l710 908q-77 104 -233 109q-182 5 -308 -133t-170 -382q-34 -192 -32 -311zM411 203q74 -58 188 -62q191 -5 317.5 142t166.5 417q22 147 26 233q4 78 -7 156z" />
|
||||
<glyph unicode="Ù" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM563 1844h205l143 -294h-143z" />
|
||||
<glyph unicode="Ú" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM707 1550l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="Û" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM523 1560v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z " />
|
||||
<glyph unicode="Ü" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM521 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5 q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM938 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="Ý" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554zM658 1550l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="Þ" horiz-adv-x="1184" d="M56 0l253 1456h182l-51 -293l238 -1q208 -1 326 -114.5t103 -301.5q-11 -130 -81.5 -228.5t-189.5 -152t-264 -53.5l-279 1l-55 -313h-182zM319 465l257 -1q139 0 236 76.5t114 203.5q14 120 -50.5 191t-182.5 75l-279 1z" />
|
||||
<glyph unicode="ß" horiz-adv-x="1191" d="M30 0l190 1111q18 134 77 237t152 156t214 51q159 -4 246 -93t74 -237q-9 -95 -90 -217t-93 -198q-9 -55 18 -109t100 -128t102 -130.5t26 -116.5q-10 -164 -126 -257.5t-289 -89.5q-178 2 -292 75l59 153q106 -75 219 -77q101 0 170.5 49.5t80.5 135.5q7 57 -20.5 110.5 t-101 128.5t-104 134.5t-24.5 122.5q5 59 33 107.5t60.5 94t61 93t36.5 105.5q10 82 -28 136t-119 58q-105 3 -173 -72.5t-89 -220.5l-189 -1112h-181z" />
|
||||
<glyph unicode="à" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM426 1534h205l143 -294h-143z" />
|
||||
<glyph unicode="á" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM570 1240l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="â" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM386 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="ã" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM336 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113 l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
|
||||
<glyph unicode="ä" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM384 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32 q-47 -1 -76.5 28t-29.5 76zM801 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="å" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM499 1411q2 91 66.5 154t153.5 63q82 0 139.5 -58t57.5 -143q-2 -89 -66.5 -151t-153.5 -62 q-84 0 -141.5 57t-55.5 140zM595 1413q-4 -46 23 -77.5t70 -31.5q46 0 85.5 35.5t45.5 85.5q6 46 -22 79t-70 33q-46 0 -86 -36.5t-46 -87.5z" />
|
||||
<glyph unicode="æ" horiz-adv-x="1687" d="M29 296q10 160 137 250t344 90l226 -1l12 86q12 104 -31 164.5t-133 64.5q-104 2 -176 -51.5t-87 -139.5l-179 19q16 151 142 239t312 86q109 -2 190.5 -45.5t115.5 -120.5q162 169 356 165q127 -2 214 -65t124 -173.5t20 -248.5l-18 -118h-702q-9 -68 0 -132 q13 -107 77.5 -169.5t168.5 -63.5q90 -2 168.5 28t152.5 77l53 -137q-138 -120 -380 -120q-121 2 -213.5 48.5t-143.5 131.5q-169 -184 -445 -180q-146 2 -230.5 88.5t-74.5 227.5zM212 292q-9 -74 36 -117.5t127 -45.5q70 -2 149.5 34.5t145.5 93.5l43 238l-203 1 q-120 0 -203 -56.5t-95 -147.5zM915 640h522l6 32q9 55 2 105q-11 80 -62 126t-135 49q-110 3 -195 -75.5t-138 -236.5z" />
|
||||
<glyph unicode="ç" horiz-adv-x="1050" d="M84 517l5 50q19 156 91 279t188 191.5t256 64.5q170 -4 272 -114t102 -279l-169 1q-2 106 -59 171.5t-154 69.5q-141 3 -234.5 -105t-116.5 -302l-3 -26q-6 -64 -2 -132q7 -117 66 -185t162 -71q97 -2 175 56.5t102 153.5l171 1q-15 -102 -81.5 -186t-167.5 -131 t-207 -44q-135 2 -228.5 70.5t-137.5 191t-30 275.5zM262 -446l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
|
||||
<glyph unicode="è" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM399 1534h205l143 -294h-143z" />
|
||||
<glyph unicode="é" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM543 1240l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="ê" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM359 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="ë" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM357 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM774 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="ì" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM107 1533h205l143 -294h-143z" />
|
||||
<glyph unicode="í" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM250 1239l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="î" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM67 1249v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="ï" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM65 1368q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM482 1366q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="ð" horiz-adv-x="1174" d="M111 459q14 144 83 265.5t180 189.5t243 64q154 -4 265 -115q-4 182 -110 335l-239 -148l-59 108l207 126q-102 86 -280 138l70 157q220 -56 370 -192l209 130l58 -109l-182 -109q177 -295 127 -666l-13 -91q-24 -167 -102.5 -300t-191 -199.5t-242.5 -63.5 q-188 4 -300 141.5t-93 338.5zM292 458q-15 -139 49 -232.5t176 -96.5q127 -5 218 104.5t122 301.5l20 160q-56 126 -226 131q-144 4 -242 -97.5t-117 -270.5z" />
|
||||
<glyph unicode="ñ" horiz-adv-x="1106" d="M31 0l188 1082l171 1l-26 -137q146 160 332 156q153 -4 226 -106t54 -287l-118 -709h-181l119 712q6 49 1 91q-17 140 -165 143q-163 3 -286 -174l-134 -772h-181zM327 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10 q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
|
||||
<glyph unicode="ò" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM408 1534h205l143 -294h-143z" />
|
||||
<glyph unicode="ó" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM552 1240l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="ô" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM368 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="õ" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM318 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
|
||||
<glyph unicode="ö" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM366 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM783 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="÷" horiz-adv-x="1144" d="M68 600l33 184h969l-32 -184h-970zM392 278q1 49 31.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -33 -80t-81 -33t-79.5 28.5t-30.5 78.5zM534 1095q0 49 30.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -32.5 -80t-80.5 -33t-80 28t-30 79z" />
|
||||
<glyph unicode="ø" horiz-adv-x="1135" d="M57 -133l141 205q-118 124 -125 329q-2 61 4 121l2 16q36 263 191 416.5t368 149.5q103 -2 194 -45l102 149l132 -1l-144 -207q110 -130 117 -328q2 -55 -6 -141q-19 -156 -98.5 -287.5t-199.5 -199.5t-262 -66q-89 2 -182 37l-102 -149zM249 447q-10 -132 41 -223 l459 698q-55 29 -119 31q-157 4 -261.5 -133.5t-119.5 -372.5zM373 152q50 -23 107 -25q140 -3 240.5 107t131.5 297q13 95 11 170q-3 74 -34 143z" />
|
||||
<glyph unicode="ù" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM412 1534h205l143 -294h-143z" />
|
||||
<glyph unicode="ú" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM556 1240l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="û" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM372 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="ü" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM370 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32 q-47 -1 -76.5 28t-29.5 76zM787 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="ý" horiz-adv-x="950" d="M-91 -422l16 150l47 -5q86 -4 148.5 38.5t110.5 137.5l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-134 -263 -344 -260q-37 1 -109 18zM499 1240l234 294h230l-306 -294h-158z" />
|
||||
<glyph unicode="þ" horiz-adv-x="1155" d="M-32 -416l339 1952h180l-106 -567q131 137 312 133q158 -4 244.5 -118t89.5 -303q1 -61 -7 -145q-20 -166 -90 -299t-171.5 -197.5t-225.5 -61.5q-186 4 -287 128l-97 -522h-181zM269 278q61 -143 218 -148q137 -3 231.5 106.5t123.5 321.5l5 84q0 145 -56 223t-160 80 q-160 4 -272 -148z" />
|
||||
<glyph unicode="ÿ" horiz-adv-x="950" d="M-91 -422l16 150l47 -5q86 -4 148.5 38.5t110.5 137.5l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-134 -263 -344 -260q-37 1 -109 18zM313 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76z M730 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="Œ" horiz-adv-x="1904" d="M105 576l47 299q43 274 215.5 439t415.5 163l74 -2l211 -19h825l-28 -158h-701l-81 -468h612l-28 -157h-611l-90 -516h712l-28 -157h-812l-217 -18l-69 -1q-152 4 -261.5 83t-158 216t-27.5 296zM284 419q10 -131 81 -206.5t193 -79.5q76 -3 214 10l209 1168 q-108 17 -203 17q-175 2 -293 -119.5t-151 -333.5l-47 -300q-10 -78 -3 -156z" />
|
||||
<glyph unicode="œ" horiz-adv-x="1814" d="M87 522l2 16q36 261 186.5 415t362.5 149q121 -2 216 -60t138 -157q178 221 395 218q125 -2 213 -65t125 -173t20 -246l-19 -122h-692q-8 -61 -2 -125q10 -108 68.5 -172.5t154.5 -67.5q172 -6 316 105l61 -127q-68 -65 -168 -98t-215 -31q-124 2 -218.5 58.5 t-138.5 151.5q-171 -217 -415 -211q-133 2 -227 73t-136.5 195.5t-26.5 273.5zM266 392q5 -117 62.5 -188.5t158.5 -74.5q136 -5 233.5 105t123.5 297l2 22l5 87q0 143 -57.5 225t-166.5 86q-140 5 -236.5 -110.5t-119.5 -296.5l-2 -22q-7 -62 -3 -130zM1056 649l510 -1 l5 28q8 53 1 102q-13 79 -64.5 124.5t-130.5 48.5q-101 3 -183.5 -74t-137.5 -228z" />
|
||||
<glyph unicode="Ÿ" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554zM472 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM889 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
|
||||
<glyph unicode="ˆ" horiz-adv-x="945" d="M279 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
|
||||
<glyph unicode="˜" horiz-adv-x="947" d="M221 1249q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
|
||||
<glyph unicode=" " horiz-adv-x="969" />
|
||||
<glyph unicode=" " horiz-adv-x="1938" />
|
||||
<glyph unicode=" " horiz-adv-x="969" />
|
||||
<glyph unicode=" " horiz-adv-x="1938" />
|
||||
<glyph unicode=" " horiz-adv-x="646" />
|
||||
<glyph unicode=" " horiz-adv-x="484" />
|
||||
<glyph unicode=" " horiz-adv-x="323" />
|
||||
<glyph unicode=" " horiz-adv-x="323" />
|
||||
<glyph unicode=" " horiz-adv-x="242" />
|
||||
<glyph unicode=" " horiz-adv-x="387" />
|
||||
<glyph unicode=" " horiz-adv-x="107" />
|
||||
<glyph unicode="‐" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
|
||||
<glyph unicode="‑" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
|
||||
<glyph unicode="‒" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
|
||||
<glyph unicode="–" horiz-adv-x="1314" d="M159 651l33 151h973l-33 -151h-973z" />
|
||||
<glyph unicode="—" horiz-adv-x="1561" d="M82 651l43 151h1297l-43 -151h-1297z" />
|
||||
<glyph unicode="‘" horiz-adv-x="407" d="M174 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180z" />
|
||||
<glyph unicode="’" horiz-adv-x="407" d="M137 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369z" />
|
||||
<glyph unicode="‚" horiz-adv-x="405" d="M-104 -208q115 144 139 283l18 106h181l-15 -96q-35 -220 -224 -368z" />
|
||||
<glyph unicode="“" horiz-adv-x="712" d="M182 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180zM487 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180z" />
|
||||
<glyph unicode="”" horiz-adv-x="719" d="M149 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369zM446 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369z" />
|
||||
<glyph unicode="„" horiz-adv-x="694" d="M-108 -227q116 151 143 302l30 171h180l-25 -156q-39 -241 -224 -392zM180 -227q116 154 142 302l30 171h181l-25 -156q-39 -240 -225 -392z" />
|
||||
<glyph unicode="•" horiz-adv-x="679" d="M160 724l1 41q6 94 64.5 150.5t144.5 56.5q81 0 133.5 -54.5t52.5 -142.5l-2 -42q-6 -90 -62.5 -145t-146.5 -55q-82 0 -133.5 53t-51.5 138z" />
|
||||
<glyph unicode="…" horiz-adv-x="1339" d="M57 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM481 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM883 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5 t-31 78.5z" />
|
||||
<glyph unicode=" " horiz-adv-x="387" />
|
||||
<glyph unicode="‹" horiz-adv-x="606" d="M95 540l2 20l347 389h152l-329 -409l178 -387h-125z" />
|
||||
<glyph unicode="›" horiz-adv-x="606" d="M2 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152z" />
|
||||
<glyph unicode=" " horiz-adv-x="484" />
|
||||
<glyph unicode="€" d="M81 541l22 124h172l25 137h-173l22 125h165q62 269 219.5 410.5t389.5 139.5q89 0 237 -30l-34 -164q-106 36 -205 38q-161 2 -266.5 -99t-151.5 -295h378l-22 -125h-372l-24 -137h373l-22 -124h-370q-9 -74 -2 -145q12 -120 79 -187t181 -70q95 -3 219 31l5 -161 q-114 -29 -233 -27q-226 4 -345 159t-87 401z" />
|
||||
<glyph unicode="™" horiz-adv-x="1253" d="M234 1375l14 81h376l-15 -81h-142l-80 -456h-89l79 456h-143zM605 919l94 537h106l69 -397l210 397h113l-94 -537h-88l67 379l-195 -378l-52 -2l-70 401l-71 -400h-89z" />
|
||||
<glyph unicode="◼" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
|
||||
<glyph unicode="ffi" horiz-adv-x="1706" d="M116 939l25 143h166l17 121q23 168 129 264t266 94q54 -2 129 -18l-22 -152q-48 10 -97 12q-89 0 -147.5 -53t-75.5 -147l-19 -121h387l14 101q26 177 141.5 277.5t296.5 98.5q72 -2 140.5 -21t136.5 -43l-47 -155q-115 51 -226 53q-228 2 -262 -224l-13 -87h216 l-25 -143h-215l-163 -939h-181l163 939h-387l-163 -939h-181l164 939h-167zM1254 0l188 1082h181l-188 -1082h-181z" />
|
||||
<glyph unicode="ffl" horiz-adv-x="1706" d="M116 939l25 143h166l18 127q29 182 151 276q102 78 244 76q53 -2 128 -18l-22 -152q-58 12 -98 12q-91 0 -149.5 -55t-74.5 -158l-17 -108h388l15 107q25 180 132 276.5t277 94.5q86 -2 199 -24l191 -40l-254 -1496h-181l243 1380q-129 22 -189 22q-205 2 -239 -225 l-14 -95h225l-26 -143h-223l-163 -939h-181l163 939h-387l-163 -939h-181l163 939h-166z" />
|
||||
<hkern u1=" " u2="T" k="40" />
|
||||
<hkern u1=""" u2="w" k="-11" />
|
||||
<hkern u1="'" u2="w" k="-11" />
|
||||
<hkern u1="(" u2="Ÿ" k="-22" />
|
||||
<hkern u1="(" u2="Ý" k="-22" />
|
||||
<hkern u1="(" u2="Y" k="-22" />
|
||||
<hkern u1="(" u2="W" k="-18" />
|
||||
<hkern u1="(" u2="V" k="-20" />
|
||||
<hkern u1="/" u2="/" k="224" />
|
||||
<hkern u1="A" u2="w" k="33" />
|
||||
<hkern u1="A" u2="t" k="17" />
|
||||
<hkern u1="A" u2="?" k="61" />
|
||||
<hkern u1="C" u2="}" k="17" />
|
||||
<hkern u1="C" u2="]" k="12" />
|
||||
<hkern u1="C" u2=")" k="26" />
|
||||
<hkern u1="D" u2="Æ" k="33" />
|
||||
<hkern u1="E" u2="w" k="22" />
|
||||
<hkern u1="E" u2="f" k="18" />
|
||||
<hkern u1="F" u2="…" k="234" />
|
||||
<hkern u1="F" u2="„" k="234" />
|
||||
<hkern u1="F" u2="‚" k="234" />
|
||||
<hkern u1="F" u2="œ" k="21" />
|
||||
<hkern u1="F" u2="ÿ" k="24" />
|
||||
<hkern u1="F" u2="ý" k="24" />
|
||||
<hkern u1="F" u2="ü" k="22" />
|
||||
<hkern u1="F" u2="û" k="22" />
|
||||
<hkern u1="F" u2="ú" k="22" />
|
||||
<hkern u1="F" u2="ù" k="22" />
|
||||
<hkern u1="F" u2="ö" k="21" />
|
||||
<hkern u1="F" u2="õ" k="21" />
|
||||
<hkern u1="F" u2="ô" k="21" />
|
||||
<hkern u1="F" u2="ó" k="21" />
|
||||
<hkern u1="F" u2="ò" k="21" />
|
||||
<hkern u1="F" u2="ë" k="21" />
|
||||
<hkern u1="F" u2="ê" k="21" />
|
||||
<hkern u1="F" u2="é" k="21" />
|
||||
<hkern u1="F" u2="è" k="21" />
|
||||
<hkern u1="F" u2="ç" k="21" />
|
||||
<hkern u1="F" u2="å" k="34" />
|
||||
<hkern u1="F" u2="ä" k="34" />
|
||||
<hkern u1="F" u2="ã" k="34" />
|
||||
<hkern u1="F" u2="â" k="34" />
|
||||
<hkern u1="F" u2="á" k="34" />
|
||||
<hkern u1="F" u2="à" k="34" />
|
||||
<hkern u1="F" u2="Å" k="170" />
|
||||
<hkern u1="F" u2="Ä" k="170" />
|
||||
<hkern u1="F" u2="Ã" k="170" />
|
||||
<hkern u1="F" u2="Â" k="170" />
|
||||
<hkern u1="F" u2="Á" k="170" />
|
||||
<hkern u1="F" u2="À" k="170" />
|
||||
<hkern u1="F" u2="y" k="24" />
|
||||
<hkern u1="F" u2="v" k="24" />
|
||||
<hkern u1="F" u2="u" k="22" />
|
||||
<hkern u1="F" u2="r" k="26" />
|
||||
<hkern u1="F" u2="q" k="21" />
|
||||
<hkern u1="F" u2="o" k="21" />
|
||||
<hkern u1="F" u2="g" k="21" />
|
||||
<hkern u1="F" u2="e" k="21" />
|
||||
<hkern u1="F" u2="d" k="21" />
|
||||
<hkern u1="F" u2="c" k="21" />
|
||||
<hkern u1="F" u2="a" k="34" />
|
||||
<hkern u1="F" u2="T" k="-20" />
|
||||
<hkern u1="F" u2="J" k="264" />
|
||||
<hkern u1="F" u2="A" k="170" />
|
||||
<hkern u1="F" u2="." k="234" />
|
||||
<hkern u1="F" u2="," k="234" />
|
||||
<hkern u1="K" u2="w" k="63" />
|
||||
<hkern u1="L" u2="w" k="92" />
|
||||
<hkern u1="O" u2="Æ" k="33" />
|
||||
<hkern u1="P" u2="Æ" k="97" />
|
||||
<hkern u1="P" u2="t" k="-14" />
|
||||
<hkern u1="Q" u2="Ÿ" k="35" />
|
||||
<hkern u1="Q" u2="Ý" k="35" />
|
||||
<hkern u1="Q" u2="Y" k="35" />
|
||||
<hkern u1="Q" u2="W" k="20" />
|
||||
<hkern u1="Q" u2="V" k="28" />
|
||||
<hkern u1="Q" u2="T" k="43" />
|
||||
<hkern u1="R" u2="Ÿ" k="48" />
|
||||
<hkern u1="R" u2="Ý" k="48" />
|
||||
<hkern u1="R" u2="Y" k="48" />
|
||||
<hkern u1="R" u2="V" k="19" />
|
||||
<hkern u1="R" u2="T" k="80" />
|
||||
<hkern u1="T" u2="ø" k="95" />
|
||||
<hkern u1="T" u2="æ" k="114" />
|
||||
<hkern u1="T" u2="Æ" k="179" />
|
||||
<hkern u1="T" u2="»" k="216" />
|
||||
<hkern u1="T" u2="«" k="328" />
|
||||
<hkern u1="T" u2="w" k="57" />
|
||||
<hkern u1="T" u2="r" k="75" />
|
||||
<hkern u1="T" u2=" " k="40" />
|
||||
<hkern u1="V" u2="}" k="-19" />
|
||||
<hkern u1="V" u2="r" k="30" />
|
||||
<hkern u1="V" u2="]" k="-17" />
|
||||
<hkern u1="V" u2=")" k="-20" />
|
||||
<hkern u1="W" u2="}" k="-14" />
|
||||
<hkern u1="W" u2="r" k="21" />
|
||||
<hkern u1="W" u2="]" k="-12" />
|
||||
<hkern u1="W" u2=")" k="-15" />
|
||||
<hkern u1="Y" u2="•" k="45" />
|
||||
<hkern u1="Y" u2="ø" k="64" />
|
||||
<hkern u1="Y" u2="æ" k="63" />
|
||||
<hkern u1="Y" u2="Æ" k="96" />
|
||||
<hkern u1="Y" u2="»" k="51" />
|
||||
<hkern u1="Y" u2="«" k="82" />
|
||||
<hkern u1="Y" u2="}" k="-19" />
|
||||
<hkern u1="Y" u2="t" k="22" />
|
||||
<hkern u1="Y" u2="r" k="40" />
|
||||
<hkern u1="Y" u2="f" k="22" />
|
||||
<hkern u1="Y" u2="]" k="-18" />
|
||||
<hkern u1="Y" u2="*" k="49" />
|
||||
<hkern u1="Y" u2=")" k="-20" />
|
||||
<hkern u1="Y" u2="&" k="30" />
|
||||
<hkern u1="Z" u2="w" k="27" />
|
||||
<hkern u1="[" u2="Ü" k="18" />
|
||||
<hkern u1="[" u2="Û" k="18" />
|
||||
<hkern u1="[" u2="Ú" k="18" />
|
||||
<hkern u1="[" u2="Ù" k="18" />
|
||||
<hkern u1="[" u2="U" k="18" />
|
||||
<hkern u1="[" u2="J" k="18" />
|
||||
<hkern u1="e" u2="’" k="80" />
|
||||
<hkern u1="f" u2="”" k="-16" />
|
||||
<hkern u1="f" u2="“" k="-16" />
|
||||
<hkern u1="f" u2="’" k="-16" />
|
||||
<hkern u1="f" u2="‘" k="-16" />
|
||||
<hkern u1="f" u2="œ" k="24" />
|
||||
<hkern u1="f" u2="ë" k="24" />
|
||||
<hkern u1="f" u2="ê" k="24" />
|
||||
<hkern u1="f" u2="é" k="24" />
|
||||
<hkern u1="f" u2="è" k="24" />
|
||||
<hkern u1="f" u2="ç" k="24" />
|
||||
<hkern u1="f" u2="}" k="-19" />
|
||||
<hkern u1="f" u2="q" k="24" />
|
||||
<hkern u1="f" u2="g" k="24" />
|
||||
<hkern u1="f" u2="e" k="24" />
|
||||
<hkern u1="f" u2="d" k="24" />
|
||||
<hkern u1="f" u2="c" k="24" />
|
||||
<hkern u1="f" u2="]" k="-18" />
|
||||
<hkern u1="f" u2=")" k="-20" />
|
||||
<hkern u1="f" u2="'" k="-16" />
|
||||
<hkern u1="f" u2=""" k="-16" />
|
||||
<hkern u1="h" u2="’" k="80" />
|
||||
<hkern u1="k" u2="œ" k="20" />
|
||||
<hkern u1="k" u2="ë" k="20" />
|
||||
<hkern u1="k" u2="ê" k="20" />
|
||||
<hkern u1="k" u2="é" k="20" />
|
||||
<hkern u1="k" u2="è" k="20" />
|
||||
<hkern u1="k" u2="ç" k="20" />
|
||||
<hkern u1="k" u2="q" k="20" />
|
||||
<hkern u1="k" u2="g" k="20" />
|
||||
<hkern u1="k" u2="e" k="20" />
|
||||
<hkern u1="k" u2="d" k="20" />
|
||||
<hkern u1="k" u2="c" k="20" />
|
||||
<hkern u1="m" u2="’" k="80" />
|
||||
<hkern u1="n" u2="’" k="80" />
|
||||
<hkern u1="o" u2="’" k="80" />
|
||||
<hkern u1="r" u2="w" k="-17" />
|
||||
<hkern u1="r" u2="t" k="-50" />
|
||||
<hkern u1="r" u2="f" k="-15" />
|
||||
<hkern u1="t" u2="ö" k="20" />
|
||||
<hkern u1="t" u2="õ" k="20" />
|
||||
<hkern u1="t" u2="ô" k="20" />
|
||||
<hkern u1="t" u2="ó" k="20" />
|
||||
<hkern u1="t" u2="ò" k="20" />
|
||||
<hkern u1="t" u2="o" k="20" />
|
||||
<hkern u1="v" u2="f" k="-13" />
|
||||
<hkern u1="w" u2="…" k="124" />
|
||||
<hkern u1="w" u2="„" k="124" />
|
||||
<hkern u1="w" u2="‚" k="124" />
|
||||
<hkern u1="w" u2="." k="124" />
|
||||
<hkern u1="w" u2="," k="124" />
|
||||
<hkern u1="y" u2="f" k="-13" />
|
||||
<hkern u1="{" u2="Ü" k="20" />
|
||||
<hkern u1="{" u2="Û" k="20" />
|
||||
<hkern u1="{" u2="Ú" k="20" />
|
||||
<hkern u1="{" u2="Ù" k="20" />
|
||||
<hkern u1="{" u2="U" k="20" />
|
||||
<hkern u1="{" u2="J" k="20" />
|
||||
<hkern u1="À" u2="w" k="33" />
|
||||
<hkern u1="À" u2="t" k="17" />
|
||||
<hkern u1="À" u2="?" k="61" />
|
||||
<hkern u1="Á" u2="w" k="33" />
|
||||
<hkern u1="Á" u2="t" k="17" />
|
||||
<hkern u1="Á" u2="?" k="61" />
|
||||
<hkern u1="Â" u2="w" k="33" />
|
||||
<hkern u1="Â" u2="t" k="17" />
|
||||
<hkern u1="Â" u2="?" k="61" />
|
||||
<hkern u1="Ã" u2="w" k="33" />
|
||||
<hkern u1="Ã" u2="t" k="17" />
|
||||
<hkern u1="Ã" u2="?" k="61" />
|
||||
<hkern u1="Ä" u2="w" k="33" />
|
||||
<hkern u1="Ä" u2="t" k="17" />
|
||||
<hkern u1="Ä" u2="?" k="61" />
|
||||
<hkern u1="Å" u2="w" k="33" />
|
||||
<hkern u1="Å" u2="t" k="17" />
|
||||
<hkern u1="Å" u2="?" k="61" />
|
||||
<hkern u1="Ç" u2="}" k="17" />
|
||||
<hkern u1="Ç" u2="]" k="12" />
|
||||
<hkern u1="Ç" u2=")" k="26" />
|
||||
<hkern u1="È" u2="w" k="22" />
|
||||
<hkern u1="È" u2="f" k="18" />
|
||||
<hkern u1="É" u2="w" k="22" />
|
||||
<hkern u1="É" u2="f" k="18" />
|
||||
<hkern u1="Ê" u2="w" k="22" />
|
||||
<hkern u1="Ê" u2="f" k="18" />
|
||||
<hkern u1="Ë" u2="w" k="22" />
|
||||
<hkern u1="Ë" u2="f" k="18" />
|
||||
<hkern u1="Ð" u2="Æ" k="33" />
|
||||
<hkern u1="Ò" u2="Æ" k="33" />
|
||||
<hkern u1="Ó" u2="Æ" k="33" />
|
||||
<hkern u1="Ô" u2="Æ" k="33" />
|
||||
<hkern u1="Õ" u2="Æ" k="33" />
|
||||
<hkern u1="Ö" u2="Æ" k="33" />
|
||||
<hkern u1="Ý" u2="•" k="45" />
|
||||
<hkern u1="Ý" u2="ø" k="64" />
|
||||
<hkern u1="Ý" u2="æ" k="63" />
|
||||
<hkern u1="Ý" u2="Æ" k="96" />
|
||||
<hkern u1="Ý" u2="»" k="51" />
|
||||
<hkern u1="Ý" u2="«" k="82" />
|
||||
<hkern u1="Ý" u2="}" k="-19" />
|
||||
<hkern u1="Ý" u2="t" k="22" />
|
||||
<hkern u1="Ý" u2="r" k="40" />
|
||||
<hkern u1="Ý" u2="f" k="22" />
|
||||
<hkern u1="Ý" u2="]" k="-18" />
|
||||
<hkern u1="Ý" u2="*" k="49" />
|
||||
<hkern u1="Ý" u2=")" k="-20" />
|
||||
<hkern u1="Ý" u2="&" k="30" />
|
||||
<hkern u1="è" u2="’" k="80" />
|
||||
<hkern u1="é" u2="’" k="80" />
|
||||
<hkern u1="ê" u2="’" k="80" />
|
||||
<hkern u1="ë" u2="’" k="80" />
|
||||
<hkern u1="ñ" u2="’" k="80" />
|
||||
<hkern u1="ò" u2="’" k="80" />
|
||||
<hkern u1="ó" u2="’" k="80" />
|
||||
<hkern u1="ô" u2="’" k="80" />
|
||||
<hkern u1="õ" u2="’" k="80" />
|
||||
<hkern u1="ö" u2="’" k="80" />
|
||||
<hkern u1="ý" u2="f" k="-13" />
|
||||
<hkern u1="ÿ" u2="f" k="-13" />
|
||||
<hkern u1="Ÿ" u2="•" k="45" />
|
||||
<hkern u1="Ÿ" u2="ø" k="64" />
|
||||
<hkern u1="Ÿ" u2="æ" k="63" />
|
||||
<hkern u1="Ÿ" u2="Æ" k="96" />
|
||||
<hkern u1="Ÿ" u2="»" k="51" />
|
||||
<hkern u1="Ÿ" u2="«" k="82" />
|
||||
<hkern u1="Ÿ" u2="}" k="-19" />
|
||||
<hkern u1="Ÿ" u2="t" k="22" />
|
||||
<hkern u1="Ÿ" u2="r" k="40" />
|
||||
<hkern u1="Ÿ" u2="f" k="22" />
|
||||
<hkern u1="Ÿ" u2="]" k="-18" />
|
||||
<hkern u1="Ÿ" u2="*" k="49" />
|
||||
<hkern u1="Ÿ" u2=")" k="-20" />
|
||||
<hkern u1="Ÿ" u2="&" k="30" />
|
||||
<hkern u1="‘" u2="w" k="-11" />
|
||||
<hkern u1="’" u2="ö" k="128" />
|
||||
<hkern u1="’" u2="õ" k="128" />
|
||||
<hkern u1="’" u2="ô" k="128" />
|
||||
<hkern u1="’" u2="ó" k="128" />
|
||||
<hkern u1="’" u2="ò" k="128" />
|
||||
<hkern u1="’" u2="w" k="-11" />
|
||||
<hkern u1="’" u2="s" k="112" />
|
||||
<hkern u1="’" u2="o" k="128" />
|
||||
<hkern u1="’" u2="l" k="-32" />
|
||||
<hkern u1="’" u2="k" k="-32" />
|
||||
<hkern u1="’" u2="h" k="-32" />
|
||||
<hkern u1="“" u2="w" k="-11" />
|
||||
<hkern u1="”" u2="w" k="-11" />
|
||||
<hkern g1="B" g2="T" k="27" />
|
||||
<hkern g1="B" g2="V" k="24" />
|
||||
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
|
||||
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="27" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="102" />
|
||||
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
|
||||
<hkern g1="C,Ccedilla" g2="T" k="29" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
|
||||
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
|
||||
<hkern g1="T" g2="v,y,yacute,ydieresis" k="72" />
|
||||
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
|
||||
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="99" />
|
||||
<hkern g1="T" g2="W" k="-15" />
|
||||
<hkern g1="T" g2="T" k="-16" />
|
||||
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="95" />
|
||||
<hkern g1="T" g2="z" k="60" />
|
||||
<hkern g1="T" g2="V" k="-16" />
|
||||
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
|
||||
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="79" />
|
||||
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="218" />
|
||||
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="99" />
|
||||
<hkern g1="T" g2="x" k="77" />
|
||||
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="232" />
|
||||
<hkern g1="T" g2="m,n,p,ntilde" k="109" />
|
||||
<hkern g1="T" g2="S" k="16" />
|
||||
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="113" />
|
||||
<hkern g1="T" g2="s" k="116" />
|
||||
<hkern g1="T" g2="J" k="240" />
|
||||
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
|
||||
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
|
||||
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
|
||||
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
|
||||
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
|
||||
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="64" />
|
||||
<hkern g1="K" g2="m,n,p,ntilde" k="23" />
|
||||
<hkern g1="L" g2="v,y,yacute,ydieresis" k="133" />
|
||||
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="65" />
|
||||
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="54" />
|
||||
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="336" />
|
||||
<hkern g1="L" g2="W" k="143" />
|
||||
<hkern g1="L" g2="T" k="275" />
|
||||
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="44" />
|
||||
<hkern g1="L" g2="V" k="175" />
|
||||
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="239" />
|
||||
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
|
||||
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
|
||||
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
|
||||
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="138" />
|
||||
<hkern g1="P" g2="X" k="31" />
|
||||
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="324" />
|
||||
<hkern g1="P" g2="Z" k="26" />
|
||||
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
|
||||
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
|
||||
<hkern g1="P" g2="J" k="200" />
|
||||
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
|
||||
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
|
||||
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
|
||||
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
|
||||
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
|
||||
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
|
||||
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="225" />
|
||||
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
|
||||
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="37" />
|
||||
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
|
||||
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
|
||||
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
|
||||
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
|
||||
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
|
||||
<hkern g1="X" g2="V" k="-14" />
|
||||
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
|
||||
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="46" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="94" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="211" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="52" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="73" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
|
||||
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
|
||||
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
|
||||
<hkern g1="W" g2="T" k="-14" />
|
||||
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
|
||||
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
|
||||
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="123" />
|
||||
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
|
||||
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
|
||||
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
|
||||
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
|
||||
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
|
||||
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
|
||||
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
|
||||
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
|
||||
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
|
||||
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
|
||||
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="67" />
|
||||
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
|
||||
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
|
||||
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
|
||||
<hkern g1="b,p,thorn" g2="z" k="15" />
|
||||
<hkern g1="b,p,thorn" g2="x" k="15" />
|
||||
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
|
||||
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
|
||||
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="104" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="136" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="107" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
|
||||
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
|
||||
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
|
||||
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
|
||||
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="20" />
|
||||
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="123" />
|
||||
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
|
||||
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="40" />
|
||||
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="20" />
|
||||
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
|
||||
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
|
||||
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="107" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="61" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
|
||||
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="80" />
|
||||
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="170" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
Before Width: | Height: | Size: 81 KiB |
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user