1. Overview
1.1. Product Philosophy
1.1.1. Why yuuvis® Momentum?
The digital transformation demands highly customized solutions to serve the needs and expectations of its user and to fully leverage its advantages. These solutions may stress the underlying application from very different angles - think of the different workloads a solution for email archiving poses compared to one facilitating workflows, or to one where analysis and classification and processing of incoming documents are the focus. What they all have in common these times is the need to reliably handle ever-growing amount of documents in an audit-proof manner, guaranteeing performant access via a capable query language over vast amounts of data. All access has to be controllable via an integrated rights management. And deep integration into existing system landscapes should be supported by flexible customization options.
If you are concerned about your archive solution not scaling to your amount of documents, if you are not sure whether to keep your data safe on your own hardware or might to move to the cloud later, if you need a platform offering a performant backend to develop your web applications against, yuuvis® Momentum might be the tool of choice for you. Check out a few use cases here.
1.1.2. Key Features
-
API first
-
Excellent scalability - high performance on big amounts of data
-
Docker/Kubernetes
-
No commercial databases etc. required
-
multi-tenancy
-
hybrid: runs in cloud or on premises
-
Simplified operation and administration
-
Nearly no downtime
Solutions build using yuuvis® Momentum are highly scalable, run either cloud native or on premises and exhibit outstanding performance. yuuvis® Momentum offers you to tap into existing user management and is readily integrated into an existing system environment via its REST API. Functionality is easily expanded using concepts like Webhooks, AMQP Hooks and Interceptors. It offers a complete audit trail, performant Search features in an SQL-like manner and Rights Management. It supports asynchronous document processing via Tagging, evolving documents via the Schema Flow and handling of Compound Documents. And all that with support for multi-tenancy with administration on global system as well as on tenant level.
1.2. Core Services
The core is the heart of the product and connects to your infrastructure. It consists of basic core services that are required for the proper operation of a yuuvis® Momentum instance. Each individual service can be scaled to optimize the usage of your resources.
The entirety of the core’s functions is made available through the API gateway. Depending on the concrete request, multiple core services are involved in the processing chain. Some basic use case flows are illustrated below. Just click to view them.
Authentication Flow (Browser)
-
HTTP request to any API endpoint
-
Redirect to identity provider
-
Verify credentials externally
-
Redirect to authentication with auth code
-
Send auth code to
authentication
service -
Retrieve
userId
using auth code -
Recieve
userId
-
Request role set acquisition
-
Query user role set
-
Recieve user role set
-
Present role set
-
Provide authentication token and proceed with initial API request
-
Request information from other parts of the system
-
Obtain requested information
-
Produce API response
-
Send HTTP response to user
-
user.info
Import Flow
-
HTTP POST request containing metadata and content
-
Enrichment of request with authentication token
-
Analyze content file (optional) and prepare content storage
-
Content storage handling
-
Write metadata to database
-
Index new object in Elasticsearch
-
Create initial audit entry
-
Create API response from metadata
-
Return metadata as HTTP response
-
dms.request.objects.upsert.storage-before
-
dms.request.objects.upsert.database-before
-
dms.response.objects, dms.response.objects.insert
Content Retrieval Flow
-
HTTP GET request to object URL
-
Enrichment of request with authentication token
-
Check for user authorization using search service query
-
Query Elasticsearch for
objectId
-
Elasticsearch metadata response (if user is authorized)
-
Repository URL of
objectId
-
Request content of
objectId
-
Query
objectId
in storage provider -
Storage provider metadata response
-
Return object metadata
-
Write
CONTENT_ACCESSED
audit entry -
Create API response from metadata
-
Return HTTP metadata response
-
dms.request.objects.contents
Metadata Retrieval Flow
-
HTTP GET request to object URL
-
Enrichment of request with authentication token
-
Request metadata
-
Query
objectId
in database -
Database metadata response
-
Return object metadata
-
Write
METADATA_ACCESSED
audit entry -
Create API response from metadata
-
Return HTTP metadata response
-
dms.response.objects
Search Flow
-
HTTP POST request with query
-
Enrichment of request with authentication token
-
Request query execution
-
Translate and send Elasticsearch query
-
Receive Elasticsearch query results
-
Return metadata object list
-
Create API response from metadata
-
Return HTTP metadata response
-
dms.request.search
-
dms.response.objects, dms.response.objects.search
Content Update Flow
-
HTTP POST request to content URL of object
-
Enrichment of the request with authentication token
-
Verify user has writing permissions on object using
search
service -
Query object in Elasticsearch
-
Return Elasticsearch query results
-
Return user authorization verification results
-
Infer analysis of new content item and commit it to storage
-
Content Storage Handling
-
Update object metadata contentstream attribute
-
Commit updated metadata to database and index
-
Index the updated metadata in Elasticsearch
-
Write
CONTENT_UPDATED
audit entry -
Return updated metadata
-
Create API response from metadata
-
Return updated metadata
-
dms.request.objects.upsert.storage-before
-
dms.request.objects.upsert.database-before
-
dms.response.objects, dms.response.objects.update
Metadata Update Flow
-
HTTP POST request to
objectId
URL -
Enrichment of request with authentication token
-
Query for
objectId
usingsearch
service to verify user authorization -
Query Elasticsearch for object
-
Elasticsearch object response (if user has permissions for update object)
-
Authorization test query response
-
Infer metadata validation and update
-
If expiration date has changed: update content storage
-
Infer metadata update
-
Write new metadata to database, write
METADATA_UPDATED
audit entry -
Index new metadata in Elasticsearch
-
Create API response from metadata
-
Return metadata HTTP response
-
dms.request.objects.upsert.storage-before
-
dms.request.objects.upsert.database-before
-
dms.response.objects, dms.response.objects.update
Deletion Flow
-
HTTP DELETE request to
objectId
URL -
Enrichment of request with authentication token
-
Query object using
search
service to verify user authorization -
Query object in Elasticsearch
-
Elasticsearch object reponse
-
Authorization verification results
-
Infer flag for deletion on object
-
Flag as deleted in database,
FLAGGED_FOR_DELETE
audit entry -
Flag as deleted in Elasticsearch via
index
service -
Delete content through
repository
service -
Infer deletion of object in database
-
Infer deletion of object in Elasticsearch
-
OBJECT_DELETED
audit entry -
Return deletion results
-
dms.request.objects.delete
-
dms.response.objects.delete
1.3. Additional Services
A wide range of optional extensions are available. They support developers in the fields of client development, tenant administration and business process management. It is also possible to install components for an SAP® connection or even an AI integration.
1.3.1. Client Development
yuuvis® Momentum client as reference implementation is the first and major example of an application build for yuuvis® Momentum. More than a mere showcase, it comes with own services, delivering reusable functionality for client applications in Angular using the developer libraries.
2. Core
The core system consists of multiple services that can be scaled to the project’s requirements. Using widely configurable and customizable processing flows, the core system provides a REST API for document lifecycle. Hereby, it is especially important to decide for synchronous or asynchronous processing for the individual use case.
The core system furthermore provides API as well as backend tools for resource management, testing and maintenance.
2.1. DMS Objects
Object instances managed in the yuuvis® Momentum document management system (short DMS objects) are structured in JSON format with a very strict convention. The DMS objects are always enclosed in a list. Thus, request and response formats are constant and independent on the handled number of DMS objects.
DMS objects are either
-
document objects (short: documents) or
-
folder objects (short: folders).
Within a document, a binary content file can be referenced and thus be assigned that DMS object.
2.1.1. Object Properties
DMS objects have the following property sections:
Section key | Description | Available in search queries |
---|---|---|
|
Available in all DMS objects. It contains
|
yes, in |
|
Available in DMS objects with a binary content file assigned to them. It is always a list with one entry containing a set of content stream properties that are pre-defined in the global schema. |
yes, in |
|
Process-related controlling information. Only available during the import of objects with a binary content file. It contains a list of rendition specifications. |
no |
|
Process-related controlling information. Only available during specific processing steps. |
no |
Example DMS Object without Binary Content File
{
"objects": [
{
"properties": {
"system:objectId": {
"value": "12345678-90ab-cdef-1234-567890ab"
},
"system:traceId": {
"value": "1234567812345678"
},
"system:objectTypeId": {
"value": "appTest:processdocument"
},
"system:lastModificationDate": {
"value": "2023-06-22T14:40:19.180Z"
},
"system:versionNumber": {
"value": 5
},
"system:baseTypeId": {
"value": "system:document"
},
"system:tenant": {
"value": "yuuvistest"
},
"system:createdBy": {
"value": "abcdef12-3456-7890-abcd-ef123456"
},
"appTest:exampleproperty": {
"value": false
},
"system:creationDate": {
"value": "2023-06-22T14:00:57.260Z"
},
"system:lastModifiedBy": {
"value": "abcdef12-3456-7890-abcd-ef123456"
}
}
}
]
}
Example DMS Object with Binary Content File
{
"objects": [{
"properties": {
"system:objectId": {
"value": "cdc7095f-a5ce-486d-92a7-6d0955d969ee"
},
"system:baseTypeId": {
"value": "system:document"
},
"system:objectTypeId": {
"value": "appEmail:email"
},
"system:createdBy": {
"value": "0d7fd0be-6a0b-4d3b-933c-25e0c4c5d794"
},
"system:creationDate": {
"value": "2018-01-26T15:21:170Z"
},
"system:lastModifiedBy": {
"value": "0d7fd0be-6a0b-4d3b-933c-25e0c4c5d794"
},
"system:lastModificationDate": {
"value": "2018-01-29T13:13:113Z"
},
"system:versionNumber": {
"value": 2
},
"system:tenant": {
"value": "tenant1"
},
"system:traceId": {
"value": "97a35859dbb4c435"
},
"appEmail:from": {
"value": "Maria Schmidt <schmidt@example.de>"
},
"appEmail:to": {
"value": ["Hans Meier <meier@example.de>"]
},
"appEmail:cc": {
"value": ["Conrad Schulze <schulze@example.de>",
"Emilia Lehmann <lehmann@example.de>"]
},
"appEmail:subject": {
"value": "Updated Bewerbungsunterlagen"
},
"table": {
"columnNames": ["iColumn1", "iColumn2", "iColumn3"],
"value": [["something", "to know", true],["more", "infos", false]]
}
},
"contentStreams": [{
"contentStreamId": "2B797243-A1F5-11EA-A814-9FABD98CE7A7",
"length": 173413,
"mimeType": "message/rfc822",
"fileName": "upload.eml",
"digest": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
"repositoryId": "repo252"
}]
}]
}
Example DMS Object with Binary Content File and Rendition
{
"objects": [{
"properties": {
"enaio:objectTypeId": {
"value": "E13C7EBF4B974B3A9FF296C01F90D0EE"
},
"sysfrom": {
"value": "Garco Meissler <garco@example.de>"
},
"systo": {
"value": "Dudreas Annkel <dudreas@example.de>"
},
"syscc": {
"value": "Kruedeas Anger <kruedeas@example.de>"
},
"syssubject": {
"value": "Wachsmalstift rückwärts kontrollieren"
},
"redline:baseTypeId": {
"value": "DOCUMENT"
},
"redline:mandant": {
"value": "default"
}
},
"contentStreams": [{
"mimeType": "message/rfc822",
"fileName": "upload.eml",
"cid": "cid_63apple"
}],
"renditions": [{
"mimeType": "text/plain",
"kind": "text",
"contentStream": {
"length": 39939,
"mimeType": "text/plain",
"fileName": "content.txt",
"cid": "rendition_0"
}
}]
}]
}
2.1.2. Binary Content Files
One of the key concepts of a document management system (DMS) is the effective handling of binary content files. On top of the basic operations like import, retrieval, update and deletion, further demands have to be considered in many companies. Each content update triggers the creation of a new version of the object whereas the previous object version is moved to the version history. Furthermore, in order to comply with legal bindings regarding the storage time, yuuvis® Momentum allows you to configure strict retention times during which the binary content files can neither be deleted nor updated. Binary content files of suitable formats can be analyzed in order to extract a text rendition that will be included in the full-text search. For many file types, also a PDF rendition can be retrieved.
General Characteristics
-
The file size for binary content files in yuuvis® Momentum is limited to 32 GB per file.
-
The core system can handle any file type as binary content file. For a wide range of file types, the generation of renditions is supported.
-
Binary content files are stored in repositories that are managed by the
repository
service and, if necessary, connected to yuuvis® Momentum via thearchive
service. -
Retention times can be specified in order to protect binary content files from deletion and modification.
-
Binary content files can be assigned only to document objects. It is not possible to assign more than one binary content file per object.
-
Document objects can be created without any binary content file assigned to them. Binary content files can be added to such already existing objects.
-
Objects with a binary content file assigned to them have the section
contentStreams
in their JSON-formatted object representation.
Content Analysis
In the default configuration, each binary content file imported to yuuvis® Momentum passes the content analyzer provided by the repository
service. Its mime type is determined and the contained text is extracted for the most common file types.
Text Extraction
The repository
service can extract the text contained in an imported binary content file. The extracted plain text is stored as text rendition in the search index and will be used for the full-text search together with all values of string properties within the metadata. Details on supported file types, calculation and storage are available in the section.
The file types for which text extraction is available are listed here: Content Renditions
The text rendition can be retrieved via the following endpoint GET /api/dms/objects/{objectId}/contents/renditions/text
Mime Type Determination
The contentanalyzer
service is responsible for the determination of the mime type of binary content files that are imported to yuuvis® Momentum. The determined mime type is stored in the content stream properties section of the corresponding DMS object.
E-mail Metadata Extraction
As of 2024 Spring, yuuvis® Momentum contains a predefined app for the extraction of basic e-mail metadata. The app triggers the contentanalyzer
service to read the following information from binary content files during their import, if they have been identified as EML or MSG e-mail file:
Property | Type | Description |
---|---|---|
|
String |
Optional. Subject of the e-mail. |
|
datetime |
Required. Date and time when the e-mail was sent. |
|
String |
Required. E-mail address of the sender. |
|
List of strings |
Optional. List of direct receivers. |
|
List of strings |
Optional. List of CC receivers. |
|
List of strings |
Optional. List of BCC receivers. |
|
String |
Optional. ID of the message. |
|
List of strings |
Optional. File names of the attachments. |
|
Int |
Optional. Number of attachments. |
The analysis is only available during import requests via POST /api/dms/objects .
|
Required configuration steps:
-
The app
systemmail
has to be activated for the corresponding tenant via app set.Example app set<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <apps xmlns="http://optimal-systems.org/ns/yuuvis/apps/"> <app> <name>systemmail</name> <state>enabled</state> </app> </apps>
-
The app schema for the
systemmail
app has to be available.App schema for 'systemmail'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <schema xmlns="http://optimal-systems.org/ns/dmscloud/schema/v5.0/"> <version>3</version> <lastModificationDate>2023-06-29T23:23:54.635Z</lastModificationDate> <propertyStringDefinition> <id>appSystemmail:subject</id> <propertyType>string</propertyType> <cardinality>single</cardinality> <required>false</required> </propertyStringDefinition> <propertyDateTimeDefinition> <id>appSystemmail:sent</id> <propertyType>datetime</propertyType> <cardinality>single</cardinality> <required>true</required> </propertyDateTimeDefinition> <propertyStringDefinition> <id>appSystemmail:from</id> <propertyType>string</propertyType> <cardinality>single</cardinality> <required>true</required> </propertyStringDefinition> <propertyStringDefinition> <id>appSystemmail:to</id> <propertyType>string</propertyType> <cardinality>multi</cardinality> <required>false</required> </propertyStringDefinition> <propertyStringDefinition> <id>appSystemmail:cc</id> <propertyType>string</propertyType> <cardinality>multi</cardinality> <required>false</required> </propertyStringDefinition> <propertyStringDefinition> <id>appSystemmail:bcc</id> <propertyType>string</propertyType> <cardinality>multi</cardinality> <required>false</required> </propertyStringDefinition> <propertyStringDefinition> <id>appSystemmail:messageId</id> <propertyType>string</propertyType> <cardinality>single</cardinality> <required>false</required> </propertyStringDefinition> <propertyStringDefinition> <id>appSystemmail:attachments</id> <propertyType>string</propertyType> <cardinality>multi</cardinality> <required>false</required> </propertyStringDefinition> <propertyIntegerDefinition> <id>appSystemmail:attachmentCount</id> <propertyType>integer</propertyType> <cardinality>single</cardinality> <required>false</required> </propertyIntegerDefinition> <typeSecondaryDefinition> <id>appSystemmail:email</id> <baseId>system:secondary</baseId> <propertyReference>appSystemmail:subject</propertyReference> <propertyReference>appSystemmail:sent</propertyReference> <propertyReference>appSystemmail:from</propertyReference> <propertyReference>appSystemmail:to</propertyReference> <propertyReference>appSystemmail:cc</propertyReference> <propertyReference>appSystemmail:bcc</propertyReference> <propertyReference>appSystemmail:messageId</propertyReference> <propertyReference>appSystemmail:attachments</propertyReference> <propertyReference>appSystemmail:attachmentCount</propertyReference> <contentStreamAllowed>required</contentStreamAllowed> </typeSecondaryDefinition> </schema>
-
The
contentanalyzer
service must not be skipped and its metadata analysis has to be activated. Check theserviceConfiguration.json
configuration file.Example 'serviceConfiguration.json' with suitable configuration{ "services": { "contentanalyzer": { "skip": false, "analyze": [ { "mimetype": true, "content": true, "metadata": true } ] } } }
Storage
The repository
service is responsible for the storage management of binary content files. For this purpose, an S3 store is the standard archive solution. Alternatively or additionally, many external archive providers are supported to be connected via the archive
Service.
Furthermore, the SHA-256 digest for the binary content files is calculated during the saving processes and stored in the content stream properties section of the corresponding DMS objects.
Large Files
The import of large binary content files via POST /api/dms/objects
might be very slow and often leads to timeouts. Thus, it is useful to split them in pieces and upload them in multiple sub-processes. The steps are described in this section. You can upload up to 10,000 pieces of one binary content file. The DMS object to which the complete content file is finally assigned is created after the successful upload of all pieces.
Before the final step of DMS object creation, the pieces of content are only stored temporarily in the repository service. To ensure that all pieces of one content file are processed by the same repository service instance, the Kubernetes Loadbalancer internally sets a serviceInstanceUrl during the upload initialization. It is stored in a shared cache for all repository service instances. For each piece to be uploaded, the correct instance is read from this cache.
|
-
Split your large binary content file into pieces.
-
Initialize the import via
POST /api/dms/uploads
and extract theuploadId
from the response body. After each processing step of the upload, a maximum time of 2 days (default configuration) inactivity is accepted before the process and all its pieces are automatically deleted.ExamplePOST /api/ms/uploads { "uploadId": "MP_a2f7e1aa-ff42-4140-b9ec-5de4cc61f1a5" }
-
Import each individual piece via
PUT /api/dms/uploads/{uploadId}/parts/{partNumber}
.-
Use a single piece of your content file as binary request body (no multipart).
-
For
uploadId
, use the value that was generated during the initialization step. Use the same value for all pieces of one binary content file. -
For
partNumber
, use the index number of the current piece starting with 1.
Example with 3 piecesPUT /api/dms/uploads/MP_a2f7e1aa-ff42-4140-b9ec-5de4cc61f1a5/parts/1 200 OK PUT /api/dms/uploads/MP_a2f7e1aa-ff42-4140-b9ec-5de4cc61f1a5/parts/2 200 OK PUT /api/dms/uploads/MP_a2f7e1aa-ff42-4140-b9ec-5de4cc61f1a5/parts/3 200 OK
-
-
Optionally, you can retrieve an overview of your running upload processes and the already imported pieces via
GET /api/dms/uploads
. -
In case you want to cancel your upload process, you can delete the already uploaded pieces via
DELETE /api/dms/uploads/{uploadId}
. -
Finalize the upload via
POST /api/dms/uploads/{uploadId}
. Optionally, you can validate the total number of imported pieces by appending thenumberOfParts
query parameter.ExamplePOST /api/dms/uploads/MP_a2f7e1aa-ff42-4140-b9ec-5de4cc61f1a5?numberOfParts=3 200 OK
After calling this endpoint, no further pieces can be added to the process indicated by the current
uploadId
. -
Connect the completed binary content file to a DMS object in yuuvis® Momentum via
POST /api/dms/uploads/{uploadId}/objects
. Specify the metadata inproperties
section of the JSON request body.The contentStreamId
automatically refers to the binary content file created by the upload process specified byuploadId
. However, thecontentanalyzer
service is SKIPPED. Thus, if you need proper values in thecontentStreams
section forfileName
andmimeType
, you need to set them in the JSON request body.Example request body for the creation of a DMS object after partial upload{ "objects": [{ "properties": { "system:objectTypeId": { "value": "system:document" }, "customproperty": { "value": "myvalue" } }, "contentStreams": [{ "mimeType": "application/pdf", "fileName": "myfilename.pdf" }] }] }
2.2. Schema for DMS Objects
Each object in yuuvis® Momentum instantiates an object type that is defined in the applied tenant schema. Once a DMS object is created, its object type is set and remains unmodifiable during its entire lifecycle.
Depending on the definition of the instantiated object type, a set of properties is available for the corresponding DMS object. The properties themselves have to be defined in a schema as well.
2.2.1. Schema Outline
A schema contains property definitions and object type definitions in XML format in the following mandatory order. It is possible to skip parts but not to change their order.
-
Label (as of 2023 Autumn)
-
Property definitions
-
Object Type definitions:
-
Document type definitions
-
Folder type definitions
-
Secondary object type definitions
-
The label
is an optional string field to specify a project-specific schema versioning information. Its string value is limited to 128 characters.
Display a simple example schema
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<schema xmlns="http://optimal-systems.org/ns/dmscloud/schema/v5.0/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://optimal-systems.org/ns/dmscloud/schema/v5.0/dmsCloud-schema.xsd">
<label>1.2.3</label>
<propertyStringDefinition>
<id>from</id>
<propertyType>string</propertyType>
<cardinality>single</cardinality>
<required>true</required>
</propertyStringDefinition>
<propertyStringDefinition>
<id>to</id>
<propertyType>string</propertyType>
<cardinality>multi</cardinality>
<required>true</required>
</propertyStringDefinition>
<propertyStringDefinition>
<id>subject</id>
<propertyType>string</propertyType>
<cardinality>single</cardinality>
<required>true</required>
<defaultValue>hello</defaultValue>
<maxLength>20</maxLength>
<minLength>4</minLength>
</propertyStringDefinition>
<propertyDateTimeDefinition>
<id>received</id>
<propertyType>datetime</propertyType>
<cardinality>single</cardinality>
<required>true</required>
</propertyDateTimeDefinition>
<typeDocumentDefinition>
<id>email</id>
<baseId>system:document</baseId>
<propertyReference>from</propertyReference>
<propertyReference>to</propertyReference>
<propertyReference>received</propertyReference>
<contentStreamAllowed>required</contentStreamAllowed>
</typeDocumentDefinition>
</schema>
2.2.2. Scopes and Endpoints for Schemata
In the multi-tenant landscape of yuuvis® Momentum, it is important to be aware of the scope of property and object type definitions.
-
Any object types or properties that should be available for all tenants should to be introduced to the global schema.
-
To prevent cluttering the global schema and allow for duplicate names, app schemata can be used. They provide a namespace for properties and object types pertaining to a particular use case. An app schema is available in all tenants where the app is enabled.
-
Each tenant can have exactly one tenant schema that allows to define properties and object types for usage only within the specific tenant.
By default, the maximum number of property definitions in a tenant schema is 20. A system integrator can change this limit via the schema.tenant.properties.limit
parameter in the configuration of thesystem
service. If you want to increase this limit, it is recommended to increase the maximum number of fields in your Elasticsearch index as well. -
For each tenant, the global schema and the tenant schema are merged with the app schemata for those apps that are enabled for the tenant. The resulting applied tenant schema is used for DMS operations like object import, update or search.
Depending on the schema scope, the schemata are managed via specific endpoints. Furthermore, their property and object type IDs have specific prefixes.
Retrieval | Validation | Update | |
---|---|---|---|
global schema |
GET |
POST |
POST |
app schema |
GET |
POST |
POST |
tenant schema of any tenant |
GET |
POST |
POST |
tenant schema of the own tenant |
GET |
POST |
POST |
2.2.3. Naming Conventions for Property and Object Type IDs
In every property definition and every object type definition the id
attribute is required. It is used to identify the object type or property. Each ID is a string with a maximum of 63 characters, and it must match the regular expression
([a-zA-Z][a-zA-Z0-9]*:)?[a-zA-Z][a-zA-Z0-9]*
.
The IDs are also used as the name of the type, e.g., in query operations. Hence, it is recommended to choose meaningful values for type IDs.
The part before the :
character is the prefix. It is useful to specify the scope of the corresponding schema. Within the schema file, all references on the same ID have to be EITHER with OR without prefix. Depending on the situation, the prefix can be omitted, for example to broaden a search query across multiple application schemata.
-
In tenant-specific (app-specific) definitions, only prefixes matching
"ten" + <tenant name>
("app" + <app name>
) are allowed. The tenant (app) name is case-insensitive when used as a path or search parameter. If no prefix is specified, the prefix is added automatically in the applied tenant schema. Thus, the same object type name can occur in multiple tenant (app) schemata. -
Some specific requirements for app names are described in the chapter on app management.
-
In the global schema all prefixes are allowed, as long as they do not start with ten or app or equal system. Alternatively, they can also have no prefix.
An exception are column names in Table Property Definitions, where prefixes are prohibited. |
As of 2021 Winter, it is possible to use the -
character as an additional separator within prefixes for tenant-specific IDs if matching the following regular expression:
([a-zA-Z][a-zA-Z0-9-]*:)?[a-zA-Z][a-zA-Z0-9]*
2.2.4. Property Definitions
General Property Attributes
All property definitions have the following attributes:
Attribute | Type | Required | Description | ||
---|---|---|---|---|---|
|
String |
yes |
The ID of the property matching the regular expression. It uniquely identifies the property within in the schema file. |
||
|
URI |
no |
By using namespaces, it is possible to form groups of properties and object types. |
||
|
String |
no |
Describes the property. |
||
|
Enum |
yes |
Specifies the type of this property. The following types are supported:
|
||
|
Enum |
yes |
Defines whether the property can have a maximum of one or an arbitrary number of values. Possible values are |
||
|
Boolean |
yes |
If This attribute can be overwritten in the property references of object type definitions. Hence, the same property can be required in one object type and not required in another object type. Following the concept of secondary object types, the same property can be allowed by multiple ways in an object instance, e.g. if the object type has a reference to the property type and the object has one or more secondary object types, that have references to the property type. If these references have different required values, the value true always dominates over false. Check out the tutorial "Overwriting the 'required' Property Attribute" for further examples. |
||
|
Boolean |
no |
Specifies whether or not the property may appear in the |
||
|
String |
no |
Declares the classifications this property belongs to. There is no validation or use in the system itself. For example, string properties can be classified as email or url and a client application can use this classification to present the property’s content in an appropriate manner. This attribute can be used several times and the corresponding values are delivered in an array.
|
||
|
depending on the |
no |
The value that the system sets for the property if no value is provided during object creation. If the cardinality is multi, there can be more than one default value and a list of all default values is provided. Default values can be also applied by update. Assume a secondary object type has property types with default values. If you add this secondary object type to an existing object by update, these default values are applied, if the update does npt set values for these properties and the properties were not allowed in the object before the update. |
Depending on the property type, a property can have specific attributes.
Attributes for Integer Property Definitions
Attribute | Type | Required | Description | Technical Limit used as Default |
---|---|---|---|---|
|
Integer |
no |
The maximum value allowed for this property. |
9223372036854775807 |
|
Integer |
no |
The minimum value allowed for this property. |
-9223372036854775808 |
Attributes for DateTime Property Definitions
Attribute | Type | Required | Description |
---|---|---|---|
|
Enum |
no |
The only supported value is date. If the resolution is set to date, the property can only store values without a time part and these values have the format |
Attributes for Decimal Property Definitions
Decimal properties support values of 64-bit precision (IEEE 754). The values have to be specified in decimal notation. However in the table below, the technical limits are provided in base 2 scientific notation in order to display the values in a condensed and comfortable format. This format cannot be used to specify the value for a maxValue
or minValue
attribute in a decimal property definition.
Attribute | Type | Required | Description | Technical Limit used as Default |
---|---|---|---|---|
|
Decimal |
no |
The maximum value allowed for this property |
(2-2 -52 )·2 1023 |
|
Decimal |
no |
The minimum value allowed for this property. |
-(2-2 -52)·2 1023 |
Please note the additional limit of precision: values of magnitude smaller than 2-1074 will be rounded to 0. |
Attributes for String Property Definitions
Attribute | Type | Required | Description |
---|---|---|---|
|
Integer |
no |
The maximum length (in characters) allowed for a value of this property. |
|
Integer |
no |
The minimum length (in characters) allowed for a value of this property. |
|
Boolean |
no |
If If |
In general, the length of a string is limited to 8192. Hence, the maximum value for maxLength
and minLength
is 8192.
Attributes for Table Property Definitions
A table property definition contains some attributes and one or more sub-property definitions, the columns.
The number of rows and columns of a table property definition is limited to a maximum of 512 columns and 1024 rows.
Particularities for table property attributes:
Attribute | Type | Required | Description | ||
---|---|---|---|---|---|
|
Enum |
yes |
Defines whether the property can have a maximum of one or an arbitrary number of values. For a table property, only |
||
|
Boolean |
no |
Specifies whether (
|
Particularities for column attributes:
Attribute | Type | Required | Description |
---|---|---|---|
|
String |
yes |
The column names must not contain a prefix. They have to follow the convention |
|
Enum |
yes |
Defines whether the property can have a maximum of one or an arbitrary number of values. For a column definition, both enums |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<propertyTableDefinition>
<id>aTableProperty</id>
<propertyType>table</propertyType>
<cardinality>single</cardinality>
<required>false</required>
<propertyStringDefinition>
<id>col0</id>
<propertyType>string</propertyType>
<cardinality>single</cardinality>
<required>false</required>
</propertyStringDefinition>
<propertyIntegerDefinition>
<id>col1</id>
<propertyType>integer</propertyType>
<cardinality>single</cardinality>
<required>false</required>
</propertyIntegerDefinition>
<propertyDateTimeDefinition>
<id>col2</id>
<propertyType>datetime</propertyType>
<cardinality>single</cardinality>
<required>false</required>
</propertyDateTimeDefinition>
<propertyDecimalDefinition>
<id>col3</id>
<propertyType>decimal</propertyType>
<cardinality>single</cardinality>
<required>false</required>
</propertyDecimalDefinition>
</propertyTableDefinition>
Structured Data Property Definitions
As of version 2021 Summer, yuuvis® Momentum offers a property type for the storage of structured data in JSON format. Thus, it is possible to store interleaved data structures in a queryable way without defining each single sub-property in the schema.
The structured data properties should NOT be considered to replace the concept of a well-defined schema. They should be used only if the handling of objects' metadata via the conventional property definitions is not reasonable. |
Particularities for structured data property attributes:
Attribute | Type | Required | Description |
---|---|---|---|
|
Enum |
yes |
Defines whether the property can have a maximum of one or an arbitrary number of values. For a structured data property definition, only |
Pre-defined limitations (cannot be overwritten by property attributes):
-
The value for a structured data property has to be a valid JSON structure. It is not allowed to pass a single string, boolean or other variable format.
Display valid and invalid example values.
Valid example value"appTable:customerdetails": { "value": { "id": 2982, "uid": "711e1858-eb24-4183-8743-0292c7b9b93b" } }
Invalid example value 1 - NOT allowed"appTable:customerdetails": { "value": "{\"id\":2982,\"uid\":\"711e1858-eb24-4183-8743-0292c7b9b93b\"}" }
Invalid example value 2 - NOT allowed"appTable:customerdetails": { "value": true }
-
The maximum value for the total number of sub-properties within one JSON value is 500.
-
The maximum depth for JSON structure is 16.
-
The keys have to be strings not longer than 32 characters.
-
As of 2024 Spring: The keys have to follow the convention
[a-zA-Z][a-zA-Z0-9]*
(similar to property type IDs but without prefix).Up to 2023 Winter: The keys have to follow the convention
[a-z][a-z0-9]*
. -
Empty maps are not allowed in any position of the JSON and are replaced by
null
.
1
2
3
4
5
6
<propertyStructuredDataDefinition>
<id>customerdetails</id>
<propertyType>structureddata</propertyType>
<cardinality>single</cardinality>
<required>false</required>
</propertyStructuredDataDefinition>
2.2.5. Object Type Definitions
Each object type definition belongs to one of the following base types.
base type | value for baseId attribute |
instantiable |
---|---|---|
document type |
|
yes |
folder type |
|
yes |
secondary object type (SOT) |
|
no |
General Object Type Attributes
All object type definitions have the following attributes:
Attribute | Type | Required | Description |
---|---|---|---|
|
|
yes |
The ID of the object type. It uniquely identifies the object type in the schema. |
|
URI |
no |
By using namespaces, it is possible to form groups of properties and object types. |
|
String |
no |
Describes the object type definition. |
|
Enum |
yes |
Specifies the base type of this object type. The following values are supported:
|
|
String |
no |
Reference by ID to a property. An object type definition can have an arbitrary number of property references. A tenant-specific object type can have references to both tenant-specific and global properties. |
Attributes for Document Type Definitions
Document type definitions have the following specific attributes:
Attribute | Type | Required | Description | ||
---|---|---|---|---|---|
|
Enum |
yes |
Specifies whether objects of this type must, must not, or may have content. Possible values are:
|
||
|
String |
no |
References the ID of a defined secondary object type. Can be specified multiple times to reference multiple SOTs. Additionally, it is possible to specify |
2.2.6. Attributes for Folder Type Definitions
Folder type definitions have the following specific attributes:
Attribute | Type | Required | Description |
---|---|---|---|
|
String |
no |
References the ID of a defined secondary object type. Can be specified multiple times to reference multiple SOTs. Additionally, it is possible to specify |
2.2.7. Secondary Object Type Definitions
A secondary object type (SOT) is abstract and cannot be instantiated. Instead, it can be referenced in document and folder object type definitions via their secondaryObjectTypeId
attribute.
There are two ways for SOTs to be referenced by an object in the schema definition: as static SOT or as floating SOT.
- Static SOT
-
<secondaryObjectTypeId static="true">INV</secondaryObjectTypeId>
If DMS objects are instantiated from an object type with such reference, the SOT will be assigned to them during their entire lifecycle.
- Floating SOT
-
<secondaryObjectTypeId static="false">INV</secondaryObjectTypeId>
If DMS objects are instantiated from an object type with such reference, the SOT is only assigned after explicit activation in the metadata. This allows for flexible typecasting.
Ones assigned to a DMS object, all properties collected in the SOT are available for that DMS object.
If an SOT contains a required property, it will be required for each DMS object with that SOT assigned to itself.
|
Secondary object type definitions have the following specific attributes:
Attribute | Type | Required | Description | ||
---|---|---|---|---|---|
|
Enum |
no |
Can substantiate the
For a finally instantiated DMS object, content will be
If |
Conflict situation leading to invalid documents
Any combination of at least once
|
Example schema containing SOTs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<schema xmlns="http://optimal-systems.org/ns/dmscloud/schema/v5.0/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://optimal-systems.org/ns/dmscloud/schema/v5.0/dmsCloud-schema.xsd">
<propertyStringDefinition>
<id>appSot:dateOfReceipt</id>
<propertyType>date</propertyType>
<cardinality>single</cardinality>
<required>true</required>
</propertyStringDefinition>
<propertyStringDefinition>
<id>appSot:comment</id>
<propertyType>date</propertyType>
<cardinality>single</cardinality>
<required>true</required>
</propertyStringDefinition>
<propertyStringDefinition>
<id>appSot:invoiceNo</id>
<propertyType>string</propertyType>
<cardinality>single</cardinality>
<required>true</required>
</propertyStringDefinition>
<propertyStringDefinition>
<id>appSot:paymentTerm</id>
<propertyType>string</propertyType>
<cardinality>single</cardinality>
<required>true</required>
</propertyStringDefinition>
<typeDocumentDefinition>
<id>appSot:document</id>
<baseId>system:document</baseId>
<propertyReference>appSot:dateOfReceipt</propertyReference>
<contentStreamAllowed>required</contentStreamAllowed>
<secondaryObjectTypeId>appSot:basicInfo</secondaryObjectTypeId>
</typeDocumentDefinition>
<typeSecondaryDefinition>
<id>appSot:basicInfo</id>
<baseId>system:secondary</baseId>
<propertyReference>appSot:comment</propertyReference>
</typeSecondaryDefinition>
<typeSecondaryDefinition>
<id>appSot:invoice</id>
<baseId>system:secondary</baseId>
<propertyReference>appSot:invoiceNo</propertyReference>
<propertyReference>appSot:paymentTerm</propertyReference>
</typeSecondaryDefinition>
</schema>
Consider the example schema above. If a document of the type appSot:document
is created, it may have values for the properties appSot:dateOfReceipt
and appSot:comment
.
For the appSot:dateOfReceipt
property, this is obvious, because there is a direct reference in the document type definition of appSot:document
.
The appSot:comment
property is not directly referenced but the definition of appSot:document
has a reference to the SOT appSot:basicInfo
which references the appSot:comment
property. Thus, both properties are available for creating documents.
Furthermore, a document of the type appSot:document
not only may have a value for appSot:comment
, it must have a value, because it is a required
property. It makes no difference, whether a document type references the property definitions directly or indirectly via a SOT reference.
2.2.8. Validation
It is not possible to post an invalid schema via yuuvis® Momentum API. A new schema is always validated before it is introduced into the system. Additionally, specific validation endpoints are available to check the new schema before sending an update request.
The response of schema validation (or update) endpoints are always structured as shown in the following example.
{
"validationErrors": [],
"changes": [{
"type": 1000,
"message": "Document type was removed.",
"id": "appEmail:obsoleteType",
"affectedObjects": {
"tenant1": 10,
"tenant2": 4
}
}, {
"type": 1200,
"message": "A property reference was removed from a document type.",
"id": "appEmail:email",
"reference": "appEmail:bcc",
"affectedObjects": {
"tenant1": 1,
"tenant2": 3
}
}
]
}
Failed Validation
If the schema is invalid, the corresponding validation errors are listed in validationErrors
Passed Validation
If the schema is valid, the validationErrors
list is empty. The schema can be (is) updated.
However, the new schema might define different structures for DMS objects that are not matched by previously imported objects. Thus, affected objects are invalidated as soon as the new schema is introduced into the system. Invalidated objects are still stored in the system, but their availability and behavior deviates from expectation as described in the following table and below.
The changes list in the validation request contains all detected differences between the new schema and the previously used schema that could lead to invalidation of existing DMS objects. The following table documents the detectable types of schema changes and their individual values/meanings of the sub-parameters for each element in the changes
list:
-
type
-
message
-
id
-
reference
-
if the validation (or update) endpoint is called with the query parameter
verbose=true
:affectedObjects
A non-empty changes list in the validation request does NOT prevent a schema update. |
type |
message |
id |
reference |
Description and Impact of Schema Update |
---|---|---|---|---|
1000 |
Document type was removed. |
ID of the removed document type |
- |
As it is not possible to replace the object type of existing objects, it is not possible to adjust affected objects. They cannot be updated anymore. |
1001 |
Folder type was removed. |
ID of the removed folder type |
- |
See impacts of change type 1000. |
1100 |
A secondary object type reference was removed from a document type. |
ID of the document type |
ID of the secondary object type |
If the corresponding SOT includes required properties, see the impacts of change type 1200. |
1101 |
A secondary object type reference was removed from a folder type. |
ID of the folder type |
ID of the secondary object type |
If the corresponding SOT includes required properties, see the impacts of change type 1200. |
1110 |
A document type got a new static secondary object type reference. |
ID of the document type |
ID of the secondary object type |
A static secondary object type reference was added to a document type definition. Or an existing non-static secondary object type reference on a document type definition became static. If the corresponding SOT includes required properties, see the impacts of change type 1300. |
1111 |
A folder type got a new static secondary object type reference. |
ID of the folder type |
ID of the secondary object type |
A static secondary object type reference was added to a folder type definition. Or an existing non-static secondary object type reference on a folder type definition became static. If the corresponding SOT includes required properties, see the impacts of change type 1300. |
1200 |
A property reference was removed from a document type. |
ID of the document type |
ID of the property |
Any metadata retrieval of affected objects excludes the removed property. Search result lists, e.g., are affected as well. However, the existing values remain in the database and the search index. Thus, in case of a removed string property, the existing values are still considered for full-text search. The corresponding values are removed automatically during the next PATCH or POST update on the affected objects. |
1201 |
A property reference was removed from a folder type. |
ID of the folder type |
ID of the property |
See impacts of change type 1200. |
1210 |
A property reference was removed from a secondary object type. |
ID of the secondary object type |
ID of the property |
See impacts of change type 1200. |
1300 |
A non-required property type became required. |
ID of the property |
- |
POST metadata updates on affected objects are only allowed if the new required property is properly added. |
1310 |
A required property reference was added to a document type, or a non-required property reference became required. |
ID of the document type |
ID of the property |
See impacts of change type 1300. |
1311 |
A required property reference was added to a folder type, or a non-required property reference became required. |
ID of the folder type |
ID of the property |
See impacts of change type 1300. |
1320 |
A required property reference was added to a secondary object type, or a non-required property reference became required. |
ID of the secondary object type |
ID of the property |
See impacts of change type 1300. |
2000 |
Content stream becomes required on a document type. |
ID of the document type |
- |
Updates on affected objects are only allowed if a binary content file is thereby added. |
2001 |
Content stream becomes not allowed on a document type. |
ID of the document type |
- |
Updates on affected objects are only allowed if a binary content file is thereby deleted. Thus, affected objects with a binary content file under retention cannot be updated via yuuvis® Momentum at all. |
2010 |
Content stream becomes required on a secondary object type. |
ID of the secondary object type |
- |
See impacts of change type 2000. |
2011 |
Content stream becomes not allowed on a secondary object type. |
ID of the secondary object type |
- |
See impacts of change type 2001. |
3000 |
The cardinality of a property becomes 'single'. |
ID of the property |
- |
Updates on affected objects are only allowed if the value of the modified property is properly replaced. Especially, pure tag and content operations are only allowed after a proper update of the metadata. |
Following schema changes are NOT detected during the validation, but can affect existing objects as well:
-
The type of a property definition changed. → See impacts of change type 3000.
-
The range of a property definition changed. → See impacts of change type 3000.
-
A default value was added to a property definition or reference. → The new default value is only used for the creation of new objects.
-
In a table property definition, the value for the queryable attribute was changed. → Affected objects can be adjusted via
commander
service. -
The base type of an object type changed from
system:folder
tosystem:document
with content stream required. → See impacts of change type 2000. -
The base type of an object type changed from
system:document
tosystem:folder
. → See impacts of change type 2001. -
The base type of an object type changed from
system:document
orsystem:folder
tosystem:secondary
. → See impacts of change type 1000.
2.2.9. Pre-defined System Schema
Some properties and object types are pre-defined for the entire system. Their definitions cannot be overwritten via yuuvis® Momentum API. However, their definitions are included in each retrieval of an applied tenant schema.
General System Properties
The following system properties are globally pre-defined and assigned to each DMS object. Some system properties are set by the system and some system properties can be set by the user.
Property | Type | Description | Set by |
---|---|---|---|
|
string |
Identifies the object in the database. |
system |
|
string |
identifies the base type of the object type specified in |
system |
|
string |
Required during an import and cannot be changed lateron. Identifies the object type the object instantiates. Secondary object types are not allowed. |
user |
|
JSON list of strings |
Contains the |
user |
|
string |
User ID of the user that has initially created the object. |
system |
|
string |
Date of the object’s creation in format |
system |
|
string |
User ID of the user that sent the last successful POST request on the object. |
system |
|
string |
Date of the last successful POST request on the object as a string in format |
system |
|
string |
During an import or update operation, the object can be assigned to an existing folder by referencing its |
user |
|
string |
Identifies the folder object type of the parent folder that is specified by |
system |
|
integer |
Integer object version number. Corresponds to the number of POST requests on the object starting with the initial creation. |
system |
|
string |
Identifies the tenant the object belongs to. |
system |
|
Hexadecimal lowercase string with maximum length 16 |
The trace ID of the import operation or last update operation. Unique process number of any operation. If not specified in the request, a random string value will be set. If the specified trace ID has less than 16 characters, the string is extended by adding |
user or system |
|
JSON table of strings and integers |
Contains the properties of the tags assigned to the object. |
user |
|
string |
Only available for documents. Secondary object type The binary content of the object cannot be changed or deleted before this date, but metadata updates are allowed. In an update request, the |
user |
|
string |
Only available for documents. Secondary object type This date defines the start of the retention time. It has to be earlier in time than the |
user |
|
string |
Only available for documents. Secondary object type If |
user |
Content Stream Properties
The following content stream properties are grouped in the contentStreams
section within DMS objects. These system properties are available for document objects containing binary content. Thus, their contentStreamAllowed
attribute has to be required
or allowed
. The properties in contentStreams
contain all information necessary to be able to handle binary content. Depending on the type of operation, different properties are required for import/update requests or are displayed in a response.
Property | Type | Description | In an Import/Update Request | In a Response |
---|---|---|---|---|
|
String |
Points to existing content within a repository. |
Required only for pointing to existing content during an import. If not specified, the system generates a UID. |
displayed |
|
Integer |
Length of the binary content, determined by the system. |
- |
displayed (if system could determine the value) |
|
String |
Mime type of the content file.
The If |
Scenario A: The In an import request, the automatically determined mimeType can be overwritten by specifying a value in the import JSON. Scenario B: In an import request via POST In a content update via POST |
displayed |
|
String |
Name of the content file. |
If In a content update via POST In an import request via POST |
displayed |
|
String |
SHA-256, automatically determined by `repository`service based on the binary content. Can be used to detect changes in the binary content. |
- |
displayed |
|
String |
ID of the repository that will be used for storage of the binary data. |
Required only for pointing to existing content during an import. If not specified, the default repository defined in the repository service configuration will be set. |
displayed |
|
String |
Path structure for the content file within the binary storage. |
Required only for pointing to existing content during an import if reconstruction is not possible with metadata information (e.g,, if a |
displayed if it was set
|
|
String |
Applies to compound documents only. Defines a certain segment of compound documents that should be provided for content retrievals. |
Optional in the import request body and only available for compound documents. |
displayed only if it was set |
|
String |
Assigns the corresponding multipart content. |
Required in the import request body. Not needed later on and therefore not stored in the system. |
- |
Document Object Type 'system:document'
This object type has automatically floating references on all SOTs that are available in the applied tenant schema. It is intended to simplify typecasting of document objects.
Secondary Object Type 'system:rmDestructionRetention'
This SOT allows to specify a retention for an individual DMS object.
2.3. Search Query Language
The query language based on CMIS serves to standardize DMS requests to the yuuvis® API system.
The CMIS query language consists of a subset of the SQL-92 grammar, augmented by a syntax for requesting full text. Thus, the CMIS query language provides a relational view of the data. The virtual tables requested in the FROM clause correspond to DMS object types and the virtual columns requested in the SELECT correspond to the CMIS properties (metadata fields).
2.3.1. Query Language Definition
A query is structured as follows
Position | Keyword | Value | Description |
---|---|---|---|
1 |
|
virtual column list |
property list (metadata fields) |
2 |
|
virtual table names |
object type list |
3 |
|
conditions |
limitations |
4 |
|
sorting specification |
sorting criteria |
-
use
*
as virtual column list to query all metadata fields -
it is possible to use the
SCORE()
function in the virtual columns list -
if
ORDER BY
is not specified, the result list is ordered by thesystem:creationDate
object property -
currently, only the query of a single object type is supported.
The default search on metadata fields is case-sensitive. A case-insensitive search is possible via the CASE_INSENSITIVE() function (as of 2024 Spring) or by means of a CONTAINS statement.
|
2.3.2. Simple 'SELECT' Queries
Queries on Object Types
-- Select all objects of type 'email'.
SELECT * FROM email;
-- Select the customer number and the date of all invoices.
SELECT custno,date FROM invoice;
Queries on Secondary Object Types (as of 2019 Winter)
The search result delivers the entire object and not only the properties of the specified secondary object type.
-- Select all objects of secondary object type system:rmDestructionRetention
SELECT * FROM system:rmDestructionRetention;
2.3.3. Queries with Aliases
Properties can be queried with an alias name. The values of these properties are returned in the result with the alias name. The alias can be specified by a space separated behind the property name or with the keyword AS
between property name and alias name.
-- Alias without keyword: Select the customer number with alias c and the date with alias d of all invoices.
SELECT custno c,date d FROM invoice;
-- Alias with keyword: Select the customer number with alias c and the date with alias d of all invoices.
SELECT custno AS c,date AS d FROM invoice;
2.3.4. Highlighting in Full-text Previews
The HIGHLIGHT()
function can be used within the SELECT
statement. Pass a string argument as shown in the example below. For this string, a full-text query is started. In the result list, all objects have an additional highlight
section that is a list of excerpts from the corresponding object’s text rendition containing the query term. The individual excerpt items are sorted by SCORE()
. Within the plain text of each excerpt, the found query term is highlighted by a surrounding <em></em>
.
Highlighting on large full-texts has high time and memory costs. Thus, the search engine limits the length of full-text for highlighting to 1.000.000 characters. Hits of the query term that may occur in the remaining part of the full-text are found but not represented in the highlight section of the search result.
|
-- Search objects containing 'exiting' in their full-text rendition.
-- Display the object ID and full-text excerpts with highlighted search term.
SELECT system:objectId, HIGHLIGHT('exciting') FROM system:object;
{
"objects": [
{
"properties": {
"system:objectId": {
"value": "2be7b709-745a-4c0c-809e-512f9850876b"
}
},
"highlight": [
"this could also be an <em>exciting</em> custom content",
"what else could be as <em>exciting</em> as this feature"
]
}
],
"numItems": 1,
"hasMoreItems": true,
"totalNumItems": 662763
}
Options for Highlighting
To execute the query, the SQL statement is embedded in a JSON structure as described later. For the HIGHLIGHT()
function, the options
section can be used to configure the following highlight
parameters. If not explicitly specified in each request JSON, the default values are used.
Parameter | Type | Description | Default value |
---|---|---|---|
|
string |
Type of highlighter |
|
|
int |
Length of a single full-text excerpt |
45 |
|
int |
Maximum number of full-text matches to be represented for each object |
30 |
|
string |
Fragmenter to be used. |
|
|
string |
Indication for start of query term highlighting. |
|
|
string |
Indication for end of query term highlighting. |
|
{
"query" : {
"statement" : "SELECT system:objectId, HIGHLIGHT('exciting') FROM system:object",
"skipCount" : 0,
"maxItems" : 1,
"handleDeletedDocuments" : "DELETED_DOCUMENTS_EXCLUDE",
"options": {
"highlight": {
"type": "plain",
"fragment_size": 45,
"number_of_fragments": 30,
"fragmenter": "span",
"pre_tag": "<em>" ,
"post_tag": "</em>"
}
}
}
}
2.3.5. Queries with Conditions
In the WHERE
clause, conditions can be formulated and combined with logical operators.
The following operators are supported:
-
comparison operators:
<
,>
,<=
,>=
,<>
,=
-
join operators:
AND
,OR
,NOT
-
additional predicates:
LIKE
,IN
,NULL
,CONTAINS
-
In the default configuration, the number of
AND
andOR
operators per condition is limited to 20.
Examples
-- Select all invoices in which the invoice amount is greater than 100.
SELECT * FROM invoice WHERE amount>100;
-- Select all invoices in which the invoice amount is greater than 100 and the supplier is 'ACME'.
SELECT * FROM invoice WHERE amount>100 AND supplier='ACME';
-- Select all invoices in which the invoice amount is greater than 100 or less than 10 and the supplier is either 'ACME', 'OS' or 'ICH'.
SELECT * FROM invoice WHERE (amount>100 OR amount<10) AND supplier IN ('ACME','OS','ICH');
Wildcard Example
Wildcard characters are used with the LIKE
operator. There are two wildcards used in conjunction with the LIKE
operator:
-
%
– The percent sign represents zero, one, or multiple characters -
_
– The underscore represents a single character
-- Select all invoices in which the supplier starts with 'ACM' and the index data field 'amount' is not NULL
SELECT * FROM invoice WHERE supplier LIKE 'ACM%' AND amount IS NOT NULL;
The LIKE expressions are limited by their number of included wildcards. Thus, a maximum number of 10 % and _ characters are allowed in one LIKE expression. The limit compliance is verified in the validation.
|
Case-(in)sensitive Metadata Search
As of 2024 Spring.
The CASE_SENSITIVE()
and CASE_INSENSITIVE()
functions are available for conditions on string metadata values. The combination with the =
, LIKE
or IN
operators is possible as shown in the following examples.
-- Select all invoices in which the supplier is 'GE'.
SELECT * FROM invoice WHERE supplier IS 'GE';
SELECT * FROM invoice WHERE supplier IS CASE_SENSITIVE('GE');
-- Select all invoices in which the supplier is 'ge', 'Ge', 'gE' or 'GE'.
SELECT * FROM invoice WHERE supplier IS CASE_INSENSITIVE('GE');
-- Select all invoices in which the supplier starts with 'ge', 'Ge', 'gE' or 'GE'.
SELECT * FROM invoice WHERE supplier LIKE CASE_INSENSITIVE('GE%');
-- Select all invoices in which the supplier is 'ge', 'Ge', 'gE', 'GE' or 'OS'.
SELECT * FROM invoice WHERE supplier IN (CASE_INSENSITIVE('ge'), 'OS');
The default behavior of the metadata search is case-sensitive. This default can be overwritten for an entire query request via the case_sensitivity
option in the JSON format. Thus, the example request below searches for all invoices in which the supplier is ge
, Ge
, gE
or GE
without the usage CASE_INSENSITIVE()
function in the SQL statement.
{
"query" : {
"statement" : "SELECT * FROM invoice WHERE supplier IS 'GE'",
"skipCount" : 0,
"maxItems" : 50,
"options": {
"case_sensitivity": "case_insensitive"
}
}
}
Priorities for overwriting case sensitivity
|
Full-Text Search with 'CONTAINS'
Basics for 'CONTAINS'
To perform full-text search, use CONTAINS
in the WHERE
clause. The string values specified in the CONTAINS
statements are handled without regards to case sensitivity. Their length might be limited by your search engine.
For the result list of a full-text search, it might be useful to sort it by SCORE()
. The best matching results will be presented on top of the result list. If ORDER BY
is not specified, the result list is ordered by the system:creationDate
object property by default.
Please also note that your search engine might need a suitable plug-in and corresponding configuration for optimal search behavior in your language. If you changed the configuration of your search engine, all objects that are imported afterwards will be indexed as defined by the new configuration. All objects that are already in the system remain unchanged and can be searched as before the configuration update. If you need all objects indexed which refer to the new configuration, you need a reindexing via your search engine.
If a field name is specified, only this field is checked for the search term.
-- Select all types in which the term 'QUERY' was found in field 'name'.
SELECT * FROM type WHERE name CONTAINS('QUERY');
If no field name is specified, a full-text search will be performed. This search includes:
-
Each string value within the
properties
metadata section that matches the following conditions:-
It belongs to a defined property, for which the attribute
fulltextIndexed
is NOT set tofalse
AND that has nosystem:
prefix. -
The property must be a string property, a string column of a table property or a structured data property.
-
-
The string values for tag names.
-
The string value for
system:contentStreamFileName
within thecontentstreams
properties. -
If available, each text rendition that was estimated by the
contentanalyzer
service or set manually.
-- Select all types in which in full-text 'QUERY' was found.
SELECT * FROM type WHERE CONTAINS('QUERY');
-- Use 'SCORE()' for the order of the result list instead of the default order by 'system:creationDate'.
SELECT *,SCORE() s FROM type WHERE CONTAINS('QUERY') ORDER BY s ASC;
As of 2023 Winter, it is possible to separately search the text renditions or the mentioned string values within the metadata.
-
Use
system:content
instead of a property name to search only the text renditions.ExampleSELECT * FROM system:document WHERE system:content CONTAINS('search me within the text renditions only')
-
Use
system:metadata
instead of a property name to search only the above described string metadata values.ExampleSELECT * FROM system:document WHERE system:metadata CONTAINS('search me within the string metadata only')
Logical Operators
The following logical operators are supported:
Operator | Description | Syntax | ||
---|---|---|---|---|
+ |
The full-text must contain the term behind the operator. There is no blank space between operator and term. |
+<term> |
||
- |
The full-text must not contain the term behind the operator. There is no blank space between operator and term. |
-<term> |
||
AND |
The full-text must contain both terms connected with the operator. The operator is only identified in capital letters and separated by exactly one blank space from the two terms it is connecting.
|
<term1> AND <term2> |
||
OR |
The full-text must contain at least one of the two terms connected with the operator. The operator is only identified in capital letters and separated by exactly one blank space from the two terms it is connecting.
|
<term1> OR <term2> |
The examples will clarify the use of the individual operators.
- + Operator
-
If the + operator is applied to a term, only objects containing this term in their full-text will match the query. If further terms are specified without an additional + (or -) operator, they are allowed in the full-text but not required. Thus, they influence the ranking (higher score) of the found objects only. They do not have an impact on the number of found objects in the result itself.
-- Select all documents in which 'tree' was found. SELECT * FROM type where CONTAINS('apple +tree')
- - Operator
-
If the - operator is applied to a term, only objects not containing this term in their full-text will match the query. If further terms are specified without an additional - (or +) operator, they are allowed in the full-text but not required. Thus, they influence the ranking (higher score) of the found objects only. They do not have an impact on the number of found objects in the result itself.
-- Select all objects in which 'tree' was found. SELECT * FROM type where CONTAINS('apple -tree') -- Select all objects containing 'tree' and not containing 'pie' in their full-text. The optional words 'apple' and 'exceptional' influences the scoring only. SELECT * FROM type where CONTAINS('exceptional apple +tree -pie')
- OR Operator
-
All objects containing at least one of the connected terms in their full-text are matching the query. A space between several search term combinations is interpreted as logical OR operator (as long as no include or exclude search term condition is used).
-- Select all objects containing at least one of the words 'apple' or 'tree'. SELECT * FROM type where CONTAINS('apple tree') -- The query is equivalent to the previous one without 'OR' operator. SELECT * FROM type where CONTAINS('apple OR tree') Some more examples: -- Select all invoices in which in full-text either 'reminder', 'discount' or 'delay' was found. SELECT * FROM invoice WHERE CONTAINS('reminder discount delay'); -- Select all invoices which the invoice amount is greater than 1000 and in fulltext either 'reminder', 'discount' or 'delay' was found. SELECT * FROM invoice WHERE amount>1000 AND CONTAINS('reminder discount delay');
- AND Operator
-
All objects containing both terms connected with the AND operator in their full-text will match the query. However, we recommend to avoid the operator and apply the + operator to each individual term that should be contained in the object’s full-text.
-- Select all objects containing both words 'apple' and 'tree'. SELECT * FROM type where CONTAINS('apple AND tree') -- The query is equivalent to the previous one and recommended. SELECT * FROM type where CONTAINS('+apple +tree') -- The query is equivalent to the previous one and not recommended. SELECT * FROM type where CONTAINS('+apple AND +tree')
- Combination of Operators with Brackets
-
As of version 2022 Winter, it is possible to use round brackets within a CONTAINS statement in order to specify the evaluation order of operators.
-- Select all objects containing both words 'apple' and 'tree' or both words 'baking' and 'cakes'. SELECT * FROM type where CONTAINS('((apple AND tree) OR (baking AND cakes))')
Phrases
To search for a string consisting of several words in the exact same order (e.g., a sentence), use double quotation marks within the CONTAINS statement. Blank spaces are not interpreted as OR operator within these quotation marks.
-- Select all objects in which the phrase 'exceptional apple tree pie' was found.
SELECT * FROM type where CONTAINS('"exceptional apple tree pie"')
-- Select all invoices in which the amount is greater than 1000 and in full-text the sentence 'color picture 20x30' was found.
SELECT * FROM invoice WHERE amount>1000 AND CONTAINS('"color picture 20x30"');
Phrases are interpreted as terms. Thus, logical operators are applied to the entire phrase.
-- Select all documents in which 'exceptional pie' was found and 'apple tree' was not found.
SELECT * FROM type where CONTAINS('+"exceptional pie" -"apple tree"')
Boosting
Boosting can be applied to the list of matches of full-text search queries. The boost operator ^ influences the relevance of individual terms within a CONTAINS statement. Thus, the sorting of the objects in the hit list is directly influenced.
The relevance of individual terms is specified via a boosting factor. The larger the boosting factor, the higher the relevance of the corresponding term. Here, the ratio between the individual boosting factors is considered and not the absolute values.
To set the boosting factor, append the ^ operator and a decimal value without blank spaces to the corresponding term. A term without a specified boosting factor will get the default boosting factor 1.
-- Select all documents containing 'tree'. Prefer objects containing 'apple', 'pear' or 'chestnut'.
-- Prioritize 'pear' 4 times and 'chestnut' twice over 'apple'.
SELECT * FROM type where CONTAINS('apple pear^4 chestnut^2 +tree')
It is possible to reduce the relevance by applying a boosting value between 0 and 1.
-- Select all documents containing 'pie' and not 'tree'. Prefer objects containing 'apple' and especially 'pear'.
-- Avoid objects containing 'chestnut'.
SELECT * FROM type where CONTAINS('apple pear^2 chestnut^0.2 -tree +pie')
Fuzzy Search
In full-text search queries, partially matching objects can be provided as results. Thus, it is possible to search for similar terms or variant spellings.
The number of characters not matching the search term is called "edit distance". For each search term, a maximum edit distance can be defined that limits the number of unmatching characters.
Append the operator ~ followed by the integer maximum edit distance to a word within the CONTAINS statement. The values 0, 1 and 2 (default) are allowed for the edit distance. If the ~ operator is set without an edit distance, the default value 2 will be used. Since missing, redundant or reversed letters can be handled with edit distance 1, this value should be sufficient in most cases.
-- Select all objects containing words with maximum edit distance 1 to 'exceptionel' or 2 to 'cestnutt'.
-- E.g. objects containing 'exceptional' or 'chestnut' will be found.
SELECT * FROM type where CONTAINS('exceptionel~1 cestnutt~ ')
Proximity Search
It is possible to allow for reversed ordering of words in a phrase or to allow for additional words between the words of a phrase.
Here, the number of words not matching the specified phrase is called "edit distance". A maximum edit distance can be defined that limits the number of unmatching words.
Append the operator ~
followed by the integer maximum edit distance to a word within the CONTAINS statement.
-- Select all documents containing phrases of maximum edit distance 3 to the specified sentence.
SELECT * FROM type where CONTAINS('"Please be patient while this website is under construction."~3')
Escaping in 'CONTAINS' Statements
In a CONTAINS
expression, the system interprets specific symbols as operators. If you want to use those symbols as characters NOT beeing an operator, you have to escape them with a backslash (\
).
The following rules apply:
-
The symbols
<
and>
cannot be escaped. If they are used in terms, they will be ignored. -
All types of quotation marks used within a term have to be escaped.
-
The
^
symbol has to be escaped if not used as boosting operator. -
The
~
symbol has to be escaped if not used as fuzzy operator. -
Further special characters that have to be escaped:
+ - = & | ! ( ) { } [ ] * ? : \ /
-
If an operator
AND
/OR
is followed by a second operatorAND
/OR
, the second operator will be automatically escaped and interpreted as a termand
/or
.
Weighted Score
The SCORE
function returns the score values produced by the CONTAINS
function in the SEARCH_SCORE
field. The score value is a relative ranking, with values in the range of 0 to 1 and increases with the relevance. The SCORE
function can also be queried with an alias name.
-- Select all invoices and their score value where the invoice amount is greater than 1000 and in fulltext either 'reminder', 'discount' or 'delay' was found.
SELECT *,SCORE() FROM invoice WHERE amount>1000 AND CONTAINS('reminder discount delay');
-- With alias: Select all invoices and their score value where the invoice amount is greater than 1000 and in fulltext either 'reminder', 'discount' or 'delay' was found.
SELECT *,SCORE() score FROM invoice WHERE amount>1000 AND CONTAINS('reminder discount delay');
Full-text search only in certain fields:
-- Select all invoices and their score value where the field 'status' either contains 'reminder', 'discount' or 'delay'.
SELECT *,SCORE() FROM invoice WHERE status CONTAINS('reminder discount delay');
Searching Normalized Trace IDs
The TRACEID()
function can be used in WHERE
clauses. It normalizes a specified hexadecimal lowercase sting to the trace ID convention. Thus, you can search for your initially specified values for system:traceId
before they were normalized by the system.
Alternatively, it is possible to specify a trace ID in the header of the search request. This value can be referenced in the search query with the @traceid
parameter. It is normalized by the system as well.
Example:
-
Import a DMS object with specified
"system:traceId": {"value": "1234"}
. -
The value will be normalized and stored as
"system:traceId": {"value": "0000000000001234"}
. -
The DMS object can NOT be found by this search query:
SELECT * FROM system:object WHERE system:traceId = '1234'
-
The DMS object can be found by the following queries:
--- normalization by user SELECT * FROM system:object WHERE system:traceId = '0000000000001234' --- normalization by system SELECT * FROM system:object WHERE system:traceId = TRACEID('1234') --- normalization by system, using value '1234' in X-B3-TraceId request header SELECT * FROM system:object WHERE system:traceId = @traceid
2.3.6. Sorting with 'ORDER BY'
To sort the result list, use the ORDER BY
clause. If ORDER BY
is not specified, the result list is ordered by the system:creationDate
object property by default.
-- Select all invoices where the invoice amount is greater than 1000, with the result list sorted in descending order of the invoice amount.
SELECT * FROM invoice WHERE amount>1000 ORDER BY amount DESC;
-- Select all invoices where the invoice amount is greater than 1000,
-- with the result list sorted in descending order of the invoice amount and in ascending order of the date.
SELECT * FROM invoice WHERE amount>1000 ORDER BY amount DESC, date ASC;
In ORDER BY
clauses, you can use the alias names given in the column definitions.
-- Select the invoice amount with alias 'b' of all invoices where the invoice amount is greater than 1000,
-- with the result list sorted in descending order of the alias b (invoice amount).
SELECT amount b FROM invoice WHERE amount>1000 ORDER BY b DESC;
To sort by the score value, you must assign an alias name to the SCORE()
function.
-- Select all invoices and their score value where the field 'status' either contains 'reminder',
-- 'discount' or 'delay', with the result list sorted in ascending order of alias s (score value).
SELECT *,SCORE() s FROM invoice WHERE status CONTAINS('reminder discount delay') ORDER BY s ASC;
2.3.7. Aggregations
Functions 'GROUP BY' and 'COUNT(*)'
To determine the number of objects with special properties, queries can be aggregated. All objects with the same entry in the field specified after the GROUP BY
clause are summarized. The number of objects is returned to the field OBJECT_COUNT
without the assignment of aliases.
-- Select the number of objects (system:object) with type specification, aggregated by the type of the object.
SELECT COUNT(*),type FROM system:object GROUP BY type;
It is also possible to aggregate several fields. In this case, all combinations of the fields mentioned are returned.
-- Select the number of objects (system:object) with type and title specification, aggregated by the type and title of the object.
SELECT COUNT(*),type,title FROM system:object GROUP BY type,title;
The GROUP BY
function can be used without the COUNT(*)
function. Then all combinations of the mentioned fields are returned without their numbers.
-- Select 'type' of all objects (system:object), aggregated by the type of the object.
SELECT type FROM system:object GROUP BY type;
To sort the result list of an aggregation, use the ORDER BY clause, with or without alias.
-- Select the number of objects (system:object) with type specification,
-- aggregated by the type of the object, with the result list sorted in ascending order of 'type'.
SELECT COUNT(*),type FROM system:object GROUP BY type ORDER BY type ASC;
-- With alias: Select the number and 'type' with alias 't' of all objects (system:object),
-- aggregated by 'type', with the result list sorted in descending order of alias t (type).
SELECT COUNT(*),type t FROM system:object GROUP BY type ORDER BY t DESC;
In order to be able to sort by the score value, you must assign an alias name to the SCORE()
function.
-- Select the number with alias 'c' and 'type' of all objects (system:object), aggregated by 'type',
-- with the result list sorted in descending order of alias c (number of objects).
SELECT COUNT(*) c,type FROM system:object GROUP BY type ORDER BY c DESC;
Function 'SUM()'
As of 2023 Autumn.
The SUM()
function can be used in the SELECT
statement of the search query. Similar to the SQL SUM function, it calculates the sum of numeric values for a specified numeric property. The result is retrieved as a single entry in the result list.
|
- Simple Example
-
-- Sum the values of all 'amount' properties SELECT SUM(amount) FROM system:object;
- Conditions combined with 'SUM()'
-
The
SUM()
function can be combined with aWHERE
statement that specifies conditions.-- Sum the value of all 'amount' properties for objects created today SELECT SUM(amount) FROM system:object WHERE system:creationDate IN today();
- Aliases for 'SUM()'
-
It is possible to set an alias as which the
SUM()
result will be displayed.-- Sum the value of all 'amount' properties , return them with alias 'totalsum' SELECT SUM(amount) AS totalsum FROM system:object;
- Multiple 'SUM()' Requests
-
Within one search query, multiple
SUM()
requests can be processed.-- Sum the value of all 'amount' and all 'item' properties SELECT SUM(amount) AS totalsum, SUM(items) totalitems FROM system:object;
- Applying 'SUM()' to Aggregations
-
As the
SUM()
function is a specific type of aggregation, it can be applied to other aggregations viaGROUP BY
as well.-- Sum the value of all 'amount' properties, grouped by 'supplier' SELECT supplier, SUM(amount) AS totalsum FROM system:object GROUP BY supplier;
- Sorting by 'SUM()' Results
-
To sort by a
SUM()
result, it is required to specify an alias.-- Sum the value of all 'amount' properties, order them descending SELECT SUM(amount) AS totalsum FROM system:object ORDER BY totalsum DESC;
- Constants passed to 'SUM()'
-
If a constant is passed to the
SUM()
function, it is used as scalar factor to be multiplied by the number of search results.-- Sum the value with constant 10, result should be 10x the count of hits SELECT SUM(10) AS totalsum FROM system:object;
Function 'AVG()'
As of 2024 Autumn.
The AVG()
function can be used in the SELECT
statement of the search query. Similar to the SQL AVG function, it calculates the average of the numeric values for a specified numeric property. The result is retrieved as a single entry in the result list.
|
- Simple Example
-
-- get the average value of all 'amount' properties SELECT AVG(amount) FROM system:object;
- Conditions combined with 'AVG()'
-
The
AVG()
function can be combined with aWHERE
statement that specifies conditions.-- get the average value of all 'amount' properties from tenant 'myfirsttenant' SELECT AVG(amount) FROM system:object WHERE tenant = 'myfirsttenant';
- Aliases for 'AVG()'
-
It is possible to set an alias as which the
AVG()
result will be displayed.-- get the average value of all 'amount' properties, return it with alias 'average' SELECT AVG(amount) AS average FROM system:object;
- Multiple 'AVG()' requests
-
Within one search query, multiple
AVG()
requests can be processed.-- get the average value of all 'amount' properties and all 'items' properties SELECT AVG(amount) AS avgamount, avg(items) avgitems FROM system:object;
- Applying 'AVG()' to Aggregations
-
As the AVG() function is a specific type of aggregation, it can be applied to other aggregations via
GROUP BY
as well.-- get the average value of all 'amount' properties, grouped by 'supplier' SELECT supplier, AVG(amount) AS avgamount FROM system:object GROUP BY supplier;
- Sorting by 'AVG()' Results
-
To sort by a AVG() result, it is required to specify an alias.
-- get the average value of all 'amount' properties, order them descending SELECT AVG(amount) AS minamount FROM system:object ORDER BY minamount DESC;
- Constants passed to 'AVG()'
-
If a constant is passed to the AVG() function, the value can be used as parameter.
-- get the average value with constant 10, result should be 10 SELECT AVG(10) AS minamount FROM system:object;
Function 'MIN()'
As of 2024 Autumn.
The MIN()
function can be used in the SELECT
statement of the search query. Similar to the SQL MIN function, it determines the minimum value of the numeric values for a specified numeric property. The result is retrieved as a single entry in the result list.
|
- Simple Example
-
-- get the minimum value of all 'amount' properties SELECT MIN(amount) FROM system:object;
- Conditions combined with 'MIN()'
-
The
MIN()
function can be combined with aWHERE
statement that specifies conditions.-- get the minimum value of all 'amount' properties from tenant 'myfirsttenant' SELECT MIN(amount) FROM system:object WHERE tenant = 'myfirsttenant';
- Aliases for 'MIN()'
-
It is possible to set an alias as which the
MIN()
result will be displayed.-- get the minimum value of all 'amount' properties, return it with alias 'minimum' SELECT MIN(amount) AS minimum FROM system:object;
- Multiple 'MIN()' requests
-
Within one search query, multiple
MIN()
requests can be processed.-- get the minimum value of all 'amount' properties and all 'items' properties SELECT MIN(amount) AS minamount, MIN(items) minitems FROM system:object;
- Applying 'MIN()' to Aggregations
-
As the MIN() function is a specific type of aggregation, it can be applied to other aggregations via
GROUP BY
as well.-- get the minimum value of all 'amount' properties, grouped by 'supplier' SELECT supplier, MIN(amount) AS minamount FROM system:object GROUP BY supplier;
- Sorting by 'MIN()' Results
-
To sort by a MIN() result, it is required to specify an alias.
-- get the minimum value of all 'amount' properties, order them descending SELECT MIN(amount) AS minamount FROM system:object ORDER BY minamount DESC;
- Constants passed to 'MIN()'
-
If a constant is passed to the MIN() function, the value can be used as parameter.
-- get the minimum value with constant 10, result should be 10 SELECT MIN(10) AS minamount FROM system:object;
Function 'MAX()'
As of 2024 Autumn.
The MAX()
function can be used in the SELECT
statement of the search query. Similar to the SQL MAX function, it determines the maximum value of the numeric values for a specified numeric property. The result is retrieved as a single entry in the result list.
|
- Simple Example
-
-- get the maximum value of all 'amount' properties SELECT MAX(amount) FROM system:object;
- Conditions combined with 'MAX()'
-
The
MAX()
function can be combined with aWHERE
statement that specifies conditions.-- get the maximum value of all 'amount' properties from tenant 'myfirsttenant' SELECT MAX(amount) FROM system:object WHERE tenant = 'myfirsttenant';
- Aliases for 'MAX()'
-
It is possible to set an alias as which the
MAX()
result will be displayed.-- get the maximum value of all 'amount' properties, return it with alias 'maximum' SELECT MAX(amount) AS maximum FROM system:object;
- Multiple 'MAX()' requests
-
Within one search query, multiple
MAX()
requests can be processed.-- get the maximum value of all 'amount' properties and all 'items' properties SELECT MAX(amount) AS maxamount, MAX(items) maxitems FROM system:object;
- Applying 'MAX()' to Aggregations
-
As the MAX() function is a specific type of aggregation, it can be applied to other aggregations via
GROUP BY
as well.-- get the maximum value of all 'amount' properties, grouped by 'supplier' SELECT supplier, MAX(amount) AS maxamount FROM system:object GROUP BY supplier;
- Sorting by 'MAX()' Results
-
To sort by a MAX() result, it is required to specify an alias.
-- get the maximum value of all 'amount' properties, order them descending SELECT MAX(amount) AS maxamount FROM system:object ORDER BY maxamount DESC;
- Constants passed to 'MAX()'
-
If a constant is passed to the MAX() function, the value can be used as parameter.
-- get the maximum value with constant 10, result should be 10 SELECT MAX(10) AS maxamount FROM system:object;
2.3.8. Provided Date Functions in 'WHERE' Clauses
The query language provides some frequently used time and time span functions for WHERE
clauses.
-
today()
- a date field contains today’s date -
yesterday()
- a date field contains yesterday’s date -
thisweek()
- a date field contains this week’s date, a week starts on Monday and ends on Sunday -
lastweek()
- a date field contains last week’s date, a week starts on Monday and ends on Sunday -
thismonth()
- a date field contains this month’s date -
lastmonth()
- a date field contains last month’s date -
thisyear()
- a date field contains this year’s date -
lastyear()
- a date field contains last year’s date -
now()
- the current date -
dateadd(interval, number, date)
- adds a date interval to a date and returns the date.-
valid
interval
values:year
,yyyy
,yy
= Year;quarter
,qq
,q
= Quarter;month
,mm
,m
= month;dayofyear
= Day of the year;day
,dy
,y
= Day;week
,ww
,wk
= Week;weekday
,dw
,w
= Weekday;hour
,hh
= hour;minute
,mi
,n
= Minute;second
,ss
,s
= Second;millisecond
,ms
= Millisecond -
number
can be a positiv or negative integer value -
date
is a valid ISO8601 date value of the formatyyyy-MM-dd’T’HH:mm:ssZZ
(e.g.,1970-01-01T00:00:00+0000
) or a function which delivers a date value of this format.
-
SELECT ... FROM ... WHERE system:creationDate IN today();
SELECT ... FROM ... WHERE rmDestructionDate > today();
SELECT contentStreamId, fileName, repositoryId FROM system:object WHERE system:creationDate IN lastmonth();
SELECT * FROM document WHERE system:lastModificationDate IN today() AND system:creationDate IN lastyear() ORDER BY system:creationDate DESC;
SELECT COUNT(*) c, system:creationDate FROM system:object WHERE system:creationDate IN thisyear() GROUP BY system:creationDate ORDER BY c DESC;
SELECT * FROM system:object WHERE system:rmDestructionDate < now();
SELECT * FROM system:object WHERE system:creationDate < dateadd('day',35,'2018-09-20T08:37:26.280Z');
SELECT * FROM document WHERE system:lastModificationDate > dateadd('year',-1,now());
2.3.9. Queries on 'contentstream' Fields
Additional to property fields of a DMS object, all contentstream fields can be queried in SELECT
statements as described above.
SELECT contentStreamId, fileName, repositoryId FROM system:object;
SELECT * FROM document WHERE mimeType'message/rfc822' ORDER BY title DESC;
SELECT COUNT(*) c, fileName FROM system:object GROUP BY fileName ORDER BY c DESC;
2.3.10. Queries on Queriable Tables
As of version 2020 Winter, table cells can be accessed using the format in the following example:
-- syntax of table cell access
SELECT * FROM system:object WHERE queriable_table[row].column = value;
-- examples
SELECT * FROM system:object WHERE queriable_table[row].columnx = value;
SELECT queriable_table.nickname, queriable_table.name FROM system:object WHERE queriable_table[row].columnx LIKE 'steven';
SELECT * FROM system:object WHERE (queriable_table[5].age <= 55 AND queriable_table[6].age >= 22) OR queriable_table[6].age > 6;
SELECT * FROM system:object WHERE queriable_table[2].name IN ('Erwin', 'Max');
SELECT * FROM system:object WHERE queriable_table[3].name CONTAINS('Arno');
SELECT * FROM system:object WHERE queriable_table[4].city IS NULL;
SELECT * FROM system:object WHERE queriable_table[4].city IS NOT NULL;
SELECT * FROM system:object WHERE queriable_table[5].date > lastyear();
Between the SELECT
and FROM
keywords, one or more table columns can be referenced with the syntax tablename.columnname
as shown in the second example query above. The query will then return only the selected columns, in the example the columns nickname
and name
of the table queriable_table
. Otherwise, like in the other examples above where the * symbol is placed between the SELECT
and FROM
keywords, the entire table will be returned.
The conditions are specified in the same way like in single query calls. Date functions can be used, too.
ORDER BY
and GROUP BY
are not supported on tables.
To reference any column or any row in the condition, the *
symbol can be used as wildcard, as shown in the following examples:
-- columnx should have the given value in any row
SELECT * FROM system:object WHERE queriable_table[*].columnx = value;
-- any column should have the given value in rowx
SELECT * FROM system:object WHERE queriable_table[rowx].* = value;
-- any table cell should have the given value
SELECT * FROM system:object WHERE queriable_table[*].* = value;
For combined queries within one column of a table, there is a special syntax as shown in the code block below. Examples are provided as well.
-- syntax of table cell access
SELECT * FROM system:object WHERE queriable_table[row].(column_condition_1 AND/OR ... AND/OR column_condition_x);
SELECT * FROM system:object WHERE queriable_table[*].(column_condition_1 AND/OR ... AND/OR column_condition_x);
-- examples
SELECT * FROM system:object WHERE queriable_table[*].(name IN ('Erwin', 'Max') AND age >= 22);
SELECT * FROM system:object WHERE queriable_table[5].((name CONTAINS('Arno') AND age >= 22) OR city IS NULL);
SELECT * FROM system:object WHERE queriable_table[*].((name CONTAINS('Arno') AND age >= 22) OR (city IS NULL and date <= lastyear())) AND system:creationdate IN thisyear();
Within the brackets, any complex condition statement created from the set of conditions on properties described in the sections above can be queried, where each single condition will be applied on the specified row. If you use the wildcard *
as row number, each table row will be tested on the complex condition. For a query match, a row has to be found for which the whole condition set is true.
As shown in the last two lines of the code block above, Combined queries on a row can also be used in combination with further conditions.
2.3.11. Queries on Tags
As of version 2020 Summer, tags can be assigned to objects. The tag properties are searchable by means of queries. Since the tag properties are stored in table format, the queries are defined like queries on tables. Each tag corresponds to one row of the table property system:tags that is assigned to every object. The row is indicated by the value of the corresponding tag’s name. The four available columns are the same for all tags: name, state, creationDate and traceId. The following code block shows examples:
SELECT * FROM system:object WHERE system:tags[*].creationDate=TODAY();
SELECT * FROM system:object WHERE system:tags[*].name='ren:ocr';
SELECT * FROM system:object WHERE system:tags[ren:ocr].state=2;
SELECT * FROM system:object WHERE system:tags[*].(state=2 AND creationDate=TODAY());
SELECT * FROM system:object WHERE system:tags IS NULL;
SELECT * FROM system:object WHERE system:tags[ren:ocr1] IS NULL;
Of course, the queries can be combined with any other valid query as can be seen in the following examples:
-- search for objects have a tag created today and with the state 2
SELECT * FROM system:object WHERE system:tags[*].(state=2 AND creationDate=TODAY());
-- search for objects having the tag 'analysis' with the state 1 that were created yesterday
SELECT * FROM system:object WHERE system:tags[analysis].state=1 AND where system:creationDate=YESTERDAY();
2.3.12. Queries on Structured Data
As of version 2021 Summer, structured data properties can be used to assign an arbitrary JSON structure to objects. The structured data properties are stored similarly to table properties and are thus searchable by means of similar queries. The addressing of individual keys within the JSON structure is inspired by the concept of JSONPath.
Conditions on Structured Data
The following code block shows examples where objects of type order are searched that match the corresponding WHERE condition. The example property customerdetails
is a structured data property referenced in the object type definition for order. If objects are found, the values for the structured data property customerdetail
will be returned in JSON format for each of them.
-- Search for objects where 'customerdetails' contains the first-order key 'id' with value '2982'.
SELECT customerdetails FROM order WHERE customerdetails.id = 2982
-- Search for objects where 'customerdetails' contains the first-order key 'words' beeing a list with an existing value for index 10.
SELECT customerdetails FROM order WHERE customerdetails.words[10] IS NOT NULL
-- Search for objects where 'customerdetails' contains the first-order key 'words' beeing a list that contains the entry 'milk' at an arbitrary index.
SELECT customerdetails FROM order WHERE customerdetails.words[*] = 'milk'
-- Search for objects where 'customerdetails' contains the first-order key 'sentences' beeing a list that contains the term 'milk' in the second element.
SELECT customerdetails FROM order WHERE customerdetails.sentences[1] CONTAINS('milk')
-- Search for objects where 'customerdetails' contains the first-order key 'food' containing the second-order datetime key 'lastcooked' that has to be a value earlier than last year.
SELECT customerdetails FROM order WHERE customerdetails.food.lastcooked < LASTYEAR()
-- Search for objects where 'customerdetails' contains 'jelly' in the value for the key 'ingredient' that can be at any hierarchical level within the JSON.
SELECT customerdetails FROM order WHERE customerdetails..ingredient CONTAINS('jelly')
-- Search for objects where 'customerdetails' contains 'jelly' in the value for the key 'ingredient' that can be at any hierarchical level within the JSON,
-- but needs to have a direct or indirect parent node 'food'.
SELECT customerdetails FROM order WHERE customerdetails..food..ingredient CONTAINS('jelly')
Restriction Possibilities for Responses
To return only a sub-structure of the JSON value for a structured data property, specify the corresponding key as SELECT
statement:
SELECT customerdetails.uid FROM order
To return multiple sub-structures, separate them by comma:
SELECT customerdetails.uid,customerdetails.word FROM order
If you specify an index within a list, the values for the list elements with lower indices will be replaced by null in the return statement:
-- The query starting with ...
SELECT customerdetails.words[2] FROM order
-- ... will result in the return statement:
{
"properties": {
"appTable:customerdetails": {
"value": {
"words": [
null,
null,
"water"
]
}
}
}
}
To return sub-structures located at any hierarchical level within the JSON value, use .. as shown in the examples below.
-- Search for objects of type order and display only key-value mappings for keys 'uid'.
SELECT customerdetails..uid FROM order
-- Example response:
{
"properties": {
"appTable:customerdetails": {
"value": {
"uid": "711e1858-eb24-4183-8743-0292c7b9b93b",
"food": {
"uid": "7aa4a2f2-3dc0-420c-a0d7-edc6af3619de"
}
}
}
}
}
-- Search for objects of type order and display only key-value mappings for keys 'uid' that have a direkt or indirect parent node 'food'.
SELECT customerdetails..food..uid FROM order
-- Example response:
{
"properties": {
"appTable:customerdetails": {
"value": {
"food": {
"uid": "7aa4a2f2-3dc0-420c-a0d7-edc6af3619de"
}
}
}
}
}
2.3.13. Queries on Audit Entries
Audit entries can be queried by querying the object type system:audit
.
If you search by traceId , please note that the values are normalized if necessary as described here.
|
-- Select all audit entries
SELECT * FROM system:audit;
-- Select all audit entries for a specific traceId
SELECT * from system:audit WHERE traceid = '0000000000543221'
-- Select all audit entries created yesterday
SELECT * from system:audit WHERE creationDate IN YESTERDAY()
Audit entries are stored within a relational database. Thus, to query audit entries full-text queries and the return of the total amount of matching items totalNumItems within the result cannot be supported:
-
no queries with
CONTAINS()
-
no queries using scoring
SCORE()
-
no
totalNumItems
within the result set
All other features will be provided as described above.
2.3.14. Query JSON Format
A search can be called using the POST /api/dms/objects/search
endpoint by giving the following JSON structure:
{
"query" : {
"statement" : "SELECT * from sysemail WHERE email = @emailAddress AND sysfrom IN @from AND CONTAINS(@text)",
"skipCount" : 0, // optional for Paging
"maxItems" : 50, // optional for Paging
"useCache" : true, // optional
"handleDeletedDocuments" : "DELETED_DOCUMENTS_EXCLUDE", // optional DELETED_DOCUMENTS_INCLUDE | DELETED_DOCUMENTS_ONLY | DELETED_DOCUMENTS_EXCLUDE default: DELETED_DOCUMENTS_EXCLUDE
"parameters": { // optional, only if @ parameter occurs in statement
"emailAddress": "'info@optimal-systems.de'",
"text": "'Meeting'",
"from": "('hallo@huhu.de','info@huhu.de')"
}
}
}
-
The field
statement
contains the SQL query. -
skipCount
(default: 0) defines the number of skipped objects from which themaxItems
(default: 50) number of found objects will be delivered. This defines the paging of the search call. -
The field
useCache
(default:true
) defines if this request should be cached in search engine’s Shard request cache. -
Within a default search, all objects marked as deleted will be excluded (
DELETED_DOCUMENTS_EXCLUDE
). By using the optional fieldhandleDeletedDocuments
, this behaviour can be changed in including this objects (DELETED_DOCUMENTS_INCLUDE
) or delivering only deleted objects (DELETED_DOCUMENTS_ONLY
).
Using Parameters
Within an SQL statement, some predefined parameters can be referenced. By @userId
the ID of the actual user (taken from the user session) and by @userRoles
the roles of the actual user (also taken from the user session) can be referenced for replacement at runtime. As of 2023 Summer, @abac.<key>
is available as well.
{
"query" : {
"statement" : "SELECT * from system:object WHERE system:createdBy = @userId AND system:roles IN @userRoles"
}
}
The JSON field parameters can be used to define parameter (reserved names: userRoles
, userId
, abac
) values which can be referenced by @<parameter>
within a preformed SQL statement for replacement at runtime. The reserved parameter names userRoles
, userId
cannot be used for own definition of a parameter. A given definition under this names affects an exception.
{
"query" : {
"statement" : "SELECT * from system:object WHERE email = @emailAddress AND email:from IN @from AND CONTAINS(@text)",
"parameters": { // optional, only if @ Parameter occurs in statement
"emailAddress": "'info@optimal-systems.de'",
"text": "'Meeting'",
"from": "('hallo@huhu.de','info@huhu.de')"
}
}
}
2.4. Document Lifecycle
2.4.1. Synchronous or Asynchronous
In document lifecycle management, multi-stage and asynchronous processes are not uncommon — quite the contrary. The first process steps are carried out with the highest priority. More complex and currently not absolutely essential process steps are carried out asynchronously with a lower priority. This saves time, and carrying out operations in parallel lets you distribute resources more evenly.
Parameter 'waitForSearchConsistency' for Endpoints with Effect on the Search Index
As of version 2022 Autumn, some processes that lead to an update of the index of the search engine can be called with the query parameter waitForSearchConsistency
.
Value of 'waitForSearchConsistency' | Processing | Description | Advantage | Disadvantage |
---|---|---|---|---|
|
synchronous |
The success response of the corresponding endpoint is returned after the successful update of the search index. |
The changes are available even for search requests that are sent immediately after the synchronous processing. |
The waiting time before the response is rather long. |
|
asynchronous |
The success response of the corresponding endpoint does not wait for the update of the search index. |
The waiting time for the response is far shorter. |
Search requests sent immediately after the change request may be processed before the search index is updated. |
The update and import endpoints listed below accept an optional query parameter waitForSearchConsistency
.
Endpoints | Default for 'waitForSearchConsistency' |
---|---|
Import: |
|
Metadata update:
|
|
Content update:
|
|
Restore:
|
|
Deletion:
|
|
Tagging:
|
|
Text rendition:
|
|
2.4.2. Tagging
To resume a process chain, additional information about the current state of the process is necessary. In order to not mix an object’s metadata with its state data, there is the possibility to tag objects. Pure tagging operations do not trigger the creation of new object versions.
Objects can be searched by tags and selected for the next process step. All tagging activities are recorded in the audit trail.
Characteristics of Tags
Difference between metadata and tags:
-
Tags do NOT belong to the metadata and thus do not need to be defined in the schema.
-
Tags are stored together with the object as value for the
system:tags
property similar to metadata. -
Pure tag operations do NOT lead to the creation of a new object version.
-
Tags can only be attached to the current version of an object, whereas previous versions cannot have tags.
-
For version-specific information, metadata provide the suitable options. They have to be defined in the schema.
State information:
-
Tags describe the state of an object in a process chain. The state information is specified via an integer value.
Tracing information:
-
Tags are provided with a process identification that allows to retrace tag operations and tune the update or deletion permissions for the tag.
Assignment:
-
Tags can be added to any object during object creation, during metadata updates or completely independent via a tagging endpoint.
-
As of 2024 Spring, tags can be automatically assigned during specific operations on DMS objects via lifecycle hooks.
-
Multiple tags can be added to one object.
-
The number of tags assigned to one object is limited to 50.
Querying on tags:
-
The properties of tags are included in the searchable data.
-
Tags are queried similar to table properties.
Behavior during POST metadata updates:
-
If the
system:tags
property is specified in the request body,-
all included tags are assigned to the new object version with the given name and state. The same value as
system:lastModificationDate
andsystem:traceId
will be set automatically for creationDate and traceId respectively for all of them. -
each tag that is not included is deleted. The new object version will not have that tag.
-
-
If the property
system:tags
is NOT specified in the request body or is set to null, all tags will be deleted. The new object version will not have any tag.
Behavior during PATCH metadata updates:
-
If the
system:tags
property is specified in the request body,-
all included tags are assigned to the new object version.
-
each tag that is not included is deleted. The new object version will not have that tag.
-
-
If the
system:tags
property is NOT specified in the request body, all tags are transferred to the new object version. Their state, creationDate and traceId remain unchanged. -
If the
system:tags
property is set to null, all tags will be deleted. The new object version will not have any tag.
Behavior during POST updates of the binary content file:
-
If the tag name ends with the suffix
:resistant
, the tag is transferred to the new object version. Its state remains unchanged. -
If the tag name does NOT end with the suffix
:resistant
, the tag is deleted. It will not be assigned to the new object version.
Behavior during POST multipart update of metadata and content (as of 2024 Spring):
-
If the
system:tags
property is specified in the request body,-
each tag that is not included is deleted. The new object version will not have that tag.
-
all included tags are assigned to the new object version with the given
name
andstate
. The same value assystem:lastModificationDate
andsystem:traceId
will be set automatically forcreationDate
andtraceId
respectively for all of them.ExceptionEach non-resistant tag that is specified in the request body with an exact copy of a previously existing tag is deleted. It is assumed that the tag is not deliberately set, but simply copied from the current object. -
Especially, if the whole property
system:tags
specified in the request body equals thesystem:tags
of the current object, the behaviour is like the update of the binary content file: resistant tags survive, non-resistant tags are deleted.
-
-
If the property
system:tags
is NOT specified in the request body or is set tonull
, all tags will be deleted. The new object version will not have any tag.
Behavior during POST restoring actions of an old version (as of 2022 Spring):
-
If the tag name ends with the suffix
:resistant
, the tag is transferred to the new object version. Its state remains unchanged. -
If the tag name does NOT end with the suffix
:resistant
, the tag is deleted. It will not be assigned to the new object version.
Any tag operation is documented in the object audit trail.
Tag Properties
Tags are defined by the following properties:
Property | Type | Description | In a request |
---|---|---|---|
|
String |
Name of the tag for identification. It has to be unique for the corresponding object. The tag names are validated during a tag creation or update process. To pass the validation, they have to match the regular expression [a-z](:?[a-z]) and must not be longer than 32 characters (as of 2022 Spring, no longer than 128 characters). As of version 2021 Summer, the suffix :resistant triggers a specific behavior of the tag. If a tag name matches the expression [a-z](:?[a-z]):resistant, the tag will behave like a resistant tag as described below. |
required |
|
Integer |
Represents the status of the corresponding object in a process chain. |
required |
|
String |
Date and time of the last modification of the tag. It is set automatically by the system. |
optional, only available in search queries |
|
Hexadecimal lowercase string with maximum length 16 |
Process identification of any tag operation. If not specified in the request, a random String value will be set after the tag operation. In a tag update or delete request, the request parameter traceIdMustMatch can be set to true. The operation will be done only if the traceId of the call matches the current traceId of the requested tag. After such update processes, the traceId of the updated tag will be the same as before. Per default, |
optional, specified by means of the HTTP header |
In a request, the corresponding properties are included directly in the URL for the call of the endpoint. In contrast, if tags are displayed in a response body, their properties are listed as a part of a JSON structure in the value of the system:tags
property.
Tagging Endpoints
The following endpoints for pure tag operations do not trigger a new version of the corresponding object, but only a new entry in the audit trail:
-
Retrieve object tags by ID – GET
/api/dms/objects/{objectId}/tags
-
Add object tag by ID – POST
/api/dms/objects/{objectId}/tags/{name}/state/{state}
-
Update object tag by ID – POST
/api/dms/objects/{objectId}/tags/{name}/state/{state}?overwrite=true
-
Delete object tag by ID – DELETE
/api/dms/objects/{objectId}/tags/{name}
-
Add/update object tag by search query – POST
/api/dms/objects/tags/{name}/state/{state}?query=<SQL>
Automated Tagging
As of version 2024 spring, tags can be automatically assigned or updated via lifecycle hooks.
Resistant Tags
As of version 2021 Autumn, it is possible to assign resistant tags that are automatically transferred to the new version of an object created during an update of the binary content file.
The resistant tags will be removed from the old object version and assigned to the new object version. As usual, the previous object version will not have any tags afterwards. However, the new version will have all the resistant tags assigned to it that were originally assigned to the previous version. Conventional non-resistant tags will not be reassigned to the new object version.
Resistant tags are identified by the suffix :resistant
at the end of the tag name.
The tag name including the suffix must not exceed the length limit of 128 characters. |
2.4.3. Typecasting
By assigning or removing secondary object types (SOTs) to DMS objects, it is possible to change their set of available properties during lifecycle. This can be used to realize typecasting.
To assign a secondary object type, the target DMS object’s type (system:objectTypeId
) must match one of the following prerequisites:
- (A) Floating reference on the SOT
-
If the DMS object has any user-defined object type, this type has to contain a reference on the SOT in its schema definition. This reference has to be floating (
"static=false"
).Example reference<secondaryObjectTypeId static="false">myexamplesot</secondaryObjectTypeId>
- (B) Pre-defined
system:document
-
As of 2023 Spring, the predefined object type
system:document
automatically has a floating reference on all SOTs that are available in the applied tenant schema. Thus, all those SOTs can be assigned to DMS objects of typesystem:document
.
The rules for the contentStreamAllowed attribute for the individual SOTs have to be considered before they are assigned to an object.
|
Floating secondary object types can be assigned during the import
-
via
POST /api/dms/objects
or assigned/removed/exchanged at runtime for already existing DMS objects with an update
-
via
POST /api/dms/objects/{objectId}
or -
via
PATCH /api/dms/objects/{objectId}
.
The following keywords can be used in the system:secondaryObjecttypeIds
metadata property.
Keyword | Type | Description | Example | ||
---|---|---|---|---|---|
|
comma-separated string list |
Available during import or update. Assigns one or multiple secondary object types to a DMS object.
|
|
||
|
string |
Available during update. Assigns a single secondary object type to an object. |
|
||
|
string |
Available during update. Removes a single secondary object type from an object.
|
|
If assigned to a DMS object, the SOT is available in the FROM clause in search queries, e.g.:
select * from appSot:INV
You cannot tell from the metadata of a document any longer if a property is referenced directly or indirectly in the schema. All properties are plain in the properties list.
2.4.4. Document Retention
Retention
yuuvis® Momentum provides the possibility to prohibit object deletion requests as well as deletion or change requests on binary content files via an expiration date property called system:rmExpirationDate
. The property is predefined in all systems and is part of the also predefined secondary object type (SOT) system:rmDestructionRetention
. This SOT can be referenced in any document object type definition in any schema (global, app specific or tenant specific). Thus, an expiration date can be set for each object of such a document object type. If a document object has the system:rmExpirationDate
property and if the value of this property lies in the future, it is under retention until the expiration date is reached. There is no maximum retention time. You can specify any date in the future as expiration date to ensure storage time for the sake of your archiving needs.
Since the retention is stored within the objects' metadata, the individual values can be retrieved like other object properties, e.g., via the GET /api/dms/objects/{objectId}
endpoint. It is not possible to define retention periods for objects without the system:rmDestructionRetention
.
The retention defined in the SOT protects binary content files from beeing modified/deleted via yuuvis® Momentum API. However, objects under retention can still be modified/deleted by administrators having direct access to the used storage. To prohibit such administrative operations, some archives offer an archive-internal retention as well. In those archives, the retention specified in the individual objects' metadata is set as an individual archive-internal retention. |
The metadata of objects under retention are NOT protected from changes. They remain editable. If you want to prohibit metadata updates in project-specific use cases, you can configure a suitable webhook, that is triggered before the process you want to prohibit. |
SOT 'system:rmDestructionRetention'
To specify a retention for an individual object, the following properties are predefined in yuuvis® Momentum.
Property | datetime | Description |
---|---|---|
|
datetime |
Required to set a retention. Specifies the date until which the document object will be unter retention. The value must not lie in the past at the time of specification. If the value is null, the values for system:rmStartOfRetention and system:rmDestructionDate must be null as well. If not specified, the default retention of the used repository will be set if defined in the corresponding archive profile. The default retention does NOT replace a retention specified via API, even if the default retention would result in a later expiration date. >> application-storage.yml |
|
datetime |
Optional. Not considered or validated by yuuvis® Momentum core system. Can be used to specify the start date of the retention period for documentation purposes. |
|
datetime |
Optional. Has to equal or exceed the value for Can be used to specify a date to trigger an automated deletion via a custom service. The yuuvis® Momentum core system does not yet offer an endpoint for this purpose. |
The following code block shows the predefined properties that are related to retention. It is not possible to edit or overwrite those definitions.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
<propertyDateTimeDefinition>
<id>system:rmExpirationDate</id>
<description>contains the date until the document's content is preserved</description>
<propertyType>datetime</propertyType>
<cardinality>single</cardinality>
<required>false</required>
</propertyDateTimeDefinition>
<propertyDateTimeDefinition>
<id>system:rmStartOfRetention</id>
<description>contains the date from which the retention time was calculated (for documentation purposes only)</description>
<propertyType>datetime</propertyType>
<cardinality>single</cardinality>
<required>false</required>
</propertyDateTimeDefinition>
<propertyDateTimeDefinition>
<id>system:rmDestructionDate</id>
<description>holds the date when the destruction process should be triggered</description>
<propertyType>datetime</propertyType>
<cardinality>single</cardinality>
<required>false</required>
</propertyDateTimeDefinition>
...
All three of those properties are referenced in the system:rmDestructionRetention
SOT. The following code block shows its predefined structure. It is not possible to edit or overwrite this definition.
1
2
3
4
5
6
7
8
9
10
11
...
<typeSecondaryDefinition>
<id>system:rmDestructionRetention</id>
<localNamespace>urn:optimal-systems.de:dmscloud:system</localNamespace>
<description>can be used to apply retentions on objects</description>
<baseId>system:secondary</baseId>
<propertyReference>system:rmExpirationDate</propertyReference>
<propertyReference>system:rmStartOfRetention</propertyReference>
<propertyReference>system:rmDestructionDate</propertyReference>
</typeSecondaryDefinition>
...
To use retentions, your applied schema must contain a document object type that references the predefined system:rmDestructionRetention
SOT. For document objects of this type, you can specify retention properties via yuuvis® Momentum API. The following code block shows an example object type definition.
1
2
3
4
5
6
7
8
9
10
11
...
<typeDocumentDefinition>
<id>document</id>
<description>a document with retention</description>
<baseId>system:document</baseId>
<propertyReference>name</propertyReference>
<propertyReference>date</propertyReference>
<contentStreamAllowed>required</contentStreamAllowed>
<secondaryObjectTypeId>system:rmDestructionRetention</secondaryObjectTypeId>
</typeDocumentDefinition>
...
By means of yuuvis® Momentum core API, there are two ways to set an object under retention:
the object can directly be imported with an expiration date or
an expiration date can be added to a previously existing object using a metadata update.
An example data set as retrievable via GET /api/dms/objects/{objectId}
is shown in the following code block.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"objects": [{
"properties": {
"system:objectTypeId": {
"value": "document"
},
"name": {
"value": "exampledocument"
},
"system:rmStartOfRetention": {
"value": "2018-07-20T11:52:00.000Z"
},
"system:rmExpirationDate": {
"value": "2028-12-28T11:52:00.000Z"
},
"system:rmDestructionDate": {
"value": "2028-12-28T11:52:00.000Z"
}
},
... // the content streams section is missing here
}]
}
Effects of Retentions
If an expiration date has been set for a document object, it is not possible to change or delete its binary content file or delete the object before its expiration date. The other two properties have no particular uses provided by the system. Also, if an object is under retention, it is still possible to update its metadata; however, the expiration date cannot be removed or replaced by an earlier date.
An object under retention cannot be deleted or changed even by users that have a write or delete permissions; retentions take precedence over write
or delete
permissions.
Automated Retention Management
It is possible to extend the functionality of yuuvis® Momentum by configuring webhooks and adding custom microservices. Thus, you can build your own specialized solution to realize automated retention management.
One possible use case would be to calculate the required retention values based on the individual object’s metadata and set them, e.g.,
-
during the object creation,
-
during a specific update of the object’s metadata, or
-
triggered by a specific metadata update of the parent folder object (if you use
system:parentId
).
For the deletion of document objects with expired retention, you can introduce automated custom solutions as well. E.g., with a custom microservice in your system that automatically searches for objects with expired retention and
-
deletes them,
-
updates their state in the lifecycle via tagging, or
-
starts a workflow process asking assigned users to delete them (if BPM-ENGINE Service is used).
2.4.5. Content Renditions
Renditions are alternative representations of the content assigned to DMS objects. As such, they are only retrievable with a read permission for the concrete object instances.
Please note that a rendition is not an exact representation of the original file. Deviations to the original file may arise and are NOT considered as bugs in our software.
Typical use cases for the individual rendition types are:
kind of rendition |
Example use case |
---|---|
|
Full-text search |
|
content preview |
|
thumbnails for content visualization within hit lists in client applications |
Calculation and Storage
The yuuvis® Momentum core system offers automated rendition calculation for various supported formats of binary content files.
The responsible services are enabled in the default configuration but the rendition repository has to be configured manually. |
kind of rendition |
text |
pdf |
slide |
---|---|---|---|
Service for calculation |
|
|
|
Automated calculation |
during import with content and content update processes |
on (first) request |
on (first) request |
Manual input |
during import or via the update endpoint for existing objects, or via the |
- |
- |
Storage location |
search index |
rendition repository |
rendition repository |
Availability for DMS object versions |
only for the current version |
for any (not deleted) version |
for any (not deleted) version |
As the text
rendition is used for full-text search, it is stored in the search index. If you want to extend the core system’s functionality in terms of supported formats, it is possible to set or update the text rendition via API gateway endpoints. Thus, it is possible to, e.g., integrate an OCR implementation to automatically calculate a full-text for binary content files of image file types.
The length of extracted full-text is limited by the configurable parameter extraction.maxTextLengthInKB
in a YAML configuration file for the repository
service. Thus, overloads and downtimes of the repository
due to huge content files with much text can be avoided. If you increase the value, ensure that your search engine (Elasticsearch) can handle your desired size of string fields.
The text
renditions are not stored as content streams but as plain text in the search index where only data for the current version of DMS objects are stored. Thus, text renditions are only available for the current version of DMS objects.
A dbs-reindex command via commander service will undo all manual text rendition inputs.
|
The pdf
and slide
renditions are calculated from the binary content file by the rendition service on request. To reduce the workload and processing time for repeated retrieval of the same rendition, a default rendition repository can be configured. It is a separate repository to allow for a different storage configuration as it might be required for the binary content files themselves. Whenever a pdf or slide rendition is requested for an object, it is retrieved from the default rendition repository. If available, the stored rendition will be returned. If not available, the requested rendition is generated from the binary content file that is assigned to the object, stored in the default rendition repository and finally returned.
The rendition repository uses the content’s digest as rendition identification to avoid duplicate filing. The digest is calculated by the repository
service during each content import or update process and referenced in the content stream properties section of the corresponding DMS object. If the same content file is assigned to multiple DMS objects, the digest is the same, and only one rendition for each kind (pdf
or slide
) is stored within a tenant.
It is not possible to set retention for a rendition.
Supported Formats
The following table provides an overview of various binary content file types and the types of rendition that can be provided (+) by yuuvis® Momentum.
Binary content file type | Extension | text rendition |
pdf rendition |
slide rendition |
---|---|---|---|---|
MS Office Word 97-2016 |
doc, docx |
+ |
+ |
+ |
MS Office PowerPoint 97-2016 |
ppt, pptx |
+ |
+ |
+ |
MS Office Excel 97-2016 |
xls, xlsx |
+ |
+ |
+ |
OpenDocument Text |
odt |
+ |
+ |
+ |
OpenDocument Presentation |
odp |
+ |
+ |
+ |
OpenDocument Spreadsheet |
ods |
+ |
+ |
+ |
Rich Text Format |
rtf |
+ |
- |
- |
Visio Drawing File |
vsd, vsdx |
- |
+ (limited range of functions) |
+ |
Plain Text |
txt |
+ |
- |
- |
Comma Separated Values |
csv |
+ |
- |
- |
HyperText Markup Language (HTML) |
html |
+ |
- |
- |
XML |
xml |
+ |
- |
- |
JavaScript Object Notation |
json |
+ |
- |
- |
MS Outlook |
msg |
+ |
- |
+ |
Electronic Mail Format |
eml |
- |
- |
+ |
Encapsulated Portable Document Format |
epdf |
+ |
- |
- |
Portable Document Format As of 2024 Spring, also 256-bit-encrypted PDF. |
+ |
- |
+ |
|
Tagged Image File Format |
tiff / tif |
- |
+ |
+ |
Portable Bitmap Image |
pbm |
- |
+ |
+ |
Bitmap Image File |
bmp |
- |
+ |
+ |
Graphical Interchange Format File |
gif |
- |
+ |
+ |
JPEG Image Exchangeable image file format (JPEG) |
jpg, jng, jpeg |
- |
+ |
+ |
Portable Network Graphic |
png |
- |
+ |
+ |
Weppy Image Format (Lossy Compression) |
webp |
- |
+ |
+ |
Supported Fonts
The creation of renditions supports only those fonts that are available on the corresponding operation system. If a not-supported font occurs in a binary content file for which a rendition creation is requested, it will be substituted by a supported font.
As yuuvis® Momentum is operated in a Kubernetes system based on Linux, the DejaVu Serif font is always available and is thus used as fallback for the rendition creation if a binary content file contains a not-supported font that cannot be substituted.
The Kubernetes-based yuuvis® Momentum installation contains a variety of different fonts that are available for the creation of renditions. The supported fonts are listed here:
Click here to show supported fonts…
- NotoSansThai-ExtraCondensedLight.ttf: Noto Sans Thai,Noto Sans Thai ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifKhmer-CondensedLight.ttf: Noto Serif Khmer,Noto Serif Khmer Cond Light:style=Condensed Light,Regular
- NotoSerifDisplay-SemiCondensedMedium.ttf: Noto Serif Display,Noto Serif Disp SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansLaoUI-CondensedSemiBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond SemBd:style=Condensed SemiBold,Regular
- DejaVuSerif-Bold.ttf: DejaVu Serif:style=Bold
- NotoSerifGeorgian-SemiCondensedMedium.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn Md:style=SemiCondensed Medium,Regular
- NotoSansArabic-CondensedMedium.ttf: Noto Sans Arabic,Noto Sans Arabic Cond Med:style=Condensed Medium,Regular
- NotoSansCham-Black.ttf: Noto Sans Cham,Noto Sans Cham Blk:style=Black,Regular
- NotoSerifKhmer-ExtraCondensedExtraLight.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansTamilUI-CondensedBlack.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond Blk:style=Condensed Black,Regular
- NotoSansArmenian-SemiCondensedExtraLight.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- URWBookman-LightItalic.otf: URW Bookman:style=Light Italic
- NotoSerifHebrew-CondensedBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond:style=Condensed Bold,Bold
- NotoSerifKhmer-ExtraLight.ttf: Noto Serif Khmer,Noto Serif Khmer ExtLt:style=ExtraLight,Regular
- NotoSerifDisplay-CondensedExtraLight.ttf: Noto Serif Display,Noto Serif Disp Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSans-CondensedLight.ttf: Noto Sans,Noto Sans Cond Light:style=Condensed Light,Regular
- NotoSansLaoUI-ExtraCondensedSemiBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSans-Medium.ttf: Noto Sans,Noto Sans Med:style=Medium,Regular
- NotoSansArabic-Condensed.ttf: Noto Sans Arabic,Noto Sans Arabic Cond:style=Condensed,Regular
- NotoSansCarian-Regular.ttf: Noto Sans Carian:style=Regular
- NotoSerifMyanmar-Thin.ttf: Noto Serif Myanmar,Noto Serif Myanmar Thin:style=Thin,Regular
- NotoSerif-SemiCondensedSemiBold.ttf: Noto Serif,Noto Serif SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansHebrew-Bold.ttf: Noto Sans Hebrew:style=Bold
- NotoSerifArmenian-CondensedExtraLight.ttf: Noto Serif Armenian,Noto Serif Armenian Cn XLt:style=Condensed ExtraLight,Regular
- NotoSansDevanagariUI-Black.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Bk:style=Black,Regular
- URWBookman-Light.otf: URW Bookman:style=Light
- NotoSansDisplay-ExtraCondensedBoldItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond:style=ExtraCondensed Bold Italic,Bold Italic
- NotoSansHebrew-Medium.ttf: Noto Sans Hebrew,Noto Sans Hebrew Med:style=Medium,Regular
- NotoSerifKhmer-Black.ttf: Noto Serif Khmer,Noto Serif Khmer Blk:style=Black,Regular
- NotoSansCherokee-Black.ttf: Noto Sans Cherokee,Noto Sans Cherokee Blk:style=Black,Regular
- DejaVuSansMono.ttf: DejaVu Sans Mono:style=Book
- NotoSerifGeorgian-Condensed.ttf: Noto Serif Georgian,Noto Serif Georgian Cn:style=Condensed,Regular
- NotoSansThai-ExtraCondensedMedium.ttf: Noto Sans Thai,Noto Sans Thai ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSerifTelugu-Regular.ttf: Noto Serif Telugu:style=Regular
- NotoSansLao-SemiCondensedExtraBold.ttf: Noto Sans Lao,Noto Sans Lao SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansOgham-Regular.ttf: Noto Sans Ogham:style=Regular
- NotoSerifMyanmar-CondensedBlack.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond Blk:style=Condensed Black,Regular
- NotoSerifSinhala-ExtraLight.ttf: Noto Serif Sinhala,Noto Serif Sinhala ExtLt:style=ExtraLight,Regular
- NotoSerifHebrew-ExtraCondensedBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifArmenian-ExtraCondensedExtraLight.ttf: Noto Serif Armenian,Noto Serif Armenian XCn XLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifEthiopic-Black.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Bk:style=Black,Regular
- NotoSans-SemiCondensedSemiBoldItalic.ttf: Noto Sans,Noto Sans SemCond SemBd:style=SemiCondensed SemiBold Italic,Italic
- NotoSansInscriptionalPahlavi-Regular.ttf: Noto Sans Inscriptional Pahlavi,Noto Sans InsPahlavi:style=Regular
- NotoSerifMalayalam-Regular.ttf: Noto Serif Malayalam:style=Regular
- NotoSansTamil-SemiCondensedBlack.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansSinhalaUI-ExtraCondensedThin.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifTamil-SemiCondensedExtraLight.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansArabicUI-CondensedExtraLight.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn XLt:style=Condensed ExtraLight,Regular
- NotoSansGeorgian-ExtraBold.ttf: Noto Sans Georgian,Noto Sans Georgian ExtBd:style=ExtraBold,Regular
- NotoSans-Black.ttf: Noto Sans,Noto Sans Blk:style=Black,Regular
- NotoSans-ExtraCondensedExtraBoldItalic.ttf: Noto Sans,Noto Sans ExtCond ExtBd:style=ExtraCondensed ExtraBold Italic,Italic
- NotoSansHebrew-ExtraCondensedThin.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansSymbols-Light.ttf: Noto Sans Symbols,Noto Sans Symbols Light:style=Light,Regular
- NotoSerifLao-ExtraBold.ttf: Noto Serif Lao,Noto Serif Lao ExtBd:style=ExtraBold,Regular
- NotoSansEthiopic-CondensedThin.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond Thin:style=Condensed Thin,Regular
- NotoSerifEthiopic-Medium.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Md:style=Medium,Regular
- NotoSerifMyanmar-CondensedThin.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond Thin:style=Condensed Thin,Regular
- NotoSansDevanagari-Medium.ttf: Noto Sans Devanagari,Noto Sans Devanagari Md:style=Medium,Regular
- NotoSerifMalayalam-Bold.ttf: Noto Serif Malayalam:style=Bold
- NotoSerifKhmer-Condensed.ttf: Noto Serif Khmer,Noto Serif Khmer Cond:style=Condensed,Regular
- NotoSansTamil-SemiCondensedExtraLight.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansDisplay-ExtraCondensedBlackItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond Blk:style=ExtraCondensed Black Italic,Italic
- NotoSerifHebrew-ExtraCondensedBlack.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansMono-SemiCondensedBlack.ttf: Noto Sans Mono,Noto Sans Mono SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansDisplay-CondensedThinItalic.ttf: Noto Sans Display,Noto Sans Disp Cond Thin:style=Condensed Thin Italic,Italic
- NotoSansCJKkr-Black.otf: Noto Sans CJK KR,Noto Sans CJK KR Black:style=Black,Regular
- NotoSansDevanagariUI-CondensedSemiBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn SmBd:style=Condensed SemiBold,Regular
- NotoSansKhmerUI-SemiCondensedLight.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond Light:style=SemiCondensed Light,Regular
- NotoSansKhmer-Thin.ttf: Noto Sans Khmer,Noto Sans Khmer Thin:style=Thin,Regular
- NotoSansArabic-CondensedThin.ttf: Noto Sans Arabic,Noto Sans Arabic Cond Thin:style=Condensed Thin,Regular
- NotoSansTamil-CondensedThin.ttf: Noto Sans Tamil,Noto Sans Tamil Cond Thin:style=Condensed Thin,Regular
- NotoSansArabicUI-CondensedSemiBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn SmBd:style=Condensed SemiBold,Regular
- NotoSerifHebrew-SemiCondensedExtraLight.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifEthiopic-CondensedLight.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn Lt:style=Condensed Light,Regular
- NotoSerifLao-Bold.ttf: Noto Serif Lao:style=Bold
- NotoSansKhmer-Black.ttf: Noto Sans Khmer,Noto Sans Khmer Blk:style=Black,Regular
- NotoSerifKhmer-CondensedBold.ttf: Noto Serif Khmer,Noto Serif Khmer Cond:style=Condensed Bold,Bold
- NotoSansThai-Thin.ttf: Noto Sans Thai,Noto Sans Thai Thin:style=Thin,Regular
- NotoSerifThai-Light.ttf: Noto Serif Thai,Noto Serif Thai Light:style=Light,Regular
- NimbusMonoPS-Italic.otf: Nimbus Mono PS:style=Italic
- NotoSans-SemiCondensedSemiBold.ttf: Noto Sans,Noto Sans SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansHebrew-SemiCondensedSemiBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansMono-Regular.ttf: Noto Sans Mono:style=Regular
- NotoSansGeorgian-SemiBold.ttf: Noto Sans Georgian,Noto Sans Georgian SemBd:style=SemiBold,Regular
- NotoSansDevanagari-ExtraBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari XBd:style=ExtraBold,Regular
- NotoSans-SemiCondensed.ttf: Noto Sans,Noto Sans SemCond:style=SemiCondensed,Regular
- NotoSansArabicUI-CondensedThin.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn Th:style=Condensed Thin,Regular
- NotoSerifGeorgian-ExtraBold.ttf: Noto Serif Georgian,Noto Serif Georgian XBd:style=ExtraBold,Regular
- NotoSerifTamil-ExtraCondensedLight.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond Light:style=ExtraCondensed Light,Regular
- P052-Italic.otf: P052:style=Italic
- URWGothic-BookOblique.t1: URW Gothic:style=Book Oblique
- NotoSerifKhmer-SemiBold.ttf: Noto Serif Khmer,Noto Serif Khmer SemBd:style=SemiBold,Regular
- NotoSansDisplay-CondensedItalic.ttf: Noto Sans Display,Noto Sans Disp Cond:style=Condensed Italic,Italic
- NotoSansGeorgian-Medium.ttf: Noto Sans Georgian,Noto Sans Georgian Med:style=Medium,Regular
- NotoSerifMyanmar-SemiCondensed.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond:style=SemiCondensed,Regular
- NotoSansArabicUI-SemiCondensedSemiBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn SmBd:style=SemiCondensed SemiBold,Regular
- NotoSansArabic-SemiCondensedLight.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond Light:style=SemiCondensed Light,Regular
- NotoSerifGeorgian-SemiCondensedThin.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn Th:style=SemiCondensed Thin,Regular
- NotoSansGeorgian-ExtraCondensedLight.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansLao-ExtraCondensedExtraBold.ttf: Noto Sans Lao,Noto Sans Lao ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansArmenian-CondensedBlack.ttf: Noto Sans Armenian,Noto Sans Armenian Cond Blk:style=Condensed Black,Regular
- NotoSerif-SemiCondensed.ttf: Noto Serif,Noto Serif SemCond:style=SemiCondensed,Regular
- NotoSansThaiUI-SemiBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemBd:style=SemiBold,Regular
- NotoSerifMyanmar-ExtraCondensedSemiBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansBengali-Black.ttf: Noto Sans Bengali,Noto Sans Bengali Blk:style=Black,Regular
- NotoSansTaiLe-Regular.ttf: Noto Sans Tai Le:style=Regular
- NotoSansArmenian-SemiCondensed.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond:style=SemiCondensed,Regular
- NotoSansSinhalaUI-ExtraCondensedExtraLight.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansMyanmar-SemiBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemBd:style=SemiBold,Regular
- NotoSansArmenian-Black.ttf: Noto Sans Armenian,Noto Sans Armenian Blk:style=Black,Regular
- NotoSerifHebrew-Bold.ttf: Noto Serif Hebrew:style=Bold
- NotoSansMyanmarUI-Regular.ttf: Noto Sans Myanmar UI:style=Regular
- NotoSansDevanagari-Thin.ttf: Noto Sans Devanagari,Noto Sans Devanagari Th:style=Thin,Regular
- NotoSerifDisplay-BoldItalic.ttf: Noto Serif Display,Noto Serif Disp:style=Bold Italic
- n021024l.pfb: Nimbus Roman No9 L:style=Medium Italic
- NotoSansThai-CondensedExtraLight.ttf: Noto Sans Thai,Noto Sans Thai Cond ExtLt:style=Condensed ExtraLight,Regular
- DejaVuSans.ttf: DejaVu Sans:style=Book
- NotoSerifDisplay-SemiCondensedExtraBold.ttf: Noto Serif Display,Noto Serif Disp SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NimbusSans-Regular.otf: Nimbus Sans:style=Regular
- NotoSansArmenian-CondensedLight.ttf: Noto Sans Armenian,Noto Sans Armenian Cond Light:style=Condensed Light,Regular
- NotoSansLaoUI-ExtraCondensedMedium.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSerif-ExtraBold.ttf: Noto Serif,Noto Serif ExtBd:style=ExtraBold,Regular
- NotoSans-CondensedBlack.ttf: Noto Sans,Noto Sans Cond Blk:style=Condensed Black,Regular
- NotoSansArmenian-SemiCondensedThin.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSerifCJKkr-Light.otf: Noto Serif CJK KR,Noto Serif CJK KR Light:style=Light,Regular
- NotoSansGeorgian-CondensedExtraLight.ttf: Noto Sans Georgian,Noto Sans Georgian Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansOriya-Regular.ttf: Noto Sans Oriya:style=Regular
- NotoSerifThai-ExtraCondensedExtraBold.ttf: Noto Serif Thai,Noto Serif Thai ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansEthiopic-CondensedBlack.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond Blk:style=Condensed Black,Regular
- NotoSerifArmenian-SemiCondensedBold.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn:style=SemiCondensed Bold,Bold
- NotoSansSinhalaUI-SemiCondensedLight.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond Light:style=SemiCondensed Light,Regular
- NotoSansKhmer-ExtraCondensedLight.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifTamil-Thin.ttf: Noto Serif Tamil,Noto Serif Tamil Thin:style=Thin,Regular
- NotoSansDevanagariUI-CondensedExtraLight.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn XLt:style=Condensed ExtraLight,Regular
- NotoSansTamilUI-SemiCondensed.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond:style=SemiCondensed,Regular
- NotoSansMyanmar-CondensedSemiBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansSymbols-Black.ttf: Noto Sans Symbols,Noto Sans Symbols Blk:style=Black,Regular
- NotoSerifArmenian-Thin.ttf: Noto Serif Armenian,Noto Serif Armenian Th:style=Thin,Regular
- NotoSansGothic-Regular.ttf: Noto Sans Gothic:style=Regular
- NotoSansTamilUI-SemiCondensedSemiBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSerifArmenian-Black.ttf: Noto Serif Armenian,Noto Serif Armenian Bk:style=Black,Regular
- NotoSansTamil-ExtraCondensedExtraBold.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- URWBookman-DemiItalic.t1: URW Bookman:style=Demi Italic
- NotoSansDisplay-SemiCondensedItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond:style=SemiCondensed Italic,Italic
- NotoSansKhmerUI-ExtraCondensedExtraLight.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansLaoUI-CondensedLight.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond Light:style=Condensed Light,Regular
- NotoSansSinhala-Bold.ttf: Noto Sans Sinhala:style=Bold
- NotoSerifKhmer-ExtraCondensedMedium.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond Med:style=ExtraCondensed Medium,Regular
- NimbusSansNarrow-Oblique.otf: Nimbus Sans Narrow:style=Oblique
- NotoSansSinhala-SemiCondensedBlack.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifTamil-ExtraCondensedExtraLight.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansArabic-ExtraCondensedThin.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifThai-CondensedSemiBold.ttf: Noto Serif Thai,Noto Serif Thai Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansSinhala-CondensedBlack.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond Blk:style=Condensed Black,Regular
- NotoSerif-SemiBoldItalic.ttf: Noto Serif,Noto Serif SemBd:style=SemiBold Italic,Italic
- NotoSansSinhalaUI-Black.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Blk:style=Black,Regular
- NotoSerifCJKtc-Light.otf: Noto Serif CJK TC,Noto Serif CJK TC Light:style=Light,Regular
- NotoSerifEthiopic-ExtraCondensedExtraLight.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn XLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansTamil-ExtraCondensedSemiBold.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifThai-ExtraCondensedLight.ttf: Noto Serif Thai,Noto Serif Thai ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifDisplay-ExtraCondensedBlack.ttf: Noto Serif Display,Noto Serif Disp ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansThaiUI-CondensedThin.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond Thin:style=Condensed Thin,Regular
- NotoSansBengali-ExtraBold.ttf: Noto Sans Bengali,Noto Sans Bengali ExtBd:style=ExtraBold,Regular
- NimbusSans-Regular.t1: Nimbus Sans:style=Regular
- NotoSansMyanmar-Bold.ttf: Noto Sans Myanmar:style=Bold
- NotoSansEthiopic-ExtraCondensedBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansEthiopic-Light.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Light:style=Light,Regular
- NotoSansDevanagariUI-ExtraCondensedLight.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn Lt:style=ExtraCondensed Light,Regular
- NotoSansBengaliUI-ExtraBold.ttf: Noto Sans Bengali UI,Noto Sans Bengali ExtBd:style=ExtraBold,Regular
- NotoSerifThai-Bold.ttf: Noto Serif Thai:style=Bold
- NotoSerifGeorgian-SemiCondensedBlack.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn Bk:style=SemiCondensed Black,Regular
- NotoSansSinhala-SemiBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemBd:style=SemiBold,Regular
- NotoSansLao-ExtraCondensedSemiBold.ttf: Noto Sans Lao,Noto Sans Lao ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- C059-Roman.otf: C059:style=Roman
- NotoSansArmenian-CondensedSemiBold.ttf: Noto Sans Armenian,Noto Sans Armenian Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansTamilUI-ExtraLight.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtLt:style=ExtraLight,Regular
- NotoSansCherokee-Thin.ttf: Noto Sans Cherokee,Noto Sans Cherokee Thin:style=Thin,Regular
- NotoSansDisplay-SemiBold.ttf: Noto Sans Display,Noto Sans Disp SemBd:style=SemiBold,Regular
- NotoSansDisplay-ExtraLightItalic.ttf: Noto Sans Display,Noto Sans Disp ExtLt:style=ExtraLight Italic,Italic
- NotoSansLinearB-Regular.ttf: Noto Sans Linear B:style=Regular
- NotoSansSinhalaUI-ExtraCondensedLight.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifEthiopic-Regular.ttf: Noto Serif Ethiopic:style=Regular
- NotoSansArabic-CondensedBlack.ttf: Noto Sans Arabic,Noto Sans Arabic Cond Blk:style=Condensed Black,Regular
- NotoSerifThai-ExtraCondensedThin.ttf: Noto Serif Thai,Noto Serif Thai ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifHebrew-Condensed.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond:style=Condensed,Regular
- NotoSansArabic-SemiCondensed.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond:style=SemiCondensed,Regular
- NotoSansMyanmar-ExtraCondensedSemiBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifLao-CondensedExtraBold.ttf: Noto Serif Lao,Noto Serif Lao Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansDevanagari-SemiCondensedBlack.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn Bk:style=SemiCondensed Black,Regular
- NotoSansKhmer-CondensedLight.ttf: Noto Sans Khmer,Noto Sans Khmer Cond Light:style=Condensed Light,Regular
- NotoSerifDisplay-SemiCondensedThin.ttf: Noto Serif Display,Noto Serif Disp SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansCJKjp-Thin.otf: Noto Sans CJK JP,Noto Sans CJK JP Thin:style=Thin,Regular
- NotoSansCJKkr-Light.otf: Noto Sans CJK KR,Noto Sans CJK KR Light:style=Light,Regular
- NotoSerifGeorgian-ExtraCondensed.ttf: Noto Serif Georgian,Noto Serif Georgian XCn:style=ExtraCondensed,Regular
- n021004l.pfb: Nimbus Roman No9 L:style=Medium
- NotoSerifHebrew-SemiCondensedExtraBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansSinhala-SemiCondensedExtraBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansKhmer-CondensedExtraLight.ttf: Noto Sans Khmer,Noto Sans Khmer Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansHebrew-ExtraBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtBd:style=ExtraBold,Regular
- NotoSansMyanmar-Condensed.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond:style=Condensed,Regular
- NotoSerifDisplay-ExtraCondensedItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond:style=ExtraCondensed Italic,Italic
- NotoSerifArmenian-Medium.ttf: Noto Serif Armenian,Noto Serif Armenian Md:style=Medium,Regular
- NimbusMonoPS-BoldItalic.otf: Nimbus Mono PS:style=Bold Italic
- NotoSansHebrew-ExtraCondensedLight.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifEthiopic-SemiBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmBd:style=SemiBold,Regular
- NotoSerifTamil-SemiCondensedThin.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSerifArmenian-ExtraCondensed.ttf: Noto Serif Armenian,Noto Serif Armenian XCn:style=ExtraCondensed,Regular
- NotoSansLaoUI-Light.ttf: Noto Sans Lao UI,Noto Sans Lao UI Light:style=Light,Regular
- NotoSerif-MediumItalic.ttf: Noto Serif,Noto Serif Med:style=Medium Italic,Italic
- NotoSansMyanmar-ExtraCondensedThin.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansSinhalaUI-CondensedThin.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond Thin:style=Condensed Thin,Regular
- NotoSerif-SemiCondensedExtraLightItalic.ttf: Noto Serif,Noto Serif SemCond ExtLt:style=SemiCondensed ExtraLight Italic,Italic
- NotoSerifHebrew-CondensedSemiBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansSinhala-ExtraCondensedBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond:style=ExtraCondensed Bold,Bold
- URWGothic-DemiOblique.t1: URW Gothic:style=Demi Oblique
- NotoSerifDisplay-SemiCondensedBlackItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond Blk:style=SemiCondensed Black Italic,Italic
- NotoSerifSinhala-SemiBold.ttf: Noto Serif Sinhala,Noto Serif Sinhala SemBd:style=SemiBold,Regular
- NotoSerifEthiopic-ExtraCondensed.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn:style=ExtraCondensed,Regular
- NotoSansEthiopic-SemiCondensedMedium.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansMyanmarUI-ExtraCondensedLight.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn Lt:style=ExtraCondensed Light,Regular
- NotoSerifThai-Black.ttf: Noto Serif Thai,Noto Serif Thai Blk:style=Black,Regular
- NotoSerifGeorgian-CondensedSemiBold.ttf: Noto Serif Georgian,Noto Serif Georgian Cn SmBd:style=Condensed SemiBold,Regular
- NotoSansDisplay-ExtraBold.ttf: Noto Sans Display,Noto Sans Disp ExtBd:style=ExtraBold,Regular
- NotoSerifDisplay-SemiCondensedMediumItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond Med:style=SemiCondensed Medium Italic,Italic
- NotoSerifThai-CondensedMedium.ttf: Noto Serif Thai,Noto Serif Thai Cond Med:style=Condensed Medium,Regular
- p052023l.pfb: URW Palladio L:style=Italic
- n022003l.pfb: Nimbus Mono L:style=Regular
- NotoSerifSinhala-Bold.ttf: Noto Serif Sinhala:style=Bold
- NotoSansLaoUI-Condensed.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond:style=Condensed,Regular
- NotoSerifTelugu-Bold.ttf: Noto Serif Telugu:style=Bold
- NotoSansArabicUI-SemiCondensedThin.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn Th:style=SemiCondensed Thin,Regular
- NotoSansGurmukhi-Bold.ttf: Noto Sans Gurmukhi:style=Bold
- NotoSansLao-CondensedThin.ttf: Noto Sans Lao,Noto Sans Lao Cond Thin:style=Condensed Thin,Regular
- NotoSansMono-SemiCondensedThin.ttf: Noto Sans Mono,Noto Sans Mono SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansDisplay-ExtraBoldItalic.ttf: Noto Sans Display,Noto Sans Disp ExtBd:style=ExtraBold Italic,Italic
- NotoSansHebrew-Thin.ttf: Noto Sans Hebrew,Noto Sans Hebrew Thin:style=Thin,Regular
- NotoSansKhmer-Light.ttf: Noto Sans Khmer,Noto Sans Khmer Light:style=Light,Regular
- NotoSansTamil-ExtraCondensedExtraLight.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifSinhala-Black.ttf: Noto Serif Sinhala,Noto Serif Sinhala Blk:style=Black,Regular
- NotoSansLao-Thin.ttf: Noto Sans Lao,Noto Sans Lao Thin:style=Thin,Regular
- NotoSans-CondensedBlackItalic.ttf: Noto Sans,Noto Sans Cond Blk:style=Condensed Black Italic,Italic
- NotoSerifLao-SemiCondensedSemiBold.ttf: Noto Serif Lao,Noto Serif Lao SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSans-ExtraCondensed.ttf: Noto Sans,Noto Sans ExtCond:style=ExtraCondensed,Regular
- NotoSansDisplay-CondensedBold.ttf: Noto Sans Display,Noto Sans Disp Cond:style=Condensed Bold,Bold
- NotoSansLao-ExtraCondensedLight.ttf: Noto Sans Lao,Noto Sans Lao ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifEthiopic-ExtraCondensedBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn:style=ExtraCondensed Bold,Bold
- NotoSansArabic-CondensedSemiBold.ttf: Noto Sans Arabic,Noto Sans Arabic Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansThaiUI-Thin.ttf: Noto Sans Thai UI,Noto Sans Thai UI Thin:style=Thin,Regular
- NotoSansLao-SemiCondensedBold.ttf: Noto Sans Lao,Noto Sans Lao SemCond:style=SemiCondensed Bold,Bold
- NotoSerifMyanmar-Regular.ttf: Noto Serif Myanmar:style=Regular
- NotoSansMyanmarUI-ExtraCondensedMedium.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn Md:style=ExtraCondensed Medium,Regular
- NotoSansDevanagari-SemiCondensedSemiBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn SmBd:style=SemiCondensed SemiBold,Regular
- NotoSansThaiUI-SemiCondensedBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond:style=SemiCondensed Bold,Bold
- NotoSerifGeorgian-ExtraCondensedLight.ttf: Noto Serif Georgian,Noto Serif Georgian XCn Lt:style=ExtraCondensed Light,Regular
- NotoSansShavian-Regular.ttf: Noto Sans Shavian:style=Regular
- NotoSansDevanagariUI-SemiCondensedSemiBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn SmBd:style=SemiCondensed SemiBold,Regular
- NotoSansArabic-ExtraCondensedBlack.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansGeorgian-CondensedMedium.ttf: Noto Sans Georgian,Noto Sans Georgian Cond Med:style=Condensed Medium,Regular
- NotoSerifHebrew-SemiCondensedSemiBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansArabic-CondensedLight.ttf: Noto Sans Arabic,Noto Sans Arabic Cond Light:style=Condensed Light,Regular
- NotoSansLaoUI-SemiCondensedMedium.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansOlChiki-Regular.ttf: Noto Sans Ol Chiki:style=Regular
- NotoSerif-ExtraCondensedSemiBold.ttf: Noto Serif,Noto Serif ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifArmenian-CondensedBlack.ttf: Noto Serif Armenian,Noto Serif Armenian Cn Bk:style=Condensed Black,Regular
- NotoSansDevanagari-Light.ttf: Noto Sans Devanagari,Noto Sans Devanagari Lt:style=Light,Regular
- NotoSansTamilUI-CondensedMedium.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond Med:style=Condensed Medium,Regular
- NotoSerifDisplay-ExtraCondensedSemiBold.ttf: Noto Serif Display,Noto Serif Disp ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansArabicUI-ExtraLight.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XLt:style=ExtraLight,Regular
- NotoSansMyanmarUI-SemiCondensedBlack.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn Bk:style=SemiCondensed Black,Regular
- NotoSansSinhala-Black.ttf: Noto Sans Sinhala,Noto Sans Sinhala Blk:style=Black,Regular
- NotoSerifEthiopic-SemiCondensedBlack.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn Bk:style=SemiCondensed Black,Regular
- NotoSansThai-SemiCondensedBold.ttf: Noto Sans Thai,Noto Sans Thai SemCond:style=SemiCondensed Bold,Bold
- NotoSansKhmer-SemiCondensedLight.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond Light:style=SemiCondensed Light,Regular
- NotoSansArmenian-ExtraBold.ttf: Noto Sans Armenian,Noto Sans Armenian ExtBd:style=ExtraBold,Regular
- NotoSansDevanagariUI-Medium.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Md:style=Medium,Regular
- NotoSerifHebrew-SemiCondensedBlack.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansMonoCJKtc-Regular.otf: Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Regular:style=Regular
- NotoSansNewTaiLue-Regular.ttf: Noto Sans New Tai Lue:style=Regular
- z003034l.pfb: URW Chancery L:style=Medium Italic
- NotoSansSinhala-ExtraCondensedExtraLight.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerif-ExtraCondensedLight.ttf: Noto Serif,Noto Serif ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifCJKtc-Medium.otf: Noto Serif CJK TC,Noto Serif CJK TC Medium:style=Medium,Regular
- NotoSerifGeorgian-SemiCondensed.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn:style=SemiCondensed,Regular
- NotoSansGeorgian-ExtraCondensedMedium.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansArmenian-Bold.ttf: Noto Sans Armenian:style=Bold
- NotoSerifDisplay-CondensedMedium.ttf: Noto Serif Display,Noto Serif Disp Cond Med:style=Condensed Medium,Regular
- NotoSerifTamil-SemiCondensedBold.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond:style=SemiCondensed Bold,Bold
- NotoSans-ExtraCondensedMediumItalic.ttf: Noto Sans,Noto Sans ExtCond Med:style=ExtraCondensed Medium Italic,Italic
- NotoSansTagalog-Regular.ttf: Noto Sans Tagalog:style=Regular
- NotoSansHanunoo-Regular.ttf: Noto Sans Hanunoo:style=Regular
- URWBookman-LightItalic.t1: URW Bookman:style=Light Italic
- NotoSerifTamil-Light.ttf: Noto Serif Tamil,Noto Serif Tamil Light:style=Light,Regular
- NotoSerifKhmer-SemiCondensedSemiBold.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NimbusSansNarrow-BoldOblique.otf: Nimbus Sans Narrow:style=Bold Oblique
- NotoSansKhmer-CondensedExtraBold.ttf: Noto Sans Khmer,Noto Sans Khmer Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansGeorgian-CondensedBold.ttf: Noto Sans Georgian,Noto Sans Georgian Cond:style=Condensed Bold,Bold
- NotoSansLao-Condensed.ttf: Noto Sans Lao,Noto Sans Lao Cond:style=Condensed,Regular
- NotoSansMono-ExtraCondensedBlack.ttf: Noto Sans Mono,Noto Sans Mono ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansHebrew-SemiCondensed.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond:style=SemiCondensed,Regular
- NotoSerifMyanmar-ExtraCondensed.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond:style=ExtraCondensed,Regular
- NotoSansLao-CondensedExtraLight.ttf: Noto Sans Lao,Noto Sans Lao Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansTamilUI-Condensed.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond:style=Condensed,Regular
- NotoSansMonoCJKtc-Bold.otf: Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Bold:style=Bold,Regular
- NotoSansMyanmarUI-SemiCondensedThin.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn Th:style=SemiCondensed Thin,Regular
- NotoSerif-SemiCondensedBold.ttf: Noto Serif,Noto Serif SemCond:style=SemiCondensed Bold,Bold
- NotoSansDisplay-ExtraCondensedMediumItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond Med:style=ExtraCondensed Medium Italic,Italic
- NotoSansBengaliUI-Regular.ttf: Noto Sans Bengali UI:style=Regular
- NotoColorEmoji.ttf: Noto Color Emoji:style=Regular
- NotoSansCham-ExtraBold.ttf: Noto Sans Cham,Noto Sans Cham ExtBd:style=ExtraBold,Regular
- NotoSansEthiopic-ExtraCondensedLight.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansCham-Light.ttf: Noto Sans Cham,Noto Sans Cham Light:style=Light,Regular
- NotoSerifMyanmar-SemiCondensedBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond:style=SemiCondensed Bold,Bold
- NotoSansGeorgian-SemiCondensedLight.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond Light:style=SemiCondensed Light,Regular
- NotoSerifHebrew-Thin.ttf: Noto Serif Hebrew,Noto Serif Hebrew Thin:style=Thin,Regular
- NotoSerifHebrew-Black.ttf: Noto Serif Hebrew,Noto Serif Hebrew Blk:style=Black,Regular
- NotoSerifGeorgian-ExtraCondensedSemiBold.ttf: Noto Serif Georgian,Noto Serif Georgian XCn SmBd:style=ExtraCondensed SemiBold,Regular
- NotoSansLaoUI-ExtraBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtBd:style=ExtraBold,Regular
- NotoSerifDisplay-ExtraCondensedExtraBold.ttf: Noto Serif Display,Noto Serif Disp ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerifGeorgian-Regular.ttf: Noto Serif Georgian:style=Regular
- NotoSerifDisplay-CondensedItalic.ttf: Noto Serif Display,Noto Serif Disp Cond:style=Condensed Italic,Italic
- NotoSansTamil-Thin.ttf: Noto Sans Tamil,Noto Sans Tamil Thin:style=Thin,Regular
- NotoSans-CondensedExtraBold.ttf: Noto Sans,Noto Sans Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansTelugu-Regular.ttf: Noto Sans Telugu:style=Regular
- NotoSansLaoUI-Regular.ttf: Noto Sans Lao UI:style=Regular
- NotoSansGeorgian-Bold.ttf: Noto Sans Georgian:style=Bold
- NotoSansArmenian-ExtraCondensedMedium.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansLaoUI-CondensedBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond:style=Condensed Bold,Bold
- NotoSerifDisplay-MediumItalic.ttf: Noto Serif Display,Noto Serif Disp Med:style=Medium Italic,Italic
- NotoSansArabicUI-CondensedBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn:style=Condensed Bold,Bold
- NotoSansBamum-Regular.ttf: Noto Sans Bamum:style=Regular
- NotoSerifCJKtc-Regular.otf: Noto Serif CJK TC:style=Regular
- NotoSerif-ExtraCondensedItalic.ttf: Noto Serif,Noto Serif ExtCond:style=ExtraCondensed Italic,Italic
- NotoSerifThai-CondensedExtraLight.ttf: Noto Serif Thai,Noto Serif Thai Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSerifThai-CondensedLight.ttf: Noto Serif Thai,Noto Serif Thai Cond Light:style=Condensed Light,Regular
- NotoSansGeorgian-ExtraCondensed.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond:style=ExtraCondensed,Regular
- NotoSansCJKkr-Thin.otf: Noto Sans CJK KR,Noto Sans CJK KR Thin:style=Thin,Regular
- NotoSansSinhalaUI-SemiBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemBd:style=SemiBold,Regular
- NotoSerif-SemiCondensedBlack.ttf: Noto Serif,Noto Serif SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansBengali-Medium.ttf: Noto Sans Bengali,Noto Sans Bengali Med:style=Medium,Regular
- NotoSansTamilUI-ExtraCondensedExtraLight.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansCJKkr-Medium.otf: Noto Sans CJK KR,Noto Sans CJK KR Medium:style=Medium,Regular
- NotoSansLao-Light.ttf: Noto Sans Lao,Noto Sans Lao Light:style=Light,Regular
- NotoSansHebrew-ExtraCondensedBlack.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSerifGeorgian-Light.ttf: Noto Serif Georgian,Noto Serif Georgian Lt:style=Light,Regular
- NotoSansLao-CondensedBlack.ttf: Noto Sans Lao,Noto Sans Lao Cond Blk:style=Condensed Black,Regular
- NotoSansMyanmar-SemiCondensedLight.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond Light:style=SemiCondensed Light,Regular
- NotoSerifHebrew-Regular.ttf: Noto Serif Hebrew:style=Regular
- NotoSansThai-SemiBold.ttf: Noto Sans Thai,Noto Sans Thai SemBd:style=SemiBold,Regular
- NotoSerif-ExtraCondensedBold.ttf: Noto Serif,Noto Serif ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansEthiopic-CondensedBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond:style=Condensed Bold,Bold
- NotoSerifGeorgian-Thin.ttf: Noto Serif Georgian,Noto Serif Georgian Th:style=Thin,Regular
- NotoSerifHebrew-ExtraCondensedSemiBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansThai-SemiCondensedThin.ttf: Noto Sans Thai,Noto Sans Thai SemCond Thin:style=SemiCondensed Thin,Regular
- c059013l.pfb: Century Schoolbook L:style=Roman
- NotoSans-SemiCondensedBold.ttf: Noto Sans,Noto Sans SemCond:style=SemiCondensed Bold,Bold
- NotoSansEthiopic-ExtraCondensedExtraLight.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansGeorgian-Black.ttf: Noto Sans Georgian,Noto Sans Georgian Blk:style=Black,Regular
- NimbusSansNarrow-BoldOblique.t1: Nimbus Sans Narrow:style=Bold Oblique
- NotoSerif-SemiCondensedLight.ttf: Noto Serif,Noto Serif SemCond Light:style=SemiCondensed Light,Regular
- NotoSansDisplay-CondensedLightItalic.ttf: Noto Sans Display,Noto Sans Disp Cond Light:style=Condensed Light Italic,Italic
- NotoSerifMyanmar-SemiCondensedExtraLight.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifMyanmar-CondensedLight.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond Light:style=Condensed Light,Regular
- NotoSansKhmer-SemiCondensedMedium.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond Med:style=SemiCondensed Medium,Regular
- NotoNaskhArabicUI-Regular.ttf: Noto Naskh Arabic UI:style=Regular
- NotoSansArmenian-ExtraCondensedExtraLight.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifKhmer-ExtraCondensedSemiBold.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NimbusSans-Bold.otf: Nimbus Sans:style=Bold
- NotoSansArmenian-SemiCondensedLight.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond Light:style=SemiCondensed Light,Regular
- NotoSansTamil-CondensedSemiBold.ttf: Noto Sans Tamil,Noto Sans Tamil Cond SemBd:style=Condensed SemiBold,Regular
- NotoSerifLao-SemiCondensedLight.ttf: Noto Serif Lao,Noto Serif Lao SemCond Light:style=SemiCondensed Light,Regular
- NotoSansSinhala-ExtraCondensed.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond:style=ExtraCondensed,Regular
- NotoSerifCJKsc-Medium.otf: Noto Serif CJK SC,Noto Serif CJK SC Medium:style=Medium,Regular
- NotoSansMono-ExtraCondensedMedium.ttf: Noto Sans Mono,Noto Sans Mono ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansThaiUI-ExtraCondensedBlack.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond Blk:style=ExtraCondensed Black,Regular
- NimbusMonoPS-Italic.t1: Nimbus Mono PS:style=Italic
- NotoSansDevanagari-Bold.ttf: Noto Sans Devanagari:style=Bold
- NotoSerif-SemiCondensedExtraBold.ttf: Noto Serif,Noto Serif SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansDisplay-SemiCondensedBold.ttf: Noto Sans Display,Noto Sans Disp SemCond:style=SemiCondensed Bold,Bold
- NotoSansCJKjp-DemiLight.otf: Noto Sans CJK JP,Noto Sans CJK JP DemiLight:style=DemiLight,Regular
- NotoSansEthiopic-SemiCondensed.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond:style=SemiCondensed,Regular
- NotoSansKhmer-CondensedBlack.ttf: Noto Sans Khmer,Noto Sans Khmer Cond Blk:style=Condensed Black,Regular
- NotoSansSinhala-SemiCondensed.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond:style=SemiCondensed,Regular
- NotoSerifMyanmar-SemiCondensedThin.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSerifTamil-Black.ttf: Noto Serif Tamil,Noto Serif Tamil Blk:style=Black,Regular
- NotoSerifDisplay-ExtraCondensedThinItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond Thin:style=ExtraCondensed Thin Italic,Italic
- NotoSerifDisplay-Condensed.ttf: Noto Serif Display,Noto Serif Disp Cond:style=Condensed,Regular
- NotoSansMyanmar-Medium.ttf: Noto Sans Myanmar,Noto Sans Myanmar Med:style=Medium,Regular
- NotoSansLao-CondensedMedium.ttf: Noto Sans Lao,Noto Sans Lao Cond Med:style=Condensed Medium,Regular
- NotoSansMono-SemiCondensedMedium.ttf: Noto Sans Mono,Noto Sans Mono SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansCJKsc-Thin.otf: Noto Sans CJK SC,Noto Sans CJK SC Thin:style=Thin,Regular
- NotoSansDisplay-Italic.ttf: Noto Sans Display,Noto Sans Disp:style=Italic
- NotoSansThaana-Regular.ttf: Noto Sans Thaana:style=Regular
- NotoSerifThai-SemiCondensed.ttf: Noto Serif Thai,Noto Serif Thai SemCond:style=SemiCondensed,Regular
- NimbusRoman-BoldItalic.t1: Nimbus Roman:style=Bold Italic
- NotoSansArabicUI-SemiCondensed.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn:style=SemiCondensed,Regular
- NotoSansSinhala-CondensedMedium.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond Med:style=Condensed Medium,Regular
- NotoSerifDisplay-CondensedLightItalic.ttf: Noto Serif Display,Noto Serif Disp Cond Light:style=Condensed Light Italic,Italic
- NotoSerifDisplay-CondensedBoldItalic.ttf: Noto Serif Display,Noto Serif Disp Cond:style=Condensed Bold Italic,Bold Italic
- NotoSansCherokee-ExtraLight.ttf: Noto Sans Cherokee,Noto Sans Cherokee ExtLt:style=ExtraLight,Regular
- NotoSansTelugu-Bold.ttf: Noto Sans Telugu:style=Bold
- NotoSansHebrew-SemiCondensedBlack.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansBengali-ExtraLight.ttf: Noto Sans Bengali,Noto Sans Bengali ExtLt:style=ExtraLight,Regular
- NotoSerifDisplay-CondensedExtraBoldItalic.ttf: Noto Serif Display,Noto Serif Disp Cond ExtBd:style=Condensed ExtraBold Italic,Italic
- NotoSansTaiViet-Regular.ttf: Noto Sans Tai Viet:style=Regular
- NotoSansThai-Regular.ttf: Noto Sans Thai:style=Regular
- NotoSansCJKsc-Bold.otf: Noto Sans CJK SC,Noto Sans CJK SC Bold:style=Bold,Regular
- NotoSerifLao-ExtraCondensedLight.ttf: Noto Serif Lao,Noto Serif Lao ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansArmenian-ExtraCondensedExtraBold.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerifTamil-ExtraCondensedSemiBold.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifEthiopic-ExtraCondensedBlack.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn Bk:style=ExtraCondensed Black,Regular
- NotoSansTamil-CondensedMedium.ttf: Noto Sans Tamil,Noto Sans Tamil Cond Med:style=Condensed Medium,Regular
- NotoSansBuhid-Regular.ttf: Noto Sans Buhid:style=Regular
- NotoSansTamilUI-Light.ttf: Noto Sans Tamil UI,Noto Sans Tamil Light:style=Light,Regular
- NotoSerifKhmer-Thin.ttf: Noto Serif Khmer,Noto Serif Khmer Thin:style=Thin,Regular
- NotoSansGeorgian-Thin.ttf: Noto Sans Georgian,Noto Sans Georgian Thin:style=Thin,Regular
- NotoSansCherokee-ExtraBold.ttf: Noto Sans Cherokee,Noto Sans Cherokee ExtBd:style=ExtraBold,Regular
- NotoSansKhmerUI-SemiCondensed.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond:style=SemiCondensed,Regular
- NotoSerifArmenian-SemiCondensedExtraBold.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn XBd:style=SemiCondensed ExtraBold,Regular
- Z003-MediumItalic.otf: Z003:style=Medium Italic
- NotoSansSymbols-Bold.ttf: Noto Sans Symbols:style=Bold
- NimbusSans-BoldItalic.otf: Nimbus Sans:style=Bold Italic
- NotoSansGeorgian-CondensedSemiBold.ttf: Noto Sans Georgian,Noto Sans Georgian Cond SemBd:style=Condensed SemiBold,Regular
- URWGothic-Book.otf: URW Gothic:style=Book
- NotoSansEthiopic-SemiCondensedLight.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond Light:style=SemiCondensed Light,Regular
- NotoSansMono-SemiCondensedLight.ttf: Noto Sans Mono,Noto Sans Mono SemCond Light:style=SemiCondensed Light,Regular
- NotoSansTamilUI-SemiBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemBd:style=SemiBold,Regular
- NotoSerifThai-Condensed.ttf: Noto Serif Thai,Noto Serif Thai Cond:style=Condensed,Regular
- NotoSerif-CondensedItalic.ttf: Noto Serif,Noto Serif Cond:style=Condensed Italic,Italic
- NotoSansDisplay-Black.ttf: Noto Sans Display,Noto Sans Disp Blk:style=Black,Regular
- NotoSansSinhala-CondensedExtraBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansSyriacEastern-Regular.ttf: Noto Sans Syriac Eastern:style=Regular
- NotoSansArabicUI-SemiCondensedLight.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn Lt:style=SemiCondensed Light,Regular
- NotoSerifLao-Black.ttf: Noto Serif Lao,Noto Serif Lao Blk:style=Black,Regular
- NotoSans-CondensedBold.ttf: Noto Sans,Noto Sans Cond:style=Condensed Bold,Bold
- NotoSansDisplay-CondensedMedium.ttf: Noto Sans Display,Noto Sans Disp Cond Med:style=Condensed Medium,Regular
- NotoSansGujaratiUI-Bold.ttf: Noto Sans Gujarati UI:style=Bold
- NotoSerif-SemiCondensedThin.ttf: Noto Serif,Noto Serif SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansThaiUI-Medium.ttf: Noto Sans Thai UI,Noto Sans Thai UI Med:style=Medium,Regular
- NotoSerifEthiopic-CondensedExtraLight.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn XLt:style=Condensed ExtraLight,Regular
- NotoSerif-ExtraCondensedMedium.ttf: Noto Serif,Noto Serif ExtCond Med:style=ExtraCondensed Medium,Regular
- d050000l.pfb: Dingbats:style=Regular
- NotoSerifCJKsc-Bold.otf: Noto Serif CJK SC:style=Bold
- NotoKufiArabic-Regular.ttf: Noto Kufi Arabic:style=Regular
- NotoSansGeorgian-ExtraCondensedExtraLight.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansMono-CondensedMedium.ttf: Noto Sans Mono,Noto Sans Mono Cond Med:style=Condensed Medium,Regular
- NotoSerifDisplay-LightItalic.ttf: Noto Serif Display,Noto Serif Disp Light:style=Light Italic,Italic
- NotoSansKhmer-ExtraCondensed.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond:style=ExtraCondensed,Regular
- NotoSansDisplay-ExtraCondensedMedium.ttf: Noto Sans Display,Noto Sans Disp ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansSinhala-ExtraLight.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtLt:style=ExtraLight,Regular
- NotoSansSundanese-Regular.ttf: Noto Sans Sundanese:style=Regular
- NotoSansGeorgian-SemiCondensedThin.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansCJKjp-Medium.otf: Noto Sans CJK JP,Noto Sans CJK JP Medium:style=Medium,Regular
- NotoSansEthiopic-SemiBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemBd:style=SemiBold,Regular
- NotoSansCham-ExtraLight.ttf: Noto Sans Cham,Noto Sans Cham ExtLt:style=ExtraLight,Regular
- NotoSansLepcha-Regular.ttf: Noto Sans Lepcha:style=Regular
- NotoSansEthiopic-Black.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Blk:style=Black,Regular
- NotoSansThaiUI-SemiCondensed.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond:style=SemiCondensed,Regular
- NotoSans-CondensedBoldItalic.ttf: Noto Sans,Noto Sans Cond:style=Condensed Bold Italic,Bold Italic
- NotoSansDisplay-SemiCondensedLightItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond Light:style=SemiCondensed Light Italic,Italic
- NotoSansRunic-Regular.ttf: Noto Sans Runic:style=Regular
- NotoSerifTamil-ExtraCondensedBlack.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansKhmerUI-CondensedBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond:style=Condensed Bold,Bold
- NotoSerifKhmer-ExtraCondensedBlack.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansTamil-CondensedExtraBold.ttf: Noto Sans Tamil,Noto Sans Tamil Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSerifTamil-Condensed.ttf: Noto Serif Tamil,Noto Serif Tamil Cond:style=Condensed,Regular
- NotoSansThai-Black.ttf: Noto Sans Thai,Noto Sans Thai Blk:style=Black,Regular
- NotoSansKhmer-Condensed.ttf: Noto Sans Khmer,Noto Sans Khmer Cond:style=Condensed,Regular
- NotoSansCanadianAboriginal-Regular.ttf: Noto Sans Canadian Aboriginal:style=Regular
- NotoSansSymbols-Medium.ttf: Noto Sans Symbols,Noto Sans Symbols Med:style=Medium,Regular
- NotoSerifDisplay-ExtraCondensedBoldItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond:style=ExtraCondensed Bold Italic,Bold Italic
- n021023l.pfb: Nimbus Roman No9 L:style=Regular Italic
- NotoSansTamilUI-SemiCondensedThin.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSerifLao-ExtraCondensed.ttf: Noto Serif Lao,Noto Serif Lao ExtCond:style=ExtraCondensed,Regular
- NotoSansTamilUI-Thin.ttf: Noto Sans Tamil UI,Noto Sans Tamil Thin:style=Thin,Regular
- NotoSansLaoUI-SemiBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemBd:style=SemiBold,Regular
- NotoSerif-ExtraCondensedLightItalic.ttf: Noto Serif,Noto Serif ExtCond Light:style=ExtraCondensed Light Italic,Italic
- NotoSansArabic-CondensedExtraBold.ttf: Noto Sans Arabic,Noto Sans Arabic Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansBengali-Thin.ttf: Noto Sans Bengali,Noto Sans Bengali Thin:style=Thin,Regular
- NotoSansLaoUI-SemiCondensed.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond:style=SemiCondensed,Regular
- NotoSansThaiUI-ExtraCondensedSemiBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerif-ExtraCondensed.ttf: Noto Serif,Noto Serif ExtCond:style=ExtraCondensed,Regular
- NotoSansSinhalaUI-ExtraBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtBd:style=ExtraBold,Regular
- NotoSerifArmenian-SemiCondensed.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn:style=SemiCondensed,Regular
- NotoSansDisplay-ExtraCondensedExtraBoldItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond ExtBd:style=ExtraCondensed ExtraBold Italic,Italic
- NotoSansDevanagari-SemiCondensedBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn:style=SemiCondensed Bold,Bold
- NotoSansGeorgian-ExtraLight.ttf: Noto Sans Georgian,Noto Sans Georgian ExtLt:style=ExtraLight,Regular
- NotoSansMono-CondensedExtraLight.ttf: Noto Sans Mono,Noto Sans Mono Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansArabicUI-Light.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Lt:style=Light,Regular
- NotoSansArabicUI-ExtraCondensedBlack.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn Bk:style=ExtraCondensed Black,Regular
- NotoSansArabicUI-SemiCondensedMedium.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn Md:style=SemiCondensed Medium,Regular
- NotoSerifArmenian-SemiCondensedSemiBold.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn SmBd:style=SemiCondensed SemiBold,Regular
- NotoSansTamil-CondensedBold.ttf: Noto Sans Tamil,Noto Sans Tamil Cond:style=Condensed Bold,Bold
- NotoSansTamilUI-CondensedSemiBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansMyanmarUI-CondensedLight.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn Lt:style=Condensed Light,Regular
- NotoSerifMyanmar-SemiCondensedBlack.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifThai-SemiCondensedBlack.ttf: Noto Serif Thai,Noto Serif Thai SemCond Blk:style=SemiCondensed Black,Regular
- D050000L.otf: D050000L:style=Regular
- NotoSansArabicUI-Condensed.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn:style=Condensed,Regular
- NotoSansTamilUI-ExtraCondensed.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond:style=ExtraCondensed,Regular
- NotoSerifGeorgian-SemiCondensedLight.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn Lt:style=SemiCondensed Light,Regular
- NotoSansSinhalaUI-ExtraCondensedSemiBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansMyanmar-SemiCondensedExtraLight.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansMyanmarUI-ExtraCondensedBlack.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn Bk:style=ExtraCondensed Black,Regular
- NotoSansDisplay-ExtraCondensedExtraLight.ttf: Noto Sans Display,Noto Sans Disp ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansHebrew-ExtraLight.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtLt:style=ExtraLight,Regular
- NotoSansCJKtc-Regular.otf: Noto Sans CJK TC,Noto Sans CJK TC Regular:style=Regular
- NotoSansTamil-Bold.ttf: Noto Sans Tamil:style=Bold
- NotoSansTamil-Medium.ttf: Noto Sans Tamil,Noto Sans Tamil Med:style=Medium,Regular
- NotoSerifCJKtc-Black.otf: Noto Serif CJK TC,Noto Serif CJK TC Black:style=Black,Regular
- NotoSansDevanagari-ExtraCondensedLight.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn Lt:style=ExtraCondensed Light,Regular
- NotoSansLaoUI-SemiCondensedBlack.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansHebrew-CondensedLight.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond Light:style=Condensed Light,Regular
- NotoSansAnatolianHieroglyphs-Regular.ttf: Noto Sans Anatolian Hieroglyphs,Noto Sans AnatoHiero:style=Regular
- NotoSansLaoUI-ExtraCondensed.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond:style=ExtraCondensed,Regular
- NotoSansLaoUI-Medium.ttf: Noto Sans Lao UI,Noto Sans Lao UI Med:style=Medium,Regular
- NotoSans-ExtraBoldItalic.ttf: Noto Sans,Noto Sans ExtBd:style=ExtraBold Italic,Italic
- NotoSans-Italic.ttf: Noto Sans:style=Italic
- NotoSansSaurashtra-Regular.ttf: Noto Sans Saurashtra:style=Regular
- NotoSansThai-SemiCondensed.ttf: Noto Sans Thai,Noto Sans Thai SemCond:style=SemiCondensed,Regular
- NotoSansDevanagari-CondensedLight.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn Lt:style=Condensed Light,Regular
- NotoSansGeorgian-CondensedBlack.ttf: Noto Sans Georgian,Noto Sans Georgian Cond Blk:style=Condensed Black,Regular
- NotoSansMyanmarUI-Light.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Lt:style=Light,Regular
- NotoSansThaiUI-CondensedLight.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond Light:style=Condensed Light,Regular
- NotoSerifThai-ExtraCondensedExtraLight.ttf: Noto Serif Thai,Noto Serif Thai ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifMyanmar-ExtraCondensedBlack.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansArabic-SemiCondensedThin.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansDisplay-Condensed.ttf: Noto Sans Display,Noto Sans Disp Cond:style=Condensed,Regular
- NotoSerifSinhala-Thin.ttf: Noto Serif Sinhala,Noto Serif Sinhala Thin:style=Thin,Regular
- NotoSansDevanagari-Condensed.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn:style=Condensed,Regular
- NotoSansTamil-CondensedExtraLight.ttf: Noto Sans Tamil,Noto Sans Tamil Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansMyanmar-SemiCondensedMedium.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond Med:style=SemiCondensed Medium,Regular
- n019063l.pfb: Nimbus Sans L:style=Regular Condensed Italic
- NotoSerifDisplay-Regular.ttf: Noto Serif Display,Noto Serif Disp:style=Regular
- NotoSansLao-ExtraCondensedMedium.ttf: Noto Sans Lao,Noto Sans Lao ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansEgyptianHieroglyphs-Regular.ttf: Noto Sans Egyptian Hieroglyphs,Noto Sans EgyptHiero:style=Regular
- NotoSansTamil-ExtraCondensed.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond:style=ExtraCondensed,Regular
- NotoSerifHebrew-ExtraCondensedLight.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSans-SemiCondensedExtraLightItalic.ttf: Noto Sans,Noto Sans SemCond ExtLt:style=SemiCondensed ExtraLight Italic,Italic
- C059-BdIta.otf: C059:style=Bold Italic
- NotoSansSylotiNagri-Regular.ttf: Noto Sans Syloti Nagri:style=Regular
- NotoSansTamil-ExtraCondensedBlack.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSerifThai-SemiCondensedMedium.ttf: Noto Serif Thai,Noto Serif Thai SemCond Med:style=SemiCondensed Medium,Regular
- NotoSerif-CondensedLightItalic.ttf: Noto Serif,Noto Serif Cond Light:style=Condensed Light Italic,Italic
- DejaVuSans-Bold.ttf: DejaVu Sans:style=Bold
- NotoSansThai-Medium.ttf: Noto Sans Thai,Noto Sans Thai Med:style=Medium,Regular
- NotoSansDevanagariUI-ExtraCondensedBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn:style=ExtraCondensed Bold,Bold
- NotoSansThaiUI-SemiCondensedExtraLight.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansTamil-Condensed.ttf: Noto Sans Tamil,Noto Sans Tamil Cond:style=Condensed,Regular
- NotoSans-ExtraCondensedLightItalic.ttf: Noto Sans,Noto Sans ExtCond Light:style=ExtraCondensed Light Italic,Italic
- NotoSansLao-Regular.ttf: Noto Sans Lao:style=Regular
- NotoSerifArmenian-Condensed.ttf: Noto Serif Armenian,Noto Serif Armenian Cn:style=Condensed,Regular
- NotoSerifDisplay-Italic.ttf: Noto Serif Display,Noto Serif Disp:style=Italic
- NotoSansSinhala-SemiCondensedMedium.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond Med:style=SemiCondensed Medium,Regular
- NotoSans-CondensedExtraBoldItalic.ttf: Noto Sans,Noto Sans Cond ExtBd:style=Condensed ExtraBold Italic,Italic
- NotoSerifTamil-CondensedMedium.ttf: Noto Serif Tamil,Noto Serif Tamil Cond Med:style=Condensed Medium,Regular
- NotoSansThaiUI-Condensed.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond:style=Condensed,Regular
- NotoSansMono-CondensedThin.ttf: Noto Sans Mono,Noto Sans Mono Cond Thin:style=Condensed Thin,Regular
- NotoSans-CondensedExtraLight.ttf: Noto Sans,Noto Sans Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansDevanagari-ExtraCondensedThin.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn Th:style=ExtraCondensed Thin,Regular
- NotoSerifGujarati-Regular.ttf: Noto Serif Gujarati:style=Regular
- NotoSerifMyanmar-ExtraCondensedLight.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansArabicUI-CondensedBlack.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn Bk:style=Condensed Black,Regular
- NotoSansKhmer-ExtraCondensedExtraBold.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerifGeorgian-CondensedBlack.ttf: Noto Serif Georgian,Noto Serif Georgian Cn Bk:style=Condensed Black,Regular
- NotoSansSinhala-ExtraCondensedExtraBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerifEthiopic-SemiCondensedExtraBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn XBd:style=SemiCondensed ExtraBold,Regular
- NotoSansMyanmar-SemiCondensedExtraBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansCherokee-Medium.ttf: Noto Sans Cherokee,Noto Sans Cherokee Med:style=Medium,Regular
- NotoSerifDevanagari-Bold.ttf: Noto Serif Devanagari:style=Bold
- NotoSansGeorgian-ExtraCondensedBold.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansMeeteiMayek-Regular.ttf: Noto Sans Meetei Mayek:style=Regular
- NotoSansThaana-Bold.ttf: Noto Sans Thaana:style=Bold
- NotoSansKannada-Bold.ttf: Noto Sans Kannada:style=Bold
- NotoSerifKhmer-CondensedExtraBold.ttf: Noto Serif Khmer,Noto Serif Khmer Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansDevanagari-SemiBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmBd:style=SemiBold,Regular
- NotoSansKhmerUI-SemiBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemBd:style=SemiBold,Regular
- NotoSansSinhalaUI-SemiCondensedMedium.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansDevanagariUI-SemiCondensedLight.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn Lt:style=SemiCondensed Light,Regular
- NotoSansDevanagariUI-ExtraBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XBd:style=ExtraBold,Regular
- NotoSerifThai-SemiCondensedExtraBold.ttf: Noto Serif Thai,Noto Serif Thai SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansDisplay-Light.ttf: Noto Sans Display,Noto Sans Disp Light:style=Light,Regular
- NotoSansEthiopic-Condensed.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond:style=Condensed,Regular
- NotoSerifMyanmar-SemiCondensedExtraBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansMyanmar-ExtraCondensed.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond:style=ExtraCondensed,Regular
- NotoSansArabicUI-SemiBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmBd:style=SemiBold,Regular
- NotoSerif-ThinItalic.ttf: Noto Serif,Noto Serif Thin:style=Thin Italic,Italic
- NotoSansArabicUI-ExtraCondensedThin.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn Th:style=ExtraCondensed Thin,Regular
- NotoSansKhmer-SemiCondensedExtraLight.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- a010013l.pfb: URW Gothic L:style=Book
- NotoSansDevanagari-CondensedThin.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn Th:style=Condensed Thin,Regular
- NotoSerifThai-SemiCondensedExtraLight.ttf: Noto Serif Thai,Noto Serif Thai SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansKhmerUI-CondensedThin.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond Thin:style=Condensed Thin,Regular
- NotoSansArabicUI-ExtraCondensed.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn:style=ExtraCondensed,Regular
- NotoSerif-CondensedThin.ttf: Noto Serif,Noto Serif Cond Thin:style=Condensed Thin,Regular
- NotoSerifDisplay-BlackItalic.ttf: Noto Serif Display,Noto Serif Disp Blk:style=Black Italic,Italic
- NotoSansImperialAramaic-Regular.ttf: Noto Sans Imperial Aramaic,Noto Sans ImpAramaic:style=Regular
- NotoSansSinhalaUI-ExtraCondensedBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifLao-CondensedMedium.ttf: Noto Serif Lao,Noto Serif Lao Cond Med:style=Condensed Medium,Regular
- NotoSansArabic-Thin.ttf: Noto Sans Arabic,Noto Sans Arabic Thin:style=Thin,Regular
- NotoSansHebrew-CondensedMedium.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond Med:style=Condensed Medium,Regular
- NotoSansEthiopic-Medium.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Med:style=Medium,Regular
- NotoSerifLao-SemiCondensedExtraLight.ttf: Noto Serif Lao,Noto Serif Lao SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSans-CondensedItalic.ttf: Noto Sans,Noto Sans Cond:style=Condensed Italic,Italic
- NotoSansCJKjp-Light.otf: Noto Sans CJK JP,Noto Sans CJK JP Light:style=Light,Regular
- NimbusRoman-Regular.otf: Nimbus Roman:style=Regular
- NotoSansDevanagariUI-ExtraCondensedMedium.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn Md:style=ExtraCondensed Medium,Regular
- NotoSansThaiUI-ExtraCondensedExtraLight.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifLao-ExtraCondensedBold.ttf: Noto Serif Lao,Noto Serif Lao ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifTamil-ExtraBold.ttf: Noto Serif Tamil,Noto Serif Tamil ExtBd:style=ExtraBold,Regular
- NotoSerifThai-ExtraCondensedSemiBold.ttf: Noto Serif Thai,Noto Serif Thai ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansLao-ExtraBold.ttf: Noto Sans Lao,Noto Sans Lao ExtBd:style=ExtraBold,Regular
- NotoSerifMyanmar-SemiCondensedSemiBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansDisplay-ThinItalic.ttf: Noto Sans Display,Noto Sans Disp Thin:style=Thin Italic,Italic
- NotoSansKhmerUI-ExtraCondensedBlack.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansEthiopic-Regular.ttf: Noto Sans Ethiopic:style=Regular
- NotoSansOsage-Regular.ttf: Noto Sans Osage:style=Regular
- NotoSans-ExtraCondensedSemiBold.ttf: Noto Sans,Noto Sans ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerif-ExtraCondensedMediumItalic.ttf: Noto Serif,Noto Serif ExtCond Med:style=ExtraCondensed Medium Italic,Italic
- NotoSerifKhmer-SemiCondensedThin.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansArmenian-Thin.ttf: Noto Sans Armenian,Noto Sans Armenian Thin:style=Thin,Regular
- C059-Italic.otf: C059:style=Italic
- NotoSerifMyanmar-ExtraCondensedExtraLight.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifKhmer-CondensedThin.ttf: Noto Serif Khmer,Noto Serif Khmer Cond Thin:style=Condensed Thin,Regular
- NotoNastaliqUrdu-Regular.ttf: Noto Nastaliq Urdu:style=Regular
- NotoSansMyanmar-SemiCondensedBlack.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifDisplay-ExtraCondensedBlackItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond Blk:style=ExtraCondensed Black Italic,Italic
- NotoSerifThai-ExtraBold.ttf: Noto Serif Thai,Noto Serif Thai ExtBd:style=ExtraBold,Regular
- NotoSerifEthiopic-CondensedMedium.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn Md:style=Condensed Medium,Regular
- NotoSerifMyanmar-ExtraCondensedThin.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansLao-ExtraCondensedBold.ttf: Noto Sans Lao,Noto Sans Lao ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansLisu-Regular.ttf: Noto Sans Lisu:style=Regular
- NotoSansThai-CondensedSemiBold.ttf: Noto Sans Thai,Noto Sans Thai Cond SemBd:style=Condensed SemiBold,Regular
- NotoSerifTamil-SemiCondensedMedium.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond Med:style=SemiCondensed Medium,Regular
- NotoSerifLao-SemiCondensedBlack.ttf: Noto Serif Lao,Noto Serif Lao SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansSinhalaUI-CondensedExtraLight.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSans-SemiCondensedMedium.ttf: Noto Sans,Noto Sans SemCond Med:style=SemiCondensed Medium,Regular
- NimbusMonoPS-Bold.otf: Nimbus Mono PS:style=Bold
- NimbusRoman-Bold.otf: Nimbus Roman:style=Bold
- NotoSansKhmerUI-CondensedExtraBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSerifCJKsc-ExtraLight.otf: Noto Serif CJK SC,Noto Serif CJK SC ExtraLight:style=ExtraLight,Regular
- NotoSansMalayalamUI-Regular.ttf: Noto Sans Malayalam UI:style=Regular
- NotoSerifKhmer-SemiCondensedLight.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond Light:style=SemiCondensed Light,Regular
- NotoSansDisplay-ExtraCondensedExtraBold.ttf: Noto Sans Display,Noto Sans Disp ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansEthiopic-CondensedMedium.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond Med:style=Condensed Medium,Regular
- NotoSerifDisplay-ExtraCondensedLightItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond Light:style=ExtraCondensed Light Italic,Italic
- NotoSansArabicUI-CondensedExtraBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn XBd:style=Condensed ExtraBold,Regular
- NimbusSansNarrow-Bold.t1: Nimbus Sans Narrow:style=Bold
- NotoSansArabicUI-SemiCondensedExtraLight.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn XLt:style=SemiCondensed ExtraLight,Regular
- NotoSansLaoUI-CondensedMedium.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond Med:style=Condensed Medium,Regular
- NotoSans-SemiCondensedThin.ttf: Noto Sans,Noto Sans SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSerifHebrew-SemiCondensedBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond:style=SemiCondensed Bold,Bold
- NotoSansTamilUI-ExtraCondensedBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifHebrew-ExtraCondensedExtraBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NimbusRoman-BoldItalic.otf: Nimbus Roman:style=Bold Italic
- NotoSansKhmerUI-CondensedLight.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond Light:style=Condensed Light,Regular
- NotoSansSinhalaUI-CondensedBlack.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond Blk:style=Condensed Black,Regular
- NotoSansGurmukhiUI-Regular.ttf: Noto Sans Gurmukhi UI:style=Regular
- NotoSansTamil-SemiCondensedBold.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond:style=SemiCondensed Bold,Bold
- NotoSansDevanagari-SemiCondensed.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn:style=SemiCondensed,Regular
- NotoSans-SemiCondensedItalic.ttf: Noto Sans,Noto Sans SemCond:style=SemiCondensed Italic,Italic
- NotoSansTamil-ExtraBold.ttf: Noto Sans Tamil,Noto Sans Tamil ExtBd:style=ExtraBold,Regular
- NotoSerifKannada-Bold.ttf: Noto Serif Kannada:style=Bold
- NotoSansMyanmarUI-SemiCondensedExtraBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn XBd:style=SemiCondensed ExtraBold,Regular
- NotoSerifKhmer-SemiCondensedMedium.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansGeorgian-ExtraCondensedThin.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansGujarati-Bold.ttf: Noto Sans Gujarati:style=Bold
- NotoSerif-Black.ttf: Noto Serif,Noto Serif Blk:style=Black,Regular
- NotoSansSymbols-ExtraLight.ttf: Noto Sans Symbols,Noto Sans Symbols ExtLt:style=ExtraLight,Regular
- NotoSerifHebrew-ExtraBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtBd:style=ExtraBold,Regular
- NotoSerifSinhala-Regular.ttf: Noto Serif Sinhala:style=Regular
- NotoSerifGeorgian-SemiBold.ttf: Noto Serif Georgian,Noto Serif Georgian SmBd:style=SemiBold,Regular
- NotoSansTamil-CondensedLight.ttf: Noto Sans Tamil,Noto Sans Tamil Cond Light:style=Condensed Light,Regular
- NotoSerifDisplay-SemiCondensedExtraBoldItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond ExtBd:style=SemiCondensed ExtraBold Italic,Italic
- NotoSansDevanagari-Black.ttf: Noto Sans Devanagari,Noto Sans Devanagari Bk:style=Black,Regular
- NotoSansThaiUI-CondensedExtraBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSerifEthiopic-ExtraCondensedThin.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn Th:style=ExtraCondensed Thin,Regular
- n019064l.pfb: Nimbus Sans L:style=Bold Condensed Italic
- NotoSerifEthiopic-CondensedSemiBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn SmBd:style=Condensed SemiBold,Regular
- NotoSansDevanagariUI-ExtraCondensed.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn:style=ExtraCondensed,Regular
- NotoSerif-BlackItalic.ttf: Noto Serif,Noto Serif Blk:style=Black Italic,Italic
- NotoSerifMyanmar-CondensedExtraLight.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSerifMyanmar-SemiCondensedMedium.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond Med:style=SemiCondensed Medium,Regular
- NotoSans-ExtraCondensedBlack.ttf: Noto Sans,Noto Sans ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansMalayalamUI-Bold.ttf: Noto Sans Malayalam UI:style=Bold
- NotoSansEthiopic-SemiCondensedBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond:style=SemiCondensed Bold,Bold
- NotoSans-CondensedSemiBold.ttf: Noto Sans,Noto Sans Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansThai-SemiCondensedExtraBold.ttf: Noto Sans Thai,Noto Sans Thai SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSerifEthiopic-SemiCondensedMedium.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn Md:style=SemiCondensed Medium,Regular
- NotoSansSinhala-Light.ttf: Noto Sans Sinhala,Noto Sans Sinhala Light:style=Light,Regular
- NotoSansGujarati-Regular.ttf: Noto Sans Gujarati:style=Regular
- NotoSerif-ExtraCondensedExtraLightItalic.ttf: Noto Serif,Noto Serif ExtCond ExtLt:style=ExtraCondensed ExtraLight Italic,Italic
- NotoSansGeorgian-SemiCondensed.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond:style=SemiCondensed,Regular
- NotoSerifEthiopic-SemiCondensedExtraLight.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn XLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifGeorgian-CondensedExtraLight.ttf: Noto Serif Georgian,Noto Serif Georgian Cn XLt:style=Condensed ExtraLight,Regular
- NotoSerifLao-SemiCondensedMedium.ttf: Noto Serif Lao,Noto Serif Lao SemCond Med:style=SemiCondensed Medium,Regular
- DroidSansFallbackFull.ttf: Droid Sans Fallback:style=Regular
- NotoSansLaoUI-ExtraCondensedThin.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansMyanmar-SemiCondensedSemiBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansTamilUI-CondensedExtraBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSerifLao-SemiCondensedThin.ttf: Noto Serif Lao,Noto Serif Lao SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansOldSouthArabian-Regular.ttf: Noto Sans Old South Arabian,Noto Sans OldSouArab:style=Regular
- p052004l.pfb: URW Palladio L:style=Bold
- NotoSansMyanmarUI-CondensedThin.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn Th:style=Condensed Thin,Regular
- NotoSansLao-SemiCondensedSemiBold.ttf: Noto Sans Lao,Noto Sans Lao SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansLaoUI-SemiCondensedThin.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSerifGeorgian-ExtraCondensedExtraLight.ttf: Noto Serif Georgian,Noto Serif Georgian XCn XLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansArabic-SemiCondensedBlack.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansTamilUI-ExtraCondensedMedium.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansEthiopic-SemiCondensedThin.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSans-CondensedMediumItalic.ttf: Noto Sans,Noto Sans Cond Med:style=Condensed Medium Italic,Italic
- NotoSansHebrew-SemiBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemBd:style=SemiBold,Regular
- NotoSansTamilUI-ExtraBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtBd:style=ExtraBold,Regular
- NotoSerifKhmer-ExtraCondensedExtraBold.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerifDisplay-SemiCondensedBlack.ttf: Noto Serif Display,Noto Serif Disp SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifTamil-Regular.ttf: Noto Serif Tamil:style=Regular
- NotoSansCJKkr-DemiLight.otf: Noto Sans CJK KR,Noto Sans CJK KR DemiLight:style=DemiLight,Regular
- NotoSerifDisplay-ExtraCondensedExtraLight.ttf: Noto Serif Display,Noto Serif Disp ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansArabic-Regular.ttf: Noto Sans Arabic:style=Regular
- NotoSansNKo-Regular.ttf: Noto Sans NKo,Noto Sans N'Ko:style=Regular
- NotoSansKhmerUI-ExtraLight.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtLt:style=ExtraLight,Regular
- NotoSansMyanmar-CondensedLight.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond Light:style=Condensed Light,Regular
- NotoSansDisplay-SemiCondensedExtraLight.ttf: Noto Sans Display,Noto Sans Disp SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansSinhalaUI-Bold.ttf: Noto Sans Sinhala UI:style=Bold
- NotoSans-CondensedMedium.ttf: Noto Sans,Noto Sans Cond Med:style=Condensed Medium,Regular
- NotoSansDisplay-CondensedSemiBold.ttf: Noto Sans Display,Noto Sans Disp Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansLao-ExtraCondensedExtraLight.ttf: Noto Sans Lao,Noto Sans Lao ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifKhmer-Light.ttf: Noto Serif Khmer,Noto Serif Khmer Light:style=Light,Regular
- NotoSansSinhalaUI-SemiCondensed.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond:style=SemiCondensed,Regular
- NotoSerif-CondensedBold.ttf: Noto Serif,Noto Serif Cond:style=Condensed Bold,Bold
- NotoSansDevanagariUI-ExtraCondensedExtraBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn XBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansEthiopic-Bold.ttf: Noto Sans Ethiopic:style=Bold
- NotoSansGeorgian-SemiCondensedSemiBold.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSerif-ExtraLightItalic.ttf: Noto Serif,Noto Serif ExtLt:style=ExtraLight Italic,Italic
- C059-Roman.t1: C059:style=Roman
- NotoSerifMyanmar-CondensedExtraBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansDevanagariUI-CondensedBlack.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn Bk:style=Condensed Black,Regular
- NotoSansKhmerUI-SemiCondensedSemiBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansKannadaUI-Regular.ttf: Noto Sans Kannada UI:style=Regular
- NotoSansSinhala-ExtraCondensedSemiBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansOsmanya-Regular.ttf: Noto Sans Osmanya:style=Regular
- NotoSerifGeorgian-ExtraCondensedThin.ttf: Noto Serif Georgian,Noto Serif Georgian XCn Th:style=ExtraCondensed Thin,Regular
- NotoSansKhmerUI-SemiCondensedThin.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansArabicUI-Thin.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Th:style=Thin,Regular
- NotoSerifArmenian-ExtraCondensedBlack.ttf: Noto Serif Armenian,Noto Serif Armenian XCn Bk:style=ExtraCondensed Black,Regular
- NotoSerifMyanmar-CondensedMedium.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond Med:style=Condensed Medium,Regular
- NotoSansDevanagariUI-SemiCondensedThin.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn Th:style=SemiCondensed Thin,Regular
- NotoSansMyanmar-CondensedExtraBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansTamil-SemiCondensedExtraBold.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansLao-CondensedBold.ttf: Noto Sans Lao,Noto Sans Lao Cond:style=Condensed Bold,Bold
- NotoSerifGeorgian-CondensedExtraBold.ttf: Noto Serif Georgian,Noto Serif Georgian Cn XBd:style=Condensed ExtraBold,Regular
- NotoSansSinhalaUI-Medium.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Med:style=Medium,Regular
- NotoSansMono-CondensedBold.ttf: Noto Sans Mono,Noto Sans Mono Cond:style=Condensed Bold,Bold
- NotoSansArabicUI-SemiCondensedExtraBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn XBd:style=SemiCondensed ExtraBold,Regular
- NotoSans-MediumItalic.ttf: Noto Sans,Noto Sans Med:style=Medium Italic,Italic
- NotoSansArabic-SemiBold.ttf: Noto Sans Arabic,Noto Sans Arabic SemBd:style=SemiBold,Regular
- NotoSansAdlamUnjoined-Regular.ttf: Noto Sans Adlam Unjoined:style=Regular
- NotoSansArmenian-SemiCondensedSemiBold.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansSymbols-ExtraBold.ttf: Noto Sans Symbols,Noto Sans Symbols ExtBd:style=ExtraBold,Regular
- NotoSansThai-ExtraCondensedBold.ttf: Noto Sans Thai,Noto Sans Thai ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansTamilUI-CondensedLight.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond Light:style=Condensed Light,Regular
- NotoSansLycian-Regular.ttf: Noto Sans Lycian:style=Regular
- NotoSansDisplay-CondensedLight.ttf: Noto Sans Display,Noto Sans Disp Cond Light:style=Condensed Light,Regular
- NotoSansGeorgian-SemiCondensedBold.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond:style=SemiCondensed Bold,Bold
- NotoSerifCJKjp-ExtraLight.otf: Noto Serif CJK JP,Noto Serif CJK JP ExtraLight:style=ExtraLight,Regular
- NimbusRoman-Italic.t1: Nimbus Roman:style=Italic
- NotoSerifDisplay-ExtraCondensedSemiBoldItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond SemBd:style=ExtraCondensed SemiBold Italic,Italic
- NotoSansThai-SemiCondensedSemiBold.ttf: Noto Sans Thai,Noto Sans Thai SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansMono-ExtraCondensedThin.ttf: Noto Sans Mono,Noto Sans Mono ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifThai-ExtraCondensedBlack.ttf: Noto Serif Thai,Noto Serif Thai ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansMyanmarUI-CondensedExtraLight.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn XLt:style=Condensed ExtraLight,Regular
- NotoSansSinhala-Condensed.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond:style=Condensed,Regular
- NotoSansGeorgian-SemiCondensedBlack.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond Blk:style=SemiCondensed Black,Regular
- NimbusSans-Italic.otf: Nimbus Sans:style=Italic
- NotoSansArmenian-SemiCondensedBold.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond:style=SemiCondensed Bold,Bold
- NotoSerifDisplay-Medium.ttf: Noto Serif Display,Noto Serif Disp Med:style=Medium,Regular
- NotoSerifHebrew-ExtraCondensedMedium.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansLao-SemiCondensedExtraLight.ttf: Noto Sans Lao,Noto Sans Lao SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansArabicUI-ExtraBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XBd:style=ExtraBold,Regular
- NotoSansCJKtc-Light.otf: Noto Sans CJK TC,Noto Sans CJK TC Light:style=Light,Regular
- NotoSerifKhmer-SemiCondensedExtraBold.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansCherokee-SemiBold.ttf: Noto Sans Cherokee,Noto Sans Cherokee SemBd:style=SemiBold,Regular
- NotoSansDisplay-MediumItalic.ttf: Noto Sans Display,Noto Sans Disp Med:style=Medium Italic,Italic
- NotoSerifLao-SemiBold.ttf: Noto Serif Lao,Noto Serif Lao SemBd:style=SemiBold,Regular
- n022023l.pfb: Nimbus Mono L:style=Regular Oblique
- NotoSansCham-Medium.ttf: Noto Sans Cham,Noto Sans Cham Med:style=Medium,Regular
- NotoSansDevanagariUI-ExtraCondensedSemiBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn SmBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifDisplay-CondensedLight.ttf: Noto Serif Display,Noto Serif Disp Cond Light:style=Condensed Light,Regular
- NotoSansEthiopic-ExtraCondensedSemiBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansMono-Light.ttf: Noto Sans Mono,Noto Sans Mono Light:style=Light,Regular
- NotoSerifLao-CondensedExtraLight.ttf: Noto Serif Lao,Noto Serif Lao Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansTamilUI-Black.ttf: Noto Sans Tamil UI,Noto Sans Tamil Blk:style=Black,Regular
- NotoSansArabicUI-Regular.ttf: Noto Sans Arabic UI:style=Regular
- NotoSerifCJKtc-Bold.otf: Noto Serif CJK TC:style=Bold
- NotoSansBengali-Light.ttf: Noto Sans Bengali,Noto Sans Bengali Light:style=Light,Regular
- NotoSansEthiopic-CondensedLight.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond Light:style=Condensed Light,Regular
- NotoSans-Regular.ttf: Noto Sans:style=Regular
- NotoSansThaiUI-ExtraCondensedLight.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansSinhala-Regular.ttf: Noto Sans Sinhala:style=Regular
- NotoSansMono-Black.ttf: Noto Sans Mono,Noto Sans Mono Blk:style=Black,Regular
- NotoSansDevanagariUI-CondensedThin.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn Th:style=Condensed Thin,Regular
- NotoSerifLao-ExtraLight.ttf: Noto Serif Lao,Noto Serif Lao ExtLt:style=ExtraLight,Regular
- NotoSansSinhalaUI-CondensedLight.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond Light:style=Condensed Light,Regular
- NotoSansSinhala-SemiCondensedLight.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond Light:style=SemiCondensed Light,Regular
- NotoSerifGeorgian-Black.ttf: Noto Serif Georgian,Noto Serif Georgian Bk:style=Black,Regular
- NotoSansLao-ExtraLight.ttf: Noto Sans Lao,Noto Sans Lao ExtLt:style=ExtraLight,Regular
- NotoSansTamil-ExtraCondensedMedium.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansDisplay-SemiCondensedMedium.ttf: Noto Sans Display,Noto Sans Disp SemCond Med:style=SemiCondensed Medium,Regular
- NotoSerifEthiopic-Light.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Lt:style=Light,Regular
- NotoSerifGujarati-Bold.ttf: Noto Serif Gujarati:style=Bold
- NotoSansDevanagariUI-Light.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Lt:style=Light,Regular
- NotoSansDevanagariUI-Condensed.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn:style=Condensed,Regular
- NotoSerifHebrew-SemiCondensed.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond:style=SemiCondensed,Regular
- NotoSansLaoUI-CondensedExtraBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSerif-SemiCondensedItalic.ttf: Noto Serif,Noto Serif SemCond:style=SemiCondensed Italic,Italic
- NotoSansTamilUI-SemiCondensedMedium.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansArabic-Medium.ttf: Noto Sans Arabic,Noto Sans Arabic Med:style=Medium,Regular
- NotoSansHebrew-SemiCondensedBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond:style=SemiCondensed Bold,Bold
- NotoSansMono-ExtraCondensedExtraBold.ttf: Noto Sans Mono,Noto Sans Mono ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansThai-ExtraLight.ttf: Noto Sans Thai,Noto Sans Thai ExtLt:style=ExtraLight,Regular
- NotoSerif-CondensedThinItalic.ttf: Noto Serif,Noto Serif Cond Thin:style=Condensed Thin Italic,Italic
- URWBookman-Demi.t1: URW Bookman:style=Demi
- NotoSansSyriacEstrangela-Regular.ttf: Noto Sans Syriac Estrangela:style=Regular
- NotoSansKhmer-Medium.ttf: Noto Sans Khmer,Noto Sans Khmer Med:style=Medium,Regular
- NotoSansLaoUI-Thin.ttf: Noto Sans Lao UI,Noto Sans Lao UI Thin:style=Thin,Regular
- NotoSerif-SemiCondensedExtraBoldItalic.ttf: Noto Serif,Noto Serif SemCond ExtBd:style=SemiCondensed ExtraBold Italic,Italic
- NotoSerifHebrew-CondensedMedium.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond Med:style=Condensed Medium,Regular
- NotoSansSinhalaUI-SemiCondensedThin.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansTamil-CondensedBlack.ttf: Noto Sans Tamil,Noto Sans Tamil Cond Blk:style=Condensed Black,Regular
- NotoSerifHebrew-CondensedBlack.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond Blk:style=Condensed Black,Regular
- NotoSansUgaritic-Regular.ttf: Noto Sans Ugaritic:style=Regular
- NotoSansMyanmar-ExtraCondensedExtraLight.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansSymbols2-Regular.ttf: Noto Sans Symbols2:style=Regular
- NotoSansKhmer-ExtraCondensedExtraLight.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansHebrew-CondensedThin.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond Thin:style=Condensed Thin,Regular
- NotoSansGeorgian-Condensed.ttf: Noto Sans Georgian,Noto Sans Georgian Cond:style=Condensed,Regular
- NotoSerifCJKkr-SemiBold.otf: Noto Serif CJK KR,Noto Serif CJK KR SemiBold:style=SemiBold,Regular
- NotoSerifDisplay-ExtraCondensedLight.ttf: Noto Serif Display,Noto Serif Disp ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansOriyaUI-Bold.ttf: Noto Sans Oriya UI:style=Bold
- a010015l.pfb: URW Gothic L:style=Demi
- NotoSansMyanmarUI-SemiCondensedExtraLight.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn XLt:style=SemiCondensed ExtraLight,Regular
- NotoSansArmenian-CondensedExtraBold.ttf: Noto Sans Armenian,Noto Sans Armenian Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansLaoUI-SemiCondensedLight.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond Light:style=SemiCondensed Light,Regular
- NotoSansBengali-Regular.ttf: Noto Sans Bengali:style=Regular
- NotoSansSinhalaUI-Thin.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Thin:style=Thin,Regular
- NotoSerifMyanmar-ExtraCondensedExtraBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerifDisplay-ExtraCondensedMedium.ttf: Noto Serif Display,Noto Serif Disp ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansLao-Black.ttf: Noto Sans Lao,Noto Sans Lao Blk:style=Black,Regular
- NotoSans-ExtraCondensedBlackItalic.ttf: Noto Sans,Noto Sans ExtCond Blk:style=ExtraCondensed Black Italic,Italic
- NotoSansThai-ExtraCondensedExtraBold.ttf: Noto Sans Thai,Noto Sans Thai ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansKhmer-SemiCondensed.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond:style=SemiCondensed,Regular
- NotoSansDevanagari-CondensedMedium.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn Md:style=Condensed Medium,Regular
- NotoSansGeorgian-ExtraCondensedExtraBold.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansSinhala-SemiCondensedThin.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSerifLao-CondensedThin.ttf: Noto Serif Lao,Noto Serif Lao Cond Thin:style=Condensed Thin,Regular
- NotoSansTamilUI-ExtraCondensedExtraBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerif-ExtraCondensedBoldItalic.ttf: Noto Serif,Noto Serif ExtCond:style=ExtraCondensed Bold Italic,Bold Italic
- NotoSansArmenian-CondensedMedium.ttf: Noto Sans Armenian,Noto Sans Armenian Cond Med:style=Condensed Medium,Regular
- NotoSansMyanmarUI-ExtraCondensedThin.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn Th:style=ExtraCondensed Thin,Regular
- NotoSansMyanmarUI-CondensedMedium.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn Md:style=Condensed Medium,Regular
- NotoSerifDisplay-SemiCondensedBold.ttf: Noto Serif Display,Noto Serif Disp SemCond:style=SemiCondensed Bold,Bold
- NotoSerifThai-ExtraCondensedBold.ttf: Noto Serif Thai,Noto Serif Thai ExtCond:style=ExtraCondensed Bold,Bold
- NotoSans-SemiCondensedExtraBold.ttf: Noto Sans,Noto Sans SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- URWGothic-Book.t1: URW Gothic:style=Book
- NotoSerifCJKkr-Bold.otf: Noto Serif CJK KR:style=Bold
- NotoSansDisplay-ExtraCondensed.ttf: Noto Sans Display,Noto Sans Disp ExtCond:style=ExtraCondensed,Regular
- NotoSansDevanagariUI-CondensedExtraBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn XBd:style=Condensed ExtraBold,Regular
- NotoSansArabicUI-Medium.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Md:style=Medium,Regular
- DejaVuSansMono-Bold.ttf: DejaVu Sans Mono:style=Bold
- NimbusRoman-Regular.t1: Nimbus Roman:style=Regular
- NotoSansMyanmar-ExtraCondensedExtraBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NimbusMonoPS-Regular.otf: Nimbus Mono PS:style=Regular
- NotoSerifKhmer-Regular.ttf: Noto Serif Khmer:style=Regular
- NotoSans-ExtraCondensedBold.ttf: Noto Sans,Noto Sans ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansEthiopic-SemiCondensedExtraBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NimbusSansNarrow-Regular.otf: Nimbus Sans Narrow:style=Regular
- NotoSansDisplay-ExtraCondensedSemiBoldItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond SemBd:style=ExtraCondensed SemiBold Italic,Italic
- NotoSansArabic-ExtraLight.ttf: Noto Sans Arabic,Noto Sans Arabic ExtLt:style=ExtraLight,Regular
- NotoSerifDisplay-ExtraLight.ttf: Noto Serif Display,Noto Serif Disp ExtLt:style=ExtraLight,Regular
- NotoSerifDevanagari-Regular.ttf: Noto Serif Devanagari:style=Regular
- NotoSerifThai-CondensedBlack.ttf: Noto Serif Thai,Noto Serif Thai Cond Blk:style=Condensed Black,Regular
- NotoSansKharoshthi-Regular.ttf: Noto Sans Kharoshthi:style=Regular
- NotoSansKhmer-CondensedSemiBold.ttf: Noto Sans Khmer,Noto Sans Khmer Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansArabic-ExtraCondensed.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond:style=ExtraCondensed,Regular
- n019043l.pfb: Nimbus Sans L:style=Regular Condensed
- NotoSerif-SemiCondensedBoldItalic.ttf: Noto Serif,Noto Serif SemCond:style=SemiCondensed Bold Italic,Bold Italic
- NotoSansDevanagari-CondensedExtraLight.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn XLt:style=Condensed ExtraLight,Regular
- NotoSerifArmenian-Regular.ttf: Noto Serif Armenian:style=Regular
- NotoSerifDisplay-ExtraCondensedMediumItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond Med:style=ExtraCondensed Medium Italic,Italic
- NotoSansMono-ExtraLight.ttf: Noto Sans Mono,Noto Sans Mono ExtLt:style=ExtraLight,Regular
- NotoSansKhmer-ExtraCondensedThin.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifSinhala-Medium.ttf: Noto Serif Sinhala,Noto Serif Sinhala Med:style=Medium,Regular
- NotoSansSinhalaUI-CondensedExtraBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansDeseret-Regular.ttf: Noto Sans Deseret:style=Regular
- NotoSerifHebrew-CondensedExtraBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansThaiUI-SemiCondensedBlack.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansEthiopic-ExtraBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtBd:style=ExtraBold,Regular
- NotoSans-ExtraCondensedExtraLight.ttf: Noto Sans,Noto Sans ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansDisplay-CondensedExtraBoldItalic.ttf: Noto Sans Display,Noto Sans Disp Cond ExtBd:style=Condensed ExtraBold Italic,Italic
- NotoSansDisplay-SemiBoldItalic.ttf: Noto Sans Display,Noto Sans Disp SemBd:style=SemiBold Italic,Italic
- NotoSerifLao-CondensedBold.ttf: Noto Serif Lao,Noto Serif Lao Cond:style=Condensed Bold,Bold
- NotoSansDisplay-SemiCondensedThin.ttf: Noto Sans Display,Noto Sans Disp SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSans-ExtraCondensedThin.ttf: Noto Sans,Noto Sans ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerif-ExtraCondensedBlack.ttf: Noto Serif,Noto Serif ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSerifDisplay-Black.ttf: Noto Serif Display,Noto Serif Disp Blk:style=Black,Regular
- NotoSansMyanmarUI-CondensedExtraBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn XBd:style=Condensed ExtraBold,Regular
- NotoSerifGeorgian-CondensedThin.ttf: Noto Serif Georgian,Noto Serif Georgian Cn Th:style=Condensed Thin,Regular
- NotoSansMyanmar-ExtraCondensedBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifKhmer-CondensedBlack.ttf: Noto Serif Khmer,Noto Serif Khmer Cond Blk:style=Condensed Black,Regular
- NotoSansDisplay-ExtraLight.ttf: Noto Sans Display,Noto Sans Disp ExtLt:style=ExtraLight,Regular
- NotoSansMyanmarUI-SemiCondensed.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn:style=SemiCondensed,Regular
- NotoSans-ExtraCondensedMedium.ttf: Noto Sans,Noto Sans ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSerifKhmer-Bold.ttf: Noto Serif Khmer:style=Bold
- NotoSansMyanmar-Thin.ttf: Noto Sans Myanmar,Noto Sans Myanmar Thin:style=Thin,Regular
- NotoSansBengaliUI-Thin.ttf: Noto Sans Bengali UI,Noto Sans Bengali Thin:style=Thin,Regular
- NotoSansDevanagari-SemiCondensedLight.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn Lt:style=SemiCondensed Light,Regular
- NotoSerifTamil-ExtraCondensed.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond:style=ExtraCondensed,Regular
- URWBookman-Demi.otf: URW Bookman:style=Demi
- NotoSansDevanagari-CondensedBlack.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn Bk:style=Condensed Black,Regular
- NimbusMonoPS-Regular.t1: Nimbus Mono PS:style=Regular
- NotoSerifHebrew-ExtraCondensedThin.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond Thin:style=ExtraCondensed Thin,Regular
- NimbusSans-BoldItalic.t1: Nimbus Sans:style=Bold Italic
- NimbusSans-Bold.t1: Nimbus Sans:style=Bold
- NotoSansDevanagariUI-Regular.ttf: Noto Sans Devanagari UI:style=Regular
- NotoSerifDisplay-ThinItalic.ttf: Noto Serif Display,Noto Serif Disp Thin:style=Thin Italic,Italic
- NotoSansOldItalic-Regular.ttf: Noto Sans Old Italic:style=Regular
- n019044l.pfb: Nimbus Sans L:style=Bold Condensed
- NotoSerifDisplay-SemiBoldItalic.ttf: Noto Serif Display,Noto Serif Disp SemBd:style=SemiBold Italic,Italic
- NotoSerifDisplay-ExtraLightItalic.ttf: Noto Serif Display,Noto Serif Disp ExtLt:style=ExtraLight Italic,Italic
- NotoSerifKhmer-CondensedExtraLight.ttf: Noto Serif Khmer,Noto Serif Khmer Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansAvestan-Regular.ttf: Noto Sans Avestan:style=Regular
- NotoSansCJKjp-Black.otf: Noto Sans CJK JP,Noto Sans CJK JP Black:style=Black,Regular
- NotoSansDevanagari-ExtraCondensed.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn:style=ExtraCondensed,Regular
- NotoSansMyanmarUI-Condensed.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn:style=Condensed,Regular
- NotoSerifGeorgian-SemiCondensedExtraLight.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn XLt:style=SemiCondensed ExtraLight,Regular
- NotoSerif-Condensed.ttf: Noto Serif,Noto Serif Cond:style=Condensed,Regular
- NotoSansMalayalam-Bold.ttf: Noto Sans Malayalam:style=Bold
- NotoSansArabic-CondensedBold.ttf: Noto Sans Arabic,Noto Sans Arabic Cond:style=Condensed Bold,Bold
- NotoSerifThai-CondensedBold.ttf: Noto Serif Thai,Noto Serif Thai Cond:style=Condensed Bold,Bold
- NimbusMonoPS-BoldItalic.t1: Nimbus Mono PS:style=Bold Italic
- NotoSansTamil-ExtraLight.ttf: Noto Sans Tamil,Noto Sans Tamil ExtLt:style=ExtraLight,Regular
- NotoSerifLao-ExtraCondensedSemiBold.ttf: Noto Serif Lao,Noto Serif Lao ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansKhmer-CondensedMedium.ttf: Noto Sans Khmer,Noto Sans Khmer Cond Med:style=Condensed Medium,Regular
- NotoSansThaiUI-CondensedBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond:style=Condensed Bold,Bold
- NotoSansThai-ExtraCondensed.ttf: Noto Sans Thai,Noto Sans Thai ExtCond:style=ExtraCondensed,Regular
- NotoSansThaiUI-ExtraCondensedThin.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifArmenian-SemiBold.ttf: Noto Serif Armenian,Noto Serif Armenian SmBd:style=SemiBold,Regular
- NotoSansArabic-ExtraCondensedExtraLight.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansThai-ExtraBold.ttf: Noto Sans Thai,Noto Sans Thai ExtBd:style=ExtraBold,Regular
- NotoMono-Regular.ttf: Noto Mono:style=Regular
- NotoSansDisplay-Medium.ttf: Noto Sans Display,Noto Sans Disp Med:style=Medium,Regular
- NotoSerifLao-Medium.ttf: Noto Serif Lao,Noto Serif Lao Med:style=Medium,Regular
- NotoSansKhmer-SemiCondensedBlack.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansDisplay-BoldItalic.ttf: Noto Sans Display,Noto Sans Disp:style=Bold Italic
- NotoSansDisplay-SemiCondensedBlack.ttf: Noto Sans Display,Noto Sans Disp SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifLao-Regular.ttf: Noto Serif Lao:style=Regular
- NotoSansDisplay-ExtraCondensedThinItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond Thin:style=ExtraCondensed Thin Italic,Italic
- NotoSansMyanmarUI-CondensedSemiBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn SmBd:style=Condensed SemiBold,Regular
- NotoSerifHebrew-Light.ttf: Noto Serif Hebrew,Noto Serif Hebrew Light:style=Light,Regular
- NotoSerif-CondensedMediumItalic.ttf: Noto Serif,Noto Serif Cond Med:style=Condensed Medium Italic,Italic
- NotoSansDevanagari-Regular.ttf: Noto Sans Devanagari:style=Regular
- NotoSerifTamil-ExtraCondensedThin.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifThai-ExtraCondensedMedium.ttf: Noto Serif Thai,Noto Serif Thai ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSans-ExtraCondensedSemiBoldItalic.ttf: Noto Sans,Noto Sans ExtCond SemBd:style=ExtraCondensed SemiBold Italic,Italic
- NotoSansGurmukhi-Regular.ttf: Noto Sans Gurmukhi:style=Regular
- NotoSansMonoCJKkr-Regular.otf: Noto Sans Mono CJK KR,Noto Sans Mono CJK KR Regular:style=Regular
- NotoSerifTamil-ExtraLight.ttf: Noto Serif Tamil,Noto Serif Tamil ExtLt:style=ExtraLight,Regular
- NotoSansCJKtc-Black.otf: Noto Sans CJK TC,Noto Sans CJK TC Black:style=Black,Regular
- NotoSansDisplay-ExtraCondensedItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond:style=ExtraCondensed Italic,Italic
- NotoSansArabic-ExtraCondensedLight.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond Light:style=ExtraCondensed Light,Regular
- StandardSymbolsPS.t1: Standard Symbols PS:style=Regular
- NotoSerifArmenian-SemiCondensedThin.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn Th:style=SemiCondensed Thin,Regular
- NotoSerifDisplay-CondensedBlackItalic.ttf: Noto Serif Display,Noto Serif Disp Cond Blk:style=Condensed Black Italic,Italic
- NotoSansArmenian-Condensed.ttf: Noto Sans Armenian,Noto Sans Armenian Cond:style=Condensed,Regular
- NotoSansHebrew-CondensedSemiBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond SemBd:style=Condensed SemiBold,Regular
- NotoSerifGeorgian-ExtraCondensedBlack.ttf: Noto Serif Georgian,Noto Serif Georgian XCn Bk:style=ExtraCondensed Black,Regular
- NotoSansMyanmarUI-ExtraCondensedExtraLight.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn XLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansSinhalaUI-CondensedBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond:style=Condensed Bold,Bold
- NotoSansThai-Bold.ttf: Noto Sans Thai:style=Bold
- NotoSans-Bold.ttf: Noto Sans:style=Bold
- URWGothic-Demi.otf: URW Gothic:style=Demi
- NotoSansEthiopic-CondensedSemiBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansGujaratiUI-Regular.ttf: Noto Sans Gujarati UI:style=Regular
- NotoSansKhmer-ExtraCondensedSemiBold.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- a010033l.pfb: URW Gothic L:style=Book Oblique
- NotoSansDisplay-CondensedBoldItalic.ttf: Noto Sans Display,Noto Sans Disp Cond:style=Condensed Bold Italic,Bold Italic
- NotoSansDisplay-CondensedSemiBoldItalic.ttf: Noto Sans Display,Noto Sans Disp Cond SemBd:style=Condensed SemiBold Italic,Italic
- NotoSansMono-ExtraCondensedExtraLight.ttf: Noto Sans Mono,Noto Sans Mono ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifArmenian-ExtraCondensedBold.ttf: Noto Serif Armenian,Noto Serif Armenian XCn:style=ExtraCondensed Bold,Bold
- NotoSerifDisplay-SemiCondensedItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond:style=SemiCondensed Italic,Italic
- NotoSansCuneiform-Regular.ttf: Noto Sans Cuneiform:style=Regular
- NotoSansMyanmarUI-ExtraBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XBd:style=ExtraBold,Regular
- NotoSansDisplay-SemiCondensedExtraBold.ttf: Noto Sans Display,Noto Sans Disp SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSerif-CondensedBoldItalic.ttf: Noto Serif,Noto Serif Cond:style=Condensed Bold Italic,Bold Italic
- NotoSerifTamil-SemiCondensedSemiBold.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSerif-SemiCondensedBlackItalic.ttf: Noto Serif,Noto Serif SemCond Blk:style=SemiCondensed Black Italic,Italic
- NotoSansSinhala-CondensedBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond:style=Condensed Bold,Bold
- NotoSansKhmerUI-Regular.ttf: Noto Sans Khmer UI:style=Regular
- NotoSansTamilUI-SemiCondensedLight.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond Light:style=SemiCondensed Light,Regular
- NotoSansMyanmar-CondensedBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond:style=Condensed Bold,Bold
- NotoSansTamil-Light.ttf: Noto Sans Tamil,Noto Sans Tamil Light:style=Light,Regular
- NotoSerifEthiopic-CondensedBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn:style=Condensed Bold,Bold
- NotoSansHebrew-ExtraCondensedExtraBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansKhmerUI-Bold.ttf: Noto Sans Khmer UI:style=Bold
- NotoSerifArmenian-Light.ttf: Noto Serif Armenian,Noto Serif Armenian Lt:style=Light,Regular
- NotoSerifGeorgian-Bold.ttf: Noto Serif Georgian:style=Bold
- NotoSansTamilUI-Medium.ttf: Noto Sans Tamil UI,Noto Sans Tamil Med:style=Medium,Regular
- NotoSerifTamil-SemiBold.ttf: Noto Serif Tamil,Noto Serif Tamil SemBd:style=SemiBold,Regular
- NotoSansSinhala-ExtraCondensedThin.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansMyanmarUI-SemiCondensedMedium.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn Md:style=SemiCondensed Medium,Regular
- NotoSansThaiUI-CondensedBlack.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond Blk:style=Condensed Black,Regular
- NotoSerifDisplay-ExtraCondensedExtraBoldItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond ExtBd:style=ExtraCondensed ExtraBold Italic,Italic
- NotoSansMono-SemiCondensedExtraBold.ttf: Noto Sans Mono,Noto Sans Mono SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansThaiUI-SemiCondensedThin.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSans-SemiCondensedLight.ttf: Noto Sans,Noto Sans SemCond Light:style=SemiCondensed Light,Regular
- NotoSansMono-Regular.ttf: Noto Sans Mono:style=Regular
- NotoSerif-CondensedSemiBold.ttf: Noto Serif,Noto Serif Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansKhmer-ExtraCondensedBold.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansMyanmar-Black.ttf: Noto Sans Myanmar,Noto Sans Myanmar Blk:style=Black,Regular
- NotoSansTamilUI-SemiCondensedBlack.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifArmenian-SemiCondensedMedium.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn Md:style=SemiCondensed Medium,Regular
- NotoSans-Light.ttf: Noto Sans,Noto Sans Light:style=Light,Regular
- n021003l.pfb: Nimbus Roman No9 L:style=Regular
- NotoSansMono-SemiCondensed.ttf: Noto Sans Mono,Noto Sans Mono SemCond:style=SemiCondensed,Regular
- NotoSansThaiUI-SemiCondensedSemiBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSerifDisplay-CondensedSemiBold.ttf: Noto Serif Display,Noto Serif Disp Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansMyanmarUI-Black.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Bk:style=Black,Regular
- NotoSerifThai-SemiCondensedBold.ttf: Noto Serif Thai,Noto Serif Thai SemCond:style=SemiCondensed Bold,Bold
- NotoSerif-SemiCondensedSemiBoldItalic.ttf: Noto Serif,Noto Serif SemCond SemBd:style=SemiCondensed SemiBold Italic,Italic
- s050000l.pfb: Standard Symbols L:style=Regular
- NotoSansArmenian-CondensedExtraLight.ttf: Noto Sans Armenian,Noto Sans Armenian Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSerifLao-SemiCondensed.ttf: Noto Serif Lao,Noto Serif Lao SemCond:style=SemiCondensed,Regular
- NotoSansTamil-SemiCondensedThin.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansMyanmarUI-Bold.ttf: Noto Sans Myanmar UI:style=Bold
- NotoSerifArmenian-CondensedExtraBold.ttf: Noto Serif Armenian,Noto Serif Armenian Cn XBd:style=Condensed ExtraBold,Regular
- NotoSansEthiopic-CondensedExtraBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansHebrew-ExtraCondensedSemiBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansMyanmar-Regular.ttf: Noto Sans Myanmar:style=Regular
- NotoSansArabicUI-SemiCondensedBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn:style=SemiCondensed Bold,Bold
- NotoSansBengaliUI-Bold.ttf: Noto Sans Bengali UI:style=Bold
- NotoSans-ExtraLight.ttf: Noto Sans,Noto Sans ExtLt:style=ExtraLight,Regular
- NotoSerifEthiopic-ExtraCondensedExtraBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn XBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansMonoCJKsc-Regular.otf: Noto Sans Mono CJK SC,Noto Sans Mono CJK SC Regular:style=Regular
- NotoSansDevanagariUI-CondensedMedium.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn Md:style=Condensed Medium,Regular
- NotoSerifCJKjp-Medium.otf: Noto Serif CJK JP,Noto Serif CJK JP Medium:style=Medium,Regular
- NotoSerifBengali-Regular.ttf: Noto Serif Bengali:style=Regular
- NotoSerifDisplay-CondensedSemiBoldItalic.ttf: Noto Serif Display,Noto Serif Disp Cond SemBd:style=Condensed SemiBold Italic,Italic
- NotoSansTaiTham-Regular.ttf: Noto Sans Tai Tham:style=Regular
- NotoSansKhmer-ExtraLight.ttf: Noto Sans Khmer,Noto Sans Khmer ExtLt:style=ExtraLight,Regular
- NotoSansBengali-Bold.ttf: Noto Sans Bengali:style=Bold
- NotoSansKannadaUI-Bold.ttf: Noto Sans Kannada UI:style=Bold
- NotoSerifThai-SemiCondensedLight.ttf: Noto Serif Thai,Noto Serif Thai SemCond Light:style=SemiCondensed Light,Regular
- NotoSansTamilUI-ExtraCondensedBlack.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansArabicUI-ExtraCondensedExtraBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn XBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansThaiUI-Regular.ttf: Noto Sans Thai UI:style=Regular
- NotoSans-SemiCondensedLightItalic.ttf: Noto Sans,Noto Sans SemCond Light:style=SemiCondensed Light Italic,Italic
- NotoSansLaoUI-Bold.ttf: Noto Sans Lao UI:style=Bold
- NotoSerif-ExtraBoldItalic.ttf: Noto Serif,Noto Serif ExtBd:style=ExtraBold Italic,Italic
- NotoSerifDisplay-SemiCondensed.ttf: Noto Serif Display,Noto Serif Disp SemCond:style=SemiCondensed,Regular
- NotoSansKhmerUI-SemiCondensedBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond:style=SemiCondensed Bold,Bold
- NotoSansSinhalaUI-SemiCondensedExtraLight.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSans-CondensedLightItalic.ttf: Noto Sans,Noto Sans Cond Light:style=Condensed Light Italic,Italic
- NimbusSansNarrow-Bold.otf: Nimbus Sans Narrow:style=Bold
- URWBookman-DemiItalic.otf: URW Bookman:style=Demi Italic
- NotoSansDisplay-SemiCondensedExtraLightItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond ExtLt:style=SemiCondensed ExtraLight Italic,Italic
- NotoSerif-Italic.ttf: Noto Serif:style=Italic
- NotoSansArabic-ExtraBold.ttf: Noto Sans Arabic,Noto Sans Arabic ExtBd:style=ExtraBold,Regular
- NotoSerifMyanmar-SemiCondensedLight.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemCond Light:style=SemiCondensed Light,Regular
- NotoSansMyanmarUI-CondensedBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn:style=Condensed Bold,Bold
- NotoSansCJKjp-Bold.otf: Noto Sans CJK JP,Noto Sans CJK JP Bold:style=Bold,Regular
- URWGothic-BookOblique.otf: URW Gothic:style=Book Oblique
- NotoSerifDisplay-ExtraBoldItalic.ttf: Noto Serif Display,Noto Serif Disp ExtBd:style=ExtraBold Italic,Italic
- NotoSerifTamil-SemiCondensed.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond:style=SemiCondensed,Regular
- b018035l.pfb: URW Bookman L:style=Demi Bold Italic
- NotoSansCherokee-Bold.ttf: Noto Sans Cherokee:style=Bold
- NotoSansThaiUI-Light.ttf: Noto Sans Thai UI,Noto Sans Thai UI Light:style=Light,Regular
- NotoSansKhmer-CondensedThin.ttf: Noto Sans Khmer,Noto Sans Khmer Cond Thin:style=Condensed Thin,Regular
- NotoSerifGeorgian-SemiCondensedExtraBold.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn XBd:style=SemiCondensed ExtraBold,Regular
- NotoNaskhArabic-Bold.ttf: Noto Naskh Arabic:style=Bold
- NotoSerifThai-CondensedExtraBold.ttf: Noto Serif Thai,Noto Serif Thai Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansThai-CondensedBold.ttf: Noto Sans Thai,Noto Sans Thai Cond:style=Condensed Bold,Bold
- NotoSerifArmenian-ExtraCondensedThin.ttf: Noto Serif Armenian,Noto Serif Armenian XCn Th:style=ExtraCondensed Thin,Regular
- NotoSansMyanmar-ExtraLight.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtLt:style=ExtraLight,Regular
- NotoSansDevanagari-ExtraCondensedExtraLight.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn XLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansHebrew-Black.ttf: Noto Sans Hebrew,Noto Sans Hebrew Blk:style=Black,Regular
- NotoSansDevanagariUI-SemiCondensedBlack.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn Bk:style=SemiCondensed Black,Regular
- NotoSerifCJKjp-Light.otf: Noto Serif CJK JP,Noto Serif CJK JP Light:style=Light,Regular
- NotoSerifTamil-SemiCondensedExtraBold.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- c059033l.pfb: Century Schoolbook L:style=Italic
- NotoSans-ExtraCondensedItalic.ttf: Noto Sans,Noto Sans ExtCond:style=ExtraCondensed Italic,Italic
- NotoSerifLao-CondensedLight.ttf: Noto Serif Lao,Noto Serif Lao Cond Light:style=Condensed Light,Regular
- NotoSansGeorgian-CondensedLight.ttf: Noto Sans Georgian,Noto Sans Georgian Cond Light:style=Condensed Light,Regular
- NotoSerifGeorgian-Medium.ttf: Noto Serif Georgian,Noto Serif Georgian Md:style=Medium,Regular
- NotoSansLaoUI-SemiCondensedSemiBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSerifCJKkr-Medium.otf: Noto Serif CJK KR,Noto Serif CJK KR Medium:style=Medium,Regular
- NotoSansVai-Regular.ttf: Noto Sans Vai:style=Regular
- NotoSansBengaliUI-Light.ttf: Noto Sans Bengali UI,Noto Sans Bengali Light:style=Light,Regular
- NotoSansOriyaUI-Regular.ttf: Noto Sans Oriya UI:style=Regular
- NotoSansArmenian-Light.ttf: Noto Sans Armenian,Noto Sans Armenian Light:style=Light,Regular
- NotoSansArmenian-SemiBold.ttf: Noto Sans Armenian,Noto Sans Armenian SemBd:style=SemiBold,Regular
- NotoSansMonoCJKjp-Regular.otf: Noto Sans Mono CJK JP,Noto Sans Mono CJK JP Regular:style=Regular
- NotoSansTamilUI-CondensedThin.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond Thin:style=Condensed Thin,Regular
- NotoSansArabic-SemiCondensedMedium.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond Med:style=SemiCondensed Medium,Regular
- NotoSans-ExtraLightItalic.ttf: Noto Sans,Noto Sans ExtLt:style=ExtraLight Italic,Italic
- NotoSansCherokee-Regular.ttf: Noto Sans Cherokee:style=Regular
- NotoSansThaiUI-SemiCondensedLight.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond Light:style=SemiCondensed Light,Regular
- NotoSansInscriptionalParthian-Regular.ttf: Noto Sans Inscriptional Parthian,Noto Sans InsParthi:style=Regular
- NotoSans-CondensedThinItalic.ttf: Noto Sans,Noto Sans Cond Thin:style=Condensed Thin Italic,Italic
- NotoSansBuginese-Regular.ttf: Noto Sans Buginese:style=Regular
- NotoSerifLao-SemiCondensedExtraBold.ttf: Noto Serif Lao,Noto Serif Lao SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansDevanagariUI-SemiCondensedExtraBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn XBd:style=SemiCondensed ExtraBold,Regular
- NotoSansDisplay-Regular.ttf: Noto Sans Display,Noto Sans Disp:style=Regular
- NotoSansMono-SemiBold.ttf: Noto Sans Mono,Noto Sans Mono SemBd:style=SemiBold,Regular
- NotoNaskhArabicUI-Bold.ttf: Noto Naskh Arabic UI:style=Bold
- NotoSansKhmer-ExtraCondensedBlack.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansCJKjp-Regular.otf: Noto Sans CJK JP,Noto Sans CJK JP Regular:style=Regular
- NotoSansRejang-Regular.ttf: Noto Sans Rejang:style=Regular
- NotoSansCJKtc-DemiLight.otf: Noto Sans CJK TC,Noto Sans CJK TC DemiLight:style=DemiLight,Regular
- NotoSansTamil-ExtraCondensedBold.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifThai-ExtraLight.ttf: Noto Serif Thai,Noto Serif Thai ExtLt:style=ExtraLight,Regular
- NotoSansKhmerUI-Medium.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Med:style=Medium,Regular
- NotoSansKhmer-SemiCondensedThin.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansBengaliUI-SemiBold.ttf: Noto Sans Bengali UI,Noto Sans Bengali SemBd:style=SemiBold,Regular
- NotoSerifDisplay-ExtraCondensedThin.ttf: Noto Serif Display,Noto Serif Disp ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifBengali-Bold.ttf: Noto Serif Bengali:style=Bold
- NotoSansHebrew-ExtraCondensedMedium.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansDisplay-LightItalic.ttf: Noto Sans Display,Noto Sans Disp Light:style=Light Italic,Italic
- NotoSerifCJKkr-Regular.otf: Noto Serif CJK KR:style=Regular
- NotoSerifLao-ExtraCondensedExtraLight.ttf: Noto Serif Lao,Noto Serif Lao ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansArabic-Black.ttf: Noto Sans Arabic,Noto Sans Arabic Blk:style=Black,Regular
- NotoSansLaoUI-Black.ttf: Noto Sans Lao UI,Noto Sans Lao UI Blk:style=Black,Regular
- NotoSansSinhalaUI-SemiCondensedBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond:style=SemiCondensed Bold,Bold
- NotoSansHebrew-SemiCondensedExtraBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSerifSinhala-Light.ttf: Noto Serif Sinhala,Noto Serif Sinhala Light:style=Light,Regular
- Z003-MediumItalic.t1: Z003:style=Medium Italic
- NotoSerif-CondensedLight.ttf: Noto Serif,Noto Serif Cond Light:style=Condensed Light,Regular
- NotoSerifMyanmar-Black.ttf: Noto Serif Myanmar,Noto Serif Myanmar Blk:style=Black,Regular
- NotoSansArabic-ExtraCondensedSemiBold.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansThai-SemiCondensedExtraLight.ttf: Noto Sans Thai,Noto Sans Thai SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifHebrew-SemiBold.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemBd:style=SemiBold,Regular
- NotoSansKannada-Regular.ttf: Noto Sans Kannada:style=Regular
- NotoSansThaiUI-ExtraBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtBd:style=ExtraBold,Regular
- NotoSerifKhmer-CondensedMedium.ttf: Noto Serif Khmer,Noto Serif Khmer Cond Med:style=Condensed Medium,Regular
- NotoSansEthiopic-Thin.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Thin:style=Thin,Regular
- NotoSansLaoUI-ExtraCondensedLight.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond Light:style=ExtraCondensed Light,Regular
- P052-BoldItalic.t1: P052:style=Bold Italic
- NotoSerifDisplay-Bold.ttf: Noto Serif Display,Noto Serif Disp:style=Bold
- NotoSerifMyanmar-CondensedBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond:style=Condensed Bold,Bold
- NotoSansThaiUI-ExtraCondensedBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifThai-Regular.ttf: Noto Serif Thai:style=Regular
- C059-Italic.t1: C059:style=Italic
- NotoEmoji-Regular.ttf: Noto Emoji:style=Regular
- NotoSans-SemiCondensedBlack.ttf: Noto Sans,Noto Sans SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansMyanmar-ExtraBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtBd:style=ExtraBold,Regular
- NotoSansThai-ExtraCondensedThin.ttf: Noto Sans Thai,Noto Sans Thai ExtCond Thin:style=ExtraCondensed Thin,Regular
- a010035l.pfb: URW Gothic L:style=Demi Oblique
- NotoSerif-CondensedExtraLight.ttf: Noto Serif,Noto Serif Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansLaoUI-ExtraCondensedBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansSinhala-Thin.ttf: Noto Sans Sinhala,Noto Sans Sinhala Thin:style=Thin,Regular
- NotoSerif-Bold.ttf: Noto Serif:style=Bold
- NotoSans-BlackItalic.ttf: Noto Sans,Noto Sans Blk:style=Black Italic,Italic
- NotoSerifKhmer-ExtraCondensedThin.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansThaiUI-ExtraLight.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtLt:style=ExtraLight,Regular
- NotoSerif-SemiCondensedMedium.ttf: Noto Serif,Noto Serif SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansMono-CondensedLight.ttf: Noto Sans Mono,Noto Sans Mono Cond Light:style=Condensed Light,Regular
- NotoSansMono-Bold.ttf: Noto Sans Mono:style=Bold
- NotoSansSinhalaUI-CondensedMedium.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond Med:style=Condensed Medium,Regular
- NotoSerif-CondensedMedium.ttf: Noto Serif,Noto Serif Cond Med:style=Condensed Medium,Regular
- NotoSansDevanagariUI-ExtraCondensedExtraLight.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn XLt:style=ExtraCondensed ExtraLight,Regular
- P052-Roman.t1: P052:style=Roman
- NotoSansKhmerUI-SemiCondensedExtraLight.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifHebrew-Medium.ttf: Noto Serif Hebrew,Noto Serif Hebrew Med:style=Medium,Regular
- NotoSerifEthiopic-SemiCondensedLight.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn Lt:style=SemiCondensed Light,Regular
- NotoSansGeorgian-SemiCondensedExtraLight.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifArmenian-ExtraBold.ttf: Noto Serif Armenian,Noto Serif Armenian XBd:style=ExtraBold,Regular
- NotoSansArabicUI-CondensedMedium.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn Md:style=Condensed Medium,Regular
- NotoSerifEthiopic-ExtraCondensedMedium.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn Md:style=ExtraCondensed Medium,Regular
- NotoSerifHebrew-CondensedThin.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond Thin:style=Condensed Thin,Regular
- NotoSerifTamil-CondensedExtraBold.ttf: Noto Serif Tamil,Noto Serif Tamil Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansArabic-SemiCondensedExtraBold.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSerif-ExtraCondensedBlackItalic.ttf: Noto Serif,Noto Serif ExtCond Blk:style=ExtraCondensed Black Italic,Italic
- NotoSerifDisplay-ExtraCondensedBold.ttf: Noto Serif Display,Noto Serif Disp ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifArmenian-SemiCondensedBlack.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn Bk:style=SemiCondensed Black,Regular
- NotoSerifCJKjp-SemiBold.otf: Noto Serif CJK JP,Noto Serif CJK JP SemiBold:style=SemiBold,Regular
- NotoSerifThai-CondensedThin.ttf: Noto Serif Thai,Noto Serif Thai Cond Thin:style=Condensed Thin,Regular
- NotoSansKhmerUI-CondensedExtraLight.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansBengaliUI-ExtraLight.ttf: Noto Sans Bengali UI,Noto Sans Bengali ExtLt:style=ExtraLight,Regular
- NotoSansDisplay-ExtraCondensedLightItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond Light:style=ExtraCondensed Light Italic,Italic
- NotoSansMyanmar-SemiCondensedBold.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond:style=SemiCondensed Bold,Bold
- NotoSerifThai-SemiBold.ttf: Noto Serif Thai,Noto Serif Thai SemBd:style=SemiBold,Regular
- NotoSerifEthiopic-Condensed.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn:style=Condensed,Regular
- NotoSansDevanagariUI-CondensedBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn:style=Condensed Bold,Bold
- NotoSansGeorgian-SemiCondensedMedium.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond Med:style=SemiCondensed Medium,Regular
- NotoSerifCJKjp-Regular.otf: Noto Serif CJK JP:style=Regular
- NotoSansThai-CondensedMedium.ttf: Noto Sans Thai,Noto Sans Thai Cond Med:style=Condensed Medium,Regular
- NotoSansArmenian-SemiCondensedBlack.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansDevanagariUI-ExtraCondensedThin.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn Th:style=ExtraCondensed Thin,Regular
- NotoSansDisplay-ExtraCondensedBold.ttf: Noto Sans Display,Noto Sans Disp ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansGeorgian-ExtraCondensedBlack.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansArabic-SemiCondensedSemiBold.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansOldTurkic-Regular.ttf: Noto Sans Old Turkic:style=Regular
- NotoSansEthiopic-SemiCondensedExtraLight.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansMalayalam-Regular.ttf: Noto Sans Malayalam:style=Regular
- NotoSansHebrew-SemiCondensedMedium.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond Med:style=SemiCondensed Medium,Regular
- NotoSans-CondensedSemiBoldItalic.ttf: Noto Sans,Noto Sans Cond SemBd:style=Condensed SemiBold Italic,Italic
- NotoSerifMyanmar-Condensed.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond:style=Condensed,Regular
- NotoSansSinhala-Medium.ttf: Noto Sans Sinhala,Noto Sans Sinhala Med:style=Medium,Regular
- NimbusRoman-Bold.t1: Nimbus Roman:style=Bold
- NimbusSansNarrow-Oblique.t1: Nimbus Sans Narrow:style=Oblique
- NotoSans-ExtraCondensedExtraBold.ttf: Noto Sans,Noto Sans ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerifDisplay-SemiBold.ttf: Noto Serif Display,Noto Serif Disp SemBd:style=SemiBold,Regular
- NotoSerifHebrew-SemiCondensedMedium.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansMongolian-Regular.ttf: Noto Sans Mongolian:style=Regular
- NotoSansMyanmarUI-SemiCondensedBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn:style=SemiCondensed Bold,Bold
- NotoSansBengaliUI-Black.ttf: Noto Sans Bengali UI,Noto Sans Bengali Blk:style=Black,Regular
- NotoSerifHebrew-CondensedLight.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond Light:style=Condensed Light,Regular
- NotoSansMyanmar-SemiCondensedThin.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansDevanagariUI-SemiCondensed.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn:style=SemiCondensed,Regular
- NotoSansThai-CondensedLight.ttf: Noto Sans Thai,Noto Sans Thai Cond Light:style=Condensed Light,Regular
- NotoSansKhmerUI-ExtraCondensedExtraBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansCJKsc-DemiLight.otf: Noto Sans CJK SC,Noto Sans CJK SC DemiLight:style=DemiLight,Regular
- NotoSerifDisplay-SemiCondensedExtraLight.ttf: Noto Serif Display,Noto Serif Disp SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifTamil-ExtraCondensedExtraBold.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansSinhalaUI-Condensed.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond:style=Condensed,Regular
- NotoSansDisplay-BlackItalic.ttf: Noto Sans Display,Noto Sans Disp Blk:style=Black Italic,Italic
- NotoSansLao-Bold.ttf: Noto Sans Lao:style=Bold
- NotoSans-SemiCondensedExtraBoldItalic.ttf: Noto Sans,Noto Sans SemCond ExtBd:style=SemiCondensed ExtraBold Italic,Italic
- NotoSansCherokee-Light.ttf: Noto Sans Cherokee,Noto Sans Cherokee Light:style=Light,Regular
- NotoSerifGeorgian-CondensedMedium.ttf: Noto Serif Georgian,Noto Serif Georgian Cn Md:style=Condensed Medium,Regular
- NotoSansTamil-ExtraCondensedThin.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond Thin:style=ExtraCondensed Thin,Regular
- P052-BoldItalic.otf: P052:style=Bold Italic
- NotoSansSinhala-SemiCondensedSemiBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansHebrew-ExtraCondensed.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond:style=ExtraCondensed,Regular
- NotoSansLaoUI-CondensedBlack.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond Blk:style=Condensed Black,Regular
- NotoSansLaoUI-ExtraCondensedBlack.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansLydian-Regular.ttf: Noto Sans Lydian:style=Regular
- NotoSansKhmer-SemiCondensedSemiBold.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansArabicUI-Bold.ttf: Noto Sans Arabic UI:style=Bold
- NotoSansMono-ExtraCondensedLight.ttf: Noto Sans Mono,Noto Sans Mono ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifGeorgian-CondensedBold.ttf: Noto Serif Georgian,Noto Serif Georgian Cn:style=Condensed Bold,Bold
- NotoSerifGeorgian-ExtraLight.ttf: Noto Serif Georgian,Noto Serif Georgian XLt:style=ExtraLight,Regular
- NotoSansKhmer-Regular.ttf: Noto Sans Khmer:style=Regular
- NotoSansDisplay-SemiCondensedSemiBold.ttf: Noto Sans Display,Noto Sans Disp SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSerifArmenian-ExtraLight.ttf: Noto Serif Armenian,Noto Serif Armenian XLt:style=ExtraLight,Regular
- NotoSerifKannada-Regular.ttf: Noto Serif Kannada:style=Regular
- NotoSansCJKtc-Bold.otf: Noto Sans CJK TC,Noto Sans CJK TC Bold:style=Bold,Regular
- NotoSans-SemiCondensedThinItalic.ttf: Noto Sans,Noto Sans SemCond Thin:style=SemiCondensed Thin Italic,Italic
- NotoSansOldPersian-Regular.ttf: Noto Sans Old Persian:style=Regular
- NotoSansMono-SemiCondensedBold.ttf: Noto Sans Mono,Noto Sans Mono SemCond:style=SemiCondensed Bold,Bold
- NotoSans-ExtraCondensedLight.ttf: Noto Sans,Noto Sans ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansKhmerUI-Light.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Light:style=Light,Regular
- NotoSansSinhalaUI-ExtraCondensed.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond:style=ExtraCondensed,Regular
- NotoSerifCJKsc-Black.otf: Noto Serif CJK SC,Noto Serif CJK SC Black:style=Black,Regular
- NotoSerifEthiopic-SemiCondensedBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn:style=SemiCondensed Bold,Bold
- NotoSansCham-SemiBold.ttf: Noto Sans Cham,Noto Sans Cham SemBd:style=SemiBold,Regular
- NotoSansMono-Bold.ttf: Noto Sans Mono:style=Bold
- NotoSansDisplay-SemiCondensedSemiBoldItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond SemBd:style=SemiCondensed SemiBold Italic,Italic
- NotoSansTamilUI-CondensedExtraLight.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansSymbols-Regular.ttf: Noto Sans Symbols:style=Regular
- NotoSansTagbanwa-Regular.ttf: Noto Sans Tagbanwa:style=Regular
- NotoSansKhmerUI-ExtraCondensedMedium.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansArmenian-Regular.ttf: Noto Sans Armenian:style=Regular
- NotoSansCJKkr-Regular.otf: Noto Sans CJK KR,Noto Sans CJK KR Regular:style=Regular
- NotoSansMyanmar-CondensedMedium.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond Med:style=Condensed Medium,Regular
- NotoSansThaiUI-Black.ttf: Noto Sans Thai UI,Noto Sans Thai UI Blk:style=Black,Regular
- NotoSerifEthiopic-CondensedBlack.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn Bk:style=Condensed Black,Regular
- NotoSansEthiopic-SemiCondensedSemiBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansKhmerUI-Condensed.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond:style=Condensed,Regular
- NotoSansThaiUI-CondensedSemiBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansMyanmarUI-ExtraCondensedBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn:style=ExtraCondensed Bold,Bold
- NotoSerifEthiopic-ExtraBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XBd:style=ExtraBold,Regular
- NotoSerif-SemiCondensedMediumItalic.ttf: Noto Serif,Noto Serif SemCond Med:style=SemiCondensed Medium Italic,Italic
- NotoSansCJKkr-Bold.otf: Noto Sans CJK KR,Noto Sans CJK KR Bold:style=Bold,Regular
- NotoSerifGeorgian-ExtraCondensedExtraBold.ttf: Noto Serif Georgian,Noto Serif Georgian XCn XBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansGeorgian-Regular.ttf: Noto Sans Georgian:style=Regular
- NotoSerifCJKjp-Bold.otf: Noto Serif CJK JP:style=Bold
- NotoSansSymbols-SemiBold.ttf: Noto Sans Symbols,Noto Sans Symbols SemBd:style=SemiBold,Regular
- NotoSerifLao-Light.ttf: Noto Serif Lao,Noto Serif Lao Light:style=Light,Regular
- NotoSerifCJKjp-Black.otf: Noto Serif CJK JP,Noto Serif CJK JP Black:style=Black,Regular
- NotoSansAdlam-Regular.ttf: Noto Sans Adlam:style=Regular
- NotoSansDevanagari-ExtraLight.ttf: Noto Sans Devanagari,Noto Sans Devanagari XLt:style=ExtraLight,Regular
- NotoSerifDisplay-CondensedBlack.ttf: Noto Serif Display,Noto Serif Disp Cond Blk:style=Condensed Black,Regular
- NotoSansTamilUI-CondensedBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil Cond:style=Condensed Bold,Bold
- NotoSansArmenian-ExtraCondensedThin.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifDisplay-CondensedExtraLightItalic.ttf: Noto Serif Display,Noto Serif Disp Cond ExtLt:style=Condensed ExtraLight Italic,Italic
- NotoSansEthiopic-ExtraCondensedBlack.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansCJKsc-Black.otf: Noto Sans CJK SC,Noto Sans CJK SC Black:style=Black,Regular
- NotoSansThaiUI-CondensedExtraLight.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansMono-ExtraCondensedSemiBold.ttf: Noto Sans Mono,Noto Sans Mono ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifEthiopic-Thin.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Th:style=Thin,Regular
- NotoSerifEthiopic-ExtraCondensedSemiBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn SmBd:style=ExtraCondensed SemiBold,Regular
- NotoSansKhmer-CondensedBold.ttf: Noto Sans Khmer,Noto Sans Khmer Cond:style=Condensed Bold,Bold
- NotoSansDisplay-SemiCondensedBlackItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond Blk:style=SemiCondensed Black Italic,Italic
- NotoSansKaithi-Regular.ttf: Noto Sans Kaithi:style=Regular
- NotoSansYi-Regular.ttf: Noto Sans Yi:style=Regular
- NotoSansArmenian-SemiCondensedExtraBold.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSerifKhmer-SemiCondensedExtraLight.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoNaskhArabic-Regular.ttf: Noto Naskh Arabic:style=Regular
- NotoSansArabic-Bold.ttf: Noto Sans Arabic:style=Bold
- NotoSansThai-ExtraCondensedExtraLight.ttf: Noto Sans Thai,Noto Sans Thai ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansDisplay-CondensedMediumItalic.ttf: Noto Sans Display,Noto Sans Disp Cond Med:style=Condensed Medium Italic,Italic
- NotoSansDisplay-SemiCondensedLight.ttf: Noto Sans Display,Noto Sans Disp SemCond Light:style=SemiCondensed Light,Regular
- NotoSansSinhalaUI-CondensedSemiBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansSinhala-ExtraBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtBd:style=ExtraBold,Regular
- NotoSansMono-Condensed.ttf: Noto Sans Mono,Noto Sans Mono Cond:style=Condensed,Regular
- NotoSerifEthiopic-SemiCondensedThin.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn Th:style=SemiCondensed Thin,Regular
- NotoSansThai-CondensedExtraBold.ttf: Noto Sans Thai,Noto Sans Thai Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSerif-CondensedExtraLightItalic.ttf: Noto Serif,Noto Serif Cond ExtLt:style=Condensed ExtraLight Italic,Italic
- NotoSerifDisplay-SemiCondensedLight.ttf: Noto Serif Display,Noto Serif Disp SemCond Light:style=SemiCondensed Light,Regular
- NotoSansArmenian-CondensedBold.ttf: Noto Sans Armenian,Noto Sans Armenian Cond:style=Condensed Bold,Bold
- NotoSansThaiUI-CondensedMedium.ttf: Noto Sans Thai UI,Noto Sans Thai UI Cond Med:style=Condensed Medium,Regular
- NotoSansThai-ExtraCondensedSemiBold.ttf: Noto Sans Thai,Noto Sans Thai ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifCJKsc-Light.otf: Noto Serif CJK SC,Noto Serif CJK SC Light:style=Light,Regular
- D050000L.t1: D050000L:style=Regular
- NotoSansChakma-Regular.ttf: Noto Sans Chakma:style=Regular
- NotoSerifDisplay-SemiCondensedThinItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond Thin:style=SemiCondensed Thin Italic,Italic
- StandardSymbolsPS.otf: Standard Symbols PS:style=Regular
- NotoSansLao-SemiCondensedLight.ttf: Noto Sans Lao,Noto Sans Lao SemCond Light:style=SemiCondensed Light,Regular
- NotoSansSinhalaUI-SemiCondensedSemiBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSerifThai-SemiCondensedThin.ttf: Noto Serif Thai,Noto Serif Thai SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansThaiUI-ExtraCondensedMedium.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSerifMyanmar-ExtraCondensedBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifDisplay-CondensedExtraBold.ttf: Noto Serif Display,Noto Serif Disp Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansSinhala-SemiCondensedBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond:style=SemiCondensed Bold,Bold
- NotoSerifArmenian-SemiCondensedExtraLight.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn XLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifLao-ExtraCondensedExtraBold.ttf: Noto Serif Lao,Noto Serif Lao ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansThaiUI-SemiCondensedExtraBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSerifCJKtc-ExtraLight.otf: Noto Serif CJK TC,Noto Serif CJK TC ExtraLight:style=ExtraLight,Regular
- NotoSansMono-Medium.ttf: Noto Sans Mono,Noto Sans Mono Med:style=Medium,Regular
- NotoSansDisplay-CondensedExtraLightItalic.ttf: Noto Sans Display,Noto Sans Disp Cond ExtLt:style=Condensed ExtraLight Italic,Italic
- NotoSerifSinhala-ExtraBold.ttf: Noto Serif Sinhala,Noto Serif Sinhala ExtBd:style=ExtraBold,Regular
- NotoSerif-ExtraCondensedSemiBoldItalic.ttf: Noto Serif,Noto Serif ExtCond SemBd:style=ExtraCondensed SemiBold Italic,Italic
- NotoSansArabicUI-SemiCondensedBlack.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI SmCn Bk:style=SemiCondensed Black,Regular
- NotoSerifLao-Thin.ttf: Noto Serif Lao,Noto Serif Lao Thin:style=Thin,Regular
- NotoSansSinhala-ExtraCondensedBlack.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSerifLao-ExtraCondensedThin.ttf: Noto Serif Lao,Noto Serif Lao ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerif-CondensedBlack.ttf: Noto Serif,Noto Serif Cond Blk:style=Condensed Black,Regular
- NotoSansEthiopic-ExtraCondensedThin.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansMono-CondensedBlack.ttf: Noto Sans Mono,Noto Sans Mono Cond Blk:style=Condensed Black,Regular
- NotoSansGlagolitic-Regular.ttf: Noto Sans Glagolitic:style=Regular
- NotoSansThai-SemiCondensedBlack.ttf: Noto Sans Thai,Noto Sans Thai SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifLao-ExtraCondensedMedium.ttf: Noto Serif Lao,Noto Serif Lao ExtCond Med:style=ExtraCondensed Medium,Regular
- n019023l.pfb: Nimbus Sans L:style=Regular Italic
- NotoSansArabic-ExtraCondensedExtraBold.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansSinhalaUI-ExtraLight.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtLt:style=ExtraLight,Regular
- NotoSansHebrew-ExtraCondensedExtraLight.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifThai-Medium.ttf: Noto Serif Thai,Noto Serif Thai Med:style=Medium,Regular
- NotoSansLao-CondensedLight.ttf: Noto Sans Lao,Noto Sans Lao Cond Light:style=Condensed Light,Regular
- NotoSansHebrew-SemiCondensedExtraLight.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansMyanmar-SemiCondensed.ttf: Noto Sans Myanmar,Noto Sans Myanmar SemCond:style=SemiCondensed,Regular
- b018012l.pfb: URW Bookman L:style=Light
- NotoSansMandaic-Regular.ttf: Noto Sans Mandaic:style=Regular
- NotoSansDevanagariUI-ExtraCondensedBlack.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XCn Bk:style=ExtraCondensed Black,Regular
- NotoSansMonoCJKsc-Bold.otf: Noto Sans Mono CJK SC,Noto Sans Mono CJK SC Bold:style=Bold,Regular
- NotoSerif-CondensedExtraBoldItalic.ttf: Noto Serif,Noto Serif Cond ExtBd:style=Condensed ExtraBold Italic,Italic
- NotoSansArabic-ExtraCondensedMedium.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSerifCJKsc-Regular.otf: Noto Serif CJK SC:style=Regular
- NotoSansDevanagari-ExtraCondensedBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn:style=ExtraCondensed Bold,Bold
- NotoSansThai-Condensed.ttf: Noto Sans Thai,Noto Sans Thai Cond:style=Condensed,Regular
- NotoSansKhmer-SemiCondensedBold.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond:style=SemiCondensed Bold,Bold
- NotoSerifThai-Thin.ttf: Noto Serif Thai,Noto Serif Thai Thin:style=Thin,Regular
- NotoSansKhmer-SemiBold.ttf: Noto Sans Khmer,Noto Sans Khmer SemBd:style=SemiBold,Regular
- NotoMono-Regular.ttf: Noto Mono:style=Regular
- NotoSansSinhala-CondensedLight.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond Light:style=Condensed Light,Regular
- NotoSerifArmenian-ExtraCondensedMedium.ttf: Noto Serif Armenian,Noto Serif Armenian XCn Md:style=ExtraCondensed Medium,Regular
- NotoKufiArabic-Bold.ttf: Noto Kufi Arabic:style=Bold
- NotoSansArabic-CondensedExtraLight.ttf: Noto Sans Arabic,Noto Sans Arabic Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSerifDisplay-ExtraCondensed.ttf: Noto Serif Display,Noto Serif Disp ExtCond:style=ExtraCondensed,Regular
- NotoSansDisplay-Thin.ttf: Noto Sans Display,Noto Sans Disp Thin:style=Thin,Regular
- URWGothic-Demi.t1: URW Gothic:style=Demi
- NotoSerifTamil-CondensedExtraLight.ttf: Noto Serif Tamil,Noto Serif Tamil Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansArabicUI-ExtraCondensedLight.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn Lt:style=ExtraCondensed Light,Regular
- NimbusSans-Italic.t1: Nimbus Sans:style=Italic
- C059-BdIta.t1: C059:style=Bold Italic
- NotoSansDevanagari-ExtraCondensedBlack.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn Bk:style=ExtraCondensed Black,Regular
- NotoSansThaiUI-SemiCondensedMedium.ttf: Noto Sans Thai UI,Noto Sans Thai UI SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansDevanagari-ExtraCondensedMedium.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn Md:style=ExtraCondensed Medium,Regular
- NotoSerifCJKsc-SemiBold.otf: Noto Serif CJK SC,Noto Serif CJK SC SemiBold:style=SemiBold,Regular
- NotoSansMono-SemiCondensedExtraLight.ttf: Noto Sans Mono,Noto Sans Mono SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifHebrew-ExtraCondensed.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond:style=ExtraCondensed,Regular
- NotoSansHebrew-Condensed.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond:style=Condensed,Regular
- NotoSerifGeorgian-ExtraCondensedBold.ttf: Noto Serif Georgian,Noto Serif Georgian XCn:style=ExtraCondensed Bold,Bold
- NotoSerifThai-ExtraCondensed.ttf: Noto Serif Thai,Noto Serif Thai ExtCond:style=ExtraCondensed,Regular
- NimbusMonoPS-Bold.t1: Nimbus Mono PS:style=Bold
- NotoSansTamil-SemiCondensedMedium.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond Med:style=SemiCondensed Medium,Regular
- c059016l.pfb: Century Schoolbook L:style=Bold
- n022004l.pfb: Nimbus Mono L:style=Bold
- NotoSansCJKtc-Thin.otf: Noto Sans CJK TC,Noto Sans CJK TC Thin:style=Thin,Regular
- NotoSansLao-CondensedExtraBold.ttf: Noto Sans Lao,Noto Sans Lao Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSans-ExtraCondensedThinItalic.ttf: Noto Sans,Noto Sans ExtCond Thin:style=ExtraCondensed Thin Italic,Italic
- NotoSansDevanagari-ExtraCondensedExtraBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn XBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansGeorgian-CondensedThin.ttf: Noto Sans Georgian,Noto Sans Georgian Cond Thin:style=Condensed Thin,Regular
- NotoSansHebrew-CondensedExtraBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond ExtBd:style=Condensed ExtraBold,Regular
- n019024l.pfb: Nimbus Sans L:style=Bold Italic
- NotoSansArmenian-SemiCondensedMedium.ttf: Noto Sans Armenian,Noto Sans Armenian SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansTamil-Black.ttf: Noto Sans Tamil,Noto Sans Tamil Blk:style=Black,Regular
- NotoSerifTamil-CondensedSemiBold.ttf: Noto Serif Tamil,Noto Serif Tamil Cond SemBd:style=Condensed SemiBold,Regular
- NotoSerif-SemiBold.ttf: Noto Serif,Noto Serif SemBd:style=SemiBold,Regular
- NotoSansJavanese-Regular.ttf: Noto Sans Javanese:style=Regular
- NotoSerif-ExtraLight.ttf: Noto Serif,Noto Serif ExtLt:style=ExtraLight,Regular
- NotoSerifGeorgian-CondensedLight.ttf: Noto Serif Georgian,Noto Serif Georgian Cn Lt:style=Condensed Light,Regular
- NotoSansCham-Bold.ttf: Noto Sans Cham:style=Bold
- NotoSansKhmerUI-SemiCondensedBlack.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansArmenian-CondensedThin.ttf: Noto Sans Armenian,Noto Sans Armenian Cond Thin:style=Condensed Thin,Regular
- NotoSansDisplay-ExtraCondensedExtraLightItalic.ttf: Noto Sans Display,Noto Sans Disp ExtCond ExtLt:style=ExtraCondensed ExtraLight Italic,Italic
- NotoSansDevanagariUI-ExtraLight.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari XLt:style=ExtraLight,Regular
- NotoSansDisplay-SemiCondensedMediumItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond Med:style=SemiCondensed Medium Italic,Italic
- b018032l.pfb: URW Bookman L:style=Light Italic
- NotoSans-SemiBoldItalic.ttf: Noto Sans,Noto Sans SemBd:style=SemiBold Italic,Italic
- NotoSerifDisplay-SemiCondensedBoldItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond:style=SemiCondensed Bold Italic,Bold Italic
- NotoSansBrahmi-Regular.ttf: Noto Sans Brahmi:style=Regular
- NotoSansThai-SemiCondensedLight.ttf: Noto Sans Thai,Noto Sans Thai SemCond Light:style=SemiCondensed Light,Regular
- NotoSerifCJKtc-SemiBold.otf: Noto Serif CJK TC,Noto Serif CJK TC SemiBold:style=SemiBold,Regular
- NotoSansArmenian-ExtraCondensedSemiBold.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansLao-SemiBold.ttf: Noto Sans Lao,Noto Sans Lao SemBd:style=SemiBold,Regular
- NotoSansMono-CondensedSemiBold.ttf: Noto Sans Mono,Noto Sans Mono Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansGeorgian-SemiCondensedExtraBold.ttf: Noto Sans Georgian,Noto Sans Georgian SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansArabicUI-Black.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Bk:style=Black,Regular
- NotoSansMyanmarUI-SemiCondensedSemiBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn SmBd:style=SemiCondensed SemiBold,Regular
- p052003l.pfb: URW Palladio L:style=Roman
- NotoSans-ExtraCondensedBoldItalic.ttf: Noto Sans,Noto Sans ExtCond:style=ExtraCondensed Bold Italic,Bold Italic
- NotoSerifLao-ExtraCondensedBlack.ttf: Noto Serif Lao,Noto Serif Lao ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansOriya-Bold.ttf: Noto Sans Oriya:style=Bold
- NotoSansKhmerUI-Thin.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Thin:style=Thin,Regular
- NotoSansKayahLi-Regular.ttf: Noto Sans Kayah Li:style=Regular
- NotoSansCham-Thin.ttf: Noto Sans Cham,Noto Sans Cham Thin:style=Thin,Regular
- NotoSerifDisplay-Thin.ttf: Noto Serif Display,Noto Serif Disp Thin:style=Thin,Regular
- NotoSansMonoCJKkr-Bold.otf: Noto Sans Mono CJK KR,Noto Sans Mono CJK KR Bold:style=Bold,Regular
- NotoSans-CondensedThin.ttf: Noto Sans,Noto Sans Cond Thin:style=Condensed Thin,Regular
- NotoSansArabic-ExtraCondensedBold.ttf: Noto Sans Arabic,Noto Sans Arabic ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansCoptic-Regular.ttf: Noto Sans Coptic:style=Regular
- NotoSansDisplay-CondensedBlackItalic.ttf: Noto Sans Display,Noto Sans Disp Cond Blk:style=Condensed Black Italic,Italic
- NotoSansArabicUI-ExtraCondensedSemiBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn SmBd:style=ExtraCondensed SemiBold,Regular
- NotoSansSinhalaUI-ExtraCondensedBlack.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSerifEthiopic-SemiCondensedSemiBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn SmBd:style=SemiCondensed SemiBold,Regular
- NotoSerifMyanmar-Medium.ttf: Noto Serif Myanmar,Noto Serif Myanmar Med:style=Medium,Regular
- NotoSerif-CondensedBlackItalic.ttf: Noto Serif,Noto Serif Cond Blk:style=Condensed Black Italic,Italic
- NotoSansKhmerUI-SemiCondensedExtraBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansKhmerUI-SemiCondensedMedium.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI SemCond Med:style=SemiCondensed Medium,Regular
- NotoSansSinhalaUI-Regular.ttf: Noto Sans Sinhala UI:style=Regular
- NotoSansThai-Light.ttf: Noto Sans Thai,Noto Sans Thai Light:style=Light,Regular
- NotoSerifKhmer-SemiCondensedBlack.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond Blk:style=SemiCondensed Black,Regular
- NotoSansThaiUI-ExtraCondensedExtraBold.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansSinhalaUI-SemiCondensedBlack.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifHebrew-ExtraCondensedExtraLight.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifMyanmar-Light.ttf: Noto Serif Myanmar,Noto Serif Myanmar Light:style=Light,Regular
- NotoSansSymbols-Thin.ttf: Noto Sans Symbols,Noto Sans Symbols Thin:style=Thin,Regular
- URWGothic-DemiOblique.otf: URW Gothic:style=Demi Oblique
- NotoSansTamilUI-ExtraCondensedSemiBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifArmenian-CondensedSemiBold.ttf: Noto Serif Armenian,Noto Serif Armenian Cn SmBd:style=Condensed SemiBold,Regular
- NotoSansArabicUI-CondensedLight.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI Cn Lt:style=Condensed Light,Regular
- NotoSansCJKsc-Regular.otf: Noto Sans CJK SC,Noto Sans CJK SC Regular:style=Regular
- NotoSansMyanmar-CondensedBlack.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond Blk:style=Condensed Black,Regular
- NotoSansBatak-Regular.ttf: Noto Sans Batak:style=Regular
- NotoSansSinhala-CondensedSemiBold.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansArmenian-ExtraCondensedBlack.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansLaoUI-SemiCondensedExtraLight.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansArabicUI-ExtraCondensedMedium.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn Md:style=ExtraCondensed Medium,Regular
- NotoSerifDisplay-CondensedBold.ttf: Noto Serif Display,Noto Serif Disp Cond:style=Condensed Bold,Bold
- NotoSansHebrew-CondensedBlack.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond Blk:style=Condensed Black,Regular
- NotoSansMyanmar-CondensedThin.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond Thin:style=Condensed Thin,Regular
- NotoSansKhmerUI-ExtraBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtBd:style=ExtraBold,Regular
- NotoSansMono-ExtraCondensed.ttf: Noto Sans Mono,Noto Sans Mono ExtCond:style=ExtraCondensed,Regular
- NotoSansTamil-SemiBold.ttf: Noto Sans Tamil,Noto Sans Tamil SemBd:style=SemiBold,Regular
- NotoSerifThai-SemiCondensedSemiBold.ttf: Noto Serif Thai,Noto Serif Thai SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSerifTamil-CondensedThin.ttf: Noto Serif Tamil,Noto Serif Tamil Cond Thin:style=Condensed Thin,Regular
- NotoSerifLao-SemiCondensedBold.ttf: Noto Serif Lao,Noto Serif Lao SemCond:style=SemiCondensed Bold,Bold
- NotoSans-LightItalic.ttf: Noto Sans,Noto Sans Light:style=Light Italic,Italic
- NotoSerifDisplay-ExtraCondensedExtraLightItalic.ttf: Noto Serif Display,Noto Serif Disp ExtCond ExtLt:style=ExtraCondensed ExtraLight Italic,Italic
- P052-Bold.t1: P052:style=Bold
- NotoSerifTamil-ExtraCondensedMedium.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansMyanmarUI-ExtraCondensed.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn:style=ExtraCondensed,Regular
- NotoSansGeorgian-CondensedExtraBold.ttf: Noto Sans Georgian,Noto Sans Georgian Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansLao-ExtraCondensedThin.ttf: Noto Sans Lao,Noto Sans Lao ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansCJKsc-Medium.otf: Noto Sans CJK SC,Noto Sans CJK SC Medium:style=Medium,Regular
- NotoSansDisplay-Bold.ttf: Noto Sans Display,Noto Sans Disp:style=Bold
- NotoSansMyanmarUI-ExtraCondensedSemiBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn SmBd:style=ExtraCondensed SemiBold,Regular
- NotoSansDevanagari-SemiCondensedExtraBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn XBd:style=SemiCondensed ExtraBold,Regular
- NotoSansEthiopic-SemiCondensedBlack.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerifArmenian-CondensedLight.ttf: Noto Serif Armenian,Noto Serif Armenian Cn Lt:style=Condensed Light,Regular
- NotoSerifEthiopic-ExtraLight.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XLt:style=ExtraLight,Regular
- NotoSansDisplay-CondensedExtraLight.ttf: Noto Sans Display,Noto Sans Disp Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSerifGeorgian-SemiCondensedBold.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn:style=SemiCondensed Bold,Bold
- NotoSansDevanagariUI-Bold.ttf: Noto Sans Devanagari UI:style=Bold
- NotoSansMyanmarUI-SemiCondensedLight.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmCn Lt:style=SemiCondensed Light,Regular
- NotoSansEthiopic-CondensedExtraLight.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSans-SemiCondensedBoldItalic.ttf: Noto Sans,Noto Sans SemCond:style=SemiCondensed Bold Italic,Bold Italic
- NotoSansArmenian-ExtraCondensedBold.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansSinhalaUI-ExtraCondensedMedium.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSerifMyanmar-SemiBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar SemBd:style=SemiBold,Regular
- NotoSansDevanagariUI-SemiCondensedExtraLight.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn XLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifHebrew-SemiCondensedThin.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSerifTamil-SemiCondensedLight.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond Light:style=SemiCondensed Light,Regular
- NotoSansEthiopic-ExtraCondensed.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond:style=ExtraCondensed,Regular
- NotoSerifEthiopic-SemiCondensed.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic SmCn:style=SemiCondensed,Regular
- NotoSerif-Regular.ttf: Noto Serif:style=Regular
- NotoSansMyanmar-CondensedExtraLight.ttf: Noto Sans Myanmar,Noto Sans Myanmar Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansKhmer-ExtraBold.ttf: Noto Sans Khmer,Noto Sans Khmer ExtBd:style=ExtraBold,Regular
- NotoSansMyanmarUI-Thin.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Th:style=Thin,Regular
- NotoSerifMyanmar-ExtraLight.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtLt:style=ExtraLight,Regular
- NotoSerifDisplay-Light.ttf: Noto Serif Display,Noto Serif Disp Light:style=Light,Regular
- n019004l.pfb: Nimbus Sans L:style=Bold
- NotoSansHebrew-Regular.ttf: Noto Sans Hebrew:style=Regular
- NotoSansGeorgian-Light.ttf: Noto Sans Georgian,Noto Sans Georgian Light:style=Light,Regular
- NotoSansArmenian-ExtraLight.ttf: Noto Sans Armenian,Noto Sans Armenian ExtLt:style=ExtraLight,Regular
- b018015l.pfb: URW Bookman L:style=Demi Bold
- NotoSerif-BoldItalic.ttf: Noto Serif:style=Bold Italic
- NotoSerif-SemiCondensedExtraLight.ttf: Noto Serif,Noto Serif SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifTamil-ExtraCondensedBold.ttf: Noto Serif Tamil,Noto Serif Tamil ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansSinhala-ExtraCondensedMedium.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansTamil-SemiCondensedSemiBold.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansArabic-SemiCondensedExtraLight.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerifTamil-CondensedLight.ttf: Noto Serif Tamil,Noto Serif Tamil Cond Light:style=Condensed Light,Regular
- NotoSansLaoUI-ExtraLight.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtLt:style=ExtraLight,Regular
- NotoSansSinhalaUI-ExtraCondensedExtraBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansLao-ExtraCondensed.ttf: Noto Sans Lao,Noto Sans Lao ExtCond:style=ExtraCondensed,Regular
- NotoSansHebrew-SemiCondensedLight.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond Light:style=SemiCondensed Light,Regular
- NotoSansEthiopic-ExtraCondensedExtraBold.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansKhmer-SemiCondensedExtraBold.ttf: Noto Sans Khmer,Noto Sans Khmer SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansTeluguUI-Bold.ttf: Noto Sans Telugu UI:style=Bold
- NotoSansDevanagariUI-Thin.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Th:style=Thin,Regular
- n022024l.pfb: Nimbus Mono L:style=Bold Oblique
- NotoSerifTamil-CondensedBlack.ttf: Noto Serif Tamil,Noto Serif Tamil Cond Blk:style=Condensed Black,Regular
- NotoSansMono-SemiCondensedSemiBold.ttf: Noto Sans Mono,Noto Sans Mono SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansSinhala-ExtraCondensedLight.ttf: Noto Sans Sinhala,Noto Sans Sinhala ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerif-SemiCondensedThinItalic.ttf: Noto Serif,Noto Serif SemCond Thin:style=SemiCondensed Thin Italic,Italic
- NotoSansDevanagari-CondensedBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn:style=Condensed Bold,Bold
- NotoSerifKhmer-Medium.ttf: Noto Serif Khmer,Noto Serif Khmer Med:style=Medium,Regular
- NotoSansPhagsPa-Regular.ttf: Noto Sans Phags Pa:style=Regular
- P052-Italic.t1: P052:style=Italic
- NotoSansKhmerUI-ExtraCondensedLight.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansDisplay-ExtraCondensedLight.ttf: Noto Sans Display,Noto Sans Disp ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansMyanmar-ExtraCondensedBlack.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSerif-ExtraCondensedThinItalic.ttf: Noto Serif,Noto Serif ExtCond Thin:style=ExtraCondensed Thin Italic,Italic
- NotoSerifMyanmar-ExtraCondensedMedium.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSerifArmenian-ExtraCondensedLight.ttf: Noto Serif Armenian,Noto Serif Armenian XCn Lt:style=ExtraCondensed Light,Regular
- NotoSansLao-SemiCondensedThin.ttf: Noto Sans Lao,Noto Sans Lao SemCond Thin:style=SemiCondensed Thin,Regular
- NotoSansThaiUI-ExtraCondensed.ttf: Noto Sans Thai UI,Noto Sans Thai UI ExtCond:style=ExtraCondensed,Regular
- NotoSansPhoenician-Regular.ttf: Noto Sans Phoenician:style=Regular
- NotoSansSinhala-CondensedThin.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond Thin:style=Condensed Thin,Regular
- NotoSansDisplay-ExtraCondensedSemiBold.ttf: Noto Sans Display,Noto Sans Disp ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansDevanagariUI-SemiCondensedBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn:style=SemiCondensed Bold,Bold
- NotoSerifArmenian-Bold.ttf: Noto Serif Armenian:style=Bold
- NotoSansGeorgian-ExtraCondensedSemiBold.ttf: Noto Sans Georgian,Noto Sans Georgian ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansBengaliUI-Medium.ttf: Noto Sans Bengali UI,Noto Sans Bengali Med:style=Medium,Regular
- NotoSansCJKsc-Light.otf: Noto Sans CJK SC,Noto Sans CJK SC Light:style=Light,Regular
- NotoSansDisplay-ExtraCondensedThin.ttf: Noto Sans Display,Noto Sans Disp ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansTamilUI-Regular.ttf: Noto Sans Tamil UI:style=Regular
- NotoSansTamilUI-SemiCondensedExtraLight.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansDisplay-SemiCondensed.ttf: Noto Sans Display,Noto Sans Disp SemCond:style=SemiCondensed,Regular
- NotoSerifDisplay-SemiCondensedExtraLightItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond ExtLt:style=SemiCondensed ExtraLight Italic,Italic
- NimbusSansNarrow-Regular.t1: Nimbus Sans Narrow:style=Regular
- NotoSansBengali-SemiBold.ttf: Noto Sans Bengali,Noto Sans Bengali SemBd:style=SemiBold,Regular
- NotoSansTamilUI-ExtraCondensedThin.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSerifDisplay-SemiCondensedSemiBold.ttf: Noto Serif Display,Noto Serif Disp SemCond SemBd:style=SemiCondensed SemiBold,Regular
- NotoSansTamil-Regular.ttf: Noto Sans Tamil:style=Regular
- NotoSans-BoldItalic.ttf: Noto Sans:style=Bold Italic
- NotoSansKhmerUI-Black.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Blk:style=Black,Regular
- NotoSerifDisplay-CondensedMediumItalic.ttf: Noto Serif Display,Noto Serif Disp Cond Med:style=Condensed Medium Italic,Italic
- NotoSerifEthiopic-CondensedExtraBold.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn XBd:style=Condensed ExtraBold,Regular
- NotoSans-ExtraBold.ttf: Noto Sans,Noto Sans ExtBd:style=ExtraBold,Regular
- NotoSansThai-ExtraCondensedBlack.ttf: Noto Sans Thai,Noto Sans Thai ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSerifMyanmar-ExtraBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar ExtBd:style=ExtraBold,Regular
- NotoSans-SemiCondensedExtraLight.ttf: Noto Sans,Noto Sans SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSansLaoUI-ExtraCondensedExtraLight.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifKhmer-ExtraCondensed.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond:style=ExtraCondensed,Regular
- NotoSansDevanagari-SemiCondensedThin.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn Th:style=SemiCondensed Thin,Regular
- NotoSerifEthiopic-ExtraCondensedLight.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic XCn Lt:style=ExtraCondensed Light,Regular
- NotoSansEthiopic-ExtraLight.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtLt:style=ExtraLight,Regular
- NotoSansDisplay-SemiCondensedThinItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond Thin:style=SemiCondensed Thin Italic,Italic
- NotoSerifGeorgian-SemiCondensedSemiBold.ttf: Noto Serif Georgian,Noto Serif Georgian SmCn SmBd:style=SemiCondensed SemiBold,Regular
- NotoSansKhmer-Bold.ttf: Noto Sans Khmer:style=Bold
- NotoSansLao-SemiCondensed.ttf: Noto Sans Lao,Noto Sans Lao SemCond:style=SemiCondensed,Regular
- NotoSansMono-CondensedExtraBold.ttf: Noto Sans Mono,Noto Sans Mono Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansMono-ExtraCondensedBold.ttf: Noto Sans Mono,Noto Sans Mono ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansTeluguUI-Regular.ttf: Noto Sans Telugu UI:style=Regular
- NotoSansHebrew-ExtraCondensedBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew ExtCond:style=ExtraCondensed Bold,Bold
- NotoSerifCJKkr-ExtraLight.otf: Noto Serif CJK KR,Noto Serif CJK KR ExtraLight:style=ExtraLight,Regular
- NotoSerifKhmer-SemiCondensedBold.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond:style=SemiCondensed Bold,Bold
- NotoSerifArmenian-CondensedThin.ttf: Noto Serif Armenian,Noto Serif Armenian Cn Th:style=Condensed Thin,Regular
- NotoSerifTamil-CondensedBold.ttf: Noto Serif Tamil,Noto Serif Tamil Cond:style=Condensed Bold,Bold
- NotoSerifArmenian-CondensedMedium.ttf: Noto Serif Armenian,Noto Serif Armenian Cn Md:style=Condensed Medium,Regular
- NotoSansLao-Medium.ttf: Noto Sans Lao,Noto Sans Lao Med:style=Medium,Regular
- NotoSerifHebrew-CondensedExtraLight.ttf: Noto Serif Hebrew,Noto Serif Hebrew Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansLaoUI-SemiCondensedBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond:style=SemiCondensed Bold,Bold
- NotoSansArabic-Light.ttf: Noto Sans Arabic,Noto Sans Arabic Light:style=Light,Regular
- NotoSansKhmerUI-CondensedSemiBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansThai-CondensedBlack.ttf: Noto Sans Thai,Noto Sans Thai Cond Blk:style=Condensed Black,Regular
- NotoSansKhmerUI-CondensedBlack.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond Blk:style=Condensed Black,Regular
- NotoSansKhmerUI-ExtraCondensedSemiBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond SemBd:style=ExtraCondensed SemiBold,Regular
- NotoSansBalinese-Regular.ttf: Noto Sans Balinese:style=Regular
- NotoSansArmenian-ExtraCondensedLight.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSerifLao-CondensedBlack.ttf: Noto Serif Lao,Noto Serif Lao Cond Blk:style=Condensed Black,Regular
- NotoSansHebrew-CondensedBold.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond:style=Condensed Bold,Bold
- NotoSerifCJKkr-Black.otf: Noto Serif CJK KR,Noto Serif CJK KR Black:style=Black,Regular
- NotoSansMyanmarUI-Medium.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Md:style=Medium,Regular
- NotoSansDisplay-CondensedExtraBold.ttf: Noto Sans Display,Noto Sans Disp Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSansKhmer-ExtraCondensedMedium.ttf: Noto Sans Khmer,Noto Sans Khmer ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansKhmerUI-CondensedMedium.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI Cond Med:style=Condensed Medium,Regular
- NotoSansTamilUI-SemiCondensedExtraBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- C059-Bold.t1: C059:style=Bold
- NotoSansTibetan-Bold.ttf: Noto Sans Tibetan:style=Bold
- NotoSans-CondensedExtraLightItalic.ttf: Noto Sans,Noto Sans Cond ExtLt:style=Condensed ExtraLight Italic,Italic
- NotoSerifMyanmar-Bold.ttf: Noto Serif Myanmar:style=Bold
- NotoSerif-Thin.ttf: Noto Serif,Noto Serif Thin:style=Thin,Regular
- NotoSerif-CondensedSemiBoldItalic.ttf: Noto Serif,Noto Serif Cond SemBd:style=Condensed SemiBold Italic,Italic
- NotoSerifKhmer-SemiCondensed.ttf: Noto Serif Khmer,Noto Serif Khmer SemCond:style=SemiCondensed,Regular
- NotoSansMyanmar-ExtraCondensedLight.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansMyanmarUI-ExtraLight.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XLt:style=ExtraLight,Regular
- NotoSansLao-SemiCondensedBlack.ttf: Noto Sans Lao,Noto Sans Lao SemCond Blk:style=SemiCondensed Black,Regular
- NotoSerif-CondensedExtraBold.ttf: Noto Serif,Noto Serif Cond ExtBd:style=Condensed ExtraBold,Regular
- NotoSerifTamil-Bold.ttf: Noto Serif Tamil:style=Bold
- NotoSerifDisplay-SemiCondensedLightItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond Light:style=SemiCondensed Light Italic,Italic
- NotoSansTamil-SemiCondensedLight.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond Light:style=SemiCondensed Light,Regular
- NotoSansLaoUI-ExtraCondensedExtraBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansArmenian-ExtraCondensed.ttf: Noto Sans Armenian,Noto Sans Armenian ExtCond:style=ExtraCondensed,Regular
- NotoSerifArmenian-CondensedBold.ttf: Noto Serif Armenian,Noto Serif Armenian Cn:style=Condensed Bold,Bold
- NotoSerifDisplay-CondensedThin.ttf: Noto Serif Display,Noto Serif Disp Cond Thin:style=Condensed Thin,Regular
- NotoSansThai-CondensedThin.ttf: Noto Sans Thai,Noto Sans Thai Cond Thin:style=Condensed Thin,Regular
- NotoSerif-ExtraCondensedExtraBoldItalic.ttf: Noto Serif,Noto Serif ExtCond ExtBd:style=ExtraCondensed ExtraBold Italic,Italic
- NotoSerifEthiopic-CondensedThin.ttf: Noto Serif Ethiopic,Noto Serif Ethiopic Cn Th:style=Condensed Thin,Regular
- NotoSerif-ExtraCondensedExtraBold.ttf: Noto Serif,Noto Serif ExtCond ExtBd:style=ExtraCondensed ExtraBold,Regular
- NotoSansMono-Thin.ttf: Noto Sans Mono,Noto Sans Mono Thin:style=Thin,Regular
- NotoSerifEthiopic-Bold.ttf: Noto Serif Ethiopic:style=Bold
- NotoSansDevanagariUI-SemiBold.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmBd:style=SemiBold,Regular
- NotoSerifKhmer-ExtraBold.ttf: Noto Serif Khmer,Noto Serif Khmer ExtBd:style=ExtraBold,Regular
- NotoSansCJKtc-Medium.otf: Noto Sans CJK TC,Noto Sans CJK TC Medium:style=Medium,Regular
- NotoSerif-SemiCondensedLightItalic.ttf: Noto Serif,Noto Serif SemCond Light:style=SemiCondensed Light Italic,Italic
- NotoSansDisplay-CondensedThin.ttf: Noto Sans Display,Noto Sans Disp Cond Thin:style=Condensed Thin,Regular
- NotoSansMyanmar-ExtraCondensedMedium.ttf: Noto Sans Myanmar,Noto Sans Myanmar ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSerif-ExtraCondensedExtraLight.ttf: Noto Serif,Noto Serif ExtCond ExtLt:style=ExtraCondensed ExtraLight,Regular
- NotoSansHebrew-CondensedExtraLight.ttf: Noto Sans Hebrew,Noto Sans Hebrew Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansMonoCJKjp-Bold.otf: Noto Sans Mono CJK JP,Noto Sans Mono CJK JP Bold:style=Bold,Regular
- NotoSansSinhalaUI-SemiCondensedExtraBold.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSansTamil-ExtraCondensedLight.ttf: Noto Sans Tamil,Noto Sans Tamil ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansDevanagari-CondensedExtraBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn XBd:style=Condensed ExtraBold,Regular
- NotoSansGurmukhiUI-Bold.ttf: Noto Sans Gurmukhi UI:style=Bold
- NotoSerifKhmer-ExtraCondensedLight.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSansThaiUI-Bold.ttf: Noto Sans Thai UI:style=Bold
- NotoSansSinhala-CondensedExtraLight.ttf: Noto Sans Sinhala,Noto Sans Sinhala Cond ExtLt:style=Condensed ExtraLight,Regular
- c059036l.pfb: Century Schoolbook L:style=Bold Italic
- NotoSerifTamil-Medium.ttf: Noto Serif Tamil,Noto Serif Tamil Med:style=Medium,Regular
- NotoSerif-Light.ttf: Noto Serif,Noto Serif Light:style=Light,Regular
- NotoSerifDisplay-ExtraBold.ttf: Noto Serif Display,Noto Serif Disp ExtBd:style=ExtraBold,Regular
- p052024l.pfb: URW Palladio L:style=Bold Italic
- NotoSansSinhalaUI-Light.ttf: Noto Sans Sinhala UI,Noto Sans Sinhala Light:style=Light,Regular
- NotoSansMyanmarUI-ExtraCondensedExtraBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI XCn XBd:style=ExtraCondensed ExtraBold,Regular
- NotoSans-SemiCondensedMediumItalic.ttf: Noto Sans,Noto Sans SemCond Med:style=SemiCondensed Medium Italic,Italic
- NotoSerifGeorgian-ExtraCondensedMedium.ttf: Noto Serif Georgian,Noto Serif Georgian XCn Md:style=ExtraCondensed Medium,Regular
- NotoSansDevanagariUI-CondensedLight.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari Cn Lt:style=Condensed Light,Regular
- URWBookman-Light.t1: URW Bookman:style=Light
- DejaVuSerif.ttf: DejaVu Serif:style=Book
- NotoSansTamil-SemiCondensed.ttf: Noto Sans Tamil,Noto Sans Tamil SemCond:style=SemiCondensed,Regular
- NotoSansDisplay-CondensedBlack.ttf: Noto Sans Display,Noto Sans Disp Cond Blk:style=Condensed Black,Regular
- NotoSansEthiopic-ExtraCondensedMedium.ttf: Noto Sans Ethiopic,Noto Sans Ethiopic ExtCond Med:style=ExtraCondensed Medium,Regular
- NotoSansTibetan-Regular.ttf: Noto Sans Tibetan:style=Regular
- NotoSerifDisplay-SemiCondensedSemiBoldItalic.ttf: Noto Serif Display,Noto Serif Disp SemCond SemBd:style=SemiCondensed SemiBold Italic,Italic
- P052-Roman.otf: P052:style=Roman
- NotoSansLimbu-Regular.ttf: Noto Sans Limbu:style=Regular
- NotoSerifMyanmar-CondensedSemiBold.ttf: Noto Serif Myanmar,Noto Serif Myanmar Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansKhmerUI-ExtraCondensed.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond:style=ExtraCondensed,Regular
- NotoSansDisplay-SemiCondensedBoldItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond:style=SemiCondensed Bold Italic,Bold Italic
- NotoSansMyanmar-Light.ttf: Noto Sans Myanmar,Noto Sans Myanmar Light:style=Light,Regular
- NotoSansTifinagh-Regular.ttf: Noto Sans Tifinagh:style=Regular
- NotoSansCypriot-Regular.ttf: Noto Sans Cypriot:style=Regular
- NotoSansLao-SemiCondensedMedium.ttf: Noto Sans Lao,Noto Sans Lao SemCond Med:style=SemiCondensed Medium,Regular
- NotoSerifHebrew-ExtraLight.ttf: Noto Serif Hebrew,Noto Serif Hebrew ExtLt:style=ExtraLight,Regular
- NotoSansArabic-SemiCondensedBold.ttf: Noto Sans Arabic,Noto Sans Arabic SemCond:style=SemiCondensed Bold,Bold
- NotoSerifTamil-SemiCondensedBlack.ttf: Noto Serif Tamil,Noto Serif Tamil SemCond Blk:style=SemiCondensed Black,Regular
- NotoSans-Thin.ttf: Noto Sans,Noto Sans Thin:style=Thin,Regular
- NotoSansSamaritan-Regular.ttf: Noto Sans Samaritan:style=Regular
- NotoSansDisplay-SemiCondensedExtraBoldItalic.ttf: Noto Sans Display,Noto Sans Disp SemCond ExtBd:style=SemiCondensed ExtraBold Italic,Italic
- NotoSansLao-ExtraCondensedBlack.ttf: Noto Sans Lao,Noto Sans Lao ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansSyriacWestern-Regular.ttf: Noto Sans Syriac Western:style=Regular
- NotoSansArmenian-Medium.ttf: Noto Sans Armenian,Noto Sans Armenian Med:style=Medium,Regular
- NotoSansDevanagari-ExtraCondensedSemiBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari XCn SmBd:style=ExtraCondensed SemiBold,Regular
- NotoSansSinhala-SemiCondensedExtraLight.ttf: Noto Sans Sinhala,Noto Sans Sinhala SemCond ExtLt:style=SemiCondensed ExtraLight,Regular
- NotoSerif-Medium.ttf: Noto Serif,Noto Serif Med:style=Medium,Regular
- NotoSansCham-Regular.ttf: Noto Sans Cham:style=Regular
- NotoSansHebrew-SemiCondensedThin.ttf: Noto Sans Hebrew,Noto Sans Hebrew SemCond Thin:style=SemiCondensed Thin,Regular
- C059-Bold.otf: C059:style=Bold
- NotoSansDisplay-ExtraCondensedBlack.ttf: Noto Sans Display,Noto Sans Disp ExtCond Blk:style=ExtraCondensed Black,Regular
- NotoSansHebrew-Light.ttf: Noto Sans Hebrew,Noto Sans Hebrew Light:style=Light,Regular
- NotoSansDevanagari-CondensedSemiBold.ttf: Noto Sans Devanagari,Noto Sans Devanagari Cn SmBd:style=Condensed SemiBold,Regular
- NotoSerifLao-Condensed.ttf: Noto Serif Lao,Noto Serif Lao Cond:style=Condensed,Regular
- P052-Bold.otf: P052:style=Bold
- NotoSansMyanmarUI-SemiBold.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI SmBd:style=SemiBold,Regular
- NotoSansKhmerUI-ExtraCondensedThin.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansLaoUI-CondensedExtraLight.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond ExtLt:style=Condensed ExtraLight,Regular
- NotoSansMyanmarUI-CondensedBlack.ttf: Noto Sans Myanmar UI,Noto Sans Myanmar UI Cn Bk:style=Condensed Black,Regular
- NotoSansThai-SemiCondensedMedium.ttf: Noto Sans Thai,Noto Sans Thai SemCond Med:style=SemiCondensed Medium,Regular
- NotoSerifHebrew-SemiCondensedLight.ttf: Noto Serif Hebrew,Noto Serif Hebrew SemCond Light:style=SemiCondensed Light,Regular
- NotoSerifKhmer-ExtraCondensedBold.ttf: Noto Serif Khmer,Noto Serif Khmer ExtCond:style=ExtraCondensed Bold,Bold
- NotoSansTamilUI-ExtraCondensedLight.ttf: Noto Sans Tamil UI,Noto Sans Tamil ExtCond Light:style=ExtraCondensed Light,Regular
- NotoSans-ExtraCondensedExtraLightItalic.ttf: Noto Sans,Noto Sans ExtCond ExtLt:style=ExtraCondensed ExtraLight Italic,Italic
- NotoSansLao-CondensedSemiBold.ttf: Noto Sans Lao,Noto Sans Lao Cond SemBd:style=Condensed SemiBold,Regular
- NotoSerifArmenian-SemiCondensedLight.ttf: Noto Serif Armenian,Noto Serif Armenian SmCn Lt:style=SemiCondensed Light,Regular
- NotoSansDevanagari-SemiCondensedExtraLight.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn XLt:style=SemiCondensed ExtraLight,Regular
- NotoSansDevanagari-SemiCondensedMedium.ttf: Noto Sans Devanagari,Noto Sans Devanagari SmCn Md:style=SemiCondensed Medium,Regular
- NotoSerifDisplay-CondensedThinItalic.ttf: Noto Serif Display,Noto Serif Disp Cond Thin:style=Condensed Thin Italic,Italic
- NotoSansLaoUI-CondensedThin.ttf: Noto Sans Lao UI,Noto Sans Lao UI Cond Thin:style=Condensed Thin,Regular
- NotoSansLaoUI-SemiCondensedExtraBold.ttf: Noto Sans Lao UI,Noto Sans Lao UI SemCond ExtBd:style=SemiCondensed ExtraBold,Regular
- NotoSans-SemiBold.ttf: Noto Sans,Noto Sans SemBd:style=SemiBold,Regular
- NotoSansArabicUI-ExtraCondensedExtraLight.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn XLt:style=ExtraCondensed ExtraLight,Regular
- NotoSerifArmenian-ExtraCondensedSemiBold.ttf: Noto Serif Armenian,Noto Serif Armenian XCn SmBd:style=ExtraCondensed SemiBold,Regular
- NotoSerifKhmer-CondensedSemiBold.ttf: Noto Serif Khmer,Noto Serif Khmer Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansArabicUI-ExtraCondensedBold.ttf: Noto Sans Arabic UI,Noto Sans Arabic UI XCn:style=ExtraCondensed Bold,Bold
- NotoSansDevanagariUI-SemiCondensedMedium.ttf: Noto Sans Devanagari UI,Noto Sans Devanagari SmCn Md:style=SemiCondensed Medium,Regular
- NotoSans-Condensed.ttf: Noto Sans,Noto Sans Cond:style=Condensed,Regular
- NimbusRoman-Italic.otf: Nimbus Roman:style=Italic
- NotoSerifLao-CondensedSemiBold.ttf: Noto Serif Lao,Noto Serif Lao Cond SemBd:style=Condensed SemiBold,Regular
- NotoSansKhmerUI-ExtraCondensedBold.ttf: Noto Sans Khmer UI,Noto Sans Khmer UI ExtCond:style=ExtraCondensed Bold,Bold
- n019003l.pfb: Nimbus Sans L:style=Regular
- NotoSans-SemiCondensedBlackItalic.ttf: Noto Sans,Noto Sans SemCond Blk:style=SemiCondensed Black Italic,Italic
- NotoSerif-ExtraCondensedThin.ttf: Noto Serif,Noto Serif ExtCond Thin:style=ExtraCondensed Thin,Regular
- NotoSansMono-ExtraBold.ttf: Noto Sans Mono,Noto Sans Mono ExtBd:style=ExtraBold,Regular
- NotoSansTamilUI-Bold.ttf: Noto Sans Tamil UI:style=Bold
- NotoSerifArmenian-ExtraCondensedExtraBold.ttf: Noto Serif Armenian,Noto Serif Armenian XCn XBd:style=ExtraCondensed ExtraBold,Regular
- NotoSerif-LightItalic.ttf: Noto Serif,Noto Serif Light:style=Light Italic,Italic
- NotoSans-ThinItalic.ttf: Noto Sans,Noto Sans Thin:style=Thin Italic,Italic
- NotoSansTamilUI-SemiCondensedBold.ttf: Noto Sans Tamil UI,Noto Sans Tamil SemCond:style=SemiCondensed Bold,Bold
Operations on Renditions
The API gateway provides the following endpoints for the handling of renditions. The individual operations are documented in the corresponding object’s audit trail.
kind of rendition |
text |
pdf |
slide |
---|---|---|---|
Retrieval for current object version |
GET /api/dms/objects/{objectId}/contents/renditions/text |
GET /api/dms/objects/{objectId}/contents/renditions/pdf |
GET /api/dms/objects/{objectId}/contents/renditions/slide |
Retrieval for any object version |
- |
GET /api/dms/objects/{objectId}/versions/{versionNr}/contents/renditions/pdf |
GET /api/dms/objects/{objectId}/versions/{versionNr}/contents/renditions/slide |
Update |
POST /api/dms/objects/{objectId}/contents/renditions/text |
- |
- |
Rendition Repository
A default rendition repository can be configured. Renditions of supported types (listed below) of binary content files assigned to objects can be stored in the default rendition repository. Thus, renditions can be retrieved from storage and are not regenerated for each retrieval request. Whenever a rendition of a supported type is requested for an object, it is retrieved from the default rendition repository. If available, the stored rendition will be returned. If not available, the requested rendition is generated from the binary content file that is assigned to the object, stored in the default rendition repository and finally returned.
The initial generation of a rendition is triggered by its first request.
If a default rendition repository is configured and accessible, the following rendition types are managed in this repository:
Type | Content-Type | Description |
---|---|---|
|
|
The PDF representation of the binary content file. No distinction between PDF, PDF/A or PDF with embedded OCR. |
|
|
A thumbnail representation of the binary content file. |
If the default rendition repository is not available or not configured, any request for a rendition triggers the generation of a new rendition file. The result is returned but not stored in a repository. Thus, for subsequent requests of the same rendition, it has to be regenerated each time.
Asynchronous Full-text Indexing
The asynchronous full-text creation is integrated in the document lifecycle management and controlled by tagging. The operation of the responsable renditiontextworker
service requires the following configuration steps.
-
Create a cross-tenant service account for the
renditiontextworker
service. -
Configure its credentials via environment variables for the
renditiontextworker
service:-
YUUVIS_TENANT
- The tenant in which the cross-tenant service account is created. -
YUUVIS_USER
- The username of the cross-tenant service account. -
YUUVIS_PASSWORD
- The password of the cross-tenant service account.
-
-
Optional: The values can be protected in a Kubernetes secret.
-
Optional: If you want to store the calculated text renditions in the rendition repository, set the parameter
rendition.store.text: true
in a service-specific YAML configuration file, e.g.renditiontextworker-prod.yml
.
The renditiontextworker
is called via the preconfigured lifecycle hook in the system hook configuration:
{
"systemhooks": {
"amqp": [...],
"lifecycle": [
...
{
"type" : "dms.request.objects.upsert.database-before",
"enable" : true,
"predicate" : "spel:contentStreams != null && contentStreams.size() > 0 && contentStreams[0]['range'] != null",
"tagname": "system:ren:text",
"tagstate": 1
}
...
],
"webhooks": [...]
}
}
2.4.6. Audit Trail
The audit trail is the history protocol of an object, serving to document its entire lifecycle. It is managed by the audit
service. There are many different actions that trigger the creation of a new entry in the respective object’s audit trail.
The created audit entries are stored in a separated database table.
If necessary, the creation of specific audit entries can be skipped. Please be aware that the skipped audit entries are actually NOT CREATED ANYWHERE. The corresponding actions on DMS objects in your system will not be documented at all. |
The endpoint GET /dms/objects/{objectId}/history
endpoint returns the list of audit trail entries for the specified DMS object.
action code |
detail value |
subaction code |
Endpoints triggering the entry | Description |
---|---|---|---|---|
Import: |
||||
100 |
|
- |
POST |
The specified object was created by functions of the client or by an import without binary content. |
101 |
|
- |
POST POST |
The object was created using functions of the client or via an import operation including binary content. |
110 |
|
|
POST |
A tag for the object was created. |
Deletion: |
||||
200 |
|
- |
DELETE DELETE |
The object was deleted and cannot be restored. |
201 |
|
- |
As of 2023 Summer: DELETE |
Binary content of the object is removed. A new object version was created that has no |
202 |
|
- |
DELETE |
Object marked for deletion. |
210 |
|
|
DELETE |
The tag for the object was deleted. |
220 |
|
- |
DELETE |
The object version was deleted and cannot be restored. |
Update: |
||||
300 |
|
- |
POST PATCH |
The metadata of the object or its status was edited using functions of the client or via an update carried out during the import operation. |
301 |
|
- |
DELETE |
The document content was edited using functions of the client or via an update carried out during the import operation. |
302 |
|
- |
POST |
The document content and metadata were both edited within one request. |
303 |
|
- |
POST POST |
The object was updated and the binary content was moved. |
306 |
|
1 |
As of 2022 Winter: POST |
The rendition of the binary content file of a DMS object was added or updated via endpoint. The subaction specifies the type of rendition. |
310 |
|
- |
POST POST |
One of the object’s tags was changed. |
325 |
|
- |
POST |
The data of the old object version were used to update the current object version. |
340 |
|
- |
POST PATCH |
The value for the |
Retrieve: |
||||
400 |
|
- |
GET GET GET |
The document content was read by the user, printed, or otherwise output. No changes were made. As of 2022 Summer: If a user retrieves the binary content file of the same object version multiple times within 10 minutes, only the first retrieval is documented in the audit trail. The following processes internally retrieve the object’s binary content file and thus trigger the creation of an audit entry as well:
|
401 |
|
- |
POST GET GET GET |
The object’s metadata were retrieved for viewing. The following processes internally retrieve the object’s metadata and thus trigger the creation of an audit entry as well:
|
402 |
|
1 |
GET |
Rendition of the binary content accessed. If a user retrieves the same type of rendition for the same object multiple times within 10 minutes, only the first retrieval is documented in the audit trail. The subaction specifies the |
2 |
GET |
|||
3 |
GET |
2.5. Access Management
Any operation via yuuvis® Momentum API requires authentication. The authentication process is managed by the authentication
service and an identity provider of customer’s choice. The supported authentication methods are described below.
After successful authentication, a session is opened. The available operations within the session are determined by:
-
endpoint access configuration and
-
role-based permission for DMS operations.
2.5.1. Authentication against the Core API
A yuuvis® Momentum user has to be authenticated in order to be authorized to access to whatever resources or functions his role entitles him too. To achieve this, yuuvis® Momentum connects to an identity provider, which may offer Single Sign-On (SSO) functionality. An existing corporate systems environment usually already uses some sort of identity provider. An identity provider is a software managing user accounts and authentication, the classic example being Microsoft® Active Directory® (AD) or OpenLDAP implementations. Using the yuuvis® Momentum authentication
service requires an identity provider to handle authentication by providing the endpoints used in the OAuth 2.0 authorization workflows.
Choosing an Authentication Method
Depending on the circumstances in which your yuuvis® API client application is supposed to authenticate itself, the recommendation toward an authentication method changes. The diagram below shows an example decision process that should be adhered to by developers of yuuvis® API applications.
Authentication Method | Purpose |
---|---|
Authorization Code Flow |
This type of authentication flow is used to authenticate users coming from either browsers or mobile apps. Unauthenticated calls to the yuuvis® API are redirected to the identity provider, where the user authenticates using whatever method the identity provider is configured for. This can be a simple login form, Kerberos, a two- or multi-factor login, or anything else out of the multitude of possibilities. After authentication, the call is routed back to the yuuvis® API in authenticated form. |
Password Credentials Flow |
In this authentication flow, a client application transmits the users’ credentials together with its own client credentials to the yuuvis® API as the Base64-encoded content of an ‘Authorization’ header. This authentication flow lends itself to backend operations, such as applications migrating data to yuuvis® API. |
Device Flow |
This flow is intended to support any application that is supposed to work with yuuvis® API but does not have access to a native browser or the identity provider itself to obtain a pair of client credentials. An endpoint designed for this case supplies that kind of application with a user_code, device_code and verification URI which can be called using a remote browser to authenticate at the identity provider and obtain an access token. |
All OAuth 2.0 authentication flows end with the client application obtaining an access token representing the users’ credentials that can be used to authenticate at yuuvis® API. They form the basis for all available authentication procedures.
Authentication with Authorization Code Flow
When using web clients, authentication should be accomplished using the Authorization Code Flow. For each tenant known to the identity provider, an authentication URL is created that users of the tenant can use to reach login forms to authenticate with.
https://<yuuvis-base-url>/oauth/<tenant>
default
tenant:https://yuuvis.io/oauth/default
If an unauthenticated user tries to call any webclient URL other than the tenant-specific authentication URL and fails to supply a Tenant Header, he/she will be redirected to the tenant form of the identity provider. Once the authentication has been completed, all following calls to yuuvis® API URLs will be contextualized using tenant and identity of the user.
For every tenant that’s supposed to support this authentication flow, the properties clientId
, clientSecret
, userAuthorizationUri
, accessTokenUri
, userInfoUri
and userNameExtractionPattern
need to be defined for the authentication service. Optionally, the property ‘endSessionUri’ can be configured to ensure logging out of yuuvis® API also infers a logout at the identity provider.
If the authentication service only defines a single tenant, unauthenticated users may reach the login form of identity provider without naming their tenant.
Authentication with Basic Authentication
For client applications, dealing with the OAuth 2.0 flows can be circumvented by authenticating using basic authentication. Simply send the tenant and credentials of the user in the respective HTTP headers when trying to call any yuuvis® API endpoint. Behind the scenes, the entered credentials will be relayed into the authorization code flow, so the same configuration setup requirements apply.
"Authorization": "Basic <base64 encoded <username>:<password>>"
"X-ID-TENANT-NAME": "<tenant>"
"Authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQK"
"X-ID-Tenant-Name": "default"
Obtaining a Token with Password Credentials Flow
In this flow intended for backend applications, a client application requests an access token from the identity provider directly. However, it requires the client application to be registered at the identity provider, and in turn, the developer of the client application needs administrative access to the identity provider.
The credentials of a user (username, password) and the credentials of the trusted client (client_id, client_secret) together with a grant type flag are delivered to the identity providers’ token URL (i.e. https://<keycloak>/auth/realms/<tenant>/protocol/openid-connect/token
) as a text payload with the MimeType application/x-www-form-urlencoded
. The identity provider will respond with a token and a corresponding token type. This token then needs to be delivered to the Identity Provider similar to the user credentials during Basic authentication.
For this authentication flow, the authentication service’ application-oauth2.yml
configuration file must contain a configuration of the properties userInfoUri
and userNameExtractionPattern
for each tenant. Other tenant-specific configuration properties can be ignored for this flow.
Authentication at the API using an existing access token
For customers that want work with an enriched access token as their method of authentication for their client application, it’s possible to supply a valid access token instead of the credentials. The Password Credentials Flow can be used to obtain the token from the identity provider.
Similar to the credentials-based authentication, the authenticating access token is delivered to the API in the Authorization header.
For this authentication flow, the authentication service must contain a configuration of the properties userInfoUri
and userNameExtractionPattern
for each tenant. Other tenant-specific configuration properties can be ignored for this flow.
"Authorization": "Bearer <access token>>"
"X-ID-TENANT-NAME": "<tenant>"
"Authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQK"
"X-ID-Tenant-Name": "default"
Authentication at the API Using the OAuth 2.0 Device Flow
The OAuth 2.0 device flow serve to authenticate devices without native browsers or the ability to use the regular authentication flows to authenticate their native applications. The yuuvis® API authentication service implements the device flow based on its’ 12th revision (https://tools.ietf.org/html/draft-ietf-oauth-device-flow-12).
Device Flow Process
-
The client application calls
https://<base_url>/tenant/<tenant>/loginDevice
. yuuvis® API responds withdevice_code
,user_code
andverification_uri
-
The client application calls
https://<base_url>/<verfication_uri>?user_code=<user_code>
whereverification_uri
anduser_code
are replaced by the response from step 1. This redirects to the identity provider, where the user authenticates with his credentials. If there is no system browser available to the client application, the user can manually call this URI from any browser on any device. -
The client application starts polling the yuuvis® API authentication service for the status of the authentication at the URL
http://<host>/auth/info/state?device_code=<device_code>
. The polling interval can be derived from the response in step -
During the authentication process, the state polling will return the error
authorization_pending
with status 400. The first state poll after a successful authentication returns the access token and the token type with status 200. The two response parts need to be composited in theAuthorization
header like"Authorization": <token_type> <access_token>
and sent within a final call to any yuuvis® API endpoint, which will authenticate the user using the access token.
Five minutes after their issuance, device_code
and user_code
become invalid. Therefore the authentication needs to be completed within that time frame, otherwise the device flow needs to be repeated from the start. A client application can detect the passage of 5 minutes during polling when the verification URI yields the error expired_token
, implying that polling can be stopped. The lifespan of the user and device code can be configured in the authentication service using the property authentication.oauth2.deviceCodeExpiration
, which defines the codes’ TTL.
Authentication Using External Authentication Services
So far, we’ve detailed the authentication mechanisms available when using the proprietary yuuvis® API authentication service. It is likely that at a later date, most customers will be using yuuvis® API through a managed API gateway, authenticating using a subscription key tied to a platform-specific account (i.e. a Microsoft account for Azure Managed API) instead of user credentials. Since these managed API gateways replace both the Identity Provider and the authentication service, not much can be generally said about the way to authenticate at these external services. If you are using a yuuvis® API build utilizing such a managed API, refer to that API’s documentation when trying to authenticate.
Access via Certificate
In order to granularly manage system security, it is possible to enable a login via certificates that can be used by service accounts. Thus, it is not required anymore to specify user name and password for those accounts in a configuration file. If you want to use the authentication via certificates, ensure that it is supported by your identity provider. In this article, an example configuration is explained that uses Keycloak as identity provider.
An example service is available on GitHub.
Creating a Certificate
The following commands create a certificate to be used for a Kubernetes client within the cluster, e.g., a custom service. The ACCOUNT
variable contains the user name of the service account to which the login via certificate is to be configured.
ACCOUNT=service1 ; \
openssl genpkey -algorithm RSA -out $ACCOUNT-key.pem ; \
openssl req -new -x509 -days 365 -key $ACCOUNT-key.pem -out $ACCOUNT-cert.pem -subj /C=DE/ST=DE-DE/L=Berlin/CN=$ACCOUNT ; \
cat $ACCOUNT-key.pem $ACCOUNT-cert.pem > $ACCOUNT.pem ; \
rm $ACCOUNT-key.pem $ACCOUNT-cert.pem
Creating a Kubernetes Secret
The following command uses the previously created certificate to create a Kubernetes secret.
kubectl -n infrastructure create secret generic client-certificates \
--from-file=service1.pem=/path/to/service1.pem \
--from-file=service2.pem=/path/to/service2.pem
Adjusting the Stateful Set in Keycloak
-
With this command, the Stateful Set of Keycloak is opened for editing.
kubectl -n infrastructure edit sts keycloak
-
Register the secret as volume by extending the
volumes
section as follows:volumes: - name: client-certificates secret: secretName: client-certificates
-
Extend the
volumeMounts
section to activate the volume:volumeMounts: - name: client-certificates readOnly: true mountPath: /secrets/client-certificates
-
Register the certificate in the
env
section:- env: - name: X509_CA_BUNDLE value: /secrets/client-certificates/service1.pem /secrets/client-certificates/service2.pem
Configuring an Account in Keycloak
-
Create the account for which login via certificate should be supported via Users > Add user.
-
Optionally, you can set a password. Assign roles to the account according to its use case.
-
Create a new authentication flow:
-
Via Authentication > Flows > New, create a new Top Level Form. For Alias, use
Client Certificate
. -
Via Add execution, add an authentication step with the provider
X509/Validate Username
. -
Click the Actions link for the new authentication step and open the configuration menu.
-
Specify any Alias, e.g.,
User to certificate mapping
. -
For User Identity Source, select
Subject’s Common Name
. -
For User mapping method, select
Username or Email
. -
Save the configuration.
-
-
Create a Client dedicated to the new authentication flow:
-
Via Client > Create, create a new client with the ID
X509-access
. -
Deactivate Standard Flow Enabled.
-
Via the sub menu Authentication Flow Overrides, select the new Authentication
Flow Client Certificate
for Direct Grant Flow. -
Save the configuration.
-
Testing via curl
-
Test the access:
curl -i -k \ -d "client_id=X509-access" \ -d "grant_type=password" \ -E "service1.pem" \ "https://keycloak-https.infrastructure/auth/realms/yuuvistest/protocol/openid-connect/token"
-
Test the account identity:
curl -i -k \ -H "Accept: application/json" \ -H "Authorization: Bearer eyJhbGciOiJSUzI...." \ "https://keycloak-https.infrastructure/auth/realms/yuuvistest/protocol/openid-connect/userinfo"
2.5.2. Session Management
After a successful log-in process, the session state is stored by the authentication
service. If multiple service instances are used, it is stored in a Redis database.
A session cookie stores the identification of the user’s session via a Cookie Manager of the calling HTTP client (e.g., the browser) such that further requests of the same user are enriched with the session cookie GWSESSIONID
. Thus, the user does not need to log on again for each request.
If the client application uses a browser, the following cookies will be additionally set:
-
i18next
- Stores the language for the tenant selection web page (e.g.,en_US
orde
). -
tenant
- Stores the tenant that was selected on the tenant selection web page.
Further cookies might be set by your identity provider (e.g., Keycloak cookies).
2.5.3. Roles
The Core API protects documents against access by unauthorized persons through a permission system. Each user has one or more roles in this system, giving them access to various documents for specified actions. The user-role mapping manages the assignment of roles to users. In yuuvis® Momentum, this mapping is managed separately from the authentication process itself and can be configured according to the customers' needs. Furthermore, in the configuration of the yuuvis® authentication
service, access conditions can be defined individually for each API endpoint.
Structure of the Permissions System
Roles and Role Sets
The permissions to access documents or to perform certain actions are assigned to specific roles. Users of the system are assigned to particular roles, and through those role assignments acquire the permissions needed — they become the owner of the roles. In general, roles are reusable groups of various permissions. Each role has a unique name and contains one or more permissions that are granted to its owners.
In the header of each incoming and authenticated API call, the roles of the corresponding user are included among other user-specific information. If you assign too many roles with long names to individual users, you might exceed the overall size limit of 8 KB for the header. |
Permissions
Permissions denote access rights to certain objects and are assigned to a role. A permission consists of one or more actions and, optionally, a condition. The condition defines which objects are allowed to be managed by owners of a role with the permission, whereas actions define what procedures are allowed upon meeting the condition. In other words, if a user tries to access an object, the authorization system will go through that user’s roles to see if one of the conditions within their permissions is met by the object. If the object meets the condition of one of the user’s permissions, the user will be able to work with the object according to the actions defined by that permission.
- Actions
-
The actions of a permission specify access rights for specific purposes, whereby a distinction is currently made between
create
access,read
access,delete
access,write
access andtag
access (as of 2024 Spring). The actions can be combined by simply adding multiple actions to the permission.create
(as of 2021 Autumn)
permission to create new objects
read
permission to know about the existence of objects, to receive them in search results and to call various GET endpoints to a special object delete permission that allows to delete content or metadata of objects for which also
read
permission is grantedwrite
permission to update objects or to move the content of objects for which also
read
permission is grantedtag
permission to create/update/delete tags for objects for which also a
read
permission is granted. - Conditions
-
Conditions are statements in the proprietary CMIS-based query language that define the subset of documents in the system affected by a permission. If the condition for a document is met (meaning evaluating the query language expression returns
true
), the owner of the role gets to access that document. For example, conditions can limit a user’s access to a specific type of object or hide documents that are older than a specific date. The conditions are applied to all requests from the role owner and thereby act as filters for the corresponding search results.In a permission the CONTAINS()
query function cannot be used in a condition. The whole statement would always be evaluated asfalse
, even if the condition contains other sub-statements that do not useCONTAINS()
and that would individually be evaluated astrue
.The condition can also be left out – indicating that the permission applies to all documents in the system.
The following code block explains the definition of permissions with an example of creation permissions assigned to different roles.
Examples for Creation Permissions with Condition and without<!-- This role does not grant any permission to create, update or delete any object. --> <role> <name>CAN_CREATE_NOTHING</name> </role> <!-- This role grants creation permission for any object. No conditions have to be matched. --> <role> <name>CAN_CREATE_EVERYTHING</name> <permission> <action>create</action> </permission> </role> <!-- This role grants creation permission for objects that match the condition. In this case, only objects of type 'appTable:order' or 'appEmail:email' can be created. --> <role> <name>CAN_CREATE_SOMETHING</name> <permission> <action>create</action> <condition> system:objectTypeId IN ('appTable:order', 'appEmail:email') </condition> </permission> </role>
As of 2023 Summer, it is possible to specify conditions referencing the
abac
(attribute-based access control) section within the internal JWT (JSON Web Token). The following example role grantsread
permission for objects with at least one entry of the string list propertyappEmail:mailboxes
contained in the current user’s@abac.mailGroups
string list within the JWT.Example for Read Permissions with Condition<role> <name>CAN_CREATE_SOMETHING</name> <permission> <action>read</action> <condition> appEmail:mailboxes IN @abac.mailGroups </condition> </permission> </role>
Endpoints for Managing Permissions
The following endpoints are available for setting up and managing your tenant-specific permissions system:
-
Retrieve the tenant role set -
GET /api/admin/permissions
-
Update the tenant role set -
POST /api/admin/permissions
-
Validate the tenant role set -
POST /api/admin/permissions/validate
For system administrators, the following endpoints are available for managing the global permissions system:
-
Retrieve the global role set -
GET /api/system/permissions
-
Update the global role set -
POST /api/system/permissions
-
Validate the global role set -
POST /api/system/permissions/validate
Since version 2.4, yuuvis® Momentum has the ability to further structure the global role set into applications. This goes hand in hand with the usage of application schemata
, as the new functionality is meant to exclude any role set entries related to an optional application schema from the main global role set.
-
Retrieve a global application role set -
GET /api/system/apps/{app}/permissions
-
Update a global application role set -
POST /api/system/apps/{app}/permissions
-
Validate a global application role set -
POST /api/system/apps/{app}/permissions/validate
To streamline the process of defining yuuvis® Momentum role sets, a number of REST endpoints were made available to retrieve the current role set structures and to apply modifications. As seen in the permissions concept page, there are three options used to structure the role set, coming from two endpoint categories. The /system/permissions
and /system/apps/{app}/permissions
endpoints are both used to modify the global role set applicable to all users of the system, whereas the /admin/permissions
endpoint serves to change the role set specific to the current tenant.
Complete role set files can be supplied to one of the endpoints via an HTTP POST request, overwriting the previous role set present at that position. Thus, retrieving and extending the previous role set state using a GET request on the same endpoint is strongly recommended. New role sets can also be validated by posting them to the role set endpoint URLs using the added URL suffix /validate
.
Code examples in gitHub.
Role Administration
Defining Roles
The roles are defined in role sets. Each role set is stored via the configservice
in a file roleset.xml
that should only be changed using the above listed endpoints.
A role has a name and a list of permissions. Each permission can have one or more actions: read
, delete
and write
. Additionally, they can be restricted by a condition.
Example: a read-permission with the condition system:objectTypeId = 'email'
allows to receive all objects of type email
in search results and to call various GET endpoints for this type of objects.
<?xml version="1.0" encoding="utf-8"?>
<roleSet xmlns="http://optimal-systems.org/ns/dmscloud/roleset/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://optimal-systems.org/ns/dmscloud/roleset/dmsCloud-roles.xsd">
<role>
<name>RoleEmail</name>
<permission>
<action>read</action>
<condition>system:objectTypeId = 'email:email'</condition>
</permission>
</role>
<role>
<name>RoleDocument</name>
<permission>
<action>read</action>
<condition>system:objectTypeId = 'document'</condition>
</permission>
</role>
<role>
<name>RoleEmailAndDocument</name>
<permission>
<action>read</action>
<condition>system:objectTypeId in ('email:email', 'document')</condition>
</permission>
</role>
<role>
<name>AdminRole</name>
<permission>
<action>read</action>
<action>delete</action>
</permission>
</role>
</roleSet>
For the usage of some additional services a fixed role set is required. |
User-Role Mapping
When users log in at the beginning of a session and are successfully authenticated by the identity provider, a JSON web token is generated in which the users' roles are listed under authorities
. The GET user.info
webhook is responsible for providing the users' roles. By customizing the webhook, it is possible to connect any access management provider delivering the users' roles in a suitable format. Per default, the webhook calls the organization
service that is responsible for providing the role information.
To assign individual roles to the users of the system, an external identity provider is used, which takes over the responsibility for role assignment. Per default, the organization
service reads the keycloak profile and thus requests the information from the identity provider Keycloak.
In order to run the organization
service in Keycloak mode, the keycloak
profile has to be activated and the following connection parameters in the application-oauth2.yml
profile are required:
-
keycloak.server
-
keycloak.admin.username
-
keycloak.admin.password
The roles of users control their rights regarding DMS objects but also regarding yuuvis® Momentum administration. In the default configuration, e.g., the YUUVIS_SYSTEM_INTEGRATOR role allows editing of global configuration files like role sets and schemata. Thus, it is highly important to configure your role management software such that only system operators can assign roles that provide themselves and other users with global rights.
|
2.5.4. Endpoint Access Configuration
Access permissions can be configured for each endpoint (core API URLs and service URLs) in the yuuvis® API authentication service. For this purpose, endpoint patterns are assigned to access conditions.
For each incoming request, the first condition is determined with an endpoint pattern that matches the request URL. This condition is evaluated and decides whether access is granted or not. Access permissions without access conditions are granted after log in. The requesting client can identify rejected requests by the status code 403 (forbidden).
The access conditions are described in the access
attribute of the access permission. User attributes (like user ID, tenant membership or user roles) and request attributes (like IP address or request header) can be used. Complex access conditions can be formed with operators and functions.
By means of the expose
flag, endpoints can be made accessible for unauthenticated access. That means that clients can call the endpoint without having to log in first. The access condition for such endpoints can only contain functions for the evaluation of IP addresses and request headers. Access conditions for expose endpoints always have precedence over those with mandatory authentication, even if they are further down in the mapping list. Services that are called via expose endpoints cannot determine the identity of the caller, even if the caller was authenticated by another endpoint. Without the expose flag, access permissions are only granted after authentication.
Access permissions can be limited to specific HTTP methods (method attribute of the access permission). If you omit the specification, then the permission is applied to all HTTP methods. An access permission can contain multiple endpoint patterns and HTTP methods separated by commas.
Access permissions are registered as an authorization.accesses
list in the configuration of the authentication
service. If multiple lists are entered, only the last one is applied.
Rules for Endpoint Patterns
-
?
placeholder for exactly one random character -
*
placeholder for exactly one path segment -
**
placeholder for any number of path segments -
the query string cannot be included in the pattern
Examples:
-
/com/t?st.html
→ matches
com/test.html
but alsocom/tast.html
orcom/txst.html
-
/com/*.html
→ matches all
.html
files in the com directory -
/com/**/test.html
→ matches all test.html files underneath the com path
-
/org/springframework/*/.html
→ matches all
.html
files underneath theorg/springframework
path -
/org/**/servlet/test.html
→ matches
org/springframework/servlet/test.html
but alsoorg/springframework/testing/servlet/test.html
andorg/servlet/test.html
Syntax for Access Conditions
- Operators
-
-
or
,and
,()
- operators for forming complex access conditions -
==
- compares strings
-
- Functions for expose endpoints
-
-
hasIpAddress('<IP range>')
- returns true if the request comes from the passed IP address range -
hasHeader('<header name>', '<value>')
- returns true if the request contains the passed header and its value starts with the passed value
-
- Functions for endpoints with authentication requirement
-
-
permitAll()
- returns true (parentheses can be omitted) -
denyAll()
- returns false (parentheses can be omitted) -
not(<expression>)
- negates passed expression -
hasIpAddress('<IP range>')
- returns true if the request comes from the passed IP address range -
principal.getId()
- returns caller’s ID -
principal.getUsername()
- returns the login name of the user account (this can occur several times in multi-tenancy systems) -
principal.getTenant()
- returns the caller’s tenant -
hasAuthority('<user role>')
- returns true if the caller has the passed role -
hasAnyAuthority('<role1>','<role2>',…)
- returns true if the caller has one of the passed roles
-
Combined Examples
Callers from the IP address range 192.168.1.0/24
can access managed endpoints without authentication. All other callers must login and have one of the following roles: EXAMPLE_ADMIN_ROLE
or EXAMPLE_INTEGRATOR_ROLE
.
authorization.accesses:
- endpoints: /manage/**,/*/manage/**
expose: true
access: hasIpAddress('192.168.1.0/24')
- endpoints: /manage/**,/*/manage/**
access: hasAnyAuthority('EXAMPLE_ADMIN_ROLE','EXAMPLE_INTEGRATOR_ROLE')
Endpoints for using the web application are accessible for all authenticated users.
authorization.accesses:
- endpoints: /api/dms/**,/api-web/**,/api/sandbox/renditions/**
The yuuvis® core API is read-only. access: permitAll
can be omitted as it corresponds to the default setting. The prohibition condition for the POST method and DELETE method can also be omitted, because the access to unlisted endpoints is generally denied.
authorization.accesses:
- endpoints: /api/dms/objects/**
method: POST,DELETE
access: denyAll
- endpoints: /api/dms/objects/**
method: GET
access: permitAll
- endpoints: /api/dms/objects/search/**
method: POST
access: permitAll
Only users of the default tenant and dev tenant may use custom services.
authorization.accesses:
- endpoints: /custom/**
access: principal.getTenant() == 'default' or principal.getTenant() == 'dev'
Users of the dev tenant are denied access to the custom service. All other users have access.
authorization.accesses:
- endpoints: /custom/**
access: not(principal.getTenant() == 'dev')
The user with the ID 78d3b2a8535b
has unrestricted document access. All other users only have access to the latest document version.
authorization.accesses:
- endpoints: /api/dms/objects/*/versions/**
access: principal.getId() == '78d3b2a8535b'
- endpoints: /api/dms/objects/**
The users historyTracker
of all tenants only have access to the document history. They have no access to other document information. All other users have unrestricted document access.
authorization.accesses:
- endpoints: /api/dms/objects/*/history
- endpoints: /api/dms/objects/**
access: not(principal.getUsername() == 'historyTracker')
2.5.5. Internal JSON Web Tokens
Each call of a yuuvis® Momentum endpoint is routed through the authentication
service. After successful authentication, an internal JSON Web Token (JWT) is created and assigned to the call containing user-specific information. This JWT authorizes the call in every service within the data processing chain.
The JWT is assigned to the call via Authorization header.
Depending on the concrete call, multiple headers might be assigned to it (e.g. containing the user’s roles). However, the sum of all header sizes must not exceed the overall size limit of 8 KB. For systems with many roles and/or many custom user attributes, it is recommended to use the user attributes cache. |
Structure of internal JWTs
The internal JWTs consist of
-
header with signature algorithm RS256,
-
payload and
-
as of 2021 Autumn, a signature of header and payload.
These three parts are included as .-separated Base64-encoded blocks in each authorization request header for API calls, optionally encrypted.
The payload contains key-value pairs specifying the following parameters:
Parameter | Description |
---|---|
|
User ID of the user requesting the API call. |
|
Tenant the requesting user belongs to. |
|
Account name of the user. |
|
Contains the external authentication token taken from the identity provider. |
|
A list containing the roles that are assigned to the user. |
|
(as of 2023 Summer) Optional: a map with single string keys and a list of strings as value for each key. Allows for attribute-based access control (see example below). |
|
Identifies the time at which the JWT was issued. |
|
Identifies the expiration time on and after which the JWT MUST NOT be accepted for processing. Numeric date |
An example payload is displayed in the code block below (abac
section available as of 2023 Summer).
{
"sub": "3cfaf962-b254-45c8-b0e9-82f79f2c26ee",
"tenant": "sales-office",
"name": "mustermann",
"accessToken": "Bearer eyJhbGciOiJS...",
"iat": 1621324798,
"exp": 1621325698,
"authorities": [
"YUUVIS_DEFAULT",
"YUUVIS_MANAGE_SETTINGS",
"ACCESS_MAILBOXES"
],
"abac": {
"mailGroups": [
"mailbox_sales",
"mailbox_pm"
],
"sap_permissions": [
"sap_read",
"sap_write"
]
}
}
Caching User Attributes
The authentication
service can be configured to exclude the authorization
and abac
sections from the JWT to reduce its size. Instead, the full set of user attributes including authorization
and abac
sections is stored for 5 minutes in a userAttributes
Redis cache for each logged-in user.
All services within the yuuvis® Momentum cluster that need the authorization
and abac
information retrieve them from the userAttributes
Redis cache.
Within the cluster, the userAttributes
cache is available via Redis CLI:
-
The following command retrieves a list of all user attributes-related keys for all tenants:
redis-cli keys 'userAttributes*'
Each key contains the tenant und the user ID for a logged-in user. If only one user is currently logged-in, the response could be, e.g.,
redis-cli keys 'userAttributes*' 1) "userAttributes::yuuvistest,3cfaf962-b254-45c8-b0e9-82f79f2c26ee"
-
userAttributes
is the cache name. It is the same for all keys. -
yuuvistest
is the example tenant name. -
3cfaf962-b254-45c8-b0e9-82f79f2c26ee
is the example user ID.
-
-
For each key, the stored value contains the full set of user attributes for the corresponding user. For the example user, it can be retrieved via
redis-cli get userAttributes::yuuvistest,d90b12d5-1288-4a73-92fc-d9b6872df812
The response is a string containing the encoded JSON object, e.g.,
"\"{\\\"username\\\":\\\"root\\\",\\\"id\\\":\\\"d90b12d5-1288-4a73-92fc-d9b6872df812\\\",\\\"title\\\":\\\"First User\\\",\\\"email\\\":\\\"testroot@yuuvis\\\",\\\"firstname\\\":\\\"First\\\ ",\\\"lastname\\\":\\\"User\\\",\\\"domain\\\":\\\"dd\\\",\\\"tenant\\\":\\\"yuuvistest\\\",\\\"authorities\\\":[\\\"YUUVIS_DEFAULT\\\",\\\"YUUVIS_SYSTEM_INTEGRATOR\\\",\\\"YUUVIS_TENANT_ADMI N\\\"],\\\"accountNonExpired\\\":true,\\\"accountNonLocked\\\":true,\\\"credentialsNonExpired\\\":true,\\\"enabled\\\":true}\""
Furthermore, an internal endpoint of the authentication
service GET /session/updateUserAttributesCache/{tenant}/{userId}
is available. It can be called by services within the cluster to retrieve user information and refresh the cache in case a logged-in user is missing (e.g., if the maximum item storage time of 5 minutes is exceeded).
To activate the userAttributes
cache, the following points have to be considered:
-
The
authorization.cacheUserAttributes
parameter has to be configured totrue
in theauthentication-prod.yml
configuration file. -
All services that need
authorization
andabac
information require theredis
profile. This applies to the following core services:-
api
gateway -
audit
service -
authentication
service -
index
service -
registry
service -
repository
service -
search
service -
system
service
-
-
Custom services that might run within the yuuvis® Momentum cluster can retrieve
authorization
andabac
information from Redis or via the endpointGET /session/updateUserAttributesCache/{tenant}/{userId}
if necessary.
Validation of internal JWTs
In order to prevent unauthorized access from outside by faking the JWT, its signature can be used for an additional validation of the caller’s authorization. As of version 2022 Spring, the expiration date is validated as well. Thus, it is not possible to authenticate with a token anymore if its expiration date is exceeded. The validation is provided by the internal endpoint GET /jwt/verify
of the authentication
Service.
2.5.6. Accessing External Services via 'authentication' Service
The authentication
service manages the access to the yuuvis® Momentum API gateway. With a suitable configuration, also the access to external services running in the same Kubernetes cluster can be managed via the authentication
service of yuuvis® Momentum.
Involved Services
Two services of yuuvis® Momentum are responsible for the service routing:
-
the
authentication
service and -
the API gateway.
After successful authentication of incoming requests, the authentication
service sends the requests to the API gateway.
Configuring 'authentication' Service
The service has its own endpoints that are configured in the file authentication-prod.yml
in the section and authorization.accesses
. //docs Hier fehlt was nach "section"?
The authentication
service endpoints are only available for endpoints listed in authorization.accesses
. The following HTTP methods are supported and tested:
-
DELETE
-
GET
-
HEAD
-
OPTIONS
-
PATCH
-
POST
-
PUT
-
TRACE
Further HTTP methods can be used on the customers' own responsibility and have to be tested regularly by themselves.
Permissions can be defined for the access to the individual endpoints and sub-paths.
Configuring 'api' Gateway
The API gateway uses the Spring Cloud Kubernetes DiscoveryClient in order to dynamically create routes. This DiscoveryClient sends requests to the Kubernetes API. The corresponding permissions are configured via the Kubernetes objects ServiceAccount, RoleBinding and Role.
The pod for the API gateway is executed via the service account that is used by the DiscoveryClient to request namespaces.
The number of the Kubernetes Services can be limited. This can be configured in the filter for Kubernetes Services in the file application-kubernetes.yml. Internal routes are only created by the API gateway for services that match the filter. Per default, the following filter is applied: //docs Soll die yml hier nicht anders formatiert sein? Gilt auch für yuuvis:true in Zeile 49
metadata!=null && metadata.labels!=null && metadata.labels['yuuvis']=="true"
In order to create a route for a service in the API gateway, the entry yuuvis: true has to be added in the <externalservice>-service.yaml file in the labels section.
Example Configuration
In this example scenario, the required steps of configuration are shown. Afterwards, the external service app in the namespace other will be available via the authentication
service.
Follow these steps:
-
Deploy the pod for the external service app in the namespace
other
.app-deployment.yaml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
apiVersion: apps/v1 kind: Deployment metadata: namespace: other name: app spec: replicas: 1 selector: matchLabels: name: app template: metadata: labels: name: app spec: containers: - name: app ... ports: - containerPort: 80 ...
-
Create a Kubernetes Service for app in the namespace
other
, e.g., app-svc.app-service.yaml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
apiVersion: v1 kind: Service metadata: name: app-svc labels: name: app-svc namespace: other spec: ports: - name: "http" port: 80 targetPort: 80 selector: name: app type: ClusterIP
-
Create the Kubernetes Service in the namespace yuuvis. Use the type externalName that references the namespace other.
<externalservice>-service.yaml1 2 3 4 5 6 7 8 9 10 11 12
apiVersion: v1 kind: Service metadata: name: app labels: yuuvis: "true" namespace: yuuvis spec: type: ExternalName externalName: app-svc.other.svc.cluster.local ports: - port: 80
-
Add the external service app to the section
authorization.access
in the authentication-prod.yml file.authentiaction-prod.yml1 2 3 4
authorization.accesses: - endpoints: /app/** # add # optionally restrict to a method, e.g.: method: Post # optionally restrict to users with specific roles, e.g.: hasAuthority('COGNISPHERE')
-
Restart the
authentication
service.
2.5.7. Cross Tenant Service Accounts
Within your yuuvis® Momentum cluster, you might want to operate a service for asynchronous background processing that is working on all the data in your system independently of the tenant they belong to. Such services need to access the data of all tenants. In order to enhance their performance, they can use an internal service account (as of version 2021 Autumn) that allows for cross-tenant requests and thus avoid high numbers of requests to individual tenants. To configure internal service accounts, read this article carefully and make sure you do not skip any of the described configuration steps in order to ensure and secure the tenant separation.
General Remarks
The concept of service accounts is designed for the operation of background processes within the yuuvis® Momentum cluster.
-
The permissions for the service accounts are specified by the assignment of roles. We recommend to assign only roles that are available in all tenants.
-
The authentication with service accounts is accepted only within the yuuvis® Momentum cluster. External login attempts using service accounts are always rejected.
To ensure this access blocking, service accounts need to be explicitly specified in the yuuvis® Momentum configuration. -
Only selected endpoints of the API gateway can be called with service accounts.
-
In the identity provider, service accounts are associated with a tenant per definition. However, considering the permissions via their roles, they have access to resources of all tenants, e.g., objects including their binary content files and renditions.
Safety Note
The |
Available Endpoints
Every endpoint matching one of the following wildcard patterns can be called via service accounts. For some of them, only particular HTTP request methods are enabled. If not specified (n/a), all HTTP request methods supported by the core API are available.
Pattern | Limited to HTTP Request Methods |
---|---|
|
n/a |
|
POST |
|
n/a |
|
GET |
|
n/a |
|
POST |
As of 2022 Summer: |
PATCH |
Available Metadata Properties
A service account can operate on objects belonging to any tenant of the system. For each individual object, metadata properties can be accessed that are either system properties or defined in a schema that is available for the service account’s tenant:
-
system properties
-
properties defined in the global schema
-
properties defined in the tenant schema for the service account’s tenant
-
properties defined in an app schema that is available in all tenants
-
properties defined in an app schema that is available for the service account’s tenant
Those properties can be managed as usual and used in search queries.
Properties defined in the tenant schema of a different tenant or in an app schema that is not available within the service account’s tenant are not accessible. They cannot be retrieved, searched or modified.
Handling Cross-Tenant Requests
Each authorized request is enriched with an internal JSON Web Token (JWT) containing the service account’s tenant, among other information. If the request calls an operation on an object of a different tenant, the corresponding object’s system:tenant
in the request body will have a different value. It is important to keep this difference in mind, especially for the definition of system hooks.
An operation on an object performed via a service account will trigger the creation of a new entry in the audit trail as usual. Since the executor was the service account, its account ID as defined in the identity provider will be referenced. NOTE: If you are using yuuvis® client as reference implementation, the service account’s ID will also appear in the object history view as soon as the corresponding object has been processed via the service account.
Roles of a Service Account
The permissions of a service account are defined via its roles. Assign as few roles as possible, i.e., only the roles that are required for proper operation of your background process. We recommend to assign only roles that are available in all tenants:
-
roles defined in the global role set or
-
roles defined in an app-specific role set for a system-wide available app.
With roles defined in a tenant-specific role set or in an app-specific role set that is not available for all tenants, the service account will consequently have the corresponding permissions only within the corresponding tenant(s).
Configuring Service Accounts
Create a user account and assign roles in your identity provider.
-
Choose the tenant for the service account. As described above, tenant-specific properties of this tenant will be available for the service account.
-
Assign roles to the account that allow for the specific operations your background process needs to perform in cross-tenant manner. Do not assign more roles than necessary for your specific purpose. Avoid tenant-specific roles.
-
Extract the ID of the account for the configuration in yuuvis® Momentum.
Specify the service account in the yuuvis® Momentum authentication
service configuration.
-
In the configuration file
authentication-prod.yml
, add a new entry to theauthorization.serviceAccounts
list with the syntax<tenant>\<account-id>
.Example with two service accounts:
authorization.serviceAccounts: - account: 'services-tenant\ddffd2d5-5dc5-494a-b706-2250cefee60a' - account: 'services-tenant\fbbe75cf-008e-4de2-bced-f71e402b4369'
-
Restart the
authentication
service.
2.5.8. Customizing the Tenant Selection Web Page
Users accessing yuuvis® Momentum via a browser have to select their tenant before their credentials are requested. This tenant selection web page is provided by the authentication
service. In order to customize the design, it is possible to replace the underlying default form files by a set of custom form files.
Required Sources
A directory public
has to be available in the root of the authentication
service’s container when the service is started. In this public
directory, there must be at least the files tenant.html
and error.html
.
In the tenant.html
file, the reference on http://www.thymeleaf.org
(line 2) and the corresponding form definition are required (lines 11–12) in order to provide the tenant selection functionality.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="res/tenant.css" />
</head>
<body>
<span id="container">
<span>
<h3>Type in your tenant.</h3><br>
<form id="tenant" th:action="@{/tenant}" method="post">
<input type="text" name="tenant" placeholder="Tenant" /><br>
<img src="res/next-btn.svg" onclick="document.getElementById('tenant').submit()">
</form>
</span>
</span>
</body>
</html>
In the error.html
file, the reference on http://www.thymeleaf.org
(line 2) and the three span definitions are required (lines 8–10) in order to provide error details.
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8" />
</head>
<body>
An error has occurred <br /><br />
<span th:text="${status}" /> (<span th:text="${reason}" />) <br />
<span th:utext="${message}" /> <br />
<span th:text="'timestamp: '+${timestamp}" style="display: none" />
</body>
</html>
The usage of resource files is possible if they are located in the sub-directory /public/res/
or if they are stored by a client application.
The example custom form files used in this article are available for download as public.zip
file.
Possible Procedures
There are different ways to proceed:
-
Kubernetes ConfigMaps
-
Manual replacement after starting the pod
-
A custom Docker image with the custom form files in a separated layer
-
Integration of the custom form files via Kubernetes Volumes
In this documentation, only the first procedure via Kubernetes ConfigMaps is described. The replacement of the default form files is explained by means of a simple example.
Configuration via Kubernetes ConfigMaps
By following these steps, you configure a simple custom web page for the tenant selection dialog:
-
Add the following line in the
authentication-prod.yml
configuration file:spring.thymeleaf.prefix: 'file:/public/'
-
Unpack the
public.zip
file. -
Create a ConfigMap for the files in the public directory via the command:
kubectl -n yuuvis create configmap templates --from-file=./public/
-
Adjust the Kubernetes deployment of the
authentication
service via the command:kubectl -n yuuvis edit deploy authentication
-
Extend the
volumes
section as follows:volumeMounts: - name: templates mountPath: /public/tenant.html subPath: tenant.html - name: templates mountPath: /public/error.html subPath: error.html - name: templates mountPath: /public/res/tenant.css subPath: tenant.css - name: templates mountPath: /public/res/next-btn.svg subPath: next-btn.svg
-
Restart the
authentication
service.
2.6. Apps
Management of apps that are based on yuuvis® Momentum via schema, permissions, system hook configuration and availability configurations.
2.6.1. Concept of Apps
The yuuvis® Momentum core system can be used as basis for apps. Apps are additional logical units that enhance the core system. The core system itself provides the possibility to define specific resources for the individual apps. Thus, each app can have its own schema and its own role set. As of version 2021 Summer, apps can be enabled or disabled for individual tenants. The system
service manages the corresponding resource files. There are endpoints provided by the API gateway that allow for retrieval, validation or update of the resource files.
The system can support various apps.
2.6.2. App Information
System integrators can see all existing apps in the system by using the endpoint
Users can see all apps that are enabled for their tenant by using the endpoint
2.6.3. App Management
To create an app, deploy any app-specific resource file (schema, role set, system hook configuration). It has to be valid or completely empty. Alternatively, you can introduce a new app by specifying its name and its tenant-specific state in an app set as described below.
The endpoints for the management of app-specific resource files are provided by the API gateway and call the system
Service internally.
App names are case-insensitive. Furthermore, the system stores uppercase letters in app names in a lowercase form. For example, if you post an app schema for the app name myNewApp
(via POST /system/apps/myNewApp/schema
), this new app appears with the name mynewapp
in the results of endpoints like GET /api/dms/apps
or GET /api/system/apps
.
Additionally, app names have to match the regular expression ([a…zA…Z][a…zA…Z0…9]*-)?([a…zA…Z][a…zA…Z0…9]*
and must not be longer than 255 characters in order to be consistent with the schema validation of app-specific prefixes.
App Schemata
App-specific schemata are managed via the following endpoints:
-
GET /api/system/apps/{app}/schema
-
POST /api/system/apps/{app}/schema
-
POST api/system/apps/{app}/schema/validate
In the multi-tenant landscape of yuuvis® Momentum, any object types or properties that need to be available for multiple or all tenants, need to be introduced to the system schema. To prevent cluttering the system schema, avoid dependencies and allow for duplicate names, the system schema can be structured into applications, which provide a namespace for properties and object types pertaining to a particular use case.
2.6.4. Role Sets for Apps
App-specific role sets are managed via the following endpoints:
-
GET /api/system/apps/{app}/permissions
-
POST /api/system/apps/{app}/permissions
-
POST /api/system/apps/{app}/permissions/validate
The permissions to access objects or to perform certain actions are assigned to specific roles that are listed in the role set. yuuvis® Momentum has the ability to further structure the global role set into applications.
2.6.5. App-specific System Hooks
As of 2022 Summer, it is possible to configure app-specific system hooks in separate resource files.
The following endpoints are available to manage those app-specific resources:
-
GET /api/system/apps/{app}/systemhooks
-
POST /api/system/apps/{app}/systemhooks
-
POST /api/system/apps/{app}/systemhooks/validate
-
App Sets for Availability Management
As of version 2021 Summer, the availability of an app for a specified tenant is managed in an app set via the following endpoints:
-
GET /api/system/tenants/{tenant}/apps
-
POST /api/system/tenants/{tenant}/apps
-
POST /api/system/tenants/{tenant}/apps/validate
An app does not necessarily need its own resources within the core system. The core system can be used to only mark tenants to have a specific app. A new app can be introduced to the system by simply enabling if for a tenant. It is not necessary to create an initial resource (schema, role set or system hook configuration) for the app before you enable it for a tenant.
The configuration of the availability of each app for the specified tenant is stored and managed in the apps.xml
file as shown in the example code block below. In this app set, each app has its own section (<app></app>
) containing the app’s name (<name></name>
) and state of availability (<state></state>
) which can be either enabled or disabled. The default value for state is disabled. Thus, each app that is not listed in the passed configuration XML will not be available for the corresponding tenant. There is no difference in the configuration of not-listed apps and apps listed as disabled.
<?xml version="1.0" encoding="utf-8"?>
<apps xmlns="http://optimal-systems.org/ns/yuuvis/apps/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://optimal-systems.org/ns/yuuvis/apps/yuuvis-core-apps.xsd">
<app>
<name>clientsystem</name>
<state>enabled</state>
</app>
<app>
<name>client</name>
<state>enabled</state>
</app>
<app>
<name>email</name>
<state>disabled</state>
</app>
<app>
<name>acl</name>
<state>disabled</state>
</app>
</apps>
The apps.xml
configuration file is stored via the config
service and should only be changed using the above listed endpoints.
If there is no apps.xml file, the GET endpoint will return the error code 404. Especially in systems of version 2020 Winter and older, there is no app set. If the file is missing entirely, all apps are enabled for all tenants in the system. |
There can be dependencies between different app and tenant schemata via property references or secondary object type references. The validation of the app set considers these dependencies. If the schema of an app is referenced by the global or the corresponding tenant schema, the app cannot be disabled for the specified tenant. Equally, if the schema of an app (A) is referenced by the schema of another app (B), it is not possible to disable the first app (A) and enable the second app (B) for any tenant.
Creating a new dependency considers app availability for all tenants. If a new reference on an app schema (A) is introduced into an app schema (B), the referenced app (B) has to be enabled for each tenant for which the referencing app (A) is enabled. The validation fails if there is a tenant for which the app (A) is enabled and the app (B) is disabled.
2.7. Metrics
As of 2023 Spring, the API gateway offers endpoints to retrieve and manage metrics. For example, it is possible to dynamically calculate the binary storage used by individual tenants. This information could be useful, e.g., for billing purposes.
The following endpoints are available. The URLs contain the metric path parameter to specify the type of metric.
Retrieval | Reset | |
---|---|---|
metric for all tenants |
|
|
metric for any specified tenant |
|
|
metric for currently active tenant |
|
|
2.7.1. Storage Metric
As of 2023 Spring, the storage metric allows to dynamically calculate the binary storage used by individual tenants, e.g., for billing purposes.
In the endpoint URLs above, use storage
as value for the metric
path parameter. For example:
https://<host>/api/system/metrics/storage
The number is calculated from the content stream length stored in the database. The number includes all binary content files assigned to a DMS object or an old version of a DMS object. Invisible objects (flagged with OBJECT_FLAGGED_FOR_DELETION
in the search index) are included as well. Binary content files that are referenced by multiple DMS objects (e.g., compound documents) are counted only once. Rendition files are also NOT included.
The initial calculation or triggered recalculation is a counting process via database statements over all tenants. It is managed by the audit
service and its behavior (automation and fail safety) can be adjusted in the audit
service’s configuration. No storage metric can be retrieved during the counting process in the database. Requests to the GET endpoints listed above return an error.
After the successful counting process in the database, the result is stored in Redis and dynamically updated during any operations on binary content files via API gateway.
2.7.2. Object Count Metric
As of 2023 Summer, the object count metric provides the number of DMS objects (including folder objects) within one specific tenant. In addition, the number of folder objects is provided separately. The information might be used for billing purposes as well as for an emptiness check before removing a tenant from the system.
For the object count metric only the tenant-specific retrieval endpoints GET /api/system/tenants/{tenant}/metrics/{metric}
and GET /api/admin/metrics/{metric}
are available. In the endpoint URLs above, use objectCount as value for the metric path parameter. For example:
https://<host>/api/system/metrics/objectCount
The count includes all current versions of DMS objects regardless of role-based access permissions. Moreover, it includes invisible objects (flagged with OBJECT_FLAGGED_FOR_DELETION
in the search index) as well.
2.8. Error Handling
Errors may occur in many different situations during data processing. In addition to the HTTP status code, yuuvis® Momentum core offers a well-defined structure and labeling of any thrown error. It is thus possible to easily localize the origin of the problem. At the same time, automated catching and analyzing of errors can be implemented based on the fixed error structure and error codes.
2.8.1. Error Structures
Single Errors
The errors are JSON structures with the following parameters:
Parameter | Description |
---|---|
|
Three-digit integer specifying the HTTP status code as a class of the response in which the error is returned. |
|
Integer specifying the concrete error type. |
|
Timestamp of the error occurance in format |
|
String message describing the concrete error. |
|
Origin of the error. As of 2021 Autumn, |
|
The name of the service that threw the error. |
|
The string tenant name where the error occured. |
|
As of 2022 Winter. Wrapped original error thrown by a webhook (find details below). |
{
"httpStatusCode" : 409,
"serviceErrorCode" : 2800,
"time" : "2021-04-21T04:36:30.813",
"message" : "A non-empty folder cannot be deleted.",
"stackTrace" : [ "com.os.enaio.cloud.gateway.resource.api.DmsController.deleteDmsObject(DmsController.java:719)" ],
"service" : "api",
"tenant" : "default"
}
Error Lists during Validation Processes
If errors occur during one of the following validation process, they are collected and returned in the validationErrors
list in JSON format.
-
schema validation
-
role set validation
-
app set validation
Other validation processes return only single errors in the structure described above.
Within the JSON list validationErrors
, the following parameters are provided for each error in the list:
Parameter | Description |
---|---|
|
String message describing the concrete error. |
|
Four-digit integer specifying the concrete error type. |
Together with each non-empty validation error list, the HTTP status code 422 is always returned, but not specifically added to the individual entries.
The following code block shows an example error structure that can occur during a schema validation:
{
"validationErrors": [
{
"message": "Ambiguous IDs. There are 2 property type definitions with the ID 'from'.",
"serviceErrorCode": 2110
},
{
"message": "Wrong base ID. The base ID of the system:document type definition 'email' must be 'system:document', but it is 'system:folder'.",
"serviceErrorCode": 2131
},
{
"message": "Invalid property reference 'fromm' in type definition 'email'.",
"serviceErrorCode": 2132
},
{
"message": "Invalid secondary object type reference 'appAcl:aclowner' in type definition 'email'.",
"serviceErrorCode": 2135
}
]
}
Errors Thrown by Webhooks
If a webhook throws an error in the yuuvis® Momentum error format, its individual parameters are presented as JSON substructure. The serviceErrorCode is 99999. The HTTP status code used for the final response depends on the webhook type. Errors thrown by dms.request.objects.contents webhooks, e.g., have the final HTTP status code 404.
{
"serviceErrorCode": 99999,
"service": "repository",
"messageHistory": "\nMessage History\n---------------------------------------------------------------------------------------------------------------------------------------\nRouteId ProcessorId Processor Elapsed (ms)\n[insertDocumentSetR] [insertDocumentSetR] [direct://insertDocumentSet ] [ 2456]\n[insertDocumentSetR] [[conan] enrich add] [bean[ref:analyzeConfigurationPr [...]",
"innerError": {
"httpStatusCode": 422,
"serviceErrorCode": 12345,
"time": "2022-11-22T14:57:41.7317312",
"message": "Virus [XXXX] detected. See inner error for further details.",
"service": "virus-detection-app",
"innerError": {
"httpStatusCode": 0,
"serviceErrorCode": 0,
"message": "The virus [XXX] was detected in the file [myvirus.exe]. This virus is part of SIV 1.14356.234 from 2022-03-13. See 'https://gprivate.com/61xd3'."
}
},
"time": "2022-11-22T14:57:41.735",
"stackTrace": [
"com.os.services.hel.repo.web.RepositoryRestController.postDmsObjects(RepositoryRestController.java:88)"
],
"message": "Virus [XXXX] detected. See inner error for further details.",
"tenant": "default",
"httpStatusCode": 422
}
If the error thrown by the webhook does not match the yuuvis® Momentum error format, the entire original error is wrapped as String message of the inner error. The serviceErrorCode is 2471 and the HTTP status code is 422.
{
"serviceErrorCode": 2471,
"service": "repository",
"messageHistory": "\nMessage History\n---------------------------------------------------------------------------------------------------------------------------------------\nRouteId ProcessorId Processor Elapsed (ms)\n[insertDocumentSetR] [insertDocumentSetR] [direct://insertDocumentSet ] [ 2456]\n[insertDocumentSetR] [[conan] enrich add] [bean[ref:analyzeConfigurationPr [...]",
"innerError": {
"httpStatusCode": 422,
"serviceErrorCode": 0,
"message": "{\"wrong_body_format\":{\"httpStatusCode\":422,\"serviceErrorCode\":12345,\"time\":\"2022-11-22T15:19:52.3241064\",\"message\":\"Virus [XXXX] detected. See inner error for further details.\",\"service\":\"virus-detection-app\",\"innerError\":{\"httpStatusCode\":0,\"serviceErrorCode\":0,\"message\":\"The virus [XXX] was detected in the file [myvirus.exe]. This virus is part of SIV 1.14356.234 from 2022-03-13. See 'https://gprivate.com/61xd3'.\"}}}"
},
"time": "2022-11-22T15:19:52.34",
"stackTrace": [
"com.os.services.hel.repo.web.RepositoryRestController.postDmsObjects(RepositoryRestController.java:88)"
],
"message": "Webhook response with statuscode '422' did not match the expected failure body format. Please see documentation to ensure correct webhook failure handling and have a look at the inner exception for details.",
"tenant": "default",
"httpStatusCode": 422
}
Any other problems related to the execution of webhooks are indicated with the serviceErrorCode 2470.
2.8.2. Error Codes and Messages
The following table provides an overview of errors that may occur during operation of yuuvis® Momentum core.
In case you want to catch errors and analyse their content, please use the serviceErrorCode as unique identification of the error type. Please do NOT use the message since we reserve to modify it in future. |
serviceErrorCode | httpStatusCode | message | Occurance |
---|---|---|---|
2100 |
- |
The ID '%s' is invalid. If the ID has a prefix, it is not allowed to start with 'ten' or 'app'. |
schema validation |
2101 |
- |
The ID '%s' is invalid. If the ID has a prefix, it is expected to be '%s'. |
schema validation |
2102 |
- |
The ID '%s' is invalid. The ID of an object type is not allowed to start with '%s'. |
schema validation |
2103 |
- |
The ID '%s' is invalid. The ID of a property type is not allowed to start with '%s'. |
schema validation |
2104 |
- |
Too many property types. There are %s property types. Up to %s are allowed. This is a configurable limit. |
schema validation |
2105 |
- |
There are references from the global schema to the schema of app '%s'. For tenant '%s' app '%s' is disabled. |
schema validation |
2106 |
- |
There are references from the schema of app '%s' to the schema of app '%s'. For tenant '%s' app '%s' is enabled and app '%s' is disabled. |
schema validation |
2110 |
- |
Ambiguous IDs. There are %s %s type definitions with the ID '%s'. |
schema validation |
2111 |
- |
Missing ID. There is a %s definition without ID. |
schema validation |
2112 |
- |
Invalid ID. There is a %s with the invalid ID '%s'. The ID must match '%s'. |
schema validation |
2113 |
- |
ID too long. The maximum length for an ID is %s without prefix. The length of '%s' is %s. |
schema validation |
2120 |
- |
Missing property type. The attribute 'propertyType' of the property type definition '%s' is missing. |
schema validation |
2121 |
- |
Wrong property type. The property type of the %s property type definition '%s' must be '%s', but it is '%s'. |
schema validation |
2122 |
- |
Invalid attribute 'queryable' in the %s property type definition '%s'. The value 'false' is only supported for table property type definitions. |
schema validation |
2123 |
- |
Illegal minimum length of the property '%s'. The minimum length of a string property must not exceed %s. |
schema validation |
2124 |
- |
Illegal maximum length of the property '%s'. The maximum length of a string property must not exceed %s. |
schema validation |
2125 |
- |
Illegal cardinality of the property '%s'. The cardinality of a table property must not be 'multi'. |
schema validation |
2126 |
- |
Invalid number of column property definitions for property '%s'. The maximum number of columns in a table must not exceed %s. Column count: '%s' |
schema validation |
2127 |
- |
Illegal cardinality of the property '%s'. The cardinality of a structured data property must not be 'multi'. |
schema validation |
2130 |
- |
Missing base ID. The attribute 'baseId' of the type definition '%s' is missing. |
schema validation |
2131 |
- |
Wrong base ID. The base ID of the %s type definition '%s' must be '%s', but it is '%s'. |
schema validation |
2132 |
- |
Invalid property reference '%s' in type definition '%s'. |
schema validation |
2134 |
- |
There are %s property references with the value '%s' in the definition of the object type '%s'. |
schema validation |
2135 |
- |
Invalid secondary object type reference '%s' in type definition '%s'. |
schema validation |
2136 |
- |
Secondary object type '%s' in type definition '%s' can be referenced only once. |
schema validation |
2140 |
- |
The document type '%s' does not allow content and has a static reference to the secondary object type '%s' that requires content. It is not possible to create instances of this document type. |
schema validation |
2141 |
- |
The document type '%s' does not allow content and has a non-static reference to the secondary object type '%s' that requires content. This secondary object type cannot be assigned to instances of this document type. |
schema validation |
2142 |
- |
The document type '%s' requires content and has a static reference to the secondary object type '%s' that does not allow content. It is not possible to create instances of this document type. |
schema validation |
2143 |
- |
The document type '%s' requires content and has a non-static reference to the secondary object type '%s' that does not allow content. This secondary object type cannot be assigned to instances of this document type. |
schema validation |
2144 |
- |
The document type '%s' has static references to secondary object types that require content ('%s') and that do not allow content ('%s'). It is not possible to create instances of this document type. |
schema validation |
2145 |
- |
The document type '%s' has static references to secondary object types that require content ('%s') and non-static references to secondary object types that do not allow content ('%s'). These non-static secondary object types cannot be assigned to instances of this document type. |
schema validation |
2146 |
- |
The document type '%s' has static references to secondary object types that do not allow content ('%s') and non-static references to secondary object types that require content ('%s'). These non-static secondary object types cannot be assigned to instances of this document type. |
schema validation |
2150 |
- |
The folder type '%s' has static references to secondary object types that require content ('%s'). It is not possible to create instances of this folder type. |
schema validation |
2151 |
- |
The folder type '%s' has non-static references to secondary object types that require content ('%s'). These non-static secondary object types cannot be assigned to instances of this folder type. |
schema validation |
2152 |
- |
The folder type '%s' has static references to secondary object types that allow content ('%s'). It is not possible to create instances of this folder type. |
schema validation |
2153 |
- |
The folder type '%s' has non-static references to secondary object types that allow content ('%s'). These non-static secondary object types cannot be assigned to instances of this folder type. |
schema validation |
2200 |
422 |
Empty lists are not allowed. The property '%s' has an empty list as value. |
schema validation |
2201 |
422 |
The cardinality of the property '%s' is 'multi', but the value is not a list: %s. |
schema validation |
2202 |
422 |
The cardinality of the property '%s' is 'single', but the value is a list: %s. |
schema validation |
2203 |
422 |
Illegal number of values. The cardinality of the property '%s' is 'single', but there are multiple values: %s. |
schema validation |
2204 |
422 |
Null values are not allowed in lists. Property ='%s' |
schema validation |
2210 |
422 |
Illegal property value. The property '%s' is a boolean property and is unable to accept the value '%s'. |
schema validation |
2211 |
422 |
Illegal property value. The property '%s' is a datetime property and is unable to accept the value '%s'. |
schema validation |
2212 |
422 |
Illegal property value. The property '%s' is a decimal property and is unable to accept the value '%s'. |
schema validation |
2213 |
422 |
Illegal property value. The property '%s' is an ID property and is unable to accept the value '%s'. |
schema validation |
2214 |
422 |
Illegal property value. The property '%s' is an integer property and is unable to accept the value '%s'. |
schema validation |
2215 |
422 |
Illegal property value. The property '%s' is a string property and is unable to accept the value '%s'. |
schema validation |
2216 |
422 |
Malformed table. The property part 'columnNames' of the table property '%s' is expected to be a list of strings. ColumnNames: '%s' |
schema validation |
2217 |
422 |
Malformed table. The value of the table property '%s' is expected to be a list. Table value: %s |
schema validation |
2218 |
422 |
Malformed table. A row of the table '%s' is not a list. Row: '%s' |
schema validation |
2219 |
422 |
Illegal property value. The value of the structured data property '%s' is expected to be a list or map. Value: %s |
schema validation |
2220 |
422 |
Invalid JSON. The value of the structured data property %s must be valid JSON. Value = '%s'. Error message: %s |
schema validation |
2240 |
422 |
Illegal property value. The property '%s' is a datetime property with resolution 'date' and is unable to accept the value '%s'. |
schema validation |
2250 |
422 |
The decimal value %s is not valid. The type '%s' does not permit values smaller than %s. |
schema validation |
2251 |
422 |
The decimal value %s is not valid. The type '%s' does not permit values larger than %s. |
schema validation |
2260 |
422 |
The integer value %s is not valid. The type '%s' does not permit values smaller than %s. |
schema validation |
2261 |
422 |
The integer value %s is not valid. The type '%s' does not permit values larger than %s. |
schema validation |
2270 |
422 |
String value is too short. The type '%s' permits only strings with a length of at least %s. The length of '%s' is %s. |
schema validation |
2271 |
422 |
String value is too long. The type '%s' permits only strings with a length up to %s. The length of '%s' is %s. |
schema validation |
2272 |
422 |
String value is too long. A string property permits only strings with a length up to %s. The property '%s' has a value with the length %s: '%s'. |
schema validation |
2280 |
422 |
Illegal column. A table of type '%s' cannot have a column named '%s'. |
schema validation |
2281 |
422 |
Illegal column names. The column '%s' occures %s times. |
schema validation |
2282 |
422 |
Malformed table. The maximum number of rows in a table must not exceed %s. Row count: '%s' |
schema validation |
2283 |
422 |
Invalid row. The row of a table property '%s' is expected to contain exactly %s entries, but row no. %s contains %s entries. |
schema validation |
2290 |
422 |
Structure data value too large. The value of the property '%s' contains %s sub-values. Only up to %s are allowed. |
schema validation |
2291 |
422 |
Structured data value too deep. The value of the property '%s' has a depth of %s. The maximum depth is %s. |
schema validation |
2292 |
422 |
Invalid value of structure data property '%s'. Non-string key found: '%s'. |
schema validation |
2293 |
422 |
Key too long. The length of the key '%s' in the value of the structured data property '%s' is %s. The maximum length is %s. |
schema validation |
2294 |
422 |
Invalid key '%s' in the value of the structured data property '%s'. The key must match the regex '%s'. |
schema validation |
2300 |
422 |
A required property is missing. property='%s' |
schema validation |
2470 |
422 |
Webhook execution resulted in an unexpected failure |
webhook execution |
2471 |
422 |
Webhook response with statuscode '%s' did not match the expected failure body format. Please see documentation to ensure correct webhook failure handling and have a look at the inner exception for details. |
webhook execution |
2880 |
- |
Unable to disable app '%s'. There are references from the tenant schema to the schema of app '%s'. |
app set validation |
2881 |
- |
Unable to disable app '%s'. There are references from the global schema to the schema of app '%s'. |
app set validation |
2882 |
- |
Unable to disable app '%s' and enable app '%s'. There are references from the schema of app '%s' to the schema of app '%s'. |
app set validation |
2900 |
403 |
Method not allowed for tenant independent accounts. |
authentication |
2901 |
403 |
External access is not allowed for the service account. |
authentication |
2902 |
403 |
External access is not allowed for this endpoint. |
authentication |
2903 |
422 |
Could not create JWT. Cause [%s] |
authentication |
2950 |
500 |
Could not write audit entry. Cause [%s] |
audit |
2951 |
500 |
Database unreachable. Cause [%s] |
audit |
99999 |
depends on webhook type |
<custom message> |
webhook execution |
2.9. System Hooks and Interceptors
System hooks are functions that apply to core functions of the yuuvis® Momentum API whenever certain conditions are met and that extend or modify those functions. As such, they serve as a modular, external approach for introducing new functionalities as extensions of already existing ones. There are different types of system hooks available:
-
Lifecycle hooks
-
Webhooks
-
AMQP hooks
2.9.1. Predicate
The predicate specifies a SPEL condition for the call of individual hooks. It is declared in the hook configuration.
In the condition, the metadata of DMS objects can be referenced. The available properties depend on the webhook type as they match the DMS objects at different processing states. However, the options
section is kept constant as far as possible.
Security of SpEL conditions
As of 2024 Autumn.
A security validation protects the system resources from being accessed by subordinate tenant administrators. A failed validation is logged by the corresponding service.
The types/classes that are allowed for the T
and new
operators in SpEL conditions are limited to the following list:
-
java.lang.String
-
java.lang.Integer
-
java.lang.Long
-
java.lang.Double
-
java.lang.Float
-
java.lang.Byte
-
java.lang.Boolean
-
java.lang.String
-
java.lang.Char
-
java.lang.Short
-
java.util.List
-
java.util.Map
If you are sure that your additional type is required AND secure, add it to the list via configuration on your own risk, e.g.:
spel.additionallyUsableTypes:
- 'java.util.Date'
- 'org.apache.commons.lang3.*'
Use the *
character to add all types within the classpath of a service.
The parameter spel.additionallyUsableTypes
can be set in any YAML configuration file that is read by the corresponding service. To set it for all services, it could be set in the application-prod.yml
configuration file.