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.

Consider yuuvis® Momentum consisting of a core system accessible via API gateway and optional additional services with second layer interfaces.

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.

Overview of yuuvis® Momentum core services and their connection to third-party infrastructure.

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)
Illustration of the process steps that are passed during a user login via browser.
Processing steps
  1. HTTP request to any API endpoint

  2. Redirect to identity provider

  3. Verify credentials externally

  4. Redirect to authentication with auth code

  5. Send auth code to authentication service

  6. Retrieve userId using auth code

  7. Recieve userId

  8. Request role set acquisition

  9. Query user role set

  10. Recieve user role set

  11. Present role set

  12. Provide authentication token and proceed with initial API request

  13. Request information from other parts of the system

  14. Obtain requested information

  15. Produce API response

  16. Send HTTP response to user

Webhook entry points
  1. user.info

Import Flow
Illustration of the process steps that are passed during a document import.
Processing steps
  1. HTTP POST request containing metadata and content

  2. Enrichment of request with authentication token

  3. Analyze content file (optional) and prepare content storage

  4. Content storage handling

  5. Write metadata to database

  6. Index new object in Elasticsearch

  7. Create initial audit entry

  8. Create API response from metadata

  9. Return metadata as HTTP response

Webhook entry points
  1. dms.request.objects.upsert.storage-before

  2. dms.request.objects.upsert.database-before

  3. dms.response.objects, dms.response.objects.insert

Content Retrieval Flow
Illustration of the process steps that are passed during a content retrieval.
Processing steps
  1. HTTP GET request to object URL

  2. Enrichment of request with authentication token

  3. Check for user authorization using search service query

  4. Query Elasticsearch for objectId

  5. Elasticsearch metadata response (if user is authorized)

  6. Repository URL of objectId

  7. Request content of objectId

  8. Query objectId in storage provider

  9. Storage provider metadata response

  10. Return object metadata

  11. Write CONTENT_ACCESSED audit entry

  12. Create API response from metadata

  13. Return HTTP metadata response

Webhook entry points
  1. dms.request.objects.contents

Metadata Retrieval Flow
Illustration of the process steps that are passed during a metadata retrieval.
Processing steps
  1. HTTP GET request to object URL

  2. Enrichment of request with authentication token

  3. Request metadata

  4. Query objectId in database

  5. Database metadata response

  6. Return object metadata

  7. Write METADATA_ACCESSED audit entry

  8. Create API response from metadata

  9. Return HTTP metadata response

Webhook entry points
  1. dms.response.objects

Search Flow
Illustration of the process steps that are passed during a search query.
Processing steps
  1. HTTP POST request with query

  2. Enrichment of request with authentication token

  3. Request query execution

  4. Translate and send Elasticsearch query

  5. Receive Elasticsearch query results

  6. Return metadata object list

  7. Create API response from metadata

  8. Return HTTP metadata response

Webhook entry points
  1. dms.request.search

  2. dms.response.objects, dms.response.objects.search

Content Update Flow
Illustration of the process steps that are passed during a content update.
Processing steps
  1. HTTP POST request to content URL of object

  2. Enrichment of the request with authentication token

  3. Verify user has writing permissions on object using search service

  4. Query object in Elasticsearch

  5. Return Elasticsearch query results

  6. Return user authorization verification results

  7. Infer analysis of new content item and commit it to storage

  8. Content Storage Handling

  9. Update object metadata contentstream attribute

  10. Commit updated metadata to database and index

  11. Index the updated metadata in Elasticsearch

  12. Write CONTENT_UPDATED audit entry

  13. Return updated metadata

  14. Create API response from metadata

  15. Return updated metadata

Webhook entry points
  1. dms.request.objects.upsert.storage-before

  2. dms.request.objects.upsert.database-before

  3. dms.response.objects, dms.response.objects.update

Metadata Update Flow
Illustration of the process steps that are passed during a metadata update.
Processing steps
  1. HTTP POST request to objectId URL

  2. Enrichment of request with authentication token

  3. Query for objectId using search service to verify user authorization

  4. Query Elasticsearch for object

  5. Elasticsearch object response (if user has permissions for update object)

  6. Authorization test query response

  7. Infer metadata validation and update

  8. If expiration date has changed: update content storage

  9. Infer metadata update

  10. Write new metadata to database, write METADATA_UPDATED audit entry

  11. Index new metadata in Elasticsearch

  12. Create API response from metadata

  13. Return metadata HTTP response

Webhook entry points
  1. dms.request.objects.upsert.storage-before

  2. dms.request.objects.upsert.database-before

  3. dms.response.objects, dms.response.objects.update

Deletion Flow
Illustration of the process steps that are passed during a deletion.
Processing steps
  1. HTTP DELETE request to objectId URL

  2. Enrichment of request with authentication token

  3. Query object using search service to verify user authorization

  4. Query object in Elasticsearch

  5. Elasticsearch object reponse

  6. Authorization verification results

  7. Infer flag for deletion on object

  8. Flag as deleted in database, FLAGGED_FOR_DELETE audit entry

  9. Flag as deleted in Elasticsearch via index service

  10. Delete content through repository service

  11. Infer deletion of object in database

  12. Infer deletion of object in Elasticsearch

  13. OBJECT_DELETED audit entry

  14. Return deletion results

Webhook entry points
  1. dms.request.objects.delete

  2. 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.

Overview of yuuvis® Momentum additional services and their connection to third-party infrastructure.

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

properties

Available in all DMS objects. It contains

  • user-defined properties from the applied schema and

  • pre-defined general system properties.

yes, in SELECT and/or WHERE clauses

contentStreams

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 SELECT and/or WHERE clauses

renditions

Process-related controlling information. Only available during the import of objects with a binary content file. It contains a list of rendition specifications.

no

options

Process-related controlling information. Only available during specific processing steps.

no

Example DMS Object without Binary Content File
Example response body of a metadata retrieval for a DMS object without content.
{
    "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
Example response body of a metadata retrieval for a DMS object with content.
{
    "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
Example JSON to be included in an import request for a DMS object with content 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 the archive 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

appSystemmail:subject

String

Optional. Subject of the e-mail.

appSystemmail:sent

datetime

Required. Date and time when the e-mail was sent.

appSystemmail:from

String

Required. E-mail address of the sender.

appSystemmail:to

List of strings

Optional. List of direct receivers.

appSystemmail:cc

List of strings

Optional. List of CC receivers.

appSystemmail:bcc

List of strings

Optional. List of BCC receivers.

appSystemmail:messageId

String

Optional. ID of the message.

appSystemmail:attachments

List of strings

Optional. File names of the attachments.

appSystemmail:attachmentCount

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 the serviceConfiguration.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 the uploadId 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.

    Example
    POST /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 pieces
    PUT /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 the numberOfParts query parameter.

    Example
    POST /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 in properties section of the JSON request body.

    The contentStreamId automatically refers to the binary content file created by the upload process specified by uploadId. However, the contentanalyzer service is SKIPPED. Thus, if you need proper values in the contentStreams section for fileName and mimeType, 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.

  1. Label (as of 2023 Autumn)

  2. Property definitions

  3. Object Type definitions:

    1. Document type definitions

    2. Folder type definitions

    3. 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
A valid 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 the system 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 /api/system/schema

POST api/system/schema/validate

POST /api/system/schema

app schema

GET /api/system/apps/{app}/schema

POST /api/system/apps/{app}/schema/validate

POST /api/system/apps/{app}/schema

tenant schema of any tenant

GET /api/system/tenants/{tenant}/schema

POST /api/system/tenants/{tenant}/schema/validate

POST /api/system/tenants/{tenant}/schema

tenant schema of the own tenant

GET /api/admin/schema

POST /api/admin/schema/validate

POST /api/admin/schema

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

id

String

yes

The ID of the property matching the regular expression. It uniquely identifies the property within in the schema file.

localNamespace

URI

no

By using namespaces, it is possible to form groups of properties and object types.

description

String

no

Describes the property.

propertyType

Enum

yes

Specifies the type of this property. The following types are supported:

  • boolean

  • integer

  • datetime

  • decimal

  • string

  • table

  • id

  • structureddata

cardinality

Enum

yes

Defines whether the property can have a maximum of one or an arbitrary number of values. Possible values are single and multi.

required

Boolean

yes

If true, the object must have at least one value of this property. If a property is required and has no defaultValue, the application must provide a value during the create operation.

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.

queryable

Boolean

no

Specifies whether or not the property may appear in the WHERE clause of a query statement. Default is true. false is only allowed for table properties.

classification

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.

Make sure to validate the strings you set for the classification attribute, such that your client application will not fail if a string does not match the expected syntax.

defaultValue

depending on the propertyType

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

maxValue

Integer

no

The maximum value allowed for this property.

9223372036854775807

minValue

Integer

no

The minimum value allowed for this property.

-9223372036854775808

Attributes for DateTime Property Definitions
Attribute Type Required Description

resolution

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 yyyy-MM-dd.

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

maxValue

Decimal

no

The maximum value allowed for this property

(2-2 -52 )·2 1023

minValue

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

maxLength

Integer

no

The maximum length (in characters) allowed for a value of this property.

minLength

Integer

no

The minimum length (in characters) allowed for a value of this property.

fulltextIndexed

Boolean

no

If true (default), the property value can be found via full-text search.

If false, the property value cannot be found via full-text search.

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

cardinality

Enum

yes

Defines whether the property can have a maximum of one or an arbitrary number of values. For a table property, only single is allowed.

queryable

Boolean

no

Specifies whether (true) or not (false) the table property and its columns may appear in the WHERE clause of a query statement. Default is true.

If queryable is false, the table must not appear in WHERE clauses in search queries. However, you can still find objects using full-text conditions on values stored in a table (query keyword CONTAINS). If queryable is true, you can apply more precise search queries to a table, but you will need more disk space to store objects.

Particularities for column attributes:

Attribute Type Required Description

id

String

yes

The column names must not contain a prefix. They have to follow the convention [a-zA-Z][a-zA-Z0-9]*. Otherwise, the schema containing the corresponding property definition will not pass the validation.

cardinality

Enum

yes

Defines whether the property can have a maximum of one or an arbitrary number of values. For a column definition, both enums single or multi are allowed.

Example table property definition
1
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

cardinality

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 single is allowed.

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.

Example Structured Data Property Definition
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

system:document

yes

folder type

system:folder

yes

secondary object type (SOT)

system:secondary

no

General Object Type Attributes

All object type definitions have the following attributes:

Attribute Type Required Description

id

String

yes

The ID of the object type. It uniquely identifies the object type in the schema.

localNamespace

URI

no

By using namespaces, it is possible to form groups of properties and object types.

description

String

no

Describes the object type definition.

baseId

Enum

yes

Specifies the base type of this object type. The following values are supported:

  • system:document

  • system:folder

  • system:secondary

propertyReference

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

contentStreamAllowed

Enum

yes

Specifies whether objects of this type must, must not, or may have content. Possible values are:

  • required

  • notallowed

  • allowed (default)

The attribute is also available for SOT definitions. If an SOT with a specified contentStreamAllowed attribute is referenced in the document type definition, it might influence the final value of contentStreamAllowed or even lead to conflict situations. Find more details in the section on secondary object type definitions.

secondaryObjectTypeId

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 static="true" or static="false". Find details below.

2.2.6. Attributes for Folder Type Definitions

Folder type definitions have the following specific attributes:

Attribute Type Required Description

secondaryObjectTypeId

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 static="true" or static="false". Find details below.

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

contentStreamAllowed

Enum

no

Can substantiate the contentStreamAllowed attribute of document type definitions. Possible values are analogous to document type definitions:

  • required

  • notallowed

  • allowed

For a finally instantiated DMS object, content will be

  • allowed if only allowed values occur in the document type definition and included secondary object type definitions.

  • required (notallowed) if the value is required (notallowed) in at least one object type definition – either document type definition or included secondary object type definition.

Conflict situations are leading to invalid documents as described below.

If contentStreamAllowed is specified in a secondary object type definition, this secondary object type cannot be referenced in folder type definitions. The schema would be invalid.

Conflict situation leading to invalid documents

Any combination of at least once required and at least once notallowed in included secondary object type definitions or the document object type definition itself.

  • If a conflict occurs between the document type definition and a secondary object type definition, the whole schema is invalid.

  • If the conflict occurs between secondary object type definitions with at least one of them referenced as static, the schema is valid but the document validation will fail (instantiated DMS objects will be invalid).

  • If the conflict occurs exclusively between secondary object type definitions referenced as floating, a document cannot have conflicting secondary object types at the same time. If a secondary object type with the value required (notallowed) is added to the document, all secondary object types with the value notallowed (required) must be removed by means of the keyword "remove":.

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.

Example response body of a schema validation.
{
    "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 to system:document with content stream required. → See impacts of change type 2000.

  • The base type of an object type changed from system:document to system:folder. → See impacts of change type 2001.

  • The base type of an object type changed from system:document or system:folder to system: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

system:objectId

string

Identifies the object in the database.

system

system:baseTypeId

string

identifies the base type of the object type specified in system:objectTypeId.

system

system:objectTypeId

string

Required during an import and cannot be changed lateron.

Identifies the object type the object instantiates. Secondary object types are not allowed.

user

system:secondaryObjectTypeIds

JSON list of strings

Contains the secondaryObjectTypeId for each secondary object type associated with the document object type in the schema.

user

system:createdBy

string

User ID of the user that has initially created the object.

system

system:creationDate

string

Date of the object’s creation in format yyyy-MM-ddTHH:mm:ss.fffZ.

system

system:lastModifiedBy

string

User ID of the user that sent the last successful POST request on the object.

system

system:lastModificationDate

string

Date of the last successful POST request on the object as a string in format yyyy-MM-ddTHH:mm:ss.fffZ.

system

system:parentId

string

system:objectId of the parent folder.

During an import or update operation, the object can be assigned to an existing folder by referencing its system:objectId in the system:parentId of the target document or folder object. The existence of the parent folder is validated by means of the specified system:parentId. Furthermore, circles in the folder hierarchy are forbidden and do not pass the validation.

user

system:parentObjectTypeId

string

Identifies the folder object type of the parent folder that is specified by system:parentId.

system

system:versionNumber

integer

Integer object version number. Corresponds to the number of POST requests on the object starting with the initial creation.

system

system:tenant

string

Identifies the tenant the object belongs to.

system

system:traceId

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 0 characters at the leading position until the length of 16 is reached.

user or system

system:tags

JSON table of strings and integers

Contains the properties of the tags assigned to the object.

user

system:rmExpirationDate

string

Only available for documents. Secondary object type system:rmDestructionRetention is required.

The binary content of the object cannot be changed or deleted before this date, but metadata updates are allowed. In an update request, the system:rmExpirationDate cannot be replaced by an earlier date.

user

system:rmStartOfRetention

string

Only available for documents. Secondary object type system:rmDestructionRetention and a non-null value for system:rmDestructionRetention is required.

This date defines the start of the retention time. It has to be earlier in time than the system:rmExpirationDate.

user

system:rmDestructionDate

string

Only available for documents. Secondary object type system:rmDestructionRetention and a non-null value for system:rmDestructionRetention is required.

If system:rmDestructionRetention is set, it must either be equal to or later in time than system:rmExpirationDate.

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

contentStreamId

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

length

Integer

Length of the binary content, determined by the system.

-

displayed (if system could determine the value)

mimeType

String

Mime type of the content file. The contentanalyzer service can be configured to determine (scenario A) or not determine (scenario B) the mimeType.

If mimeType can/should not be determined and is not specified, the default value application/octet-stream is used.

Scenario A:

The contentanalyzer determines mimeType from the corresponding binary content file. It is not possible to set a value via a request header.

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 /api/dms/objects, mimeType is determined based on the Content-Type header that is specified for the request’s part related to the corresponding binary content file. If mimeType is specified in the import JSON, this value is used instead of the automatically determined one.

In a content update via POST /api/dms/objects/{objectId}/contents/file, mimeType is determined based on the Content-Type header specified for the entire HTTP request.

displayed

fileName

String

Name of the content file.

If fileName is not specified as follows and cannot be determined, the default value upload.bin will be set.

In a content update via POST /api/dms/objects/{objectId}/contents/file, fileName is determined based on the Content-Disposition header that is specified for the entire HTTP request.

In an import request via POST /api/dms/objects, fileName is determined based on the Content-Disposition header that is specified for the request’s part related to the corresponding binary content file. If fileName is specified in the import JSON, this value is used instead of the automatically determined one.

displayed

digest

String

SHA-256, automatically determined by `repository`service based on the binary content. Can be used to detect changes in the binary content.

-

displayed

repositoryId

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

archivePath

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 pathTemplate containing dynamic path elements like DATE is configured in the archive profile).

displayed if it was set

  • in the request body or

  • via pathTemplate configured in the archive profile.

range

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

cid

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

SELECT

virtual column list

property list (metadata fields)

2

FROM

virtual table names

object type list

3

WHERE

conditions

limitations

4

ORDER BY

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 the system: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
Examples for simple SELECT queries on a specified object type
-- 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.

Example SELECT query on a 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.

Example queries
-- 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.
Example search query
-- 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;
Example response
{
    "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

type

string

Type of highlighter

unified

fragment_size

int

Length of a single full-text excerpt

45

number_of_fragments

int

Maximum number of full-text matches to be represented for each object

30

fragmenter

string

Fragmenter to be used.

span

pre_tag

string

Indication for start of query term highlighting.

<em>

post_tag

string

Indication for end of query term highlighting.

</em>

Example JSON with options
{
    "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 and OR operators per condition is limited to 20.

Examples
Some introductory example queries with conditions
-- 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

Example query
-- 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.

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.

Examples for case-sensitive (default) and case-insensitive metadata search
-- 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.

Changing case sensitivity for the entire request
{
    "query" : {
        "statement" : "SELECT * FROM invoice WHERE supplier IS 'GE'",
        "skipCount" : 0,
        "maxItems" : 50,
        "options": {
            "case_sensitivity": "case_insensitive"
        }
    }
}
Priorities for overwriting case sensitivity
  1. Highest priority: CASE_SENSITIVE() and CASE_INSENSITIVE() functions in the SQL statement.

  2. If 1. is not specified: Value for case_sensitivity in the options section of the query JSON.

  3. If neither 1. nor 2. are specified: The system default for search in string metadata is case-sensitive.

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 to false AND that has no system: 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 the contentstreams 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.

    Example
    SELECT * 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.

    Example
    SELECT * 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.

We recommend to use the + operator instead of AND.

<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.

Consecutive terms without any operator in between are interpreted as they would be connected with OR. Thus, we recommend to avoid the use of the OR operator.

<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')

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~ ')

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 operator AND/OR, the second operator will be automatically escaped and interpreted as a term and/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.

  • The SUM() function supports only integer, decimal and datetime properties

  • The SUM() function requires a unique property name. Especially if an app-specific or tenant-specific property is used, the fully qualified property ID including the prefix is required.

  • Table columns and structured data are NOT supported.

  • The SUM() function is NOT available for queries on audit entries.

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 a WHERE 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 via GROUP 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.

  • The AVG() function supports only integer, decimal and datetime properties

  • The AVG() function requires a unique property name. Especially if an app-specific or tenant-specific property is used, the fully qualified property ID including the prefix is required.

  • Table columns and structured data are NOT supported.

  • The AVG() function is NOT available for queries on audit entries.

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 a WHERE 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.

  • The MIN() function supports only integer, decimal and datetime properties

  • The MIN() function requires a unique property name. Especially if an app-specific or tenant-specific property is used, the fully qualified property ID including the prefix is required.

  • Table columns and structured data are NOT supported.

  • The MIN() function is NOT available for queries on audit entries.

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 a WHERE 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.

  • The MAX() function supports only integer, decimal and datetime properties

  • The MAX() function requires a unique property name. Especially if an app-specific or tenant-specific property is used, the fully qualified property ID including the prefix is required.

  • Table columns and structured data are NOT supported.

  • The MAX() function is NOT available for queries on audit entries.

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 a WHERE 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 format yyyy-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.

Usage
SELECT ... FROM ... WHERE system:creationDate IN today();
SELECT ... FROM ... WHERE rmDestructionDate > today();
Examples
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;
dateadd() and now() Examples
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.

Examples
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:

Select on queriable table
-- 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:

Select on queriable table using wildcards representing any column and/or any row
-- 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.

Select on queriable table using wildcards representing any column and/or any row
-- 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:

Examples for queries on tags
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:

Combine queries on tags with further conditions
-- 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.

Example queries on structured data
-- 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:

Input JSON using parameters
{
  "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 the maxItems (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 field handleDeletedDocuments, 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.

Input JSON with use of @userId and @userRoles parameters
{
  "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.

Input JSON with use of parameters
{
  "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

true

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.

false

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'

false

Metadata update:

true

Content update:

  • POST /api/dms/objects/{objectId}/contents/file

true

Restore:

  • POST /api/dms/objects/{objectId}/versions/{versionNr}/actions/restore

true

Deletion:

  • DELETE /api/dms/objects/{objectId} (as of 2023 Summer)

  • DELETE /api/dms/objects (as of 2023 Summer)

true

Tagging:

  • POST /api/dms/objects/{objectId}/tags/{name}/state/{state}

  • POST /api/dms/objects/tags/{name}/state/{state}?query=<SQL>

  • DELETE /api/dms/objects/{objectId}/tags/{name}

true

Text rendition:

  • POST /api/dms/objects/{objectId}/contents/renditions/text

true

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 and system: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 and state. The same value as system:lastModificationDate and system:traceId will be set automatically for creationDate and traceId respectively for all of them.

      Exception
      Each 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 the system: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 to null, 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

name

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

state

Integer

Represents the status of the corresponding object in a process chain.

required

creationDate

String

Date and time of the last modification of the tag. It is set automatically by the system.

optional, only available in search queries

traceId

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, traceIdMustMatch is set to false.

optional, specified by means of the HTTP header X-B3-TraceId

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 type system: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

value

comma-separated string list

Available during import or update.

Assigns one or multiple secondary object types to a DMS object.

The list of floating SOTs transferred will replace all existing ones. This includes the related properties and their metadata values. If you want to keep an existing floating SOT, it has to be part of the new list as well.
"system:secondaryObjectTypeIds": {
    "value": ["INV","SUP"]
}

add

string

Available during update.

Assigns a single secondary object type to an object.

"system:secondaryObjecttypeIds": {
   "add": "INV"
}

remove

string

Available during update.

Removes a single secondary object type from an object.

The metadata assigned to the object by referencing the secondary object type will be deleted for the current object version!
"system:secondaryObjecttypeIds": {
    "remove": "INV"
}

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

system:rmExpirationDate

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

system:rmStartOfRetention

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.

system:rmDestructionDate

datetime

Optional. Has to equal or exceed the value for system:rmExpirationDate as validated by yuuvis® Momentum core system.

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.

Properties of system:rmDestructionRetention
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.

Definition of system:rmDestructionRetention
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.

Example document 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.

Example metadata
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

text

Full-text search

pdf

content preview

slide

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

renditiontextworker

rendition

rendition

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 dms.request.objects.upsert.database-before webhook

-

-

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.

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

pdf

application/pdf

The PDF representation of the binary content file. No distinction between PDF, PDF/A or PDF with embedded OCR.

slide

image/png

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:

Default lifecycle hook in the 'systemhookconfiguration.json'
{
    "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

OBJECT_CREATED

-

POST /api/dms/objects

The specified object was created by functions of the client or by an import without binary content.

101

OBJECT_CREATED_WITH_CONTENT

-

POST /api/dms/objects

POST /api/dms/uploads/{uploadId}/objects

The object was created using functions of the client or via an import operation including binary content.

110

OBJECT_TAG_CREATED: [<name>, <state>]

<state>

POST /api/dms/objects/{objectId}/tags/{name}/state/{state}

A tag for the object was created.

Deletion:

200

OBJECT_DELETED

-

DELETE /api/dms/objects/{objectId}

DELETE /api/dms/objects/{objectId}/versions/{versionNr}

The object was deleted and cannot be restored.

201

OBJECT_CONTENT_DELETED

-

As of 2023 Summer:

DELETE /api/dms/objects/{objectId}/contents/file

Binary content of the object is removed. A new object version was created that has no contentStreams section anymore.

202

OBJECT_FLAGGED_FOR_DELETE

-

DELETE /api/dms/objects/{objectId}

Object marked for deletion.

210

OBJECT_TAG_DELETED: [<name>, <state>]

<state>

DELETE /api/dms/objects/{objectId}/tags/{name}

The tag for the object was deleted.

220

VERSION_DELETED: [<versionNr>]

-

DELETE /api/dms/objects/{objectId}/versions/{versionNr}

The object version was deleted and cannot be restored.

Update:

300

OBJECT_METADATA_CHANGED

-

POST /api/dms/objects/{objectId}

PATCH /api/dms/objects/{objectId}

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

OBJECT_DOCUMENT_CHANGED

-

DELETE /api/dms/objects/{objectId}/tags/{name}

The document content was edited using functions of the client or via an update carried out during the import operation.

302

OBJECT_METADATA_DOCUMENT_CHANGED

-

POST /api/dms/objects/{objectId} (multipart)

The document content and metadata were both edited within one request.

303

OBJECT_UPDATE_CONTENT_MOVED

-

POST /api/dms/objects/{objectId}/actions/move/contents/repositories/{repositoryId}

POST /api/dms/objects/{objectId}/versions/{versionNr}/actions/move/contents/repositories/{repositoryId}

The object was updated and the binary content was moved.

306

RENDITION_CHANGED

1

As of 2022 Winter:

POST /api/dms/objects/{objectId}/contents/renditions/text

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

OBJECT_TAG_UPDATED: [<name>, <state>]

-

POST /api/dms/objects/{objectId}/tags/{name}/state/{state}?overwrite=true

POST /api/dms/objects/tags/{name}/state/{state}?query=<SQL>

One of the object’s tags was changed.

325

OBJECT_RESTORED_FROM_VERSION: [<versionNr>]

-

POST /api/dms/objects/{objectId}/versions/{versionNr}/actions/restore

The data of the old object version were used to update the current object version.

340

DOCUMENT_MOVED

-

POST /api/dms/objects/{objectId}

PATCH /api/dms/objects/{objectId}

The value for the system:parentId property was modified (added, updated, removed). Additionally, an audit entry with action 300 was created.

Retrieve:

400

DOCUMENT_ACCESSED

-

GET /api/dms/objects/{objectId}/contents/file

GET /api/dms/objects/{objectId}/versions/{versionNr}/contents/file

GET /api/dms/objects/{objectId}/contents/renditions/pdf

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:

  • the first retrieval of a PDF rendition after the object creation

401

METADATA_ACCESSED

-

POST /api/dms/objects/search

GET /api/dms/objects/{objectId}

GET /api/dms/objects/{objectId}/versions

GET /api/dms/objects/{objectId}/contents/renditions/pdf

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:

  • each retrieval of a PDF rendition

402

RENDITION_ACCESSED

1

GET /api/dms/objects/{objectId}/contents/renditions/text

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 kind of rendition: 1 - text, 2 - pdf, 3 - slide

2

GET /api/dms/objects/{objectId}/contents/renditions/pdf

3

GET /api/dms/objects/{objectId}/contents/renditions/slide

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.

Decision process to choose a suitable authentication method.
Available Authentication Methods
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.

Tenant-specific authentication URL:
https://<yuuvis-base-url>/oauth/<tenant>
Example for the 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.

Required HTTP headers:
"Authorization": "Basic <base64 encoded <username>:<password>>"
"X-ID-TENANT-NAME": "<tenant>"
Example headers:
"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.

Required HTTP headers:
"Authorization": "Bearer <access token>>"
"X-ID-TENANT-NAME": "<tenant>"
Example headers:
"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 with device_code, user_code and verification_uri

  • The client application calls https://<base_url>/<verfication_uri>?user_code=<user_code> where verification_uri and user_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 the Authorization 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 or de).

  • 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 and tag 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 granted

write

permission to update objects or to move the content of objects for which also read permission is granted

tag

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 as false, even if the condition contains other sub-statements that do not use CONTAINS() and that would individually be evaluated as true.

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 grants read permission for objects with at least one entry of the string list property appEmail: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:

For system administrators, the following endpoints are available for managing the global permissions system:

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.

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.

An example role set
<?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 also com/tast.html or com/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 the org/springframework path

  • /org/**/servlet/test.html

    → matches org/springframework/servlet/test.html but also org/springframework/testing/servlet/test.html and org/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

sub

User ID of the user requesting the API call.

tenant

Tenant the requesting user belongs to.

name

Account name of the user.

accessToken

Contains the external authentication token taken from the identity provider.

authorities

A list containing the roles that are assigned to the user.

abac

(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).

iat

Identifies the time at which the JWT was issued.

exp

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).

Example JWT Payload
{
    "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 to true in the authentication-prod.yml configuration file.

  • All services that need authorization and abac information require the redis 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 and abac information from Redis or via the endpoint GET /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.yaml
    1
    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.yaml
    1
    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.yaml
    1
    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.yml
    1
    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 authentication service manages the cross-tenant requests of service accounts via a separate port. This port must be accessible only within the yuuvis® Momentum cluster to ensure strict separation of tenants for users. Never expose this internal port for public access!

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

/api/dms/objects/tags*

n/a

/api/dms/objects/search*

POST

/api/dms/objects/*/tags/*/state/*

n/a

/api/dms/objects/*/tags*

GET

/api/dms/objects/*/contents/file*

n/a

/api/dms/objects/*/contents/renditions/text*

POST

As of 2022 Summer: /api/dms/objects/*

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 the authorization.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.

Example 'tenant.html'
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.

Example 'error.html'
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.

example apps.xml
<?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

GET /api/system/metrics/{metric}

DELETE /api/system/metrics/{metric}

metric for any specified tenant

GET /api/system/tenants/{tenant}/metrics/{metric}

DELETE /api/system/tenants/{tenant}/metrics/{metric}

metric for currently active tenant

GET /api/admin/metrics/{metric}

DELETE /api/admin/metrics/{metric}

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

httpStatusCode

Three-digit integer specifying the HTTP status code as a class of the response in which the error is returned.

serviceErrorCode

Integer specifying the concrete error type.

time

Timestamp of the error occurance in format "yyyy-MM-ddTHH:mm:ss.SSS".

message

String message describing the concrete error.

stackTrace

Origin of the error.

As of 2021 Autumn, stackTrace is included in the error structure only if the parameter app.stacktrace is set to FULL for the service throwing the error. Possible values for app.stacktrace are FULL and NONE (default). If app.stacktrace is not set for a service or set to NONE, error structures thrown by this service do not contain the stackTrace. It is recommended to set app.stacktrace in a global configuration file (i.e., application-prod.yml) such that the value applies to all services in order to unify their error structures.

service

The name of the service that threw the error.

tenant

The string tenant name where the error occured.

innerError

As of 2022 Winter. Wrapped original error thrown by a webhook (find details below).

Example error with HTTP status code 409.
{
    "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

message

String message describing the concrete error.

serviceErrorCode

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:

Example error list with HTTP status code 422.
{
    "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.

Example error with properly structured inner error.
{
    "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.

Example error with inner error having a different structure.
{
    "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.